appium-android-driver 5.4.3 → 5.5.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/build/index.js +1 -9
- package/build/lib/android-helpers.js +10 -194
- package/build/lib/android-helpers.js.map +1 -1
- package/build/lib/bootstrap.js +4 -45
- package/build/lib/bootstrap.js.map +1 -1
- package/build/lib/commands/actions.js +3 -78
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/commands/alert.js +3 -10
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/app-management.js +4 -32
- package/build/lib/commands/app-management.js.map +1 -1
- package/build/lib/commands/context.js +6 -78
- package/build/lib/commands/context.js.map +1 -1
- package/build/lib/commands/coverage.js +1 -6
- package/build/lib/commands/coverage.js.map +1 -1
- package/build/lib/commands/element.js +4 -47
- package/build/lib/commands/element.js.map +1 -1
- package/build/lib/commands/emu-console.js +2 -7
- package/build/lib/commands/emu-console.js.map +1 -1
- package/build/lib/commands/execute.js +1 -13
- package/build/lib/commands/execute.js.map +1 -1
- package/build/lib/commands/file-actions.js +3 -44
- package/build/lib/commands/file-actions.js.map +1 -1
- package/build/lib/commands/find.js +3 -16
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/commands/general.js +32 -91
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/ime.js +3 -14
- package/build/lib/commands/ime.js.map +1 -1
- package/build/lib/commands/index.js +3 -27
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/intent.js +1 -40
- package/build/lib/commands/intent.js.map +1 -1
- package/build/lib/commands/log.js +3 -35
- package/build/lib/commands/log.js.map +1 -1
- package/build/lib/commands/media-projection.js +2 -47
- package/build/lib/commands/media-projection.js.map +1 -1
- package/build/lib/commands/network.js +4 -40
- package/build/lib/commands/network.js.map +1 -1
- package/build/lib/commands/performance.js +5 -57
- package/build/lib/commands/performance.js.map +1 -1
- package/build/lib/commands/recordscreen.js +1 -59
- package/build/lib/commands/recordscreen.js.map +1 -1
- package/build/lib/commands/shell.js +1 -15
- package/build/lib/commands/shell.js.map +1 -1
- package/build/lib/commands/streamscreen.js +7 -74
- package/build/lib/commands/streamscreen.js.map +1 -1
- package/build/lib/commands/system-bars.js +1 -23
- package/build/lib/commands/system-bars.js.map +1 -1
- package/build/lib/commands/touch.js +13 -79
- package/build/lib/commands/touch.js.map +1 -1
- package/build/lib/desired-caps.js +3 -4
- package/build/lib/desired-caps.js.map +1 -1
- package/build/lib/driver.js +8 -97
- package/build/lib/driver.js.map +1 -1
- package/build/lib/logger.js +1 -5
- package/build/lib/logger.js.map +1 -1
- package/build/lib/uiautomator.js +3 -24
- package/build/lib/uiautomator.js.map +1 -1
- package/build/lib/unlock-helpers.js +1 -61
- package/build/lib/unlock-helpers.js.map +1 -1
- package/build/lib/utils.js +1 -7
- package/build/lib/utils.js.map +1 -1
- package/build/lib/webview-helpers.js +1 -94
- package/build/lib/webview-helpers.js.map +1 -1
- package/lib/android-helpers.js +2 -1
- package/lib/commands/general.js +34 -15
- package/package.json +1 -1
|
@@ -1,47 +1,36 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.helpers = exports.default = exports.commands = void 0;
|
|
9
|
-
|
|
10
8
|
require("source-map-support/register");
|
|
11
|
-
|
|
12
9
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
-
|
|
14
10
|
var _androidHelpers = _interopRequireDefault(require("../android-helpers"));
|
|
15
|
-
|
|
16
11
|
var _support = require("appium/support");
|
|
17
|
-
|
|
18
12
|
var _moment = _interopRequireDefault(require("moment"));
|
|
19
|
-
|
|
20
13
|
var _asyncbox = require("asyncbox");
|
|
21
|
-
|
|
22
14
|
var _driver = require("appium/driver");
|
|
23
|
-
|
|
15
|
+
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
24
16
|
const MOMENT_FORMAT_ISO8601 = 'YYYY-MM-DDTHH:mm:ssZ';
|
|
17
|
+
const ALL_PERMISSIONS_MAGIC = 'all';
|
|
25
18
|
let commands = {},
|
|
26
|
-
|
|
27
|
-
|
|
19
|
+
helpers = {},
|
|
20
|
+
extensions = {};
|
|
28
21
|
exports.helpers = helpers;
|
|
29
22
|
exports.commands = commands;
|
|
30
|
-
|
|
31
23
|
commands.keys = async function keys(keys) {
|
|
32
24
|
keys = _lodash.default.isArray(keys) ? keys.join('') : keys;
|
|
33
25
|
let params = {
|
|
34
26
|
text: keys,
|
|
35
27
|
replace: false
|
|
36
28
|
};
|
|
37
|
-
|
|
38
29
|
if (this.opts.unicodeKeyboard) {
|
|
39
30
|
params.unicodeKeyboard = true;
|
|
40
31
|
}
|
|
41
|
-
|
|
42
32
|
await this.doSendKeys(params);
|
|
43
33
|
};
|
|
44
|
-
|
|
45
34
|
commands.doSendKeys = async function doSendKeys(params) {
|
|
46
35
|
return await this.bootstrap.sendAction('setText', params);
|
|
47
36
|
};
|
|
@@ -50,40 +39,32 @@ commands.getDeviceTime = async function getDeviceTime(format = MOMENT_FORMAT_ISO
|
|
|
50
39
|
this.log.debug('Attempting to capture android device date and time. ' + `The format specifier is '${format}'`);
|
|
51
40
|
const deviceTimestamp = (await this.adb.shell(['date', '+%Y-%m-%dT%T%z'])).trim();
|
|
52
41
|
this.log.debug(`Got device timestamp: ${deviceTimestamp}`);
|
|
53
|
-
|
|
54
42
|
const parsedTimestamp = _moment.default.utc(deviceTimestamp, 'YYYY-MM-DDTHH:mm:ssZZ');
|
|
55
|
-
|
|
56
43
|
if (!parsedTimestamp.isValid()) {
|
|
57
44
|
this.log.warn('Cannot parse the returned timestamp. Returning as is');
|
|
58
45
|
return deviceTimestamp;
|
|
59
46
|
}
|
|
60
|
-
|
|
61
47
|
return parsedTimestamp.utcOffset(parsedTimestamp._tzm || 0).format(format);
|
|
62
48
|
};
|
|
63
49
|
|
|
64
50
|
commands.mobileGetDeviceTime = async function mobileGetDeviceTime(opts = {}) {
|
|
65
51
|
return await this.getDeviceTime(opts.format);
|
|
66
52
|
};
|
|
67
|
-
|
|
68
53
|
commands.getPageSource = async function getPageSource() {
|
|
69
54
|
return await this.bootstrap.sendAction('source');
|
|
70
55
|
};
|
|
71
|
-
|
|
72
56
|
commands.back = async function back() {
|
|
73
57
|
return await this.bootstrap.sendAction('pressBack');
|
|
74
58
|
};
|
|
75
|
-
|
|
76
59
|
commands.isKeyboardShown = async function isKeyboardShown() {
|
|
77
60
|
const {
|
|
78
61
|
isKeyboardShown
|
|
79
62
|
} = await this.adb.isSoftKeyboardPresent();
|
|
80
63
|
return isKeyboardShown;
|
|
81
64
|
};
|
|
82
|
-
|
|
83
65
|
commands.hideKeyboard = async function hideKeyboard() {
|
|
84
66
|
return await this.adb.hideKeyboard();
|
|
85
67
|
};
|
|
86
|
-
|
|
87
68
|
commands.openSettingsActivity = async function openSettingsActivity(setting) {
|
|
88
69
|
let {
|
|
89
70
|
appPackage,
|
|
@@ -92,7 +73,6 @@ commands.openSettingsActivity = async function openSettingsActivity(setting) {
|
|
|
92
73
|
await this.adb.shell(['am', 'start', '-a', `android.settings.${setting}`]);
|
|
93
74
|
await this.adb.waitForNotActivity(appPackage, appActivity, 5000);
|
|
94
75
|
};
|
|
95
|
-
|
|
96
76
|
commands.getWindowSize = async function getWindowSize() {
|
|
97
77
|
return await this.bootstrap.sendAction('getDeviceSize');
|
|
98
78
|
};
|
|
@@ -109,31 +89,26 @@ commands.getWindowRect = async function getWindowRect() {
|
|
|
109
89
|
y: 0
|
|
110
90
|
};
|
|
111
91
|
};
|
|
112
|
-
|
|
113
92
|
commands.getCurrentActivity = async function getCurrentActivity() {
|
|
114
93
|
return (await this.adb.getFocusedPackageAndActivity()).appActivity;
|
|
115
94
|
};
|
|
116
|
-
|
|
117
95
|
commands.getCurrentPackage = async function getCurrentPackage() {
|
|
118
96
|
return (await this.adb.getFocusedPackageAndActivity()).appPackage;
|
|
119
97
|
};
|
|
120
|
-
|
|
121
98
|
commands.background = async function background(seconds) {
|
|
122
99
|
if (seconds < 0) {
|
|
123
100
|
await this.adb.goToHome();
|
|
124
101
|
return true;
|
|
125
102
|
}
|
|
126
|
-
|
|
127
103
|
let {
|
|
128
104
|
appPackage,
|
|
129
105
|
appActivity
|
|
130
106
|
} = await this.adb.getFocusedPackageAndActivity();
|
|
131
107
|
await this.adb.goToHome();
|
|
108
|
+
|
|
132
109
|
const sleepMs = seconds * 1000;
|
|
133
110
|
const thresholdMs = 30 * 1000;
|
|
134
|
-
|
|
135
111
|
const intervalMs = _lodash.default.min([30 * 1000, parseInt(sleepMs / 100, 10)]);
|
|
136
|
-
|
|
137
112
|
const progressCb = ({
|
|
138
113
|
elapsedMs,
|
|
139
114
|
progress
|
|
@@ -142,14 +117,12 @@ commands.background = async function background(seconds) {
|
|
|
142
117
|
const progressPct = (progress * 100).toFixed(2);
|
|
143
118
|
this.log.debug(`Waited ${waitSecs}s so far (${progressPct}%)`);
|
|
144
119
|
};
|
|
145
|
-
|
|
146
120
|
await (0, _asyncbox.longSleep)(sleepMs, {
|
|
147
121
|
thresholdMs,
|
|
148
122
|
intervalMs,
|
|
149
123
|
progressCb
|
|
150
124
|
});
|
|
151
125
|
let args;
|
|
152
|
-
|
|
153
126
|
if (this._cachedActivityArgs && this._cachedActivityArgs[`${appPackage}/${appActivity}`]) {
|
|
154
127
|
args = this._cachedActivityArgs[`${appPackage}/${appActivity}`];
|
|
155
128
|
} else {
|
|
@@ -158,7 +131,6 @@ commands.background = async function background(seconds) {
|
|
|
158
131
|
await this.activateApp(appPackage);
|
|
159
132
|
return true;
|
|
160
133
|
} catch (ign) {}
|
|
161
|
-
|
|
162
134
|
args = appPackage === this.opts.appPackage && appActivity === this.opts.appActivity || appPackage === this.opts.appWaitPackage && (this.opts.appWaitActivity || '').split(',').includes(appActivity) ? {
|
|
163
135
|
pkg: this.opts.appPackage,
|
|
164
136
|
activity: this.opts.appActivity,
|
|
@@ -180,12 +152,10 @@ commands.background = async function background(seconds) {
|
|
|
180
152
|
stopApp: false
|
|
181
153
|
};
|
|
182
154
|
}
|
|
183
|
-
|
|
184
155
|
args = await _support.util.filterObject(args);
|
|
185
156
|
this.log.debug(`Bringing application back to foreground with arguments: ${JSON.stringify(args)}`);
|
|
186
157
|
return await this.adb.startApp(args);
|
|
187
158
|
};
|
|
188
|
-
|
|
189
159
|
commands.getStrings = async function getStrings(language) {
|
|
190
160
|
if (!language) {
|
|
191
161
|
language = await this.adb.getDeviceLanguage();
|
|
@@ -194,39 +164,30 @@ commands.getStrings = async function getStrings(language) {
|
|
|
194
164
|
|
|
195
165
|
const preprocessStringsMap = mapping => {
|
|
196
166
|
const result = {};
|
|
197
|
-
|
|
198
167
|
for (const [key, value] of _lodash.default.toPairs(mapping)) {
|
|
199
168
|
result[key] = _lodash.default.isString(value) ? value : JSON.stringify(value);
|
|
200
169
|
}
|
|
201
|
-
|
|
202
170
|
return result;
|
|
203
171
|
};
|
|
204
|
-
|
|
205
172
|
if (this.apkStrings[language]) {
|
|
206
173
|
return preprocessStringsMap(this.apkStrings[language]);
|
|
207
174
|
}
|
|
208
|
-
|
|
209
175
|
this.apkStrings[language] = await _androidHelpers.default.pushStrings(language, this.adb, this.opts);
|
|
210
|
-
|
|
211
176
|
if (this.bootstrap) {
|
|
212
177
|
await this.bootstrap.sendAction('updateStrings');
|
|
213
178
|
}
|
|
214
|
-
|
|
215
179
|
return preprocessStringsMap(this.apkStrings[language]);
|
|
216
180
|
};
|
|
217
|
-
|
|
218
181
|
commands.launchApp = async function launchApp() {
|
|
219
182
|
await this.initAUT();
|
|
220
183
|
await this.startAUT();
|
|
221
184
|
};
|
|
222
|
-
|
|
223
185
|
commands.startActivity = async function startActivity(appPackage, appActivity, appWaitPackage, appWaitActivity, intentAction, intentCategory, intentFlags, optionalIntentArguments, dontStopAppOnReset) {
|
|
224
186
|
this.log.debug(`Starting package '${appPackage}' and activity '${appActivity}'`);
|
|
225
187
|
|
|
226
188
|
if (!_support.util.hasValue(dontStopAppOnReset)) {
|
|
227
189
|
dontStopAppOnReset = !!this.opts.dontStopAppOnReset;
|
|
228
190
|
}
|
|
229
|
-
|
|
230
191
|
let args = {
|
|
231
192
|
pkg: appPackage,
|
|
232
193
|
activity: appActivity,
|
|
@@ -242,7 +203,6 @@ commands.startActivity = async function startActivity(appPackage, appActivity, a
|
|
|
242
203
|
this._cachedActivityArgs[`${args.waitPkg}/${args.waitActivity}`] = args;
|
|
243
204
|
await this.adb.startApp(args);
|
|
244
205
|
};
|
|
245
|
-
|
|
246
206
|
commands.reset = async function reset() {
|
|
247
207
|
await _androidHelpers.default.resetApp(this.adb, Object.assign({}, this.opts, {
|
|
248
208
|
fastReset: true
|
|
@@ -250,7 +210,6 @@ commands.reset = async function reset() {
|
|
|
250
210
|
await this.setContext();
|
|
251
211
|
return (await this.isChromeSession) ? this.startChromeSession() : this.startAUT();
|
|
252
212
|
};
|
|
253
|
-
|
|
254
213
|
commands.startAUT = async function startAUT() {
|
|
255
214
|
await this.adb.startApp({
|
|
256
215
|
pkg: this.opts.appPackage,
|
|
@@ -276,47 +235,34 @@ commands.closeApp = async function closeApp() {
|
|
|
276
235
|
await this.adb.forceStop(this.opts.appPackage);
|
|
277
236
|
await this.setContext();
|
|
278
237
|
};
|
|
279
|
-
|
|
280
238
|
commands.getDisplayDensity = async function getDisplayDensity() {
|
|
281
239
|
let out = await this.adb.shell(['getprop', 'ro.sf.lcd_density']);
|
|
282
|
-
|
|
283
240
|
if (out) {
|
|
284
241
|
let val = parseInt(out, 10);
|
|
285
|
-
|
|
286
242
|
if (!isNaN(val)) {
|
|
287
243
|
return val;
|
|
288
244
|
}
|
|
289
|
-
|
|
290
245
|
this.log.debug(`Parsed density value was NaN: "${out}"`);
|
|
291
246
|
}
|
|
292
|
-
|
|
293
247
|
out = await this.adb.shell(['getprop', 'qemu.sf.lcd_density']);
|
|
294
|
-
|
|
295
248
|
if (out) {
|
|
296
249
|
let val = parseInt(out, 10);
|
|
297
|
-
|
|
298
250
|
if (!isNaN(val)) {
|
|
299
251
|
return val;
|
|
300
252
|
}
|
|
301
|
-
|
|
302
253
|
this.log.debug(`Parsed density value was NaN: "${out}"`);
|
|
303
254
|
}
|
|
304
|
-
|
|
305
255
|
this.log.errorAndThrow('Failed to get display density property.');
|
|
306
256
|
};
|
|
307
|
-
|
|
308
257
|
commands.mobilePerformEditorAction = async function mobilePerformEditorAction(opts = {}) {
|
|
309
258
|
const {
|
|
310
259
|
action
|
|
311
260
|
} = opts;
|
|
312
|
-
|
|
313
261
|
if (!_support.util.hasValue(action)) {
|
|
314
262
|
throw new _driver.errors.InvalidArgumentError(`'action' argument is required`);
|
|
315
263
|
}
|
|
316
|
-
|
|
317
264
|
await this.adb.performEditorAction(action);
|
|
318
265
|
};
|
|
319
|
-
|
|
320
266
|
const PERMISSION_ACTION = {
|
|
321
267
|
GRANT: 'grant',
|
|
322
268
|
REVOKE: 'revoke'
|
|
@@ -328,33 +274,37 @@ commands.mobileChangePermissions = async function mobileChangePermissions(opts =
|
|
|
328
274
|
appPackage = this.opts.appPackage,
|
|
329
275
|
action = PERMISSION_ACTION.GRANT
|
|
330
276
|
} = opts;
|
|
331
|
-
|
|
332
|
-
if (!_support.util.hasValue(permissions)) {
|
|
277
|
+
if (_lodash.default.isNil(permissions)) {
|
|
333
278
|
throw new _driver.errors.InvalidArgumentError(`'permissions' argument is required`);
|
|
334
279
|
}
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
switch (_lodash.default.toLower(action)) {
|
|
339
|
-
case PERMISSION_ACTION.GRANT:
|
|
340
|
-
actionFunc = (appPackage, permission) => this.adb.grantPermission(appPackage, permission);
|
|
341
|
-
|
|
342
|
-
break;
|
|
343
|
-
|
|
344
|
-
case PERMISSION_ACTION.REVOKE:
|
|
345
|
-
actionFunc = (appPackage, permission) => this.adb.revokePermission(appPackage, permission);
|
|
346
|
-
|
|
347
|
-
break;
|
|
348
|
-
|
|
349
|
-
default:
|
|
350
|
-
throw new _driver.errors.InvalidArgumentError(`Unknown action '${action}'. ` + `Only ${JSON.stringify(_lodash.default.values(PERMISSION_ACTION))} actions are supported`);
|
|
280
|
+
if (_lodash.default.isEmpty(permissions)) {
|
|
281
|
+
throw new _driver.errors.InvalidArgumentError(`'permissions' argument must not be empty`);
|
|
351
282
|
}
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
283
|
+
const lowerAction = _lodash.default.toLower(action);
|
|
284
|
+
if (![PERMISSION_ACTION.GRANT, PERMISSION_ACTION.REVOKE].includes(lowerAction)) {
|
|
285
|
+
throw new _driver.errors.InvalidArgumentError(`Unknown action '${action}'. ` + `Only ${JSON.stringify(_lodash.default.values(PERMISSION_ACTION))} actions are supported`);
|
|
286
|
+
}
|
|
287
|
+
let affectedPermissions = _lodash.default.isArray(permissions) ? permissions : [permissions];
|
|
288
|
+
if (_lodash.default.toLower(permissions) === ALL_PERMISSIONS_MAGIC) {
|
|
289
|
+
const dumpsys = await this.adb.shell(['dumpsys', 'package', appPackage]);
|
|
290
|
+
const grantedPermissions = await this.adb.getGrantedPermissions(appPackage, dumpsys);
|
|
291
|
+
if (lowerAction === PERMISSION_ACTION.GRANT) {
|
|
292
|
+
const reqPermissons = await this.adb.getReqPermissions(appPackage, dumpsys);
|
|
293
|
+
affectedPermissions = _lodash.default.difference(reqPermissons, grantedPermissions);
|
|
294
|
+
} else {
|
|
295
|
+
affectedPermissions = grantedPermissions;
|
|
296
|
+
}
|
|
297
|
+
if (_lodash.default.isEmpty(affectedPermissions)) {
|
|
298
|
+
this.log.info(`'${appPackage}' contains no permissions to ${lowerAction}`);
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
if (lowerAction === PERMISSION_ACTION.GRANT) {
|
|
303
|
+
await this.adb.grantPermissions(appPackage, affectedPermissions);
|
|
304
|
+
} else {
|
|
305
|
+
await _bluebird.default.all(affectedPermissions.map(name => this.adb.revokePermission(appPackage, name)));
|
|
355
306
|
}
|
|
356
307
|
};
|
|
357
|
-
|
|
358
308
|
const PERMISSIONS_TYPE = {
|
|
359
309
|
DENIED: 'denied',
|
|
360
310
|
GRANTED: 'granted',
|
|
@@ -367,27 +317,19 @@ commands.mobileGetPermissions = async function mobileGetPermissions(opts = {}) {
|
|
|
367
317
|
appPackage = this.opts.appPackage
|
|
368
318
|
} = opts;
|
|
369
319
|
let actionFunc;
|
|
370
|
-
|
|
371
320
|
switch (_lodash.default.toLower(type)) {
|
|
372
321
|
case PERMISSIONS_TYPE.REQUESTED:
|
|
373
322
|
actionFunc = appPackage => this.adb.getReqPermissions(appPackage);
|
|
374
|
-
|
|
375
323
|
break;
|
|
376
|
-
|
|
377
324
|
case PERMISSIONS_TYPE.GRANTED:
|
|
378
325
|
actionFunc = appPackage => this.adb.getGrantedPermissions(appPackage);
|
|
379
|
-
|
|
380
326
|
break;
|
|
381
|
-
|
|
382
327
|
case PERMISSIONS_TYPE.DENIED:
|
|
383
328
|
actionFunc = appPackage => this.adb.getDeniedPermissions(appPackage);
|
|
384
|
-
|
|
385
329
|
break;
|
|
386
|
-
|
|
387
330
|
default:
|
|
388
331
|
throw new _driver.errors.InvalidArgumentError(`Unknown permissions type '${type}'. ` + `Only ${JSON.stringify(_lodash.default.values(PERMISSIONS_TYPE))} types are supported`);
|
|
389
332
|
}
|
|
390
|
-
|
|
391
333
|
return await actionFunc(appPackage);
|
|
392
334
|
};
|
|
393
335
|
|
|
@@ -413,8 +355,7 @@ commands.mobileUnlock = async function mobileUnlock(opts = {}) {
|
|
|
413
355
|
unlockSuccessTimeout: timeoutMs
|
|
414
356
|
});
|
|
415
357
|
};
|
|
416
|
-
|
|
417
358
|
Object.assign(extensions, commands, helpers);
|
|
418
359
|
var _default = extensions;
|
|
419
360
|
exports.default = _default;
|
|
420
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNT01FTlRfRk9STUFUX0lTTzg2MDEiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwia2V5cyIsIl8iLCJpc0FycmF5Iiwiam9pbiIsInBhcmFtcyIsInRleHQiLCJyZXBsYWNlIiwib3B0cyIsInVuaWNvZGVLZXlib2FyZCIsImRvU2VuZEtleXMiLCJib290c3RyYXAiLCJzZW5kQWN0aW9uIiwiZ2V0RGV2aWNlVGltZSIsImZvcm1hdCIsImxvZyIsImRlYnVnIiwiZGV2aWNlVGltZXN0YW1wIiwiYWRiIiwic2hlbGwiLCJ0cmltIiwicGFyc2VkVGltZXN0YW1wIiwibW9tZW50IiwidXRjIiwiaXNWYWxpZCIsIndhcm4iLCJ1dGNPZmZzZXQiLCJfdHptIiwibW9iaWxlR2V0RGV2aWNlVGltZSIsImdldFBhZ2VTb3VyY2UiLCJiYWNrIiwiaXNLZXlib2FyZFNob3duIiwiaXNTb2Z0S2V5Ym9hcmRQcmVzZW50IiwiaGlkZUtleWJvYXJkIiwib3BlblNldHRpbmdzQWN0aXZpdHkiLCJzZXR0aW5nIiwiYXBwUGFja2FnZSIsImFwcEFjdGl2aXR5IiwiZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSIsIndhaXRGb3JOb3RBY3Rpdml0eSIsImdldFdpbmRvd1NpemUiLCJnZXRXaW5kb3dSZWN0Iiwid2lkdGgiLCJoZWlnaHQiLCJ4IiwieSIsImdldEN1cnJlbnRBY3Rpdml0eSIsImdldEN1cnJlbnRQYWNrYWdlIiwiYmFja2dyb3VuZCIsInNlY29uZHMiLCJnb1RvSG9tZSIsInNsZWVwTXMiLCJ0aHJlc2hvbGRNcyIsImludGVydmFsTXMiLCJtaW4iLCJwYXJzZUludCIsInByb2dyZXNzQ2IiLCJlbGFwc2VkTXMiLCJwcm9ncmVzcyIsIndhaXRTZWNzIiwidG9GaXhlZCIsInByb2dyZXNzUGN0IiwibG9uZ1NsZWVwIiwiYXJncyIsIl9jYWNoZWRBY3Rpdml0eUFyZ3MiLCJhY3RpdmF0ZUFwcCIsImlnbiIsImFwcFdhaXRQYWNrYWdlIiwiYXBwV2FpdEFjdGl2aXR5Iiwic3BsaXQiLCJpbmNsdWRlcyIsInBrZyIsImFjdGl2aXR5IiwiYWN0aW9uIiwiaW50ZW50QWN0aW9uIiwiY2F0ZWdvcnkiLCJpbnRlbnRDYXRlZ29yeSIsImZsYWdzIiwiaW50ZW50RmxhZ3MiLCJ3YWl0UGtnIiwid2FpdEFjdGl2aXR5Iiwid2FpdEZvckxhdW5jaCIsImFwcFdhaXRGb3JMYXVuY2giLCJ3YWl0RHVyYXRpb24iLCJhcHBXYWl0RHVyYXRpb24iLCJvcHRpb25hbEludGVudEFyZ3VtZW50cyIsInN0b3BBcHAiLCJ1c2VyIiwidXNlclByb2ZpbGUiLCJ1dGlsIiwiZmlsdGVyT2JqZWN0IiwiSlNPTiIsInN0cmluZ2lmeSIsInN0YXJ0QXBwIiwiZ2V0U3RyaW5ncyIsImxhbmd1YWdlIiwiZ2V0RGV2aWNlTGFuZ3VhZ2UiLCJpbmZvIiwicHJlcHJvY2Vzc1N0cmluZ3NNYXAiLCJtYXBwaW5nIiwicmVzdWx0Iiwia2V5IiwidmFsdWUiLCJ0b1BhaXJzIiwiaXNTdHJpbmciLCJhcGtTdHJpbmdzIiwiYW5kcm9pZEhlbHBlcnMiLCJwdXNoU3RyaW5ncyIsImxhdW5jaEFwcCIsImluaXRBVVQiLCJzdGFydEFVVCIsInN0YXJ0QWN0aXZpdHkiLCJkb250U3RvcEFwcE9uUmVzZXQiLCJoYXNWYWx1ZSIsInJlc2V0IiwicmVzZXRBcHAiLCJPYmplY3QiLCJhc3NpZ24iLCJmYXN0UmVzZXQiLCJzZXRDb250ZXh0IiwiaXNDaHJvbWVTZXNzaW9uIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwic2V0VXJsIiwidXJpIiwic3RhcnRVcmkiLCJjbG9zZUFwcCIsImZvcmNlU3RvcCIsImdldERpc3BsYXlEZW5zaXR5Iiwib3V0IiwidmFsIiwiaXNOYU4iLCJlcnJvckFuZFRocm93IiwibW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbiIsImVycm9ycyIsIkludmFsaWRBcmd1bWVudEVycm9yIiwicGVyZm9ybUVkaXRvckFjdGlvbiIsIlBFUk1JU1NJT05fQUNUSU9OIiwiR1JBTlQiLCJSRVZPS0UiLCJtb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwiYWN0aW9uRnVuYyIsInRvTG93ZXIiLCJwZXJtaXNzaW9uIiwiZ3JhbnRQZXJtaXNzaW9uIiwicmV2b2tlUGVybWlzc2lvbiIsInZhbHVlcyIsIlBFUk1JU1NJT05TX1RZUEUiLCJERU5JRUQiLCJHUkFOVEVEIiwiUkVRVUVTVEVEIiwibW9iaWxlR2V0UGVybWlzc2lvbnMiLCJ0eXBlIiwiZ2V0UmVxUGVybWlzc2lvbnMiLCJnZXRHcmFudGVkUGVybWlzc2lvbnMiLCJnZXREZW5pZWRQZXJtaXNzaW9ucyIsIm1vYmlsZUdldE5vdGlmaWNhdGlvbnMiLCJnZXROb3RpZmljYXRpb25zIiwibW9iaWxlTGlzdFNtcyIsImdldFNtc0xpc3QiLCJtb2JpbGVVbmxvY2siLCJzdHJhdGVneSIsInRpbWVvdXRNcyIsInVubG9jayIsInVubG9ja0tleSIsInVubG9ja1R5cGUiLCJ1bmxvY2tTdHJhdGVneSIsInVubG9ja1N1Y2Nlc3NUaW1lb3V0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2dlbmVyYWwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBhbmRyb2lkSGVscGVycyBmcm9tICcuLi9hbmRyb2lkLWhlbHBlcnMnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IGxvbmdTbGVlcCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuXG5jb25zdCBNT01FTlRfRk9STUFUX0lTTzg2MDEgPSAnWVlZWS1NTS1ERFRISDptbTpzc1onO1xuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbW1hbmRzLmtleXMgPSBhc3luYyBmdW5jdGlvbiBrZXlzIChrZXlzKSB7XG4gIC8vIFByb3RvY29sIHNlbmRzIGFuIGFycmF5OyByZXRoaW5rIGFwcHJvYWNoXG4gIGtleXMgPSBfLmlzQXJyYXkoa2V5cykgPyBrZXlzLmpvaW4oJycpIDoga2V5cztcbiAgbGV0IHBhcmFtcyA9IHtcbiAgICB0ZXh0OiBrZXlzLFxuICAgIHJlcGxhY2U6IGZhbHNlXG4gIH07XG4gIGlmICh0aGlzLm9wdHMudW5pY29kZUtleWJvYXJkKSB7XG4gICAgcGFyYW1zLnVuaWNvZGVLZXlib2FyZCA9IHRydWU7XG4gIH1cbiAgYXdhaXQgdGhpcy5kb1NlbmRLZXlzKHBhcmFtcyk7XG59O1xuXG5jb21tYW5kcy5kb1NlbmRLZXlzID0gYXN5bmMgZnVuY3Rpb24gZG9TZW5kS2V5cyAocGFyYW1zKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdzZXRUZXh0JywgcGFyYW1zKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBjdXJyZW50IGRldmljZSdzIHRpbWVzdGFtcC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IC0gVGhlIHNldCBvZiBmb3JtYXQgc3BlY2lmaWVycy4gUmVhZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vbW9tZW50anMuY29tL2RvY3MvIHRvIGdldCB0aGUgZnVsbCBsaXN0IG9mIHN1cHBvcnRlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGV0aW1lIGZvcm1hdCBzcGVjaWZpZXJzLiBUaGUgZGVmYXVsdCBmb3JtYXQgaXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBgWVlZWS1NTS1ERFRISDptbTpzc1pgLCB3aGljaCBjb21wbGllcyB0byBJU08tODYwMVxuICogQHJldHVybiB7c3RyaW5nfSBGb3JtYXR0ZWQgZGF0ZXRpbWUgc3RyaW5nIG9yIHRoZSByYXcgY29tbWFuZCBvdXRwdXQgaWYgZm9ybWF0dGluZyBmYWlsc1xuICovXG5jb21tYW5kcy5nZXREZXZpY2VUaW1lID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlVGltZSAoZm9ybWF0ID0gTU9NRU5UX0ZPUk1BVF9JU084NjAxKSB7XG4gIHRoaXMubG9nLmRlYnVnKCdBdHRlbXB0aW5nIHRvIGNhcHR1cmUgYW5kcm9pZCBkZXZpY2UgZGF0ZSBhbmQgdGltZS4gJyArXG4gICAgYFRoZSBmb3JtYXQgc3BlY2lmaWVyIGlzICcke2Zvcm1hdH0nYCk7XG4gIGNvbnN0IGRldmljZVRpbWVzdGFtcCA9IChhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2RhdGUnLCAnKyVZLSVtLSVkVCVUJXonXSkpLnRyaW0oKTtcbiAgdGhpcy5sb2cuZGVidWcoYEdvdCBkZXZpY2UgdGltZXN0YW1wOiAke2RldmljZVRpbWVzdGFtcH1gKTtcbiAgY29uc3QgcGFyc2VkVGltZXN0YW1wID0gbW9tZW50LnV0YyhkZXZpY2VUaW1lc3RhbXAsICdZWVlZLU1NLUREVEhIOm1tOnNzWlonKTtcbiAgaWYgKCFwYXJzZWRUaW1lc3RhbXAuaXNWYWxpZCgpKSB7XG4gICAgdGhpcy5sb2cud2FybignQ2Fubm90IHBhcnNlIHRoZSByZXR1cm5lZCB0aW1lc3RhbXAuIFJldHVybmluZyBhcyBpcycpO1xuICAgIHJldHVybiBkZXZpY2VUaW1lc3RhbXA7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZFRpbWVzdGFtcC51dGNPZmZzZXQocGFyc2VkVGltZXN0YW1wLl90em0gfHwgMCkuZm9ybWF0KGZvcm1hdCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERldmljZVRpbWVPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZm9ybWF0IFtZWVlZLU1NLUREVEhIOm1tOnNzWl0gLSBTZWUgZ2V0RGV2aWNlVGltZSNmb3JtYXRcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBkZXZpY2UgdGltZVxuICpcbiAqIEBwYXJhbSB7RGV2aWNlVGltZU9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm4ge3N0cmluZ30gRm9ybWF0dGVkIGRhdGV0aW1lIHN0cmluZyBvciB0aGUgcmF3IGNvbW1hbmQgb3V0cHV0IGlmIGZvcm1hdHRpbmcgZmFpbHNcbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0RGV2aWNlVGltZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUdldERldmljZVRpbWUgKG9wdHMgPSB7fSkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VUaW1lKG9wdHMuZm9ybWF0KTtcbn07XG5cbmNvbW1hbmRzLmdldFBhZ2VTb3VyY2UgPSBhc3luYyBmdW5jdGlvbiBnZXRQYWdlU291cmNlICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3NvdXJjZScpO1xufTtcblxuY29tbWFuZHMuYmFjayA9IGFzeW5jIGZ1bmN0aW9uIGJhY2sgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbigncHJlc3NCYWNrJyk7XG59O1xuXG5jb21tYW5kcy5pc0tleWJvYXJkU2hvd24gPSBhc3luYyBmdW5jdGlvbiBpc0tleWJvYXJkU2hvd24gKCkge1xuICBjb25zdCB7aXNLZXlib2FyZFNob3dufSA9IGF3YWl0IHRoaXMuYWRiLmlzU29mdEtleWJvYXJkUHJlc2VudCgpO1xuICByZXR1cm4gaXNLZXlib2FyZFNob3duO1xufTtcblxuY29tbWFuZHMuaGlkZUtleWJvYXJkID0gYXN5bmMgZnVuY3Rpb24gaGlkZUtleWJvYXJkICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLmhpZGVLZXlib2FyZCgpO1xufTtcblxuY29tbWFuZHMub3BlblNldHRpbmdzQWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBvcGVuU2V0dGluZ3NBY3Rpdml0eSAoc2V0dGluZykge1xuICBsZXQge2FwcFBhY2thZ2UsIGFwcEFjdGl2aXR5fSA9IGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKTtcbiAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydhbScsICdzdGFydCcsICctYScsIGBhbmRyb2lkLnNldHRpbmdzLiR7c2V0dGluZ31gXSk7XG4gIGF3YWl0IHRoaXMuYWRiLndhaXRGb3JOb3RBY3Rpdml0eShhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgNTAwMCk7XG59O1xuXG5jb21tYW5kcy5nZXRXaW5kb3dTaXplID0gYXN5bmMgZnVuY3Rpb24gZ2V0V2luZG93U2l6ZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdnZXREZXZpY2VTaXplJyk7XG59O1xuXG4vLyBGb3IgVzNDXG5jb21tYW5kcy5nZXRXaW5kb3dSZWN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0V2luZG93UmVjdCAoKSB7XG4gIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gYXdhaXQgdGhpcy5nZXRXaW5kb3dTaXplKCk7XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xufTtcblxuY29tbWFuZHMuZ2V0Q3VycmVudEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudEFjdGl2aXR5ICgpIHtcbiAgcmV0dXJuIChhd2FpdCB0aGlzLmFkYi5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5KCkpLmFwcEFjdGl2aXR5O1xufTtcblxuY29tbWFuZHMuZ2V0Q3VycmVudFBhY2thZ2UgPSBhc3luYyBmdW5jdGlvbiBnZXRDdXJyZW50UGFja2FnZSAoKSB7XG4gIHJldHVybiAoYXdhaXQgdGhpcy5hZGIuZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSgpKS5hcHBQYWNrYWdlO1xufTtcblxuY29tbWFuZHMuYmFja2dyb3VuZCA9IGFzeW5jIGZ1bmN0aW9uIGJhY2tncm91bmQgKHNlY29uZHMpIHtcbiAgaWYgKHNlY29uZHMgPCAwKSB7XG4gICAgLy8gaWYgdXNlciBwYXNzZXMgaW4gYSBuZWdhdGl2ZSBzZWNvbmRzIHZhbHVlLCBpbnRlcnByZXQgdGhhdCBhcyB0aGUgaW5zdHJ1Y3Rpb25cbiAgICAvLyB0byBub3QgYnJpbmcgdGhlIGFwcCBiYWNrIGF0IGFsbFxuICAgIGF3YWl0IHRoaXMuYWRiLmdvVG9Ib21lKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgbGV0IHthcHBQYWNrYWdlLCBhcHBBY3Rpdml0eX0gPSBhd2FpdCB0aGlzLmFkYi5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5KCk7XG4gIGF3YWl0IHRoaXMuYWRiLmdvVG9Ib21lKCk7XG5cbiAgLy8gcGVvcGxlIGNhbiB3YWl0IGZvciBhIGxvbmcgdGltZSwgc28gdG8gYmUgc2FmZSBsZXQncyB1c2UgdGhlIGxvbmdTbGVlcCBmdW5jdGlvbiBhbmQgbG9nXG4gIC8vIHByb2dyZXNzIHBlcmlvZGljYWxseS5cbiAgY29uc3Qgc2xlZXBNcyA9IHNlY29uZHMgKiAxMDAwO1xuICBjb25zdCB0aHJlc2hvbGRNcyA9IDMwICogMTAwMDsgLy8gdXNlIHRoZSBzcGluLXdhaXQgZm9yIGFueXRoaW5nIG92ZXIgdGhpcyB0aHJlc2hvbGRcbiAgLy8gZm9yIG91ciBzcGluIGludGVydmFsLCB1c2UgMSUgb2YgdGhlIHRvdGFsIHdhaXQgdGltZSwgYnV0IG5vdGhpbmcgYmlnZ2VyIHRoYW4gMzBzXG4gIGNvbnN0IGludGVydmFsTXMgPSBfLm1pbihbMzAgKiAxMDAwLCBwYXJzZUludChzbGVlcE1zIC8gMTAwLCAxMCldKTtcbiAgY29uc3QgcHJvZ3Jlc3NDYiA9ICh7ZWxhcHNlZE1zLCBwcm9ncmVzc30pID0+IHtcbiAgICBjb25zdCB3YWl0U2VjcyA9IChlbGFwc2VkTXMgLyAxMDAwKS50b0ZpeGVkKDApO1xuICAgIGNvbnN0IHByb2dyZXNzUGN0ID0gKHByb2dyZXNzICogMTAwKS50b0ZpeGVkKDIpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBXYWl0ZWQgJHt3YWl0U2Vjc31zIHNvIGZhciAoJHtwcm9ncmVzc1BjdH0lKWApO1xuICB9O1xuICBhd2FpdCBsb25nU2xlZXAoc2xlZXBNcywge3RocmVzaG9sZE1zLCBpbnRlcnZhbE1zLCBwcm9ncmVzc0NifSk7XG5cbiAgbGV0IGFyZ3M7XG4gIGlmICh0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3MgJiYgdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzW2Ake2FwcFBhY2thZ2V9LyR7YXBwQWN0aXZpdHl9YF0pIHtcbiAgICAvLyB0aGUgYWN0aXZpdHkgd2FzIHN0YXJ0ZWQgd2l0aCBgc3RhcnRBY3Rpdml0eWAsIHNvIHVzZSB0aG9zZSBhcmdzIHRvIHJlc3RhcnRcbiAgICBhcmdzID0gdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzW2Ake2FwcFBhY2thZ2V9LyR7YXBwQWN0aXZpdHl9YF07XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBBY3RpdmF0aW5nIGFwcCAnJHthcHBQYWNrYWdlfScgaW4gb3JkZXIgdG8gcmVzdG9yZSBpdGApO1xuICAgICAgYXdhaXQgdGhpcy5hY3RpdmF0ZUFwcChhcHBQYWNrYWdlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICBhcmdzID0gKChhcHBQYWNrYWdlID09PSB0aGlzLm9wdHMuYXBwUGFja2FnZSAmJiBhcHBBY3Rpdml0eSA9PT0gdGhpcy5vcHRzLmFwcEFjdGl2aXR5KSB8fFxuICAgICAgICAgICAgKGFwcFBhY2thZ2UgPT09IHRoaXMub3B0cy5hcHBXYWl0UGFja2FnZSAmJiAodGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSB8fCAnJykuc3BsaXQoJywnKS5pbmNsdWRlcyhhcHBBY3Rpdml0eSkpKVxuICAgICAgPyB7Ly8gdGhlIGFjdGl2aXR5IGlzIHRoZSBvcmlnaW5hbCBzZXNzaW9uIGFjdGl2aXR5LCBzbyB1c2UgdGhlIG9yaWdpbmFsIGFyZ3NcbiAgICAgICAgcGtnOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICAgICAgYWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgICAgYWN0aW9uOiB0aGlzLm9wdHMuaW50ZW50QWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogdGhpcy5vcHRzLmludGVudENhdGVnb3J5LFxuICAgICAgICBmbGFnczogdGhpcy5vcHRzLmludGVudEZsYWdzLFxuICAgICAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgICAgIHdhaXRBY3Rpdml0eTogdGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSxcbiAgICAgICAgd2FpdEZvckxhdW5jaDogdGhpcy5vcHRzLmFwcFdhaXRGb3JMYXVuY2gsXG4gICAgICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICAgICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHM6IHRoaXMub3B0cy5vcHRpb25hbEludGVudEFyZ3VtZW50cyxcbiAgICAgICAgc3RvcEFwcDogZmFsc2UsXG4gICAgICAgIHVzZXI6IHRoaXMub3B0cy51c2VyUHJvZmlsZX1cbiAgICAgIDogey8vIHRoZSBhY3Rpdml0eSB3YXMgc3RhcnRlZCBzb21lIG90aGVyIHdheSwgc28gdXNlIGRlZmF1bHRzXG4gICAgICAgIHBrZzogYXBwUGFja2FnZSxcbiAgICAgICAgYWN0aXZpdHk6IGFwcEFjdGl2aXR5LFxuICAgICAgICB3YWl0UGtnOiBhcHBQYWNrYWdlLFxuICAgICAgICB3YWl0QWN0aXZpdHk6IGFwcEFjdGl2aXR5LFxuICAgICAgICBzdG9wQXBwOiBmYWxzZX07XG4gIH1cbiAgYXJncyA9IGF3YWl0IHV0aWwuZmlsdGVyT2JqZWN0KGFyZ3MpO1xuICB0aGlzLmxvZy5kZWJ1ZyhgQnJpbmdpbmcgYXBwbGljYXRpb24gYmFjayB0byBmb3JlZ3JvdW5kIHdpdGggYXJndW1lbnRzOiAke0pTT04uc3RyaW5naWZ5KGFyZ3MpfWApO1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuc3RhcnRBcHAoYXJncyk7XG59O1xuXG5jb21tYW5kcy5nZXRTdHJpbmdzID0gYXN5bmMgZnVuY3Rpb24gZ2V0U3RyaW5ncyAobGFuZ3VhZ2UpIHtcbiAgaWYgKCFsYW5ndWFnZSkge1xuICAgIGxhbmd1YWdlID0gYXdhaXQgdGhpcy5hZGIuZ2V0RGV2aWNlTGFuZ3VhZ2UoKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBObyBsYW5ndWFnZSBzcGVjaWZpZWQsIHJldHVybmluZyBzdHJpbmdzIGZvcjogJHtsYW5ndWFnZX1gKTtcbiAgfVxuXG4gIC8vIENsaWVudHMgcmVxdWlyZSB0aGUgcmVzdWx0aW5nIG1hcHBpbmcgdG8gaGF2ZSBib3RoIGtleXNcbiAgLy8gYW5kIHZhbHVlcyBvZiB0eXBlIHN0cmluZ1xuICBjb25zdCBwcmVwcm9jZXNzU3RyaW5nc01hcCA9IChtYXBwaW5nKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKG1hcHBpbmcpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IF8uaXNTdHJpbmcodmFsdWUpID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgaWYgKHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0pIHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIHN0cmluZ3NcbiAgICByZXR1cm4gcHJlcHJvY2Vzc1N0cmluZ3NNYXAodGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSk7XG4gIH1cblxuICB0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdID0gYXdhaXQgYW5kcm9pZEhlbHBlcnMucHVzaFN0cmluZ3MobGFuZ3VhZ2UsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICBpZiAodGhpcy5ib290c3RyYXApIHtcbiAgICAvLyBUT0RPOiBUaGlzIGlzIG11dGF0aW5nIHRoZSBjdXJyZW50IGxhbmd1YWdlLCBidXQgaXQncyBob3cgYXBwaXVtIGN1cnJlbnRseSB3b3Jrc1xuICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3VwZGF0ZVN0cmluZ3MnKTtcbiAgfVxuXG4gIHJldHVybiBwcmVwcm9jZXNzU3RyaW5nc01hcCh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKTtcbn07XG5cbmNvbW1hbmRzLmxhdW5jaEFwcCA9IGFzeW5jIGZ1bmN0aW9uIGxhdW5jaEFwcCAoKSB7XG4gIGF3YWl0IHRoaXMuaW5pdEFVVCgpO1xuICBhd2FpdCB0aGlzLnN0YXJ0QVVUKCk7XG59O1xuXG5jb21tYW5kcy5zdGFydEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRBY3Rpdml0eSAoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksXG4gIGFwcFdhaXRQYWNrYWdlLCBhcHBXYWl0QWN0aXZpdHksIGludGVudEFjdGlvbiwgaW50ZW50Q2F0ZWdvcnksIGludGVudEZsYWdzLFxuICBvcHRpb25hbEludGVudEFyZ3VtZW50cywgZG9udFN0b3BBcHBPblJlc2V0KSB7XG4gIHRoaXMubG9nLmRlYnVnKGBTdGFydGluZyBwYWNrYWdlICcke2FwcFBhY2thZ2V9JyBhbmQgYWN0aXZpdHkgJyR7YXBwQWN0aXZpdHl9J2ApO1xuXG4gIC8vIGRvbnRTdG9wQXBwT25SZXNldCBpcyBib3RoIGFuIGFyZ3VtZW50IGhlcmUsIGFuZCBhIGRlc2lyZWQgY2FwYWJpbGl0eVxuICAvLyBpZiB0aGUgYXJndW1lbnQgaXMgc2V0LCB1c2UgaXQsIG90aGVyd2lzZSB1c2UgdGhlIGNhcFxuICBpZiAoIXV0aWwuaGFzVmFsdWUoZG9udFN0b3BBcHBPblJlc2V0KSkge1xuICAgIGRvbnRTdG9wQXBwT25SZXNldCA9ICEhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldDtcbiAgfVxuXG4gIGxldCBhcmdzID0ge1xuICAgIHBrZzogYXBwUGFja2FnZSxcbiAgICBhY3Rpdml0eTogYXBwQWN0aXZpdHksXG4gICAgd2FpdFBrZzogYXBwV2FpdFBhY2thZ2UgfHwgYXBwUGFja2FnZSxcbiAgICB3YWl0QWN0aXZpdHk6IGFwcFdhaXRBY3Rpdml0eSB8fCBhcHBBY3Rpdml0eSxcbiAgICBhY3Rpb246IGludGVudEFjdGlvbixcbiAgICBjYXRlZ29yeTogaW50ZW50Q2F0ZWdvcnksXG4gICAgZmxhZ3M6IGludGVudEZsYWdzLFxuICAgIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLFxuICAgIHN0b3BBcHA6ICFkb250U3RvcEFwcE9uUmVzZXRcbiAgfTtcbiAgdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzID0gdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzIHx8IHt9O1xuICB0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3NbYCR7YXJncy53YWl0UGtnfS8ke2FyZ3Mud2FpdEFjdGl2aXR5fWBdID0gYXJncztcbiAgYXdhaXQgdGhpcy5hZGIuc3RhcnRBcHAoYXJncyk7XG59O1xuXG5jb21tYW5kcy5yZXNldCA9IGFzeW5jIGZ1bmN0aW9uIHJlc2V0ICgpIHtcbiAgYXdhaXQgYW5kcm9pZEhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cywge2Zhc3RSZXNldDogdHJ1ZX0pKTtcbiAgLy8gcmVzZXQgY29udGV4dCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoYXQga2luZCBvbiBjb250ZXh0IHdlIHdpbGwgZW5kIHVwIGFmdGVyIGFwcCBsYXVuY2guXG4gIGF3YWl0IHRoaXMuc2V0Q29udGV4dCgpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5pc0Nocm9tZVNlc3Npb24gPyB0aGlzLnN0YXJ0Q2hyb21lU2Vzc2lvbigpIDogdGhpcy5zdGFydEFVVCgpO1xufTtcblxuY29tbWFuZHMuc3RhcnRBVVQgPSBhc3luYyBmdW5jdGlvbiBzdGFydEFVVCAoKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnN0YXJ0QXBwKHtcbiAgICBwa2c6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgIGFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwQWN0aXZpdHksXG4gICAgYWN0aW9uOiB0aGlzLm9wdHMuaW50ZW50QWN0aW9uLFxuICAgIGNhdGVnb3J5OiB0aGlzLm9wdHMuaW50ZW50Q2F0ZWdvcnksXG4gICAgZmxhZ3M6IHRoaXMub3B0cy5pbnRlbnRGbGFncyxcbiAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgd2FpdEFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwV2FpdEFjdGl2aXR5LFxuICAgIHdhaXRGb3JMYXVuY2g6IHRoaXMub3B0cy5hcHBXYWl0Rm9yTGF1bmNoLFxuICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICBvcHRpb25hbEludGVudEFyZ3VtZW50czogdGhpcy5vcHRzLm9wdGlvbmFsSW50ZW50QXJndW1lbnRzLFxuICAgIHN0b3BBcHA6ICF0aGlzLm9wdHMuZG9udFN0b3BBcHBPblJlc2V0LFxuICAgIHVzZXI6IHRoaXMub3B0cy51c2VyUHJvZmlsZSxcbiAgfSk7XG59O1xuXG4vLyB3ZSBvdmVycmlkZSBzZXRVcmwgdG8gdGFrZSBhbiBhbmRyb2lkIFVSSSB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZGVlcC1saW5raW5nXG4vLyBpbnNpZGUgYW4gYXBwLCBzaW1pbGFyIHRvIHN0YXJ0aW5nIGFuIGludGVudFxuY29tbWFuZHMuc2V0VXJsID0gYXN5bmMgZnVuY3Rpb24gc2V0VXJsICh1cmkpIHtcbiAgYXdhaXQgdGhpcy5hZGIuc3RhcnRVcmkodXJpLCB0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG59O1xuXG4vLyBjbG9zaW5nIGFwcCB1c2luZyBmb3JjZSBzdG9wXG5jb21tYW5kcy5jbG9zZUFwcCA9IGFzeW5jIGZ1bmN0aW9uIGNsb3NlQXBwICgpIHtcbiAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgLy8gcmVzZXQgY29udGV4dCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoYXQga2luZCBvbiBjb250ZXh0IHdlIHdpbGwgZW5kIHVwIGFmdGVyIGFwcCBsYXVuY2guXG4gIGF3YWl0IHRoaXMuc2V0Q29udGV4dCgpO1xufTtcblxuY29tbWFuZHMuZ2V0RGlzcGxheURlbnNpdHkgPSBhc3luYyBmdW5jdGlvbiBnZXREaXNwbGF5RGVuc2l0eSAoKSB7XG4gIC8vIGZpcnN0IHRyeSB0aGUgcHJvcGVydHkgZm9yIGRldmljZXNcbiAgbGV0IG91dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnZ2V0cHJvcCcsICdyby5zZi5sY2RfZGVuc2l0eSddKTtcbiAgaWYgKG91dCkge1xuICAgIGxldCB2YWwgPSBwYXJzZUludChvdXQsIDEwKTtcbiAgICAvLyBpZiB0aGUgdmFsdWUgaXMgTmFOLCB0cnkgZ2V0dGluZyB0aGUgZW11bGF0b3IgcHJvcGVydHlcbiAgICBpZiAoIWlzTmFOKHZhbCkpIHtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIHRoaXMubG9nLmRlYnVnKGBQYXJzZWQgZGVuc2l0eSB2YWx1ZSB3YXMgTmFOOiBcIiR7b3V0fVwiYCk7XG4gIH1cbiAgLy8gZmFsbGJhY2sgdG8gdHJ5aW5nIHByb3BlcnR5IGZvciBlbXVsYXRvcnNcbiAgb3V0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydnZXRwcm9wJywgJ3FlbXUuc2YubGNkX2RlbnNpdHknXSk7XG4gIGlmIChvdXQpIHtcbiAgICBsZXQgdmFsID0gcGFyc2VJbnQob3V0LCAxMCk7XG4gICAgaWYgKCFpc05hTih2YWwpKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICB0aGlzLmxvZy5kZWJ1ZyhgUGFyc2VkIGRlbnNpdHkgdmFsdWUgd2FzIE5hTjogXCIke291dH1cImApO1xuICB9XG4gIC8vIGNvdWxkbid0IGdldCBhbnl0aGluZywgc28gZXJyb3Igb3V0XG4gIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ0ZhaWxlZCB0byBnZXQgZGlzcGxheSBkZW5zaXR5IHByb3BlcnR5LicpO1xufTtcblxuY29tbWFuZHMubW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVBlcmZvcm1FZGl0b3JBY3Rpb24gKG9wdHMgPSB7fSkge1xuICBjb25zdCB7YWN0aW9ufSA9IG9wdHM7XG4gIGlmICghdXRpbC5oYXNWYWx1ZShhY3Rpb24pKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgJ2FjdGlvbicgYXJndW1lbnQgaXMgcmVxdWlyZWRgKTtcbiAgfVxuXG4gIGF3YWl0IHRoaXMuYWRiLnBlcmZvcm1FZGl0b3JBY3Rpb24oYWN0aW9uKTtcbn07XG5cbmNvbnN0IFBFUk1JU1NJT05fQUNUSU9OID0ge1xuICBHUkFOVDogJ2dyYW50JyxcbiAgUkVWT0tFOiAncmV2b2tlJyxcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2hhbmdlUGVybWlzc2lvbnNPcHRpb25zXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd8QXJyYXk8c3RyaW5nPn0gcGVybWlzc2lvbnMgLSBUaGUgZnVsbCBuYW1lIG9mIHRoZSBwZXJtaXNzaW9uIHRvIGJlIGNoYW5nZWRcbiAqIG9yIGEgbGlzdCBvZiBwZXJtaXNzaW9ucy4gTWFuZGF0b3J5IGFyZ3VtZW50LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcFBhY2thZ2UgW3RoaXMub3B0cy5hcHBQYWNrYWdlXSAtIFRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlIHRvIHNldCBjaGFuZ2VcbiAqIHBlcm1pc3Npb25zIG9uLiBEZWZhdWx0cyB0byB0aGUgcGFja2FnZSBuYW1lIHVuZGVyIHRlc3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aW9uIFtncmFudF0gLSBPbmUgb2YgYFBFUk1JU1NJT05fQUNUSU9OYCB2YWx1ZXNcbiAqL1xuXG4vKipcbiAqIENoYW5nZXMgcGFja2FnZSBwZXJtaXNzaW9ucyBpbiBydW50aW1lLlxuICpcbiAqIEBwYXJhbSB7P0NoYW5nZVBlcm1pc3Npb25zT3B0aW9uc30gb3B0cyAtIEF2YWlsYWJsZSBvcHRpb25zIG1hcHBpbmcuXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9uc1xuICovXG5jb21tYW5kcy5tb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUNoYW5nZVBlcm1pc3Npb25zIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHBlcm1pc3Npb25zLFxuICAgIGFwcFBhY2thZ2UgPSB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICBhY3Rpb24gPSBQRVJNSVNTSU9OX0FDVElPTi5HUkFOVCxcbiAgfSA9IG9wdHM7XG4gIGlmICghdXRpbC5oYXNWYWx1ZShwZXJtaXNzaW9ucykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGAncGVybWlzc2lvbnMnIGFyZ3VtZW50IGlzIHJlcXVpcmVkYCk7XG4gIH1cblxuICBsZXQgYWN0aW9uRnVuYztcbiAgc3dpdGNoIChfLnRvTG93ZXIoYWN0aW9uKSkge1xuICAgIGNhc2UgUEVSTUlTU0lPTl9BQ1RJT04uR1JBTlQ6XG4gICAgICBhY3Rpb25GdW5jID0gKGFwcFBhY2thZ2UsIHBlcm1pc3Npb24pID0+IHRoaXMuYWRiLmdyYW50UGVybWlzc2lvbihhcHBQYWNrYWdlLCBwZXJtaXNzaW9uKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgUEVSTUlTU0lPTl9BQ1RJT04uUkVWT0tFOlxuICAgICAgYWN0aW9uRnVuYyA9IChhcHBQYWNrYWdlLCBwZXJtaXNzaW9uKSA9PiB0aGlzLmFkYi5yZXZva2VQZXJtaXNzaW9uKGFwcFBhY2thZ2UsIHBlcm1pc3Npb24pO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFVua25vd24gYWN0aW9uICcke2FjdGlvbn0nLiBgICtcbiAgICAgICAgYE9ubHkgJHtKU09OLnN0cmluZ2lmeShfLnZhbHVlcyhQRVJNSVNTSU9OX0FDVElPTikpfSBhY3Rpb25zIGFyZSBzdXBwb3J0ZWRgKTtcbiAgfVxuICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gb2YgKF8uaXNBcnJheShwZXJtaXNzaW9ucykgPyBwZXJtaXNzaW9ucyA6IFtwZXJtaXNzaW9uc10pKSB7XG4gICAgYXdhaXQgYWN0aW9uRnVuYyhhcHBQYWNrYWdlLCBwZXJtaXNzaW9uKTtcbiAgfVxufTtcblxuY29uc3QgUEVSTUlTU0lPTlNfVFlQRSA9IHtcbiAgREVOSUVEOiAnZGVuaWVkJyxcbiAgR1JBTlRFRDogJ2dyYW50ZWQnLFxuICBSRVFVRVNURUQ6ICdyZXF1ZXN0ZWQnLFxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHZXRQZXJtaXNzaW9uc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlIFtyZXF1ZXN0ZWRdIC0gT25lIG9mIHBvc3NpYmxlIHBlcm1pc3Npb24gdHlwZXMgdG8gZ2V0LlxuICogQ2FuIGJlIGFueSBvZiBgUEVSTUlTU0lPTlNfVFlQRWAgdmFsdWVzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcFBhY2thZ2UgW3RoaXMub3B0cy5hcHBQYWNrYWdlXSAtIFRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlIHRvIHNldCBjaGFuZ2VcbiAqIHBlcm1pc3Npb25zIG9uLiBEZWZhdWx0cyB0byB0aGUgcGFja2FnZSBuYW1lIHVuZGVyIHRlc3QuXG4gKi9cblxuLyoqXG4gKiBHZXRzIHJ1bnRpbWUgcGVybWlzc2lvbnMgbGlzdCBmb3IgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtHZXRQZXJtaXNzaW9uc09wdGlvbnN9IG9wdHMgLSBBdmFpbGFibGUgb3B0aW9ucyBtYXBwaW5nLlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBsaXN0IG9mIHJldHJpZXZlZCBwZXJtaXNzaW9ucyBmb3IgdGhlIGdpdmVuIHR5cGVcbiAqIChjYW4gYWxzbyBiZSBlbXB0eSkuXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGdldHRpbmcgcGVybWlzc2lvbnMuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0UGVybWlzc2lvbnMgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdHlwZSA9IFBFUk1JU1NJT05TX1RZUEUuUkVRVUVTVEVELFxuICAgIGFwcFBhY2thZ2UgPSB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgfSA9IG9wdHM7XG5cbiAgbGV0IGFjdGlvbkZ1bmM7XG4gIHN3aXRjaCAoXy50b0xvd2VyKHR5cGUpKSB7XG4gICAgY2FzZSBQRVJNSVNTSU9OU19UWVBFLlJFUVVFU1RFRDpcbiAgICAgIGFjdGlvbkZ1bmMgPSAoYXBwUGFja2FnZSkgPT4gdGhpcy5hZGIuZ2V0UmVxUGVybWlzc2lvbnMoYXBwUGFja2FnZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFBFUk1JU1NJT05TX1RZUEUuR1JBTlRFRDpcbiAgICAgIGFjdGlvbkZ1bmMgPSAoYXBwUGFja2FnZSkgPT4gdGhpcy5hZGIuZ2V0R3JhbnRlZFBlcm1pc3Npb25zKGFwcFBhY2thZ2UpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBQRVJNSVNTSU9OU19UWVBFLkRFTklFRDpcbiAgICAgIGFjdGlvbkZ1bmMgPSAoYXBwUGFja2FnZSkgPT4gdGhpcy5hZGIuZ2V0RGVuaWVkUGVybWlzc2lvbnMoYXBwUGFja2FnZSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgVW5rbm93biBwZXJtaXNzaW9ucyB0eXBlICcke3R5cGV9Jy4gYCArXG4gICAgICAgIGBPbmx5ICR7SlNPTi5zdHJpbmdpZnkoXy52YWx1ZXMoUEVSTUlTU0lPTlNfVFlQRSkpfSB0eXBlcyBhcmUgc3VwcG9ydGVkYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IGFjdGlvbkZ1bmMoYXBwUGFja2FnZSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiByZWNlbnQgc3lzdGVtIG5vdGlmaWNhdGlvbnMuXG4gKlxuICogQHJldHVybnMge09iamVjdH0gU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIGBhZGIuZ2V0Tm90aWZpY2F0aW9uc2AgZm9yXG4gKiBtb3JlIGRldGFpbHNcbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0Tm90aWZpY2F0aW9ucyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUdldE5vdGlmaWNhdGlvbnMgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuZ2V0Tm90aWZpY2F0aW9ucygpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTbXNMaXN0T3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heCBbMTAwXSAtIFRoZSBtYXhpbXVtIGNvdW50IG9mIHJlY2VudCBTTVMgbWVzc2FnZXNcbiAqIHRvIHJldHJpZXZlXG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgcmVjZW50IFNNUyBtZXNzYWdlcyB3aXRoIHRoZWlyIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtTbXNMaXN0T3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge09iamVjdH0gU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIGBhZGIuZ2V0U21zTGlzdGAgZm9yXG4gKiBtb3JlIGRldGFpbHNcbiAqL1xuY29tbWFuZHMubW9iaWxlTGlzdFNtcyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUxpc3RTbXMgKG9wdHMgPSB7fSkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuZ2V0U21zTGlzdChvcHRzKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVW5sb2NrT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGtleSBUaGUgdW5sb2NrIGtleS4gVGhlIHZhbHVlIG9mIHRoaXMga2V5IGRlcGVuZHNcbiAqIG9uIHRoZSBhY3R1YWwgdW5sb2NrIHR5cGUgYW5kIGNvdWxkIGJlIGEgcGluL3Bhc3N3b3JkL3BhdHRlcm4gdmFsdWUgb3JcbiAqIGEgYmlvbWV0cmljIGZpbmdlciBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlIFRoZSB1bmxvY2sgdHlwZS4gVGhlIGZvbGxvd2luZyB1bmxvY2sgdHlwZXNcbiAqIGFyZSBzdXBwb3J0ZWQ6IGBwaW5gLCBgcGluV2l0aEtleUV2ZW50YCwgYHBhc3N3b3JkYCwgYHBhdHRlcm5gIGFuZCBgZmluZ2VycHJpbnRgLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBzdHJhdGVneSBFaXRoZXIgJ2xvY2tzZXR0aW5ncycgKGRlZmF1bHQpIG9yICd1aWF1dG9tYXRvcicuXG4gKiBTZXR0aW5nIGl0IHRvICd1aWF1dG9tYXRvcicgd2lsbCBlbmZvcmNlIHRoZSBkcml2ZXIgdG8gYXZvaWQgdXNpbmcgc3BlY2lhbFxuICogQURCIHNob3J0Y3V0cyBpbiBvcmRlciB0byBzcGVlZCB1cCB0aGUgdW5sb2NrIHByb2NlZHVyZS5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdGltZW91dE1zIFsyMDAwXSBUaGUgbWF4aW11bSB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICogdG8gd2FpdCB1bnRpbCB0aGUgc2NyZWVuIGdldHMgdW5sb2NrZWRcbiAqL1xuXG4vKipcbiAqIFVubG9ja3MgdGhlIGRldmljZSBpZiBpdCBpcyBsb2NrZWQuIE5vb3AgaWYgdGhlIGRldmljZSdzIHNjcmVlbiBpcyBub3QgbG9ja2VkLlxuICpcbiAqIEBwYXJhbSB7P1VubG9ja09wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB1bmxvY2sgb3BlcmF0aW9uIGZhaWxzIG9yIHRoZSBwcm92aWRlZFxuICogYXJndW1lbnRzIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlVW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlVW5sb2NrIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyBrZXksIHR5cGUsIHN0cmF0ZWd5LCB0aW1lb3V0TXMgfSA9IG9wdHM7XG4gIGF3YWl0IGFuZHJvaWRIZWxwZXJzLnVubG9jayh0aGlzLCB0aGlzLmFkYiwge1xuICAgIHVubG9ja0tleToga2V5LFxuICAgIHVubG9ja1R5cGU6IHR5cGUsXG4gICAgdW5sb2NrU3RyYXRlZ3k6IHN0cmF0ZWd5LFxuICAgIHVubG9ja1N1Y2Nlc3NUaW1lb3V0OiB0aW1lb3V0TXMsXG4gIH0pO1xufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQgeyBjb21tYW5kcywgaGVscGVycyB9O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxxQkFBcUIsR0FBRyxzQkFBOUI7QUFFQSxJQUFJQyxRQUFRLEdBQUcsRUFBZjtBQUFBLElBQW1CQyxPQUFPLEdBQUcsRUFBN0I7QUFBQSxJQUFpQ0MsVUFBVSxHQUFHLEVBQTlDOzs7O0FBRUFGLFFBQVEsQ0FBQ0csSUFBVCxHQUFnQixlQUFlQSxJQUFmLENBQXFCQSxJQUFyQixFQUEyQjtFQUV6Q0EsSUFBSSxHQUFHQyxlQUFBLENBQUVDLE9BQUYsQ0FBVUYsSUFBVixJQUFrQkEsSUFBSSxDQUFDRyxJQUFMLENBQVUsRUFBVixDQUFsQixHQUFrQ0gsSUFBekM7RUFDQSxJQUFJSSxNQUFNLEdBQUc7SUFDWEMsSUFBSSxFQUFFTCxJQURLO0lBRVhNLE9BQU8sRUFBRTtFQUZFLENBQWI7O0VBSUEsSUFBSSxLQUFLQyxJQUFMLENBQVVDLGVBQWQsRUFBK0I7SUFDN0JKLE1BQU0sQ0FBQ0ksZUFBUCxHQUF5QixJQUF6QjtFQUNEOztFQUNELE1BQU0sS0FBS0MsVUFBTCxDQUFnQkwsTUFBaEIsQ0FBTjtBQUNELENBWEQ7O0FBYUFQLFFBQVEsQ0FBQ1ksVUFBVCxHQUFzQixlQUFlQSxVQUFmLENBQTJCTCxNQUEzQixFQUFtQztFQUN2RCxPQUFPLE1BQU0sS0FBS00sU0FBTCxDQUFlQyxVQUFmLENBQTBCLFNBQTFCLEVBQXFDUCxNQUFyQyxDQUFiO0FBQ0QsQ0FGRDs7QUFhQVAsUUFBUSxDQUFDZSxhQUFULEdBQXlCLGVBQWVBLGFBQWYsQ0FBOEJDLE1BQU0sR0FBR2pC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
|
|
361
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNT01FTlRfRk9STUFUX0lTTzg2MDEiLCJBTExfUEVSTUlTU0lPTlNfTUFHSUMiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwia2V5cyIsIl8iLCJpc0FycmF5Iiwiam9pbiIsInBhcmFtcyIsInRleHQiLCJyZXBsYWNlIiwib3B0cyIsInVuaWNvZGVLZXlib2FyZCIsImRvU2VuZEtleXMiLCJib290c3RyYXAiLCJzZW5kQWN0aW9uIiwiZ2V0RGV2aWNlVGltZSIsImZvcm1hdCIsImxvZyIsImRlYnVnIiwiZGV2aWNlVGltZXN0YW1wIiwiYWRiIiwic2hlbGwiLCJ0cmltIiwicGFyc2VkVGltZXN0YW1wIiwibW9tZW50IiwidXRjIiwiaXNWYWxpZCIsIndhcm4iLCJ1dGNPZmZzZXQiLCJfdHptIiwibW9iaWxlR2V0RGV2aWNlVGltZSIsImdldFBhZ2VTb3VyY2UiLCJiYWNrIiwiaXNLZXlib2FyZFNob3duIiwiaXNTb2Z0S2V5Ym9hcmRQcmVzZW50IiwiaGlkZUtleWJvYXJkIiwib3BlblNldHRpbmdzQWN0aXZpdHkiLCJzZXR0aW5nIiwiYXBwUGFja2FnZSIsImFwcEFjdGl2aXR5IiwiZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSIsIndhaXRGb3JOb3RBY3Rpdml0eSIsImdldFdpbmRvd1NpemUiLCJnZXRXaW5kb3dSZWN0Iiwid2lkdGgiLCJoZWlnaHQiLCJ4IiwieSIsImdldEN1cnJlbnRBY3Rpdml0eSIsImdldEN1cnJlbnRQYWNrYWdlIiwiYmFja2dyb3VuZCIsInNlY29uZHMiLCJnb1RvSG9tZSIsInNsZWVwTXMiLCJ0aHJlc2hvbGRNcyIsImludGVydmFsTXMiLCJtaW4iLCJwYXJzZUludCIsInByb2dyZXNzQ2IiLCJlbGFwc2VkTXMiLCJwcm9ncmVzcyIsIndhaXRTZWNzIiwidG9GaXhlZCIsInByb2dyZXNzUGN0IiwibG9uZ1NsZWVwIiwiYXJncyIsIl9jYWNoZWRBY3Rpdml0eUFyZ3MiLCJhY3RpdmF0ZUFwcCIsImlnbiIsImFwcFdhaXRQYWNrYWdlIiwiYXBwV2FpdEFjdGl2aXR5Iiwic3BsaXQiLCJpbmNsdWRlcyIsInBrZyIsImFjdGl2aXR5IiwiYWN0aW9uIiwiaW50ZW50QWN0aW9uIiwiY2F0ZWdvcnkiLCJpbnRlbnRDYXRlZ29yeSIsImZsYWdzIiwiaW50ZW50RmxhZ3MiLCJ3YWl0UGtnIiwid2FpdEFjdGl2aXR5Iiwid2FpdEZvckxhdW5jaCIsImFwcFdhaXRGb3JMYXVuY2giLCJ3YWl0RHVyYXRpb24iLCJhcHBXYWl0RHVyYXRpb24iLCJvcHRpb25hbEludGVudEFyZ3VtZW50cyIsInN0b3BBcHAiLCJ1c2VyIiwidXNlclByb2ZpbGUiLCJ1dGlsIiwiZmlsdGVyT2JqZWN0IiwiSlNPTiIsInN0cmluZ2lmeSIsInN0YXJ0QXBwIiwiZ2V0U3RyaW5ncyIsImxhbmd1YWdlIiwiZ2V0RGV2aWNlTGFuZ3VhZ2UiLCJpbmZvIiwicHJlcHJvY2Vzc1N0cmluZ3NNYXAiLCJtYXBwaW5nIiwicmVzdWx0Iiwia2V5IiwidmFsdWUiLCJ0b1BhaXJzIiwiaXNTdHJpbmciLCJhcGtTdHJpbmdzIiwiYW5kcm9pZEhlbHBlcnMiLCJwdXNoU3RyaW5ncyIsImxhdW5jaEFwcCIsImluaXRBVVQiLCJzdGFydEFVVCIsInN0YXJ0QWN0aXZpdHkiLCJkb250U3RvcEFwcE9uUmVzZXQiLCJoYXNWYWx1ZSIsInJlc2V0IiwicmVzZXRBcHAiLCJPYmplY3QiLCJhc3NpZ24iLCJmYXN0UmVzZXQiLCJzZXRDb250ZXh0IiwiaXNDaHJvbWVTZXNzaW9uIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwic2V0VXJsIiwidXJpIiwic3RhcnRVcmkiLCJjbG9zZUFwcCIsImZvcmNlU3RvcCIsImdldERpc3BsYXlEZW5zaXR5Iiwib3V0IiwidmFsIiwiaXNOYU4iLCJlcnJvckFuZFRocm93IiwibW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbiIsImVycm9ycyIsIkludmFsaWRBcmd1bWVudEVycm9yIiwicGVyZm9ybUVkaXRvckFjdGlvbiIsIlBFUk1JU1NJT05fQUNUSU9OIiwiR1JBTlQiLCJSRVZPS0UiLCJtb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwiaXNOaWwiLCJpc0VtcHR5IiwibG93ZXJBY3Rpb24iLCJ0b0xvd2VyIiwidmFsdWVzIiwiYWZmZWN0ZWRQZXJtaXNzaW9ucyIsImR1bXBzeXMiLCJncmFudGVkUGVybWlzc2lvbnMiLCJnZXRHcmFudGVkUGVybWlzc2lvbnMiLCJyZXFQZXJtaXNzb25zIiwiZ2V0UmVxUGVybWlzc2lvbnMiLCJkaWZmZXJlbmNlIiwiZ3JhbnRQZXJtaXNzaW9ucyIsIkIiLCJhbGwiLCJtYXAiLCJuYW1lIiwicmV2b2tlUGVybWlzc2lvbiIsIlBFUk1JU1NJT05TX1RZUEUiLCJERU5JRUQiLCJHUkFOVEVEIiwiUkVRVUVTVEVEIiwibW9iaWxlR2V0UGVybWlzc2lvbnMiLCJ0eXBlIiwiYWN0aW9uRnVuYyIsImdldERlbmllZFBlcm1pc3Npb25zIiwibW9iaWxlR2V0Tm90aWZpY2F0aW9ucyIsImdldE5vdGlmaWNhdGlvbnMiLCJtb2JpbGVMaXN0U21zIiwiZ2V0U21zTGlzdCIsIm1vYmlsZVVubG9jayIsInN0cmF0ZWd5IiwidGltZW91dE1zIiwidW5sb2NrIiwidW5sb2NrS2V5IiwidW5sb2NrVHlwZSIsInVubG9ja1N0cmF0ZWd5IiwidW5sb2NrU3VjY2Vzc1RpbWVvdXQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvZ2VuZXJhbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGFuZHJvaWRIZWxwZXJzIGZyb20gJy4uL2FuZHJvaWQtaGVscGVycyc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgbG9uZ1NsZWVwIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5cbmNvbnN0IE1PTUVOVF9GT1JNQVRfSVNPODYwMSA9ICdZWVlZLU1NLUREVEhIOm1tOnNzWic7XG5jb25zdCBBTExfUEVSTUlTU0lPTlNfTUFHSUMgPSAnYWxsJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb21tYW5kcy5rZXlzID0gYXN5bmMgZnVuY3Rpb24ga2V5cyAoa2V5cykge1xuICAvLyBQcm90b2NvbCBzZW5kcyBhbiBhcnJheTsgcmV0aGluayBhcHByb2FjaFxuICBrZXlzID0gXy5pc0FycmF5KGtleXMpID8ga2V5cy5qb2luKCcnKSA6IGtleXM7XG4gIGxldCBwYXJhbXMgPSB7XG4gICAgdGV4dDoga2V5cyxcbiAgICByZXBsYWNlOiBmYWxzZVxuICB9O1xuICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCkge1xuICAgIHBhcmFtcy51bmljb2RlS2V5Ym9hcmQgPSB0cnVlO1xuICB9XG4gIGF3YWl0IHRoaXMuZG9TZW5kS2V5cyhwYXJhbXMpO1xufTtcblxuY29tbWFuZHMuZG9TZW5kS2V5cyA9IGFzeW5jIGZ1bmN0aW9uIGRvU2VuZEtleXMgKHBhcmFtcykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignc2V0VGV4dCcsIHBhcmFtcyk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBkZXZpY2UncyB0aW1lc3RhbXAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCAtIFRoZSBzZXQgb2YgZm9ybWF0IHNwZWNpZmllcnMuIFJlYWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL21vbWVudGpzLmNvbS9kb2NzLyB0byBnZXQgdGhlIGZ1bGwgbGlzdCBvZiBzdXBwb3J0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRldGltZSBmb3JtYXQgc3BlY2lmaWVycy4gVGhlIGRlZmF1bHQgZm9ybWF0IGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYFlZWVktTU0tRERUSEg6bW06c3NaYCwgd2hpY2ggY29tcGxpZXMgdG8gSVNPLTg2MDFcbiAqIEByZXR1cm4ge3N0cmluZ30gRm9ybWF0dGVkIGRhdGV0aW1lIHN0cmluZyBvciB0aGUgcmF3IGNvbW1hbmQgb3V0cHV0IGlmIGZvcm1hdHRpbmcgZmFpbHNcbiAqL1xuY29tbWFuZHMuZ2V0RGV2aWNlVGltZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVRpbWUgKGZvcm1hdCA9IE1PTUVOVF9GT1JNQVRfSVNPODYwMSkge1xuICB0aGlzLmxvZy5kZWJ1ZygnQXR0ZW1wdGluZyB0byBjYXB0dXJlIGFuZHJvaWQgZGV2aWNlIGRhdGUgYW5kIHRpbWUuICcgK1xuICAgIGBUaGUgZm9ybWF0IHNwZWNpZmllciBpcyAnJHtmb3JtYXR9J2ApO1xuICBjb25zdCBkZXZpY2VUaW1lc3RhbXAgPSAoYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydkYXRlJywgJyslWS0lbS0lZFQlVCV6J10pKS50cmltKCk7XG4gIHRoaXMubG9nLmRlYnVnKGBHb3QgZGV2aWNlIHRpbWVzdGFtcDogJHtkZXZpY2VUaW1lc3RhbXB9YCk7XG4gIGNvbnN0IHBhcnNlZFRpbWVzdGFtcCA9IG1vbWVudC51dGMoZGV2aWNlVGltZXN0YW1wLCAnWVlZWS1NTS1ERFRISDptbTpzc1paJyk7XG4gIGlmICghcGFyc2VkVGltZXN0YW1wLmlzVmFsaWQoKSkge1xuICAgIHRoaXMubG9nLndhcm4oJ0Nhbm5vdCBwYXJzZSB0aGUgcmV0dXJuZWQgdGltZXN0YW1wLiBSZXR1cm5pbmcgYXMgaXMnKTtcbiAgICByZXR1cm4gZGV2aWNlVGltZXN0YW1wO1xuICB9XG4gIHJldHVybiBwYXJzZWRUaW1lc3RhbXAudXRjT2Zmc2V0KHBhcnNlZFRpbWVzdGFtcC5fdHptIHx8IDApLmZvcm1hdChmb3JtYXQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZXZpY2VUaW1lT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGZvcm1hdCBbWVlZWS1NTS1ERFRISDptbTpzc1pdIC0gU2VlIGdldERldmljZVRpbWUjZm9ybWF0XG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgZGV2aWNlIHRpbWVcbiAqXG4gKiBAcGFyYW0ge0RldmljZVRpbWVPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEZvcm1hdHRlZCBkYXRldGltZSBzdHJpbmcgb3IgdGhlIHJhdyBjb21tYW5kIG91dHB1dCBpZiBmb3JtYXR0aW5nIGZhaWxzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldERldmljZVRpbWUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXREZXZpY2VUaW1lIChvcHRzID0ge30pIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlVGltZShvcHRzLmZvcm1hdCk7XG59O1xuXG5jb21tYW5kcy5nZXRQYWdlU291cmNlID0gYXN5bmMgZnVuY3Rpb24gZ2V0UGFnZVNvdXJjZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdzb3VyY2UnKTtcbn07XG5cbmNvbW1hbmRzLmJhY2sgPSBhc3luYyBmdW5jdGlvbiBiYWNrICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3ByZXNzQmFjaycpO1xufTtcblxuY29tbWFuZHMuaXNLZXlib2FyZFNob3duID0gYXN5bmMgZnVuY3Rpb24gaXNLZXlib2FyZFNob3duICgpIHtcbiAgY29uc3Qge2lzS2V5Ym9hcmRTaG93bn0gPSBhd2FpdCB0aGlzLmFkYi5pc1NvZnRLZXlib2FyZFByZXNlbnQoKTtcbiAgcmV0dXJuIGlzS2V5Ym9hcmRTaG93bjtcbn07XG5cbmNvbW1hbmRzLmhpZGVLZXlib2FyZCA9IGFzeW5jIGZ1bmN0aW9uIGhpZGVLZXlib2FyZCAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5oaWRlS2V5Ym9hcmQoKTtcbn07XG5cbmNvbW1hbmRzLm9wZW5TZXR0aW5nc0FjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gb3BlblNldHRpbmdzQWN0aXZpdHkgKHNldHRpbmcpIHtcbiAgbGV0IHthcHBQYWNrYWdlLCBhcHBBY3Rpdml0eX0gPSBhd2FpdCB0aGlzLmFkYi5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5KCk7XG4gIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnYW0nLCAnc3RhcnQnLCAnLWEnLCBgYW5kcm9pZC5zZXR0aW5ncy4ke3NldHRpbmd9YF0pO1xuICBhd2FpdCB0aGlzLmFkYi53YWl0Rm9yTm90QWN0aXZpdHkoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksIDUwMDApO1xufTtcblxuY29tbWFuZHMuZ2V0V2luZG93U2l6ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFdpbmRvd1NpemUgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZ2V0RGV2aWNlU2l6ZScpO1xufTtcblxuLy8gRm9yIFczQ1xuY29tbWFuZHMuZ2V0V2luZG93UmVjdCA9IGFzeW5jIGZ1bmN0aW9uIGdldFdpbmRvd1JlY3QgKCkge1xuICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGF3YWl0IHRoaXMuZ2V0V2luZG93U2l6ZSgpO1xuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcbn07XG5cbmNvbW1hbmRzLmdldEN1cnJlbnRBY3Rpdml0eSA9IGFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRBY3Rpdml0eSAoKSB7XG4gIHJldHVybiAoYXdhaXQgdGhpcy5hZGIuZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSgpKS5hcHBBY3Rpdml0eTtcbn07XG5cbmNvbW1hbmRzLmdldEN1cnJlbnRQYWNrYWdlID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudFBhY2thZ2UgKCkge1xuICByZXR1cm4gKGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKSkuYXBwUGFja2FnZTtcbn07XG5cbmNvbW1hbmRzLmJhY2tncm91bmQgPSBhc3luYyBmdW5jdGlvbiBiYWNrZ3JvdW5kIChzZWNvbmRzKSB7XG4gIGlmIChzZWNvbmRzIDwgMCkge1xuICAgIC8vIGlmIHVzZXIgcGFzc2VzIGluIGEgbmVnYXRpdmUgc2Vjb25kcyB2YWx1ZSwgaW50ZXJwcmV0IHRoYXQgYXMgdGhlIGluc3RydWN0aW9uXG4gICAgLy8gdG8gbm90IGJyaW5nIHRoZSBhcHAgYmFjayBhdCBhbGxcbiAgICBhd2FpdCB0aGlzLmFkYi5nb1RvSG9tZSgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGxldCB7YXBwUGFja2FnZSwgYXBwQWN0aXZpdHl9ID0gYXdhaXQgdGhpcy5hZGIuZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSgpO1xuICBhd2FpdCB0aGlzLmFkYi5nb1RvSG9tZSgpO1xuXG4gIC8vIHBlb3BsZSBjYW4gd2FpdCBmb3IgYSBsb25nIHRpbWUsIHNvIHRvIGJlIHNhZmUgbGV0J3MgdXNlIHRoZSBsb25nU2xlZXAgZnVuY3Rpb24gYW5kIGxvZ1xuICAvLyBwcm9ncmVzcyBwZXJpb2RpY2FsbHkuXG4gIGNvbnN0IHNsZWVwTXMgPSBzZWNvbmRzICogMTAwMDtcbiAgY29uc3QgdGhyZXNob2xkTXMgPSAzMCAqIDEwMDA7IC8vIHVzZSB0aGUgc3Bpbi13YWl0IGZvciBhbnl0aGluZyBvdmVyIHRoaXMgdGhyZXNob2xkXG4gIC8vIGZvciBvdXIgc3BpbiBpbnRlcnZhbCwgdXNlIDElIG9mIHRoZSB0b3RhbCB3YWl0IHRpbWUsIGJ1dCBub3RoaW5nIGJpZ2dlciB0aGFuIDMwc1xuICBjb25zdCBpbnRlcnZhbE1zID0gXy5taW4oWzMwICogMTAwMCwgcGFyc2VJbnQoc2xlZXBNcyAvIDEwMCwgMTApXSk7XG4gIGNvbnN0IHByb2dyZXNzQ2IgPSAoe2VsYXBzZWRNcywgcHJvZ3Jlc3N9KSA9PiB7XG4gICAgY29uc3Qgd2FpdFNlY3MgPSAoZWxhcHNlZE1zIC8gMTAwMCkudG9GaXhlZCgwKTtcbiAgICBjb25zdCBwcm9ncmVzc1BjdCA9IChwcm9ncmVzcyAqIDEwMCkudG9GaXhlZCgyKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgV2FpdGVkICR7d2FpdFNlY3N9cyBzbyBmYXIgKCR7cHJvZ3Jlc3NQY3R9JSlgKTtcbiAgfTtcbiAgYXdhaXQgbG9uZ1NsZWVwKHNsZWVwTXMsIHt0aHJlc2hvbGRNcywgaW50ZXJ2YWxNcywgcHJvZ3Jlc3NDYn0pO1xuXG4gIGxldCBhcmdzO1xuICBpZiAodGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzICYmIHRoaXMuX2NhY2hlZEFjdGl2aXR5QXJnc1tgJHthcHBQYWNrYWdlfS8ke2FwcEFjdGl2aXR5fWBdKSB7XG4gICAgLy8gdGhlIGFjdGl2aXR5IHdhcyBzdGFydGVkIHdpdGggYHN0YXJ0QWN0aXZpdHlgLCBzbyB1c2UgdGhvc2UgYXJncyB0byByZXN0YXJ0XG4gICAgYXJncyA9IHRoaXMuX2NhY2hlZEFjdGl2aXR5QXJnc1tgJHthcHBQYWNrYWdlfS8ke2FwcEFjdGl2aXR5fWBdO1xuICB9IGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgQWN0aXZhdGluZyBhcHAgJyR7YXBwUGFja2FnZX0nIGluIG9yZGVyIHRvIHJlc3RvcmUgaXRgKTtcbiAgICAgIGF3YWl0IHRoaXMuYWN0aXZhdGVBcHAoYXBwUGFja2FnZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgYXJncyA9ICgoYXBwUGFja2FnZSA9PT0gdGhpcy5vcHRzLmFwcFBhY2thZ2UgJiYgYXBwQWN0aXZpdHkgPT09IHRoaXMub3B0cy5hcHBBY3Rpdml0eSkgfHxcbiAgICAgICAgICAgIChhcHBQYWNrYWdlID09PSB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UgJiYgKHRoaXMub3B0cy5hcHBXYWl0QWN0aXZpdHkgfHwgJycpLnNwbGl0KCcsJykuaW5jbHVkZXMoYXBwQWN0aXZpdHkpKSlcbiAgICAgID8gey8vIHRoZSBhY3Rpdml0eSBpcyB0aGUgb3JpZ2luYWwgc2Vzc2lvbiBhY3Rpdml0eSwgc28gdXNlIHRoZSBvcmlnaW5hbCBhcmdzXG4gICAgICAgIHBrZzogdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgICAgIGFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwQWN0aXZpdHksXG4gICAgICAgIGFjdGlvbjogdGhpcy5vcHRzLmludGVudEFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IHRoaXMub3B0cy5pbnRlbnRDYXRlZ29yeSxcbiAgICAgICAgZmxhZ3M6IHRoaXMub3B0cy5pbnRlbnRGbGFncyxcbiAgICAgICAgd2FpdFBrZzogdGhpcy5vcHRzLmFwcFdhaXRQYWNrYWdlLFxuICAgICAgICB3YWl0QWN0aXZpdHk6IHRoaXMub3B0cy5hcHBXYWl0QWN0aXZpdHksXG4gICAgICAgIHdhaXRGb3JMYXVuY2g6IHRoaXMub3B0cy5hcHBXYWl0Rm9yTGF1bmNoLFxuICAgICAgICB3YWl0RHVyYXRpb246IHRoaXMub3B0cy5hcHBXYWl0RHVyYXRpb24sXG4gICAgICAgIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzOiB0aGlzLm9wdHMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHMsXG4gICAgICAgIHN0b3BBcHA6IGZhbHNlLFxuICAgICAgICB1c2VyOiB0aGlzLm9wdHMudXNlclByb2ZpbGV9XG4gICAgICA6IHsvLyB0aGUgYWN0aXZpdHkgd2FzIHN0YXJ0ZWQgc29tZSBvdGhlciB3YXksIHNvIHVzZSBkZWZhdWx0c1xuICAgICAgICBwa2c6IGFwcFBhY2thZ2UsXG4gICAgICAgIGFjdGl2aXR5OiBhcHBBY3Rpdml0eSxcbiAgICAgICAgd2FpdFBrZzogYXBwUGFja2FnZSxcbiAgICAgICAgd2FpdEFjdGl2aXR5OiBhcHBBY3Rpdml0eSxcbiAgICAgICAgc3RvcEFwcDogZmFsc2V9O1xuICB9XG4gIGFyZ3MgPSBhd2FpdCB1dGlsLmZpbHRlck9iamVjdChhcmdzKTtcbiAgdGhpcy5sb2cuZGVidWcoYEJyaW5naW5nIGFwcGxpY2F0aW9uIGJhY2sgdG8gZm9yZWdyb3VuZCB3aXRoIGFyZ3VtZW50czogJHtKU09OLnN0cmluZ2lmeShhcmdzKX1gKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnN0YXJ0QXBwKGFyZ3MpO1xufTtcblxuY29tbWFuZHMuZ2V0U3RyaW5ncyA9IGFzeW5jIGZ1bmN0aW9uIGdldFN0cmluZ3MgKGxhbmd1YWdlKSB7XG4gIGlmICghbGFuZ3VhZ2UpIHtcbiAgICBsYW5ndWFnZSA9IGF3YWl0IHRoaXMuYWRiLmdldERldmljZUxhbmd1YWdlKCk7XG4gICAgdGhpcy5sb2cuaW5mbyhgTm8gbGFuZ3VhZ2Ugc3BlY2lmaWVkLCByZXR1cm5pbmcgc3RyaW5ncyBmb3I6ICR7bGFuZ3VhZ2V9YCk7XG4gIH1cblxuICAvLyBDbGllbnRzIHJlcXVpcmUgdGhlIHJlc3VsdGluZyBtYXBwaW5nIHRvIGhhdmUgYm90aCBrZXlzXG4gIC8vIGFuZCB2YWx1ZXMgb2YgdHlwZSBzdHJpbmdcbiAgY29uc3QgcHJlcHJvY2Vzc1N0cmluZ3NNYXAgPSAobWFwcGluZykgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIF8udG9QYWlycyhtYXBwaW5nKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBfLmlzU3RyaW5nKHZhbHVlKSA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIGlmICh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKSB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCBzdHJpbmdzXG4gICAgcmV0dXJuIHByZXByb2Nlc3NTdHJpbmdzTWFwKHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0pO1xuICB9XG5cbiAgdGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSA9IGF3YWl0IGFuZHJvaWRIZWxwZXJzLnB1c2hTdHJpbmdzKGxhbmd1YWdlLCB0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgaWYgKHRoaXMuYm9vdHN0cmFwKSB7XG4gICAgLy8gVE9ETzogVGhpcyBpcyBtdXRhdGluZyB0aGUgY3VycmVudCBsYW5ndWFnZSwgYnV0IGl0J3MgaG93IGFwcGl1bSBjdXJyZW50bHkgd29ya3NcbiAgICBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCd1cGRhdGVTdHJpbmdzJyk7XG4gIH1cblxuICByZXR1cm4gcHJlcHJvY2Vzc1N0cmluZ3NNYXAodGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSk7XG59O1xuXG5jb21tYW5kcy5sYXVuY2hBcHAgPSBhc3luYyBmdW5jdGlvbiBsYXVuY2hBcHAgKCkge1xuICBhd2FpdCB0aGlzLmluaXRBVVQoKTtcbiAgYXdhaXQgdGhpcy5zdGFydEFVVCgpO1xufTtcblxuY29tbWFuZHMuc3RhcnRBY3Rpdml0eSA9IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0QWN0aXZpdHkgKGFwcFBhY2thZ2UsIGFwcEFjdGl2aXR5LFxuICBhcHBXYWl0UGFja2FnZSwgYXBwV2FpdEFjdGl2aXR5LCBpbnRlbnRBY3Rpb24sIGludGVudENhdGVnb3J5LCBpbnRlbnRGbGFncyxcbiAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMsIGRvbnRTdG9wQXBwT25SZXNldCkge1xuICB0aGlzLmxvZy5kZWJ1ZyhgU3RhcnRpbmcgcGFja2FnZSAnJHthcHBQYWNrYWdlfScgYW5kIGFjdGl2aXR5ICcke2FwcEFjdGl2aXR5fSdgKTtcblxuICAvLyBkb250U3RvcEFwcE9uUmVzZXQgaXMgYm90aCBhbiBhcmd1bWVudCBoZXJlLCBhbmQgYSBkZXNpcmVkIGNhcGFiaWxpdHlcbiAgLy8gaWYgdGhlIGFyZ3VtZW50IGlzIHNldCwgdXNlIGl0LCBvdGhlcndpc2UgdXNlIHRoZSBjYXBcbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKGRvbnRTdG9wQXBwT25SZXNldCkpIHtcbiAgICBkb250U3RvcEFwcE9uUmVzZXQgPSAhIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQ7XG4gIH1cblxuICBsZXQgYXJncyA9IHtcbiAgICBwa2c6IGFwcFBhY2thZ2UsXG4gICAgYWN0aXZpdHk6IGFwcEFjdGl2aXR5LFxuICAgIHdhaXRQa2c6IGFwcFdhaXRQYWNrYWdlIHx8IGFwcFBhY2thZ2UsXG4gICAgd2FpdEFjdGl2aXR5OiBhcHBXYWl0QWN0aXZpdHkgfHwgYXBwQWN0aXZpdHksXG4gICAgYWN0aW9uOiBpbnRlbnRBY3Rpb24sXG4gICAgY2F0ZWdvcnk6IGludGVudENhdGVnb3J5LFxuICAgIGZsYWdzOiBpbnRlbnRGbGFncyxcbiAgICBvcHRpb25hbEludGVudEFyZ3VtZW50cyxcbiAgICBzdG9wQXBwOiAhZG9udFN0b3BBcHBPblJlc2V0XG4gIH07XG4gIHRoaXMuX2NhY2hlZEFjdGl2aXR5QXJncyA9IHRoaXMuX2NhY2hlZEFjdGl2aXR5QXJncyB8fCB7fTtcbiAgdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzW2Ake2FyZ3Mud2FpdFBrZ30vJHthcmdzLndhaXRBY3Rpdml0eX1gXSA9IGFyZ3M7XG4gIGF3YWl0IHRoaXMuYWRiLnN0YXJ0QXBwKGFyZ3MpO1xufTtcblxuY29tbWFuZHMucmVzZXQgPSBhc3luYyBmdW5jdGlvbiByZXNldCAoKSB7XG4gIGF3YWl0IGFuZHJvaWRIZWxwZXJzLnJlc2V0QXBwKHRoaXMuYWRiLCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMsIHtmYXN0UmVzZXQ6IHRydWV9KSk7XG4gIC8vIHJlc2V0IGNvbnRleHQgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGF0IGtpbmQgb24gY29udGV4dCB3ZSB3aWxsIGVuZCB1cCBhZnRlciBhcHAgbGF1bmNoLlxuICBhd2FpdCB0aGlzLnNldENvbnRleHQoKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuaXNDaHJvbWVTZXNzaW9uID8gdGhpcy5zdGFydENocm9tZVNlc3Npb24oKSA6IHRoaXMuc3RhcnRBVVQoKTtcbn07XG5cbmNvbW1hbmRzLnN0YXJ0QVVUID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRBVVQgKCkge1xuICBhd2FpdCB0aGlzLmFkYi5zdGFydEFwcCh7XG4gICAgcGtnOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICBhY3Rpdml0eTogdGhpcy5vcHRzLmFwcEFjdGl2aXR5LFxuICAgIGFjdGlvbjogdGhpcy5vcHRzLmludGVudEFjdGlvbixcbiAgICBjYXRlZ29yeTogdGhpcy5vcHRzLmludGVudENhdGVnb3J5LFxuICAgIGZsYWdzOiB0aGlzLm9wdHMuaW50ZW50RmxhZ3MsXG4gICAgd2FpdFBrZzogdGhpcy5vcHRzLmFwcFdhaXRQYWNrYWdlLFxuICAgIHdhaXRBY3Rpdml0eTogdGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSxcbiAgICB3YWl0Rm9yTGF1bmNoOiB0aGlzLm9wdHMuYXBwV2FpdEZvckxhdW5jaCxcbiAgICB3YWl0RHVyYXRpb246IHRoaXMub3B0cy5hcHBXYWl0RHVyYXRpb24sXG4gICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHM6IHRoaXMub3B0cy5vcHRpb25hbEludGVudEFyZ3VtZW50cyxcbiAgICBzdG9wQXBwOiAhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldCxcbiAgICB1c2VyOiB0aGlzLm9wdHMudXNlclByb2ZpbGUsXG4gIH0pO1xufTtcblxuLy8gd2Ugb3ZlcnJpZGUgc2V0VXJsIHRvIHRha2UgYW4gYW5kcm9pZCBVUkkgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGRlZXAtbGlua2luZ1xuLy8gaW5zaWRlIGFuIGFwcCwgc2ltaWxhciB0byBzdGFydGluZyBhbiBpbnRlbnRcbmNvbW1hbmRzLnNldFVybCA9IGFzeW5jIGZ1bmN0aW9uIHNldFVybCAodXJpKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnN0YXJ0VXJpKHVyaSwgdGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xufTtcblxuLy8gY2xvc2luZyBhcHAgdXNpbmcgZm9yY2Ugc3RvcFxuY29tbWFuZHMuY2xvc2VBcHAgPSBhc3luYyBmdW5jdGlvbiBjbG9zZUFwcCAoKSB7XG4gIGF3YWl0IHRoaXMuYWRiLmZvcmNlU3RvcCh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gIC8vIHJlc2V0IGNvbnRleHQgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGF0IGtpbmQgb24gY29udGV4dCB3ZSB3aWxsIGVuZCB1cCBhZnRlciBhcHAgbGF1bmNoLlxuICBhd2FpdCB0aGlzLnNldENvbnRleHQoKTtcbn07XG5cbmNvbW1hbmRzLmdldERpc3BsYXlEZW5zaXR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGlzcGxheURlbnNpdHkgKCkge1xuICAvLyBmaXJzdCB0cnkgdGhlIHByb3BlcnR5IGZvciBkZXZpY2VzXG4gIGxldCBvdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2dldHByb3AnLCAncm8uc2YubGNkX2RlbnNpdHknXSk7XG4gIGlmIChvdXQpIHtcbiAgICBsZXQgdmFsID0gcGFyc2VJbnQob3V0LCAxMCk7XG4gICAgLy8gaWYgdGhlIHZhbHVlIGlzIE5hTiwgdHJ5IGdldHRpbmcgdGhlIGVtdWxhdG9yIHByb3BlcnR5XG4gICAgaWYgKCFpc05hTih2YWwpKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICB0aGlzLmxvZy5kZWJ1ZyhgUGFyc2VkIGRlbnNpdHkgdmFsdWUgd2FzIE5hTjogXCIke291dH1cImApO1xuICB9XG4gIC8vIGZhbGxiYWNrIHRvIHRyeWluZyBwcm9wZXJ0eSBmb3IgZW11bGF0b3JzXG4gIG91dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnZ2V0cHJvcCcsICdxZW11LnNmLmxjZF9kZW5zaXR5J10pO1xuICBpZiAob3V0KSB7XG4gICAgbGV0IHZhbCA9IHBhcnNlSW50KG91dCwgMTApO1xuICAgIGlmICghaXNOYU4odmFsKSkge1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgdGhpcy5sb2cuZGVidWcoYFBhcnNlZCBkZW5zaXR5IHZhbHVlIHdhcyBOYU46IFwiJHtvdXR9XCJgKTtcbiAgfVxuICAvLyBjb3VsZG4ndCBnZXQgYW55dGhpbmcsIHNvIGVycm9yIG91dFxuICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdGYWlsZWQgdG8gZ2V0IGRpc3BsYXkgZGVuc2l0eSBwcm9wZXJ0eS4nKTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZVBlcmZvcm1FZGl0b3JBY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2FjdGlvbn0gPSBvcHRzO1xuICBpZiAoIXV0aWwuaGFzVmFsdWUoYWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYCdhY3Rpb24nIGFyZ3VtZW50IGlzIHJlcXVpcmVkYCk7XG4gIH1cblxuICBhd2FpdCB0aGlzLmFkYi5wZXJmb3JtRWRpdG9yQWN0aW9uKGFjdGlvbik7XG59O1xuXG5jb25zdCBQRVJNSVNTSU9OX0FDVElPTiA9IHtcbiAgR1JBTlQ6ICdncmFudCcsXG4gIFJFVk9LRTogJ3Jldm9rZScsXG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENoYW5nZVBlcm1pc3Npb25zT3B0aW9uc1xuICogQHByb3BlcnR5IHshc3RyaW5nfEFycmF5PHN0cmluZz59IHBlcm1pc3Npb25zIC0gVGhlIGZ1bGwgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiB0byBiZSBjaGFuZ2VkXG4gKiBvciBhIGxpc3Qgb2YgcGVybWlzc2lvbnMuIENoZWNrIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL01hbmlmZXN0LnBlcm1pc3Npb25cbiAqIHRvIGdldCB0aGUgZnVsbCBsaXN0IG9mIHN0YW5kYXJkIEFuZHJvaWQgcGVybXNzaW9uIG5hbWVzLiBNYW5kYXRvcnkgYXJndW1lbnQuXG4gKiBJZiAnYWxsJyBtYWdpYyBzdHJpbmcgaXMgcGFzc2VkIHRoZW4gdGhlIGNob3NlbiBhY3Rpb24gaXMgZ29pbmcgdG8gYmUgYXBwbGllZCB0byBhbGxcbiAqIHBlcm1pc2lzb25zIHJlcXVlc3RlZC9ncmFudGVkIGJ5ICdhcHBQYWNrYWdlJy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBQYWNrYWdlIFt0aGlzLm9wdHMuYXBwUGFja2FnZV0gLSBUaGUgYXBwbGljYXRpb24gcGFja2FnZSB0byBzZXQgY2hhbmdlXG4gKiBwZXJtaXNzaW9ucyBvbi4gRGVmYXVsdHMgdG8gdGhlIHBhY2thZ2UgbmFtZSB1bmRlciB0ZXN0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGlvbiBbZ3JhbnRdIC0gT25lIG9mIGBQRVJNSVNTSU9OX0FDVElPTmAgdmFsdWVzXG4gKi9cblxuLyoqXG4gKiBDaGFuZ2VzIHBhY2thZ2UgcGVybWlzc2lvbnMgaW4gcnVudGltZS5cbiAqXG4gKiBAcGFyYW0gez9DaGFuZ2VQZXJtaXNzaW9uc09wdGlvbnN9IG9wdHMgLSBBdmFpbGFibGUgb3B0aW9ucyBtYXBwaW5nLlxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnNcbiAqL1xuY29tbWFuZHMubW9iaWxlQ2hhbmdlUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucyAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBwZXJtaXNzaW9ucyxcbiAgICBhcHBQYWNrYWdlID0gdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgYWN0aW9uID0gUEVSTUlTU0lPTl9BQ1RJT04uR1JBTlQsXG4gIH0gPSBvcHRzO1xuICBpZiAoXy5pc05pbChwZXJtaXNzaW9ucykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGAncGVybWlzc2lvbnMnIGFyZ3VtZW50IGlzIHJlcXVpcmVkYCk7XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShwZXJtaXNzaW9ucykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGAncGVybWlzc2lvbnMnIGFyZ3VtZW50IG11c3Qgbm90IGJlIGVtcHR5YCk7XG4gIH1cbiAgY29uc3QgbG93ZXJBY3Rpb24gPSBfLnRvTG93ZXIoYWN0aW9uKTtcbiAgaWYgKCFbUEVSTUlTU0lPTl9BQ1RJT04uR1JBTlQsIFBFUk1JU1NJT05fQUNUSU9OLlJFVk9LRV0uaW5jbHVkZXMobG93ZXJBY3Rpb24pKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgVW5rbm93biBhY3Rpb24gJyR7YWN0aW9ufScuIGAgK1xuICAgICAgYE9ubHkgJHtKU09OLnN0cmluZ2lmeShfLnZhbHVlcyhQRVJNSVNTSU9OX0FDVElPTikpfSBhY3Rpb25zIGFyZSBzdXBwb3J0ZWRgKTtcbiAgfVxuXG4gIGxldCBhZmZlY3RlZFBlcm1pc3Npb25zID0gXy5pc0FycmF5KHBlcm1pc3Npb25zKSA/IHBlcm1pc3Npb25zIDogW3Blcm1pc3Npb25zXTtcbiAgaWYgKF8udG9Mb3dlcihwZXJtaXNzaW9ucykgPT09IEFMTF9QRVJNSVNTSU9OU19NQUdJQykge1xuICAgIGNvbnN0IGR1bXBzeXMgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIGFwcFBhY2thZ2VdKTtcbiAgICBjb25zdCBncmFudGVkUGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLmFkYi5nZXRHcmFudGVkUGVybWlzc2lvbnMoYXBwUGFja2FnZSwgZHVtcHN5cyk7XG4gICAgaWYgKGxvd2VyQWN0aW9uID09PSBQRVJNSVNTSU9OX0FDVElPTi5HUkFOVCkge1xuICAgICAgY29uc3QgcmVxUGVybWlzc29ucyA9IGF3YWl0IHRoaXMuYWRiLmdldFJlcVBlcm1pc3Npb25zKGFwcFBhY2thZ2UsIGR1bXBzeXMpO1xuICAgICAgYWZmZWN0ZWRQZXJtaXNzaW9ucyA9IF8uZGlmZmVyZW5jZShyZXFQZXJtaXNzb25zLCBncmFudGVkUGVybWlzc2lvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZmZlY3RlZFBlcm1pc3Npb25zID0gZ3JhbnRlZFBlcm1pc3Npb25zO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KGFmZmVjdGVkUGVybWlzc2lvbnMpKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGAnJHthcHBQYWNrYWdlfScgY29udGFpbnMgbm8gcGVybWlzc2lvbnMgdG8gJHtsb3dlckFjdGlvbn1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAobG93ZXJBY3Rpb24gPT09IFBFUk1JU1NJT05fQUNUSU9OLkdSQU5UKSB7XG4gICAgYXdhaXQgdGhpcy5hZGIuZ3JhbnRQZXJtaXNzaW9ucyhhcHBQYWNrYWdlLCBhZmZlY3RlZFBlcm1pc3Npb25zKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBCLmFsbChhZmZlY3RlZFBlcm1pc3Npb25zLm1hcCgobmFtZSkgPT4gdGhpcy5hZGIucmV2b2tlUGVybWlzc2lvbihhcHBQYWNrYWdlLCBuYW1lKSkpO1xuICB9XG59O1xuXG5jb25zdCBQRVJNSVNTSU9OU19UWVBFID0ge1xuICBERU5JRUQ6ICdkZW5pZWQnLFxuICBHUkFOVEVEOiAnZ3JhbnRlZCcsXG4gIFJFUVVFU1RFRDogJ3JlcXVlc3RlZCcsXG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdldFBlcm1pc3Npb25zT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgW3JlcXVlc3RlZF0gLSBPbmUgb2YgcG9zc2libGUgcGVybWlzc2lvbiB0eXBlcyB0byBnZXQuXG4gKiBDYW4gYmUgYW55IG9mIGBQRVJNSVNTSU9OU19UWVBFYCB2YWx1ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwUGFja2FnZSBbdGhpcy5vcHRzLmFwcFBhY2thZ2VdIC0gVGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UgdG8gc2V0IGNoYW5nZVxuICogcGVybWlzc2lvbnMgb24uIERlZmF1bHRzIHRvIHRoZSBwYWNrYWdlIG5hbWUgdW5kZXIgdGVzdC5cbiAqL1xuXG4vKipcbiAqIEdldHMgcnVudGltZSBwZXJtaXNzaW9ucyBsaXN0IGZvciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge0dldFBlcm1pc3Npb25zT3B0aW9uc30gb3B0cyAtIEF2YWlsYWJsZSBvcHRpb25zIG1hcHBpbmcuXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGxpc3Qgb2YgcmV0cmlldmVkIHBlcm1pc3Npb25zIGZvciB0aGUgZ2l2ZW4gdHlwZVxuICogKGNhbiBhbHNvIGJlIGVtcHR5KS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZ2V0dGluZyBwZXJtaXNzaW9ucy5cbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0UGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXRQZXJtaXNzaW9ucyAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB0eXBlID0gUEVSTUlTU0lPTlNfVFlQRS5SRVFVRVNURUQsXG4gICAgYXBwUGFja2FnZSA9IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICB9ID0gb3B0cztcblxuICBsZXQgYWN0aW9uRnVuYztcbiAgc3dpdGNoIChfLnRvTG93ZXIodHlwZSkpIHtcbiAgICBjYXNlIFBFUk1JU1NJT05TX1RZUEUuUkVRVUVTVEVEOlxuICAgICAgYWN0aW9uRnVuYyA9IChhcHBQYWNrYWdlKSA9PiB0aGlzLmFkYi5nZXRSZXFQZXJtaXNzaW9ucyhhcHBQYWNrYWdlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgUEVSTUlTU0lPTlNfVFlQRS5HUkFOVEVEOlxuICAgICAgYWN0aW9uRnVuYyA9IChhcHBQYWNrYWdlKSA9PiB0aGlzLmFkYi5nZXRHcmFudGVkUGVybWlzc2lvbnMoYXBwUGFja2FnZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFBFUk1JU1NJT05TX1RZUEUuREVOSUVEOlxuICAgICAgYWN0aW9uRnVuYyA9IChhcHBQYWNrYWdlKSA9PiB0aGlzLmFkYi5nZXREZW5pZWRQZXJtaXNzaW9ucyhhcHBQYWNrYWdlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBVbmtub3duIHBlcm1pc3Npb25zIHR5cGUgJyR7dHlwZX0nLiBgICtcbiAgICAgICAgYE9ubHkgJHtKU09OLnN0cmluZ2lmeShfLnZhbHVlcyhQRVJNSVNTSU9OU19UWVBFKSl9IHR5cGVzIGFyZSBzdXBwb3J0ZWRgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgYWN0aW9uRnVuYyhhcHBQYWNrYWdlKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIHJlY2VudCBzeXN0ZW0gbm90aWZpY2F0aW9ucy5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gYGFkYi5nZXROb3RpZmljYXRpb25zYCBmb3JcbiAqIG1vcmUgZGV0YWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVHZXROb3RpZmljYXRpb25zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0Tm90aWZpY2F0aW9ucyAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5nZXROb3RpZmljYXRpb25zKCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNtc0xpc3RPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4IFsxMDBdIC0gVGhlIG1heGltdW0gY291bnQgb2YgcmVjZW50IFNNUyBtZXNzYWdlc1xuICogdG8gcmV0cmlldmVcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiByZWNlbnQgU01TIG1lc3NhZ2VzIHdpdGggdGhlaXIgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge1Ntc0xpc3RPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gYGFkYi5nZXRTbXNMaXN0YCBmb3JcbiAqIG1vcmUgZGV0YWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVMaXN0U21zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlTGlzdFNtcyAob3B0cyA9IHt9KSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5nZXRTbXNMaXN0KG9wdHMpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBVbmxvY2tPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30ga2V5IFRoZSB1bmxvY2sga2V5LiBUaGUgdmFsdWUgb2YgdGhpcyBrZXkgZGVwZW5kc1xuICogb24gdGhlIGFjdHVhbCB1bmxvY2sgdHlwZSBhbmQgY291bGQgYmUgYSBwaW4vcGFzc3dvcmQvcGF0dGVybiB2YWx1ZSBvclxuICogYSBiaW9tZXRyaWMgZmluZ2VyIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgVGhlIHVubG9jayB0eXBlLiBUaGUgZm9sbG93aW5nIHVubG9jayB0eXBlc1xuICogYXJlIHN1cHBvcnRlZDogYHBpbmAsIGBwaW5XaXRoS2V5RXZlbnRgLCBgcGFzc3dvcmRgLCBgcGF0dGVybmAgYW5kIGBmaW5nZXJwcmludGAuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHN0cmF0ZWd5IEVpdGhlciAnbG9ja3NldHRpbmdzJyAoZGVmYXVsdCkgb3IgJ3VpYXV0b21hdG9yJy5cbiAqIFNldHRpbmcgaXQgdG8gJ3VpYXV0b21hdG9yJyB3aWxsIGVuZm9yY2UgdGhlIGRyaXZlciB0byBhdm9pZCB1c2luZyBzcGVjaWFsXG4gKiBBREIgc2hvcnRjdXRzIGluIG9yZGVyIHRvIHNwZWVkIHVwIHRoZSB1bmxvY2sgcHJvY2VkdXJlLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0aW1lb3V0TXMgWzIwMDBdIFRoZSBtYXhpbXVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKiB0byB3YWl0IHVudGlsIHRoZSBzY3JlZW4gZ2V0cyB1bmxvY2tlZFxuICovXG5cbi8qKlxuICogVW5sb2NrcyB0aGUgZGV2aWNlIGlmIGl0IGlzIGxvY2tlZC4gTm9vcCBpZiB0aGUgZGV2aWNlJ3Mgc2NyZWVuIGlzIG5vdCBsb2NrZWQuXG4gKlxuICogQHBhcmFtIHs/VW5sb2NrT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHVubG9jayBvcGVyYXRpb24gZmFpbHMgb3IgdGhlIHByb3ZpZGVkXG4gKiBhcmd1bWVudHMgYXJlIG5vdCB2YWxpZFxuICovXG5jb21tYW5kcy5tb2JpbGVVbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVVbmxvY2sgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGtleSwgdHlwZSwgc3RyYXRlZ3ksIHRpbWVvdXRNcyB9ID0gb3B0cztcbiAgYXdhaXQgYW5kcm9pZEhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB7XG4gICAgdW5sb2NrS2V5OiBrZXksXG4gICAgdW5sb2NrVHlwZTogdHlwZSxcbiAgICB1bmxvY2tTdHJhdGVneTogc3RyYXRlZ3ksXG4gICAgdW5sb2NrU3VjY2Vzc1RpbWVvdXQ6IHRpbWVvdXRNcyxcbiAgfSk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsTUFBTUEscUJBQXFCLEdBQUcsc0JBQXNCO0FBQ3BELE1BQU1DLHFCQUFxQixHQUFHLEtBQUs7QUFFbkMsSUFBSUMsUUFBUSxHQUFHLENBQUMsQ0FBQztFQUFFQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFBQztBQUFBO0FBRWpERixRQUFRLENBQUNHLElBQUksR0FBRyxlQUFlQSxJQUFJLENBQUVBLElBQUksRUFBRTtFQUV6Q0EsSUFBSSxHQUFHQyxlQUFDLENBQUNDLE9BQU8sQ0FBQ0YsSUFBSSxDQUFDLEdBQUdBLElBQUksQ0FBQ0csSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHSCxJQUFJO0VBQzdDLElBQUlJLE1BQU0sR0FBRztJQUNYQyxJQUFJLEVBQUVMLElB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
|