appium-uiautomator2-driver 2.26.1 → 2.26.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.
@@ -1,18 +1,35 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports.default = void 0;
7
8
  require("source-map-support/register");
8
9
  var _cssSelectorParser = require("css-selector-parser");
9
- var _lodash = require("lodash");
10
+ var _lodash = _interopRequireDefault(require("lodash"));
10
11
  var _driver = require("appium/driver");
11
- const parser = new _cssSelectorParser.CssSelectorParser();
12
- parser.registerSelectorPseudos('has');
13
- parser.registerNestingOperators('>', '+', '~');
14
- parser.registerAttrEqualityMods('^', '$', '*', '~');
15
- parser.enableSubstitutes();
12
+ var _logger = _interopRequireDefault(require("./logger"));
13
+ const parseCssSelector = (0, _cssSelectorParser.createParser)({
14
+ syntax: {
15
+ pseudoClasses: {
16
+ unknown: 'accept',
17
+ definitions: {
18
+ Selector: ['has']
19
+ }
20
+ },
21
+ combinators: ['>', '+', '~'],
22
+ attributes: {
23
+ operators: ['^=', '$=', '*=', '~=', '=']
24
+ },
25
+ ids: true,
26
+ classNames: true,
27
+ tag: {
28
+ wildcard: true
29
+ }
30
+ },
31
+ substitutes: true
32
+ });
16
33
  const RESOURCE_ID = 'resource-id';
17
34
  const ID_LOCATOR_PATTERN = /^[a-zA-Z_][a-zA-Z0-9._]*:id\/[\S]+$/;
18
35
  const BOOLEAN_ATTRS = ['checkable', 'checked', 'clickable', 'enabled', 'focusable', 'focused', 'long-clickable', 'scrollable', 'selected'];
@@ -28,16 +45,16 @@ function toSnakeCase(str) {
28
45
  const out = tokens.join('');
29
46
  return out.charAt(0).toLowerCase() + out.slice(1);
30
47
  }
31
- function assertGetBool(css) {
32
- var _css$value;
33
- const val = ((_css$value = css.value) === null || _css$value === void 0 ? void 0 : _css$value.toLowerCase()) || 'true';
48
+ function requireBoolean(css) {
49
+ var _ref;
50
+ const val = _lodash.default.toLower((_ref = css.value ?? css.argument) === null || _ref === void 0 ? void 0 : _ref.value) || 'true';
34
51
  if (['true', 'false'].includes(val)) {
35
52
  return val;
36
53
  }
37
54
  throw new Error(`'${css.name}' must be true, false or empty. Found '${css.value}'`);
38
55
  }
39
- function assertGetAttrName(css) {
40
- const attrName = css.name.toLowerCase();
56
+ function requireEntityName(cssEntity) {
57
+ const attrName = cssEntity.name.toLowerCase();
41
58
  if (ALL_ATTRS.includes(attrName)) {
42
59
  return attrName.toLowerCase();
43
60
  }
@@ -49,7 +66,7 @@ function assertGetAttrName(css) {
49
66
  throw new Error(`'${attrName}' is not a valid attribute. ` + `Supported attributes are '${ALL_ATTRS.join(', ')}'`);
50
67
  }
51
68
  function getWordMatcherRegex(word) {
52
- return `\\b(\\w*${(0, _lodash.escapeRegExp)(word)}\\w*)\\b`;
69
+ return `\\b(\\w*${_lodash.default.escapeRegExp(word)}\\w*)\\b`;
53
70
  }
54
71
  class CssConverter {
55
72
  constructor(selector, pkg) {
@@ -60,18 +77,20 @@ class CssConverter {
60
77
  return ID_LOCATOR_PATTERN.test(locator) ? locator : `${this.pkg || 'android'}:id/${locator}`;
61
78
  }
62
79
  parseAttr(cssAttr) {
63
- if (cssAttr.valueType && cssAttr.valueType !== 'string') {
64
- throw new Error(`'${cssAttr.name}=${cssAttr.value}' is an invalid attribute. ` + `Only 'string' and empty attribute types are supported. Found '${cssAttr.valueType}'`);
80
+ var _cssAttr$value;
81
+ const attrValue = (_cssAttr$value = cssAttr.value) === null || _cssAttr$value === void 0 ? void 0 : _cssAttr$value.value;
82
+ if (!_lodash.default.isString(attrValue) && !_lodash.default.isEmpty(attrValue)) {
83
+ throw new Error(`'${cssAttr.name}=${attrValue}' is an invalid attribute. ` + `Only 'string' and empty attribute types are supported. Found '${attrValue}'`);
65
84
  }
66
- const attrName = assertGetAttrName(cssAttr);
85
+ const attrName = requireEntityName(cssAttr);
67
86
  const methodName = toSnakeCase(attrName);
68
87
  if (!STR_ATTRS.includes(attrName) && !BOOLEAN_ATTRS.includes(attrName)) {
69
88
  throw new Error(`'${attrName}' is not supported. Supported attributes are ` + `'${[...STR_ATTRS, ...BOOLEAN_ATTRS].join(', ')}'`);
70
89
  }
71
90
  if (BOOLEAN_ATTRS.includes(attrName)) {
72
- return `.${methodName}(${assertGetBool(cssAttr)})`;
91
+ return `.${methodName}(${requireBoolean(cssAttr)})`;
73
92
  }
74
- let value = cssAttr.value || '';
93
+ let value = attrValue || '';
75
94
  if (attrName === RESOURCE_ID) {
76
95
  value = this.formatIdLocator(value);
77
96
  }
@@ -85,14 +104,14 @@ class CssConverter {
85
104
  if (['description', 'text'].includes(attrName)) {
86
105
  return `.${methodName}Contains("${value}")`;
87
106
  }
88
- return `.${methodName}Matches("${(0, _lodash.escapeRegExp)(value)}")`;
107
+ return `.${methodName}Matches("${_lodash.default.escapeRegExp(value)}")`;
89
108
  case '^=':
90
109
  if (['description', 'text'].includes(attrName)) {
91
110
  return `.${methodName}StartsWith("${value}")`;
92
111
  }
93
- return `.${methodName}Matches("^${(0, _lodash.escapeRegExp)(value)}")`;
112
+ return `.${methodName}Matches("^${_lodash.default.escapeRegExp(value)}")`;
94
113
  case '$=':
95
- return `.${methodName}Matches("${(0, _lodash.escapeRegExp)(value)}$")`;
114
+ return `.${methodName}Matches("${_lodash.default.escapeRegExp(value)}$")`;
96
115
  case '~=':
97
116
  return `.${methodName}Matches("${getWordMatcherRegex(value)}")`;
98
117
  default:
@@ -100,82 +119,82 @@ class CssConverter {
100
119
  }
101
120
  }
102
121
  parsePseudo(cssPseudo) {
103
- if (cssPseudo.valueType && cssPseudo.valueType !== 'string') {
104
- throw new Error(`'${cssPseudo.name}=${cssPseudo.value}'. ` + `Unsupported css pseudo class value type: '${cssPseudo.valueType}'. Only 'string' type or empty is supported.`);
122
+ var _cssPseudo$argument;
123
+ const argValue = (_cssPseudo$argument = cssPseudo.argument) === null || _cssPseudo$argument === void 0 ? void 0 : _cssPseudo$argument.value;
124
+ if (!_lodash.default.isString(argValue) && !_lodash.default.isEmpty(argValue)) {
125
+ throw new Error(`'${cssPseudo.name}=${argValue}'. ` + `Unsupported css pseudo class value: '${argValue}'. Only 'string' type or empty is supported.`);
105
126
  }
106
- const pseudoName = assertGetAttrName(cssPseudo);
127
+ const pseudoName = requireEntityName(cssPseudo);
107
128
  if (BOOLEAN_ATTRS.includes(pseudoName)) {
108
- return `.${toSnakeCase(pseudoName)}(${assertGetBool(cssPseudo)})`;
129
+ return `.${toSnakeCase(pseudoName)}(${requireBoolean(cssPseudo)})`;
109
130
  }
110
131
  if (NUMERIC_ATTRS.includes(pseudoName)) {
111
- return `.${pseudoName}(${cssPseudo.value})`;
132
+ return `.${pseudoName}(${argValue})`;
112
133
  }
113
134
  }
114
135
  parseCssRule(cssRule) {
115
- const {
116
- nestingOperator
117
- } = cssRule;
118
- if (nestingOperator && nestingOperator !== ' ') {
119
- throw new Error(`'${nestingOperator}' is not a supported combinator. ` + `Only child combinator (>) and descendant combinator are supported.`);
136
+ var _cssRule$tag;
137
+ if (cssRule.combinator && ![' ', '>'].includes(cssRule.combinator)) {
138
+ throw new Error(`'${cssRule.combinator}' is not a supported combinator. ` + `Only child combinator (>) and descendant combinator are supported.`);
120
139
  }
121
140
  let uiAutomatorSelector = 'new UiSelector()';
122
- if (cssRule.tagName && cssRule.tagName !== '*') {
123
- let androidClass = [cssRule.tagName];
141
+ const tagName = (_cssRule$tag = cssRule.tag) === null || _cssRule$tag === void 0 ? void 0 : _cssRule$tag.name;
142
+ if (tagName && tagName !== '*') {
143
+ let androidClass = [tagName];
124
144
  if (cssRule.classNames) {
125
145
  for (const cssClassNames of cssRule.classNames) {
126
146
  androidClass.push(cssClassNames);
127
147
  }
128
148
  uiAutomatorSelector += `.className("${androidClass.join('.')}")`;
129
149
  } else {
130
- uiAutomatorSelector += `.classNameMatches("${cssRule.tagName}")`;
150
+ uiAutomatorSelector += `.classNameMatches("${tagName}")`;
131
151
  }
132
- } else if (cssRule.classNames) {
152
+ } else if (!_lodash.default.isEmpty(cssRule.classNames)) {
133
153
  uiAutomatorSelector += `.classNameMatches("${cssRule.classNames.join('\\.')}")`;
134
154
  }
135
- if (cssRule.id) {
136
- uiAutomatorSelector += `.resourceId("${this.formatIdLocator(cssRule.id)}")`;
155
+ if (!_lodash.default.isEmpty(cssRule.ids)) {
156
+ uiAutomatorSelector += `.resourceId("${this.formatIdLocator(cssRule.ids[0])}")`;
137
157
  }
138
- if (cssRule.attrs) {
139
- for (const attr of cssRule.attrs) {
158
+ if (cssRule.attributes) {
159
+ for (const attr of cssRule.attributes) {
140
160
  uiAutomatorSelector += this.parseAttr(attr);
141
161
  }
142
162
  }
143
- if (cssRule.pseudos) {
144
- for (const pseudo of cssRule.pseudos) {
145
- uiAutomatorSelector += this.parsePseudo(pseudo);
163
+ if (cssRule.pseudoClasses) {
164
+ for (const pseudo of cssRule.pseudoClasses) {
165
+ const sel = this.parsePseudo(pseudo);
166
+ if (sel) {
167
+ uiAutomatorSelector += sel;
168
+ }
146
169
  }
147
170
  }
148
- if (cssRule.rule) {
149
- uiAutomatorSelector += `.childSelector(${this.parseCssRule(cssRule.rule)})`;
171
+ if (cssRule.nestedRule) {
172
+ uiAutomatorSelector += `.childSelector(${this.parseCssRule(cssRule.nestedRule)})`;
150
173
  }
151
174
  return uiAutomatorSelector;
152
175
  }
153
176
  parseCssObject(css) {
154
- switch (css.type) {
155
- case 'rule':
156
- return this.parseCssRule(css);
157
- case 'ruleSet':
158
- return this.parseCssObject(css.rule);
159
- case 'selectors':
160
- return css.selectors.map(selector => this.parseCssObject(selector)).join('; ');
161
- default:
162
- throw new Error(`UiAutomator does not support '${css.type}' css. Only supports 'rule', 'ruleSet', 'selectors' `);
177
+ if (!_lodash.default.isEmpty(css.rules)) {
178
+ return this.parseCssRule(css.rules[0]);
163
179
  }
180
+ throw new Error('No rules could be parsed out of the current selector');
164
181
  }
165
182
  toUiAutomatorSelector() {
166
183
  let cssObj;
167
184
  try {
168
- cssObj = parser.parse(this.selector);
185
+ cssObj = parseCssSelector(this.selector);
169
186
  } catch (e) {
170
- throw new _driver.errors.InvalidSelectorError(`Invalid CSS selector '${this.selector}'. Reason: '${e}'`);
187
+ _logger.default.debug(e.stack);
188
+ throw new _driver.errors.InvalidSelectorError(`Invalid CSS selector '${this.selector}'. Reason: '${e.message}'`);
171
189
  }
172
190
  try {
173
191
  return this.parseCssObject(cssObj);
174
192
  } catch (e) {
175
- throw new _driver.errors.InvalidSelectorError(`Unsupported CSS selector '${this.selector}'. Reason: '${e}'`);
193
+ _logger.default.debug(e.stack);
194
+ throw new _driver.errors.InvalidSelectorError(`Unsupported CSS selector '${this.selector}'. Reason: '${e.message}'`);
176
195
  }
177
196
  }
178
197
  }
179
198
  var _default = CssConverter;
180
199
  exports.default = _default;
181
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY3NzU2VsZWN0b3JQYXJzZXIiLCJyZXF1aXJlIiwiX2xvZGFzaCIsIl9kcml2ZXIiLCJwYXJzZXIiLCJDc3NTZWxlY3RvclBhcnNlciIsInJlZ2lzdGVyU2VsZWN0b3JQc2V1ZG9zIiwicmVnaXN0ZXJOZXN0aW5nT3BlcmF0b3JzIiwicmVnaXN0ZXJBdHRyRXF1YWxpdHlNb2RzIiwiZW5hYmxlU3Vic3RpdHV0ZXMiLCJSRVNPVVJDRV9JRCIsIklEX0xPQ0FUT1JfUEFUVEVSTiIsIkJPT0xFQU5fQVRUUlMiLCJOVU1FUklDX0FUVFJTIiwiU1RSX0FUVFJTIiwiQUxMX0FUVFJTIiwiQVRUUklCVVRFX0FMSUFTRVMiLCJ0b1NuYWtlQ2FzZSIsInN0ciIsInRva2VucyIsInNwbGl0IiwibWFwIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJzbGljZSIsInRvTG93ZXJDYXNlIiwib3V0Iiwiam9pbiIsImFzc2VydEdldEJvb2wiLCJjc3MiLCJfY3NzJHZhbHVlIiwidmFsIiwidmFsdWUiLCJpbmNsdWRlcyIsIkVycm9yIiwibmFtZSIsImFzc2VydEdldEF0dHJOYW1lIiwiYXR0ck5hbWUiLCJvZmZpY2lhbEF0dHIiLCJhbGlhc0F0dHJzIiwiZ2V0V29yZE1hdGNoZXJSZWdleCIsIndvcmQiLCJlc2NhcGVSZWdFeHAiLCJDc3NDb252ZXJ0ZXIiLCJjb25zdHJ1Y3RvciIsInNlbGVjdG9yIiwicGtnIiwiZm9ybWF0SWRMb2NhdG9yIiwibG9jYXRvciIsInRlc3QiLCJwYXJzZUF0dHIiLCJjc3NBdHRyIiwidmFsdWVUeXBlIiwibWV0aG9kTmFtZSIsIm9wZXJhdG9yIiwicGFyc2VQc2V1ZG8iLCJjc3NQc2V1ZG8iLCJwc2V1ZG9OYW1lIiwicGFyc2VDc3NSdWxlIiwiY3NzUnVsZSIsIm5lc3RpbmdPcGVyYXRvciIsInVpQXV0b21hdG9yU2VsZWN0b3IiLCJ0YWdOYW1lIiwiYW5kcm9pZENsYXNzIiwiY2xhc3NOYW1lcyIsImNzc0NsYXNzTmFtZXMiLCJwdXNoIiwiaWQiLCJhdHRycyIsImF0dHIiLCJwc2V1ZG9zIiwicHNldWRvIiwicnVsZSIsInBhcnNlQ3NzT2JqZWN0IiwidHlwZSIsInNlbGVjdG9ycyIsInRvVWlBdXRvbWF0b3JTZWxlY3RvciIsImNzc09iaiIsInBhcnNlIiwiZSIsImVycm9ycyIsIkludmFsaWRTZWxlY3RvckVycm9yIiwiX2RlZmF1bHQiLCJleHBvcnRzIiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9jc3MtY29udmVydGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENzc1NlbGVjdG9yUGFyc2VyIH0gZnJvbSAnY3NzLXNlbGVjdG9yLXBhcnNlcic7XG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmNvbnN0IHBhcnNlciA9IG5ldyBDc3NTZWxlY3RvclBhcnNlcigpO1xucGFyc2VyLnJlZ2lzdGVyU2VsZWN0b3JQc2V1ZG9zKCdoYXMnKTtcbnBhcnNlci5yZWdpc3Rlck5lc3RpbmdPcGVyYXRvcnMoJz4nLCAnKycsICd+Jyk7XG5wYXJzZXIucmVnaXN0ZXJBdHRyRXF1YWxpdHlNb2RzKCdeJywgJyQnLCAnKicsICd+Jyk7XG5wYXJzZXIuZW5hYmxlU3Vic3RpdHV0ZXMoKTtcblxuY29uc3QgUkVTT1VSQ0VfSUQgPSAncmVzb3VyY2UtaWQnO1xuY29uc3QgSURfTE9DQVRPUl9QQVRURVJOID0gL15bYS16QS1aX11bYS16QS1aMC05Ll9dKjppZFxcL1tcXFNdKyQvO1xuXG5jb25zdCBCT09MRUFOX0FUVFJTID0gW1xuICAnY2hlY2thYmxlJywgJ2NoZWNrZWQnLCAnY2xpY2thYmxlJywgJ2VuYWJsZWQnLCAnZm9jdXNhYmxlJyxcbiAgJ2ZvY3VzZWQnLCAnbG9uZy1jbGlja2FibGUnLCAnc2Nyb2xsYWJsZScsICdzZWxlY3RlZCcsXG5dO1xuXG5jb25zdCBOVU1FUklDX0FUVFJTID0gW1xuICAnaW5kZXgnLCAnaW5zdGFuY2UnLFxuXTtcblxuY29uc3QgU1RSX0FUVFJTID0gW1xuICAnZGVzY3JpcHRpb24nLCBSRVNPVVJDRV9JRCwgJ3RleHQnLCAnY2xhc3MtbmFtZScsICdwYWNrYWdlLW5hbWUnXG5dO1xuXG5jb25zdCBBTExfQVRUUlMgPSBbXG4gIC4uLkJPT0xFQU5fQVRUUlMsXG4gIC4uLk5VTUVSSUNfQVRUUlMsXG4gIC4uLlNUUl9BVFRSUyxcbl07XG5cbmNvbnN0IEFUVFJJQlVURV9BTElBU0VTID0gW1xuICBbUkVTT1VSQ0VfSUQsIFsnaWQnXV0sXG4gIFsnZGVzY3JpcHRpb24nLCBbXG4gICAgJ2NvbnRlbnQtZGVzY3JpcHRpb24nLCAnY29udGVudC1kZXNjJyxcbiAgICAnZGVzYycsICdhY2Nlc3NpYmlsaXR5LWlkJyxcbiAgXV0sXG4gIFsnaW5kZXgnLCBbJ250aC1jaGlsZCddXSxcbl07XG5cbi8qKlxuICogQ29udmVydCBoeXBoZW4gc2VwYXJhdGVkIHdvcmQgdG8gc25ha2UgY2FzZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBoeXBoZW4gc2VwYXJhdGVkIHdvcmQgdHJhbnNsYXRlZCB0byBzbmFrZSBjYXNlXG4gKi9cbmZ1bmN0aW9uIHRvU25ha2VDYXNlIChzdHIpIHtcbiAgaWYgKCFzdHIpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgY29uc3QgdG9rZW5zID0gc3RyLnNwbGl0KCctJykubWFwKChzdHIpID0+IHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKS50b0xvd2VyQ2FzZSgpKTtcbiAgY29uc3Qgb3V0ID0gdG9rZW5zLmpvaW4oJycpO1xuICByZXR1cm4gb3V0LmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgb3V0LnNsaWNlKDEpO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENzc05hbWVWYWx1ZU9iamVjdFxuICogQHByb3BlcnR5IHs/bmFtZX0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgQ1NTIG9iamVjdFxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIENTUyBvYmplY3RcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUgYm9vbGVhbiBmcm9tIGEgQ1NTIG9iamVjdC4gSWYgZW1wdHksIHJldHVybiB0cnVlLiBJZiBub3QgdHJ1ZS9mYWxzZS9lbXB0eSwgdGhyb3cgZXhjZXB0aW9uXG4gKlxuICogQHBhcmFtIHtDc3NOYW1lVmFsdWVPYmplY3R9IGNzcyBBIENTUyBvYmplY3QgdGhhdCBoYXMgJ25hbWUnIGFuZCAndmFsdWUnXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBFaXRoZXIgJ3RydWUnIG9yICdmYWxzZScuIElmIHZhbHVlIGlzIGVtcHR5LCByZXR1cm4gJ3RydWUnXG4gKi9cbmZ1bmN0aW9uIGFzc2VydEdldEJvb2wgKGNzcykge1xuICBjb25zdCB2YWwgPSBjc3MudmFsdWU/LnRvTG93ZXJDYXNlKCkgfHwgJ3RydWUnOyAvLyBhbiBvbWl0dGVkIGJvb2xlYW4gYXR0cmlidXRlIG1lYW5zICd0cnVlJyAoZS5nLjogaW5wdXRbY2hlY2tlZF0gbWVhbnMgY2hlY2tlZCBpcyB0cnVlKVxuICBpZiAoWyd0cnVlJywgJ2ZhbHNlJ10uaW5jbHVkZXModmFsKSkge1xuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGAnJHtjc3MubmFtZX0nIG11c3QgYmUgdHJ1ZSwgZmFsc2Ugb3IgZW1wdHkuIEZvdW5kICcke2Nzcy52YWx1ZX0nYCk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBjYW5vbmljYWwgZm9ybSBvZiBhIENTUyBhdHRyaWJ1dGUgbmFtZVxuICpcbiAqIENvbnZlcnRzIHRvIGxvd2VyY2FzZSBhbmQgaWYgYW4gYXR0cmlidXRlIG5hbWUgaXMgYW4gYWxpYXMgZm9yIHNvbWV0aGluZyBlbHNlLCByZXR1cm5cbiAqIHdoYXQgaXQgaXMgYW4gYWxpYXMgZm9yXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNzcyBDU1Mgb2JqZWN0XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY2Fub25pY2FsIGF0dHJpYnV0ZSBuYW1lXG4gKi9cbmZ1bmN0aW9uIGFzc2VydEdldEF0dHJOYW1lIChjc3MpIHtcbiAgY29uc3QgYXR0ck5hbWUgPSBjc3MubmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIENoZWNrIGlmIGl0J3Mgc3VwcG9ydGVkIGFuZCBpZiBpdCBpcywgcmV0dXJuIGl0XG4gIGlmIChBTExfQVRUUlMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgcmV0dXJuIGF0dHJOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICAvLyBJZiBhdHRyTmFtZSBpcyBhbiBhbGlhcyBmb3Igc29tZXRoaW5nIGVsc2UsIHJldHVybiB0aGF0XG4gIGZvciAoY29uc3QgW29mZmljaWFsQXR0ciwgYWxpYXNBdHRyc10gb2YgQVRUUklCVVRFX0FMSUFTRVMpIHtcbiAgICBpZiAoYWxpYXNBdHRycy5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICAgIHJldHVybiBvZmZpY2lhbEF0dHI7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihgJyR7YXR0ck5hbWV9JyBpcyBub3QgYSB2YWxpZCBhdHRyaWJ1dGUuIGAgK1xuICAgIGBTdXBwb3J0ZWQgYXR0cmlidXRlcyBhcmUgJyR7QUxMX0FUVFJTLmpvaW4oJywgJyl9J2ApO1xufVxuXG4vKipcbiAqIEdldCBhIHJlZ2V4IHRoYXQgbWF0Y2hlcyBhIHdob2xlIHdvcmQuIEZvciB0aGUgfj0gQ1NTIGF0dHJpYnV0ZSBzZWxlY3Rvci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gd29yZFxuICogQHJldHVybnMge3N0cmluZ30gQSByZWdleCBcIndvcmRcIiBtYXRjaGVyXG4gKi9cbmZ1bmN0aW9uIGdldFdvcmRNYXRjaGVyUmVnZXggKHdvcmQpIHtcbiAgcmV0dXJuIGBcXFxcYihcXFxcdyoke2VzY2FwZVJlZ0V4cCh3b3JkKX1cXFxcdyopXFxcXGJgO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENzc0F0dHJcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmFsdWVUeXBlIFR5cGUgb2YgYXR0cmlidXRlIChtdXN0IGJlIHN0cmluZyBvciBlbXB0eSlcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmFsdWUgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBvcGVyYXRvciBUaGUgb3BlcmF0b3IgYmV0d2VlbiB2YWx1ZSBhbmQgdmFsdWUgdHlwZSAoPSwgKj0sICwgXj0sICQ9KVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ3NzUnVsZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBuZXN0aW5nT3BlcmF0b3IgVGhlIG5lc3Rpbmcgb3BlcmF0b3IgKGFrYTogY29tYmluYXRvciBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycylcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdGFnTmFtZSBUaGUgdGFnIG5hbWUgKGFrYTogdHlwZSBzZWxlY3RvciBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvVHlwZV9zZWxlY3RvcnMpXG4gKiBAcHJvcGVydHkgez9zdHJpbmdbXX0gY2xhc3NOYW1lcyBBbiBhcnJheSBvZiBDU1MgY2xhc3MgbmFtZXNcbiAqIEBwcm9wZXJ0eSB7P0Nzc0F0dHJbXX0gYXR0cnMgQW4gYXJyYXkgb2YgQ1NTIGF0dHJpYnV0ZXNcbiAqIEBwcm9wZXJ0eSB7P0Nzc1BzZXVkb1tdfSBhdHRycyBBbiBhcnJheSBvZiBDU1MgcHNldWRvc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBpZCBDU1MgaWRlbnRpZmllclxuICogQHByb3BlcnR5IHs/Q3NzUnVsZX0gcnVsZSBBIGRlc2NlbmRhbnQgb2YgdGhpcyBDU1MgcnVsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ3NzT2JqZWN0XG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHR5cGUgVHlwZSBvZiBDU1Mgb2JqZWN0LiAncnVsZScsICdydWxlc2V0JyBvciAnc2VsZWN0b3JzJ1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ3NzUHNldWRvXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlVHlwZSBUaGUgdHlwZSBvZiBDU1MgcHNldWRvIHNlbGVjdG9yIChodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9jc3Mtc2VsZWN0b3ItcGFyc2VyIGZvciByZWZlcmVuY2UpXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHBzZXVkbyBzZWxlY3RvclxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHBzZXVkbyBzZWxlY3RvclxuICovXG5cbmNsYXNzIENzc0NvbnZlcnRlciB7XG5cbiAgY29uc3RydWN0b3IgKHNlbGVjdG9yLCBwa2cpIHtcbiAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgdGhpcy5wa2cgPSBwa2c7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGA8cGtnTmFtZT46aWQvYCBwcmVmaXggdG8gYmVnaW5uaW5nIG9mIHN0cmluZyBpZiBpdCdzIG5vdCB0aGVyZSBhbHJlYWR5XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdG9yIFRoZSBpbml0aWFsIGxvY2F0b3JcbiAgICogQHJldHVybnMge3N0cmluZ30gU3RyaW5nIHdpdGggYDxwa2dOYW1lPjppZC9gIHByZXBlbmRlZCAoaWYgaXQgd2Fzbid0IGFscmVhZHkpXG4gICAqL1xuICBmb3JtYXRJZExvY2F0b3IgKGxvY2F0b3IpIHtcbiAgICByZXR1cm4gSURfTE9DQVRPUl9QQVRURVJOLnRlc3QobG9jYXRvcilcbiAgICAgID8gbG9jYXRvclxuICAgICAgOiBgJHt0aGlzLnBrZyB8fCAnYW5kcm9pZCd9OmlkLyR7bG9jYXRvcn1gO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBDU1MgYXR0cmlidXRlIGludG8gYSBVaVNlbGVjdG9yIG1ldGhvZCBjYWxsXG4gICAqXG4gICAqIEBwYXJhbSB7Q3NzQXR0cn0gY3NzQXR0ciBDU1MgYXR0cmlidXRlIG9iamVjdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDU1MgYXR0cmlidXRlIHBhcnNlZCBhcyBVaVNlbGVjdG9yXG4gICAqL1xuICBwYXJzZUF0dHIgKGNzc0F0dHIpIHtcbiAgICBpZiAoY3NzQXR0ci52YWx1ZVR5cGUgJiYgY3NzQXR0ci52YWx1ZVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2Nzc0F0dHIubmFtZX09JHtjc3NBdHRyLnZhbHVlfScgaXMgYW4gaW52YWxpZCBhdHRyaWJ1dGUuIGAgK1xuICAgICAgICBgT25seSAnc3RyaW5nJyBhbmQgZW1wdHkgYXR0cmlidXRlIHR5cGVzIGFyZSBzdXBwb3J0ZWQuIEZvdW5kICcke2Nzc0F0dHIudmFsdWVUeXBlfSdgKTtcbiAgICB9XG4gICAgY29uc3QgYXR0ck5hbWUgPSBhc3NlcnRHZXRBdHRyTmFtZShjc3NBdHRyKTtcbiAgICBjb25zdCBtZXRob2ROYW1lID0gdG9TbmFrZUNhc2UoYXR0ck5hbWUpO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhhdCBpdCdzIGEgc3VwcG9ydGVkIGF0dHJpYnV0ZVxuICAgIGlmICghU1RSX0FUVFJTLmluY2x1ZGVzKGF0dHJOYW1lKSAmJiAhQk9PTEVBTl9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7YXR0ck5hbWV9JyBpcyBub3Qgc3VwcG9ydGVkLiBTdXBwb3J0ZWQgYXR0cmlidXRlcyBhcmUgYCArXG4gICAgICAgIGAnJHtbLi4uU1RSX0FUVFJTLCAuLi5CT09MRUFOX0FUVFJTXS5qb2luKCcsICcpfSdgKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBib29sZWFuLCBpZiBpdCdzIGEgYm9vbGVhbiBhdHRyaWJ1dGVcbiAgICBpZiAoQk9PTEVBTl9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX0oJHthc3NlcnRHZXRCb29sKGNzc0F0dHIpfSlgO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSBwYXJzZSBhcyBzdHJpbmdcbiAgICBsZXQgdmFsdWUgPSBjc3NBdHRyLnZhbHVlIHx8ICcnO1xuICAgIGlmIChhdHRyTmFtZSA9PT0gUkVTT1VSQ0VfSUQpIHtcbiAgICAgIHZhbHVlID0gdGhpcy5mb3JtYXRJZExvY2F0b3IodmFsdWUpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9TWF0Y2hlcyhcIlwiKWA7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjc3NBdHRyLm9wZXJhdG9yKSB7XG4gICAgICBjYXNlICc9JzpcbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfShcIiR7dmFsdWV9XCIpYDtcbiAgICAgIGNhc2UgJyo9JzpcbiAgICAgICAgaWYgKFsnZGVzY3JpcHRpb24nLCAndGV4dCddLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1Db250YWlucyhcIiR7dmFsdWV9XCIpYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9TWF0Y2hlcyhcIiR7ZXNjYXBlUmVnRXhwKHZhbHVlKX1cIilgO1xuICAgICAgY2FzZSAnXj0nOlxuICAgICAgICBpZiAoWydkZXNjcmlwdGlvbicsICd0ZXh0J10uaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfVN0YXJ0c1dpdGgoXCIke3ZhbHVlfVwiKWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCJeJHtlc2NhcGVSZWdFeHAodmFsdWUpfVwiKWA7XG4gICAgICBjYXNlICckPSc6XG4gICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1NYXRjaGVzKFwiJHtlc2NhcGVSZWdFeHAodmFsdWUpfSRcIilgO1xuICAgICAgY2FzZSAnfj0nOlxuICAgICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9TWF0Y2hlcyhcIiR7Z2V0V29yZE1hdGNoZXJSZWdleCh2YWx1ZSl9XCIpYDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIFVucmVhY2hhYmxlLCBidXQgYWRkaW5nIGVycm9yIGluIGNhc2UgYSBuZXcgQ1NTIGF0dHJpYnV0ZSBpcyBhZGRlZC5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBDU1MgYXR0cmlidXRlIG9wZXJhdG9yICcke2Nzc0F0dHIub3BlcmF0b3J9Jy4gYCArXG4gICAgICAgICAgYCAnPScsICcqPScsICdePScsICckPScgYW5kICd+PScgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIENTUyBwc2V1ZG8gY2xhc3MgdG8gYSBVaVNlbGVjdG9yXG4gICAqXG4gICAqIEBwYXJhbSB7Q3NzUHNldWRvfSBjc3NQc2V1ZG8gQ1NTIFBzZXVkbyBjbGFzc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBQc2V1ZG8gc2VsZWN0b3IgcGFyc2VkIGFzIFVpU2VsZWN0b3JcbiAgICovXG4gIHBhcnNlUHNldWRvIChjc3NQc2V1ZG8pIHtcbiAgICBpZiAoY3NzUHNldWRvLnZhbHVlVHlwZSAmJiBjc3NQc2V1ZG8udmFsdWVUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtjc3NQc2V1ZG8ubmFtZX09JHtjc3NQc2V1ZG8udmFsdWV9Jy4gYCArXG4gICAgICAgIGBVbnN1cHBvcnRlZCBjc3MgcHNldWRvIGNsYXNzIHZhbHVlIHR5cGU6ICcke2Nzc1BzZXVkby52YWx1ZVR5cGV9Jy4gT25seSAnc3RyaW5nJyB0eXBlIG9yIGVtcHR5IGlzIHN1cHBvcnRlZC5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwc2V1ZG9OYW1lID0gYXNzZXJ0R2V0QXR0ck5hbWUoY3NzUHNldWRvKTtcblxuICAgIGlmIChCT09MRUFOX0FUVFJTLmluY2x1ZGVzKHBzZXVkb05hbWUpKSB7XG4gICAgICByZXR1cm4gYC4ke3RvU25ha2VDYXNlKHBzZXVkb05hbWUpfSgke2Fzc2VydEdldEJvb2woY3NzUHNldWRvKX0pYDtcbiAgICB9XG5cbiAgICBpZiAoTlVNRVJJQ19BVFRSUy5pbmNsdWRlcyhwc2V1ZG9OYW1lKSkge1xuICAgICAgcmV0dXJuIGAuJHtwc2V1ZG9OYW1lfSgke2Nzc1BzZXVkby52YWx1ZX0pYDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIENTUyBydWxlIHRvIGEgVWlTZWxlY3RvclxuICAgKiBAcGFyYW0ge0Nzc1J1bGV9IGNzc1J1bGUgQ1NTIHJ1bGUgZGVmaW5pdGlvblxuICAgKi9cbiAgcGFyc2VDc3NSdWxlIChjc3NSdWxlKSB7XG4gICAgY29uc3QgeyBuZXN0aW5nT3BlcmF0b3IgfSA9IGNzc1J1bGU7XG4gICAgaWYgKG5lc3RpbmdPcGVyYXRvciAmJiBuZXN0aW5nT3BlcmF0b3IgIT09ICcgJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtuZXN0aW5nT3BlcmF0b3J9JyBpcyBub3QgYSBzdXBwb3J0ZWQgY29tYmluYXRvci4gYCArXG4gICAgICAgIGBPbmx5IGNoaWxkIGNvbWJpbmF0b3IgKD4pIGFuZCBkZXNjZW5kYW50IGNvbWJpbmF0b3IgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICB9XG5cbiAgICBsZXQgdWlBdXRvbWF0b3JTZWxlY3RvciA9ICduZXcgVWlTZWxlY3RvcigpJztcbiAgICBpZiAoY3NzUnVsZS50YWdOYW1lICYmIGNzc1J1bGUudGFnTmFtZSAhPT0gJyonKSB7XG4gICAgICBsZXQgYW5kcm9pZENsYXNzID0gW2Nzc1J1bGUudGFnTmFtZV07XG4gICAgICBpZiAoY3NzUnVsZS5jbGFzc05hbWVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgY3NzQ2xhc3NOYW1lcyBvZiBjc3NSdWxlLmNsYXNzTmFtZXMpIHtcbiAgICAgICAgICBhbmRyb2lkQ2xhc3MucHVzaChjc3NDbGFzc05hbWVzKTtcbiAgICAgICAgfVxuICAgICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IGAuY2xhc3NOYW1lKFwiJHthbmRyb2lkQ2xhc3Muam9pbignLicpfVwiKWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IGAuY2xhc3NOYW1lTWF0Y2hlcyhcIiR7Y3NzUnVsZS50YWdOYW1lfVwiKWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjc3NSdWxlLmNsYXNzTmFtZXMpIHtcbiAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5jbGFzc05hbWVNYXRjaGVzKFwiJHtjc3NSdWxlLmNsYXNzTmFtZXMuam9pbignXFxcXC4nKX1cIilgO1xuICAgIH1cbiAgICBpZiAoY3NzUnVsZS5pZCkge1xuICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLnJlc291cmNlSWQoXCIke3RoaXMuZm9ybWF0SWRMb2NhdG9yKGNzc1J1bGUuaWQpfVwiKWA7XG4gICAgfVxuICAgIGlmIChjc3NSdWxlLmF0dHJzKSB7XG4gICAgICBmb3IgKGNvbnN0IGF0dHIgb2YgY3NzUnVsZS5hdHRycykge1xuICAgICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IHRoaXMucGFyc2VBdHRyKGF0dHIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY3NzUnVsZS5wc2V1ZG9zKSB7XG4gICAgICBmb3IgKGNvbnN0IHBzZXVkbyBvZiBjc3NSdWxlLnBzZXVkb3MpIHtcbiAgICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSB0aGlzLnBhcnNlUHNldWRvKHBzZXVkbyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjc3NSdWxlLnJ1bGUpIHtcbiAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5jaGlsZFNlbGVjdG9yKCR7dGhpcy5wYXJzZUNzc1J1bGUoY3NzUnVsZS5ydWxlKX0pYDtcbiAgICB9XG4gICAgcmV0dXJuIHVpQXV0b21hdG9yU2VsZWN0b3I7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBDU1Mgb2JqZWN0IHRvIFVpQXV0b21hdG9yMiBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0Nzc09iamVjdH0gY3NzIENTUyBvYmplY3RcbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIENTUyBvYmplY3QgcGFyc2VkIGFzIGEgVWlTZWxlY3RvclxuICAgKi9cbiAgcGFyc2VDc3NPYmplY3QgKGNzcykge1xuICAgIHN3aXRjaCAoY3NzLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3J1bGUnOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUNzc1J1bGUoY3NzKTtcbiAgICAgIGNhc2UgJ3J1bGVTZXQnOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUNzc09iamVjdChjc3MucnVsZSk7XG4gICAgICBjYXNlICdzZWxlY3RvcnMnOlxuICAgICAgICByZXR1cm4gY3NzLnNlbGVjdG9ycy5tYXAoKHNlbGVjdG9yKSA9PiB0aGlzLnBhcnNlQ3NzT2JqZWN0KHNlbGVjdG9yKSkuam9pbignOyAnKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gVGhpcyBpcyBuZXZlciByZWFjaGFibGUsIGJ1dCBpZiBpdCBldmVyIGlzIGRvIHRoaXMuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVWlBdXRvbWF0b3IgZG9lcyBub3Qgc3VwcG9ydCAnJHtjc3MudHlwZX0nIGNzcy4gT25seSBzdXBwb3J0cyAncnVsZScsICdydWxlU2V0JywgJ3NlbGVjdG9ycycgYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBDU1Mgc2VsZWN0b3IgdG8gYSBVaUF1dG9tYXRvcjIgc2VsZWN0b3JcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIENTUyBzZWxlY3RvciBjb252ZXJ0ZWQgdG8gYSBVaVNlbGVjdG9yXG4gICAqL1xuICB0b1VpQXV0b21hdG9yU2VsZWN0b3IgKCkge1xuICAgIGxldCBjc3NPYmo7XG4gICAgdHJ5IHtcbiAgICAgIGNzc09iaiA9IHBhcnNlci5wYXJzZSh0aGlzLnNlbGVjdG9yKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRTZWxlY3RvckVycm9yKGBJbnZhbGlkIENTUyBzZWxlY3RvciAnJHt0aGlzLnNlbGVjdG9yfScuIFJlYXNvbjogJyR7ZX0nYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUNzc09iamVjdChjc3NPYmopO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFNlbGVjdG9yRXJyb3IoYFVuc3VwcG9ydGVkIENTUyBzZWxlY3RvciAnJHt0aGlzLnNlbGVjdG9yfScuIFJlYXNvbjogJyR7ZX0nYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENzc0NvbnZlcnRlcjsiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxJQUFBQSxrQkFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBRUEsTUFBTUcsTUFBTSxHQUFHLElBQUlDLG9DQUFpQixDQUFDLENBQUM7QUFDdENELE1BQU0sQ0FBQ0UsdUJBQXVCLENBQUMsS0FBSyxDQUFDO0FBQ3JDRixNQUFNLENBQUNHLHdCQUF3QixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQzlDSCxNQUFNLENBQUNJLHdCQUF3QixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUNuREosTUFBTSxDQUFDSyxpQkFBaUIsQ0FBQyxDQUFDO0FBRTFCLE1BQU1DLFdBQVcsR0FBRyxhQUFhO0FBQ2pDLE1BQU1DLGtCQUFrQixHQUFHLHFDQUFxQztBQUVoRSxNQUFNQyxhQUFhLEdBQUcsQ0FDcEIsV0FBVyxFQUFFLFNBQVMs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
200
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY3NzU2VsZWN0b3JQYXJzZXIiLCJyZXF1aXJlIiwiX2xvZGFzaCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfZHJpdmVyIiwiX2xvZ2dlciIsInBhcnNlQ3NzU2VsZWN0b3IiLCJjcmVhdGVQYXJzZXIiLCJzeW50YXgiLCJwc2V1ZG9DbGFzc2VzIiwidW5rbm93biIsImRlZmluaXRpb25zIiwiU2VsZWN0b3IiLCJjb21iaW5hdG9ycyIsImF0dHJpYnV0ZXMiLCJvcGVyYXRvcnMiLCJpZHMiLCJjbGFzc05hbWVzIiwidGFnIiwid2lsZGNhcmQiLCJzdWJzdGl0dXRlcyIsIlJFU09VUkNFX0lEIiwiSURfTE9DQVRPUl9QQVRURVJOIiwiQk9PTEVBTl9BVFRSUyIsIk5VTUVSSUNfQVRUUlMiLCJTVFJfQVRUUlMiLCJBTExfQVRUUlMiLCJBVFRSSUJVVEVfQUxJQVNFUyIsInRvU25ha2VDYXNlIiwic3RyIiwidG9rZW5zIiwic3BsaXQiLCJtYXAiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwidG9Mb3dlckNhc2UiLCJvdXQiLCJqb2luIiwicmVxdWlyZUJvb2xlYW4iLCJjc3MiLCJfcmVmIiwidmFsIiwiXyIsInRvTG93ZXIiLCJ2YWx1ZSIsImFyZ3VtZW50IiwiaW5jbHVkZXMiLCJFcnJvciIsIm5hbWUiLCJyZXF1aXJlRW50aXR5TmFtZSIsImNzc0VudGl0eSIsImF0dHJOYW1lIiwib2ZmaWNpYWxBdHRyIiwiYWxpYXNBdHRycyIsImdldFdvcmRNYXRjaGVyUmVnZXgiLCJ3b3JkIiwiZXNjYXBlUmVnRXhwIiwiQ3NzQ29udmVydGVyIiwiY29uc3RydWN0b3IiLCJzZWxlY3RvciIsInBrZyIsImZvcm1hdElkTG9jYXRvciIsImxvY2F0b3IiLCJ0ZXN0IiwicGFyc2VBdHRyIiwiY3NzQXR0ciIsIl9jc3NBdHRyJHZhbHVlIiwiYXR0clZhbHVlIiwiaXNTdHJpbmciLCJpc0VtcHR5IiwibWV0aG9kTmFtZSIsIm9wZXJhdG9yIiwicGFyc2VQc2V1ZG8iLCJjc3NQc2V1ZG8iLCJfY3NzUHNldWRvJGFyZ3VtZW50IiwiYXJnVmFsdWUiLCJwc2V1ZG9OYW1lIiwicGFyc2VDc3NSdWxlIiwiY3NzUnVsZSIsIl9jc3NSdWxlJHRhZyIsImNvbWJpbmF0b3IiLCJ1aUF1dG9tYXRvclNlbGVjdG9yIiwidGFnTmFtZSIsImFuZHJvaWRDbGFzcyIsImNzc0NsYXNzTmFtZXMiLCJwdXNoIiwiYXR0ciIsInBzZXVkbyIsInNlbCIsIm5lc3RlZFJ1bGUiLCJwYXJzZUNzc09iamVjdCIsInJ1bGVzIiwidG9VaUF1dG9tYXRvclNlbGVjdG9yIiwiY3NzT2JqIiwiZSIsImxvZyIsImRlYnVnIiwic3RhY2siLCJlcnJvcnMiLCJJbnZhbGlkU2VsZWN0b3JFcnJvciIsIm1lc3NhZ2UiLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2Nzcy1jb252ZXJ0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlUGFyc2VyIH0gZnJvbSAnY3NzLXNlbGVjdG9yLXBhcnNlcic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcblxuY29uc3QgcGFyc2VDc3NTZWxlY3RvciA9IGNyZWF0ZVBhcnNlcih7XG4gIHN5bnRheDoge1xuICAgIHBzZXVkb0NsYXNzZXM6IHtcbiAgICAgIHVua25vd246ICdhY2NlcHQnLFxuICAgICAgZGVmaW5pdGlvbnM6IHtcbiAgICAgICAgU2VsZWN0b3I6IFsnaGFzJ10sXG4gICAgICB9XG4gICAgfSxcbiAgICBjb21iaW5hdG9yczogWyc+JywgJysnLCAnfiddLFxuICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgIG9wZXJhdG9yczogWydePScsICckPScsICcqPScsICd+PScsICc9J11cbiAgICB9LFxuICAgIGlkczogdHJ1ZSxcbiAgICBjbGFzc05hbWVzOiB0cnVlLFxuICAgIHRhZzoge1xuICAgICAgd2lsZGNhcmQ6IHRydWVcbiAgICB9LFxuICB9LFxuICBzdWJzdGl0dXRlczogdHJ1ZVxufSk7XG5cbmNvbnN0IFJFU09VUkNFX0lEID0gJ3Jlc291cmNlLWlkJztcbmNvbnN0IElEX0xPQ0FUT1JfUEFUVEVSTiA9IC9eW2EtekEtWl9dW2EtekEtWjAtOS5fXSo6aWRcXC9bXFxTXSskLztcblxuY29uc3QgQk9PTEVBTl9BVFRSUyA9IFtcbiAgJ2NoZWNrYWJsZScsICdjaGVja2VkJywgJ2NsaWNrYWJsZScsICdlbmFibGVkJywgJ2ZvY3VzYWJsZScsXG4gICdmb2N1c2VkJywgJ2xvbmctY2xpY2thYmxlJywgJ3Njcm9sbGFibGUnLCAnc2VsZWN0ZWQnLFxuXTtcblxuY29uc3QgTlVNRVJJQ19BVFRSUyA9IFtcbiAgJ2luZGV4JywgJ2luc3RhbmNlJyxcbl07XG5cbmNvbnN0IFNUUl9BVFRSUyA9IFtcbiAgJ2Rlc2NyaXB0aW9uJywgUkVTT1VSQ0VfSUQsICd0ZXh0JywgJ2NsYXNzLW5hbWUnLCAncGFja2FnZS1uYW1lJ1xuXTtcblxuY29uc3QgQUxMX0FUVFJTID0gW1xuICAuLi5CT09MRUFOX0FUVFJTLFxuICAuLi5OVU1FUklDX0FUVFJTLFxuICAuLi5TVFJfQVRUUlMsXG5dO1xuXG5jb25zdCBBVFRSSUJVVEVfQUxJQVNFUyA9IFtcbiAgW1JFU09VUkNFX0lELCBbJ2lkJ11dLFxuICBbJ2Rlc2NyaXB0aW9uJywgW1xuICAgICdjb250ZW50LWRlc2NyaXB0aW9uJywgJ2NvbnRlbnQtZGVzYycsXG4gICAgJ2Rlc2MnLCAnYWNjZXNzaWJpbGl0eS1pZCcsXG4gIF1dLFxuICBbJ2luZGV4JywgWydudGgtY2hpbGQnXV0sXG5dO1xuXG4vKipcbiAqIENvbnZlcnQgaHlwaGVuIHNlcGFyYXRlZCB3b3JkIHRvIHNuYWtlIGNhc2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZz99IHN0clxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGh5cGhlbiBzZXBhcmF0ZWQgd29yZCB0cmFuc2xhdGVkIHRvIHNuYWtlIGNhc2VcbiAqL1xuZnVuY3Rpb24gdG9TbmFrZUNhc2UgKHN0cikge1xuICBpZiAoIXN0cikge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCB0b2tlbnMgPSBzdHIuc3BsaXQoJy0nKS5tYXAoKHN0cikgPT4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCkpO1xuICBjb25zdCBvdXQgPSB0b2tlbnMuam9pbignJyk7XG4gIHJldHVybiBvdXQuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBvdXQuc2xpY2UoMSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBib29sZWFuIGZyb20gYSBDU1Mgb2JqZWN0LiBJZiBlbXB0eSwgcmV0dXJuIHRydWUuIElmIG5vdCB0cnVlL2ZhbHNlL2VtcHR5LCB0aHJvdyBleGNlcHRpb25cbiAqXG4gKiBAcGFyYW0ge2ltcG9ydCgnY3NzLXNlbGVjdG9yLXBhcnNlcicpLkFzdEF0dHJpYnV0ZXxpbXBvcnQoJ2Nzcy1zZWxlY3Rvci1wYXJzZXInKS5Bc3RQc2V1ZG9DbGFzc30gY3NzIEFcbiAqIENTUyBvYmplY3QgdGhhdCBoYXMgJ25hbWUnIGFuZCAndmFsdWUnXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBFaXRoZXIgJ3RydWUnIG9yICdmYWxzZScuIElmIHZhbHVlIGlzIGVtcHR5LCByZXR1cm4gJ3RydWUnXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVCb29sZWFuIChjc3MpIHtcbiAgY29uc3QgdmFsID0gXy50b0xvd2VyKChjc3MudmFsdWUgPz8gY3NzLmFyZ3VtZW50KT8udmFsdWUpIHx8ICd0cnVlJzsgLy8gYW4gb21pdHRlZCBib29sZWFuIGF0dHJpYnV0ZSBtZWFucyAndHJ1ZScgKGUuZy46IGlucHV0W2NoZWNrZWRdIG1lYW5zIGNoZWNrZWQgaXMgdHJ1ZSlcbiAgaWYgKFsndHJ1ZScsICdmYWxzZSddLmluY2x1ZGVzKHZhbCkpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzLm5hbWV9JyBtdXN0IGJlIHRydWUsIGZhbHNlIG9yIGVtcHR5LiBGb3VuZCAnJHtjc3MudmFsdWV9J2ApO1xufVxuXG4vKipcbiAqIEdldCB0aGUgY2Fub25pY2FsIGZvcm0gb2YgYSBDU1MgYXR0cmlidXRlIG5hbWVcbiAqXG4gKiBDb252ZXJ0cyB0byBsb3dlcmNhc2UgYW5kIGlmIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIGFuIGFsaWFzIGZvciBzb21ldGhpbmcgZWxzZSwgcmV0dXJuXG4gKiB3aGF0IGl0IGlzIGFuIGFsaWFzIGZvclxuICpcbiAqIEBwYXJhbSB7aW1wb3J0KCdjc3Mtc2VsZWN0b3ItcGFyc2VyJykuQXN0QXR0cmlidXRlfGltcG9ydCgnY3NzLXNlbGVjdG9yLXBhcnNlcicpLkFzdFBzZXVkb0NsYXNzfSBjc3NFbnRpdHkgQ1NTIG9iamVjdFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNhbm9uaWNhbCBhdHRyaWJ1dGUgbmFtZVxuICovXG5mdW5jdGlvbiByZXF1aXJlRW50aXR5TmFtZSAoY3NzRW50aXR5KSB7XG4gIGNvbnN0IGF0dHJOYW1lID0gY3NzRW50aXR5Lm5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAvLyBDaGVjayBpZiBpdCdzIHN1cHBvcnRlZCBhbmQgaWYgaXQgaXMsIHJldHVybiBpdFxuICBpZiAoQUxMX0FUVFJTLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgIHJldHVybiBhdHRyTmFtZS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgLy8gSWYgYXR0ck5hbWUgaXMgYW4gYWxpYXMgZm9yIHNvbWV0aGluZyBlbHNlLCByZXR1cm4gdGhhdFxuICBmb3IgKGNvbnN0IFtvZmZpY2lhbEF0dHIsIGFsaWFzQXR0cnNdIG9mIEFUVFJJQlVURV9BTElBU0VTKSB7XG4gICAgaWYgKGFsaWFzQXR0cnMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICByZXR1cm4gb2ZmaWNpYWxBdHRyO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYCcke2F0dHJOYW1lfScgaXMgbm90IGEgdmFsaWQgYXR0cmlidXRlLiBgICtcbiAgICBgU3VwcG9ydGVkIGF0dHJpYnV0ZXMgYXJlICcke0FMTF9BVFRSUy5qb2luKCcsICcpfSdgKTtcbn1cblxuLyoqXG4gKiBHZXQgYSByZWdleCB0aGF0IG1hdGNoZXMgYSB3aG9sZSB3b3JkLiBGb3IgdGhlIH49IENTUyBhdHRyaWJ1dGUgc2VsZWN0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgcmVnZXggXCJ3b3JkXCIgbWF0Y2hlclxuICovXG5mdW5jdGlvbiBnZXRXb3JkTWF0Y2hlclJlZ2V4ICh3b3JkKSB7XG4gIHJldHVybiBgXFxcXGIoXFxcXHcqJHtfLmVzY2FwZVJlZ0V4cCh3b3JkKX1cXFxcdyopXFxcXGJgO1xufVxuXG5cbmNsYXNzIENzc0NvbnZlcnRlciB7XG5cbiAgY29uc3RydWN0b3IgKHNlbGVjdG9yLCBwa2cpIHtcbiAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgdGhpcy5wa2cgPSBwa2c7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGA8cGtnTmFtZT46aWQvYCBwcmVmaXggdG8gYmVnaW5uaW5nIG9mIHN0cmluZyBpZiBpdCdzIG5vdCB0aGVyZSBhbHJlYWR5XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdG9yIFRoZSBpbml0aWFsIGxvY2F0b3JcbiAgICogQHJldHVybnMge3N0cmluZ30gU3RyaW5nIHdpdGggYDxwa2dOYW1lPjppZC9gIHByZXBlbmRlZCAoaWYgaXQgd2Fzbid0IGFscmVhZHkpXG4gICAqL1xuICBmb3JtYXRJZExvY2F0b3IgKGxvY2F0b3IpIHtcbiAgICByZXR1cm4gSURfTE9DQVRPUl9QQVRURVJOLnRlc3QobG9jYXRvcilcbiAgICAgID8gbG9jYXRvclxuICAgICAgOiBgJHt0aGlzLnBrZyB8fCAnYW5kcm9pZCd9OmlkLyR7bG9jYXRvcn1gO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBDU1MgYXR0cmlidXRlIGludG8gYSBVaVNlbGVjdG9yIG1ldGhvZCBjYWxsXG4gICAqXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdjc3Mtc2VsZWN0b3ItcGFyc2VyJykuQXN0QXR0cmlidXRlfSBjc3NBdHRyIENTUyBhdHRyaWJ1dGUgb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IENTUyBhdHRyaWJ1dGUgcGFyc2VkIGFzIFVpU2VsZWN0b3JcbiAgICovXG4gIHBhcnNlQXR0ciAoY3NzQXR0cikge1xuICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGNzc0F0dHIudmFsdWU/LnZhbHVlO1xuICAgIGlmICghXy5pc1N0cmluZyhhdHRyVmFsdWUpICYmICFfLmlzRW1wdHkoYXR0clZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtjc3NBdHRyLm5hbWV9PSR7YXR0clZhbHVlfScgaXMgYW4gaW52YWxpZCBhdHRyaWJ1dGUuIGAgK1xuICAgICAgICBgT25seSAnc3RyaW5nJyBhbmQgZW1wdHkgYXR0cmlidXRlIHR5cGVzIGFyZSBzdXBwb3J0ZWQuIEZvdW5kICcke2F0dHJWYWx1ZX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJOYW1lID0gcmVxdWlyZUVudGl0eU5hbWUoY3NzQXR0cik7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHRvU25ha2VDYXNlKGF0dHJOYW1lKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgaXQncyBhIHN1cHBvcnRlZCBhdHRyaWJ1dGVcbiAgICBpZiAoIVNUUl9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkgJiYgIUJPT0xFQU5fQVRUUlMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2F0dHJOYW1lfScgaXMgbm90IHN1cHBvcnRlZC4gU3VwcG9ydGVkIGF0dHJpYnV0ZXMgYXJlIGAgK1xuICAgICAgICBgJyR7Wy4uLlNUUl9BVFRSUywgLi4uQk9PTEVBTl9BVFRSU10uam9pbignLCAnKX0nYCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgYm9vbGVhbiwgaWYgaXQncyBhIGJvb2xlYW4gYXR0cmlidXRlXG4gICAgaWYgKEJPT0xFQU5fQVRUUlMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9KCR7cmVxdWlyZUJvb2xlYW4oY3NzQXR0cil9KWA7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlIHBhcnNlIGFzIHN0cmluZ1xuICAgIGxldCB2YWx1ZSA9IGF0dHJWYWx1ZSB8fCAnJztcbiAgICBpZiAoYXR0ck5hbWUgPT09IFJFU09VUkNFX0lEKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuZm9ybWF0SWRMb2NhdG9yKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCJcIilgO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY3NzQXR0ci5vcGVyYXRvcikge1xuICAgICAgY2FzZSAnPSc6XG4gICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX0oXCIke3ZhbHVlfVwiKWA7XG4gICAgICBjYXNlICcqPSc6XG4gICAgICAgIGlmIChbJ2Rlc2NyaXB0aW9uJywgJ3RleHQnXS5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICAgICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9Q29udGFpbnMoXCIke3ZhbHVlfVwiKWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke18uZXNjYXBlUmVnRXhwKHZhbHVlKX1cIilgO1xuICAgICAgY2FzZSAnXj0nOlxuICAgICAgICBpZiAoWydkZXNjcmlwdGlvbicsICd0ZXh0J10uaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfVN0YXJ0c1dpdGgoXCIke3ZhbHVlfVwiKWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCJeJHtfLmVzY2FwZVJlZ0V4cCh2YWx1ZSl9XCIpYDtcbiAgICAgIGNhc2UgJyQ9JzpcbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke18uZXNjYXBlUmVnRXhwKHZhbHVlKX0kXCIpYDtcbiAgICAgIGNhc2UgJ349JzpcbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2dldFdvcmRNYXRjaGVyUmVnZXgodmFsdWUpfVwiKWA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBVbnJlYWNoYWJsZSwgYnV0IGFkZGluZyBlcnJvciBpbiBjYXNlIGEgbmV3IENTUyBhdHRyaWJ1dGUgaXMgYWRkZWQuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgQ1NTIGF0dHJpYnV0ZSBvcGVyYXRvciAnJHtjc3NBdHRyLm9wZXJhdG9yfScuIGAgK1xuICAgICAgICAgIGAgJz0nLCAnKj0nLCAnXj0nLCAnJD0nIGFuZCAnfj0nIGFyZSBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBDU1MgcHNldWRvIGNsYXNzIHRvIGEgVWlTZWxlY3RvclxuICAgKlxuICAgKiBAcGFyYW0ge2ltcG9ydCgnY3NzLXNlbGVjdG9yLXBhcnNlcicpLkFzdFBzZXVkb0NsYXNzfSBjc3NQc2V1ZG8gQ1NTIFBzZXVkbyBjbGFzc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nP30gUHNldWRvIHNlbGVjdG9yIHBhcnNlZCBhcyBVaVNlbGVjdG9yXG4gICAqL1xuICBwYXJzZVBzZXVkbyAoY3NzUHNldWRvKSB7XG4gICAgY29uc3QgYXJnVmFsdWUgPSBjc3NQc2V1ZG8uYXJndW1lbnQ/LnZhbHVlO1xuICAgIGlmICghXy5pc1N0cmluZyhhcmdWYWx1ZSkgJiYgIV8uaXNFbXB0eShhcmdWYWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzUHNldWRvLm5hbWV9PSR7YXJnVmFsdWV9Jy4gYCArXG4gICAgICAgIGBVbnN1cHBvcnRlZCBjc3MgcHNldWRvIGNsYXNzIHZhbHVlOiAnJHthcmdWYWx1ZX0nLiBPbmx5ICdzdHJpbmcnIHR5cGUgb3IgZW1wdHkgaXMgc3VwcG9ydGVkLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHBzZXVkb05hbWUgPSByZXF1aXJlRW50aXR5TmFtZShjc3NQc2V1ZG8pO1xuXG4gICAgaWYgKEJPT0xFQU5fQVRUUlMuaW5jbHVkZXMocHNldWRvTmFtZSkpIHtcbiAgICAgIHJldHVybiBgLiR7dG9TbmFrZUNhc2UocHNldWRvTmFtZSl9KCR7cmVxdWlyZUJvb2xlYW4oY3NzUHNldWRvKX0pYDtcbiAgICB9XG5cbiAgICBpZiAoTlVNRVJJQ19BVFRSUy5pbmNsdWRlcyhwc2V1ZG9OYW1lKSkge1xuICAgICAgcmV0dXJuIGAuJHtwc2V1ZG9OYW1lfSgke2FyZ1ZhbHVlfSlgO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgQ1NTIHJ1bGUgdG8gYSBVaVNlbGVjdG9yXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdjc3Mtc2VsZWN0b3ItcGFyc2VyJykuQXN0UnVsZX0gY3NzUnVsZSBDU1MgcnVsZSBkZWZpbml0aW9uXG4gICAqL1xuICBwYXJzZUNzc1J1bGUgKGNzc1J1bGUpIHtcbiAgICBpZiAoY3NzUnVsZS5jb21iaW5hdG9yICYmICFbJyAnLCAnPiddLmluY2x1ZGVzKGNzc1J1bGUuY29tYmluYXRvcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzUnVsZS5jb21iaW5hdG9yfScgaXMgbm90IGEgc3VwcG9ydGVkIGNvbWJpbmF0b3IuIGAgK1xuICAgICAgICBgT25seSBjaGlsZCBjb21iaW5hdG9yICg+KSBhbmQgZGVzY2VuZGFudCBjb21iaW5hdG9yIGFyZSBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuXG4gICAgbGV0IHVpQXV0b21hdG9yU2VsZWN0b3IgPSAnbmV3IFVpU2VsZWN0b3IoKSc7XG4gICAgY29uc3QgdGFnTmFtZSA9IGNzc1J1bGUudGFnPy5uYW1lO1xuICAgIGlmICh0YWdOYW1lICYmIHRhZ05hbWUgIT09ICcqJykge1xuICAgICAgbGV0IGFuZHJvaWRDbGFzcyA9IFt0YWdOYW1lXTtcbiAgICAgIGlmIChjc3NSdWxlLmNsYXNzTmFtZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBjc3NDbGFzc05hbWVzIG9mIGNzc1J1bGUuY2xhc3NOYW1lcykge1xuICAgICAgICAgIGFuZHJvaWRDbGFzcy5wdXNoKGNzc0NsYXNzTmFtZXMpO1xuICAgICAgICB9XG4gICAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5jbGFzc05hbWUoXCIke2FuZHJvaWRDbGFzcy5qb2luKCcuJyl9XCIpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5jbGFzc05hbWVNYXRjaGVzKFwiJHt0YWdOYW1lfVwiKWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghXy5pc0VtcHR5KGNzc1J1bGUuY2xhc3NOYW1lcykpIHtcbiAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5jbGFzc05hbWVNYXRjaGVzKFwiJHtjc3NSdWxlLmNsYXNzTmFtZXMuam9pbignXFxcXC4nKX1cIilgO1xuICAgIH1cbiAgICBpZiAoIV8uaXNFbXB0eShjc3NSdWxlLmlkcykpIHtcbiAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5yZXNvdXJjZUlkKFwiJHt0aGlzLmZvcm1hdElkTG9jYXRvcihjc3NSdWxlLmlkc1swXSl9XCIpYDtcbiAgICB9XG4gICAgaWYgKGNzc1J1bGUuYXR0cmlidXRlcykge1xuICAgICAgZm9yIChjb25zdCBhdHRyIG9mIGNzc1J1bGUuYXR0cmlidXRlcykge1xuICAgICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IHRoaXMucGFyc2VBdHRyKGF0dHIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY3NzUnVsZS5wc2V1ZG9DbGFzc2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IHBzZXVkbyBvZiBjc3NSdWxlLnBzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgY29uc3Qgc2VsID0gdGhpcy5wYXJzZVBzZXVkbyhwc2V1ZG8pO1xuICAgICAgICBpZiAoc2VsKSB7XG4gICAgICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBzZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNzc1J1bGUubmVzdGVkUnVsZSkge1xuICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNoaWxkU2VsZWN0b3IoJHt0aGlzLnBhcnNlQ3NzUnVsZShjc3NSdWxlLm5lc3RlZFJ1bGUpfSlgO1xuICAgIH1cbiAgICByZXR1cm4gdWlBdXRvbWF0b3JTZWxlY3RvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IENTUyBvYmplY3QgdG8gVWlBdXRvbWF0b3IyIHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdjc3Mtc2VsZWN0b3ItcGFyc2VyJykuQXN0U2VsZWN0b3J9IGNzcyBDU1Mgb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Mgb2JqZWN0IHBhcnNlZCBhcyBhIFVpU2VsZWN0b3JcbiAgICovXG4gIHBhcnNlQ3NzT2JqZWN0IChjc3MpIHtcbiAgICBpZiAoIV8uaXNFbXB0eShjc3MucnVsZXMpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUNzc1J1bGUoY3NzLnJ1bGVzWzBdKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJ1bGVzIGNvdWxkIGJlIHBhcnNlZCBvdXQgb2YgdGhlIGN1cnJlbnQgc2VsZWN0b3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgQ1NTIHNlbGVjdG9yIHRvIGEgVWlBdXRvbWF0b3IyIHNlbGVjdG9yXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Mgc2VsZWN0b3IgY29udmVydGVkIHRvIGEgVWlTZWxlY3RvclxuICAgKi9cbiAgdG9VaUF1dG9tYXRvclNlbGVjdG9yICgpIHtcbiAgICBsZXQgY3NzT2JqO1xuICAgIHRyeSB7XG4gICAgICBjc3NPYmogPSBwYXJzZUNzc1NlbGVjdG9yKHRoaXMuc2VsZWN0b3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5kZWJ1ZyhlLnN0YWNrKTtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFNlbGVjdG9yRXJyb3IoYEludmFsaWQgQ1NTIHNlbGVjdG9yICcke3RoaXMuc2VsZWN0b3J9Jy4gUmVhc29uOiAnJHtlLm1lc3NhZ2V9J2ApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VDc3NPYmplY3QoY3NzT2JqKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZGVidWcoZS5zdGFjayk7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRTZWxlY3RvckVycm9yKGBVbnN1cHBvcnRlZCBDU1Mgc2VsZWN0b3IgJyR7dGhpcy5zZWxlY3Rvcn0nLiBSZWFzb246ICcke2UubWVzc2FnZX0nYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENzc0NvbnZlcnRlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxrQkFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksT0FBQSxHQUFBRixzQkFBQSxDQUFBRixPQUFBO0FBRUEsTUFBTUssZ0JBQWdCLEdBQUcsSUFBQUMsK0JBQVksRUFBQztFQUNwQ0MsTUFBTSxFQUFFO0lBQ05DLGFBQWEsRUFBRTtNQUNiQyxPQUFPLEVBQUUsUUFBUTtNQUNqQkMsV0FBVyxFQUFFO1FBQ1hDLFFBQVEsRUFBRSxDQUFDLEtBQUs7TUFDbEI7SUFDRixDQUFDO0lBQ0RDLFdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzVCQyxVQUFVLEVBQUU7TUFDVkMsU0FB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
@@ -1 +1 @@
1
- {"version":3,"file":"css-converter.js","names":["_cssSelectorParser","require","_lodash","_driver","parser","CssSelectorParser","registerSelectorPseudos","registerNestingOperators","registerAttrEqualityMods","enableSubstitutes","RESOURCE_ID","ID_LOCATOR_PATTERN","BOOLEAN_ATTRS","NUMERIC_ATTRS","STR_ATTRS","ALL_ATTRS","ATTRIBUTE_ALIASES","toSnakeCase","str","tokens","split","map","charAt","toUpperCase","slice","toLowerCase","out","join","assertGetBool","css","_css$value","val","value","includes","Error","name","assertGetAttrName","attrName","officialAttr","aliasAttrs","getWordMatcherRegex","word","escapeRegExp","CssConverter","constructor","selector","pkg","formatIdLocator","locator","test","parseAttr","cssAttr","valueType","methodName","operator","parsePseudo","cssPseudo","pseudoName","parseCssRule","cssRule","nestingOperator","uiAutomatorSelector","tagName","androidClass","classNames","cssClassNames","push","id","attrs","attr","pseudos","pseudo","rule","parseCssObject","type","selectors","toUiAutomatorSelector","cssObj","parse","e","errors","InvalidSelectorError","_default","exports","default"],"sources":["../../lib/css-converter.js"],"sourcesContent":["import { CssSelectorParser } from 'css-selector-parser';\nimport { escapeRegExp } from 'lodash';\nimport { errors } from 'appium/driver';\n\nconst parser = new CssSelectorParser();\nparser.registerSelectorPseudos('has');\nparser.registerNestingOperators('>', '+', '~');\nparser.registerAttrEqualityMods('^', '$', '*', '~');\nparser.enableSubstitutes();\n\nconst RESOURCE_ID = 'resource-id';\nconst ID_LOCATOR_PATTERN = /^[a-zA-Z_][a-zA-Z0-9._]*:id\\/[\\S]+$/;\n\nconst BOOLEAN_ATTRS = [\n 'checkable', 'checked', 'clickable', 'enabled', 'focusable',\n 'focused', 'long-clickable', 'scrollable', 'selected',\n];\n\nconst NUMERIC_ATTRS = [\n 'index', 'instance',\n];\n\nconst STR_ATTRS = [\n 'description', RESOURCE_ID, 'text', 'class-name', 'package-name'\n];\n\nconst ALL_ATTRS = [\n ...BOOLEAN_ATTRS,\n ...NUMERIC_ATTRS,\n ...STR_ATTRS,\n];\n\nconst ATTRIBUTE_ALIASES = [\n [RESOURCE_ID, ['id']],\n ['description', [\n 'content-description', 'content-desc',\n 'desc', 'accessibility-id',\n ]],\n ['index', ['nth-child']],\n];\n\n/**\n * Convert hyphen separated word to snake case\n *\n * @param {string} str\n * @returns {string} The hyphen separated word translated to snake case\n */\nfunction toSnakeCase (str) {\n if (!str) {\n return '';\n }\n const tokens = str.split('-').map((str) => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase());\n const out = tokens.join('');\n return out.charAt(0).toLowerCase() + out.slice(1);\n}\n\n/**\n * @typedef {Object} CssNameValueObject\n * @property {?name} name The name of the CSS object\n * @property {?string} value The value of the CSS object\n */\n\n/**\n * Get the boolean from a CSS object. If empty, return true. If not true/false/empty, throw exception\n *\n * @param {CssNameValueObject} css A CSS object that has 'name' and 'value'\n * @returns {string} Either 'true' or 'false'. If value is empty, return 'true'\n */\nfunction assertGetBool (css) {\n const val = css.value?.toLowerCase() || 'true'; // an omitted boolean attribute means 'true' (e.g.: input[checked] means checked is true)\n if (['true', 'false'].includes(val)) {\n return val;\n }\n throw new Error(`'${css.name}' must be true, false or empty. Found '${css.value}'`);\n}\n\n/**\n * Get the canonical form of a CSS attribute name\n *\n * Converts to lowercase and if an attribute name is an alias for something else, return\n * what it is an alias for\n *\n * @param {Object} css CSS object\n * @returns {string} The canonical attribute name\n */\nfunction assertGetAttrName (css) {\n const attrName = css.name.toLowerCase();\n\n // Check if it's supported and if it is, return it\n if (ALL_ATTRS.includes(attrName)) {\n return attrName.toLowerCase();\n }\n\n // If attrName is an alias for something else, return that\n for (const [officialAttr, aliasAttrs] of ATTRIBUTE_ALIASES) {\n if (aliasAttrs.includes(attrName)) {\n return officialAttr;\n }\n }\n throw new Error(`'${attrName}' is not a valid attribute. ` +\n `Supported attributes are '${ALL_ATTRS.join(', ')}'`);\n}\n\n/**\n * Get a regex that matches a whole word. For the ~= CSS attribute selector.\n *\n * @param {string} word\n * @returns {string} A regex \"word\" matcher\n */\nfunction getWordMatcherRegex (word) {\n return `\\\\b(\\\\w*${escapeRegExp(word)}\\\\w*)\\\\b`;\n}\n\n/**\n * @typedef {Object} CssAttr\n * @property {?string} valueType Type of attribute (must be string or empty)\n * @property {?string} value Value of the attribute\n * @property {?string} operator The operator between value and value type (=, *=, , ^=, $=)\n */\n\n/**\n * @typedef {Object} CssRule\n * @property {?string} nestingOperator The nesting operator (aka: combinator https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors)\n * @property {?string} tagName The tag name (aka: type selector https://developer.mozilla.org/en-US/docs/Web/CSS/Type_selectors)\n * @property {?string[]} classNames An array of CSS class names\n * @property {?CssAttr[]} attrs An array of CSS attributes\n * @property {?CssPseudo[]} attrs An array of CSS pseudos\n * @property {?string} id CSS identifier\n * @property {?CssRule} rule A descendant of this CSS rule\n */\n\n/**\n * @typedef {Object} CssObject\n * @property {?string} type Type of CSS object. 'rule', 'ruleset' or 'selectors'\n */\n\n/**\n * @typedef {Object} CssPseudo\n * @property {?string} valueType The type of CSS pseudo selector (https://www.npmjs.com/package/css-selector-parser for reference)\n * @property {?string} name The name of the pseudo selector\n * @property {?string} value The value of the pseudo selector\n */\n\nclass CssConverter {\n\n constructor (selector, pkg) {\n this.selector = selector;\n this.pkg = pkg;\n }\n\n /**\n * Add `<pkgName>:id/` prefix to beginning of string if it's not there already\n *\n * @param {string} locator The initial locator\n * @returns {string} String with `<pkgName>:id/` prepended (if it wasn't already)\n */\n formatIdLocator (locator) {\n return ID_LOCATOR_PATTERN.test(locator)\n ? locator\n : `${this.pkg || 'android'}:id/${locator}`;\n }\n\n /**\n * Convert a CSS attribute into a UiSelector method call\n *\n * @param {CssAttr} cssAttr CSS attribute object\n * @returns {string} CSS attribute parsed as UiSelector\n */\n parseAttr (cssAttr) {\n if (cssAttr.valueType && cssAttr.valueType !== 'string') {\n throw new Error(`'${cssAttr.name}=${cssAttr.value}' is an invalid attribute. ` +\n `Only 'string' and empty attribute types are supported. Found '${cssAttr.valueType}'`);\n }\n const attrName = assertGetAttrName(cssAttr);\n const methodName = toSnakeCase(attrName);\n\n // Validate that it's a supported attribute\n if (!STR_ATTRS.includes(attrName) && !BOOLEAN_ATTRS.includes(attrName)) {\n throw new Error(`'${attrName}' is not supported. Supported attributes are ` +\n `'${[...STR_ATTRS, ...BOOLEAN_ATTRS].join(', ')}'`);\n }\n\n // Parse boolean, if it's a boolean attribute\n if (BOOLEAN_ATTRS.includes(attrName)) {\n return `.${methodName}(${assertGetBool(cssAttr)})`;\n }\n\n // Otherwise parse as string\n let value = cssAttr.value || '';\n if (attrName === RESOURCE_ID) {\n value = this.formatIdLocator(value);\n }\n if (value === '') {\n return `.${methodName}Matches(\"\")`;\n }\n\n switch (cssAttr.operator) {\n case '=':\n return `.${methodName}(\"${value}\")`;\n case '*=':\n if (['description', 'text'].includes(attrName)) {\n return `.${methodName}Contains(\"${value}\")`;\n }\n return `.${methodName}Matches(\"${escapeRegExp(value)}\")`;\n case '^=':\n if (['description', 'text'].includes(attrName)) {\n return `.${methodName}StartsWith(\"${value}\")`;\n }\n return `.${methodName}Matches(\"^${escapeRegExp(value)}\")`;\n case '$=':\n return `.${methodName}Matches(\"${escapeRegExp(value)}$\")`;\n case '~=':\n return `.${methodName}Matches(\"${getWordMatcherRegex(value)}\")`;\n default:\n // Unreachable, but adding error in case a new CSS attribute is added.\n throw new Error(`Unsupported CSS attribute operator '${cssAttr.operator}'. ` +\n ` '=', '*=', '^=', '$=' and '~=' are supported.`);\n }\n }\n\n /**\n * Convert a CSS pseudo class to a UiSelector\n *\n * @param {CssPseudo} cssPseudo CSS Pseudo class\n * @returns {string} Pseudo selector parsed as UiSelector\n */\n parsePseudo (cssPseudo) {\n if (cssPseudo.valueType && cssPseudo.valueType !== 'string') {\n throw new Error(`'${cssPseudo.name}=${cssPseudo.value}'. ` +\n `Unsupported css pseudo class value type: '${cssPseudo.valueType}'. Only 'string' type or empty is supported.`);\n }\n\n const pseudoName = assertGetAttrName(cssPseudo);\n\n if (BOOLEAN_ATTRS.includes(pseudoName)) {\n return `.${toSnakeCase(pseudoName)}(${assertGetBool(cssPseudo)})`;\n }\n\n if (NUMERIC_ATTRS.includes(pseudoName)) {\n return `.${pseudoName}(${cssPseudo.value})`;\n }\n }\n\n /**\n * Convert a CSS rule to a UiSelector\n * @param {CssRule} cssRule CSS rule definition\n */\n parseCssRule (cssRule) {\n const { nestingOperator } = cssRule;\n if (nestingOperator && nestingOperator !== ' ') {\n throw new Error(`'${nestingOperator}' is not a supported combinator. ` +\n `Only child combinator (>) and descendant combinator are supported.`);\n }\n\n let uiAutomatorSelector = 'new UiSelector()';\n if (cssRule.tagName && cssRule.tagName !== '*') {\n let androidClass = [cssRule.tagName];\n if (cssRule.classNames) {\n for (const cssClassNames of cssRule.classNames) {\n androidClass.push(cssClassNames);\n }\n uiAutomatorSelector += `.className(\"${androidClass.join('.')}\")`;\n } else {\n uiAutomatorSelector += `.classNameMatches(\"${cssRule.tagName}\")`;\n }\n } else if (cssRule.classNames) {\n uiAutomatorSelector += `.classNameMatches(\"${cssRule.classNames.join('\\\\.')}\")`;\n }\n if (cssRule.id) {\n uiAutomatorSelector += `.resourceId(\"${this.formatIdLocator(cssRule.id)}\")`;\n }\n if (cssRule.attrs) {\n for (const attr of cssRule.attrs) {\n uiAutomatorSelector += this.parseAttr(attr);\n }\n }\n if (cssRule.pseudos) {\n for (const pseudo of cssRule.pseudos) {\n uiAutomatorSelector += this.parsePseudo(pseudo);\n }\n }\n if (cssRule.rule) {\n uiAutomatorSelector += `.childSelector(${this.parseCssRule(cssRule.rule)})`;\n }\n return uiAutomatorSelector;\n }\n\n /**\n * Convert CSS object to UiAutomator2 selector\n * @param {CssObject} css CSS object\n * @returns {string} The CSS object parsed as a UiSelector\n */\n parseCssObject (css) {\n switch (css.type) {\n case 'rule':\n return this.parseCssRule(css);\n case 'ruleSet':\n return this.parseCssObject(css.rule);\n case 'selectors':\n return css.selectors.map((selector) => this.parseCssObject(selector)).join('; ');\n\n default:\n // This is never reachable, but if it ever is do this.\n throw new Error(`UiAutomator does not support '${css.type}' css. Only supports 'rule', 'ruleSet', 'selectors' `);\n }\n }\n\n /**\n * Convert a CSS selector to a UiAutomator2 selector\n *\n * @returns {string} The CSS selector converted to a UiSelector\n */\n toUiAutomatorSelector () {\n let cssObj;\n try {\n cssObj = parser.parse(this.selector);\n } catch (e) {\n throw new errors.InvalidSelectorError(`Invalid CSS selector '${this.selector}'. Reason: '${e}'`);\n }\n try {\n return this.parseCssObject(cssObj);\n } catch (e) {\n throw new errors.InvalidSelectorError(`Unsupported CSS selector '${this.selector}'. Reason: '${e}'`);\n }\n }\n}\n\nexport default CssConverter;"],"mappings":"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"}
1
+ {"version":3,"file":"css-converter.js","names":["_cssSelectorParser","require","_lodash","_interopRequireDefault","_driver","_logger","parseCssSelector","createParser","syntax","pseudoClasses","unknown","definitions","Selector","combinators","attributes","operators","ids","classNames","tag","wildcard","substitutes","RESOURCE_ID","ID_LOCATOR_PATTERN","BOOLEAN_ATTRS","NUMERIC_ATTRS","STR_ATTRS","ALL_ATTRS","ATTRIBUTE_ALIASES","toSnakeCase","str","tokens","split","map","charAt","toUpperCase","slice","toLowerCase","out","join","requireBoolean","css","_ref","val","_","toLower","value","argument","includes","Error","name","requireEntityName","cssEntity","attrName","officialAttr","aliasAttrs","getWordMatcherRegex","word","escapeRegExp","CssConverter","constructor","selector","pkg","formatIdLocator","locator","test","parseAttr","cssAttr","_cssAttr$value","attrValue","isString","isEmpty","methodName","operator","parsePseudo","cssPseudo","_cssPseudo$argument","argValue","pseudoName","parseCssRule","cssRule","_cssRule$tag","combinator","uiAutomatorSelector","tagName","androidClass","cssClassNames","push","attr","pseudo","sel","nestedRule","parseCssObject","rules","toUiAutomatorSelector","cssObj","e","log","debug","stack","errors","InvalidSelectorError","message","_default","exports","default"],"sources":["../../lib/css-converter.js"],"sourcesContent":["import { createParser } from 'css-selector-parser';\nimport _ from 'lodash';\nimport { errors } from 'appium/driver';\nimport log from './logger';\n\nconst parseCssSelector = createParser({\n syntax: {\n pseudoClasses: {\n unknown: 'accept',\n definitions: {\n Selector: ['has'],\n }\n },\n combinators: ['>', '+', '~'],\n attributes: {\n operators: ['^=', '$=', '*=', '~=', '=']\n },\n ids: true,\n classNames: true,\n tag: {\n wildcard: true\n },\n },\n substitutes: true\n});\n\nconst RESOURCE_ID = 'resource-id';\nconst ID_LOCATOR_PATTERN = /^[a-zA-Z_][a-zA-Z0-9._]*:id\\/[\\S]+$/;\n\nconst BOOLEAN_ATTRS = [\n 'checkable', 'checked', 'clickable', 'enabled', 'focusable',\n 'focused', 'long-clickable', 'scrollable', 'selected',\n];\n\nconst NUMERIC_ATTRS = [\n 'index', 'instance',\n];\n\nconst STR_ATTRS = [\n 'description', RESOURCE_ID, 'text', 'class-name', 'package-name'\n];\n\nconst ALL_ATTRS = [\n ...BOOLEAN_ATTRS,\n ...NUMERIC_ATTRS,\n ...STR_ATTRS,\n];\n\nconst ATTRIBUTE_ALIASES = [\n [RESOURCE_ID, ['id']],\n ['description', [\n 'content-description', 'content-desc',\n 'desc', 'accessibility-id',\n ]],\n ['index', ['nth-child']],\n];\n\n/**\n * Convert hyphen separated word to snake case\n *\n * @param {string?} str\n * @returns {string} The hyphen separated word translated to snake case\n */\nfunction toSnakeCase (str) {\n if (!str) {\n return '';\n }\n const tokens = str.split('-').map((str) => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase());\n const out = tokens.join('');\n return out.charAt(0).toLowerCase() + out.slice(1);\n}\n\n/**\n * Get the boolean from a CSS object. If empty, return true. If not true/false/empty, throw exception\n *\n * @param {import('css-selector-parser').AstAttribute|import('css-selector-parser').AstPseudoClass} css A\n * CSS object that has 'name' and 'value'\n * @returns {string} Either 'true' or 'false'. If value is empty, return 'true'\n */\nfunction requireBoolean (css) {\n const val = _.toLower((css.value ?? css.argument)?.value) || 'true'; // an omitted boolean attribute means 'true' (e.g.: input[checked] means checked is true)\n if (['true', 'false'].includes(val)) {\n return val;\n }\n throw new Error(`'${css.name}' must be true, false or empty. Found '${css.value}'`);\n}\n\n/**\n * Get the canonical form of a CSS attribute name\n *\n * Converts to lowercase and if an attribute name is an alias for something else, return\n * what it is an alias for\n *\n * @param {import('css-selector-parser').AstAttribute|import('css-selector-parser').AstPseudoClass} cssEntity CSS object\n * @returns {string} The canonical attribute name\n */\nfunction requireEntityName (cssEntity) {\n const attrName = cssEntity.name.toLowerCase();\n\n // Check if it's supported and if it is, return it\n if (ALL_ATTRS.includes(attrName)) {\n return attrName.toLowerCase();\n }\n\n // If attrName is an alias for something else, return that\n for (const [officialAttr, aliasAttrs] of ATTRIBUTE_ALIASES) {\n if (aliasAttrs.includes(attrName)) {\n return officialAttr;\n }\n }\n throw new Error(`'${attrName}' is not a valid attribute. ` +\n `Supported attributes are '${ALL_ATTRS.join(', ')}'`);\n}\n\n/**\n * Get a regex that matches a whole word. For the ~= CSS attribute selector.\n *\n * @param {string} word\n * @returns {string} A regex \"word\" matcher\n */\nfunction getWordMatcherRegex (word) {\n return `\\\\b(\\\\w*${_.escapeRegExp(word)}\\\\w*)\\\\b`;\n}\n\n\nclass CssConverter {\n\n constructor (selector, pkg) {\n this.selector = selector;\n this.pkg = pkg;\n }\n\n /**\n * Add `<pkgName>:id/` prefix to beginning of string if it's not there already\n *\n * @param {string} locator The initial locator\n * @returns {string} String with `<pkgName>:id/` prepended (if it wasn't already)\n */\n formatIdLocator (locator) {\n return ID_LOCATOR_PATTERN.test(locator)\n ? locator\n : `${this.pkg || 'android'}:id/${locator}`;\n }\n\n /**\n * Convert a CSS attribute into a UiSelector method call\n *\n * @param {import('css-selector-parser').AstAttribute} cssAttr CSS attribute object\n * @returns {string} CSS attribute parsed as UiSelector\n */\n parseAttr (cssAttr) {\n const attrValue = cssAttr.value?.value;\n if (!_.isString(attrValue) && !_.isEmpty(attrValue)) {\n throw new Error(`'${cssAttr.name}=${attrValue}' is an invalid attribute. ` +\n `Only 'string' and empty attribute types are supported. Found '${attrValue}'`);\n }\n const attrName = requireEntityName(cssAttr);\n const methodName = toSnakeCase(attrName);\n\n // Validate that it's a supported attribute\n if (!STR_ATTRS.includes(attrName) && !BOOLEAN_ATTRS.includes(attrName)) {\n throw new Error(`'${attrName}' is not supported. Supported attributes are ` +\n `'${[...STR_ATTRS, ...BOOLEAN_ATTRS].join(', ')}'`);\n }\n\n // Parse boolean, if it's a boolean attribute\n if (BOOLEAN_ATTRS.includes(attrName)) {\n return `.${methodName}(${requireBoolean(cssAttr)})`;\n }\n\n // Otherwise parse as string\n let value = attrValue || '';\n if (attrName === RESOURCE_ID) {\n value = this.formatIdLocator(value);\n }\n if (value === '') {\n return `.${methodName}Matches(\"\")`;\n }\n\n switch (cssAttr.operator) {\n case '=':\n return `.${methodName}(\"${value}\")`;\n case '*=':\n if (['description', 'text'].includes(attrName)) {\n return `.${methodName}Contains(\"${value}\")`;\n }\n return `.${methodName}Matches(\"${_.escapeRegExp(value)}\")`;\n case '^=':\n if (['description', 'text'].includes(attrName)) {\n return `.${methodName}StartsWith(\"${value}\")`;\n }\n return `.${methodName}Matches(\"^${_.escapeRegExp(value)}\")`;\n case '$=':\n return `.${methodName}Matches(\"${_.escapeRegExp(value)}$\")`;\n case '~=':\n return `.${methodName}Matches(\"${getWordMatcherRegex(value)}\")`;\n default:\n // Unreachable, but adding error in case a new CSS attribute is added.\n throw new Error(`Unsupported CSS attribute operator '${cssAttr.operator}'. ` +\n ` '=', '*=', '^=', '$=' and '~=' are supported.`);\n }\n }\n\n /**\n * Convert a CSS pseudo class to a UiSelector\n *\n * @param {import('css-selector-parser').AstPseudoClass} cssPseudo CSS Pseudo class\n * @returns {string?} Pseudo selector parsed as UiSelector\n */\n parsePseudo (cssPseudo) {\n const argValue = cssPseudo.argument?.value;\n if (!_.isString(argValue) && !_.isEmpty(argValue)) {\n throw new Error(`'${cssPseudo.name}=${argValue}'. ` +\n `Unsupported css pseudo class value: '${argValue}'. Only 'string' type or empty is supported.`);\n }\n\n const pseudoName = requireEntityName(cssPseudo);\n\n if (BOOLEAN_ATTRS.includes(pseudoName)) {\n return `.${toSnakeCase(pseudoName)}(${requireBoolean(cssPseudo)})`;\n }\n\n if (NUMERIC_ATTRS.includes(pseudoName)) {\n return `.${pseudoName}(${argValue})`;\n }\n }\n\n /**\n * Convert a CSS rule to a UiSelector\n * @param {import('css-selector-parser').AstRule} cssRule CSS rule definition\n */\n parseCssRule (cssRule) {\n if (cssRule.combinator && ![' ', '>'].includes(cssRule.combinator)) {\n throw new Error(`'${cssRule.combinator}' is not a supported combinator. ` +\n `Only child combinator (>) and descendant combinator are supported.`);\n }\n\n let uiAutomatorSelector = 'new UiSelector()';\n const tagName = cssRule.tag?.name;\n if (tagName && tagName !== '*') {\n let androidClass = [tagName];\n if (cssRule.classNames) {\n for (const cssClassNames of cssRule.classNames) {\n androidClass.push(cssClassNames);\n }\n uiAutomatorSelector += `.className(\"${androidClass.join('.')}\")`;\n } else {\n uiAutomatorSelector += `.classNameMatches(\"${tagName}\")`;\n }\n } else if (!_.isEmpty(cssRule.classNames)) {\n uiAutomatorSelector += `.classNameMatches(\"${cssRule.classNames.join('\\\\.')}\")`;\n }\n if (!_.isEmpty(cssRule.ids)) {\n uiAutomatorSelector += `.resourceId(\"${this.formatIdLocator(cssRule.ids[0])}\")`;\n }\n if (cssRule.attributes) {\n for (const attr of cssRule.attributes) {\n uiAutomatorSelector += this.parseAttr(attr);\n }\n }\n if (cssRule.pseudoClasses) {\n for (const pseudo of cssRule.pseudoClasses) {\n const sel = this.parsePseudo(pseudo);\n if (sel) {\n uiAutomatorSelector += sel;\n }\n }\n }\n if (cssRule.nestedRule) {\n uiAutomatorSelector += `.childSelector(${this.parseCssRule(cssRule.nestedRule)})`;\n }\n return uiAutomatorSelector;\n }\n\n /**\n * Convert CSS object to UiAutomator2 selector\n * @param {import('css-selector-parser').AstSelector} css CSS object\n * @returns {string} The CSS object parsed as a UiSelector\n */\n parseCssObject (css) {\n if (!_.isEmpty(css.rules)) {\n return this.parseCssRule(css.rules[0]);\n }\n\n throw new Error('No rules could be parsed out of the current selector');\n }\n\n /**\n * Convert a CSS selector to a UiAutomator2 selector\n *\n * @returns {string} The CSS selector converted to a UiSelector\n */\n toUiAutomatorSelector () {\n let cssObj;\n try {\n cssObj = parseCssSelector(this.selector);\n } catch (e) {\n log.debug(e.stack);\n throw new errors.InvalidSelectorError(`Invalid CSS selector '${this.selector}'. Reason: '${e.message}'`);\n }\n try {\n return this.parseCssObject(cssObj);\n } catch (e) {\n log.debug(e.stack);\n throw new errors.InvalidSelectorError(`Unsupported CSS selector '${this.selector}'. Reason: '${e.message}'`);\n }\n }\n}\n\nexport default CssConverter;\n"],"mappings":"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"}
@@ -130,7 +130,7 @@ extensions.executeMobile = async function (mobileCommand, opts = {}) {
130
130
 
131
131
  installMultipleApks: 'mobileInstallMultipleApks',
132
132
 
133
- lock: 'lock',
133
+ lock: 'mobileLock',
134
134
  unlock: 'mobileUnlock',
135
135
  isLocked: 'isLocked',
136
136