appium-adb 9.10.2 → 9.10.3

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/README.md CHANGED
@@ -38,7 +38,7 @@ By default the functional tests use an avd named `NEXUS_S_18_X86`, with API Leve
38
38
  necessary to set `API_LEVEL` as it will be inferred.
39
39
 
40
40
  ```bash
41
- gulp e2e-test
41
+ npm run e2e-test
42
42
  ```
43
43
 
44
44
  ## Usage:
package/lib/helpers.js CHANGED
@@ -5,8 +5,8 @@ import _ from 'lodash';
5
5
  import B from 'bluebird';
6
6
  import semver from 'semver';
7
7
  import os from 'os';
8
+ import _fs from 'fs';
8
9
 
9
- const rootDir = path.resolve(__dirname, process.env.NO_PRECOMPILE ? '..' : '../..');
10
10
  const APKS_EXTENSION = '.apks';
11
11
  const APK_EXTENSION = '.apk';
12
12
  const APK_INSTALL_TIMEOUT = 60000;
@@ -15,6 +15,29 @@ const DEFAULT_ADB_EXEC_TIMEOUT = 20000; // in milliseconds
15
15
  const MAIN_ACTION = 'android.intent.action.MAIN';
16
16
  const LAUNCHER_CATEGORY = 'android.intent.category.LAUNCHER';
17
17
 
18
+ /**
19
+ * Calculates the path to the current module's root folder
20
+ *
21
+ * @returns {string} The full path to module root
22
+ * @throws {Error} If the current module root folder cannot be determined
23
+ */
24
+ const getModuleRoot = _.memoize(function getModuleRoot () {
25
+ const pathParts = path.resolve(__dirname).split(path.sep);
26
+ for (let pathItemIdx = pathParts.length; pathItemIdx > 0; --pathItemIdx) {
27
+ const currentDir = path.join(...(pathParts.slice(0, pathItemIdx)));
28
+ const manifestPath = path.join(currentDir, 'package.json');
29
+ try {
30
+ if (!_fs.existsSync(manifestPath)) {
31
+ continue;
32
+ }
33
+ if (JSON.parse(_fs.readFileSync(manifestPath, 'utf8')).name === 'appium-adb') {
34
+ return currentDir;
35
+ }
36
+ } catch (ign) {}
37
+ }
38
+ throw new Error('Cannot find the root folder of the appium-adb Node.js module');
39
+ });
40
+
18
41
  /**
19
42
  * Retrieves the actual path to SDK root folder from the system environment
20
43
  *
@@ -1029,11 +1052,11 @@ export {
1029
1052
  getAndroidPlatformAndPath, unzipFile,
1030
1053
  getIMEListFromOutput, getJavaForOs, isShowingLockscreen, isCurrentFocusOnKeyguard,
1031
1054
  getSurfaceOrientation, isScreenOnFully, buildStartCmd, getJavaHome,
1032
- rootDir, getSdkToolsVersion, getApksignerForOs, getBuildToolsDirs,
1055
+ getSdkToolsVersion, getApksignerForOs, getBuildToolsDirs,
1033
1056
  getApkanalyzerForOs, getOpenSslForOs, extractMatchingPermissions, APKS_EXTENSION,
1034
1057
  APK_INSTALL_TIMEOUT, APKS_INSTALL_TIMEOUT, buildInstallArgs, APK_EXTENSION,
1035
1058
  DEFAULT_ADB_EXEC_TIMEOUT, parseManifest, parseAaptStrings, parseAapt2Strings,
1036
1059
  formatConfigMarker, parseJsonData, unsignApk, toAvdLocaleArgs, requireSdkRoot,
1037
1060
  getSdkRootFromEnv, getAndroidPrefsRoot, dirExists, escapeShellArg,
1038
- parseLaunchableActivityNames, matchComponentName,
1061
+ parseLaunchableActivityNames, matchComponentName, getModuleRoot
1039
1062
  };
@@ -6,12 +6,11 @@ import log from '../logger.js';
6
6
  import { tempDir, system, mkdirp, fs, util } from '@appium/support';
7
7
  import LRU from 'lru-cache';
8
8
  import {
9
- getJavaForOs, getApksignerForOs, getJavaHome,
10
- rootDir, APKS_EXTENSION, unsignApk,
9
+ getJavaForOs, getApksignerForOs, getJavaHome, getModuleRoot, APKS_EXTENSION, unsignApk,
11
10
  } from '../helpers.js';
12
11
 
13
- const DEFAULT_PRIVATE_KEY = path.resolve(rootDir, 'keys', 'testkey.pk8');
14
- const DEFAULT_CERTIFICATE = path.resolve(rootDir, 'keys', 'testkey.x509.pem');
12
+ const DEFAULT_PRIVATE_KEY = path.resolve(getModuleRoot(), 'keys', 'testkey.pk8');
13
+ const DEFAULT_CERTIFICATE = path.resolve(getModuleRoot(), 'keys', 'testkey.x509.pem');
15
14
  const BUNDLETOOL_TUTORIAL = 'https://developer.android.com/studio/command-line/bundletool';
16
15
  const APKSIGNER_VERIFY_FAIL = 'DOES NOT VERIFY';
17
16
  const SHA1 = 'sha1';
package/package.json CHANGED
@@ -1,41 +1,47 @@
1
1
  {
2
2
  "name": "appium-adb",
3
- "version": "9.10.2",
3
+ "version": "9.10.3",
4
4
  "description": "Android Debug Bridge interface",
5
5
  "main": "./build/index.js",
6
6
  "scripts": {
7
- "clean": "rm -rf node_modules && rm -f package-lock.json && npm install",
8
- "prepare": "gulp prepublish",
9
- "test": "gulp once",
10
- "watch": "gulp watch",
11
- "build": "gulp transpile",
12
- "mocha": "mocha",
13
- "e2e-test": "gulp transpile && npm run mocha -- -t 600000 --recursive build/test/functional/",
14
- "coverage": "gulp coveralls",
7
+ "build": "rm -rf build && babel --out-dir=build/lib lib && babel --out-dir=build index.js",
8
+ "dev": "npm run build -- --watch",
9
+ "lint": "eslint .",
10
+ "lint:fix": "npm run lint -- --fix",
11
+ "precommit-lint": "lint-staged",
15
12
  "precommit-msg": "echo 'Pre-commit checks...' && exit 0",
16
- "precommit-test": "REPORTER=dot gulp once",
17
- "lint": "gulp lint",
18
- "lint:fix": "gulp eslint --fix"
13
+ "test": "mocha --exit --timeout 1m \"./test/unit/**/*-specs.js\"",
14
+ "e2e-test": "mocha --exit --timeout 5m \"./test/functional/**/*-specs.js\""
19
15
  },
20
16
  "repository": {
21
17
  "type": "git",
22
18
  "url": "https://github.com/appium/appium-adb.git"
23
19
  },
24
- "author": "",
20
+ "author": "Appium Contributors",
25
21
  "license": "Apache-2.0",
26
22
  "bugs": {
27
23
  "url": "https://github.com/appium/appium-adb/issues"
28
24
  },
29
- "engines": [
30
- "node"
31
- ],
25
+ "engines": {
26
+ "node": ">=14",
27
+ "npm": ">=8"
28
+ },
32
29
  "bin": {},
33
30
  "directories": {
34
31
  "lib": "lib"
35
32
  },
33
+ "lint-staged": {
34
+ "*.js": [
35
+ "eslint --fix"
36
+ ]
37
+ },
38
+ "prettier": {
39
+ "bracketSpacing": false,
40
+ "printWidth": 100,
41
+ "singleQuote": true
42
+ },
36
43
  "files": [
37
44
  "index.js",
38
- "jars",
39
45
  "keys",
40
46
  "lib",
41
47
  "build/index.js",
@@ -54,28 +60,35 @@
54
60
  "lru-cache": "^7.3.0",
55
61
  "semver": "^7.0.0",
56
62
  "source-map-support": "^0.x",
57
- "teen_process": "^1.11.0",
63
+ "teen_process": "^2.0.1",
58
64
  "utf7": "^1.0.2"
59
65
  },
60
66
  "pre-commit": [
61
67
  "precommit-msg",
62
- "precommit-test"
68
+ "precommit-lint"
63
69
  ],
64
70
  "devDependencies": {
65
- "@appium/gulp-plugins": "^7.0.0",
66
71
  "@appium/eslint-config-appium": "^6.0.0",
67
- "@appium/test-support": "^1.0.0",
68
- "@babel/core": "^7.16.0",
69
- "@babel/eslint-parser": "^7.16.3",
72
+ "@appium/test-support": "^1.5.0",
73
+ "@babel/cli": "^7.18.10",
74
+ "@babel/core": "^7.18.10",
75
+ "@babel/eslint-parser": "^7.18.9",
76
+ "@babel/plugin-transform-runtime": "^7.18.10",
77
+ "@babel/preset-env": "^7.18.10",
78
+ "@babel/register": "^7.18.9",
70
79
  "@semantic-release/git": "^10.0.1",
80
+ "babel-plugin-source-map-support": "^2.2.0",
71
81
  "chai": "^4.1.0",
72
82
  "chai-as-promised": "^7.1.1",
83
+ "eslint": "^7.32.0",
73
84
  "eslint-config-prettier": "^8.5.0",
74
- "gulp": "^4.0.0",
85
+ "eslint-plugin-import": "^2.26.0",
86
+ "eslint-plugin-mocha": "^9.0.0",
87
+ "eslint-plugin-promise": "^6.0.0",
88
+ "lint-staged": "^13.0.3",
75
89
  "mocha": "^10.0.0",
76
- "mocha-junit-reporter": "^2.0.0",
77
- "mocha-multi-reporters": "^1.1.7",
78
90
  "pre-commit": "^1.1.3",
91
+ "prettier": "^2.7.1",
79
92
  "semantic-release": "^19.0.2",
80
93
  "sinon": "^14.0.0",
81
94
  "temp": "^0.x"
package/build/index.js DELETED
@@ -1,30 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.getSdkRootFromEnv = exports.getAndroidBinaryPath = exports.default = exports.DEFAULT_ADB_PORT = exports.ADB = void 0;
7
-
8
- require("source-map-support/register");
9
-
10
- var adb = _interopRequireWildcard(require("./lib/adb"));
11
-
12
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
13
-
14
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
15
-
16
- const {
17
- ADB,
18
- DEFAULT_ADB_PORT,
19
- getAndroidBinaryPath,
20
- getSdkRootFromEnv
21
- } = adb;
22
- exports.getSdkRootFromEnv = getSdkRootFromEnv;
23
- exports.getAndroidBinaryPath = getAndroidBinaryPath;
24
- exports.DEFAULT_ADB_PORT = DEFAULT_ADB_PORT;
25
- exports.ADB = ADB;
26
- var _default = ADB;
27
- exports.default = _default;require('source-map-support').install();
28
-
29
-
30
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJBREIiLCJERUZBVUxUX0FEQl9QT1JUIiwiZ2V0QW5kcm9pZEJpbmFyeVBhdGgiLCJnZXRTZGtSb290RnJvbUVudiIsImFkYiJdLCJzb3VyY2VSb290IjoiLi4iLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptYWluXG5cbmltcG9ydCAqIGFzIGFkYiBmcm9tICcuL2xpYi9hZGInO1xuXG5jb25zdCB7XG4gIEFEQixcbiAgREVGQVVMVF9BREJfUE9SVCxcbiAgZ2V0QW5kcm9pZEJpbmFyeVBhdGgsXG4gIGdldFNka1Jvb3RGcm9tRW52XG59ID0gYWRiO1xuXG5leHBvcnQgZGVmYXVsdCBBREI7XG5leHBvcnQgeyBBREIsIERFRkFVTFRfQURCX1BPUlQsIGdldEFuZHJvaWRCaW5hcnlQYXRoLCBnZXRTZGtSb290RnJvbUVudiB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFFQTs7Ozs7O0FBRUEsTUFBTTtFQUNKQSxHQURJO0VBRUpDLGdCQUZJO0VBR0pDLG9CQUhJO0VBSUpDO0FBSkksSUFLRkMsR0FMSjs7Ozs7ZUFPZUosRyJ9
package/build/lib/adb.js DELETED
@@ -1,132 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.default = exports.DEFAULT_ADB_PORT = exports.ADB = void 0;
9
- Object.defineProperty(exports, "getAndroidBinaryPath", {
10
- enumerable: true,
11
- get: function () {
12
- return _index.getAndroidBinaryPath;
13
- }
14
- });
15
- Object.defineProperty(exports, "getSdkRootFromEnv", {
16
- enumerable: true,
17
- get: function () {
18
- return _helpers.getSdkRootFromEnv;
19
- }
20
- });
21
-
22
- require("source-map-support/register");
23
-
24
- var _lodash = _interopRequireDefault(require("lodash"));
25
-
26
- var _os = _interopRequireDefault(require("os"));
27
-
28
- var _index = _interopRequireWildcard(require("./tools/index.js"));
29
-
30
- var _helpers = require("./helpers");
31
-
32
- var _logger = _interopRequireDefault(require("./logger.js"));
33
-
34
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
35
-
36
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
37
-
38
- const DEFAULT_ADB_PORT = 5037;
39
- exports.DEFAULT_ADB_PORT = DEFAULT_ADB_PORT;
40
- const DEFAULT_OPTS = {
41
- sdkRoot: (0, _helpers.getSdkRootFromEnv)() || null,
42
- udid: null,
43
- appDeviceReadyTimeout: null,
44
- useKeystore: null,
45
- keystorePath: null,
46
- keystorePassword: null,
47
- keyAlias: null,
48
- keyPassword: null,
49
- executable: {
50
- path: 'adb',
51
- defaultArgs: []
52
- },
53
- tmpDir: _os.default.tmpdir(),
54
- curDeviceId: null,
55
- emulatorPort: null,
56
- logcat: null,
57
- binaries: {},
58
- instrumentProc: null,
59
- suppressKillServer: null,
60
- jars: {},
61
- adbPort: DEFAULT_ADB_PORT,
62
- adbHost: null,
63
- adbExecTimeout: _helpers.DEFAULT_ADB_EXEC_TIMEOUT,
64
- remoteAppsCacheLimit: 10,
65
- buildToolsVersion: null,
66
- allowOfflineDevices: false,
67
- allowDelayAdb: true
68
- };
69
-
70
- class ADB {
71
- constructor(opts = {}) {
72
- Object.assign(this, opts);
73
-
74
- _lodash.default.defaultsDeep(this, _lodash.default.cloneDeep(DEFAULT_OPTS));
75
-
76
- if (opts.remoteAdbHost) {
77
- this.executable.defaultArgs.push('-H', opts.remoteAdbHost);
78
- this.adbHost = opts.remoteAdbHost;
79
- }
80
-
81
- if (opts.remoteAdbPort) {
82
- this.adbPort = opts.remoteAdbPort;
83
- }
84
-
85
- this.executable.defaultArgs.push('-P', this.adbPort);
86
- }
87
-
88
- clone(opts = {}) {
89
- const originalOptions = _lodash.default.cloneDeep(_lodash.default.pick(this, Object.keys(DEFAULT_OPTS)));
90
-
91
- const cloneOptions = _lodash.default.defaultsDeep(opts, originalOptions);
92
-
93
- const defaultArgs = cloneOptions.executable.defaultArgs;
94
-
95
- if (cloneOptions.remoteAdbHost && defaultArgs.includes('-H')) {
96
- defaultArgs.splice(defaultArgs.indexOf('-H'), 2);
97
- }
98
-
99
- if (defaultArgs.includes('-P')) {
100
- defaultArgs.splice(defaultArgs.indexOf('-P'), 2);
101
- }
102
-
103
- return new ADB(cloneOptions);
104
- }
105
-
106
- }
107
-
108
- exports.ADB = ADB;
109
-
110
- ADB.createADB = async function createADB(opts) {
111
- const adb = new ADB(opts);
112
- adb.sdkRoot = await (0, _helpers.requireSdkRoot)(adb.sdkRoot);
113
- await adb.getAdbWithCorrectAdbPath();
114
-
115
- try {
116
- await adb.adbExec(['start-server']);
117
- } catch (e) {
118
- _logger.default.warn(e.stderr || e.message);
119
- }
120
-
121
- return adb;
122
- };
123
-
124
- for (const [fnName, fn] of _lodash.default.toPairs(_index.default)) {
125
- ADB.prototype[fnName] = fn;
126
- }
127
-
128
- var _default = ADB;
129
- exports.default = _default;require('source-map-support').install();
130
-
131
-
132
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2FkYi5qcyIsIm5hbWVzIjpbIkRFRkFVTFRfQURCX1BPUlQiLCJERUZBVUxUX09QVFMiLCJzZGtSb290IiwiZ2V0U2RrUm9vdEZyb21FbnYiLCJ1ZGlkIiwiYXBwRGV2aWNlUmVhZHlUaW1lb3V0IiwidXNlS2V5c3RvcmUiLCJrZXlzdG9yZVBhdGgiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5QWxpYXMiLCJrZXlQYXNzd29yZCIsImV4ZWN1dGFibGUiLCJwYXRoIiwiZGVmYXVsdEFyZ3MiLCJ0bXBEaXIiLCJvcyIsInRtcGRpciIsImN1ckRldmljZUlkIiwiZW11bGF0b3JQb3J0IiwibG9nY2F0IiwiYmluYXJpZXMiLCJpbnN0cnVtZW50UHJvYyIsInN1cHByZXNzS2lsbFNlcnZlciIsImphcnMiLCJhZGJQb3J0IiwiYWRiSG9zdCIsImFkYkV4ZWNUaW1lb3V0IiwiREVGQVVMVF9BREJfRVhFQ19USU1FT1VUIiwicmVtb3RlQXBwc0NhY2hlTGltaXQiLCJidWlsZFRvb2xzVmVyc2lvbiIsImFsbG93T2ZmbGluZURldmljZXMiLCJhbGxvd0RlbGF5QWRiIiwiQURCIiwiY29uc3RydWN0b3IiLCJvcHRzIiwiT2JqZWN0IiwiYXNzaWduIiwiXyIsImRlZmF1bHRzRGVlcCIsImNsb25lRGVlcCIsInJlbW90ZUFkYkhvc3QiLCJwdXNoIiwicmVtb3RlQWRiUG9ydCIsImNsb25lIiwib3JpZ2luYWxPcHRpb25zIiwicGljayIsImtleXMiLCJjbG9uZU9wdGlvbnMiLCJpbmNsdWRlcyIsInNwbGljZSIsImluZGV4T2YiLCJjcmVhdGVBREIiLCJhZGIiLCJyZXF1aXJlU2RrUm9vdCIsImdldEFkYldpdGhDb3JyZWN0QWRiUGF0aCIsImFkYkV4ZWMiLCJlIiwibG9nIiwid2FybiIsInN0ZGVyciIsIm1lc3NhZ2UiLCJmbk5hbWUiLCJmbiIsInRvUGFpcnMiLCJtZXRob2RzIiwicHJvdG90eXBlIl0sInNvdXJjZVJvb3QiOiIuLi8uLiIsInNvdXJjZXMiOlsibGliL2FkYi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBtZXRob2RzLCB7IGdldEFuZHJvaWRCaW5hcnlQYXRoIH0gZnJvbSAnLi90b29scy9pbmRleC5qcyc7XG5pbXBvcnQge1xuICBERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQsIHJlcXVpcmVTZGtSb290LCBnZXRTZGtSb290RnJvbUVudlxufSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlci5qcyc7XG5cbmNvbnN0IERFRkFVTFRfQURCX1BPUlQgPSA1MDM3O1xuY29uc3QgREVGQVVMVF9PUFRTID0ge1xuICBzZGtSb290OiBnZXRTZGtSb290RnJvbUVudigpIHx8IG51bGwsXG4gIHVkaWQ6IG51bGwsXG4gIGFwcERldmljZVJlYWR5VGltZW91dDogbnVsbCxcbiAgdXNlS2V5c3RvcmU6IG51bGwsXG4gIGtleXN0b3JlUGF0aDogbnVsbCxcbiAga2V5c3RvcmVQYXNzd29yZDogbnVsbCxcbiAga2V5QWxpYXM6IG51bGwsXG4gIGtleVBhc3N3b3JkOiBudWxsLFxuICBleGVjdXRhYmxlOiB7cGF0aDogJ2FkYicsIGRlZmF1bHRBcmdzOiBbXX0sXG4gIHRtcERpcjogb3MudG1wZGlyKCksXG4gIGN1ckRldmljZUlkOiBudWxsLFxuICBlbXVsYXRvclBvcnQ6IG51bGwsXG4gIGxvZ2NhdDogbnVsbCxcbiAgYmluYXJpZXM6IHt9LFxuICBpbnN0cnVtZW50UHJvYzogbnVsbCxcbiAgc3VwcHJlc3NLaWxsU2VydmVyOiBudWxsLFxuICBqYXJzOiB7fSxcbiAgYWRiUG9ydDogREVGQVVMVF9BREJfUE9SVCxcbiAgYWRiSG9zdDogbnVsbCxcbiAgYWRiRXhlY1RpbWVvdXQ6IERFRkFVTFRfQURCX0VYRUNfVElNRU9VVCxcbiAgcmVtb3RlQXBwc0NhY2hlTGltaXQ6IDEwLFxuICBidWlsZFRvb2xzVmVyc2lvbjogbnVsbCxcbiAgYWxsb3dPZmZsaW5lRGV2aWNlczogZmFsc2UsXG4gIGFsbG93RGVsYXlBZGI6IHRydWUsXG59O1xuXG5jbGFzcyBBREIge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9KSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBvcHRzKTtcbiAgICBfLmRlZmF1bHRzRGVlcCh0aGlzLCBfLmNsb25lRGVlcChERUZBVUxUX09QVFMpKTtcblxuICAgIGlmIChvcHRzLnJlbW90ZUFkYkhvc3QpIHtcbiAgICAgIHRoaXMuZXhlY3V0YWJsZS5kZWZhdWx0QXJncy5wdXNoKCctSCcsIG9wdHMucmVtb3RlQWRiSG9zdCk7XG4gICAgICB0aGlzLmFkYkhvc3QgPSBvcHRzLnJlbW90ZUFkYkhvc3Q7XG4gICAgfVxuICAgIC8vIFRPRE8gZmlndXJlIG91dCB3aHkgd2UgaGF2ZSB0aGlzIG9wdGlvbiBhcyBpdCBkb2VzIG5vdCBhcHBlYXIgdG8gYmVcbiAgICAvLyB1c2VkIGFueXdoZXJlLiBQcm9iYWJseSBkZXByZWNhdGUgaW4gZmF2b3Igb2Ygc2ltcGxlIG9wdHMuYWRiUG9ydFxuICAgIGlmIChvcHRzLnJlbW90ZUFkYlBvcnQpIHtcbiAgICAgIHRoaXMuYWRiUG9ydCA9IG9wdHMucmVtb3RlQWRiUG9ydDtcbiAgICB9XG4gICAgdGhpcy5leGVjdXRhYmxlLmRlZmF1bHRBcmdzLnB1c2goJy1QJywgdGhpcy5hZGJQb3J0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYEFEQmAgdGhhdCBpbmhlcml0cyBjb25maWd1cmF0aW9uIGZyb20gdGhpcyBgQURCYCBpbnN0YW5jZS5cbiAgICogVGhpcyBhdm9pZHMgdGhlIG5lZWQgdG8gY2FsbCBgQURCLmNyZWF0ZUFEQigpYCBtdWx0aXBsZSB0aW1lcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdHMgLSBBZGRpdGlvbmFsIG9wdGlvbnMgbWFwcGluZyB0byBwYXNzIHRvIHRoZSBgQURCYCBjb25zdHJ1Y3Rvci5cbiAgICogQHJldHVybnMge0FEQn0gVGhlIHJlc3VsdGluZyBjbGFzcyBpbnN0YW5jZS5cbiAgICovXG4gIGNsb25lIChvcHRzID0ge30pIHtcbiAgICBjb25zdCBvcmlnaW5hbE9wdGlvbnMgPSBfLmNsb25lRGVlcChfLnBpY2sodGhpcywgT2JqZWN0LmtleXMoREVGQVVMVF9PUFRTKSkpO1xuICAgIGNvbnN0IGNsb25lT3B0aW9ucyA9IF8uZGVmYXVsdHNEZWVwKG9wdHMsIG9yaWdpbmFsT3B0aW9ucyk7XG5cbiAgICAvLyBSZXNldCBkZWZhdWx0IGFyZ3VtZW50cyBjcmVhdGVkIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAvLyBXaXRob3V0IHRoaXMgY29kZSwgLUggYW5kIC1QIGNhbiBiZSBpbmplY3RlZCBpbnRvIGRlZmF1bHRBcmdzIG11bHRpcGxlIHRpbWVzLlxuICAgIGNvbnN0IGRlZmF1bHRBcmdzID0gY2xvbmVPcHRpb25zLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3M7XG4gICAgaWYgKGNsb25lT3B0aW9ucy5yZW1vdGVBZGJIb3N0ICYmIGRlZmF1bHRBcmdzLmluY2x1ZGVzKCctSCcpKSB7XG4gICAgICBkZWZhdWx0QXJncy5zcGxpY2UoZGVmYXVsdEFyZ3MuaW5kZXhPZignLUgnKSwgMik7XG4gICAgfVxuICAgIGlmIChkZWZhdWx0QXJncy5pbmNsdWRlcygnLVAnKSkge1xuICAgICAgZGVmYXVsdEFyZ3Muc3BsaWNlKGRlZmF1bHRBcmdzLmluZGV4T2YoJy1QJyksIDIpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQURCKGNsb25lT3B0aW9ucyk7XG4gIH1cbn1cblxuQURCLmNyZWF0ZUFEQiA9IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFEQiAob3B0cykge1xuICBjb25zdCBhZGIgPSBuZXcgQURCKG9wdHMpO1xuICBhZGIuc2RrUm9vdCA9IGF3YWl0IHJlcXVpcmVTZGtSb290KGFkYi5zZGtSb290KTtcbiAgYXdhaXQgYWRiLmdldEFkYldpdGhDb3JyZWN0QWRiUGF0aCgpO1xuICB0cnkge1xuICAgIGF3YWl0IGFkYi5hZGJFeGVjKFsnc3RhcnQtc2VydmVyJ10pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLndhcm4oZS5zdGRlcnIgfHwgZS5tZXNzYWdlKTtcbiAgfVxuICByZXR1cm4gYWRiO1xufTtcblxuLy8gYWRkIGFsbCB0aGUgbWV0aG9kcyB0byB0aGUgQURCIHByb3RvdHlwZVxuZm9yIChjb25zdCBbZm5OYW1lLCBmbl0gb2YgXy50b1BhaXJzKG1ldGhvZHMpKSB7XG4gIEFEQi5wcm90b3R5cGVbZm5OYW1lXSA9IGZuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBBREI7XG5leHBvcnQgeyBBREIsIERFRkFVTFRfQURCX1BPUlQsIGdldEFuZHJvaWRCaW5hcnlQYXRoLCBnZXRTZGtSb290RnJvbUVudiB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUdBOzs7Ozs7QUFFQSxNQUFNQSxnQkFBZ0IsR0FBRyxJQUF6Qjs7QUFDQSxNQUFNQyxZQUFZLEdBQUc7RUFDbkJDLE9BQU8sRUFBRSxJQUFBQywwQkFBQSxPQUF1QixJQURiO0VBRW5CQyxJQUFJLEVBQUUsSUFGYTtFQUduQkMscUJBQXFCLEVBQUUsSUFISjtFQUluQkMsV0FBVyxFQUFFLElBSk07RUFLbkJDLFlBQVksRUFBRSxJQUxLO0VBTW5CQyxnQkFBZ0IsRUFBRSxJQU5DO0VBT25CQyxRQUFRLEVBQUUsSUFQUztFQVFuQkMsV0FBVyxFQUFFLElBUk07RUFTbkJDLFVBQVUsRUFBRTtJQUFDQyxJQUFJLEVBQUUsS0FBUDtJQUFjQyxXQUFXLEVBQUU7RUFBM0IsQ0FUTztFQVVuQkMsTUFBTSxFQUFFQyxXQUFBLENBQUdDLE1BQUgsRUFWVztFQVduQkMsV0FBVyxFQUFFLElBWE07RUFZbkJDLFlBQVksRUFBRSxJQVpLO0VBYW5CQyxNQUFNLEVBQUUsSUFiVztFQWNuQkMsUUFBUSxFQUFFLEVBZFM7RUFlbkJDLGNBQWMsRUFBRSxJQWZHO0VBZ0JuQkMsa0JBQWtCLEVBQUUsSUFoQkQ7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