appium-xcode 4.0.5 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -29
- package/build/index.js +43 -33
- package/build/lib/helpers.js +72 -0
- package/build/lib/xcode.js +104 -197
- package/index.js +19 -15
- package/lib/helpers.js +72 -0
- package/lib/xcode.js +130 -263
- package/package.json +1 -1
- package/build/lib/xcode.js.map +0 -1
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@ appium-xcode
|
|
|
6
6
|
[](https://github.com/appium/appium-xcode/actions/workflows/publish.js.yml)
|
|
7
7
|
|
|
8
8
|
ES7 module for interacting with Xcode and Xcode-related functions.
|
|
9
|
-
Used by [Appium](github.com/appium/appium)
|
|
9
|
+
Used by various [Appium](github.com/appium/appium) drivers.
|
|
10
10
|
|
|
11
11
|
API
|
|
12
12
|
===
|
|
@@ -17,50 +17,28 @@ Most functions are memoized, so after they are called once, they will simply ret
|
|
|
17
17
|
|
|
18
18
|
Some functions have an auto-retry built into them, they will retry silently a number of times. This is because the Xcode commands sometimes just flake and return bad values (or don't return).
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
### getPath()
|
|
20
|
+
### getPath([timeout=15000])
|
|
23
21
|
*memoized*
|
|
24
22
|
|
|
25
|
-
gets path to Xcode
|
|
23
|
+
gets path to Xcode Developer root.
|
|
26
24
|
|
|
27
|
-
### getVersion([
|
|
25
|
+
### getVersion([parse=false], [retries], [timeout])
|
|
28
26
|
*memoized*, *retry*
|
|
29
27
|
|
|
30
|
-
returns the version of Xcode
|
|
31
|
-
|
|
32
|
-
### getAutomationTraceTemplatePath([num_retries])
|
|
33
|
-
*memoized, *retry*
|
|
34
|
-
|
|
35
|
-
returns a path to the default AutomationTraceTemplate
|
|
36
|
-
|
|
37
|
-
### getAutomationTraceTemplatePathWithoutRetry()
|
|
38
|
-
|
|
39
|
-
same as `getAutomationTraceTemplatePath()` but without retry or memoization.
|
|
28
|
+
returns the version of Xcode formatted as a string, for example `6.3.1`, or a version object if `parse` is `true`
|
|
40
29
|
|
|
41
30
|
### getMaxIOSSDK([num_retries])
|
|
42
31
|
*memoized*, *retry*
|
|
43
32
|
|
|
44
|
-
returns
|
|
33
|
+
returns the highest IOS SDK version supported by Xcode.
|
|
45
34
|
eg: `'8.3'`
|
|
46
35
|
|
|
47
|
-
### getMaxIOSSDKWithoutRetry()
|
|
48
|
-
|
|
49
|
-
same as `getMaxIOSDK()` but without retry or memoization
|
|
50
|
-
|
|
51
36
|
### getMaxTVOSSDK([num_retries])
|
|
52
37
|
*memoized*, *retry*
|
|
53
38
|
|
|
54
|
-
returns
|
|
39
|
+
returns highest tvOS SDK version supported by Xcode.
|
|
55
40
|
eg: `'10.1'`
|
|
56
41
|
|
|
57
|
-
### getMaxTVOSSDKWithoutRetry()
|
|
58
|
-
|
|
59
|
-
same as `getMaxTVOSSDK()` but without retry or memoization
|
|
60
|
-
|
|
61
|
-
### clearInternalCache()
|
|
62
|
-
clears the internal cache used for memoizing functions.
|
|
63
|
-
|
|
64
42
|
Develop
|
|
65
43
|
=======
|
|
66
44
|
|
package/build/index.js
CHANGED
|
@@ -3,39 +3,49 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
Object.defineProperty(exports, "getClangVersion", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function () {
|
|
10
|
+
return _xcode.getClangVersion;
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
Object.defineProperty(exports, "getMaxIOSSDK", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: function () {
|
|
16
|
+
return _xcode.getMaxIOSSDK;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports, "getMaxTVOSSDK", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: function () {
|
|
22
|
+
return _xcode.getMaxTVOSSDK;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
Object.defineProperty(exports, "getPath", {
|
|
26
|
+
enumerable: true,
|
|
27
|
+
get: function () {
|
|
28
|
+
return _xcode.getPath;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
Object.defineProperty(exports, "getVersion", {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
get: function () {
|
|
34
|
+
return _xcode.getVersion;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
|
|
7
38
|
require("source-map-support/register");
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const {
|
|
12
|
-
getPath,
|
|
13
|
-
getVersion,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
getConnectedDevices,
|
|
19
|
-
clearInternalCache,
|
|
20
|
-
getInstrumentsPath,
|
|
21
|
-
getCommandLineToolsVersion,
|
|
22
|
-
getMaxTVOSSDK,
|
|
23
|
-
getMaxTVOSSDKWithoutRetry,
|
|
24
|
-
getClangVersion
|
|
25
|
-
} = xcode;
|
|
26
|
-
exports.getClangVersion = getClangVersion;
|
|
27
|
-
exports.getMaxTVOSSDKWithoutRetry = getMaxTVOSSDKWithoutRetry;
|
|
28
|
-
exports.getMaxTVOSSDK = getMaxTVOSSDK;
|
|
29
|
-
exports.getCommandLineToolsVersion = getCommandLineToolsVersion;
|
|
30
|
-
exports.getInstrumentsPath = getInstrumentsPath;
|
|
31
|
-
exports.clearInternalCache = clearInternalCache;
|
|
32
|
-
exports.getConnectedDevices = getConnectedDevices;
|
|
33
|
-
exports.getMaxIOSSDKWithoutRetry = getMaxIOSSDKWithoutRetry;
|
|
34
|
-
exports.getAutomationTraceTemplatePathWithoutRetry = getAutomationTraceTemplatePathWithoutRetry;
|
|
35
|
-
exports.getMaxIOSSDK = getMaxIOSSDK;
|
|
36
|
-
exports.getAutomationTraceTemplatePath = getAutomationTraceTemplatePath;
|
|
37
|
-
exports.getVersion = getVersion;
|
|
38
|
-
exports.getPath = getPath;
|
|
39
|
+
|
|
40
|
+
var _xcode = require("./lib/xcode");
|
|
41
|
+
|
|
42
|
+
const xcode = {
|
|
43
|
+
getPath: _xcode.getPath,
|
|
44
|
+
getVersion: _xcode.getVersion,
|
|
45
|
+
getMaxIOSSDK: _xcode.getMaxIOSSDK,
|
|
46
|
+
getMaxTVOSSDK: _xcode.getMaxTVOSSDK,
|
|
47
|
+
getClangVersion: _xcode.getClangVersion
|
|
48
|
+
};
|
|
39
49
|
var _default = xcode;
|
|
40
50
|
exports.default = _default;
|
|
41
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ4Y29kZSIsImdldFBhdGgiLCJnZXRWZXJzaW9uIiwiZ2V0TWF4SU9TU0RLIiwiZ2V0TWF4VFZPU1NESyIsImdldENsYW5nVmVyc2lvbiJdLCJzb3VyY2VzIjpbIi4uL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptYWluXG5pbXBvcnQge1xuICBnZXRQYXRoLFxuICBnZXRWZXJzaW9uLFxuICBnZXRNYXhJT1NTREssXG4gIGdldE1heFRWT1NTREssXG4gIGdldENsYW5nVmVyc2lvbixcbn0gZnJvbSAnLi9saWIveGNvZGUnO1xuXG5jb25zdCB4Y29kZSA9IHtcbiAgZ2V0UGF0aCxcbiAgZ2V0VmVyc2lvbixcbiAgZ2V0TWF4SU9TU0RLLFxuICBnZXRNYXhUVk9TU0RLLFxuICBnZXRDbGFuZ1ZlcnNpb25cbn07XG5cbmV4cG9ydCB7XG4gIGdldFBhdGgsXG4gIGdldFZlcnNpb24sXG4gIGdldE1heElPU1NESyxcbiAgZ2V0TWF4VFZPU1NESyxcbiAgZ2V0Q2xhbmdWZXJzaW9uXG59O1xuZXhwb3J0IGRlZmF1bHQgeGNvZGU7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBOztBQVFBLE1BQU1BLEtBQUssR0FBRztFQUNaQyxPQUFPLEVBQVBBLGNBRFk7RUFFWkMsVUFBVSxFQUFWQSxpQkFGWTtFQUdaQyxZQUFZLEVBQVpBLG1CQUhZO0VBSVpDLGFBQWEsRUFBYkEsb0JBSlk7RUFLWkMsZUFBZSxFQUFmQTtBQUxZLENBQWQ7ZUFlZUwsSyJ9
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.XCRUN_TIMEOUT = void 0;
|
|
9
|
+
exports.findAppPaths = findAppPaths;
|
|
10
|
+
exports.readXcodePlist = readXcodePlist;
|
|
11
|
+
exports.runXcrunCommand = runXcrunCommand;
|
|
12
|
+
|
|
13
|
+
require("source-map-support/register");
|
|
14
|
+
|
|
15
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
16
|
+
|
|
17
|
+
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
18
|
+
|
|
19
|
+
var _teen_process = require("teen_process");
|
|
20
|
+
|
|
21
|
+
var _support = require("@appium/support");
|
|
22
|
+
|
|
23
|
+
var _path = _interopRequireDefault(require("path"));
|
|
24
|
+
|
|
25
|
+
const XCRUN_TIMEOUT = 15000;
|
|
26
|
+
exports.XCRUN_TIMEOUT = XCRUN_TIMEOUT;
|
|
27
|
+
|
|
28
|
+
async function runXcrunCommand(args, timeout = XCRUN_TIMEOUT) {
|
|
29
|
+
try {
|
|
30
|
+
return await (0, _teen_process.exec)('xcrun', args, {
|
|
31
|
+
timeout
|
|
32
|
+
});
|
|
33
|
+
} catch (err) {
|
|
34
|
+
if (err.stderr) {
|
|
35
|
+
err.message = `${err.message}: ${err.stderr}`;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
throw err;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async function findAppPaths(bundleId) {
|
|
43
|
+
let stdout;
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
({
|
|
47
|
+
stdout
|
|
48
|
+
} = await (0, _teen_process.exec)('/usr/bin/mdfind', [`kMDItemCFBundleIdentifier=${bundleId}`]));
|
|
49
|
+
} catch (e) {
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const matchedPaths = _lodash.default.trim(stdout).split('\n').map(_lodash.default.trim).filter(Boolean);
|
|
54
|
+
|
|
55
|
+
if (_lodash.default.isEmpty(matchedPaths)) {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const results = matchedPaths.map(p => (async () => {
|
|
60
|
+
if (await _support.fs.exists(p)) {
|
|
61
|
+
return p;
|
|
62
|
+
}
|
|
63
|
+
})());
|
|
64
|
+
return (await _bluebird.default.all(results)).filter(Boolean);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async function readXcodePlist(developerRoot) {
|
|
68
|
+
const plistPath = _path.default.resolve(developerRoot, '..', 'Info.plist');
|
|
69
|
+
|
|
70
|
+
return (await _support.fs.exists(plistPath)) ? await _support.plist.parsePlistFile(plistPath) : {};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJYQ1JVTl9USU1FT1VUIiwicnVuWGNydW5Db21tYW5kIiwiYXJncyIsInRpbWVvdXQiLCJleGVjIiwiZXJyIiwic3RkZXJyIiwibWVzc2FnZSIsImZpbmRBcHBQYXRocyIsImJ1bmRsZUlkIiwic3Rkb3V0IiwiZSIsIm1hdGNoZWRQYXRocyIsIl8iLCJ0cmltIiwic3BsaXQiLCJtYXAiLCJmaWx0ZXIiLCJCb29sZWFuIiwiaXNFbXB0eSIsInJlc3VsdHMiLCJwIiwiZnMiLCJleGlzdHMiLCJCIiwiYWxsIiwicmVhZFhjb2RlUGxpc3QiLCJkZXZlbG9wZXJSb290IiwicGxpc3RQYXRoIiwicGF0aCIsInJlc29sdmUiLCJwbGlzdCIsInBhcnNlUGxpc3RGaWxlIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2hlbHBlcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZnMsIHBsaXN0IH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5leHBvcnQgY29uc3QgWENSVU5fVElNRU9VVCA9IDE1MDAwO1xuXG4vKipcbiAqIEV4ZWN1dGVzICd4Y3J1bicgY29tbWFuZCBsaW5lIHV0aWxpdHlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzIHhjcnVuIGFyZ3VtZW50c1xuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgWzE1MDAwXSBUaGUgbWF4aW11bSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgeGNydW4gZXhpc3RzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJ0ZWVuX3Byb2Nlc3NcIikuRXhlY1Jlc3VsdD59IFRoZSByZXN1bHQgb2YgeGNydW4gZXhlY3V0aW9uXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgeGNydW4gcmV0dXJuZWQgbm9uLXplcm8gZXhpdCBjb2RlIG9yIHRpbWVkIG91dFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuWGNydW5Db21tYW5kIChhcmdzLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBleGVjKCd4Y3J1bicsIGFyZ3MsIHt0aW1lb3V0fSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIHRoZSB0cnVlIGVycm9yIGNhbiBiZSBoaWRkZW4gd2l0aGluIHRoZSBzdGRlcnJcbiAgICBpZiAoZXJyLnN0ZGVycikge1xuICAgICAgZXJyLm1lc3NhZ2UgPSBgJHtlcnIubWVzc2FnZX06ICR7ZXJyLnN0ZGVycn1gO1xuICAgIH1cblxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG4vKipcbiAqIFVzZXMgbWFjT1MgU3BvdGxpZ2h0IHNlcnZpY2UgdG8gZGV0ZWN0IHdoZXJlIHRoZSBnaXZlbiBhcHAgaXMgaW5zdGFsbGVkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJ1bmRsZUlkIEJ1bmRsZSBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgYXBwXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IEZ1bGwgcGF0aHMgdG8gd2hlcmUgdGhlIGFwcCB3aXRoIHRoZSBnaXZlbiBidW5kbGUgaWQgaXMgcHJlc2VudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRBcHBQYXRocyAoYnVuZGxlSWQpIHtcbiAgbGV0IHN0ZG91dDtcbiAgdHJ5IHtcbiAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKCcvdXNyL2Jpbi9tZGZpbmQnLCBbXG4gICAgICBga01ESXRlbUNGQnVuZGxlSWRlbnRpZmllcj0ke2J1bmRsZUlkfWBcbiAgICBdKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBtYXRjaGVkUGF0aHMgPSBfLnRyaW0oc3Rkb3V0KVxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKF8udHJpbSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICBpZiAoXy5pc0VtcHR5KG1hdGNoZWRQYXRocykpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgcmVzdWx0cyA9IG1hdGNoZWRQYXRocy5tYXAoKHApID0+IChhc3luYyAoKSA9PiB7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhwKSkge1xuICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICB9KSgpKTtcbiAgcmV0dXJuIChhd2FpdCBCLmFsbChyZXN1bHRzKSkuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG4vKipcbiAqIEZpbmRzIGFuZCByZXRyaWV2ZXMgdGhlIGNvbnRlbnQgb2YgdGhlIFhjb2RlJ3MgSW5mby5wbGlzdCBmaWxlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRldmVsb3BlclJvb3QgRnVsbCBwYXRoIHRvIHRoZSBDb250ZW50cy9EZXZlbG9wZXIgZm9sZGVyIHVuZGVyIFhjb2RlLmFwcCByb290XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fSBBbGwgcGxpc3QgZW50cmllcyBhcyBhbiBvYmplY3Qgb3IgYW4gZW1wdHkgb2JqZWN0IGlmIG5vIHBsaXN0IHdhcyBmb3VuZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFhjb2RlUGxpc3QgKGRldmVsb3BlclJvb3QpIHtcbiAgY29uc3QgcGxpc3RQYXRoID0gcGF0aC5yZXNvbHZlKGRldmVsb3BlclJvb3QsICcuLicsICdJbmZvLnBsaXN0Jyk7XG4gIHJldHVybiBhd2FpdCBmcy5leGlzdHMocGxpc3RQYXRoKVxuICAgID8gYXdhaXQgcGxpc3QucGFyc2VQbGlzdEZpbGUocGxpc3RQYXRoKVxuICAgIDoge307XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRU8sTUFBTUEsYUFBYSxHQUFHLEtBQXRCOzs7QUFVQSxlQUFlQyxlQUFmLENBQWdDQyxJQUFoQyxFQUFzQ0MsT0FBTyxHQUFHSCxhQUFoRCxFQUErRDtFQUNwRSxJQUFJO0lBQ0YsT0FBTyxNQUFNLElBQUFJLGtCQUFBLEVBQUssT0FBTCxFQUFjRixJQUFkLEVBQW9CO01BQUNDO0lBQUQsQ0FBcEIsQ0FBYjtFQUNELENBRkQsQ0FFRSxPQUFPRSxHQUFQLEVBQVk7SUFFWixJQUFJQSxHQUFHLENBQUNDLE1BQVIsRUFBZ0I7TUFDZEQsR0FBRyxDQUFDRSxPQUFKLEdBQWUsR0FBRUYsR0FBRyxDQUFDRSxPQUFRLEtBQUlGLEdBQUcsQ0FBQ0MsTUFBTyxFQUE1QztJQUNEOztJQUVELE1BQU1ELEdBQU47RUFDRDtBQUNGOztBQVFNLGVBQWVHLFlBQWYsQ0FBNkJDLFFBQTdCLEVBQXVDO0VBQzVDLElBQUlDLE1BQUo7O0VBQ0EsSUFBSTtJQUNGLENBQUM7TUFBQ0E7SUFBRCxJQUFXLE1BQU0sSUFBQU4sa0JBQUEsRUFBSyxpQkFBTCxFQUF3QixDQUN2Qyw2QkFBNEJLLFFBQVMsRUFERSxDQUF4QixDQUFsQjtFQUdELENBSkQsQ0FJRSxPQUFPRSxDQUFQLEVBQVU7SUFDVixPQUFPLEVBQVA7RUFDRDs7RUFFRCxNQUFNQyxZQUFZLEdBQUdDLGVBQUEsQ0FBRUMsSUFBRixDQUFPSixNQUFQLEVBQ2xCSyxLQURrQixDQUNaLElBRFksRUFFbEJDLEdBRmtCLENBRWRILGVBQUEsQ0FBRUMsSUFGWSxFQUdsQkcsTUFIa0IsQ0FHWEMsT0FIVyxDQUFyQjs7RUFJQSxJQUFJTCxlQUFBLENBQUVNLE9BQUYsQ0FBVVAsWUFBVixDQUFKLEVBQTZCO0lBQzNCLE9BQU8sRUFBUDtFQUNEOztFQUNELE1BQU1RLE9BQU8sR0FBR1IsWUFBWSxDQUFDSSxHQUFiLENBQWtCSyxDQUFELElBQU8sQ0FBQyxZQUFZO0lBQ25ELElBQUksTUFBTUMsV0FBQSxDQUFHQyxNQUFILENBQVVGLENBQVYsQ0FBVixFQUF3QjtNQUN0QixPQUFPQSxDQUFQO0lBQ0Q7RUFDRixDQUp1QyxHQUF4QixDQUFoQjtFQUtBLE9BQU8sQ0FBQyxNQUFNRyxpQkFBQSxDQUFFQyxHQUFGLENBQU1MLE9BQU4sQ0FBUCxFQUF1QkgsTUFBdkIsQ0FBOEJDLE9BQTlCLENBQVA7QUFDRDs7QUFRTSxlQUFlUSxjQUFmLENBQStCQyxhQUEvQixFQUE4QztFQUNuRCxNQUFNQyxTQUFTLEdBQUdDLGFBQUEsQ0FBS0MsT0FBTCxDQUFhSCxhQUFiLEVBQTRCLElBQTVCLEVBQWtDLFlBQWxDLENBQWxCOztFQUNBLE9BQU8sT0FBTUwsV0FBQSxDQUFHQyxNQUFILENBQVVLLFNBQVYsQ0FBTixJQUNILE1BQU1HLGNBQUEsQ0FBTUMsY0FBTixDQUFxQkosU0FBckIsQ0FESCxHQUVILEVBRko7QUFHRCJ9
|