appium-uiautomator2-driver 1.71.0 → 1.75.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 +25 -5
- package/build/lib/commands/find.js +5 -11
- package/build/lib/commands/general.js +4 -2
- package/build/lib/css-converter.js +119 -112
- package/build/lib/driver.js +4 -3
- package/build/lib/uiautomator2.js +2 -1
- package/lib/commands/find.js +5 -9
- package/lib/commands/general.js +3 -0
- package/lib/css-converter.js +177 -169
- package/lib/driver.js +16 -4
- package/lib/uiautomator2.js +1 -0
- package/package.json +9 -9
|
@@ -13,7 +13,6 @@ var _lodash = require("lodash");
|
|
|
13
13
|
|
|
14
14
|
var _appiumBaseDriver = require("appium-base-driver");
|
|
15
15
|
|
|
16
|
-
const CssConverter = {};
|
|
17
16
|
const parser = new _cssSelectorParser.CssSelectorParser();
|
|
18
17
|
parser.registerSelectorPseudos('has');
|
|
19
18
|
parser.registerNestingOperators('>', '+', '~');
|
|
@@ -69,165 +68,173 @@ function getWordMatcherRegex(word) {
|
|
|
69
68
|
return `\\b(\\w*${(0, _lodash.escapeRegExp)(word)}\\w*)\\b`;
|
|
70
69
|
}
|
|
71
70
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
71
|
+
class CssConverter {
|
|
72
|
+
constructor(selector, pkg) {
|
|
73
|
+
this.selector = selector;
|
|
74
|
+
this.pkg = pkg;
|
|
75
|
+
}
|
|
75
76
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
throw new Error(`'${cssAttr.name}=${cssAttr.value}' is an invalid attribute. ` + `Only 'string' and empty attribute types are supported. Found '${cssAttr.valueType}'`);
|
|
77
|
+
formatIdLocator(locator) {
|
|
78
|
+
return ID_LOCATOR_PATTERN.test(locator) ? locator : `${this.pkg || 'android'}:id/${locator}`;
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
parseAttr(cssAttr) {
|
|
82
|
+
if (cssAttr.valueType && cssAttr.valueType !== 'string') {
|
|
83
|
+
throw new Error(`'${cssAttr.name}=${cssAttr.value}' is an invalid attribute. ` + `Only 'string' and empty attribute types are supported. Found '${cssAttr.valueType}'`);
|
|
84
|
+
}
|
|
83
85
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
86
|
+
const attrName = assertGetAttrName(cssAttr);
|
|
87
|
+
const methodName = toSnakeCase(attrName);
|
|
87
88
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
if (!STR_ATTRS.includes(attrName) && !BOOLEAN_ATTRS.includes(attrName)) {
|
|
90
|
+
throw new Error(`'${attrName}' is not supported. Supported attributes are ` + `'${[...STR_ATTRS, ...BOOLEAN_ATTRS].join(', ')}'`);
|
|
91
|
+
}
|
|
91
92
|
|
|
92
|
-
|
|
93
|
+
if (BOOLEAN_ATTRS.includes(attrName)) {
|
|
94
|
+
return `.${methodName}(${assertGetBool(cssAttr)})`;
|
|
95
|
+
}
|
|
93
96
|
|
|
94
|
-
|
|
95
|
-
value = formatIdLocator(value);
|
|
96
|
-
}
|
|
97
|
+
let value = cssAttr.value || '';
|
|
97
98
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
if (attrName === RESOURCE_ID) {
|
|
100
|
+
value = this.formatIdLocator(value);
|
|
101
|
+
}
|
|
101
102
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
103
|
+
if (value === '') {
|
|
104
|
+
return `.${methodName}Matches("")`;
|
|
105
|
+
}
|
|
105
106
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
return `.${methodName}
|
|
109
|
-
}
|
|
107
|
+
switch (cssAttr.operator) {
|
|
108
|
+
case '=':
|
|
109
|
+
return `.${methodName}("${value}")`;
|
|
110
110
|
|
|
111
|
-
|
|
111
|
+
case '*=':
|
|
112
|
+
if (['description', 'text'].includes(attrName)) {
|
|
113
|
+
return `.${methodName}Contains("${value}")`;
|
|
114
|
+
}
|
|
112
115
|
|
|
113
|
-
|
|
114
|
-
if (['description', 'text'].includes(attrName)) {
|
|
115
|
-
return `.${methodName}StartsWith("${value}")`;
|
|
116
|
-
}
|
|
116
|
+
return `.${methodName}Matches("${(0, _lodash.escapeRegExp)(value)}")`;
|
|
117
117
|
|
|
118
|
-
|
|
118
|
+
case '^=':
|
|
119
|
+
if (['description', 'text'].includes(attrName)) {
|
|
120
|
+
return `.${methodName}StartsWith("${value}")`;
|
|
121
|
+
}
|
|
119
122
|
|
|
120
|
-
|
|
121
|
-
return `.${methodName}Matches("${(0, _lodash.escapeRegExp)(value)}$")`;
|
|
123
|
+
return `.${methodName}Matches("^${(0, _lodash.escapeRegExp)(value)}")`;
|
|
122
124
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
+
case '$=':
|
|
126
|
+
return `.${methodName}Matches("${(0, _lodash.escapeRegExp)(value)}$")`;
|
|
125
127
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
}
|
|
129
|
-
}
|
|
128
|
+
case '~=':
|
|
129
|
+
return `.${methodName}Matches("${getWordMatcherRegex(value)}")`;
|
|
130
130
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
131
|
+
default:
|
|
132
|
+
throw new Error(`Unsupported CSS attribute operator '${cssAttr.operator}'. ` + ` '=', '*=', '^=', '$=' and '~=' are supported.`);
|
|
133
|
+
}
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
-
|
|
136
|
+
parsePseudo(cssPseudo) {
|
|
137
|
+
if (cssPseudo.valueType && cssPseudo.valueType !== 'string') {
|
|
138
|
+
throw new Error(`'${cssPseudo.name}=${cssPseudo.value}'. ` + `Unsupported css pseudo class value type: '${cssPseudo.valueType}'. Only 'string' type or empty is supported.`);
|
|
139
|
+
}
|
|
137
140
|
|
|
138
|
-
|
|
139
|
-
return `.${toSnakeCase(pseudoName)}(${assertGetBool(cssPseudo)})`;
|
|
140
|
-
}
|
|
141
|
+
const pseudoName = assertGetAttrName(cssPseudo);
|
|
141
142
|
|
|
142
|
-
|
|
143
|
-
|
|
143
|
+
if (BOOLEAN_ATTRS.includes(pseudoName)) {
|
|
144
|
+
return `.${toSnakeCase(pseudoName)}(${assertGetBool(cssPseudo)})`;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (NUMERIC_ATTRS.includes(pseudoName)) {
|
|
148
|
+
return `.${pseudoName}(${cssPseudo.value})`;
|
|
149
|
+
}
|
|
144
150
|
}
|
|
145
|
-
}
|
|
146
151
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
152
|
+
parseCssRule(cssRule) {
|
|
153
|
+
const {
|
|
154
|
+
nestingOperator
|
|
155
|
+
} = cssRule;
|
|
151
156
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
157
|
+
if (nestingOperator && nestingOperator !== ' ') {
|
|
158
|
+
throw new Error(`'${nestingOperator}' is not a supported combinator. ` + `Only child combinator (>) and descendant combinator are supported.`);
|
|
159
|
+
}
|
|
155
160
|
|
|
156
|
-
|
|
161
|
+
let uiAutomatorSelector = 'new UiSelector()';
|
|
157
162
|
|
|
158
|
-
|
|
159
|
-
|
|
163
|
+
if (cssRule.tagName && cssRule.tagName !== '*') {
|
|
164
|
+
let androidClass = [cssRule.tagName];
|
|
160
165
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
166
|
+
if (cssRule.classNames) {
|
|
167
|
+
for (const cssClassNames of cssRule.classNames) {
|
|
168
|
+
androidClass.push(cssClassNames);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
uiAutomatorSelector += `.className("${androidClass.join('.')}")`;
|
|
172
|
+
} else {
|
|
173
|
+
uiAutomatorSelector += `.classNameMatches("${cssRule.tagName}")`;
|
|
164
174
|
}
|
|
175
|
+
} else if (cssRule.classNames) {
|
|
176
|
+
uiAutomatorSelector += `.classNameMatches("${cssRule.classNames.join('\\.')}")`;
|
|
177
|
+
}
|
|
165
178
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
uiAutomatorSelector += `.classNameMatches("${cssRule.tagName}")`;
|
|
179
|
+
if (cssRule.id) {
|
|
180
|
+
uiAutomatorSelector += `.resourceId("${this.formatIdLocator(cssRule.id)}")`;
|
|
169
181
|
}
|
|
170
|
-
} else if (cssRule.classNames) {
|
|
171
|
-
uiAutomatorSelector += `.classNameMatches("${cssRule.classNames.join('\\.')}")`;
|
|
172
|
-
}
|
|
173
182
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
183
|
+
if (cssRule.attrs) {
|
|
184
|
+
for (const attr of cssRule.attrs) {
|
|
185
|
+
uiAutomatorSelector += this.parseAttr(attr);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
177
188
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
189
|
+
if (cssRule.pseudos) {
|
|
190
|
+
for (const pseudo of cssRule.pseudos) {
|
|
191
|
+
uiAutomatorSelector += this.parsePseudo(pseudo);
|
|
192
|
+
}
|
|
181
193
|
}
|
|
182
|
-
}
|
|
183
194
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
uiAutomatorSelector += parsePseudo(pseudo);
|
|
195
|
+
if (cssRule.rule) {
|
|
196
|
+
uiAutomatorSelector += `.childSelector(${this.parseCssRule(cssRule.rule)})`;
|
|
187
197
|
}
|
|
188
|
-
}
|
|
189
198
|
|
|
190
|
-
|
|
191
|
-
uiAutomatorSelector += `.childSelector(${parseCssRule(cssRule.rule)})`;
|
|
199
|
+
return uiAutomatorSelector;
|
|
192
200
|
}
|
|
193
201
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
switch (css.type) {
|
|
199
|
-
case 'rule':
|
|
200
|
-
return parseCssRule(css);
|
|
202
|
+
parseCssObject(css) {
|
|
203
|
+
switch (css.type) {
|
|
204
|
+
case 'rule':
|
|
205
|
+
return this.parseCssRule(css);
|
|
201
206
|
|
|
202
|
-
|
|
203
|
-
|
|
207
|
+
case 'ruleSet':
|
|
208
|
+
return this.parseCssObject(css.rule);
|
|
204
209
|
|
|
205
|
-
|
|
206
|
-
|
|
210
|
+
case 'selectors':
|
|
211
|
+
return css.selectors.map(selector => this.parseCssObject(selector)).join('; ');
|
|
207
212
|
|
|
208
|
-
|
|
209
|
-
|
|
213
|
+
default:
|
|
214
|
+
throw new Error(`UiAutomator does not support '${css.type}' css. Only supports 'rule', 'ruleSet', 'selectors' `);
|
|
215
|
+
}
|
|
210
216
|
}
|
|
211
|
-
}
|
|
212
217
|
|
|
213
|
-
|
|
214
|
-
|
|
218
|
+
toUiAutomatorSelector() {
|
|
219
|
+
let cssObj;
|
|
215
220
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
+
try {
|
|
222
|
+
cssObj = parser.parse(this.selector);
|
|
223
|
+
} catch (e) {
|
|
224
|
+
throw new _appiumBaseDriver.errors.InvalidSelectorError(`Invalid CSS selector '${this.selector}'. Reason: '${e}'`);
|
|
225
|
+
}
|
|
221
226
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
227
|
+
try {
|
|
228
|
+
return this.parseCssObject(cssObj);
|
|
229
|
+
} catch (e) {
|
|
230
|
+
throw new _appiumBaseDriver.errors.InvalidSelectorError(`Unsupported CSS selector '${this.selector}'. Reason: '${e}'`);
|
|
231
|
+
}
|
|
226
232
|
}
|
|
227
|
-
|
|
233
|
+
|
|
234
|
+
}
|
|
228
235
|
|
|
229
236
|
var _default = CssConverter;
|
|
230
237
|
exports.default = _default;require('source-map-support').install();
|
|
231
238
|
|
|
232
239
|
|
|
233
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jc3MtY29udmVydGVyLmpzIl0sIm5hbWVzIjpbIkNzc0NvbnZlcnRlciIsInBhcnNlciIsIkNzc1NlbGVjdG9yUGFyc2VyIiwicmVnaXN0ZXJTZWxlY3RvclBzZXVkb3MiLCJyZWdpc3Rlck5lc3RpbmdPcGVyYXRvcnMiLCJyZWdpc3RlckF0dHJFcXVhbGl0eU1vZHMiLCJlbmFibGVTdWJzdGl0dXRlcyIsIlJFU09VUkNFX0lEIiwiSURfTE9DQVRPUl9QQVRURVJOIiwiQk9PTEVBTl9BVFRSUyIsIk5VTUVSSUNfQVRUUlMiLCJTVFJfQVRUUlMiLCJBTExfQVRUUlMiLCJBVFRSSUJVVEVfQUxJQVNFUyIsInRvU25ha2VDYXNlIiwic3RyIiwidG9rZW5zIiwic3BsaXQiLCJtYXAiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwidG9Mb3dlckNhc2UiLCJvdXQiLCJqb2luIiwiYXNzZXJ0R2V0Qm9vbCIsImNzcyIsInZhbCIsInZhbHVlIiwiaW5jbHVkZXMiLCJFcnJvciIsIm5hbWUiLCJhc3NlcnRHZXRBdHRyTmFtZSIsImF0dHJOYW1lIiwib2ZmaWNpYWxBdHRyIiwiYWxpYXNBdHRycyIsImdldFdvcmRNYXRjaGVyUmVnZXgiLCJ3b3JkIiwiZm9ybWF0SWRMb2NhdG9yIiwibG9jYXRvciIsInRlc3QiLCJwYXJzZUF0dHIiLCJjc3NBdHRyIiwidmFsdWVUeXBlIiwibWV0aG9kTmFtZSIsIm9wZXJhdG9yIiwicGFyc2VQc2V1ZG8iLCJjc3NQc2V1ZG8iLCJwc2V1ZG9OYW1lIiwicGFyc2VDc3NSdWxlIiwiY3NzUnVsZSIsIm5lc3RpbmdPcGVyYXRvciIsInVpQXV0b21hdG9yU2VsZWN0b3IiLCJ0YWdOYW1lIiwiYW5kcm9pZENsYXNzIiwiY2xhc3NOYW1lcyIsImNzc0NsYXNzTmFtZXMiLCJwdXNoIiwiaWQiLCJhdHRycyIsImF0dHIiLCJwc2V1ZG9zIiwicHNldWRvIiwicnVsZSIsInBhcnNlQ3NzT2JqZWN0IiwidHlwZSIsInNlbGVjdG9ycyIsInNlbGVjdG9yIiwidG9VaUF1dG9tYXRvclNlbGVjdG9yIiwiY3NzU2VsZWN0b3IiLCJjc3NPYmoiLCJwYXJzZSIsImUiLCJlcnJvcnMiLCJJbnZhbGlkU2VsZWN0b3JFcnJvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsWUFBWSxHQUFHLEVBQXJCO0FBRUEsTUFBTUMsTUFBTSxHQUFHLElBQUlDLG9DQUFKLEVBQWY7QUFDQUQsTUFBTSxDQUFDRSx1QkFBUCxDQUErQixLQUEvQjtBQUNBRixNQUFNLENBQUNHLHdCQUFQLENBQWdDLEdBQWhDLEVBQXFDLEdBQXJDLEVBQTBDLEdBQTFDO0FBQ0FILE1BQU0sQ0FBQ0ksd0JBQVAsQ0FBZ0MsR0FBaEMsRUFBcUMsR0FBckMsRUFBMEMsR0FBMUMsRUFBK0MsR0FBL0M7QUFDQUosTUFBTSxDQUFDSyxpQkFBUDtBQUVBLE1BQU1DLFdBQVcsR0FBRyxhQUFwQjtBQUNBLE1BQU1DLGtCQUFrQixHQUFHLHFDQUEzQjtBQUVBLE1BQU1DLGFBQWEsR0FBRyxDQUNwQixXQURvQixFQUNQLFNBRE8sRUFDSSxXQURKLEVBQ2lCLFNBRGpCLEVBQzRCLFdBRDVCLEVBRXBCLFNBRm9CLEVBRVQsZ0JBRlMsRUFFUyxZQUZULEVBRXVCLFVBRnZCLENBQXRCO0FBS0EsTUFBTUMsYUFBYSxHQUFHLENBQ3BCLE9BRG9CLEVBQ1gsVUFEVyxDQUF0QjtBQUlBLE1BQU1DLFNBQVMsR0FBRyxDQUNoQixhQURnQixFQUNESixXQURDLEVBQ1ksTUFEWixFQUNvQixZQURwQixFQUNrQyxjQURsQyxDQUFsQjtBQUlBLE1BQU1LLFNBQVMsR0FBRyxDQUNoQixHQUFHSCxhQURhLEVBRWhCLEdBQUdDLGFBRmEsRUFHaEIsR0FBR0MsU0FIYSxDQUFsQjtBQU1BLE1BQU1FLGlCQUFpQixHQUFHLENBQ3hCLENBQUNOLFdBQUQsRUFBYyxDQUFDLElBQUQsQ0FBZCxDQUR3QixFQUV4QixDQUFDLGFBQUQsRUFBZ0IsQ0FDZCxxQkFEYyxFQUNTLGNB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QUF3QkwsV0FBWSxlQUFjRyxDQUFFLEdBQXJGLENBQU47QUFDRDs7QUFDRCxNQUFJO0FBQ0YsV0FBT1IsY0FBYyxDQUFDTSxNQUFELENBQXJCO0FBQ0QsR0FGRCxDQUVFLE9BQU9FLENBQVAsRUFBVTtBQUNWLFVBQU0sSUFBSUMseUJBQU9DLG9CQUFYLENBQWlDLDZCQUE0QkwsV0FBWSxlQUFjRyxDQUFFLEdBQXpGLENBQU47QUFDRDtBQUNGLENBWkQ7O2VBY2V4RSxZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3NzU2VsZWN0b3JQYXJzZXIgfSBmcm9tICdjc3Mtc2VsZWN0b3ItcGFyc2VyJztcbmltcG9ydCB7IGVzY2FwZVJlZ0V4cCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0tYmFzZS1kcml2ZXInO1xuXG5jb25zdCBDc3NDb252ZXJ0ZXIgPSB7fTtcblxuY29uc3QgcGFyc2VyID0gbmV3IENzc1NlbGVjdG9yUGFyc2VyKCk7XG5wYXJzZXIucmVnaXN0ZXJTZWxlY3RvclBzZXVkb3MoJ2hhcycpO1xucGFyc2VyLnJlZ2lzdGVyTmVzdGluZ09wZXJhdG9ycygnPicsICcrJywgJ34nKTtcbnBhcnNlci5yZWdpc3RlckF0dHJFcXVhbGl0eU1vZHMoJ14nLCAnJCcsICcqJywgJ34nKTtcbnBhcnNlci5lbmFibGVTdWJzdGl0dXRlcygpO1xuXG5jb25zdCBSRVNPVVJDRV9JRCA9ICdyZXNvdXJjZS1pZCc7XG5jb25zdCBJRF9MT0NBVE9SX1BBVFRFUk4gPSAvXlthLXpBLVpfXVthLXpBLVowLTkuX10qOmlkXFwvW1xcU10rJC87XG5cbmNvbnN0IEJPT0xFQU5fQVRUUlMgPSBbXG4gICdjaGVja2FibGUnLCAnY2hlY2tlZCcsICdjbGlja2FibGUnLCAnZW5hYmxlZCcsICdmb2N1c2FibGUnLFxuICAnZm9jdXNlZCcsICdsb25nLWNsaWNrYWJsZScsICdzY3JvbGxhYmxlJywgJ3NlbGVjdGVkJyxcbl07XG5cbmNvbnN0IE5VTUVSSUNfQVRUUlMgPSBbXG4gICdpbmRleCcsICdpbnN0YW5jZScsXG5dO1xuXG5jb25zdCBTVFJfQVRUUlMgPSBbXG4gICdkZXNjcmlwdGlvbicsIFJFU09VUkNFX0lELCAndGV4dCcsICdjbGFzcy1uYW1lJywgJ3BhY2thZ2UtbmFtZSdcbl07XG5cbmNvbnN0IEFMTF9BVFRSUyA9IFtcbiAgLi4uQk9PTEVBTl9BVFRSUyxcbiAgLi4uTlVNRVJJQ19BVFRSUyxcbiAgLi4uU1RSX0FUVFJTLFxuXTtcblxuY29uc3QgQVRUUklCVVRFX0FMSUFTRVMgPSBbXG4gIFtSRVNPVVJDRV9JRCwgWydpZCddXSxcbiAgWydkZXNjcmlwdGlvbicsIFtcbiAgICAnY29udGVudC1kZXNjcmlwdGlvbicsICdjb250ZW50LWRlc2MnLFxuICAgICdkZXNjJywgJ2FjY2Vzc2liaWxpdHktaWQnLFxuICBdXSxcbiAgWydpbmRleCcsIFsnbnRoLWNoaWxkJ11dLFxuXTtcblxuLyoqXG4gKiBDb252ZXJ0IGh5cGhlbiBzZXBhcmF0ZWQgd29yZCB0byBzbmFrZSBjYXNlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGh5cGhlbiBzZXBhcmF0ZWQgd29yZCB0cmFuc2xhdGVkIHRvIHNuYWtlIGNhc2VcbiAqL1xuZnVuY3Rpb24gdG9TbmFrZUNhc2UgKHN0cikge1xuICBpZiAoIXN0cikge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCB0b2tlbnMgPSBzdHIuc3BsaXQoJy0nKS5tYXAoKHN0cikgPT4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCkpO1xuICBjb25zdCBvdXQgPSB0b2tlbnMuam9pbignJyk7XG4gIHJldHVybiBvdXQuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBvdXQuc2xpY2UoMSk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ3NzTmFtZVZhbHVlT2JqZWN0XG4gKiBAcHJvcGVydHkgez9uYW1lfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBDU1Mgb2JqZWN0XG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgQ1NTIG9iamVjdFxuICovXG5cbi8qKlxuICogR2V0IHRoZSBib29sZWFuIGZyb20gYSBDU1Mgb2JqZWN0LiBJZiBlbXB0eSwgcmV0dXJuIHRydWUuIElmIG5vdCB0cnVlL2ZhbHNlL2VtcHR5LCB0aHJvdyBleGNlcHRpb25cbiAqXG4gKiBAcGFyYW0ge0Nzc05hbWVWYWx1ZU9iamVjdH0gY3NzIEEgQ1NTIG9iamVjdCB0aGF0IGhhcyAnbmFtZScgYW5kICd2YWx1ZSdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEVpdGhlciAndHJ1ZScgb3IgJ2ZhbHNlJy4gSWYgdmFsdWUgaXMgZW1wdHksIHJldHVybiAndHJ1ZSdcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0R2V0Qm9vbCAoY3NzKSB7XG4gIGNvbnN0IHZhbCA9IGNzcy52YWx1ZT8udG9Mb3dlckNhc2UoKSB8fCAndHJ1ZSc7IC8vIGFuIG9taXR0ZWQgYm9vbGVhbiBhdHRyaWJ1dGUgbWVhbnMgJ3RydWUnIChlLmcuOiBpbnB1dFtjaGVja2VkXSBtZWFucyBjaGVja2VkIGlzIHRydWUpXG4gIGlmIChbJ3RydWUnLCAnZmFsc2UnXS5pbmNsdWRlcyh2YWwpKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYCcke2Nzcy5uYW1lfScgbXVzdCBiZSB0cnVlLCBmYWxzZSBvciBlbXB0eS4gRm91bmQgJyR7Y3NzLnZhbHVlfSdgKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGNhbm9uaWNhbCBmb3JtIG9mIGEgQ1NTIGF0dHJpYnV0ZSBuYW1lXG4gKlxuICogQ29udmVydHMgdG8gbG93ZXJjYXNlIGFuZCBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBpcyBhbiBhbGlhcyBmb3Igc29tZXRoaW5nIGVsc2UsIHJldHVyblxuICogd2hhdCBpdCBpcyBhbiBhbGlhcyBmb3JcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3NzIENTUyBvYmplY3RcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjYW5vbmljYWwgYXR0cmlidXRlIG5hbWVcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0R2V0QXR0ck5hbWUgKGNzcykge1xuICBjb25zdCBhdHRyTmFtZSA9IGNzcy5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gQ2hlY2sgaWYgaXQncyBzdXBwb3J0ZWQgYW5kIGlmIGl0IGlzLCByZXR1cm4gaXRcbiAgaWYgKEFMTF9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICByZXR1cm4gYXR0ck5hbWUudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIC8vIElmIGF0dHJOYW1lIGlzIGFuIGFsaWFzIGZvciBzb21ldGhpbmcgZWxzZSwgcmV0dXJuIHRoYXRcbiAgZm9yIChjb25zdCBbb2ZmaWNpYWxBdHRyLCBhbGlhc0F0dHJzXSBvZiBBVFRSSUJVVEVfQUxJQVNFUykge1xuICAgIGlmIChhbGlhc0F0dHJzLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgICAgcmV0dXJuIG9mZmljaWFsQXR0cjtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGAnJHthdHRyTmFtZX0nIGlzIG5vdCBhIHZhbGlkIGF0dHJpYnV0ZS4gYCArXG4gICAgYFN1cHBvcnRlZCBhdHRyaWJ1dGVzIGFyZSAnJHtBTExfQVRUUlMuam9pbignLCAnKX0nYCk7XG59XG5cbi8qKlxuICogR2V0IGEgcmVnZXggdGhhdCBtYXRjaGVzIGEgd2hvbGUgd29yZC4gRm9yIHRoZSB+PSBDU1MgYXR0cmlidXRlIHNlbGVjdG9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB3b3JkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBIHJlZ2V4IFwid29yZFwiIG1hdGNoZXJcbiAqL1xuZnVuY3Rpb24gZ2V0V29yZE1hdGNoZXJSZWdleCAod29yZCkge1xuICByZXR1cm4gYFxcXFxiKFxcXFx3KiR7ZXNjYXBlUmVnRXhwKHdvcmQpfVxcXFx3KilcXFxcYmA7XG59XG5cbi8qKlxuICogQWRkIGFuZHJvaWQ6aWQvIHRvIGJlZ2lubmluZyBvZiBzdHJpbmcgaWYgaXQncyBub3QgdGhlcmUgYWxyZWFkeVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdG9yIFRoZSBpbml0aWFsIGxvY2F0b3JcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFN0cmluZyB3aXRoIGBhbmRyb2lkOmlkL2AgcHJlcGVuZGVkIChpZiBpdCB3YXNuJ3QgYWxyZWFkeSlcbiAqL1xuZnVuY3Rpb24gZm9ybWF0SWRMb2NhdG9yIChsb2NhdG9yKSB7XG4gIHJldHVybiBJRF9MT0NBVE9SX1BBVFRFUk4udGVzdChsb2NhdG9yKSA/IGxvY2F0b3IgOiBgYW5kcm9pZDppZC8ke2xvY2F0b3J9YDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NBdHRyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlVHlwZSBUeXBlIG9mIGF0dHJpYnV0ZSAobXVzdCBiZSBzdHJpbmcgb3IgZW1wdHkpXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gb3BlcmF0b3IgVGhlIG9wZXJhdG9yIGJldHdlZW4gdmFsdWUgYW5kIHZhbHVlIHR5cGUgKD0sICo9LCAsIF49LCAkPSlcbiAqL1xuXG4vKipcbiAqIENvbnZlcnQgYSBDU1MgYXR0cmlidXRlIGludG8gYSBVaVNlbGVjdG9yIG1ldGhvZCBjYWxsXG4gKlxuICogQHBhcmFtIHtDc3NBdHRyfSBjc3NBdHRyIENTUyBhdHRyaWJ1dGUgb2JqZWN0XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBDU1MgYXR0cmlidXRlIHBhcnNlZCBhcyBVaVNlbGVjdG9yXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQXR0ciAoY3NzQXR0cikge1xuICBpZiAoY3NzQXR0ci52YWx1ZVR5cGUgJiYgY3NzQXR0ci52YWx1ZVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHtjc3NBdHRyLm5hbWV9PSR7Y3NzQXR0ci52YWx1ZX0nIGlzIGFuIGludmFsaWQgYXR0cmlidXRlLiBgICtcbiAgICAgIGBPbmx5ICdzdHJpbmcnIGFuZCBlbXB0eSBhdHRyaWJ1dGUgdHlwZXMgYXJlIHN1cHBvcnRlZC4gRm91bmQgJyR7Y3NzQXR0ci52YWx1ZVR5cGV9J2ApO1xuICB9XG4gIGNvbnN0IGF0dHJOYW1lID0gYXNzZXJ0R2V0QXR0ck5hbWUoY3NzQXR0cik7XG4gIGNvbnN0IG1ldGhvZE5hbWUgPSB0b1NuYWtlQ2FzZShhdHRyTmFtZSk7XG5cbiAgLy8gVmFsaWRhdGUgdGhhdCBpdCdzIGEgc3VwcG9ydGVkIGF0dHJpYnV0ZVxuICBpZiAoIVNUUl9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkgJiYgIUJPT0xFQU5fQVRUUlMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHthdHRyTmFtZX0nIGlzIG5vdCBzdXBwb3J0ZWQuIFN1cHBvcnRlZCBhdHRyaWJ1dGVzIGFyZSBgICtcbiAgICAgIGAnJHtbLi4uU1RSX0FUVFJTLCAuLi5CT09MRUFOX0FUVFJTXS5qb2luKCcsICcpfSdgKTtcbiAgfVxuXG4gIC8vIFBhcnNlIGJvb2xlYW4sIGlmIGl0J3MgYSBib29sZWFuIGF0dHJpYnV0ZVxuICBpZiAoQk9PTEVBTl9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9KCR7YXNzZXJ0R2V0Qm9vbChjc3NBdHRyKX0pYDtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSBwYXJzZSBhcyBzdHJpbmdcbiAgbGV0IHZhbHVlID0gY3NzQXR0ci52YWx1ZSB8fCAnJztcbiAgaWYgKGF0dHJOYW1lID09PSBSRVNPVVJDRV9JRCkge1xuICAgIHZhbHVlID0gZm9ybWF0SWRMb2NhdG9yKHZhbHVlKTtcbiAgfVxuICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCJcIilgO1xuICB9XG5cbiAgc3dpdGNoIChjc3NBdHRyLm9wZXJhdG9yKSB7XG4gICAgY2FzZSAnPSc6XG4gICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9KFwiJHt2YWx1ZX1cIilgO1xuICAgIGNhc2UgJyo9JzpcbiAgICAgIGlmIChbJ2Rlc2NyaXB0aW9uJywgJ3RleHQnXS5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfUNvbnRhaW5zKFwiJHt2YWx1ZX1cIilgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2VzY2FwZVJlZ0V4cCh2YWx1ZSl9XCIpYDtcbiAgICBjYXNlICdePSc6XG4gICAgICBpZiAoWydkZXNjcmlwdGlvbicsICd0ZXh0J10uaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1TdGFydHNXaXRoKFwiJHt2YWx1ZX1cIilgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCJeJHtlc2NhcGVSZWdFeHAodmFsdWUpfVwiKWA7XG4gICAgY2FzZSAnJD0nOlxuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2VzY2FwZVJlZ0V4cCh2YWx1ZSl9JFwiKWA7XG4gICAgY2FzZSAnfj0nOlxuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2dldFdvcmRNYXRjaGVyUmVnZXgodmFsdWUpfVwiKWA7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIFVucmVhY2hhYmxlLCBidXQgYWRkaW5nIGVycm9yIGluIGNhc2UgYSBuZXcgQ1NTIGF0dHJpYnV0ZSBpcyBhZGRlZC5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgQ1NTIGF0dHJpYnV0ZSBvcGVyYXRvciAnJHtjc3NBdHRyLm9wZXJhdG9yfScuIGAgK1xuICAgICAgICBgICc9JywgJyo9JywgJ149JywgJyQ9JyBhbmQgJ349JyBhcmUgc3VwcG9ydGVkLmApO1xuICB9XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ3NzUHNldWRvXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlVHlwZSBUaGUgdHlwZSBvZiBDU1MgcHNldWRvIHNlbGVjdG9yIChodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9jc3Mtc2VsZWN0b3ItcGFyc2VyIGZvciByZWZlcmVuY2UpXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHBzZXVkbyBzZWxlY3RvclxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHBzZXVkbyBzZWxlY3RvclxuICovXG5cbi8qKlxuICogQ29udmVydCBhIENTUyBwc2V1ZG8gY2xhc3MgdG8gYSBVaVNlbGVjdG9yXG4gKlxuICogQHBhcmFtIHtDc3NQc2V1ZG99IGNzc1BzZXVkbyBDU1MgUHNldWRvIGNsYXNzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBQc2V1ZG8gc2VsZWN0b3IgcGFyc2VkIGFzIFVpU2VsZWN0b3JcbiAqL1xuZnVuY3Rpb24gcGFyc2VQc2V1ZG8gKGNzc1BzZXVkbykge1xuICBpZiAoY3NzUHNldWRvLnZhbHVlVHlwZSAmJiBjc3NQc2V1ZG8udmFsdWVUeXBlICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzUHNldWRvLm5hbWV9PSR7Y3NzUHNldWRvLnZhbHVlfScuIGAgK1xuICAgICAgYFVuc3VwcG9ydGVkIGNzcyBwc2V1ZG8gY2xhc3MgdmFsdWUgdHlwZTogJyR7Y3NzUHNldWRvLnZhbHVlVHlwZX0nLiBPbmx5ICdzdHJpbmcnIHR5cGUgb3IgZW1wdHkgaXMgc3VwcG9ydGVkLmApO1xuICB9XG5cbiAgY29uc3QgcHNldWRvTmFtZSA9IGFzc2VydEdldEF0dHJOYW1lKGNzc1BzZXVkbyk7XG5cbiAgaWYgKEJPT0xFQU5fQVRUUlMuaW5jbHVkZXMocHNldWRvTmFtZSkpIHtcbiAgICByZXR1cm4gYC4ke3RvU25ha2VDYXNlKHBzZXVkb05hbWUpfSgke2Fzc2VydEdldEJvb2woY3NzUHNldWRvKX0pYDtcbiAgfVxuXG4gIGlmIChOVU1FUklDX0FUVFJTLmluY2x1ZGVzKHBzZXVkb05hbWUpKSB7XG4gICAgcmV0dXJuIGAuJHtwc2V1ZG9OYW1lfSgke2Nzc1BzZXVkby52YWx1ZX0pYDtcbiAgfVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENzc1J1bGVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbmVzdGluZ09wZXJhdG9yIFRoZSBuZXN0aW5nIG9wZXJhdG9yIChha2E6IGNvbWJpbmF0b3IgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMpXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHRhZ05hbWUgVGhlIHRhZyBuYW1lIChha2E6IHR5cGUgc2VsZWN0b3IgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL1R5cGVfc2VsZWN0b3JzKVxuICogQHByb3BlcnR5IHs/c3RyaW5nW119IGNsYXNzTmFtZXMgQW4gYXJyYXkgb2YgQ1NTIGNsYXNzIG5hbWVzXG4gKiBAcHJvcGVydHkgez9Dc3NBdHRyW119IGF0dHJzIEFuIGFycmF5IG9mIENTUyBhdHRyaWJ1dGVzXG4gKiBAcHJvcGVydHkgez9Dc3NQc2V1ZG9bXX0gYXR0cnMgQW4gYXJyYXkgb2YgQ1NTIHBzZXVkb3NcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaWQgQ1NTIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7P0Nzc1J1bGV9IHJ1bGUgQSBkZXNjZW5kYW50IG9mIHRoaXMgQ1NTIHJ1bGVcbiAqL1xuXG4vKipcbiAqIENvbnZlcnQgYSBDU1MgcnVsZSB0byBhIFVpU2VsZWN0b3JcbiAqIEBwYXJhbSB7Q3NzUnVsZX0gY3NzUnVsZSBDU1MgcnVsZSBkZWZpbml0aW9uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ3NzUnVsZSAoY3NzUnVsZSkge1xuICBjb25zdCB7IG5lc3RpbmdPcGVyYXRvciB9ID0gY3NzUnVsZTtcbiAgaWYgKG5lc3RpbmdPcGVyYXRvciAmJiBuZXN0aW5nT3BlcmF0b3IgIT09ICcgJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7bmVzdGluZ09wZXJhdG9yfScgaXMgbm90IGEgc3VwcG9ydGVkIGNvbWJpbmF0b3IuIGAgK1xuICAgICAgYE9ubHkgY2hpbGQgY29tYmluYXRvciAoPikgYW5kIGRlc2NlbmRhbnQgY29tYmluYXRvciBhcmUgc3VwcG9ydGVkLmApO1xuICB9XG5cbiAgbGV0IHVpQXV0b21hdG9yU2VsZWN0b3IgPSAnbmV3IFVpU2VsZWN0b3IoKSc7XG4gIGlmIChjc3NSdWxlLnRhZ05hbWUgJiYgY3NzUnVsZS50YWdOYW1lICE9PSAnKicpIHtcbiAgICBsZXQgYW5kcm9pZENsYXNzID0gW2Nzc1J1bGUudGFnTmFtZV07XG4gICAgaWYgKGNzc1J1bGUuY2xhc3NOYW1lcykge1xuICAgICAgZm9yIChjb25zdCBjc3NDbGFzc05hbWVzIG9mIGNzc1J1bGUuY2xhc3NOYW1lcykge1xuICAgICAgICBhbmRyb2lkQ2xhc3MucHVzaChjc3NDbGFzc05hbWVzKTtcbiAgICAgIH1cbiAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5jbGFzc05hbWUoXCIke2FuZHJvaWRDbGFzcy5qb2luKCcuJyl9XCIpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNsYXNzTmFtZU1hdGNoZXMoXCIke2Nzc1J1bGUudGFnTmFtZX1cIilgO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjc3NSdWxlLmNsYXNzTmFtZXMpIHtcbiAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IGAuY2xhc3NOYW1lTWF0Y2hlcyhcIiR7Y3NzUnVsZS5jbGFzc05hbWVzLmpvaW4oJ1xcXFwuJyl9XCIpYDtcbiAgfVxuICBpZiAoY3NzUnVsZS5pZCkge1xuICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5yZXNvdXJjZUlkKFwiJHtmb3JtYXRJZExvY2F0b3IoY3NzUnVsZS5pZCl9XCIpYDtcbiAgfVxuICBpZiAoY3NzUnVsZS5hdHRycykge1xuICAgIGZvciAoY29uc3QgYXR0ciBvZiBjc3NSdWxlLmF0dHJzKSB7XG4gICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IHBhcnNlQXR0cihhdHRyKTtcbiAgICB9XG4gIH1cbiAgaWYgKGNzc1J1bGUucHNldWRvcykge1xuICAgIGZvciAoY29uc3QgcHNldWRvIG9mIGNzc1J1bGUucHNldWRvcykge1xuICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBwYXJzZVBzZXVkbyhwc2V1ZG8pO1xuICAgIH1cbiAgfVxuICBpZiAoY3NzUnVsZS5ydWxlKSB7XG4gICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNoaWxkU2VsZWN0b3IoJHtwYXJzZUNzc1J1bGUoY3NzUnVsZS5ydWxlKX0pYDtcbiAgfVxuICByZXR1cm4gdWlBdXRvbWF0b3JTZWxlY3Rvcjtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NPYmplY3RcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdHlwZSBUeXBlIG9mIENTUyBvYmplY3QuICdydWxlJywgJ3J1bGVzZXQnIG9yICdzZWxlY3RvcnMnXG4gKi9cblxuLyoqXG4gKiBDb252ZXJ0IENTUyBvYmplY3QgdG8gVWlBdXRvbWF0b3IyIHNlbGVjdG9yXG4gKiBAcGFyYW0ge0Nzc09iamVjdH0gY3NzIENTUyBvYmplY3RcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Mgb2JqZWN0IHBhcnNlZCBhcyBhIFVpU2VsZWN0b3JcbiAqL1xuZnVuY3Rpb24gcGFyc2VDc3NPYmplY3QgKGNzcykge1xuICBzd2l0Y2ggKGNzcy50eXBlKSB7XG4gICAgY2FzZSAncnVsZSc6XG4gICAgICByZXR1cm4gcGFyc2VDc3NSdWxlKGNzcyk7XG4gICAgY2FzZSAncnVsZVNldCc6XG4gICAgICByZXR1cm4gcGFyc2VDc3NPYmplY3QoY3NzLnJ1bGUpO1xuICAgIGNhc2UgJ3NlbGVjdG9ycyc6XG4gICAgICByZXR1cm4gY3NzLnNlbGVjdG9ycy5tYXAoKHNlbGVjdG9yKSA9PiBwYXJzZUNzc09iamVjdChzZWxlY3RvcikpLmpvaW4oJzsgJyk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gVGhpcyBpcyBuZXZlciByZWFjaGFibGUsIGJ1dCBpZiBpdCBldmVyIGlzIGRvIHRoaXMuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVpQXV0b21hdG9yIGRvZXMgbm90IHN1cHBvcnQgJyR7Y3NzLnR5cGV9JyBjc3MuIE9ubHkgc3VwcG9ydHMgJ3J1bGUnLCAncnVsZVNldCcsICdzZWxlY3RvcnMnIGApO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBhIENTUyBzZWxlY3RvciB0byBhIFVpQXV0b21hdG9yMiBzZWxlY3RvclxuICogQHBhcmFtIHtzdHJpbmd9IGNzc1NlbGVjdG9yIENTUyBTZWxlY3RvclxuICogQHJldHVybnMge3N0cmluZ30gVGhlIENTUyBzZWxlY3RvciBjb252ZXJ0ZWQgdG8gYSBVaVNlbGVjdG9yXG4gKi9cbkNzc0NvbnZlcnRlci50b1VpQXV0b21hdG9yU2VsZWN0b3IgPSBmdW5jdGlvbiB0b1VpQXV0b21hdG9yU2VsZWN0b3IgKGNzc1NlbGVjdG9yKSB7XG4gIGxldCBjc3NPYmo7XG4gIHRyeSB7XG4gICAgY3NzT2JqID0gcGFyc2VyLnBhcnNlKGNzc1NlbGVjdG9yKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFNlbGVjdG9yRXJyb3IoYEludmFsaWQgQ1NTIHNlbGVjdG9yICcke2Nzc1NlbGVjdG9yfScuIFJlYXNvbjogJyR7ZX0nYCk7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2VDc3NPYmplY3QoY3NzT2JqKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFNlbGVjdG9yRXJyb3IoYFVuc3VwcG9ydGVkIENTUyBzZWxlY3RvciAnJHtjc3NTZWxlY3Rvcn0nLiBSZWFzb246ICcke2V9J2ApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBDc3NDb252ZXJ0ZXI7Il0sImZpbGUiOiJsaWIvY3NzLWNvbnZlcnRlci5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
|
240
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jc3MtY29udmVydGVyLmpzIl0sIm5hbWVzIjpbInBhcnNlciIsIkNzc1NlbGVjdG9yUGFyc2VyIiwicmVnaXN0ZXJTZWxlY3RvclBzZXVkb3MiLCJyZWdpc3Rlck5lc3RpbmdPcGVyYXRvcnMiLCJyZWdpc3RlckF0dHJFcXVhbGl0eU1vZHMiLCJlbmFibGVTdWJzdGl0dXRlcyIsIlJFU09VUkNFX0lEIiwiSURfTE9DQVRPUl9QQVRURVJOIiwiQk9PTEVBTl9BVFRSUyIsIk5VTUVSSUNfQVRUUlMiLCJTVFJfQVRUUlMiLCJBTExfQVRUUlMiLCJBVFRSSUJVVEVfQUxJQVNFUyIsInRvU25ha2VDYXNlIiwic3RyIiwidG9rZW5zIiwic3BsaXQiLCJtYXAiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwidG9Mb3dlckNhc2UiLCJvdXQiLCJqb2luIiwiYXNzZXJ0R2V0Qm9vbCIsImNzcyIsInZhbCIsInZhbHVlIiwiaW5jbHVkZXMiLCJFcnJvciIsIm5hbWUiLCJhc3NlcnRHZXRBdHRyTmFtZSIsImF0dHJOYW1lIiwib2ZmaWNpYWxBdHRyIiwiYWxpYXNBdHRycyIsImdldFdvcmRNYXRjaGVyUmVnZXgiLCJ3b3JkIiwiQ3NzQ29udmVydGVyIiwiY29uc3RydWN0b3IiLCJzZWxlY3RvciIsInBrZyIsImZvcm1hdElkTG9jYXRvciIsImxvY2F0b3IiLCJ0ZXN0IiwicGFyc2VBdHRyIiwiY3NzQXR0ciIsInZhbHVlVHlwZSIsIm1ldGhvZE5hbWUiLCJvcGVyYXRvciIsInBhcnNlUHNldWRvIiwiY3NzUHNldWRvIiwicHNldWRvTmFtZSIsInBhcnNlQ3NzUnVsZSIsImNzc1J1bGUiLCJuZXN0aW5nT3BlcmF0b3IiLCJ1aUF1dG9tYXRvclNlbGVjdG9yIiwidGFnTmFtZSIsImFuZHJvaWRDbGFzcyIsImNsYXNzTmFtZXMiLCJjc3NDbGFzc05hbWVzIiwicHVzaCIsImlkIiwiYXR0cnMiLCJhdHRyIiwicHNldWRvcyIsInBzZXVkbyIsInJ1bGUiLCJwYXJzZUNzc09iamVjdCIsInR5cGUiLCJzZWxlY3RvcnMiLCJ0b1VpQXV0b21hdG9yU2VsZWN0b3IiLCJjc3NPYmoiLCJwYXJzZSIsImUiLCJlcnJvcnMiLCJJbnZhbGlkU2VsZWN0b3JFcnJvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsTUFBTSxHQUFHLElBQUlDLG9DQUFKLEVBQWY7QUFDQUQsTUFBTSxDQUFDRSx1QkFBUCxDQUErQixLQUEvQjtBQUNBRixNQUFNLENBQUNHLHdCQUFQLENBQWdDLEdBQWhDLEVBQXFDLEdBQXJDLEVBQTBDLEdBQTFDO0FBQ0FILE1BQU0sQ0FBQ0ksd0JBQVAsQ0FBZ0MsR0FBaEMsRUFBcUMsR0FBckMsRUFBMEMsR0FBMUMsRUFBK0MsR0FBL0M7QUFDQUosTUFBTSxDQUFDSyxpQkFBUDtBQUVBLE1BQU1DLFdBQVcsR0FBRyxhQUFwQjtBQUNBLE1BQU1DLGtCQUFrQixHQUFHLHFDQUEzQjtBQUVBLE1BQU1DLGFBQWEsR0FBRyxDQUNwQixXQURvQixFQUNQLFNBRE8sRUFDSSxXQURKLEVBQ2lCLFNBRGpCLEVBQzRCLFdBRDVCLEVBRXBCLFNBRm9CLEVBRVQsZ0JBRlMsRUFFUyxZQUZULEVBRXVCLFVBRnZCLENBQXRCO0FBS0EsTUFBTUMsYUFBYSxHQUFHLENBQ3BCLE9BRG9CLEVBQ1gsVUFEVyxDQUF0QjtBQUlBLE1BQU1DLFNBQVMsR0FBRyxDQUNoQixhQURnQixFQUNESixXQURDLEVBQ1ksTUFEWixFQUNvQixZQURwQixFQUNrQyxjQURsQyxDQUFsQjtBQUlBLE1BQU1LLFNBQVMsR0FBRyxDQUNoQixHQUFHSCxhQURhLEVBRWhCLEdBQUdDLGFBRmEsRUFHaEIsR0FBR0MsU0FIYSxDQUFsQjtBQU1BLE1BQU1FLGlCQUFpQixHQUFHLENBQ3hCLENBQUNOLFdBQUQsRUFBYyxDQUFDLElBQUQsQ0FBZCxDQUR3QixFQUV4QixDQUFDLGFBQUQsRUFBZ0IsQ0FDZCxxQkFEYyxFQUNTLGNBRFQsRUFFZCxNQUZjLEVBRU4sa0JB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QUN2QixRQUFJQyxNQUFKOztBQUNBLFFBQUk7QUFDRkEsTUFBQUEsTUFBTSxHQUFHdkUsTUFBTSxDQUFDd0UsS0FBUCxDQUFhLEtBQUtqQyxRQUFsQixDQUFUO0FBQ0QsS0FGRCxDQUVFLE9BQU9rQyxDQUFQLEVBQVU7QUFDVixZQUFNLElBQUlDLHlCQUFPQyxvQkFBWCxDQUFpQyx5QkFBd0IsS0FBS3BDLFFBQVMsZUFBY2tDLENBQUUsR0FBdkYsQ0FBTjtBQUNEOztBQUNELFFBQUk7QUFDRixhQUFPLEtBQUtOLGNBQUwsQ0FBb0JJLE1BQXBCLENBQVA7QUFDRCxLQUZELENBRUUsT0FBT0UsQ0FBUCxFQUFVO0FBQ1YsWUFBTSxJQUFJQyx5QkFBT0Msb0JBQVgsQ0FBaUMsNkJBQTRCLEtBQUtwQyxRQUFTLGVBQWNrQyxDQUFFLEdBQTNGLENBQU47QUFDRDtBQUNGOztBQXJMZ0I7O2VBd0xKcEMsWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENzc1NlbGVjdG9yUGFyc2VyIH0gZnJvbSAnY3NzLXNlbGVjdG9yLXBhcnNlcic7XG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtLWJhc2UtZHJpdmVyJztcblxuY29uc3QgcGFyc2VyID0gbmV3IENzc1NlbGVjdG9yUGFyc2VyKCk7XG5wYXJzZXIucmVnaXN0ZXJTZWxlY3RvclBzZXVkb3MoJ2hhcycpO1xucGFyc2VyLnJlZ2lzdGVyTmVzdGluZ09wZXJhdG9ycygnPicsICcrJywgJ34nKTtcbnBhcnNlci5yZWdpc3RlckF0dHJFcXVhbGl0eU1vZHMoJ14nLCAnJCcsICcqJywgJ34nKTtcbnBhcnNlci5lbmFibGVTdWJzdGl0dXRlcygpO1xuXG5jb25zdCBSRVNPVVJDRV9JRCA9ICdyZXNvdXJjZS1pZCc7XG5jb25zdCBJRF9MT0NBVE9SX1BBVFRFUk4gPSAvXlthLXpBLVpfXVthLXpBLVowLTkuX10qOmlkXFwvW1xcU10rJC87XG5cbmNvbnN0IEJPT0xFQU5fQVRUUlMgPSBbXG4gICdjaGVja2FibGUnLCAnY2hlY2tlZCcsICdjbGlja2FibGUnLCAnZW5hYmxlZCcsICdmb2N1c2FibGUnLFxuICAnZm9jdXNlZCcsICdsb25nLWNsaWNrYWJsZScsICdzY3JvbGxhYmxlJywgJ3NlbGVjdGVkJyxcbl07XG5cbmNvbnN0IE5VTUVSSUNfQVRUUlMgPSBbXG4gICdpbmRleCcsICdpbnN0YW5jZScsXG5dO1xuXG5jb25zdCBTVFJfQVRUUlMgPSBbXG4gICdkZXNjcmlwdGlvbicsIFJFU09VUkNFX0lELCAndGV4dCcsICdjbGFzcy1uYW1lJywgJ3BhY2thZ2UtbmFtZSdcbl07XG5cbmNvbnN0IEFMTF9BVFRSUyA9IFtcbiAgLi4uQk9PTEVBTl9BVFRSUyxcbiAgLi4uTlVNRVJJQ19BVFRSUyxcbiAgLi4uU1RSX0FUVFJTLFxuXTtcblxuY29uc3QgQVRUUklCVVRFX0FMSUFTRVMgPSBbXG4gIFtSRVNPVVJDRV9JRCwgWydpZCddXSxcbiAgWydkZXNjcmlwdGlvbicsIFtcbiAgICAnY29udGVudC1kZXNjcmlwdGlvbicsICdjb250ZW50LWRlc2MnLFxuICAgICdkZXNjJywgJ2FjY2Vzc2liaWxpdHktaWQnLFxuICBdXSxcbiAgWydpbmRleCcsIFsnbnRoLWNoaWxkJ11dLFxuXTtcblxuLyoqXG4gKiBDb252ZXJ0IGh5cGhlbiBzZXBhcmF0ZWQgd29yZCB0byBzbmFrZSBjYXNlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGh5cGhlbiBzZXBhcmF0ZWQgd29yZCB0cmFuc2xhdGVkIHRvIHNuYWtlIGNhc2VcbiAqL1xuZnVuY3Rpb24gdG9TbmFrZUNhc2UgKHN0cikge1xuICBpZiAoIXN0cikge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCB0b2tlbnMgPSBzdHIuc3BsaXQoJy0nKS5tYXAoKHN0cikgPT4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCkpO1xuICBjb25zdCBvdXQgPSB0b2tlbnMuam9pbignJyk7XG4gIHJldHVybiBvdXQuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBvdXQuc2xpY2UoMSk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ3NzTmFtZVZhbHVlT2JqZWN0XG4gKiBAcHJvcGVydHkgez9uYW1lfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBDU1Mgb2JqZWN0XG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgQ1NTIG9iamVjdFxuICovXG5cbi8qKlxuICogR2V0IHRoZSBib29sZWFuIGZyb20gYSBDU1Mgb2JqZWN0LiBJZiBlbXB0eSwgcmV0dXJuIHRydWUuIElmIG5vdCB0cnVlL2ZhbHNlL2VtcHR5LCB0aHJvdyBleGNlcHRpb25cbiAqXG4gKiBAcGFyYW0ge0Nzc05hbWVWYWx1ZU9iamVjdH0gY3NzIEEgQ1NTIG9iamVjdCB0aGF0IGhhcyAnbmFtZScgYW5kICd2YWx1ZSdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEVpdGhlciAndHJ1ZScgb3IgJ2ZhbHNlJy4gSWYgdmFsdWUgaXMgZW1wdHksIHJldHVybiAndHJ1ZSdcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0R2V0Qm9vbCAoY3NzKSB7XG4gIGNvbnN0IHZhbCA9IGNzcy52YWx1ZT8udG9Mb3dlckNhc2UoKSB8fCAndHJ1ZSc7IC8vIGFuIG9taXR0ZWQgYm9vbGVhbiBhdHRyaWJ1dGUgbWVhbnMgJ3RydWUnIChlLmcuOiBpbnB1dFtjaGVja2VkXSBtZWFucyBjaGVja2VkIGlzIHRydWUpXG4gIGlmIChbJ3RydWUnLCAnZmFsc2UnXS5pbmNsdWRlcyh2YWwpKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYCcke2Nzcy5uYW1lfScgbXVzdCBiZSB0cnVlLCBmYWxzZSBvciBlbXB0eS4gRm91bmQgJyR7Y3NzLnZhbHVlfSdgKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGNhbm9uaWNhbCBmb3JtIG9mIGEgQ1NTIGF0dHJpYnV0ZSBuYW1lXG4gKlxuICogQ29udmVydHMgdG8gbG93ZXJjYXNlIGFuZCBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBpcyBhbiBhbGlhcyBmb3Igc29tZXRoaW5nIGVsc2UsIHJldHVyblxuICogd2hhdCBpdCBpcyBhbiBhbGlhcyBmb3JcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3NzIENTUyBvYmplY3RcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjYW5vbmljYWwgYXR0cmlidXRlIG5hbWVcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0R2V0QXR0ck5hbWUgKGNzcykge1xuICBjb25zdCBhdHRyTmFtZSA9IGNzcy5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gQ2hlY2sgaWYgaXQncyBzdXBwb3J0ZWQgYW5kIGlmIGl0IGlzLCByZXR1cm4gaXRcbiAgaWYgKEFMTF9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICByZXR1cm4gYXR0ck5hbWUudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIC8vIElmIGF0dHJOYW1lIGlzIGFuIGFsaWFzIGZvciBzb21ldGhpbmcgZWxzZSwgcmV0dXJuIHRoYXRcbiAgZm9yIChjb25zdCBbb2ZmaWNpYWxBdHRyLCBhbGlhc0F0dHJzXSBvZiBBVFRSSUJVVEVfQUxJQVNFUykge1xuICAgIGlmIChhbGlhc0F0dHJzLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgICAgcmV0dXJuIG9mZmljaWFsQXR0cjtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGAnJHthdHRyTmFtZX0nIGlzIG5vdCBhIHZhbGlkIGF0dHJpYnV0ZS4gYCArXG4gICAgYFN1cHBvcnRlZCBhdHRyaWJ1dGVzIGFyZSAnJHtBTExfQVRUUlMuam9pbignLCAnKX0nYCk7XG59XG5cbi8qKlxuICogR2V0IGEgcmVnZXggdGhhdCBtYXRjaGVzIGEgd2hvbGUgd29yZC4gRm9yIHRoZSB+PSBDU1MgYXR0cmlidXRlIHNlbGVjdG9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB3b3JkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBIHJlZ2V4IFwid29yZFwiIG1hdGNoZXJcbiAqL1xuZnVuY3Rpb24gZ2V0V29yZE1hdGNoZXJSZWdleCAod29yZCkge1xuICByZXR1cm4gYFxcXFxiKFxcXFx3KiR7ZXNjYXBlUmVnRXhwKHdvcmQpfVxcXFx3KilcXFxcYmA7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ3NzQXR0clxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB2YWx1ZVR5cGUgVHlwZSBvZiBhdHRyaWJ1dGUgKG11c3QgYmUgc3RyaW5nIG9yIGVtcHR5KVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB2YWx1ZSBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG9wZXJhdG9yIFRoZSBvcGVyYXRvciBiZXR3ZWVuIHZhbHVlIGFuZCB2YWx1ZSB0eXBlICg9LCAqPSwgLCBePSwgJD0pXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NSdWxlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG5lc3RpbmdPcGVyYXRvciBUaGUgbmVzdGluZyBvcGVyYXRvciAoYWthOiBjb21iaW5hdG9yIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfU2VsZWN0b3JzKVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB0YWdOYW1lIFRoZSB0YWcgbmFtZSAoYWthOiB0eXBlIHNlbGVjdG9yIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9UeXBlX3NlbGVjdG9ycylcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ1tdfSBjbGFzc05hbWVzIEFuIGFycmF5IG9mIENTUyBjbGFzcyBuYW1lc1xuICogQHByb3BlcnR5IHs/Q3NzQXR0cltdfSBhdHRycyBBbiBhcnJheSBvZiBDU1MgYXR0cmlidXRlc1xuICogQHByb3BlcnR5IHs/Q3NzUHNldWRvW119IGF0dHJzIEFuIGFycmF5IG9mIENTUyBwc2V1ZG9zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGlkIENTUyBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgez9Dc3NSdWxlfSBydWxlIEEgZGVzY2VuZGFudCBvZiB0aGlzIENTUyBydWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NPYmplY3RcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdHlwZSBUeXBlIG9mIENTUyBvYmplY3QuICdydWxlJywgJ3J1bGVzZXQnIG9yICdzZWxlY3RvcnMnXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NQc2V1ZG9cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmFsdWVUeXBlIFRoZSB0eXBlIG9mIENTUyBwc2V1ZG8gc2VsZWN0b3IgKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2Nzcy1zZWxlY3Rvci1wYXJzZXIgZm9yIHJlZmVyZW5jZSlcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHNldWRvIHNlbGVjdG9yXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgcHNldWRvIHNlbGVjdG9yXG4gKi9cblxuY2xhc3MgQ3NzQ29udmVydGVyIHtcblxuICBjb25zdHJ1Y3RvciAoc2VsZWN0b3IsIHBrZykge1xuICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICB0aGlzLnBrZyA9IHBrZztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYDxwa2dOYW1lPjppZC9gIHByZWZpeCB0byBiZWdpbm5pbmcgb2Ygc3RyaW5nIGlmIGl0J3Mgbm90IHRoZXJlIGFscmVhZHlcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0b3IgVGhlIGluaXRpYWwgbG9jYXRvclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBTdHJpbmcgd2l0aCBgPHBrZ05hbWU+OmlkL2AgcHJlcGVuZGVkIChpZiBpdCB3YXNuJ3QgYWxyZWFkeSlcbiAgICovXG4gIGZvcm1hdElkTG9jYXRvciAobG9jYXRvcikge1xuICAgIHJldHVybiBJRF9MT0NBVE9SX1BBVFRFUk4udGVzdChsb2NhdG9yKVxuICAgICAgPyBsb2NhdG9yXG4gICAgICA6IGAke3RoaXMucGtnIHx8ICdhbmRyb2lkJ306aWQvJHtsb2NhdG9yfWA7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIENTUyBhdHRyaWJ1dGUgaW50byBhIFVpU2VsZWN0b3IgbWV0aG9kIGNhbGxcbiAgICpcbiAgICogQHBhcmFtIHtDc3NBdHRyfSBjc3NBdHRyIENTUyBhdHRyaWJ1dGUgb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IENTUyBhdHRyaWJ1dGUgcGFyc2VkIGFzIFVpU2VsZWN0b3JcbiAgICovXG4gIHBhcnNlQXR0ciAoY3NzQXR0cikge1xuICAgIGlmIChjc3NBdHRyLnZhbHVlVHlwZSAmJiBjc3NBdHRyLnZhbHVlVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzQXR0ci5uYW1lfT0ke2Nzc0F0dHIudmFsdWV9JyBpcyBhbiBpbnZhbGlkIGF0dHJpYnV0ZS4gYCArXG4gICAgICAgIGBPbmx5ICdzdHJpbmcnIGFuZCBlbXB0eSBhdHRyaWJ1dGUgdHlwZXMgYXJlIHN1cHBvcnRlZC4gRm91bmQgJyR7Y3NzQXR0ci52YWx1ZVR5cGV9J2ApO1xuICAgIH1cbiAgICBjb25zdCBhdHRyTmFtZSA9IGFzc2VydEdldEF0dHJOYW1lKGNzc0F0dHIpO1xuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSB0b1NuYWtlQ2FzZShhdHRyTmFtZSk7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGF0IGl0J3MgYSBzdXBwb3J0ZWQgYXR0cmlidXRlXG4gICAgaWYgKCFTVFJfQVRUUlMuaW5jbHVkZXMoYXR0ck5hbWUpICYmICFCT09MRUFOX0FUVFJTLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHthdHRyTmFtZX0nIGlzIG5vdCBzdXBwb3J0ZWQuIFN1cHBvcnRlZCBhdHRyaWJ1dGVzIGFyZSBgICtcbiAgICAgICAgYCcke1suLi5TVFJfQVRUUlMsIC4uLkJPT0xFQU5fQVRUUlNdLmpvaW4oJywgJyl9J2ApO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIGJvb2xlYW4sIGlmIGl0J3MgYSBib29sZWFuIGF0dHJpYnV0ZVxuICAgIGlmIChCT09MRUFOX0FUVFJTLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfSgke2Fzc2VydEdldEJvb2woY3NzQXR0cil9KWA7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlIHBhcnNlIGFzIHN0cmluZ1xuICAgIGxldCB2YWx1ZSA9IGNzc0F0dHIudmFsdWUgfHwgJyc7XG4gICAgaWYgKGF0dHJOYW1lID09PSBSRVNPVVJDRV9JRCkge1xuICAgICAgdmFsdWUgPSB0aGlzLmZvcm1hdElkTG9jYXRvcih2YWx1ZSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1NYXRjaGVzKFwiXCIpYDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNzc0F0dHIub3BlcmF0b3IpIHtcbiAgICAgIGNhc2UgJz0nOlxuICAgICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9KFwiJHt2YWx1ZX1cIilgO1xuICAgICAgY2FzZSAnKj0nOlxuICAgICAgICBpZiAoWydkZXNjcmlwdGlvbicsICd0ZXh0J10uaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfUNvbnRhaW5zKFwiJHt2YWx1ZX1cIilgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1NYXRjaGVzKFwiJHtlc2NhcGVSZWdFeHAodmFsdWUpfVwiKWA7XG4gICAgICBjYXNlICdePSc6XG4gICAgICAgIGlmIChbJ2Rlc2NyaXB0aW9uJywgJ3RleHQnXS5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICAgICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9U3RhcnRzV2l0aChcIiR7dmFsdWV9XCIpYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9TWF0Y2hlcyhcIl4ke2VzY2FwZVJlZ0V4cCh2YWx1ZSl9XCIpYDtcbiAgICAgIGNhc2UgJyQ9JzpcbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2VzY2FwZVJlZ0V4cCh2YWx1ZSl9JFwiKWA7XG4gICAgICBjYXNlICd+PSc6XG4gICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1NYXRjaGVzKFwiJHtnZXRXb3JkTWF0Y2hlclJlZ2V4KHZhbHVlKX1cIilgO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gVW5yZWFjaGFibGUsIGJ1dCBhZGRpbmcgZXJyb3IgaW4gY2FzZSBhIG5ldyBDU1MgYXR0cmlidXRlIGlzIGFkZGVkLlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIENTUyBhdHRyaWJ1dGUgb3BlcmF0b3IgJyR7Y3NzQXR0ci5vcGVyYXRvcn0nLiBgICtcbiAgICAgICAgICBgICc9JywgJyo9JywgJ149JywgJyQ9JyBhbmQgJ349JyBhcmUgc3VwcG9ydGVkLmApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgQ1NTIHBzZXVkbyBjbGFzcyB0byBhIFVpU2VsZWN0b3JcbiAgICpcbiAgICogQHBhcmFtIHtDc3NQc2V1ZG99IGNzc1BzZXVkbyBDU1MgUHNldWRvIGNsYXNzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFBzZXVkbyBzZWxlY3RvciBwYXJzZWQgYXMgVWlTZWxlY3RvclxuICAgKi9cbiAgcGFyc2VQc2V1ZG8gKGNzc1BzZXVkbykge1xuICAgIGlmIChjc3NQc2V1ZG8udmFsdWVUeXBlICYmIGNzc1BzZXVkby52YWx1ZVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2Nzc1BzZXVkby5uYW1lfT0ke2Nzc1BzZXVkby52YWx1ZX0nLiBgICtcbiAgICAgICAgYFVuc3VwcG9ydGVkIGNzcyBwc2V1ZG8gY2xhc3MgdmFsdWUgdHlwZTogJyR7Y3NzUHNldWRvLnZhbHVlVHlwZX0nLiBPbmx5ICdzdHJpbmcnIHR5cGUgb3IgZW1wdHkgaXMgc3VwcG9ydGVkLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHBzZXVkb05hbWUgPSBhc3NlcnRHZXRBdHRyTmFtZShjc3NQc2V1ZG8pO1xuXG4gICAgaWYgKEJPT0xFQU5fQVRUUlMuaW5jbHVkZXMocHNldWRvTmFtZSkpIHtcbiAgICAgIHJldHVybiBgLiR7dG9TbmFrZUNhc2UocHNldWRvTmFtZSl9KCR7YXNzZXJ0R2V0Qm9vbChjc3NQc2V1ZG8pfSlgO1xuICAgIH1cblxuICAgIGlmIChOVU1FUklDX0FUVFJTLmluY2x1ZGVzKHBzZXVkb05hbWUpKSB7XG4gICAgICByZXR1cm4gYC4ke3BzZXVkb05hbWV9KCR7Y3NzUHNldWRvLnZhbHVlfSlgO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgQ1NTIHJ1bGUgdG8gYSBVaVNlbGVjdG9yXG4gICAqIEBwYXJhbSB7Q3NzUnVsZX0gY3NzUnVsZSBDU1MgcnVsZSBkZWZpbml0aW9uXG4gICAqL1xuICBwYXJzZUNzc1J1bGUgKGNzc1J1bGUpIHtcbiAgICBjb25zdCB7IG5lc3RpbmdPcGVyYXRvciB9ID0gY3NzUnVsZTtcbiAgICBpZiAobmVzdGluZ09wZXJhdG9yICYmIG5lc3RpbmdPcGVyYXRvciAhPT0gJyAnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke25lc3RpbmdPcGVyYXRvcn0nIGlzIG5vdCBhIHN1cHBvcnRlZCBjb21iaW5hdG9yLiBgICtcbiAgICAgICAgYE9ubHkgY2hpbGQgY29tYmluYXRvciAoPikgYW5kIGRlc2NlbmRhbnQgY29tYmluYXRvciBhcmUgc3VwcG9ydGVkLmApO1xuICAgIH1cblxuICAgIGxldCB1aUF1dG9tYXRvclNlbGVjdG9yID0gJ25ldyBVaVNlbGVjdG9yKCknO1xuICAgIGlmIChjc3NSdWxlLnRhZ05hbWUgJiYgY3NzUnVsZS50YWdOYW1lICE9PSAnKicpIHtcbiAgICAgIGxldCBhbmRyb2lkQ2xhc3MgPSBbY3NzUnVsZS50YWdOYW1lXTtcbiAgICAgIGlmIChjc3NSdWxlLmNsYXNzTmFtZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBjc3NDbGFzc05hbWVzIG9mIGNzc1J1bGUuY2xhc3NOYW1lcykge1xuICAgICAgICAgIGFuZHJvaWRDbGFzcy5wdXNoKGNzc0NsYXNzTmFtZXMpO1xuICAgICAgICB9XG4gICAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5jbGFzc05hbWUoXCIke2FuZHJvaWRDbGFzcy5qb2luKCcuJyl9XCIpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5jbGFzc05hbWVNYXRjaGVzKFwiJHtjc3NSdWxlLnRhZ05hbWV9XCIpYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNzc1J1bGUuY2xhc3NOYW1lcykge1xuICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNsYXNzTmFtZU1hdGNoZXMoXCIke2Nzc1J1bGUuY2xhc3NOYW1lcy5qb2luKCdcXFxcLicpfVwiKWA7XG4gICAgfVxuICAgIGlmIChjc3NSdWxlLmlkKSB7XG4gICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IGAucmVzb3VyY2VJZChcIiR7dGhpcy5mb3JtYXRJZExvY2F0b3IoY3NzUnVsZS5pZCl9XCIpYDtcbiAgICB9XG4gICAgaWYgKGNzc1J1bGUuYXR0cnMpIHtcbiAgICAgIGZvciAoY29uc3QgYXR0ciBvZiBjc3NSdWxlLmF0dHJzKSB7XG4gICAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gdGhpcy5wYXJzZUF0dHIoYXR0cik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjc3NSdWxlLnBzZXVkb3MpIHtcbiAgICAgIGZvciAoY29uc3QgcHNldWRvIG9mIGNzc1J1bGUucHNldWRvcykge1xuICAgICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IHRoaXMucGFyc2VQc2V1ZG8ocHNldWRvKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNzc1J1bGUucnVsZSkge1xuICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNoaWxkU2VsZWN0b3IoJHt0aGlzLnBhcnNlQ3NzUnVsZShjc3NSdWxlLnJ1bGUpfSlgO1xuICAgIH1cbiAgICByZXR1cm4gdWlBdXRvbWF0b3JTZWxlY3RvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IENTUyBvYmplY3QgdG8gVWlBdXRvbWF0b3IyIHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7Q3NzT2JqZWN0fSBjc3MgQ1NTIG9iamVjdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgQ1NTIG9iamVjdCBwYXJzZWQgYXMgYSBVaVNlbGVjdG9yXG4gICAqL1xuICBwYXJzZUNzc09iamVjdCAoY3NzKSB7XG4gICAgc3dpdGNoIChjc3MudHlwZSkge1xuICAgICAgY2FzZSAncnVsZSc6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQ3NzUnVsZShjc3MpO1xuICAgICAgY2FzZSAncnVsZVNldCc6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQ3NzT2JqZWN0KGNzcy5ydWxlKTtcbiAgICAgIGNhc2UgJ3NlbGVjdG9ycyc6XG4gICAgICAgIHJldHVybiBjc3Muc2VsZWN0b3JzLm1hcCgoc2VsZWN0b3IpID0+IHRoaXMucGFyc2VDc3NPYmplY3Qoc2VsZWN0b3IpKS5qb2luKCc7ICcpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBUaGlzIGlzIG5ldmVyIHJlYWNoYWJsZSwgYnV0IGlmIGl0IGV2ZXIgaXMgZG8gdGhpcy5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVaUF1dG9tYXRvciBkb2VzIG5vdCBzdXBwb3J0ICcke2Nzcy50eXBlfScgY3NzLiBPbmx5IHN1cHBvcnRzICdydWxlJywgJ3J1bGVTZXQnLCAnc2VsZWN0b3JzJyBgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIENTUyBzZWxlY3RvciB0byBhIFVpQXV0b21hdG9yMiBzZWxlY3RvclxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgQ1NTIHNlbGVjdG9yIGNvbnZlcnRlZCB0byBhIFVpU2VsZWN0b3JcbiAgICovXG4gIHRvVWlBdXRvbWF0b3JTZWxlY3RvciAoKSB7XG4gICAgbGV0IGNzc09iajtcbiAgICB0cnkge1xuICAgICAgY3NzT2JqID0gcGFyc2VyLnBhcnNlKHRoaXMuc2VsZWN0b3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFNlbGVjdG9yRXJyb3IoYEludmFsaWQgQ1NTIHNlbGVjdG9yICcke3RoaXMuc2VsZWN0b3J9Jy4gUmVhc29uOiAnJHtlfSdgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQ3NzT2JqZWN0KGNzc09iaik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkU2VsZWN0b3JFcnJvcihgVW5zdXBwb3J0ZWQgQ1NTIHNlbGVjdG9yICcke3RoaXMuc2VsZWN0b3J9Jy4gUmVhc29uOiAnJHtlfSdgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ3NzQ29udmVydGVyOyJdLCJmaWxlIjoibGliL2Nzcy1jb252ZXJ0ZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|