appium-adb 9.10.11 → 9.10.13
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 -5
- package/build/lib/adb.js +1 -26
- package/build/lib/adb.js.map +1 -1
- package/build/lib/helpers.js +7 -211
- package/build/lib/helpers.js.map +1 -1
- package/build/lib/logcat.js +1 -46
- package/build/lib/logcat.js.map +1 -1
- package/build/lib/logger.js +1 -5
- package/build/lib/logger.js.map +1 -1
- package/build/lib/tools/aab-utils.js +1 -42
- package/build/lib/tools/aab-utils.js.map +1 -1
- package/build/lib/tools/adb-commands.js +6 -163
- package/build/lib/tools/adb-commands.js.map +1 -1
- package/build/lib/tools/adb-emu-commands.js +2 -66
- package/build/lib/tools/adb-emu-commands.js.map +1 -1
- package/build/lib/tools/android-manifest.js +1 -60
- package/build/lib/tools/android-manifest.js.map +1 -1
- package/build/lib/tools/apk-signing.js +1 -77
- package/build/lib/tools/apk-signing.js.map +1 -1
- package/build/lib/tools/apk-utils.js +4 -229
- package/build/lib/tools/apk-utils.js.map +1 -1
- package/build/lib/tools/apks-utils.js +1 -53
- package/build/lib/tools/apks-utils.js.map +1 -1
- package/build/lib/tools/index.js +1 -17
- package/build/lib/tools/index.js.map +1 -1
- package/build/lib/tools/keyboard-commands.js +1 -12
- package/build/lib/tools/keyboard-commands.js.map +1 -1
- package/build/lib/tools/lockmgmt.js +1 -46
- package/build/lib/tools/lockmgmt.js.map +1 -1
- package/build/lib/tools/settings-client-commands.js +3 -71
- package/build/lib/tools/settings-client-commands.js.map +1 -1
- package/build/lib/tools/system-calls.js +5 -190
- package/build/lib/tools/system-calls.js.map +1 -1
- package/lib/tools/settings-client-commands.js +2 -2
- package/package.json +1 -1
package/build/lib/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","names":["APKS_EXTENSION","APK_EXTENSION","APK_INSTALL_TIMEOUT","APKS_INSTALL_TIMEOUT","DEFAULT_ADB_EXEC_TIMEOUT","MAIN_ACTION","LAUNCHER_CATEGORY","MODULE_NAME","getModuleRoot","_","memoize","root","node","getModuleRootSync","__filename","Error","getSdkRootFromEnv","process","env","ANDROID_HOME","ANDROID_SDK_ROOT","requireSdkRoot","customRoot","sdkRoot","docMsg","isEmpty","fs","exists","stats","stat","isDirectory","getAndroidPlatformAndPath","propsPaths","glob","cwd","path","resolve","absolute","platformsMapping","propsPath","propsContent","readFile","platformPath","dirname","platform","basename","match","exec","log","warn","parseInt","recentSdkVersion","keys","sort","reverse","result","debug","JSON","stringify","unzipFile","zipPath","dstRoot","zip","assertValidZip","extractAllTo","unsignApk","apkPath","tmpRoot","tempDir","openDir","metaInfFolderName","hasMetaInf","readEntries","entry","fileName","startsWith","tmpZipRoot","rimraf","tmpResultPath","toArchive","unlink","mv","getIMEListFromOutput","stdout","engines","line","split","length","push","trim","replace","getJavaHome","JAVA_HOME","getJavaForOs","javaHome","errMsg","err","message","executableName","system","isWindows","resultPath","which","ign","getOpenSslForOs","binaryName","getApksignerForOs","sysHelpers","getBinaryFromSdkRoot","getApkanalyzerForOs","isShowingLockscreen","dumpsys","some","x","includes","every","test","isCurrentFocusOnKeyguard","m","getSurfaceOrientation","isScreenOnFully","buildStartCmd","startAppOptions","apiLevel","user","waitForLaunch","pkg","activity","action","category","stopApp","flags","cmd","util","hasValue","optionalIntentArguments","parseKeyValue","str","space","indexOf","substring","re","args","apply","flag","flagPos","prevArgs","getSdkToolsVersion","androidHome","propertiesPath","propertiesContent","versionMatcher","RegExp","major","minor","build","getBuildToolsDirs","buildToolsDirs","map","dir","a","b","semver","rcompare","pair","pairs","B","mtime","valueOf","info","extractMatchingPermissions","dumpsysOutput","groupNames","grantedState","groupPatternByName","groupName","escapeRegExp","indentPattern","permissionNamePattern","grantedStatePattern","groupMatch","lines","titleIndent","search","slice","currentIndent","permissionNameMatch","item","permission","grantedStateMatch","granted","filteredResult","filter","isBoolean","pluralize","buildInstallArgs","options","allowTestPackages","useSdcard","grantPermissions","partialInstall","parseManifest","manifest","package","versionCode","versionName","application","activities","activityAliases","enabled","intentFilters","actions","categories","isMainAction","name","isLauncherCategory","parseAaptStrings","rawOutput","configMarker","normalizeStringMatch","s","apkStrings","isInConfig","currentResourceId","isInPluralGroup","quotedStringPattern","os","EOL","trimmedLine","parseAapt2Strings","allLines","extractContent","startIdx","idx","startCharPos","terminationCharMatch","terminationCharPos","index","trimStart","isInCurrentConfig","lineIndex","content","isString","formatConfigMarker","configsGetter","desiredMarker","defaultMarker","configs","toLowerCase","parseJsonData","output","entityName","jsonStr","parse","e","toAvdLocaleArgs","language","country","toUpperCase","locale","getAndroidPrefsRoot","location","ANDROID_EMULATOR_HOME","dirExists","home","HOME","USERPROFILE","escapeShellArg","arg","parseLaunchableActivityNames","mainActivityNameRe","categoryNameRe","blocks","blockStartIndent","block","trimEnd","isNil","hasCategory","activityNameStr","Boolean","fqActivityName","matchComponentName","classString"],"sources":["../../lib/helpers.js"],"sourcesContent":["import path from 'path';\nimport { system, fs, zip, util, tempDir, node } from '@appium/support';\nimport log from './logger.js';\nimport _ from 'lodash';\nimport B from 'bluebird';\nimport semver from 'semver';\nimport os from 'os';\n\nconst APKS_EXTENSION = '.apks';\nconst APK_EXTENSION = '.apk';\nconst APK_INSTALL_TIMEOUT = 60000;\nconst APKS_INSTALL_TIMEOUT = APK_INSTALL_TIMEOUT * 2;\nconst DEFAULT_ADB_EXEC_TIMEOUT = 20000; // in milliseconds\nconst MAIN_ACTION = 'android.intent.action.MAIN';\nconst LAUNCHER_CATEGORY = 'android.intent.category.LAUNCHER';\nconst MODULE_NAME = 'appium-adb';\n\n/**\n * Calculates the path to the current module's root folder\n *\n * @returns {string} The full path to module root\n * @throws {Error} If the current module root folder cannot be determined\n */\nconst getModuleRoot = _.memoize(function getModuleRoot () {\n const root = node.getModuleRootSync(MODULE_NAME, __filename);\n if (!root) {\n throw new Error(`Cannot find the root folder of the ${MODULE_NAME} Node.js module`);\n }\n return root;\n});\n\n/**\n * Retrieves the actual path to SDK root folder from the system environment\n *\n * @return {?string} The full path to the SDK root folder\n */\nfunction getSdkRootFromEnv () {\n return process.env.ANDROID_HOME || process.env.ANDROID_SDK_ROOT;\n}\n\n/**\n * Retrieves the actual path to SDK root folder\n *\n * @return {string} The full path to the SDK root folder\n * @throws {Error} If either the corresponding env variable is unset or is\n * pointing to an invalid file system entry\n */\nasync function requireSdkRoot (customRoot = null) {\n const sdkRoot = customRoot || getSdkRootFromEnv();\n const docMsg = 'Read https://developer.android.com/studio/command-line/variables for more details';\n if (_.isEmpty(sdkRoot)) {\n throw new Error(`Neither ANDROID_HOME nor ANDROID_SDK_ROOT environment variable was exported. ${docMsg}`);\n }\n\n if (!await fs.exists(sdkRoot)) {\n throw new Error(`The Android SDK root folder '${sdkRoot}' does not exist on the local file system. ${docMsg}`);\n }\n const stats = await fs.stat(sdkRoot);\n if (!stats.isDirectory()) {\n throw new Error(`The Android SDK root '${sdkRoot}' must be a folder. ${docMsg}`);\n }\n return sdkRoot;\n}\n\n/**\n * @typedef {Object} PlatformInfo\n * @property {?string} platform - The platform name, for example `android-24`\n * or `null` if it cannot be found\n * @property {?string} platformPath - Full path to the platform SDK folder\n * or `null` if it cannot be found\n */\n\n/**\n * Retrieve the path to the recent installed Android platform.\n *\n * @return {PlatformInfo} The resulting path to the newest installed platform.\n */\nasync function getAndroidPlatformAndPath (sdkRoot) {\n const propsPaths = await fs.glob('*/build.prop', {\n cwd: path.resolve(sdkRoot, 'platforms'),\n absolute: true,\n });\n const platformsMapping = {};\n for (const propsPath of propsPaths) {\n const propsContent = await fs.readFile(propsPath, 'utf-8');\n const platformPath = path.dirname(propsPath);\n const platform = path.basename(platformPath);\n const match = /ro\\.build\\.version\\.sdk=(\\d+)/.exec(propsContent);\n if (!match) {\n log.warn(`Cannot read the SDK version from '${propsPath}'. Skipping '${platform}'`);\n continue;\n }\n platformsMapping[parseInt(match[1], 10)] = {\n platform,\n platformPath,\n };\n }\n if (_.isEmpty(platformsMapping)) {\n log.warn(`Found zero platform folders at '${path.resolve(sdkRoot, 'platforms')}'. ` +\n `Do you have any Android SDKs installed?`);\n return {\n platform: null,\n platformPath: null,\n };\n }\n\n const recentSdkVersion = _.keys(platformsMapping).sort().reverse()[0];\n const result = platformsMapping[recentSdkVersion];\n log.debug(`Found the most recent Android platform: ${JSON.stringify(result)}`);\n return result;\n}\n\nasync function unzipFile (zipPath, dstRoot = path.dirname(zipPath)) {\n log.debug(`Unzipping '${zipPath}' to '${dstRoot}'`);\n await zip.assertValidZip(zipPath);\n await zip.extractAllTo(zipPath, dstRoot);\n log.debug('Unzip successful');\n}\n\n/**\n * Unsigns the given apk by removing the\n * META-INF folder recursively from the archive.\n * !!! The function overwrites the given apk after successful unsigning !!!\n *\n * @param {string} apkPath The path to the apk\n * @returns {boolean} `true` if the apk has been successfully\n * unsigned and overwritten\n * @throws {Error} if there was an error during the unsign operation\n */\nasync function unsignApk (apkPath) {\n const tmpRoot = await tempDir.openDir();\n const metaInfFolderName = 'META-INF';\n try {\n let hasMetaInf = false;\n await zip.readEntries(apkPath, ({entry}) => {\n hasMetaInf = entry.fileName.startsWith(`${metaInfFolderName}/`);\n // entries iteration stops after `false` is returned\n return !hasMetaInf;\n });\n if (!hasMetaInf) {\n return false;\n }\n const tmpZipRoot = path.resolve(tmpRoot, 'apk');\n await zip.extractAllTo(apkPath, tmpZipRoot);\n await fs.rimraf(path.resolve(tmpZipRoot, metaInfFolderName));\n const tmpResultPath = path.resolve(tmpRoot, path.basename(apkPath));\n await zip.toArchive(tmpResultPath, {\n cwd: tmpZipRoot,\n });\n await fs.unlink(apkPath);\n await fs.mv(tmpResultPath, apkPath);\n return true;\n } finally {\n await fs.rimraf(tmpRoot);\n }\n}\n\nfunction getIMEListFromOutput (stdout) {\n let engines = [];\n for (let line of stdout.split('\\n')) {\n if (line.length > 0 && line[0] !== ' ') {\n // remove newline and trailing colon, and add to the list\n engines.push(line.trim().replace(/:$/, ''));\n }\n }\n return engines;\n}\n\nconst getJavaHome = _.memoize(async function getJavaHome () {\n const result = process.env.JAVA_HOME;\n if (!result) {\n throw new Error('The JAVA_HOME environment variable is not set for the current process');\n }\n if (!await fs.exists(result)) {\n throw new Error(`The JAVA_HOME location '${result}' must exist`);\n }\n const stats = await fs.stat(result);\n if (!stats.isDirectory()) {\n throw new Error(`The JAVA_HOME location '${result}' must be a valid folder`);\n }\n return result;\n});\n\nconst getJavaForOs = _.memoize(async function getJavaForOs () {\n let javaHome;\n let errMsg;\n try {\n javaHome = await getJavaHome();\n } catch (err) {\n errMsg = err.message;\n }\n const executableName = `java${system.isWindows() ? '.exe' : ''}`;\n if (javaHome) {\n const resultPath = path.resolve(javaHome, 'bin', executableName);\n if (await fs.exists(resultPath)) {\n return resultPath;\n }\n }\n try {\n return await fs.which(executableName);\n } catch (ign) {}\n throw new Error(`The '${executableName}' binary could not be found ` +\n `neither in PATH nor under JAVA_HOME (${errMsg || path.resolve(javaHome, 'bin')})`);\n});\n\nconst getOpenSslForOs = async function () {\n const binaryName = `openssl${system.isWindows() ? '.exe' : ''}`;\n try {\n return await fs.which(binaryName);\n } catch (err) {\n throw new Error('The openssl tool must be installed on the system and available on the path');\n }\n};\n\n/**\n * Get the absolute path to apksigner tool\n *\n * @param {Object} sysHelpers - An instance containing systemCallMethods helper methods\n * @returns {string} An absolute path to apksigner tool.\n * @throws {Error} If the tool is not present on the local file system.\n */\nasync function getApksignerForOs (sysHelpers) {\n return await sysHelpers.getBinaryFromSdkRoot('apksigner.jar');\n}\n\n/**\n * Get the absolute path to apkanalyzer tool.\n * https://developer.android.com/studio/command-line/apkanalyzer.html\n *\n * @param {Object} sysHelpers - An instance containing systemCallMethods helper methods\n * @returns {string} An absolute path to apkanalyzer tool.\n * @throws {Error} If the tool is not present on the local file system.\n */\nasync function getApkanalyzerForOs (sysHelpers) {\n return await sysHelpers.getBinaryFromSdkRoot('apkanalyzer');\n}\n\n/**\n * Checks mShowingLockscreen or mDreamingLockscreen in dumpsys output to determine\n * if lock screen is showing\n *\n * A note: `adb shell dumpsys trust` performs better while detecting the locked screen state\n * in comparison to `adb dumpsys window` output parsing.\n * But the trust command does not work for `Swipe` unlock pattern.\n *\n * In some Android devices (Probably around Android 10+), `mShowingLockscreen` and `mDreamingLockscreen`\n * do not work to detect lock status. Instead, keyguard preferences helps to detect the lock condition.\n * Some devices such as Android TV do not have keyguard, so we should keep\n * screen condition as this primary method.\n *\n * @param {string} dumpsys - The output of dumpsys window command.\n * @return {boolean} True if lock screen is showing.\n */\nfunction isShowingLockscreen (dumpsys) {\n return _.some(['mShowingLockscreen=true', 'mDreamingLockscreen=true'], (x) => dumpsys.includes(x))\n // `mIsShowing` and `mInputRestricted` are `true` in lock condition. `false` is unlock condition.\n || _.every([/KeyguardStateMonitor[\\n\\s]+mIsShowing=true/, /\\s+mInputRestricted=true/], (x) => x.test(dumpsys));\n}\n\n/*\n * Checks mCurrentFocus in dumpsys output to determine if Keyguard is activated\n */\nfunction isCurrentFocusOnKeyguard (dumpsys) {\n let m = /mCurrentFocus.+Keyguard/gi.exec(dumpsys);\n return (m && m.length && m[0]) ? true : false;\n}\n\n/*\n * Reads SurfaceOrientation in dumpsys output\n */\nfunction getSurfaceOrientation (dumpsys) {\n let m = /SurfaceOrientation: \\d/gi.exec(dumpsys);\n return m && parseInt(m[0].split(':')[1], 10);\n}\n\n/*\n * Checks mScreenOnFully in dumpsys output to determine if screen is showing\n * Default is true\n */\nfunction isScreenOnFully (dumpsys) {\n let m = /mScreenOnFully=\\w+/gi.exec(dumpsys);\n return !m || // if information is missing we assume screen is fully on\n (m && m.length > 0 && m[0].split('=')[1] === 'true') || false;\n}\n\n/**\n * Builds command line representation for the given\n * application startup options\n *\n * @param {StartAppOptions} startAppOptions - Application options mapping\n * @param {number} apiLevel - The actual OS API level\n * @returns {Array<String>} The actual command line array\n */\nfunction buildStartCmd (startAppOptions, apiLevel) {\n const {\n user,\n waitForLaunch,\n pkg,\n activity,\n action,\n category,\n stopApp,\n flags,\n } = startAppOptions;\n const cmd = ['am', 'start'];\n if (util.hasValue(user)) {\n cmd.push('--user', user);\n }\n if (waitForLaunch) {\n cmd.push('-W');\n }\n if (activity && pkg) {\n cmd.push('-n', `${pkg}/${activity}`);\n }\n if (stopApp && apiLevel >= 15) {\n cmd.push('-S');\n }\n if (action) {\n cmd.push('-a', action);\n }\n if (category) {\n cmd.push('-c', category);\n }\n if (flags) {\n cmd.push('-f', flags);\n }\n if (startAppOptions.optionalIntentArguments) {\n // expect optionalIntentArguments to be a single string of the form:\n // \"-flag key\"\n // \"-flag key value\"\n // or a combination of these (e.g., \"-flag1 key1 -flag2 key2 value2\")\n\n // take a string and parse out the part before any spaces, and anything after\n // the first space\n let parseKeyValue = function (str) {\n str = str.trim();\n let space = str.indexOf(' ');\n if (space === -1) {\n return str.length ? [str] : [];\n } else {\n return [str.substring(0, space).trim(), str.substring(space + 1).trim()];\n }\n };\n\n // cycle through the optionalIntentArguments and pull out the arguments\n // add a space initially so flags can be distinguished from arguments that\n // have internal hyphens\n let optionalIntentArguments = ` ${startAppOptions.optionalIntentArguments}`;\n let re = / (-[^\\s]+) (.+)/;\n while (true) { // eslint-disable-line no-constant-condition\n let args = re.exec(optionalIntentArguments);\n if (!args) {\n if (optionalIntentArguments.length) {\n // no more flags, so the remainder can be treated as 'key' or 'key value'\n cmd.push.apply(cmd, parseKeyValue(optionalIntentArguments));\n }\n // we are done\n break;\n }\n\n // take the flag and see if it is at the beginning of the string\n // if it is not, then it means we have been through already, and\n // what is before the flag is the argument for the previous flag\n let flag = args[1];\n let flagPos = optionalIntentArguments.indexOf(flag);\n if (flagPos !== 0) {\n let prevArgs = optionalIntentArguments.substring(0, flagPos);\n cmd.push.apply(cmd, parseKeyValue(prevArgs));\n }\n\n // add the flag, as there are no more earlier arguments\n cmd.push(flag);\n\n // make optionalIntentArguments hold the remainder\n optionalIntentArguments = args[2];\n }\n }\n return cmd;\n}\n\nconst getSdkToolsVersion = _.memoize(async function getSdkToolsVersion () {\n const androidHome = process.env.ANDROID_HOME;\n if (!androidHome) {\n throw new Error('ANDROID_HOME environment variable is expected to be set');\n }\n const propertiesPath = path.resolve(androidHome, 'tools', 'source.properties');\n if (!await fs.exists(propertiesPath)) {\n log.warn(`Cannot find ${propertiesPath} file to read SDK version from`);\n return;\n }\n const propertiesContent = await fs.readFile(propertiesPath, 'utf8');\n const versionMatcher = new RegExp(/Pkg\\.Revision=(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n const match = versionMatcher.exec(propertiesContent);\n if (match) {\n return {\n major: parseInt(match[1], 10),\n minor: match[2] ? parseInt(match[2], 10) : 0,\n build: match[3] ? parseInt(match[3], 10) : 0\n };\n }\n log.warn(`Cannot parse \"Pkg.Revision\" value from ${propertiesPath}`);\n});\n\n/**\n * Retrieves full paths to all 'build-tools' subfolders under the particular\n * SDK root folder\n *\n * @param {string} sdkRoot - The full path to the Android SDK root folder\n * @returns {Array<string>} The full paths to the resulting folders sorted by\n * modification date (the newest comes first) or an empty list if no macthes were found\n */\nconst getBuildToolsDirs = _.memoize(async function getBuildToolsDirs (sdkRoot) {\n let buildToolsDirs = await fs.glob('*/', {\n cwd: path.resolve(sdkRoot, 'build-tools'),\n absolute: true,\n });\n try {\n buildToolsDirs = buildToolsDirs\n .map((dir) => [path.basename(dir), dir])\n .sort((a, b) => semver.rcompare(a[0], b[0]))\n .map((pair) => pair[1]);\n } catch (err) {\n log.warn(`Cannot sort build-tools folders ${JSON.stringify(buildToolsDirs.map((dir) => path.basename(dir)))} ` +\n `by semantic version names.`);\n log.warn(`Falling back to sorting by modification date. Original error: ${err.message}`);\n const pairs = await B.map(buildToolsDirs, async (dir) => [(await fs.stat(dir)).mtime.valueOf(), dir]);\n buildToolsDirs = pairs\n .sort((a, b) => a[0] < b[0])\n .map((pair) => pair[1]);\n }\n log.info(`Found ${buildToolsDirs.length} 'build-tools' folders under '${sdkRoot}' (newest first):`);\n for (let dir of buildToolsDirs) {\n log.info(` ${dir}`);\n }\n return buildToolsDirs;\n});\n\n/**\n * Retrieves the list of permission names encoded in `dumpsys package` command output.\n *\n * @param {string} dumpsysOutput - The actual command output.\n * @param {Array<string>} groupNames - The list of group names to list permissions for.\n * @param {?boolean} grantedState - The expected state of `granted` attribute to filter with.\n * No filtering is done if the parameter is not set.\n * @returns {Array<string>} The list of matched permission names or an empty list if no matches were found.\n */\nconst extractMatchingPermissions = function (dumpsysOutput, groupNames, grantedState = null) {\n const groupPatternByName = (groupName) => new RegExp(`^(\\\\s*${_.escapeRegExp(groupName)} permissions:[\\\\s\\\\S]+)`, 'm');\n const indentPattern = /\\S|$/;\n const permissionNamePattern = /android\\.\\w*\\.?permission\\.\\w+/;\n const grantedStatePattern = /\\bgranted=(\\w+)/;\n const result = [];\n for (const groupName of groupNames) {\n const groupMatch = groupPatternByName(groupName).exec(dumpsysOutput);\n if (!groupMatch) {\n continue;\n }\n\n const lines = groupMatch[1].split('\\n');\n if (lines.length < 2) {\n continue;\n }\n\n const titleIndent = lines[0].search(indentPattern);\n for (const line of lines.slice(1)) {\n const currentIndent = line.search(indentPattern);\n if (currentIndent <= titleIndent) {\n break;\n }\n\n const permissionNameMatch = permissionNamePattern.exec(line);\n if (!permissionNameMatch) {\n continue;\n }\n const item = {\n permission: permissionNameMatch[0],\n };\n const grantedStateMatch = grantedStatePattern.exec(line);\n if (grantedStateMatch) {\n item.granted = grantedStateMatch[1] === 'true';\n }\n result.push(item);\n }\n }\n\n const filteredResult = result\n .filter((item) => !_.isBoolean(grantedState) || item.granted === grantedState)\n .map((item) => item.permission);\n log.debug(`Retrieved ${util.pluralize('permission', filteredResult.length, true)} ` +\n `from ${groupNames} ${util.pluralize('group', groupNames.length, false)}`);\n return filteredResult;\n};\n\n/**\n * @typedef {Object} InstallOptions\n * @property {boolean} allowTestPackages [false] - Set to true in order to allow test\n * packages installation.\n * @property {boolean} useSdcard [false] - Set to true to install the app on sdcard\n * instead of the device memory.\n * @property {boolean} grantPermissions [false] - Set to true in order to grant all the\n * permissions requested in the application's manifest\n * automatically after the installation is completed\n * under Android 6+.\n * @property {boolean} replace [true] - Set it to false if you don't want\n * the application to be upgraded/reinstalled\n * if it is already present on the device.\n * @property {boolean} partialInstall [false] - Install apks partially. It is used for 'install-multiple'.\n * https://android.stackexchange.com/questions/111064/what-is-a-partial-application-install-via-adb\n */\n\n/**\n * Transforms given options into the list of `adb install.install-multiple` command arguments\n *\n * @param {number} apiLevel - The current API level\n * @param {?InstallOptions} options - The options mapping to transform\n * @returns {Array<String>} The array of arguments\n */\nfunction buildInstallArgs (apiLevel, options = {}) {\n const result = [];\n\n if (!util.hasValue(options.replace) || options.replace) {\n result.push('-r');\n }\n if (options.allowTestPackages) {\n result.push('-t');\n }\n if (options.useSdcard) {\n result.push('-s');\n }\n if (options.grantPermissions) {\n if (apiLevel < 23) {\n log.debug(`Skipping permissions grant option, since ` +\n `the current API level ${apiLevel} does not support applications ` +\n `permissions customization`);\n } else {\n result.push('-g');\n }\n }\n // For multiple-install\n if (options.partialInstall) {\n result.push('-p');\n }\n\n return result;\n}\n\n/**\n * @typedef {Object} ManifestInfo\n * @property {string} pkg - The application identifier\n * @property {string} activity - The name of the main package activity\n * @property {?number} versionCode - The version code number (might be `NaN`)\n * @property {?string} versionName - The version name (might be `null`)\n */\n\n/**\n * Perform parsing of the manifest object in order\n * to extract some vital values from it\n *\n * @param {object} manifest The manifest content formatted as JSON\n * See https://www.npmjs.com/package/adbkit-apkreader for detailed format description\n * @returns {ManifestInfo}\n */\nfunction parseManifest (manifest) {\n const result = {\n pkg: manifest.package,\n versionCode: parseInt(manifest.versionCode, 10),\n versionName: manifest.versionName || null,\n };\n if (!manifest.application) {\n return result;\n }\n\n // Look for enabled activity or activity-alias with\n // action == android.intent.action.MAIN and\n // category == android.intent.category.LAUNCHER\n for (const activity of [\n ...manifest.application.activities,\n ...manifest.application.activityAliases,\n ]) {\n if (activity.enabled === false || _.isEmpty(activity.intentFilters)) {\n continue;\n }\n\n for (const {actions, categories} of activity.intentFilters) {\n if (_.isEmpty(actions) || _.isEmpty(categories)) {\n continue;\n }\n\n const isMainAction = actions.some(({name}) => name === MAIN_ACTION);\n const isLauncherCategory = categories.some(({name}) => name === LAUNCHER_CATEGORY);\n if (isMainAction && isLauncherCategory) {\n result.activity = activity.name;\n return result;\n }\n }\n }\n return result;\n}\n\n/**\n * Parses apk strings from aapt tool output\n *\n * @param {string} rawOutput The actual tool output\n * @param {string} configMarker The config marker. Usually\n * a language abbreviation or `(default)`\n * @returns {Object} Strings ids to values mapping. Plural\n * values are represented as arrays. If no config found for the\n * given marker then an empty mapping is returned.\n */\nfunction parseAaptStrings (rawOutput, configMarker) {\n const normalizeStringMatch = function (s) {\n return s.replace(/\"$/, '').replace(/^\"/, '').replace(/\\\\\"/g, '\"');\n };\n\n const apkStrings = {};\n let isInConfig = false;\n let currentResourceId = null;\n let isInPluralGroup = false;\n // The pattern matches any quoted content including escaped quotes\n const quotedStringPattern = /\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"/;\n for (const line of rawOutput.split(os.EOL)) {\n const trimmedLine = line.trim();\n if (_.isEmpty(trimmedLine)) {\n continue;\n }\n\n if (['config', 'type', 'spec', 'Package'].some((x) => trimmedLine.startsWith(x))) {\n isInConfig = trimmedLine.startsWith(`config ${configMarker}:`);\n currentResourceId = null;\n isInPluralGroup = false;\n continue;\n }\n\n if (!isInConfig) {\n continue;\n }\n\n if (trimmedLine.startsWith('resource')) {\n isInPluralGroup = false;\n currentResourceId = null;\n\n if (trimmedLine.includes(':string/')) {\n const match = /:string\\/(\\S+):/.exec(trimmedLine);\n if (match) {\n currentResourceId = match[1];\n }\n } else if (trimmedLine.includes(':plurals/')) {\n const match = /:plurals\\/(\\S+):/.exec(trimmedLine);\n if (match) {\n currentResourceId = match[1];\n isInPluralGroup = true;\n }\n }\n continue;\n }\n\n if (currentResourceId && trimmedLine.startsWith('(string')) {\n const match = quotedStringPattern.exec(trimmedLine);\n if (match) {\n apkStrings[currentResourceId] = normalizeStringMatch(match[0]);\n }\n currentResourceId = null;\n continue;\n }\n\n if (currentResourceId && isInPluralGroup && trimmedLine.includes(': (string')) {\n const match = quotedStringPattern.exec(trimmedLine);\n if (match) {\n apkStrings[currentResourceId] = [\n ...(apkStrings[currentResourceId] || []),\n normalizeStringMatch(match[0]),\n ];\n }\n continue;\n }\n }\n return apkStrings;\n}\n\n/**\n * Parses apk strings from aapt2 tool output\n *\n * @param {string} rawOutput The actual tool output\n * @param {string} configMarker The config marker. Usually\n * a language abbreviation or an empty string for the default one\n * @returns {Object} Strings ids to values mapping. Plural\n * values are represented as arrays. If no config found for the\n * given marker then an empty mapping is returned.\n */\nfunction parseAapt2Strings (rawOutput, configMarker) {\n const allLines = rawOutput.split(os.EOL);\n function extractContent (startIdx) {\n let idx = startIdx;\n const startCharPos = allLines[startIdx].indexOf('\"');\n if (startCharPos < 0) {\n return [null, idx];\n }\n let result = '';\n while (idx < allLines.length) {\n const terminationCharMatch = /\"$/.exec(allLines[idx]);\n if (terminationCharMatch) {\n const terminationCharPos = terminationCharMatch.index;\n if (startIdx === idx) {\n return [\n allLines[idx].substring(startCharPos + 1, terminationCharPos),\n idx\n ];\n }\n return [\n `${result}\\\\n${_.trimStart(allLines[idx].substring(0, terminationCharPos))}`,\n idx,\n ];\n }\n if (idx > startIdx) {\n result += `\\\\n${_.trimStart(allLines[idx])}`;\n } else {\n result += allLines[idx].substring(startCharPos + 1);\n }\n ++idx;\n }\n return [result, idx];\n }\n\n const apkStrings = {};\n let currentResourceId = null;\n let isInPluralGroup = false;\n let isInCurrentConfig = false;\n let lineIndex = 0;\n while (lineIndex < allLines.length) {\n const trimmedLine = allLines[lineIndex].trim();\n if (_.isEmpty(trimmedLine)) {\n ++lineIndex;\n continue;\n }\n\n if (['type', 'Package'].some((x) => trimmedLine.startsWith(x))) {\n currentResourceId = null;\n isInPluralGroup = false;\n isInCurrentConfig = false;\n ++lineIndex;\n continue;\n }\n\n if (trimmedLine.startsWith('resource')) {\n isInPluralGroup = false;\n currentResourceId = null;\n isInCurrentConfig = false;\n\n if (trimmedLine.includes('string/')) {\n const match = /string\\/(\\S+)/.exec(trimmedLine);\n if (match) {\n currentResourceId = match[1];\n }\n } else if (trimmedLine.includes('plurals/')) {\n const match = /plurals\\/(\\S+)/.exec(trimmedLine);\n if (match) {\n currentResourceId = match[1];\n isInPluralGroup = true;\n }\n }\n ++lineIndex;\n continue;\n }\n\n if (currentResourceId) {\n if (isInPluralGroup) {\n if (trimmedLine.startsWith('(')) {\n isInCurrentConfig = trimmedLine.startsWith(`(${configMarker})`);\n ++lineIndex;\n continue;\n }\n if (isInCurrentConfig) {\n const [content, idx] = extractContent(lineIndex);\n lineIndex = idx;\n if (_.isString(content)) {\n apkStrings[currentResourceId] = [\n ...(apkStrings[currentResourceId] || []),\n content,\n ];\n }\n }\n } else if (trimmedLine.startsWith(`(${configMarker})`)) {\n const [content, idx] = extractContent(lineIndex);\n lineIndex = idx;\n if (_.isString(content)) {\n apkStrings[currentResourceId] = content;\n }\n currentResourceId = null;\n }\n }\n ++lineIndex;\n }\n return apkStrings;\n}\n\n/**\n * Formats the config marker, which is then passed to parse.. methods\n * to make it compatible with resource formats generated by aapt(2) tool\n *\n * @param {Function} configsGetter The function whose result is a list\n * of apk configs\n * @param {string} desiredMarker The desired config marker value\n * @param {string} defaultMarker The default config marker value\n * @return {string} The formatted config marker\n */\nasync function formatConfigMarker (configsGetter, desiredMarker, defaultMarker) {\n let configMarker = desiredMarker || defaultMarker;\n if (configMarker.includes('-') && !configMarker.includes('-r')) {\n configMarker = configMarker.replace('-', '-r');\n }\n const configs = await configsGetter();\n log.debug(`Resource configurations: ${JSON.stringify(configs)}`);\n // Assume the 'en' configuration is the default one\n if (configMarker.toLowerCase().startsWith('en')\n && !configs.some((x) => x.trim() === configMarker)) {\n log.debug(`Resource configuration name '${configMarker}' is unknown. ` +\n `Replacing it with '${defaultMarker}'`);\n configMarker = defaultMarker;\n } else {\n log.debug(`Selected configuration: '${configMarker}'`);\n }\n return configMarker;\n}\n\n/**\n * Parses the output in JSON format retrieved from\n * the corresponding Appium Settings broadcast calls\n *\n * @param {string} output The actual command output\n * @param {string} entityName The name of the entity which is\n * going to be parsed\n * @returns {Object} The parsed JSON object\n * @throws {Error} If the output cannot be parsed\n * as a valid JSON\n */\nfunction parseJsonData (output, entityName) {\n if (!/\\bresult=-1\\b/.test(output) || !/\\bdata=\"/.test(output)) {\n log.debug(output);\n throw new Error(`Cannot retrieve ${entityName} from the device. ` +\n 'Check the server log for more details');\n }\n const match = /\\bdata=(\".+)/.exec(output);\n if (!match) {\n log.debug(output);\n throw new Error(`Cannot parse ${entityName} from the command output. ` +\n 'Check the server log for more details');\n }\n const jsonStr = _.trim(match[1]).replace(/(^\")|(\"$)/g, '');\n try {\n return JSON.parse(jsonStr);\n } catch (e) {\n log.debug(jsonStr);\n throw new Error(`Cannot parse ${entityName} from the resulting data string. ` +\n 'Check the server log for more details');\n }\n}\n\n/**\n * Transforms the given language and country abbreviations\n * to AVD arguments array\n *\n * @param {?string} language Language name, for example 'fr'\n * @param {?string} country Country name, for example 'CA'\n * @returns {Array<string>} The generated arguments. The\n * resulting array might be empty if both arguments are empty\n */\nfunction toAvdLocaleArgs (language, country) {\n const result = [];\n if (language && _.isString(language)) {\n result.push('-prop', `persist.sys.language=${language.toLowerCase()}`);\n }\n if (country && _.isString(country)) {\n result.push('-prop', `persist.sys.country=${country.toUpperCase()}`);\n }\n let locale;\n if (_.isString(language) && _.isString(country) && language && country) {\n locale = language.toLowerCase() + '-' + country.toUpperCase();\n } else if (language && _.isString(language)) {\n locale = language.toLowerCase();\n } else if (country && _.isString(country)) {\n locale = country;\n }\n if (locale) {\n result.push('-prop', `persist.sys.locale=${locale}`);\n }\n return result;\n}\n\n/**\n * Retrieves the full path to the Android preferences root\n *\n * @returns {?string} The full path to the folder or `null` if the folder cannot be found\n */\nasync function getAndroidPrefsRoot () {\n let location = process.env.ANDROID_EMULATOR_HOME;\n if (await dirExists(location)) {\n return location;\n }\n\n if (location) {\n log.warn(`The value of the ANDROID_EMULATOR_HOME environment variable '${location}' is not an existing directory`);\n }\n\n const home = process.env.HOME || process.env.USERPROFILE;\n if (home) {\n location = path.resolve(home, '.android');\n }\n\n if (!await dirExists(location)) {\n log.debug(`Android config root '${location}' is not an existing directory`);\n return null;\n }\n\n return location;\n}\n\n/**\n * Check if a path exists on the filesystem and is a directory\n *\n * @param {?string} location The full path to the directory\n * @returns {boolean}\n */\nasync function dirExists (location) {\n return location\n && await fs.exists(location)\n && (await fs.stat(location)).isDirectory();\n}\n\n/**\n * Escapes special characters in command line arguments.\n * This is needed to avoid possible issues with how system `spawn`\n * call handles them.\n * See https://discuss.appium.io/t/how-to-modify-wd-proxy-and-uiautomator2-source-code-to-support-unicode/33466\n * for more details.\n *\n * @param {string} arg Non-escaped argument string\n * @returns The escaped argument\n */\nfunction escapeShellArg (arg) {\n arg = `${arg}`;\n if (system.isWindows()) {\n return /[&|^\\s]/.test(arg) ? `\"${arg.replace(/\"/g, '\"\"')}\"` : arg;\n }\n return arg.replace(/&/g, '\\\\&');\n}\n\n/**\n * Parses the name of launchable package activity\n * from dumpsys output.\n *\n * @param {string} dumpsys the actual dumpsys output\n * @returns {string[]} Either the fully qualified\n * activity name as a single list item or an empty list if nothing could be parsed.\n * In Android 6 and older there is no reliable way to determine\n * the category name for the given activity, so this API just\n * returns all activity names belonging to 'android.intent.action.MAIN'\n * with the expectation that the app manifest could be parsed next\n * in order to determine category names for these.\n */\nfunction parseLaunchableActivityNames (dumpsys) {\n const mainActivityNameRe = new RegExp(`^\\\\s*${_.escapeRegExp(MAIN_ACTION)}:$`);\n const categoryNameRe = /^\\s*Category:\\s+\"([a-zA-Z0-9._/-]+)\"$/;\n const blocks = [];\n let blockStartIndent;\n let block = [];\n for (const line of dumpsys.split('\\n').map(_.trimEnd)) {\n const currentIndent = line.length - _.trimStart(line).length;\n if (mainActivityNameRe.test(line)) {\n blockStartIndent = currentIndent;\n if (!_.isEmpty(block)) {\n blocks.push(block);\n block = [];\n }\n continue;\n }\n if (_.isNil(blockStartIndent)) {\n continue;\n }\n\n if (currentIndent > blockStartIndent) {\n block.push(line);\n } else {\n if (!_.isEmpty(block)) {\n blocks.push(block);\n block = [];\n }\n blockStartIndent = null;\n }\n }\n if (!_.isEmpty(block)) {\n blocks.push(block);\n }\n\n const result = [];\n for (const item of blocks) {\n let hasCategory = false;\n let isLauncherCategory = false;\n for (const line of item) {\n const match = categoryNameRe.exec(line);\n if (!match) {\n continue;\n }\n\n hasCategory = true;\n isLauncherCategory = match[1] === LAUNCHER_CATEGORY;\n break;\n }\n // On older Android versions the category name\n // might not be listed, so we just try to fetch\n // all matches instead\n if (hasCategory && !isLauncherCategory) {\n continue;\n }\n\n for (const activityNameStr of item.map(_.trim).filter(Boolean)) {\n const fqActivityName = activityNameStr.split(/\\s+/)[1];\n if (!matchComponentName(fqActivityName)) {\n continue;\n }\n\n if (isLauncherCategory) {\n return [fqActivityName];\n }\n result.push(fqActivityName);\n }\n }\n return result;\n}\n\n/**\n * Check if the given string is a valid component name\n *\n * @param {string} classString The string to verify\n * @return {?Array<Match>} The result of Regexp.exec operation\n * or _null_ if no matches are found\n */\nfunction matchComponentName (classString) {\n // some.package/some.package.Activity\n return /^[a-z0-9./_]+$/i.exec(classString);\n}\n\nexport {\n getAndroidPlatformAndPath, unzipFile,\n getIMEListFromOutput, getJavaForOs, isShowingLockscreen, isCurrentFocusOnKeyguard,\n getSurfaceOrientation, isScreenOnFully, buildStartCmd, getJavaHome,\n getSdkToolsVersion, getApksignerForOs, getBuildToolsDirs,\n getApkanalyzerForOs, getOpenSslForOs, extractMatchingPermissions, APKS_EXTENSION,\n APK_INSTALL_TIMEOUT, APKS_INSTALL_TIMEOUT, buildInstallArgs, APK_EXTENSION,\n DEFAULT_ADB_EXEC_TIMEOUT, parseManifest, parseAaptStrings, parseAapt2Strings,\n formatConfigMarker, parseJsonData, unsignApk, toAvdLocaleArgs, requireSdkRoot,\n getSdkRootFromEnv, getAndroidPrefsRoot, dirExists, escapeShellArg,\n parseLaunchableActivityNames, matchComponentName, getModuleRoot\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"helpers.js","names":["APKS_EXTENSION","APK_EXTENSION","APK_INSTALL_TIMEOUT","APKS_INSTALL_TIMEOUT","DEFAULT_ADB_EXEC_TIMEOUT","MAIN_ACTION","LAUNCHER_CATEGORY","MODULE_NAME","getModuleRoot","_","memoize","root","node","getModuleRootSync","__filename","Error","getSdkRootFromEnv","process","env","ANDROID_HOME","ANDROID_SDK_ROOT","requireSdkRoot","customRoot","sdkRoot","docMsg","isEmpty","fs","exists","stats","stat","isDirectory","getAndroidPlatformAndPath","propsPaths","glob","cwd","path","resolve","absolute","platformsMapping","propsPath","propsContent","readFile","platformPath","dirname","platform","basename","match","exec","log","warn","parseInt","recentSdkVersion","keys","sort","reverse","result","debug","JSON","stringify","unzipFile","zipPath","dstRoot","zip","assertValidZip","extractAllTo","unsignApk","apkPath","tmpRoot","tempDir","openDir","metaInfFolderName","hasMetaInf","readEntries","entry","fileName","startsWith","tmpZipRoot","rimraf","tmpResultPath","toArchive","unlink","mv","getIMEListFromOutput","stdout","engines","line","split","length","push","trim","replace","getJavaHome","JAVA_HOME","getJavaForOs","javaHome","errMsg","err","message","executableName","system","isWindows","resultPath","which","ign","getOpenSslForOs","binaryName","getApksignerForOs","sysHelpers","getBinaryFromSdkRoot","getApkanalyzerForOs","isShowingLockscreen","dumpsys","some","x","includes","every","test","isCurrentFocusOnKeyguard","m","getSurfaceOrientation","isScreenOnFully","buildStartCmd","startAppOptions","apiLevel","user","waitForLaunch","pkg","activity","action","category","stopApp","flags","cmd","util","hasValue","optionalIntentArguments","parseKeyValue","str","space","indexOf","substring","re","args","apply","flag","flagPos","prevArgs","getSdkToolsVersion","androidHome","propertiesPath","propertiesContent","versionMatcher","RegExp","major","minor","build","getBuildToolsDirs","buildToolsDirs","map","dir","a","b","semver","rcompare","pair","pairs","B","mtime","valueOf","info","extractMatchingPermissions","dumpsysOutput","groupNames","grantedState","groupPatternByName","groupName","escapeRegExp","indentPattern","permissionNamePattern","grantedStatePattern","groupMatch","lines","titleIndent","search","slice","currentIndent","permissionNameMatch","item","permission","grantedStateMatch","granted","filteredResult","filter","isBoolean","pluralize","buildInstallArgs","options","allowTestPackages","useSdcard","grantPermissions","partialInstall","parseManifest","manifest","package","versionCode","versionName","application","activities","activityAliases","enabled","intentFilters","actions","categories","isMainAction","name","isLauncherCategory","parseAaptStrings","rawOutput","configMarker","normalizeStringMatch","s","apkStrings","isInConfig","currentResourceId","isInPluralGroup","quotedStringPattern","os","EOL","trimmedLine","parseAapt2Strings","allLines","extractContent","startIdx","idx","startCharPos","terminationCharMatch","terminationCharPos","index","trimStart","isInCurrentConfig","lineIndex","content","isString","formatConfigMarker","configsGetter","desiredMarker","defaultMarker","configs","toLowerCase","parseJsonData","output","entityName","jsonStr","parse","e","toAvdLocaleArgs","language","country","toUpperCase","locale","getAndroidPrefsRoot","location","ANDROID_EMULATOR_HOME","dirExists","home","HOME","USERPROFILE","escapeShellArg","arg","parseLaunchableActivityNames","mainActivityNameRe","categoryNameRe","blocks","blockStartIndent","block","trimEnd","isNil","hasCategory","activityNameStr","Boolean","fqActivityName","matchComponentName","classString"],"sources":["../../lib/helpers.js"],"sourcesContent":["import path from 'path';\nimport { system, fs, zip, util, tempDir, node } from '@appium/support';\nimport log from './logger.js';\nimport _ from 'lodash';\nimport B from 'bluebird';\nimport semver from 'semver';\nimport os from 'os';\n\nconst APKS_EXTENSION = '.apks';\nconst APK_EXTENSION = '.apk';\nconst APK_INSTALL_TIMEOUT = 60000;\nconst APKS_INSTALL_TIMEOUT = APK_INSTALL_TIMEOUT * 2;\nconst DEFAULT_ADB_EXEC_TIMEOUT = 20000; // in milliseconds\nconst MAIN_ACTION = 'android.intent.action.MAIN';\nconst LAUNCHER_CATEGORY = 'android.intent.category.LAUNCHER';\nconst MODULE_NAME = 'appium-adb';\n\n/**\n * Calculates the path to the current module's root folder\n *\n * @returns {string} The full path to module root\n * @throws {Error} If the current module root folder cannot be determined\n */\nconst getModuleRoot = _.memoize(function getModuleRoot () {\n const root = node.getModuleRootSync(MODULE_NAME, __filename);\n if (!root) {\n throw new Error(`Cannot find the root folder of the ${MODULE_NAME} Node.js module`);\n }\n return root;\n});\n\n/**\n * Retrieves the actual path to SDK root folder from the system environment\n *\n * @return {?string} The full path to the SDK root folder\n */\nfunction getSdkRootFromEnv () {\n return process.env.ANDROID_HOME || process.env.ANDROID_SDK_ROOT;\n}\n\n/**\n * Retrieves the actual path to SDK root folder\n *\n * @return {string} The full path to the SDK root folder\n * @throws {Error} If either the corresponding env variable is unset or is\n * pointing to an invalid file system entry\n */\nasync function requireSdkRoot (customRoot = null) {\n const sdkRoot = customRoot || getSdkRootFromEnv();\n const docMsg = 'Read https://developer.android.com/studio/command-line/variables for more details';\n if (_.isEmpty(sdkRoot)) {\n throw new Error(`Neither ANDROID_HOME nor ANDROID_SDK_ROOT environment variable was exported. ${docMsg}`);\n }\n\n if (!await fs.exists(sdkRoot)) {\n throw new Error(`The Android SDK root folder '${sdkRoot}' does not exist on the local file system. ${docMsg}`);\n }\n const stats = await fs.stat(sdkRoot);\n if (!stats.isDirectory()) {\n throw new Error(`The Android SDK root '${sdkRoot}' must be a folder. ${docMsg}`);\n }\n return sdkRoot;\n}\n\n/**\n * @typedef {Object} PlatformInfo\n * @property {?string} platform - The platform name, for example `android-24`\n * or `null` if it cannot be found\n * @property {?string} platformPath - Full path to the platform SDK folder\n * or `null` if it cannot be found\n */\n\n/**\n * Retrieve the path to the recent installed Android platform.\n *\n * @return {PlatformInfo} The resulting path to the newest installed platform.\n */\nasync function getAndroidPlatformAndPath (sdkRoot) {\n const propsPaths = await fs.glob('*/build.prop', {\n cwd: path.resolve(sdkRoot, 'platforms'),\n absolute: true,\n });\n const platformsMapping = {};\n for (const propsPath of propsPaths) {\n const propsContent = await fs.readFile(propsPath, 'utf-8');\n const platformPath = path.dirname(propsPath);\n const platform = path.basename(platformPath);\n const match = /ro\\.build\\.version\\.sdk=(\\d+)/.exec(propsContent);\n if (!match) {\n log.warn(`Cannot read the SDK version from '${propsPath}'. Skipping '${platform}'`);\n continue;\n }\n platformsMapping[parseInt(match[1], 10)] = {\n platform,\n platformPath,\n };\n }\n if (_.isEmpty(platformsMapping)) {\n log.warn(`Found zero platform folders at '${path.resolve(sdkRoot, 'platforms')}'. ` +\n `Do you have any Android SDKs installed?`);\n return {\n platform: null,\n platformPath: null,\n };\n }\n\n const recentSdkVersion = _.keys(platformsMapping).sort().reverse()[0];\n const result = platformsMapping[recentSdkVersion];\n log.debug(`Found the most recent Android platform: ${JSON.stringify(result)}`);\n return result;\n}\n\nasync function unzipFile (zipPath, dstRoot = path.dirname(zipPath)) {\n log.debug(`Unzipping '${zipPath}' to '${dstRoot}'`);\n await zip.assertValidZip(zipPath);\n await zip.extractAllTo(zipPath, dstRoot);\n log.debug('Unzip successful');\n}\n\n/**\n * Unsigns the given apk by removing the\n * META-INF folder recursively from the archive.\n * !!! The function overwrites the given apk after successful unsigning !!!\n *\n * @param {string} apkPath The path to the apk\n * @returns {boolean} `true` if the apk has been successfully\n * unsigned and overwritten\n * @throws {Error} if there was an error during the unsign operation\n */\nasync function unsignApk (apkPath) {\n const tmpRoot = await tempDir.openDir();\n const metaInfFolderName = 'META-INF';\n try {\n let hasMetaInf = false;\n await zip.readEntries(apkPath, ({entry}) => {\n hasMetaInf = entry.fileName.startsWith(`${metaInfFolderName}/`);\n // entries iteration stops after `false` is returned\n return !hasMetaInf;\n });\n if (!hasMetaInf) {\n return false;\n }\n const tmpZipRoot = path.resolve(tmpRoot, 'apk');\n await zip.extractAllTo(apkPath, tmpZipRoot);\n await fs.rimraf(path.resolve(tmpZipRoot, metaInfFolderName));\n const tmpResultPath = path.resolve(tmpRoot, path.basename(apkPath));\n await zip.toArchive(tmpResultPath, {\n cwd: tmpZipRoot,\n });\n await fs.unlink(apkPath);\n await fs.mv(tmpResultPath, apkPath);\n return true;\n } finally {\n await fs.rimraf(tmpRoot);\n }\n}\n\nfunction getIMEListFromOutput (stdout) {\n let engines = [];\n for (let line of stdout.split('\\n')) {\n if (line.length > 0 && line[0] !== ' ') {\n // remove newline and trailing colon, and add to the list\n engines.push(line.trim().replace(/:$/, ''));\n }\n }\n return engines;\n}\n\nconst getJavaHome = _.memoize(async function getJavaHome () {\n const result = process.env.JAVA_HOME;\n if (!result) {\n throw new Error('The JAVA_HOME environment variable is not set for the current process');\n }\n if (!await fs.exists(result)) {\n throw new Error(`The JAVA_HOME location '${result}' must exist`);\n }\n const stats = await fs.stat(result);\n if (!stats.isDirectory()) {\n throw new Error(`The JAVA_HOME location '${result}' must be a valid folder`);\n }\n return result;\n});\n\nconst getJavaForOs = _.memoize(async function getJavaForOs () {\n let javaHome;\n let errMsg;\n try {\n javaHome = await getJavaHome();\n } catch (err) {\n errMsg = err.message;\n }\n const executableName = `java${system.isWindows() ? '.exe' : ''}`;\n if (javaHome) {\n const resultPath = path.resolve(javaHome, 'bin', executableName);\n if (await fs.exists(resultPath)) {\n return resultPath;\n }\n }\n try {\n return await fs.which(executableName);\n } catch (ign) {}\n throw new Error(`The '${executableName}' binary could not be found ` +\n `neither in PATH nor under JAVA_HOME (${errMsg || path.resolve(javaHome, 'bin')})`);\n});\n\nconst getOpenSslForOs = async function () {\n const binaryName = `openssl${system.isWindows() ? '.exe' : ''}`;\n try {\n return await fs.which(binaryName);\n } catch (err) {\n throw new Error('The openssl tool must be installed on the system and available on the path');\n }\n};\n\n/**\n * Get the absolute path to apksigner tool\n *\n * @param {Object} sysHelpers - An instance containing systemCallMethods helper methods\n * @returns {string} An absolute path to apksigner tool.\n * @throws {Error} If the tool is not present on the local file system.\n */\nasync function getApksignerForOs (sysHelpers) {\n return await sysHelpers.getBinaryFromSdkRoot('apksigner.jar');\n}\n\n/**\n * Get the absolute path to apkanalyzer tool.\n * https://developer.android.com/studio/command-line/apkanalyzer.html\n *\n * @param {Object} sysHelpers - An instance containing systemCallMethods helper methods\n * @returns {string} An absolute path to apkanalyzer tool.\n * @throws {Error} If the tool is not present on the local file system.\n */\nasync function getApkanalyzerForOs (sysHelpers) {\n return await sysHelpers.getBinaryFromSdkRoot('apkanalyzer');\n}\n\n/**\n * Checks mShowingLockscreen or mDreamingLockscreen in dumpsys output to determine\n * if lock screen is showing\n *\n * A note: `adb shell dumpsys trust` performs better while detecting the locked screen state\n * in comparison to `adb dumpsys window` output parsing.\n * But the trust command does not work for `Swipe` unlock pattern.\n *\n * In some Android devices (Probably around Android 10+), `mShowingLockscreen` and `mDreamingLockscreen`\n * do not work to detect lock status. Instead, keyguard preferences helps to detect the lock condition.\n * Some devices such as Android TV do not have keyguard, so we should keep\n * screen condition as this primary method.\n *\n * @param {string} dumpsys - The output of dumpsys window command.\n * @return {boolean} True if lock screen is showing.\n */\nfunction isShowingLockscreen (dumpsys) {\n return _.some(['mShowingLockscreen=true', 'mDreamingLockscreen=true'], (x) => dumpsys.includes(x))\n // `mIsShowing` and `mInputRestricted` are `true` in lock condition. `false` is unlock condition.\n || _.every([/KeyguardStateMonitor[\\n\\s]+mIsShowing=true/, /\\s+mInputRestricted=true/], (x) => x.test(dumpsys));\n}\n\n/*\n * Checks mCurrentFocus in dumpsys output to determine if Keyguard is activated\n */\nfunction isCurrentFocusOnKeyguard (dumpsys) {\n let m = /mCurrentFocus.+Keyguard/gi.exec(dumpsys);\n return (m && m.length && m[0]) ? true : false;\n}\n\n/*\n * Reads SurfaceOrientation in dumpsys output\n */\nfunction getSurfaceOrientation (dumpsys) {\n let m = /SurfaceOrientation: \\d/gi.exec(dumpsys);\n return m && parseInt(m[0].split(':')[1], 10);\n}\n\n/*\n * Checks mScreenOnFully in dumpsys output to determine if screen is showing\n * Default is true\n */\nfunction isScreenOnFully (dumpsys) {\n let m = /mScreenOnFully=\\w+/gi.exec(dumpsys);\n return !m || // if information is missing we assume screen is fully on\n (m && m.length > 0 && m[0].split('=')[1] === 'true') || false;\n}\n\n/**\n * Builds command line representation for the given\n * application startup options\n *\n * @param {StartAppOptions} startAppOptions - Application options mapping\n * @param {number} apiLevel - The actual OS API level\n * @returns {Array<String>} The actual command line array\n */\nfunction buildStartCmd (startAppOptions, apiLevel) {\n const {\n user,\n waitForLaunch,\n pkg,\n activity,\n action,\n category,\n stopApp,\n flags,\n } = startAppOptions;\n const cmd = ['am', 'start'];\n if (util.hasValue(user)) {\n cmd.push('--user', user);\n }\n if (waitForLaunch) {\n cmd.push('-W');\n }\n if (activity && pkg) {\n cmd.push('-n', `${pkg}/${activity}`);\n }\n if (stopApp && apiLevel >= 15) {\n cmd.push('-S');\n }\n if (action) {\n cmd.push('-a', action);\n }\n if (category) {\n cmd.push('-c', category);\n }\n if (flags) {\n cmd.push('-f', flags);\n }\n if (startAppOptions.optionalIntentArguments) {\n // expect optionalIntentArguments to be a single string of the form:\n // \"-flag key\"\n // \"-flag key value\"\n // or a combination of these (e.g., \"-flag1 key1 -flag2 key2 value2\")\n\n // take a string and parse out the part before any spaces, and anything after\n // the first space\n let parseKeyValue = function (str) {\n str = str.trim();\n let space = str.indexOf(' ');\n if (space === -1) {\n return str.length ? [str] : [];\n } else {\n return [str.substring(0, space).trim(), str.substring(space + 1).trim()];\n }\n };\n\n // cycle through the optionalIntentArguments and pull out the arguments\n // add a space initially so flags can be distinguished from arguments that\n // have internal hyphens\n let optionalIntentArguments = ` ${startAppOptions.optionalIntentArguments}`;\n let re = / (-[^\\s]+) (.+)/;\n while (true) { // eslint-disable-line no-constant-condition\n let args = re.exec(optionalIntentArguments);\n if (!args) {\n if (optionalIntentArguments.length) {\n // no more flags, so the remainder can be treated as 'key' or 'key value'\n cmd.push.apply(cmd, parseKeyValue(optionalIntentArguments));\n }\n // we are done\n break;\n }\n\n // take the flag and see if it is at the beginning of the string\n // if it is not, then it means we have been through already, and\n // what is before the flag is the argument for the previous flag\n let flag = args[1];\n let flagPos = optionalIntentArguments.indexOf(flag);\n if (flagPos !== 0) {\n let prevArgs = optionalIntentArguments.substring(0, flagPos);\n cmd.push.apply(cmd, parseKeyValue(prevArgs));\n }\n\n // add the flag, as there are no more earlier arguments\n cmd.push(flag);\n\n // make optionalIntentArguments hold the remainder\n optionalIntentArguments = args[2];\n }\n }\n return cmd;\n}\n\nconst getSdkToolsVersion = _.memoize(async function getSdkToolsVersion () {\n const androidHome = process.env.ANDROID_HOME;\n if (!androidHome) {\n throw new Error('ANDROID_HOME environment variable is expected to be set');\n }\n const propertiesPath = path.resolve(androidHome, 'tools', 'source.properties');\n if (!await fs.exists(propertiesPath)) {\n log.warn(`Cannot find ${propertiesPath} file to read SDK version from`);\n return;\n }\n const propertiesContent = await fs.readFile(propertiesPath, 'utf8');\n const versionMatcher = new RegExp(/Pkg\\.Revision=(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n const match = versionMatcher.exec(propertiesContent);\n if (match) {\n return {\n major: parseInt(match[1], 10),\n minor: match[2] ? parseInt(match[2], 10) : 0,\n build: match[3] ? parseInt(match[3], 10) : 0\n };\n }\n log.warn(`Cannot parse \"Pkg.Revision\" value from ${propertiesPath}`);\n});\n\n/**\n * Retrieves full paths to all 'build-tools' subfolders under the particular\n * SDK root folder\n *\n * @param {string} sdkRoot - The full path to the Android SDK root folder\n * @returns {Array<string>} The full paths to the resulting folders sorted by\n * modification date (the newest comes first) or an empty list if no macthes were found\n */\nconst getBuildToolsDirs = _.memoize(async function getBuildToolsDirs (sdkRoot) {\n let buildToolsDirs = await fs.glob('*/', {\n cwd: path.resolve(sdkRoot, 'build-tools'),\n absolute: true,\n });\n try {\n buildToolsDirs = buildToolsDirs\n .map((dir) => [path.basename(dir), dir])\n .sort((a, b) => semver.rcompare(a[0], b[0]))\n .map((pair) => pair[1]);\n } catch (err) {\n log.warn(`Cannot sort build-tools folders ${JSON.stringify(buildToolsDirs.map((dir) => path.basename(dir)))} ` +\n `by semantic version names.`);\n log.warn(`Falling back to sorting by modification date. Original error: ${err.message}`);\n const pairs = await B.map(buildToolsDirs, async (dir) => [(await fs.stat(dir)).mtime.valueOf(), dir]);\n buildToolsDirs = pairs\n .sort((a, b) => a[0] < b[0])\n .map((pair) => pair[1]);\n }\n log.info(`Found ${buildToolsDirs.length} 'build-tools' folders under '${sdkRoot}' (newest first):`);\n for (let dir of buildToolsDirs) {\n log.info(` ${dir}`);\n }\n return buildToolsDirs;\n});\n\n/**\n * Retrieves the list of permission names encoded in `dumpsys package` command output.\n *\n * @param {string} dumpsysOutput - The actual command output.\n * @param {Array<string>} groupNames - The list of group names to list permissions for.\n * @param {?boolean} grantedState - The expected state of `granted` attribute to filter with.\n * No filtering is done if the parameter is not set.\n * @returns {Array<string>} The list of matched permission names or an empty list if no matches were found.\n */\nconst extractMatchingPermissions = function (dumpsysOutput, groupNames, grantedState = null) {\n const groupPatternByName = (groupName) => new RegExp(`^(\\\\s*${_.escapeRegExp(groupName)} permissions:[\\\\s\\\\S]+)`, 'm');\n const indentPattern = /\\S|$/;\n const permissionNamePattern = /android\\.\\w*\\.?permission\\.\\w+/;\n const grantedStatePattern = /\\bgranted=(\\w+)/;\n const result = [];\n for (const groupName of groupNames) {\n const groupMatch = groupPatternByName(groupName).exec(dumpsysOutput);\n if (!groupMatch) {\n continue;\n }\n\n const lines = groupMatch[1].split('\\n');\n if (lines.length < 2) {\n continue;\n }\n\n const titleIndent = lines[0].search(indentPattern);\n for (const line of lines.slice(1)) {\n const currentIndent = line.search(indentPattern);\n if (currentIndent <= titleIndent) {\n break;\n }\n\n const permissionNameMatch = permissionNamePattern.exec(line);\n if (!permissionNameMatch) {\n continue;\n }\n const item = {\n permission: permissionNameMatch[0],\n };\n const grantedStateMatch = grantedStatePattern.exec(line);\n if (grantedStateMatch) {\n item.granted = grantedStateMatch[1] === 'true';\n }\n result.push(item);\n }\n }\n\n const filteredResult = result\n .filter((item) => !_.isBoolean(grantedState) || item.granted === grantedState)\n .map((item) => item.permission);\n log.debug(`Retrieved ${util.pluralize('permission', filteredResult.length, true)} ` +\n `from ${groupNames} ${util.pluralize('group', groupNames.length, false)}`);\n return filteredResult;\n};\n\n/**\n * @typedef {Object} InstallOptions\n * @property {boolean} allowTestPackages [false] - Set to true in order to allow test\n * packages installation.\n * @property {boolean} useSdcard [false] - Set to true to install the app on sdcard\n * instead of the device memory.\n * @property {boolean} grantPermissions [false] - Set to true in order to grant all the\n * permissions requested in the application's manifest\n * automatically after the installation is completed\n * under Android 6+.\n * @property {boolean} replace [true] - Set it to false if you don't want\n * the application to be upgraded/reinstalled\n * if it is already present on the device.\n * @property {boolean} partialInstall [false] - Install apks partially. It is used for 'install-multiple'.\n * https://android.stackexchange.com/questions/111064/what-is-a-partial-application-install-via-adb\n */\n\n/**\n * Transforms given options into the list of `adb install.install-multiple` command arguments\n *\n * @param {number} apiLevel - The current API level\n * @param {?InstallOptions} options - The options mapping to transform\n * @returns {Array<String>} The array of arguments\n */\nfunction buildInstallArgs (apiLevel, options = {}) {\n const result = [];\n\n if (!util.hasValue(options.replace) || options.replace) {\n result.push('-r');\n }\n if (options.allowTestPackages) {\n result.push('-t');\n }\n if (options.useSdcard) {\n result.push('-s');\n }\n if (options.grantPermissions) {\n if (apiLevel < 23) {\n log.debug(`Skipping permissions grant option, since ` +\n `the current API level ${apiLevel} does not support applications ` +\n `permissions customization`);\n } else {\n result.push('-g');\n }\n }\n // For multiple-install\n if (options.partialInstall) {\n result.push('-p');\n }\n\n return result;\n}\n\n/**\n * @typedef {Object} ManifestInfo\n * @property {string} pkg - The application identifier\n * @property {string} activity - The name of the main package activity\n * @property {?number} versionCode - The version code number (might be `NaN`)\n * @property {?string} versionName - The version name (might be `null`)\n */\n\n/**\n * Perform parsing of the manifest object in order\n * to extract some vital values from it\n *\n * @param {object} manifest The manifest content formatted as JSON\n * See https://www.npmjs.com/package/adbkit-apkreader for detailed format description\n * @returns {ManifestInfo}\n */\nfunction parseManifest (manifest) {\n const result = {\n pkg: manifest.package,\n versionCode: parseInt(manifest.versionCode, 10),\n versionName: manifest.versionName || null,\n };\n if (!manifest.application) {\n return result;\n }\n\n // Look for enabled activity or activity-alias with\n // action == android.intent.action.MAIN and\n // category == android.intent.category.LAUNCHER\n for (const activity of [\n ...manifest.application.activities,\n ...manifest.application.activityAliases,\n ]) {\n if (activity.enabled === false || _.isEmpty(activity.intentFilters)) {\n continue;\n }\n\n for (const {actions, categories} of activity.intentFilters) {\n if (_.isEmpty(actions) || _.isEmpty(categories)) {\n continue;\n }\n\n const isMainAction = actions.some(({name}) => name === MAIN_ACTION);\n const isLauncherCategory = categories.some(({name}) => name === LAUNCHER_CATEGORY);\n if (isMainAction && isLauncherCategory) {\n result.activity = activity.name;\n return result;\n }\n }\n }\n return result;\n}\n\n/**\n * Parses apk strings from aapt tool output\n *\n * @param {string} rawOutput The actual tool output\n * @param {string} configMarker The config marker. Usually\n * a language abbreviation or `(default)`\n * @returns {Object} Strings ids to values mapping. Plural\n * values are represented as arrays. If no config found for the\n * given marker then an empty mapping is returned.\n */\nfunction parseAaptStrings (rawOutput, configMarker) {\n const normalizeStringMatch = function (s) {\n return s.replace(/\"$/, '').replace(/^\"/, '').replace(/\\\\\"/g, '\"');\n };\n\n const apkStrings = {};\n let isInConfig = false;\n let currentResourceId = null;\n let isInPluralGroup = false;\n // The pattern matches any quoted content including escaped quotes\n const quotedStringPattern = /\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"/;\n for (const line of rawOutput.split(os.EOL)) {\n const trimmedLine = line.trim();\n if (_.isEmpty(trimmedLine)) {\n continue;\n }\n\n if (['config', 'type', 'spec', 'Package'].some((x) => trimmedLine.startsWith(x))) {\n isInConfig = trimmedLine.startsWith(`config ${configMarker}:`);\n currentResourceId = null;\n isInPluralGroup = false;\n continue;\n }\n\n if (!isInConfig) {\n continue;\n }\n\n if (trimmedLine.startsWith('resource')) {\n isInPluralGroup = false;\n currentResourceId = null;\n\n if (trimmedLine.includes(':string/')) {\n const match = /:string\\/(\\S+):/.exec(trimmedLine);\n if (match) {\n currentResourceId = match[1];\n }\n } else if (trimmedLine.includes(':plurals/')) {\n const match = /:plurals\\/(\\S+):/.exec(trimmedLine);\n if (match) {\n currentResourceId = match[1];\n isInPluralGroup = true;\n }\n }\n continue;\n }\n\n if (currentResourceId && trimmedLine.startsWith('(string')) {\n const match = quotedStringPattern.exec(trimmedLine);\n if (match) {\n apkStrings[currentResourceId] = normalizeStringMatch(match[0]);\n }\n currentResourceId = null;\n continue;\n }\n\n if (currentResourceId && isInPluralGroup && trimmedLine.includes(': (string')) {\n const match = quotedStringPattern.exec(trimmedLine);\n if (match) {\n apkStrings[currentResourceId] = [\n ...(apkStrings[currentResourceId] || []),\n normalizeStringMatch(match[0]),\n ];\n }\n continue;\n }\n }\n return apkStrings;\n}\n\n/**\n * Parses apk strings from aapt2 tool output\n *\n * @param {string} rawOutput The actual tool output\n * @param {string} configMarker The config marker. Usually\n * a language abbreviation or an empty string for the default one\n * @returns {Object} Strings ids to values mapping. Plural\n * values are represented as arrays. If no config found for the\n * given marker then an empty mapping is returned.\n */\nfunction parseAapt2Strings (rawOutput, configMarker) {\n const allLines = rawOutput.split(os.EOL);\n function extractContent (startIdx) {\n let idx = startIdx;\n const startCharPos = allLines[startIdx].indexOf('\"');\n if (startCharPos < 0) {\n return [null, idx];\n }\n let result = '';\n while (idx < allLines.length) {\n const terminationCharMatch = /\"$/.exec(allLines[idx]);\n if (terminationCharMatch) {\n const terminationCharPos = terminationCharMatch.index;\n if (startIdx === idx) {\n return [\n allLines[idx].substring(startCharPos + 1, terminationCharPos),\n idx\n ];\n }\n return [\n `${result}\\\\n${_.trimStart(allLines[idx].substring(0, terminationCharPos))}`,\n idx,\n ];\n }\n if (idx > startIdx) {\n result += `\\\\n${_.trimStart(allLines[idx])}`;\n } else {\n result += allLines[idx].substring(startCharPos + 1);\n }\n ++idx;\n }\n return [result, idx];\n }\n\n const apkStrings = {};\n let currentResourceId = null;\n let isInPluralGroup = false;\n let isInCurrentConfig = false;\n let lineIndex = 0;\n while (lineIndex < allLines.length) {\n const trimmedLine = allLines[lineIndex].trim();\n if (_.isEmpty(trimmedLine)) {\n ++lineIndex;\n continue;\n }\n\n if (['type', 'Package'].some((x) => trimmedLine.startsWith(x))) {\n currentResourceId = null;\n isInPluralGroup = false;\n isInCurrentConfig = false;\n ++lineIndex;\n continue;\n }\n\n if (trimmedLine.startsWith('resource')) {\n isInPluralGroup = false;\n currentResourceId = null;\n isInCurrentConfig = false;\n\n if (trimmedLine.includes('string/')) {\n const match = /string\\/(\\S+)/.exec(trimmedLine);\n if (match) {\n currentResourceId = match[1];\n }\n } else if (trimmedLine.includes('plurals/')) {\n const match = /plurals\\/(\\S+)/.exec(trimmedLine);\n if (match) {\n currentResourceId = match[1];\n isInPluralGroup = true;\n }\n }\n ++lineIndex;\n continue;\n }\n\n if (currentResourceId) {\n if (isInPluralGroup) {\n if (trimmedLine.startsWith('(')) {\n isInCurrentConfig = trimmedLine.startsWith(`(${configMarker})`);\n ++lineIndex;\n continue;\n }\n if (isInCurrentConfig) {\n const [content, idx] = extractContent(lineIndex);\n lineIndex = idx;\n if (_.isString(content)) {\n apkStrings[currentResourceId] = [\n ...(apkStrings[currentResourceId] || []),\n content,\n ];\n }\n }\n } else if (trimmedLine.startsWith(`(${configMarker})`)) {\n const [content, idx] = extractContent(lineIndex);\n lineIndex = idx;\n if (_.isString(content)) {\n apkStrings[currentResourceId] = content;\n }\n currentResourceId = null;\n }\n }\n ++lineIndex;\n }\n return apkStrings;\n}\n\n/**\n * Formats the config marker, which is then passed to parse.. methods\n * to make it compatible with resource formats generated by aapt(2) tool\n *\n * @param {Function} configsGetter The function whose result is a list\n * of apk configs\n * @param {string} desiredMarker The desired config marker value\n * @param {string} defaultMarker The default config marker value\n * @return {string} The formatted config marker\n */\nasync function formatConfigMarker (configsGetter, desiredMarker, defaultMarker) {\n let configMarker = desiredMarker || defaultMarker;\n if (configMarker.includes('-') && !configMarker.includes('-r')) {\n configMarker = configMarker.replace('-', '-r');\n }\n const configs = await configsGetter();\n log.debug(`Resource configurations: ${JSON.stringify(configs)}`);\n // Assume the 'en' configuration is the default one\n if (configMarker.toLowerCase().startsWith('en')\n && !configs.some((x) => x.trim() === configMarker)) {\n log.debug(`Resource configuration name '${configMarker}' is unknown. ` +\n `Replacing it with '${defaultMarker}'`);\n configMarker = defaultMarker;\n } else {\n log.debug(`Selected configuration: '${configMarker}'`);\n }\n return configMarker;\n}\n\n/**\n * Parses the output in JSON format retrieved from\n * the corresponding Appium Settings broadcast calls\n *\n * @param {string} output The actual command output\n * @param {string} entityName The name of the entity which is\n * going to be parsed\n * @returns {Object} The parsed JSON object\n * @throws {Error} If the output cannot be parsed\n * as a valid JSON\n */\nfunction parseJsonData (output, entityName) {\n if (!/\\bresult=-1\\b/.test(output) || !/\\bdata=\"/.test(output)) {\n log.debug(output);\n throw new Error(`Cannot retrieve ${entityName} from the device. ` +\n 'Check the server log for more details');\n }\n const match = /\\bdata=(\".+)/.exec(output);\n if (!match) {\n log.debug(output);\n throw new Error(`Cannot parse ${entityName} from the command output. ` +\n 'Check the server log for more details');\n }\n const jsonStr = _.trim(match[1]).replace(/(^\")|(\"$)/g, '');\n try {\n return JSON.parse(jsonStr);\n } catch (e) {\n log.debug(jsonStr);\n throw new Error(`Cannot parse ${entityName} from the resulting data string. ` +\n 'Check the server log for more details');\n }\n}\n\n/**\n * Transforms the given language and country abbreviations\n * to AVD arguments array\n *\n * @param {?string} language Language name, for example 'fr'\n * @param {?string} country Country name, for example 'CA'\n * @returns {Array<string>} The generated arguments. The\n * resulting array might be empty if both arguments are empty\n */\nfunction toAvdLocaleArgs (language, country) {\n const result = [];\n if (language && _.isString(language)) {\n result.push('-prop', `persist.sys.language=${language.toLowerCase()}`);\n }\n if (country && _.isString(country)) {\n result.push('-prop', `persist.sys.country=${country.toUpperCase()}`);\n }\n let locale;\n if (_.isString(language) && _.isString(country) && language && country) {\n locale = language.toLowerCase() + '-' + country.toUpperCase();\n } else if (language && _.isString(language)) {\n locale = language.toLowerCase();\n } else if (country && _.isString(country)) {\n locale = country;\n }\n if (locale) {\n result.push('-prop', `persist.sys.locale=${locale}`);\n }\n return result;\n}\n\n/**\n * Retrieves the full path to the Android preferences root\n *\n * @returns {?string} The full path to the folder or `null` if the folder cannot be found\n */\nasync function getAndroidPrefsRoot () {\n let location = process.env.ANDROID_EMULATOR_HOME;\n if (await dirExists(location)) {\n return location;\n }\n\n if (location) {\n log.warn(`The value of the ANDROID_EMULATOR_HOME environment variable '${location}' is not an existing directory`);\n }\n\n const home = process.env.HOME || process.env.USERPROFILE;\n if (home) {\n location = path.resolve(home, '.android');\n }\n\n if (!await dirExists(location)) {\n log.debug(`Android config root '${location}' is not an existing directory`);\n return null;\n }\n\n return location;\n}\n\n/**\n * Check if a path exists on the filesystem and is a directory\n *\n * @param {?string} location The full path to the directory\n * @returns {boolean}\n */\nasync function dirExists (location) {\n return location\n && await fs.exists(location)\n && (await fs.stat(location)).isDirectory();\n}\n\n/**\n * Escapes special characters in command line arguments.\n * This is needed to avoid possible issues with how system `spawn`\n * call handles them.\n * See https://discuss.appium.io/t/how-to-modify-wd-proxy-and-uiautomator2-source-code-to-support-unicode/33466\n * for more details.\n *\n * @param {string} arg Non-escaped argument string\n * @returns The escaped argument\n */\nfunction escapeShellArg (arg) {\n arg = `${arg}`;\n if (system.isWindows()) {\n return /[&|^\\s]/.test(arg) ? `\"${arg.replace(/\"/g, '\"\"')}\"` : arg;\n }\n return arg.replace(/&/g, '\\\\&');\n}\n\n/**\n * Parses the name of launchable package activity\n * from dumpsys output.\n *\n * @param {string} dumpsys the actual dumpsys output\n * @returns {string[]} Either the fully qualified\n * activity name as a single list item or an empty list if nothing could be parsed.\n * In Android 6 and older there is no reliable way to determine\n * the category name for the given activity, so this API just\n * returns all activity names belonging to 'android.intent.action.MAIN'\n * with the expectation that the app manifest could be parsed next\n * in order to determine category names for these.\n */\nfunction parseLaunchableActivityNames (dumpsys) {\n const mainActivityNameRe = new RegExp(`^\\\\s*${_.escapeRegExp(MAIN_ACTION)}:$`);\n const categoryNameRe = /^\\s*Category:\\s+\"([a-zA-Z0-9._/-]+)\"$/;\n const blocks = [];\n let blockStartIndent;\n let block = [];\n for (const line of dumpsys.split('\\n').map(_.trimEnd)) {\n const currentIndent = line.length - _.trimStart(line).length;\n if (mainActivityNameRe.test(line)) {\n blockStartIndent = currentIndent;\n if (!_.isEmpty(block)) {\n blocks.push(block);\n block = [];\n }\n continue;\n }\n if (_.isNil(blockStartIndent)) {\n continue;\n }\n\n if (currentIndent > blockStartIndent) {\n block.push(line);\n } else {\n if (!_.isEmpty(block)) {\n blocks.push(block);\n block = [];\n }\n blockStartIndent = null;\n }\n }\n if (!_.isEmpty(block)) {\n blocks.push(block);\n }\n\n const result = [];\n for (const item of blocks) {\n let hasCategory = false;\n let isLauncherCategory = false;\n for (const line of item) {\n const match = categoryNameRe.exec(line);\n if (!match) {\n continue;\n }\n\n hasCategory = true;\n isLauncherCategory = match[1] === LAUNCHER_CATEGORY;\n break;\n }\n // On older Android versions the category name\n // might not be listed, so we just try to fetch\n // all matches instead\n if (hasCategory && !isLauncherCategory) {\n continue;\n }\n\n for (const activityNameStr of item.map(_.trim).filter(Boolean)) {\n const fqActivityName = activityNameStr.split(/\\s+/)[1];\n if (!matchComponentName(fqActivityName)) {\n continue;\n }\n\n if (isLauncherCategory) {\n return [fqActivityName];\n }\n result.push(fqActivityName);\n }\n }\n return result;\n}\n\n/**\n * Check if the given string is a valid component name\n *\n * @param {string} classString The string to verify\n * @return {?Array<Match>} The result of Regexp.exec operation\n * or _null_ if no matches are found\n */\nfunction matchComponentName (classString) {\n // some.package/some.package.Activity\n return /^[a-z0-9./_]+$/i.exec(classString);\n}\n\nexport {\n getAndroidPlatformAndPath, unzipFile,\n getIMEListFromOutput, getJavaForOs, isShowingLockscreen, isCurrentFocusOnKeyguard,\n getSurfaceOrientation, isScreenOnFully, buildStartCmd, getJavaHome,\n getSdkToolsVersion, getApksignerForOs, getBuildToolsDirs,\n getApkanalyzerForOs, getOpenSslForOs, extractMatchingPermissions, APKS_EXTENSION,\n APK_INSTALL_TIMEOUT, APKS_INSTALL_TIMEOUT, buildInstallArgs, APK_EXTENSION,\n DEFAULT_ADB_EXEC_TIMEOUT, parseManifest, parseAaptStrings, parseAapt2Strings,\n formatConfigMarker, parseJsonData, unsignApk, toAvdLocaleArgs, requireSdkRoot,\n getSdkRootFromEnv, getAndroidPrefsRoot, dirExists, escapeShellArg,\n parseLaunchableActivityNames, matchComponentName, getModuleRoot\n};\n"],"mappings":"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"}
|
package/build/lib/logcat.js
CHANGED
|
@@ -1,30 +1,20 @@
|
|
|
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
|
-
|
|
10
8
|
require("source-map-support/register");
|
|
11
|
-
|
|
12
9
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
-
|
|
14
10
|
var _support = require("@appium/support");
|
|
15
|
-
|
|
16
11
|
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
17
|
-
|
|
18
12
|
var _events = _interopRequireDefault(require("events"));
|
|
19
|
-
|
|
20
13
|
var _teen_process = require("teen_process");
|
|
21
|
-
|
|
22
14
|
const {
|
|
23
15
|
EventEmitter
|
|
24
16
|
} = _events.default;
|
|
25
|
-
|
|
26
17
|
const log = _support.logger.getLogger('Logcat');
|
|
27
|
-
|
|
28
18
|
const MAX_BUFFER_SIZE = 10000;
|
|
29
19
|
const LOGCAT_PROC_STARTUP_TIMEOUT = 10000;
|
|
30
20
|
const SUPPORTED_FORMATS = ['brief', 'process', 'tag', 'thread', 'raw', 'time', 'threadtime', 'long'];
|
|
@@ -32,49 +22,39 @@ const SUPPORTED_PRIORITIES = ['v', 'd', 'i', 'w', 'e', 'f', 's'];
|
|
|
32
22
|
const DEFAULT_PRIORITY = 'v';
|
|
33
23
|
const DEFAULT_TAG = '*';
|
|
34
24
|
const DEFAULT_FORMAT = 'threadtime';
|
|
35
|
-
|
|
36
25
|
function requireFormat(format) {
|
|
37
26
|
if (!SUPPORTED_FORMATS.includes(format)) {
|
|
38
27
|
log.info(`The format value '${format}' is unknown. Supported values are: ${SUPPORTED_FORMATS}`);
|
|
39
28
|
log.info(`Defaulting to '${DEFAULT_FORMAT}'`);
|
|
40
29
|
return DEFAULT_FORMAT;
|
|
41
30
|
}
|
|
42
|
-
|
|
43
31
|
return format;
|
|
44
32
|
}
|
|
45
|
-
|
|
46
33
|
function requireSpec(spec) {
|
|
47
34
|
const [tag, priority] = spec.split(':');
|
|
48
35
|
let resultTag = tag;
|
|
49
|
-
|
|
50
36
|
if (!resultTag) {
|
|
51
37
|
log.info(`The tag value in spec '${spec}' cannot be empty`);
|
|
52
38
|
log.info(`Defaulting to '${DEFAULT_TAG}'`);
|
|
53
39
|
resultTag = DEFAULT_TAG;
|
|
54
40
|
}
|
|
55
|
-
|
|
56
41
|
if (!priority) {
|
|
57
42
|
log.info(`The priority value in spec '${spec}' is empty. Defaulting to Verbose (${DEFAULT_PRIORITY})`);
|
|
58
43
|
return `${resultTag}:${DEFAULT_PRIORITY}`;
|
|
59
44
|
}
|
|
60
|
-
|
|
61
45
|
if (!SUPPORTED_PRIORITIES.some(p => _lodash.default.toLower(priority) === _lodash.default.toLower(p))) {
|
|
62
46
|
log.info(`The priority value in spec '${spec}' is unknown. Supported values are: ${SUPPORTED_PRIORITIES}`);
|
|
63
47
|
log.info(`Defaulting to Verbose (${DEFAULT_PRIORITY})`);
|
|
64
48
|
return `${resultTag}:${DEFAULT_PRIORITY}`;
|
|
65
49
|
}
|
|
66
|
-
|
|
67
50
|
return spec;
|
|
68
51
|
}
|
|
69
|
-
|
|
70
52
|
function formatFilterSpecs(filterSpecs) {
|
|
71
53
|
if (!_lodash.default.isArray(filterSpecs)) {
|
|
72
54
|
filterSpecs = [filterSpecs];
|
|
73
55
|
}
|
|
74
|
-
|
|
75
56
|
return filterSpecs.filter(spec => spec && _lodash.default.isString(spec) && !spec.startsWith('-')).map(spec => spec.includes(':') ? requireSpec(spec) : spec);
|
|
76
57
|
}
|
|
77
|
-
|
|
78
58
|
class Logcat extends EventEmitter {
|
|
79
59
|
constructor(opts = {}) {
|
|
80
60
|
super();
|
|
@@ -86,26 +66,20 @@ class Logcat extends EventEmitter {
|
|
|
86
66
|
this.logs = [];
|
|
87
67
|
this.logIdxSinceLastRequest = 0;
|
|
88
68
|
}
|
|
89
|
-
|
|
90
69
|
async startCapture(opts = {}) {
|
|
91
70
|
let started = false;
|
|
92
71
|
return await new _bluebird.default(async (_resolve, _reject) => {
|
|
93
72
|
const resolve = function (...args) {
|
|
94
73
|
started = true;
|
|
95
|
-
|
|
96
74
|
_resolve(...args);
|
|
97
75
|
};
|
|
98
|
-
|
|
99
76
|
const reject = function (...args) {
|
|
100
77
|
started = true;
|
|
101
|
-
|
|
102
78
|
_reject(...args);
|
|
103
79
|
};
|
|
104
|
-
|
|
105
80
|
if (this.clearLogs) {
|
|
106
81
|
await this.clear();
|
|
107
82
|
}
|
|
108
|
-
|
|
109
83
|
const {
|
|
110
84
|
format = DEFAULT_FORMAT,
|
|
111
85
|
filterSpecs = []
|
|
@@ -116,7 +90,6 @@ class Logcat extends EventEmitter {
|
|
|
116
90
|
this.proc.on('exit', (code, signal) => {
|
|
117
91
|
log.error(`Logcat terminated with code ${code}, signal ${signal}`);
|
|
118
92
|
this.proc = null;
|
|
119
|
-
|
|
120
93
|
if (!started) {
|
|
121
94
|
log.warn('Logcat not started. Continuing');
|
|
122
95
|
resolve();
|
|
@@ -128,15 +101,12 @@ class Logcat extends EventEmitter {
|
|
|
128
101
|
log.error('Logcat process failed to start');
|
|
129
102
|
reject(new Error(`Logcat process failed to start. stderr: ${line}`));
|
|
130
103
|
}
|
|
131
|
-
|
|
132
104
|
this.outputHandler(_lodash.default.trim(line), 'STDERR: ');
|
|
133
105
|
}
|
|
134
|
-
|
|
135
106
|
resolve();
|
|
136
107
|
});
|
|
137
108
|
this.proc.on('lines-stdout', lines => {
|
|
138
109
|
resolve();
|
|
139
|
-
|
|
140
110
|
for (let line of lines) {
|
|
141
111
|
this.outputHandler(_lodash.default.trim(line));
|
|
142
112
|
}
|
|
@@ -145,20 +115,16 @@ class Logcat extends EventEmitter {
|
|
|
145
115
|
setTimeout(resolve, LOGCAT_PROC_STARTUP_TIMEOUT);
|
|
146
116
|
});
|
|
147
117
|
}
|
|
148
|
-
|
|
149
118
|
outputHandler(output, prefix = '') {
|
|
150
119
|
if (!output) {
|
|
151
120
|
return;
|
|
152
121
|
}
|
|
153
|
-
|
|
154
122
|
if (this.logs.length >= this.maxBufferSize) {
|
|
155
123
|
this.logs.shift();
|
|
156
|
-
|
|
157
124
|
if (this.logIdxSinceLastRequest > 0) {
|
|
158
125
|
--this.logIdxSinceLastRequest;
|
|
159
126
|
}
|
|
160
127
|
}
|
|
161
|
-
|
|
162
128
|
const outputObj = {
|
|
163
129
|
timestamp: Date.now(),
|
|
164
130
|
level: 'ALL',
|
|
@@ -167,43 +133,34 @@ class Logcat extends EventEmitter {
|
|
|
167
133
|
this.logs.push(outputObj);
|
|
168
134
|
this.emit('output', outputObj);
|
|
169
135
|
const isTrace = /W\/Trace/.test(output);
|
|
170
|
-
|
|
171
136
|
if (this.debug && (!isTrace || this.debugTrace)) {
|
|
172
137
|
log.debug(prefix + output);
|
|
173
138
|
}
|
|
174
139
|
}
|
|
175
|
-
|
|
176
140
|
async stopCapture() {
|
|
177
141
|
log.debug('Stopping logcat capture');
|
|
178
|
-
|
|
179
142
|
if (!this.proc || !this.proc.isRunning) {
|
|
180
143
|
log.debug('Logcat already stopped');
|
|
181
144
|
this.proc = null;
|
|
182
145
|
return;
|
|
183
146
|
}
|
|
184
|
-
|
|
185
147
|
this.proc.removeAllListeners('exit');
|
|
186
148
|
await this.proc.stop();
|
|
187
149
|
this.proc = null;
|
|
188
150
|
}
|
|
189
|
-
|
|
190
151
|
getLogs() {
|
|
191
152
|
if (this.logIdxSinceLastRequest < this.logs.length) {
|
|
192
153
|
const result = this.logs.slice(this.logIdxSinceLastRequest);
|
|
193
154
|
this.logIdxSinceLastRequest = this.logs.length;
|
|
194
155
|
return result;
|
|
195
156
|
}
|
|
196
|
-
|
|
197
157
|
return [];
|
|
198
158
|
}
|
|
199
|
-
|
|
200
159
|
getAllLogs() {
|
|
201
160
|
return this.logs;
|
|
202
161
|
}
|
|
203
|
-
|
|
204
162
|
async clear() {
|
|
205
163
|
log.debug('Clearing logcat logs from device');
|
|
206
|
-
|
|
207
164
|
try {
|
|
208
165
|
const args = [...this.adb.defaultArgs, 'logcat', '-c'];
|
|
209
166
|
await (0, _teen_process.exec)(this.adb.path, args);
|
|
@@ -211,9 +168,7 @@ class Logcat extends EventEmitter {
|
|
|
211
168
|
log.warn(`Failed to clear logcat logs: ${err.stderr || err.message}`);
|
|
212
169
|
}
|
|
213
170
|
}
|
|
214
|
-
|
|
215
171
|
}
|
|
216
|
-
|
|
217
172
|
var _default = Logcat;
|
|
218
173
|
exports.default = _default;
|
|
219
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFdmVudEVtaXR0ZXIiLCJldmVudHMiLCJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJNQVhfQlVGRkVSX1NJWkUiLCJMT0dDQVRfUFJPQ19TVEFSVFVQX1RJTUVPVVQiLCJTVVBQT1JURURfRk9STUFUUyIsIlNVUFBPUlRFRF9QUklPUklUSUVTIiwiREVGQVVMVF9QUklPUklUWSIsIkRFRkFVTFRfVEFHIiwiREVGQVVMVF9GT1JNQVQiLCJyZXF1aXJlRm9ybWF0IiwiZm9ybWF0IiwiaW5jbHVkZXMiLCJpbmZvIiwicmVxdWlyZVNwZWMiLCJzcGVjIiwidGFnIiwicHJpb3JpdHkiLCJzcGxpdCIsInJlc3VsdFRhZyIsInNvbWUiLCJwIiwiXyIsInRvTG93ZXIiLCJmb3JtYXRGaWx0ZXJTcGVjcyIsImZpbHRlclNwZWNzIiwiaXNBcnJheSIsImZpbHRlciIsImlzU3RyaW5nIiwic3RhcnRzV2l0aCIsIm1hcCIsIkxvZ2NhdCIsImNvbnN0cnVjdG9yIiwib3B0cyIsImFkYiIsImNsZWFyTG9ncyIsImNsZWFyRGV2aWNlTG9nc09uU3RhcnQiLCJkZWJ1ZyIsImRlYnVnVHJhY2UiLCJtYXhCdWZmZXJTaXplIiwibG9ncyIsImxvZ0lkeFNpbmNlTGFzdFJlcXVlc3QiLCJzdGFydENhcHR1cmUiLCJzdGFydGVkIiwiQiIsIl9yZXNvbHZlIiwiX3JlamVjdCIsInJlc29sdmUiLCJhcmdzIiwicmVqZWN0IiwiY2xlYXIiLCJjbWQiLCJkZWZhdWx0QXJncyIsInV0aWwiLCJxdW90ZSIsInBhdGgiLCJwcm9jIiwiU3ViUHJvY2VzcyIsIm9uIiwiY29kZSIsInNpZ25hbCIsImVycm9yIiwid2FybiIsImxpbmVzIiwibGluZSIsInRlc3QiLCJFcnJvciIsIm91dHB1dEhhbmRsZXIiLCJ0cmltIiwic3RhcnQiLCJzZXRUaW1lb3V0Iiwib3V0cHV0IiwicHJlZml4IiwibGVuZ3RoIiwic2hpZnQiLCJvdXRwdXRPYmoiLCJ0aW1lc3RhbXAiLCJEYXRlIiwibm93IiwibGV2ZWwiLCJtZXNzYWdlIiwicHVzaCIsImVtaXQiLCJpc1RyYWNlIiwic3RvcENhcHR1cmUiLCJpc1J1bm5pbmciLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJzdG9wIiwiZ2V0TG9ncyIsInJlc3VsdCIsInNsaWNlIiwiZ2V0QWxsTG9ncyIsImV4ZWMiLCJlcnIiLCJzdGRlcnIiXSwic291cmNlcyI6WyIuLi8uLi9saWIvbG9nY2F0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBsb2dnZXIsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGV2ZW50cyBmcm9tICdldmVudHMnO1xuY29uc3QgeyBFdmVudEVtaXR0ZXIgfSA9IGV2ZW50cztcbmltcG9ydCB7IFN1YlByb2Nlc3MsIGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuXG5jb25zdCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdMb2djYXQnKTtcbmNvbnN0IE1BWF9CVUZGRVJfU0laRSA9IDEwMDAwO1xuY29uc3QgTE9HQ0FUX1BST0NfU1RBUlRVUF9USU1FT1VUID0gMTAwMDA7XG5jb25zdCBTVVBQT1JURURfRk9STUFUUyA9IFsnYnJpZWYnLCAncHJvY2VzcycsICd0YWcnLCAndGhyZWFkJywgJ3JhdycsICd0aW1lJywgJ3RocmVhZHRpbWUnLCAnbG9uZyddO1xuY29uc3QgU1VQUE9SVEVEX1BSSU9SSVRJRVMgPSBbJ3YnLCAnZCcsICdpJywgJ3cnLCAnZScsICdmJywgJ3MnXTtcbmNvbnN0IERFRkFVTFRfUFJJT1JJVFkgPSAndic7XG5jb25zdCBERUZBVUxUX1RBRyA9ICcqJztcbmNvbnN0IERFRkFVTFRfRk9STUFUID0gJ3RocmVhZHRpbWUnO1xuXG5mdW5jdGlvbiByZXF1aXJlRm9ybWF0IChmb3JtYXQpIHtcbiAgaWYgKCFTVVBQT1JURURfRk9STUFUUy5pbmNsdWRlcyhmb3JtYXQpKSB7XG4gICAgbG9nLmluZm8oYFRoZSBmb3JtYXQgdmFsdWUgJyR7Zm9ybWF0fScgaXMgdW5rbm93bi4gU3VwcG9ydGVkIHZhbHVlcyBhcmU6ICR7U1VQUE9SVEVEX0ZPUk1BVFN9YCk7XG4gICAgbG9nLmluZm8oYERlZmF1bHRpbmcgdG8gJyR7REVGQVVMVF9GT1JNQVR9J2ApO1xuICAgIHJldHVybiBERUZBVUxUX0ZPUk1BVDtcbiAgfVxuICByZXR1cm4gZm9ybWF0O1xufVxuXG5mdW5jdGlvbiByZXF1aXJlU3BlYyAoc3BlYykge1xuICBjb25zdCBbdGFnLCBwcmlvcml0eV0gPSBzcGVjLnNwbGl0KCc6Jyk7XG4gIGxldCByZXN1bHRUYWcgPSB0YWc7XG4gIGlmICghcmVzdWx0VGFnKSB7XG4gICAgbG9nLmluZm8oYFRoZSB0YWcgdmFsdWUgaW4gc3BlYyAnJHtzcGVjfScgY2Fubm90IGJlIGVtcHR5YCk7XG4gICAgbG9nLmluZm8oYERlZmF1bHRpbmcgdG8gJyR7REVGQVVMVF9UQUd9J2ApO1xuICAgIHJlc3VsdFRhZyA9IERFRkFVTFRfVEFHO1xuICB9XG4gIGlmICghcHJpb3JpdHkpIHtcbiAgICBsb2cuaW5mbyhgVGhlIHByaW9yaXR5IHZhbHVlIGluIHNwZWMgJyR7c3BlY30nIGlzIGVtcHR5LiBEZWZhdWx0aW5nIHRvIFZlcmJvc2UgKCR7REVGQVVMVF9QUklPUklUWX0pYCk7XG4gICAgcmV0dXJuIGAke3Jlc3VsdFRhZ306JHtERUZBVUxUX1BSSU9SSVRZfWA7XG4gIH1cbiAgaWYgKCFTVVBQT1JURURfUFJJT1JJVElFUy5zb21lKChwKSA9PiBfLnRvTG93ZXIocHJpb3JpdHkpID09PSBfLnRvTG93ZXIocCkpKSB7XG4gICAgbG9nLmluZm8oYFRoZSBwcmlvcml0eSB2YWx1ZSBpbiBzcGVjICcke3NwZWN9JyBpcyB1bmtub3duLiBTdXBwb3J0ZWQgdmFsdWVzIGFyZTogJHtTVVBQT1JURURfUFJJT1JJVElFU31gKTtcbiAgICBsb2cuaW5mbyhgRGVmYXVsdGluZyB0byBWZXJib3NlICgke0RFRkFVTFRfUFJJT1JJVFl9KWApO1xuICAgIHJldHVybiBgJHtyZXN1bHRUYWd9OiR7REVGQVVMVF9QUklPUklUWX1gO1xuICB9XG4gIHJldHVybiBzcGVjO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRGaWx0ZXJTcGVjcyAoZmlsdGVyU3BlY3MpIHtcbiAgaWYgKCFfLmlzQXJyYXkoZmlsdGVyU3BlY3MpKSB7XG4gICAgZmlsdGVyU3BlY3MgPSBbZmlsdGVyU3BlY3NdO1xuICB9XG4gIHJldHVybiBmaWx0ZXJTcGVjc1xuICAgIC5maWx0ZXIoKHNwZWMpID0+IHNwZWMgJiYgXy5pc1N0cmluZyhzcGVjKSAmJiAhc3BlYy5zdGFydHNXaXRoKCctJykpXG4gICAgLm1hcCgoc3BlYykgPT4gc3BlYy5pbmNsdWRlcygnOicpID8gcmVxdWlyZVNwZWMoc3BlYykgOiBzcGVjKTtcbn1cblxuXG5jbGFzcyBMb2djYXQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkYiA9IG9wdHMuYWRiO1xuICAgIHRoaXMuY2xlYXJMb2dzID0gb3B0cy5jbGVhckRldmljZUxvZ3NPblN0YXJ0IHx8IGZhbHNlO1xuICAgIHRoaXMuZGVidWcgPSBvcHRzLmRlYnVnO1xuICAgIHRoaXMuZGVidWdUcmFjZSA9IG9wdHMuZGVidWdUcmFjZTtcbiAgICB0aGlzLm1heEJ1ZmZlclNpemUgPSBvcHRzLm1heEJ1ZmZlclNpemUgfHwgTUFYX0JVRkZFUl9TSVpFO1xuICAgIHRoaXMubG9ncyA9IFtdO1xuICAgIHRoaXMubG9nSWR4U2luY2VMYXN0UmVxdWVzdCA9IDA7XG4gIH1cblxuICBhc3luYyBzdGFydENhcHR1cmUgKG9wdHMgPSB7fSkge1xuICAgIGxldCBzdGFydGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBCKGFzeW5jIChfcmVzb2x2ZSwgX3JlamVjdCkgPT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByb21pc2UvcGFyYW0tbmFtZXNcbiAgICAgIGNvbnN0IHJlc29sdmUgPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgX3Jlc29sdmUoLi4uYXJncyk7XG4gICAgICB9O1xuICAgICAgY29uc3QgcmVqZWN0ID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIF9yZWplY3QoLi4uYXJncyk7XG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5jbGVhckxvZ3MpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jbGVhcigpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7XG4gICAgICAgIGZvcm1hdCA9IERFRkFVTFRfRk9STUFULFxuICAgICAgICBmaWx0ZXJTcGVjcyA9IFtdLFxuICAgICAgfSA9IG9wdHM7XG4gICAgICBjb25zdCBjbWQgPSBbXG4gICAgICAgIC4uLnRoaXMuYWRiLmRlZmF1bHRBcmdzLFxuICAgICAgICAnbG9nY2F0JyxcbiAgICAgICAgJy12JywgcmVxdWlyZUZvcm1hdChmb3JtYXQpLFxuICAgICAgICAuLi5mb3JtYXRGaWx0ZXJTcGVjcyhmaWx0ZXJTcGVjcyksXG4gICAgICBdO1xuICAgICAgbG9nLmRlYnVnKGBTdGFydGluZyBsb2dzIGNhcHR1cmUgd2l0aCBjb21tYW5kOiAke3V0aWwucXVvdGUoW3RoaXMuYWRiLnBhdGgsIC4uLmNtZF0pfWApO1xuICAgICAgdGhpcy5wcm9jID0gbmV3IFN1YlByb2Nlc3ModGhpcy5hZGIucGF0aCwgY21kKTtcbiAgICAgIHRoaXMucHJvYy5vbignZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgbG9nLmVycm9yKGBMb2djYXQgdGVybWluYXRlZCB3aXRoIGNvZGUgJHtjb2RlfSwgc2lnbmFsICR7c2lnbmFsfWApO1xuICAgICAgICB0aGlzLnByb2MgPSBudWxsO1xuICAgICAgICBpZiAoIXN0YXJ0ZWQpIHtcbiAgICAgICAgICBsb2cud2FybignTG9nY2F0IG5vdCBzdGFydGVkLiBDb250aW51aW5nJyk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMucHJvYy5vbignbGluZXMtc3RkZXJyJywgKGxpbmVzKSA9PiB7XG4gICAgICAgIGZvciAobGV0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgICBpZiAoL2V4ZWN2cFxcKFxcKS8udGVzdChsaW5lKSkge1xuICAgICAgICAgICAgbG9nLmVycm9yKCdMb2djYXQgcHJvY2VzcyBmYWlsZWQgdG8gc3RhcnQnKTtcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYExvZ2NhdCBwcm9jZXNzIGZhaWxlZCB0byBzdGFydC4gc3RkZXJyOiAke2xpbmV9YCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm91dHB1dEhhbmRsZXIoXy50cmltKGxpbmUpLCAnU1RERVJSOiAnKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucHJvYy5vbignbGluZXMtc3Rkb3V0JywgKGxpbmVzKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgZm9yIChsZXQgbGluZSBvZiBsaW5lcykge1xuICAgICAgICAgIHRoaXMub3V0cHV0SGFuZGxlcihfLnRyaW0obGluZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMucHJvYy5zdGFydCgwKTtcbiAgICAgIC8vIHJlc29sdmUgYWZ0ZXIgYSB0aW1lb3V0LCBldmVuIGlmIG5vIG91dHB1dCB3YXMgcmVjb3JkZWRcbiAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgTE9HQ0FUX1BST0NfU1RBUlRVUF9USU1FT1VUKTtcbiAgICB9KTtcbiAgfVxuXG4gIG91dHB1dEhhbmRsZXIgKG91dHB1dCwgcHJlZml4ID0gJycpIHtcbiAgICBpZiAoIW91dHB1dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxvZ3MubGVuZ3RoID49IHRoaXMubWF4QnVmZmVyU2l6ZSkge1xuICAgICAgdGhpcy5sb2dzLnNoaWZ0KCk7XG4gICAgICBpZiAodGhpcy5sb2dJZHhTaW5jZUxhc3RSZXF1ZXN0ID4gMCkge1xuICAgICAgICAtLXRoaXMubG9nSWR4U2luY2VMYXN0UmVxdWVzdDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0T2JqID0ge1xuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgbGV2ZWw6ICdBTEwnLFxuICAgICAgbWVzc2FnZTogb3V0cHV0LFxuICAgIH07XG4gICAgdGhpcy5sb2dzLnB1c2gob3V0cHV0T2JqKTtcbiAgICB0aGlzLmVtaXQoJ291dHB1dCcsIG91dHB1dE9iaik7XG4gICAgY29uc3QgaXNUcmFjZSA9IC9XXFwvVHJhY2UvLnRlc3Qob3V0cHV0KTtcbiAgICBpZiAodGhpcy5kZWJ1ZyAmJiAoIWlzVHJhY2UgfHwgdGhpcy5kZWJ1Z1RyYWNlKSkge1xuICAgICAgbG9nLmRlYnVnKHByZWZpeCArIG91dHB1dCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RvcENhcHR1cmUgKCkge1xuICAgIGxvZy5kZWJ1ZygnU3RvcHBpbmcgbG9nY2F0IGNhcHR1cmUnKTtcbiAgICBpZiAoIXRoaXMucHJvYyB8fCAhdGhpcy5wcm9jLmlzUnVubmluZykge1xuICAgICAgbG9nLmRlYnVnKCdMb2djYXQgYWxyZWFkeSBzdG9wcGVkJyk7XG4gICAgICB0aGlzLnByb2MgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnByb2MucmVtb3ZlQWxsTGlzdGVuZXJzKCdleGl0Jyk7XG4gICAgYXdhaXQgdGhpcy5wcm9jLnN0b3AoKTtcbiAgICB0aGlzLnByb2MgPSBudWxsO1xuICB9XG5cbiAgZ2V0TG9ncyAoKSB7XG4gICAgaWYgKHRoaXMubG9nSWR4U2luY2VMYXN0UmVxdWVzdCA8IHRoaXMubG9ncy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubG9ncy5zbGljZSh0aGlzLmxvZ0lkeFNpbmNlTGFzdFJlcXVlc3QpO1xuICAgICAgdGhpcy5sb2dJZHhTaW5jZUxhc3RSZXF1ZXN0ID0gdGhpcy5sb2dzLmxlbmd0aDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldEFsbExvZ3MgKCkge1xuICAgIHJldHVybiB0aGlzLmxvZ3M7XG4gIH1cblxuICBhc3luYyBjbGVhciAoKSB7XG4gICAgbG9nLmRlYnVnKCdDbGVhcmluZyBsb2djYXQgbG9ncyBmcm9tIGRldmljZScpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhcmdzID0gWy4uLnRoaXMuYWRiLmRlZmF1bHRBcmdzLCAnbG9nY2F0JywgJy1jJ107XG4gICAgICBhd2FpdCBleGVjKHRoaXMuYWRiLnBhdGgsIGFyZ3MpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLndhcm4oYEZhaWxlZCB0byBjbGVhciBsb2djYXQgbG9nczogJHtlcnIuc3RkZXJyIHx8IGVyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMb2djYXQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBREEsTUFBTTtFQUFFQTtBQUFGLElBQW1CQyxlQUF6Qjs7QUFHQSxNQUFNQyxHQUFHLEdBQUdDLGVBQUEsQ0FBT0MsU0FBUCxDQUFpQixRQUFqQixDQUFaOztBQUNBLE1BQU1DLGVBQWUsR0FBRyxLQUF4QjtBQUNBLE1BQU1DLDJCQUEyQixHQUFHLEtBQXBDO0FBQ0EsTUFBTUMsaUJBQWlCLEdBQUcsQ0FBQyxPQUFELEVBQVUsU0FBVixFQUFxQixLQUFyQixFQUE0QixRQUE1QixFQUFzQyxLQUF0QyxFQUE2QyxNQUE3QyxFQUFxRCxZQUFyRCxFQUFtRSxNQUFuRSxDQUExQjtBQUNBLE1BQU1DLG9CQUFvQixHQUFHLENBQUMsR0FBRCxFQUFNLEdBQU4sRUFBVyxHQUFYLEVBQWdCLEdB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
|
|
174
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFdmVudEVtaXR0ZXIiLCJldmVudHMiLCJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJNQVhfQlVGRkVSX1NJWkUiLCJMT0dDQVRfUFJPQ19TVEFSVFVQX1RJTUVPVVQiLCJTVVBQT1JURURfRk9STUFUUyIsIlNVUFBPUlRFRF9QUklPUklUSUVTIiwiREVGQVVMVF9QUklPUklUWSIsIkRFRkFVTFRfVEFHIiwiREVGQVVMVF9GT1JNQVQiLCJyZXF1aXJlRm9ybWF0IiwiZm9ybWF0IiwiaW5jbHVkZXMiLCJpbmZvIiwicmVxdWlyZVNwZWMiLCJzcGVjIiwidGFnIiwicHJpb3JpdHkiLCJzcGxpdCIsInJlc3VsdFRhZyIsInNvbWUiLCJwIiwiXyIsInRvTG93ZXIiLCJmb3JtYXRGaWx0ZXJTcGVjcyIsImZpbHRlclNwZWNzIiwiaXNBcnJheSIsImZpbHRlciIsImlzU3RyaW5nIiwic3RhcnRzV2l0aCIsIm1hcCIsIkxvZ2NhdCIsImNvbnN0cnVjdG9yIiwib3B0cyIsImFkYiIsImNsZWFyTG9ncyIsImNsZWFyRGV2aWNlTG9nc09uU3RhcnQiLCJkZWJ1ZyIsImRlYnVnVHJhY2UiLCJtYXhCdWZmZXJTaXplIiwibG9ncyIsImxvZ0lkeFNpbmNlTGFzdFJlcXVlc3QiLCJzdGFydENhcHR1cmUiLCJzdGFydGVkIiwiQiIsIl9yZXNvbHZlIiwiX3JlamVjdCIsInJlc29sdmUiLCJhcmdzIiwicmVqZWN0IiwiY2xlYXIiLCJjbWQiLCJkZWZhdWx0QXJncyIsInV0aWwiLCJxdW90ZSIsInBhdGgiLCJwcm9jIiwiU3ViUHJvY2VzcyIsIm9uIiwiY29kZSIsInNpZ25hbCIsImVycm9yIiwid2FybiIsImxpbmVzIiwibGluZSIsInRlc3QiLCJFcnJvciIsIm91dHB1dEhhbmRsZXIiLCJ0cmltIiwic3RhcnQiLCJzZXRUaW1lb3V0Iiwib3V0cHV0IiwicHJlZml4IiwibGVuZ3RoIiwic2hpZnQiLCJvdXRwdXRPYmoiLCJ0aW1lc3RhbXAiLCJEYXRlIiwibm93IiwibGV2ZWwiLCJtZXNzYWdlIiwicHVzaCIsImVtaXQiLCJpc1RyYWNlIiwic3RvcENhcHR1cmUiLCJpc1J1bm5pbmciLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJzdG9wIiwiZ2V0TG9ncyIsInJlc3VsdCIsInNsaWNlIiwiZ2V0QWxsTG9ncyIsImV4ZWMiLCJlcnIiLCJzdGRlcnIiXSwic291cmNlcyI6WyIuLi8uLi9saWIvbG9nY2F0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBsb2dnZXIsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGV2ZW50cyBmcm9tICdldmVudHMnO1xuY29uc3QgeyBFdmVudEVtaXR0ZXIgfSA9IGV2ZW50cztcbmltcG9ydCB7IFN1YlByb2Nlc3MsIGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuXG5jb25zdCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdMb2djYXQnKTtcbmNvbnN0IE1BWF9CVUZGRVJfU0laRSA9IDEwMDAwO1xuY29uc3QgTE9HQ0FUX1BST0NfU1RBUlRVUF9USU1FT1VUID0gMTAwMDA7XG5jb25zdCBTVVBQT1JURURfRk9STUFUUyA9IFsnYnJpZWYnLCAncHJvY2VzcycsICd0YWcnLCAndGhyZWFkJywgJ3JhdycsICd0aW1lJywgJ3RocmVhZHRpbWUnLCAnbG9uZyddO1xuY29uc3QgU1VQUE9SVEVEX1BSSU9SSVRJRVMgPSBbJ3YnLCAnZCcsICdpJywgJ3cnLCAnZScsICdmJywgJ3MnXTtcbmNvbnN0IERFRkFVTFRfUFJJT1JJVFkgPSAndic7XG5jb25zdCBERUZBVUxUX1RBRyA9ICcqJztcbmNvbnN0IERFRkFVTFRfRk9STUFUID0gJ3RocmVhZHRpbWUnO1xuXG5mdW5jdGlvbiByZXF1aXJlRm9ybWF0IChmb3JtYXQpIHtcbiAgaWYgKCFTVVBQT1JURURfRk9STUFUUy5pbmNsdWRlcyhmb3JtYXQpKSB7XG4gICAgbG9nLmluZm8oYFRoZSBmb3JtYXQgdmFsdWUgJyR7Zm9ybWF0fScgaXMgdW5rbm93bi4gU3VwcG9ydGVkIHZhbHVlcyBhcmU6ICR7U1VQUE9SVEVEX0ZPUk1BVFN9YCk7XG4gICAgbG9nLmluZm8oYERlZmF1bHRpbmcgdG8gJyR7REVGQVVMVF9GT1JNQVR9J2ApO1xuICAgIHJldHVybiBERUZBVUxUX0ZPUk1BVDtcbiAgfVxuICByZXR1cm4gZm9ybWF0O1xufVxuXG5mdW5jdGlvbiByZXF1aXJlU3BlYyAoc3BlYykge1xuICBjb25zdCBbdGFnLCBwcmlvcml0eV0gPSBzcGVjLnNwbGl0KCc6Jyk7XG4gIGxldCByZXN1bHRUYWcgPSB0YWc7XG4gIGlmICghcmVzdWx0VGFnKSB7XG4gICAgbG9nLmluZm8oYFRoZSB0YWcgdmFsdWUgaW4gc3BlYyAnJHtzcGVjfScgY2Fubm90IGJlIGVtcHR5YCk7XG4gICAgbG9nLmluZm8oYERlZmF1bHRpbmcgdG8gJyR7REVGQVVMVF9UQUd9J2ApO1xuICAgIHJlc3VsdFRhZyA9IERFRkFVTFRfVEFHO1xuICB9XG4gIGlmICghcHJpb3JpdHkpIHtcbiAgICBsb2cuaW5mbyhgVGhlIHByaW9yaXR5IHZhbHVlIGluIHNwZWMgJyR7c3BlY30nIGlzIGVtcHR5LiBEZWZhdWx0aW5nIHRvIFZlcmJvc2UgKCR7REVGQVVMVF9QUklPUklUWX0pYCk7XG4gICAgcmV0dXJuIGAke3Jlc3VsdFRhZ306JHtERUZBVUxUX1BSSU9SSVRZfWA7XG4gIH1cbiAgaWYgKCFTVVBQT1JURURfUFJJT1JJVElFUy5zb21lKChwKSA9PiBfLnRvTG93ZXIocHJpb3JpdHkpID09PSBfLnRvTG93ZXIocCkpKSB7XG4gICAgbG9nLmluZm8oYFRoZSBwcmlvcml0eSB2YWx1ZSBpbiBzcGVjICcke3NwZWN9JyBpcyB1bmtub3duLiBTdXBwb3J0ZWQgdmFsdWVzIGFyZTogJHtTVVBQT1JURURfUFJJT1JJVElFU31gKTtcbiAgICBsb2cuaW5mbyhgRGVmYXVsdGluZyB0byBWZXJib3NlICgke0RFRkFVTFRfUFJJT1JJVFl9KWApO1xuICAgIHJldHVybiBgJHtyZXN1bHRUYWd9OiR7REVGQVVMVF9QUklPUklUWX1gO1xuICB9XG4gIHJldHVybiBzcGVjO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRGaWx0ZXJTcGVjcyAoZmlsdGVyU3BlY3MpIHtcbiAgaWYgKCFfLmlzQXJyYXkoZmlsdGVyU3BlY3MpKSB7XG4gICAgZmlsdGVyU3BlY3MgPSBbZmlsdGVyU3BlY3NdO1xuICB9XG4gIHJldHVybiBmaWx0ZXJTcGVjc1xuICAgIC5maWx0ZXIoKHNwZWMpID0+IHNwZWMgJiYgXy5pc1N0cmluZyhzcGVjKSAmJiAhc3BlYy5zdGFydHNXaXRoKCctJykpXG4gICAgLm1hcCgoc3BlYykgPT4gc3BlYy5pbmNsdWRlcygnOicpID8gcmVxdWlyZVNwZWMoc3BlYykgOiBzcGVjKTtcbn1cblxuXG5jbGFzcyBMb2djYXQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkYiA9IG9wdHMuYWRiO1xuICAgIHRoaXMuY2xlYXJMb2dzID0gb3B0cy5jbGVhckRldmljZUxvZ3NPblN0YXJ0IHx8IGZhbHNlO1xuICAgIHRoaXMuZGVidWcgPSBvcHRzLmRlYnVnO1xuICAgIHRoaXMuZGVidWdUcmFjZSA9IG9wdHMuZGVidWdUcmFjZTtcbiAgICB0aGlzLm1heEJ1ZmZlclNpemUgPSBvcHRzLm1heEJ1ZmZlclNpemUgfHwgTUFYX0JVRkZFUl9TSVpFO1xuICAgIHRoaXMubG9ncyA9IFtdO1xuICAgIHRoaXMubG9nSWR4U2luY2VMYXN0UmVxdWVzdCA9IDA7XG4gIH1cblxuICBhc3luYyBzdGFydENhcHR1cmUgKG9wdHMgPSB7fSkge1xuICAgIGxldCBzdGFydGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBCKGFzeW5jIChfcmVzb2x2ZSwgX3JlamVjdCkgPT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByb21pc2UvcGFyYW0tbmFtZXNcbiAgICAgIGNvbnN0IHJlc29sdmUgPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgX3Jlc29sdmUoLi4uYXJncyk7XG4gICAgICB9O1xuICAgICAgY29uc3QgcmVqZWN0ID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIF9yZWplY3QoLi4uYXJncyk7XG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5jbGVhckxvZ3MpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jbGVhcigpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7XG4gICAgICAgIGZvcm1hdCA9IERFRkFVTFRfRk9STUFULFxuICAgICAgICBmaWx0ZXJTcGVjcyA9IFtdLFxuICAgICAgfSA9IG9wdHM7XG4gICAgICBjb25zdCBjbWQgPSBbXG4gICAgICAgIC4uLnRoaXMuYWRiLmRlZmF1bHRBcmdzLFxuICAgICAgICAnbG9nY2F0JyxcbiAgICAgICAgJy12JywgcmVxdWlyZUZvcm1hdChmb3JtYXQpLFxuICAgICAgICAuLi5mb3JtYXRGaWx0ZXJTcGVjcyhmaWx0ZXJTcGVjcyksXG4gICAgICBdO1xuICAgICAgbG9nLmRlYnVnKGBTdGFydGluZyBsb2dzIGNhcHR1cmUgd2l0aCBjb21tYW5kOiAke3V0aWwucXVvdGUoW3RoaXMuYWRiLnBhdGgsIC4uLmNtZF0pfWApO1xuICAgICAgdGhpcy5wcm9jID0gbmV3IFN1YlByb2Nlc3ModGhpcy5hZGIucGF0aCwgY21kKTtcbiAgICAgIHRoaXMucHJvYy5vbignZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgbG9nLmVycm9yKGBMb2djYXQgdGVybWluYXRlZCB3aXRoIGNvZGUgJHtjb2RlfSwgc2lnbmFsICR7c2lnbmFsfWApO1xuICAgICAgICB0aGlzLnByb2MgPSBudWxsO1xuICAgICAgICBpZiAoIXN0YXJ0ZWQpIHtcbiAgICAgICAgICBsb2cud2FybignTG9nY2F0IG5vdCBzdGFydGVkLiBDb250aW51aW5nJyk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMucHJvYy5vbignbGluZXMtc3RkZXJyJywgKGxpbmVzKSA9PiB7XG4gICAgICAgIGZvciAobGV0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgICBpZiAoL2V4ZWN2cFxcKFxcKS8udGVzdChsaW5lKSkge1xuICAgICAgICAgICAgbG9nLmVycm9yKCdMb2djYXQgcHJvY2VzcyBmYWlsZWQgdG8gc3RhcnQnKTtcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYExvZ2NhdCBwcm9jZXNzIGZhaWxlZCB0byBzdGFydC4gc3RkZXJyOiAke2xpbmV9YCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm91dHB1dEhhbmRsZXIoXy50cmltKGxpbmUpLCAnU1RERVJSOiAnKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucHJvYy5vbignbGluZXMtc3Rkb3V0JywgKGxpbmVzKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgZm9yIChsZXQgbGluZSBvZiBsaW5lcykge1xuICAgICAgICAgIHRoaXMub3V0cHV0SGFuZGxlcihfLnRyaW0obGluZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMucHJvYy5zdGFydCgwKTtcbiAgICAgIC8vIHJlc29sdmUgYWZ0ZXIgYSB0aW1lb3V0LCBldmVuIGlmIG5vIG91dHB1dCB3YXMgcmVjb3JkZWRcbiAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgTE9HQ0FUX1BST0NfU1RBUlRVUF9USU1FT1VUKTtcbiAgICB9KTtcbiAgfVxuXG4gIG91dHB1dEhhbmRsZXIgKG91dHB1dCwgcHJlZml4ID0gJycpIHtcbiAgICBpZiAoIW91dHB1dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxvZ3MubGVuZ3RoID49IHRoaXMubWF4QnVmZmVyU2l6ZSkge1xuICAgICAgdGhpcy5sb2dzLnNoaWZ0KCk7XG4gICAgICBpZiAodGhpcy5sb2dJZHhTaW5jZUxhc3RSZXF1ZXN0ID4gMCkge1xuICAgICAgICAtLXRoaXMubG9nSWR4U2luY2VMYXN0UmVxdWVzdDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0T2JqID0ge1xuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgbGV2ZWw6ICdBTEwnLFxuICAgICAgbWVzc2FnZTogb3V0cHV0LFxuICAgIH07XG4gICAgdGhpcy5sb2dzLnB1c2gob3V0cHV0T2JqKTtcbiAgICB0aGlzLmVtaXQoJ291dHB1dCcsIG91dHB1dE9iaik7XG4gICAgY29uc3QgaXNUcmFjZSA9IC9XXFwvVHJhY2UvLnRlc3Qob3V0cHV0KTtcbiAgICBpZiAodGhpcy5kZWJ1ZyAmJiAoIWlzVHJhY2UgfHwgdGhpcy5kZWJ1Z1RyYWNlKSkge1xuICAgICAgbG9nLmRlYnVnKHByZWZpeCArIG91dHB1dCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RvcENhcHR1cmUgKCkge1xuICAgIGxvZy5kZWJ1ZygnU3RvcHBpbmcgbG9nY2F0IGNhcHR1cmUnKTtcbiAgICBpZiAoIXRoaXMucHJvYyB8fCAhdGhpcy5wcm9jLmlzUnVubmluZykge1xuICAgICAgbG9nLmRlYnVnKCdMb2djYXQgYWxyZWFkeSBzdG9wcGVkJyk7XG4gICAgICB0aGlzLnByb2MgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnByb2MucmVtb3ZlQWxsTGlzdGVuZXJzKCdleGl0Jyk7XG4gICAgYXdhaXQgdGhpcy5wcm9jLnN0b3AoKTtcbiAgICB0aGlzLnByb2MgPSBudWxsO1xuICB9XG5cbiAgZ2V0TG9ncyAoKSB7XG4gICAgaWYgKHRoaXMubG9nSWR4U2luY2VMYXN0UmVxdWVzdCA8IHRoaXMubG9ncy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubG9ncy5zbGljZSh0aGlzLmxvZ0lkeFNpbmNlTGFzdFJlcXVlc3QpO1xuICAgICAgdGhpcy5sb2dJZHhTaW5jZUxhc3RSZXF1ZXN0ID0gdGhpcy5sb2dzLmxlbmd0aDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldEFsbExvZ3MgKCkge1xuICAgIHJldHVybiB0aGlzLmxvZ3M7XG4gIH1cblxuICBhc3luYyBjbGVhciAoKSB7XG4gICAgbG9nLmRlYnVnKCdDbGVhcmluZyBsb2djYXQgbG9ncyBmcm9tIGRldmljZScpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhcmdzID0gWy4uLnRoaXMuYWRiLmRlZmF1bHRBcmdzLCAnbG9nY2F0JywgJy1jJ107XG4gICAgICBhd2FpdCBleGVjKHRoaXMuYWRiLnBhdGgsIGFyZ3MpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLndhcm4oYEZhaWxlZCB0byBjbGVhciBsb2djYXQgbG9nczogJHtlcnIuc3RkZXJyIHx8IGVyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMb2djYXQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQURBLE1BQU07RUFBRUE7QUFBYSxDQUFDLEdBQUdDLGVBQU07QUFHL0IsTUFBTUMsR0FBRyxHQUFHQyxlQUFNLENBQUNDLFNBQVMsQ0FBQyxRQUFRLENBQUM7QUFDdEMsTUFBTUMsZUFBZSxHQUFHLEtBQUs7QUFDN0IsTUFBTUMsMkJBQTJCLEdBQUcsS0FBSztBQUN6QyxNQUFNQyxpQkFBaUIsR0FBRyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUM7QUFDcEcsTUFBTUMsb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFDaEUsTUFBTUMsZ0JBQWdCLEdBQUcsR0FBRztBQUM1QixNQUFNQyxXQUFXLEdBQUcsR0FBRztBQUN2QixNQUFNQyxjQUFjLEdBQUcsWUFBWTtBQUVuQyxTQUFTQyxhQUFhLENBQUVDLE1BQU0sRUFBRTtFQUM5QixJQUFJLENBQUNOLGlCQUFpQixDQUFDTyxRQUFRLENBQUNELE1BQU0sQ0FBQyxFQUFFO0lBQ3ZDWCxHQUFHLENBQUNhLElBQUksQ0FBRSxxQkFBb0JGLE1BQU8sdUNBQXNDTixpQkFBa0IsRUFBQyxDQUFDO0lBQy9GTCxHQUFHLENBQUNhLElBQUksQ0FBRSxrQkFBaUJKLGNBQWUsR0FBRSxDQUFDO0lBQzdDLE9BQU9BLGNBQWM7RUFDdkI7RUFDQSxPQUFPRSxNQUFNO0FBQ2Y7QUFFQSxTQUFTRyxXQUFXLENBQUVDLElBQUksRUFBRTtFQUMxQixNQUFNLENBQUNDLEdBQUcsRUFBRUMsUUFBUSxDQUFDLEdBQUdGLElBQUksQ0FBQ0csS0FBSyxDQUFDLEdBQUcsQ0FBQztFQUN2QyxJQUFJQyxTQUFTLEdBQUdILEdBQUc7RUFDbkIsSUFBSSxDQUFDRyxTQUFTLEVBQUU7SUFDZG5CLEdBQUcsQ0FBQ2EsSUFBSSxDQUFFLDBCQUF5QkUsSUFBSyxtQkFBa0IsQ0FBQztJQUMzRGYsR0FBRyxDQUFDYSxJQUFJLENBQUUsa0JBQWlCTCxXQUFZLEdBQUUsQ0FBQztJQUMxQ1csU0FBUyxHQUFHWCxXQUFXO0VBQ3pCO0VBQ0EsSUFBSSxDQUFDUyxRQUFRLEVBQUU7SUFDYmpCLEdBQUcsQ0FBQ2EsSUFBSSxDQUFFLCtCQUE4QkUsSUFBSyxzQ0FBcUNSLGdCQUFpQixHQUFFLENBQUM7SUFDdEcsT0FBUSxHQUFFWSxTQUFVLElBQUdaLGdCQUFpQixFQUFDO0VBQzNDO0VBQ0EsSUFBSSxDQUFDRCxvQkFBb0IsQ0FBQ2MsSUFBSSxDQUFFQyxDQUFDLElBQUtDLGVBQUMsQ0FBQ0MsT0FBTyxDQUFDTixRQUFRLENBQUMsS0FBS0ssZUFBQyxDQUFDQyxPQUFPLENBQUNGLENBQUMsQ0FBQyxDQUFDLEVBQUU7SUFDM0VyQixHQUFHLENBQUNhLElBQUksQ0FBRSwrQkFBOEJFLElBQUssdUNBQXNDVCxvQkFBcUIsRUFBQyxDQUFDO0lBQzFHTixHQUFHLENBQUNhLElBQUksQ0FBRSwwQkFBeUJOLGdCQUFpQixHQUFFLENBQUM7SUFDdkQsT0FBUSxHQUFFWSxTQUFVLElBQUdaLGdCQUFpQixFQUFDO0VBQzNDO0VBQ0EsT0FBT1EsSUFBSTtBQUNiO0FBRUEsU0FBU1MsaUJBQWlCLENBQUVDLFdBQVcsRUFBRTtFQUN2QyxJQUFJLENBQUNILGVBQUMsQ0FBQ0ksT0FBTyxDQUFDRCxXQUFXLENBQUMsRUFBRTtJQUMzQkEsV0FBVyxHQUFHLENBQUNBLFdBQVcsQ0FBQztFQUM3QjtFQUNBLE9BQU9BLFdBQVcsQ0FDZkUsTUFBTSxDQUFFWixJQUFJLElBQUtBLElBQUksSUFBSU8sZUFBQyxDQUFDTSxRQUFRLENBQUNiLElBQUksQ0FBQyxJQUFJLENBQUNBLElBQUksQ0FBQ2MsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQ25FQyxHQUFHLENBQUVmLElBQUksSUFBS0EsSUFBSSxDQUFDSCxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUdFLFdBQVcsQ0FBQ0MsSUFBSSxDQUFDLEdBQUdBLElBQUksQ0FBQztBQUNqRTtBQUdBLE1BQU1nQixNQUFNLFNBQVNqQyxZQUFZLENBQUM7RUFDaENrQyxXQUFXLENBQUVDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtJQUN0QixLQUFLLEVBQUU7SUFDUCxJQUFJLENBQUNDLEdBQUcsR0FBR0QsSUFBSSxDQUFDQyxHQUFHO0lBQ25CLElBQUksQ0FBQ0MsU0FBUyxHQUFHRixJQUFJLENBQUNHLHNCQUFzQixJQUFJLEtBQUs7SUFDckQsSUFBSSxDQUFDQyxLQUFLLEdBQUdKLElBQUksQ0FBQ0ksS0FBSztJQUN2QixJQUFJLENBQUNDLFVBQVUsR0FBR0wsSUFBSSxDQUFDSyxVQUFVO0lBQ2pDLElBQUksQ0FBQ0MsYUFBYSxHQUFHTixJQUFJLENBQUNNLGFBQWEsSUFBSXBDLGVBQWU7SUFDMUQsSUFBSSxDQUFDcUMsSUFBSSxHQUFHLEVBQUU7SUFDZCxJQUFJLENBQUNDLHNCQUFzQixHQUFHLENBQUM7RUFDakM7RUFFQSxNQUFNQyxZQUFZLENBQUVULElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtJQUM3QixJQUFJVSxPQUFPLEdBQUcsS0FBSztJQUNuQixPQUFPLE1BQU0sSUFBSUMsaUJBQUMsQ0FBQyxPQUFPQyxRQUFRLEVBQUVDLE9BQU8sS0FBSztNQUM5QyxNQUFNQyxPQUFPLEdBQUcsVUFBVSxHQUFHQyxJQUFJLEVBQUU7UUFDakNMLE9BQU8sR0FBRyxJQUFJO1FBQ2RFLFFBQVEsQ0FBQyxHQUFHRyxJQUFJLENBQUM7TUFDbkIsQ0FBQztNQUNELE1BQU1DLE1BQU0sR0FBRyxVQUFVLEdBQUdELElBQUksRUFBRTtRQUNoQ0wsT0FBTyxHQUFHLElBQUk7UUFDZEcsT0FBTyxDQUFDLEdBQUdFLElBQUksQ0FBQztNQUNsQixDQUFDO01BRUQsSUFBSSxJQUFJLENBQUNiLFNBQVMsRUFBRTtRQUNsQixNQUFNLElBQUksQ0FBQ2UsS0FBSyxFQUFFO01BQ3BCO01BRUEsTUFBTTtRQUNKdkMsTUFBTSxHQUFHRixjQUFjO1FBQ3ZCZ0IsV0FBVyxHQUFHO01BQ2hCLENBQUMsR0FBR1EsSUFBSTtNQUNSLE1BQU1rQixHQUFHLEdBQUcsQ0FDVixHQUFHLElBQUksQ0FBQ2pCLEdBQUcsQ0FBQ2tCLFdBQVcsRUFDdkIsUUFBUSxFQUNSLElBQUksRUFBRTFDLGFBQWEsQ0FBQ0MsTUFBTSxDQUFDLEVBQzNCLEdBQUdhLGlCQUFpQixDQUFDQyxXQUFXLENBQUMsQ0FDbEM7TUFDRHpCLEdBQUcsQ0FBQ3FDLEtBQUssQ0FBRSx1Q0FBc0NnQixhQUFJLENBQUNDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQ3BCLEdBQUcsQ0FBQ3FCLElBQUksRUFBRSxHQUFHSixHQUFHLENBQUMsQ0FBRSxFQUFDLENBQUM7TUFDdkYsSUFBSSxDQUFDSyxJQUFJLEdBQUcsSUFBSUMsd0JBQVUsQ0FBQyxJQUFJLENBQUN2QixHQUFHLENBQUNxQixJQUFJLEVBQUVKLEdBQUcsQ0FBQztNQUM5QyxJQUFJLENBQUNLLElBQUksQ0FBQ0UsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDQyxJQUFJLEVBQUVDLE1BQU0sS0FBSztRQUNyQzVELEdBQUcsQ0FBQzZELEtBQUssQ0FBRSwrQkFBOEJGLElBQUssWUFBV0MsTUFBTyxFQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDSixJQUFJLEdBQUcsSUFBSTtRQUNoQixJQUFJLENBQUNiLE9BQU8sRUFBRTtVQUNaM0MsR0FBRyxDQUFDOEQsSUFBSSxDQUFDLGdDQUFnQyxDQUFDO1VBQzFDZixPQUFPLEVBQUU7UUFDWDtNQUNGLENBQUMsQ0FBQztNQUNGLElBQUksQ0FBQ1MsSUFBSSxDQUFDRSxFQUFFLENBQUMsY0FBYyxFQUFHSyxLQUFLLElBQUs7UUFDdEMsS0FBSyxJQUFJQyxJQUFJLElBQUlELEtBQUssRUFBRTtVQUN0QixJQUFJLFlBQVksQ0FBQ0UsSUFBSSxDQUFDRCxJQUFJLENBQUMsRUFBRTtZQUMzQmhFLEdBQUcsQ0FBQzZELEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQztZQUMzQ1osTUFBTSxDQUFDLElBQUlpQixLQUFLLENBQUUsMkNBQTBDRixJQUFLLEVBQUMsQ0FBQyxDQUFDO1VBQ3RFO1VBQ0EsSUFBSSxDQUFDRyxhQUFhLENBQUM3QyxlQUFDLENBQUM4QyxJQUFJLENBQUNKLElBQUksQ0FBQyxFQUFFLFVBQVUsQ0FBQztRQUM5QztRQUNBakIsT0FBTyxFQUFFO01BQ1gsQ0FBQyxDQUFDO01BQ0YsSUFBSSxDQUFDUyxJQUFJLENBQUNFLEVBQUUsQ0FBQyxjQUFjLEVBQUdLLEtBQUssSUFBSztRQUN0Q2hCLE9BQU8sRUFBRTtRQUNULEtBQUssSUFBSWlCLElBQUksSUFBSUQsS0FBSyxFQUFFO1VBQ3RCLElBQUksQ0FBQ0ksYUFBYSxDQUFDN0MsZUFBQyxDQUFDOEMsSUFBSSxDQUFDSixJQUFJLENBQUMsQ0FBQztRQUNsQztNQUNGLENBQUMsQ0FBQztNQUNGLE1BQU0sSUFBSSxDQUFDUixJQUFJLENBQUNhLEtBQUssQ0FBQyxDQUFDLENBQUM7TUFFeEJDLFVBQVUsQ0FBQ3ZCLE9BQU8sRUFBRTNDLDJCQUEyQixDQUFDO0lBQ2xELENBQUMsQ0FBQztFQUNKO0VBRUErRCxhQUFhLENBQUVJLE1BQU0sRUFBRUMsTUFBTSxHQUFHLEVBQUUsRUFBRTtJQUNsQyxJQUFJLENBQUNELE1BQU0sRUFBRTtNQUNYO0lBQ0Y7SUFFQSxJQUFJLElBQUksQ0FBQy9CLElBQUksQ0FBQ2lDLE1BQU0sSUFBSSxJQUFJLENBQUNsQyxhQUFhLEVBQUU7TUFDMUMsSUFBSSxDQUFDQyxJQUFJLENBQUNrQyxLQUFLLEVBQUU7TUFDakIsSUFBSSxJQUFJLENBQUNqQyxzQkFBc0IsR0FBRyxDQUFDLEVBQUU7UUFDbkMsRUFBRSxJQUFJLENBQUNBLHNCQUFzQjtNQUMvQjtJQUNGO0lBQ0EsTUFBTWtDLFNBQVMsR0FBRztNQUNoQkMsU0FBUyxFQUFFQyxJQUFJLENBQUNDLEdBQUcsRUFBRTtNQUNyQkMsS0FBSyxFQUFFLEtBQUs7TUFDWkMsT0FBTyxFQUFFVDtJQUNYLENBQUM7SUFDRCxJQUFJLENBQUMvQixJQUFJLENBQUN5QyxJQUFJLENBQUNOLFNBQVMsQ0FBQztJQUN6QixJQUFJLENBQUNPLElBQUksQ0FBQyxRQUFRLEVBQUVQLFNBQVMsQ0FBQztJQUM5QixNQUFNUSxPQUFPLEdBQUcsVUFBVSxDQUFDbEIsSUFBSSxDQUFDTSxNQUFNLENBQUM7SUFDdkMsSUFBSSxJQUFJLENBQUNsQyxLQUFLLEtBQUssQ0FBQzhDLE9BQU8sSUFBSSxJQUFJLENBQUM3QyxVQUFVLENBQUMsRUFBRTtNQUMvQ3RDLEdBQUcsQ0FBQ3FDLEtBQUssQ0FBQ21DLE1BQU0sR0FBR0QsTUFBTSxDQUFDO0lBQzVCO0VBQ0Y7RUFFQSxNQUFNYSxXQUFXLEdBQUk7SUFDbkJwRixHQUFHLENBQUNxQyxLQUFLLENBQUMseUJBQXlCLENBQUM7SUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQ21CLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQ0EsSUFBSSxDQUFDNkIsU0FBUyxFQUFFO01BQ3RDckYsR0FBRyxDQUFDcUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDO01BQ25DLElBQUksQ0FBQ21CLElBQUksR0FBRyxJQUFJO01BQ2hCO0lBQ0Y7SUFDQSxJQUFJLENBQUNBLElBQUksQ0FBQzhCLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztJQUNwQyxNQUFNLElBQUksQ0FBQzlCLElBQUksQ0FBQytCLElBQUksRUFBRTtJQUN0QixJQUFJLENBQUMvQixJQUFJLEdBQUcsSUFBSTtFQUNsQjtFQUVBZ0MsT0FBTyxHQUFJO0lBQ1QsSUFBSSxJQUFJLENBQUMvQyxzQkFBc0IsR0FBRyxJQUFJLENBQUNELElBQUksQ0FBQ2lDLE1BQU0sRUFBRTtNQUNsRCxNQUFNZ0IsTUFBTSxHQUFHLElBQUksQ0FBQ2pELElBQUksQ0FBQ2tELEtBQUssQ0FBQyxJQUFJLENBQUNqRCxzQkFBc0IsQ0FBQztNQUMzRCxJQUFJLENBQUNBLHNCQUFzQixHQUFHLElBQUksQ0FBQ0QsSUFBSSxDQUFDaUMsTUFBTTtNQUM5QyxPQUFPZ0IsTUFBTTtJQUNmO0lBQ0EsT0FBTyxFQUFFO0VBQ1g7RUFFQUUsVUFBVSxHQUFJO0lBQ1osT0FBTyxJQUFJLENBQUNuRCxJQUFJO0VBQ2xCO0VBRUEsTUFBTVUsS0FBSyxHQUFJO0lBQ2JsRCxHQUFHLENBQUNxQyxLQUFLLENBQUMsa0NBQWtDLENBQUM7SUFDN0MsSUFBSTtNQUNGLE1BQU1XLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDZCxHQUFHLENBQUNrQixXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQztNQUN0RCxNQUFNLElBQUF3QyxrQkFBSSxFQUFDLElBQUksQ0FBQzFELEdBQUcsQ0FBQ3FCLElBQUksRUFBRVAsSUFBSSxDQUFDO0lBQ2pDLENBQUMsQ0FBQyxPQUFPNkMsR0FBRyxFQUFFO01BQ1o3RixHQUFHLENBQUM4RCxJQUFJLENBQUUsZ0NBQStCK0IsR0FBRyxDQUFDQyxNQUFNLElBQUlELEdBQUcsQ0FBQ2IsT0FBUSxFQUFDLENBQUM7SUFDdkU7RUFDRjtBQUNGO0FBQUMsZUFFY2pELE1BQU07QUFBQSJ9
|