appium-android-driver 5.4.2 → 5.4.4

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.
Files changed (67) hide show
  1. package/build/index.js +1 -9
  2. package/build/lib/android-helpers.js +10 -194
  3. package/build/lib/android-helpers.js.map +1 -1
  4. package/build/lib/bootstrap.js +4 -45
  5. package/build/lib/bootstrap.js.map +1 -1
  6. package/build/lib/commands/actions.js +3 -78
  7. package/build/lib/commands/actions.js.map +1 -1
  8. package/build/lib/commands/alert.js +3 -10
  9. package/build/lib/commands/alert.js.map +1 -1
  10. package/build/lib/commands/app-management.js +4 -32
  11. package/build/lib/commands/app-management.js.map +1 -1
  12. package/build/lib/commands/context.js +6 -78
  13. package/build/lib/commands/context.js.map +1 -1
  14. package/build/lib/commands/coverage.js +1 -6
  15. package/build/lib/commands/coverage.js.map +1 -1
  16. package/build/lib/commands/element.js +4 -47
  17. package/build/lib/commands/element.js.map +1 -1
  18. package/build/lib/commands/emu-console.js +2 -7
  19. package/build/lib/commands/emu-console.js.map +1 -1
  20. package/build/lib/commands/execute.js +1 -13
  21. package/build/lib/commands/execute.js.map +1 -1
  22. package/build/lib/commands/file-actions.js +3 -44
  23. package/build/lib/commands/file-actions.js.map +1 -1
  24. package/build/lib/commands/find.js +3 -16
  25. package/build/lib/commands/find.js.map +1 -1
  26. package/build/lib/commands/general.js +4 -78
  27. package/build/lib/commands/general.js.map +1 -1
  28. package/build/lib/commands/ime.js +3 -14
  29. package/build/lib/commands/ime.js.map +1 -1
  30. package/build/lib/commands/index.js +3 -27
  31. package/build/lib/commands/index.js.map +1 -1
  32. package/build/lib/commands/intent.js +1 -40
  33. package/build/lib/commands/intent.js.map +1 -1
  34. package/build/lib/commands/log.js +3 -35
  35. package/build/lib/commands/log.js.map +1 -1
  36. package/build/lib/commands/media-projection.js +2 -47
  37. package/build/lib/commands/media-projection.js.map +1 -1
  38. package/build/lib/commands/network.js +4 -40
  39. package/build/lib/commands/network.js.map +1 -1
  40. package/build/lib/commands/performance.js +5 -57
  41. package/build/lib/commands/performance.js.map +1 -1
  42. package/build/lib/commands/recordscreen.js +1 -59
  43. package/build/lib/commands/recordscreen.js.map +1 -1
  44. package/build/lib/commands/shell.js +1 -15
  45. package/build/lib/commands/shell.js.map +1 -1
  46. package/build/lib/commands/streamscreen.js +7 -74
  47. package/build/lib/commands/streamscreen.js.map +1 -1
  48. package/build/lib/commands/system-bars.js +1 -23
  49. package/build/lib/commands/system-bars.js.map +1 -1
  50. package/build/lib/commands/touch.js +13 -79
  51. package/build/lib/commands/touch.js.map +1 -1
  52. package/build/lib/desired-caps.js +3 -4
  53. package/build/lib/desired-caps.js.map +1 -1
  54. package/build/lib/driver.js +8 -97
  55. package/build/lib/driver.js.map +1 -1
  56. package/build/lib/logger.js +1 -5
  57. package/build/lib/logger.js.map +1 -1
  58. package/build/lib/uiautomator.js +3 -24
  59. package/build/lib/uiautomator.js.map +1 -1
  60. package/build/lib/unlock-helpers.js +1 -61
  61. package/build/lib/unlock-helpers.js.map +1 -1
  62. package/build/lib/utils.js +1 -7
  63. package/build/lib/utils.js.map +1 -1
  64. package/build/lib/webview-helpers.js +1 -94
  65. package/build/lib/webview-helpers.js.map +1 -1
  66. package/lib/android-helpers.js +2 -1
  67. package/package.json +2 -2
@@ -1,32 +1,20 @@
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.WEBVIEW_WIN = exports.WEBVIEW_BASE = exports.NATIVE_WIN = exports.KNOWN_CHROME_PACKAGE_NAMES = exports.CHROMIUM_WIN = void 0;
9
-
10
8
  require("source-map-support/register");
11
-
12
9
  var _lodash = _interopRequireDefault(require("lodash"));
13
-
14
10
  var _logger = _interopRequireDefault(require("./logger"));
15
-
16
11
  var _axios = _interopRequireDefault(require("axios"));
17
-
18
12
  var _support = require("appium/support");
19
-
20
13
  var _portscanner = require("portscanner");
21
-
22
14
  var _lruCache = _interopRequireDefault(require("lru-cache"));
23
-
24
15
  var _bluebird = _interopRequireDefault(require("bluebird"));
25
-
26
16
  var _path = _interopRequireDefault(require("path"));
27
-
28
17
  var _os = _interopRequireDefault(require("os"));
29
-
30
18
  const NATIVE_WIN = 'NATIVE_APP';
31
19
  exports.NATIVE_WIN = NATIVE_WIN;
32
20
  const WEBVIEW_WIN = 'WEBVIEW';
@@ -49,15 +37,12 @@ const WEBVIEWS_DETAILS_CACHE = new _lruCache.default({
49
37
  updateAgeOnGet: true
50
38
  });
51
39
  const CDP_REQ_TIMEOUT = 2000;
52
-
53
40
  const DEVTOOLS_PORT_ALLOCATION_GUARD = _support.util.getLockFileGuard(_path.default.resolve(_os.default.tmpdir(), 'android_devtools_port_guard'), {
54
41
  timeout: 7,
55
42
  tryRecovery: true
56
43
  });
57
-
58
44
  const helpers = {};
59
45
  exports.helpers = helpers;
60
-
61
46
  function toDetailsCacheKey(adb, webview) {
62
47
  return `${adb === null || adb === void 0 ? void 0 : adb.curDeviceId}:${webview}`;
63
48
  }
@@ -66,46 +51,36 @@ async function getPotentialWebviewProcs(adb) {
66
51
  const out = await adb.shell(['cat', '/proc/net/unix']);
67
52
  const names = [];
68
53
  const allMatches = [];
69
-
70
54
  for (const line of out.split('\n')) {
71
55
  const [,,, flags,, st,, sockPath] = line.trim().split(/\s+/);
72
-
73
56
  if (!sockPath) {
74
57
  continue;
75
58
  }
76
-
77
59
  if (sockPath.startsWith('@')) {
78
60
  allMatches.push(line.trim());
79
61
  }
80
-
81
62
  if (flags !== '00010000' || st !== '01') {
82
63
  continue;
83
64
  }
84
-
85
65
  if (!DEVTOOLS_SOCKET_PATTERN.test(sockPath)) {
86
66
  continue;
87
67
  }
88
-
89
68
  names.push(sockPath);
90
69
  }
91
-
92
70
  if (_lodash.default.isEmpty(names)) {
93
71
  _logger.default.debug('Found no active devtools sockets');
94
-
95
72
  if (!_lodash.default.isEmpty(allMatches)) {
96
73
  _logger.default.debug(`Other sockets are: ${JSON.stringify(allMatches, null, 2)}`);
97
74
  }
98
75
  } else {
99
76
  _logger.default.debug(`Parsed ${names.length} active devtools ${_support.util.pluralize('socket', names.length, false)}: ` + JSON.stringify(names));
100
77
  }
101
-
102
78
  return _lodash.default.uniq(names);
103
79
  }
104
80
 
105
81
  async function webviewsFromProcs(adb, deviceSocket = null) {
106
82
  const socketNames = await getPotentialWebviewProcs(adb);
107
83
  const webviews = [];
108
-
109
84
  for (const socketName of socketNames) {
110
85
  if (deviceSocket === CHROMIUM_DEVTOOLS_SOCKET && socketName === `@${deviceSocket}`) {
111
86
  webviews.push({
@@ -114,19 +89,14 @@ async function webviewsFromProcs(adb, deviceSocket = null) {
114
89
  });
115
90
  continue;
116
91
  }
117
-
118
92
  const socketNameMatch = DEVTOOLS_SOCKET_PATTERN.exec(socketName);
119
-
120
93
  if (!socketNameMatch) {
121
94
  continue;
122
95
  }
123
-
124
96
  const crosswalkMatch = CROSSWALK_SOCKET_PATTERN.exec(socketName);
125
-
126
97
  if (!socketNameMatch[1] && !crosswalkMatch) {
127
98
  continue;
128
99
  }
129
-
130
100
  if (deviceSocket && socketName === `@${deviceSocket}` || !deviceSocket) {
131
101
  webviews.push({
132
102
  proc: socketName,
@@ -134,34 +104,27 @@ async function webviewsFromProcs(adb, deviceSocket = null) {
134
104
  });
135
105
  }
136
106
  }
137
-
138
107
  return webviews;
139
108
  }
140
109
 
141
110
  async function allocateDevtoolsPort(adb, socketName, webviewDevtoolsPort = null) {
142
111
  const remotePort = socketName.replace(/^@/, '');
143
112
  let [startPort, endPort] = DEVTOOLS_PORTS_RANGE;
144
-
145
113
  if (webviewDevtoolsPort) {
146
114
  endPort = webviewDevtoolsPort + (endPort - startPort);
147
115
  startPort = webviewDevtoolsPort;
148
116
  }
149
-
150
117
  _logger.default.debug(`Forwarding remote port ${remotePort} to a local ` + `port in range ${startPort}..${endPort}`);
151
-
152
118
  if (!webviewDevtoolsPort) {
153
119
  _logger.default.debug(`You could use the 'webviewDevtoolsPort' capability to customize ` + `the starting port number`);
154
120
  }
155
-
156
121
  return await DEVTOOLS_PORT_ALLOCATION_GUARD(async () => {
157
122
  let localPort;
158
-
159
123
  try {
160
124
  localPort = await (0, _portscanner.findAPortNotInUse)(startPort, endPort);
161
125
  } catch (e) {
162
126
  throw new Error(`Cannot find any free port to forward the Devtools socket ` + `in range ${startPort}..${endPort}. You could set the starting port number ` + `manually by providing the 'webviewDevtoolsPort' capability`);
163
127
  }
164
-
165
128
  await adb.adbExec(['forward', `tcp:${localPort}`, `localabstract:${remotePort}`]);
166
129
  return localPort;
167
130
  });
@@ -171,40 +134,31 @@ async function collectWebviewsDetails(adb, webviewsMapping, opts = {}) {
171
134
  if (_lodash.default.isEmpty(webviewsMapping)) {
172
135
  return;
173
136
  }
174
-
175
137
  const {
176
138
  webviewDevtoolsPort = null,
177
139
  ensureWebviewsHavePages = null,
178
140
  enableWebviewDetailsCollection = null
179
141
  } = opts;
180
-
181
142
  if (!ensureWebviewsHavePages) {
182
143
  _logger.default.info(`Not checking whether webviews have active pages; use the ` + `'ensureWebviewsHavePages' cap to turn this check on`);
183
144
  }
184
-
185
145
  if (!enableWebviewDetailsCollection) {
186
146
  _logger.default.info(`Not collecting web view details. Details collection might help ` + `to make Chromedriver initialization more precise. Use the 'enableWebviewDetailsCollection' ` + `cap to turn it on`);
187
147
  }
188
-
189
148
  if (!ensureWebviewsHavePages && !enableWebviewDetailsCollection) {
190
149
  return;
191
150
  }
192
151
 
193
152
  _logger.default.debug(`Collecting CDP data of ${_support.util.pluralize('webview', webviewsMapping.length, true)}`);
194
-
195
153
  const detailCollectors = [];
196
-
197
154
  for (const item of webviewsMapping) {
198
155
  detailCollectors.push((async () => {
199
156
  let localPort;
200
-
201
157
  try {
202
158
  localPort = await allocateDevtoolsPort(adb, item.proc, webviewDevtoolsPort);
203
-
204
159
  if (enableWebviewDetailsCollection) {
205
160
  item.info = await cdpInfo(localPort);
206
161
  }
207
-
208
162
  if (ensureWebviewsHavePages) {
209
163
  item.pages = await cdpList(localPort);
210
164
  }
@@ -217,9 +171,7 @@ async function collectWebviewsDetails(adb, webviewsMapping, opts = {}) {
217
171
  }
218
172
  })());
219
173
  }
220
-
221
174
  await _bluebird.default.all(detailCollectors);
222
-
223
175
  _logger.default.debug(`CDP data collection completed`);
224
176
  }
225
177
 
@@ -239,21 +191,14 @@ async function cdpInfo(localPort) {
239
191
 
240
192
  helpers.procFromWebview = async function procFromWebview(adb, webview) {
241
193
  const pidMatch = WEBVIEW_PID_PATTERN.exec(webview);
242
-
243
194
  if (!pidMatch) {
244
195
  throw new Error(`Could not find PID for webview '${webview}'`);
245
196
  }
246
-
247
197
  const pid = pidMatch[1];
248
-
249
198
  _logger.default.debug(`${webview} mapped to pid ${pid}`);
250
-
251
199
  _logger.default.debug(`Getting process name for webview '${webview}'`);
252
-
253
200
  const pkg = await adb.getNameByPid(pid);
254
-
255
201
  _logger.default.debug(`Got process name: '${pkg}'`);
256
-
257
202
  return pkg;
258
203
  };
259
204
 
@@ -264,9 +209,7 @@ helpers.parseWebviewNames = function parseWebviewNames(webviewsMapping, {
264
209
  if (isChromeSession) {
265
210
  return [CHROMIUM_WIN];
266
211
  }
267
-
268
212
  const result = [];
269
-
270
213
  for (const {
271
214
  webview,
272
215
  pages,
@@ -275,17 +218,13 @@ helpers.parseWebviewNames = function parseWebviewNames(webviewsMapping, {
275
218
  } of webviewsMapping) {
276
219
  if (ensureWebviewsHavePages && (pages === null || pages === void 0 ? void 0 : pages.length) === 0) {
277
220
  _logger.default.info(`Skipping the webview '${webview}' at '${proc}' ` + `since it has reported having zero pages`);
278
-
279
221
  continue;
280
222
  }
281
-
282
223
  if (webviewName) {
283
224
  result.push(webviewName);
284
225
  }
285
226
  }
286
-
287
227
  _logger.default.debug(`Found ${_support.util.pluralize('webview', result.length, true)}: ${JSON.stringify(result)}`);
288
-
289
228
  return result;
290
229
  };
291
230
 
@@ -296,14 +235,12 @@ helpers.getWebViewsMapping = async function getWebViewsMapping(adb, {
296
235
  enableWebviewDetailsCollection = true
297
236
  } = {}) {
298
237
  _logger.default.debug('Getting a list of available webviews');
299
-
300
238
  const webviewsMapping = await webviewsFromProcs(adb, androidDeviceSocket);
301
239
  await collectWebviewsDetails(adb, webviewsMapping, {
302
240
  ensureWebviewsHavePages,
303
241
  enableWebviewDetailsCollection,
304
242
  webviewDevtoolsPort
305
243
  });
306
-
307
244
  for (const webviewMapping of webviewsMapping) {
308
245
  const {
309
246
  webview,
@@ -312,10 +249,8 @@ helpers.getWebViewsMapping = async function getWebViewsMapping(adb, {
312
249
  webviewMapping.webviewName = null;
313
250
  let wvName = webview;
314
251
  let process = undefined;
315
-
316
252
  if (!androidDeviceSocket) {
317
253
  const pkgMatch = WEBVIEW_PKG_PATTERN.exec(webview);
318
-
319
254
  try {
320
255
  const pkg = pkgMatch ? pkgMatch[1] : await helpers.procFromWebview(adb, webview);
321
256
  wvName = `${WEBVIEW_BASE}${pkg}`;
@@ -326,14 +261,11 @@ helpers.getWebViewsMapping = async function getWebViewsMapping(adb, {
326
261
  };
327
262
  } catch (e) {
328
263
  _logger.default.warn(e.message);
329
-
330
264
  continue;
331
265
  }
332
266
  }
333
-
334
267
  webviewMapping.webviewName = wvName;
335
268
  const key = toDetailsCacheKey(adb, wvName);
336
-
337
269
  if (info || process) {
338
270
  WEBVIEWS_DETAILS_CACHE.set(key, {
339
271
  info,
@@ -343,7 +275,6 @@ helpers.getWebViewsMapping = async function getWebViewsMapping(adb, {
343
275
  WEBVIEWS_DETAILS_CACHE.delete(key);
344
276
  }
345
277
  }
346
-
347
278
  return webviewsMapping;
348
279
  };
349
280
 
@@ -354,81 +285,61 @@ helpers.getWebviewDetails = function getWebviewDetails(adb, webview) {
354
285
 
355
286
  helpers.createChromedriverCaps = function createChromedriverCaps(opts, deviceId, webViewDetails) {
356
287
  var _opts$chromeOptions, _webViewDetails$info, _webViewDetails$proce, _webViewDetails$proce2, _opts$chromeOptions2;
357
-
358
288
  const caps = {
359
289
  chromeOptions: {}
360
290
  };
361
291
  const androidPackage = ((_opts$chromeOptions = opts.chromeOptions) === null || _opts$chromeOptions === void 0 ? void 0 : _opts$chromeOptions.androidPackage) || opts.appPackage || (webViewDetails === null || webViewDetails === void 0 ? void 0 : (_webViewDetails$info = webViewDetails.info) === null || _webViewDetails$info === void 0 ? void 0 : _webViewDetails$info['Android-Package']);
362
-
363
292
  if (androidPackage) {
364
293
  caps.chromeOptions.androidPackage = androidPackage;
365
294
  }
366
-
367
295
  if (_lodash.default.isBoolean(opts.chromeUseRunningApp)) {
368
296
  caps.chromeOptions.androidUseRunningApp = opts.chromeUseRunningApp;
369
297
  }
370
-
371
298
  if (opts.chromeAndroidPackage) {
372
299
  caps.chromeOptions.androidPackage = opts.chromeAndroidPackage;
373
300
  }
374
-
375
301
  if (opts.chromeAndroidActivity) {
376
302
  caps.chromeOptions.androidActivity = opts.chromeAndroidActivity;
377
303
  }
378
-
379
304
  if (opts.chromeAndroidProcess) {
380
305
  caps.chromeOptions.androidProcess = opts.chromeAndroidProcess;
381
306
  } else if (webViewDetails !== null && webViewDetails !== void 0 && (_webViewDetails$proce = webViewDetails.process) !== null && _webViewDetails$proce !== void 0 && _webViewDetails$proce.name && webViewDetails !== null && webViewDetails !== void 0 && (_webViewDetails$proce2 = webViewDetails.process) !== null && _webViewDetails$proce2 !== void 0 && _webViewDetails$proce2.id) {
382
307
  caps.chromeOptions.androidProcess = webViewDetails.process.name;
383
308
  }
384
-
385
309
  if (_lodash.default.toLower(opts.browserName) === 'chromium-webview') {
386
310
  caps.chromeOptions.androidActivity = opts.appActivity;
387
311
  }
388
-
389
312
  if (opts.pageLoadStrategy) {
390
313
  caps.pageLoadStrategy = opts.pageLoadStrategy;
391
314
  }
392
-
393
315
  const isChrome = _lodash.default.toLower(caps.chromeOptions.androidPackage) === 'chrome';
394
-
395
316
  if (_lodash.default.includes(KNOWN_CHROME_PACKAGE_NAMES, caps.chromeOptions.androidPackage) || isChrome) {
396
317
  if (isChrome) {
397
318
  caps.chromeOptions.androidPackage = CHROME_PACKAGE_NAME;
398
319
  }
399
-
400
320
  delete caps.chromeOptions.androidActivity;
401
321
  delete caps.chromeOptions.androidProcess;
402
322
  }
403
-
404
323
  caps.chromeOptions.androidDeviceSerial = deviceId;
405
-
406
324
  if (_lodash.default.isPlainObject(opts.loggingPrefs) || _lodash.default.isPlainObject(opts.chromeLoggingPrefs)) {
407
325
  if (opts.loggingPrefs) {
408
326
  _logger.default.warn(`The 'loggingPrefs' cap is deprecated; use the 'chromeLoggingPrefs' cap instead`);
409
327
  }
410
-
411
328
  caps.loggingPrefs = opts.chromeLoggingPrefs || opts.loggingPrefs;
412
329
  }
413
-
414
330
  if (opts.enablePerformanceLogging) {
415
331
  _logger.default.warn(`The 'enablePerformanceLogging' cap is deprecated; simply use ` + `the 'chromeLoggingPrefs' cap instead, with a 'performance' key set to 'ALL'`);
416
-
417
332
  const newPref = {
418
333
  performance: 'ALL'
419
334
  };
420
335
  caps.loggingPrefs = caps.loggingPrefs ? Object.assign({}, caps.loggingPrefs, newPref) : newPref;
421
336
  }
422
-
423
337
  if ((_opts$chromeOptions2 = opts.chromeOptions) !== null && _opts$chromeOptions2 !== void 0 && _opts$chromeOptions2.Arguments) {
424
338
  opts.chromeOptions.args = [...(opts.chromeOptions.args || []), ...opts.chromeOptions.Arguments];
425
339
  delete opts.chromeOptions.Arguments;
426
340
  }
427
-
428
341
  _logger.default.debug('Precalculated Chromedriver capabilities: ' + JSON.stringify(caps.chromeOptions, null, 2));
429
-
430
342
  const protectedCapNames = [];
431
-
432
343
  for (const [opt, val] of _lodash.default.toPairs(opts.chromeOptions)) {
433
344
  if (_lodash.default.isUndefined(caps.chromeOptions[opt])) {
434
345
  caps.chromeOptions[opt] = val;
@@ -436,18 +347,14 @@ helpers.createChromedriverCaps = function createChromedriverCaps(opts, deviceId,
436
347
  protectedCapNames.push(opt);
437
348
  }
438
349
  }
439
-
440
350
  if (!_lodash.default.isEmpty(protectedCapNames)) {
441
351
  _logger.default.info('The following Chromedriver capabilities cannot be overridden ' + 'by the provided chromeOptions:');
442
-
443
352
  for (const optName of protectedCapNames) {
444
353
  _logger.default.info(` ${optName} (${JSON.stringify(opts.chromeOptions[optName])})`);
445
354
  }
446
355
  }
447
-
448
356
  return caps;
449
357
  };
450
-
451
358
  var _default = helpers;
452
359
  exports.default = _default;
453
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOQVRJVkVfV0lOIiwiV0VCVklFV19XSU4iLCJDSFJPTUlVTV9XSU4iLCJXRUJWSUVXX0JBU0UiLCJXRUJWSUVXX1BJRF9QQVRURVJOIiwiUmVnRXhwIiwiV0VCVklFV19QS0dfUEFUVEVSTiIsIkRFVlRPT0xTX1NPQ0tFVF9QQVRURVJOIiwiQ1JPU1NXQUxLX1NPQ0tFVF9QQVRURVJOIiwiQ0hST01JVU1fREVWVE9PTFNfU09DS0VUIiwiQ0hST01FX1BBQ0tBR0VfTkFNRSIsIktOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTIiwiREVWVE9PTFNfUE9SVFNfUkFOR0UiLCJXRUJWSUVXU19ERVRBSUxTX0NBQ0hFIiwiTFJVIiwibWF4IiwidXBkYXRlQWdlT25HZXQiLCJDRFBfUkVRX1RJTUVPVVQiLCJERVZUT09MU19QT1JUX0FMTE9DQVRJT05fR1VBUkQiLCJ1dGlsIiwiZ2V0TG9ja0ZpbGVHdWFyZCIsInBhdGgiLCJyZXNvbHZlIiwib3MiLCJ0bXBkaXIiLCJ0aW1lb3V0IiwidHJ5UmVjb3ZlcnkiLCJoZWxwZXJzIiwidG9EZXRhaWxzQ2FjaGVLZXkiLCJhZGIiLCJ3ZWJ2aWV3IiwiY3VyRGV2aWNlSWQiLCJnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3MiLCJvdXQiLCJzaGVsbCIsIm5hbWVzIiwiYWxsTWF0Y2hlcyIsImxpbmUiLCJzcGxpdCIsImZsYWdzIiwic3QiLCJzb2NrUGF0aCIsInRyaW0iLCJzdGFydHNXaXRoIiwicHVzaCIsInRlc3QiLCJfIiwiaXNFbXB0eSIsImxvZ2dlciIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsImxlbmd0aCIsInBsdXJhbGl6ZSIsInVuaXEiLCJ3ZWJ2aWV3c0Zyb21Qcm9jcyIsImRldmljZVNvY2tldCIsInNvY2tldE5hbWVzIiwid2Vidmlld3MiLCJzb2NrZXROYW1lIiwicHJvYyIsInNvY2tldE5hbWVNYXRjaCIsImV4ZWMiLCJjcm9zc3dhbGtNYXRjaCIsImFsbG9jYXRlRGV2dG9vbHNQb3J0Iiwid2Vidmlld0RldnRvb2xzUG9ydCIsInJlbW90ZVBvcnQiLCJyZXBsYWNlIiwic3RhcnRQb3J0IiwiZW5kUG9ydCIsImxvY2FsUG9ydCIsImZpbmRBUG9ydE5vdEluVXNlIiwiZSIsIkVycm9yIiwiYWRiRXhlYyIsImNvbGxlY3RXZWJ2aWV3c0RldGFpbHMiLCJ3ZWJ2aWV3c01hcHBpbmciLCJvcHRzIiwiZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMiLCJlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24iLCJpbmZvIiwiZGV0YWlsQ29sbGVjdG9ycyIsIml0ZW0iLCJjZHBJbmZvIiwicGFnZXMiLCJjZHBMaXN0IiwicmVtb3ZlUG9ydEZvcndhcmQiLCJCIiwiYWxsIiwiYXhpb3MiLCJ1cmwiLCJkYXRhIiwicHJvY0Zyb21XZWJ2aWV3IiwicGlkTWF0Y2giLCJwaWQiLCJwa2ciLCJnZXROYW1lQnlQaWQiLCJwYXJzZVdlYnZpZXdOYW1lcyIsImlzQ2hyb21lU2Vzc2lvbiIsInJlc3VsdCIsIndlYnZpZXdOYW1lIiwiZ2V0V2ViVmlld3NNYXBwaW5nIiwiYW5kcm9pZERldmljZVNvY2tldCIsIndlYnZpZXdNYXBwaW5nIiwid3ZOYW1lIiwicHJvY2VzcyIsInVuZGVmaW5lZCIsInBrZ01hdGNoIiwibmFtZSIsImlkIiwid2FybiIsIm1lc3NhZ2UiLCJrZXkiLCJzZXQiLCJoYXMiLCJkZWxldGUiLCJnZXRXZWJ2aWV3RGV0YWlscyIsImdldCIsImNyZWF0ZUNocm9tZWRyaXZlckNhcHMiLCJkZXZpY2VJZCIsIndlYlZpZXdEZXRhaWxzIiwiY2FwcyIsImNocm9tZU9wdGlvbnMiLCJhbmRyb2lkUGFja2FnZSIsImFwcFBhY2thZ2UiLCJpc0Jvb2xlYW4iLCJjaHJvbWVVc2VSdW5uaW5nQXBwIiwiYW5kcm9pZFVzZVJ1bm5pbmdBcHAiLCJjaHJvbWVBbmRyb2lkUGFja2FnZSIsImNocm9tZUFuZHJvaWRBY3Rpdml0eSIsImFuZHJvaWRBY3Rpdml0eSIsImNocm9tZUFuZHJvaWRQcm9jZXNzIiwiYW5kcm9pZFByb2Nlc3MiLCJ0b0xvd2VyIiwiYnJvd3Nlck5hbWUiLCJhcHBBY3Rpdml0eSIsInBhZ2VMb2FkU3RyYXRlZ3kiLCJpc0Nocm9tZSIsImluY2x1ZGVzIiwiYW5kcm9pZERldmljZVNlcmlhbCIsImlzUGxhaW5PYmplY3QiLCJsb2dnaW5nUHJlZnMiLCJjaHJvbWVMb2dnaW5nUHJlZnMiLCJlbmFibGVQZXJmb3JtYW5jZUxvZ2dpbmciLCJuZXdQcmVmIiwicGVyZm9ybWFuY2UiLCJPYmplY3QiLCJhc3NpZ24iLCJBcmd1bWVudHMiLCJhcmdzIiwicHJvdGVjdGVkQ2FwTmFtZXMiLCJvcHQiLCJ2YWwiLCJ0b1BhaXJzIiwiaXNVbmRlZmluZWQiLCJvcHROYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3dlYnZpZXctaGVscGVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IGZpbmRBUG9ydE5vdEluVXNlIH0gZnJvbSAncG9ydHNjYW5uZXInO1xuaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuXG5jb25zdCBOQVRJVkVfV0lOID0gJ05BVElWRV9BUFAnO1xuY29uc3QgV0VCVklFV19XSU4gPSAnV0VCVklFVyc7XG5jb25zdCBDSFJPTUlVTV9XSU4gPSAnQ0hST01JVU0nO1xuY29uc3QgV0VCVklFV19CQVNFID0gYCR7V0VCVklFV19XSU59X2A7XG5jb25zdCBXRUJWSUVXX1BJRF9QQVRURVJOID0gbmV3IFJlZ0V4cChgXiR7V0VCVklFV19CQVNFfShcXFxcZCspYCk7XG5jb25zdCBXRUJWSUVXX1BLR19QQVRURVJOID0gbmV3IFJlZ0V4cChgXiR7V0VCVklFV19CQVNFfShbXlxcXFxkXFxcXHNdW1xcXFx3Ll0qKWApO1xuY29uc3QgREVWVE9PTFNfU09DS0VUX1BBVFRFUk4gPSAvQFtcXHcuXStfZGV2dG9vbHNfcmVtb3RlXz8oXFxkKyk/XFxiLztcbmNvbnN0IENST1NTV0FMS19TT0NLRVRfUEFUVEVSTiA9IC9AKFtcXHcuXSspX2RldnRvb2xzX3JlbW90ZVxcYi87XG5jb25zdCBDSFJPTUlVTV9ERVZUT09MU19TT0NLRVQgPSAnY2hyb21lX2RldnRvb2xzX3JlbW90ZSc7XG5jb25zdCBDSFJPTUVfUEFDS0FHRV9OQU1FID0gJ2NvbS5hbmRyb2lkLmNocm9tZSc7XG5jb25zdCBLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUyA9IFtcbiAgQ0hST01FX1BBQ0tBR0VfTkFNRSxcbiAgJ2NvbS5jaHJvbWUuYmV0YScsXG4gICdjb20uY2hyb21lLmRldicsXG4gICdjb20uY2hyb21lLmNhbmFyeScsXG5dO1xuY29uc3QgREVWVE9PTFNfUE9SVFNfUkFOR0UgPSBbMTA5MDAsIDExMDAwXTtcbmNvbnN0IFdFQlZJRVdTX0RFVEFJTFNfQ0FDSEUgPSBuZXcgTFJVKHtcbiAgbWF4OiAxMDAsXG4gIHVwZGF0ZUFnZU9uR2V0OiB0cnVlLFxufSk7XG5jb25zdCBDRFBfUkVRX1RJTUVPVVQgPSAyMDAwOyAvLyBtc1xuY29uc3QgREVWVE9PTFNfUE9SVF9BTExPQ0FUSU9OX0dVQVJEID0gdXRpbC5nZXRMb2NrRmlsZUd1YXJkKFxuICBwYXRoLnJlc29sdmUob3MudG1wZGlyKCksICdhbmRyb2lkX2RldnRvb2xzX3BvcnRfZ3VhcmQnKSxcbiAge3RpbWVvdXQ6IDcsIHRyeVJlY292ZXJ5OiB0cnVlfVxuKTtcblxuY29uc3QgaGVscGVycyA9IHt9O1xuXG5mdW5jdGlvbiB0b0RldGFpbHNDYWNoZUtleSAoYWRiLCB3ZWJ2aWV3KSB7XG4gIHJldHVybiBgJHthZGI/LmN1ckRldmljZUlkfToke3dlYnZpZXd9YDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGdldHMgYSBsaXN0IG9mIGFuZHJvaWQgc3lzdGVtIHByb2Nlc3NlcyBhbmQgcmV0dXJucyBvbmVzXG4gKiB0aGF0IGxvb2sgbGlrZSB3ZWJ2aWV3c1xuICogU2VlIGh0dHBzOi8vY3MuY2hyb21pdW0ub3JnL2Nocm9taXVtL3NyYy9jaHJvbWUvYnJvd3Nlci9kZXZ0b29scy9kZXZpY2UvYW5kcm9pZF9kZXZpY2VfaW5mb19xdWVyeS5jY1xuICogZm9yIG1vcmUgZGV0YWlsc1xuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhZGIgLSBhbiBBREIgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtBcnJheS48c3RyaW5nPn0gLSBhIGxpc3Qgb2YgbWF0Y2hpbmcgd2VidmlldyBzb2NrZXQgbmFtZXMgKGluY2x1ZGluZyB0aGUgbGVhZGluZyAnQCcpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFBvdGVudGlhbFdlYnZpZXdQcm9jcyAoYWRiKSB7XG4gIGNvbnN0IG91dCA9IGF3YWl0IGFkYi5zaGVsbChbJ2NhdCcsICcvcHJvYy9uZXQvdW5peCddKTtcbiAgY29uc3QgbmFtZXMgPSBbXTtcbiAgY29uc3QgYWxsTWF0Y2hlcyA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2Ygb3V0LnNwbGl0KCdcXG4nKSkge1xuICAgIC8vIE51bSBSZWZDb3VudCBQcm90b2NvbCBGbGFncyBUeXBlIFN0IElub2RlIFBhdGhcbiAgICBjb25zdCBbLCwsIGZsYWdzLCwgc3QsLCBzb2NrUGF0aF0gPSBsaW5lLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmICghc29ja1BhdGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoc29ja1BhdGguc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgICBhbGxNYXRjaGVzLnB1c2gobGluZS50cmltKCkpO1xuICAgIH1cbiAgICBpZiAoZmxhZ3MgIT09ICcwMDAxMDAwMCcgfHwgc3QgIT09ICcwMScpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIURFVlRPT0xTX1NPQ0tFVF9QQVRURVJOLnRlc3Qoc29ja1BhdGgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBuYW1lcy5wdXNoKHNvY2tQYXRoKTtcbiAgfVxuICBpZiAoXy5pc0VtcHR5KG5hbWVzKSkge1xuICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgbm8gYWN0aXZlIGRldnRvb2xzIHNvY2tldHMnKTtcbiAgICBpZiAoIV8uaXNFbXB0eShhbGxNYXRjaGVzKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBPdGhlciBzb2NrZXRzIGFyZTogJHtKU09OLnN0cmluZ2lmeShhbGxNYXRjaGVzLCBudWxsLCAyKX1gKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBQYXJzZWQgJHtuYW1lcy5sZW5ndGh9IGFjdGl2ZSBkZXZ0b29scyAke3V0aWwucGx1cmFsaXplKCdzb2NrZXQnLCBuYW1lcy5sZW5ndGgsIGZhbHNlKX06IGAgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkobmFtZXMpKTtcbiAgfVxuICAvLyBzb21ldGltZXMgdGhlIHdlYnZpZXcgcHJvY2VzcyBzaG93cyB1cCBtdWx0aXBsZSB0aW1lcyBwZXIgYXBwXG4gIHJldHVybiBfLnVuaXEobmFtZXMpO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdQcm9jXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvYyAtIFRoZSB3ZWJ2aWV3IHByb2Nlc3MgbmFtZSAoYXMgcmV0dXJuZWQgYnlcbiAqIGdldFBvdGVudGlhbFdlYnZpZXdQcm9jc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHdlYnZpZXcgLSBUaGUgYWN0dWFsIHdlYnZpZXcgY29udGV4dCBuYW1lXG4gKi9cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgYSBsaXN0IG9mIHN5c3RlbSBwcm9jZXNzZXMgdGhhdCBsb29rIGxpa2Ugd2Vidmlld3MsXG4gKiBhbmQgcmV0dXJucyB0aGVtIGFsb25nIHdpdGggdGhlIHdlYnZpZXcgY29udGV4dCBuYW1lIGFwcHJvcHJpYXRlIGZvciBpdC5cbiAqIElmIHdlIHBhc3MgaW4gYSBkZXZpY2VTb2NrZXQsIHdlIG9ubHkgYXR0ZW1wdCB0byBmaW5kIHdlYnZpZXdzIHdoaWNoIG1hdGNoXG4gKiB0aGF0IHNvY2tldCBuYW1lICh0aGlzIGlzIGZvciBhcHBzIHdoaWNoIGVtYmVkIENocm9taXVtLCB3aGljaCBpc24ndCB0aGVcbiAqIHNhbWUgYXMgY2hyb21lLWJhY2tlZCB3ZWJ2aWV3cykuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFkYiAtIGFuIEFEQiBpbnN0YW5jZVxuICogQHBhcmFtIHs/c3RyaW5nfSBkZXZpY2VTb2NrZXQgLSB0aGUgZXhwbGljdGx5LW5hbWVkIGRldmljZSBzb2NrZXQgdG8gdXNlXG4gKlxuICogQHJldHVybiB7QXJyYXkuPFdlYnZpZXdQcm9jPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2Vidmlld3NGcm9tUHJvY3MgKGFkYiwgZGV2aWNlU29ja2V0ID0gbnVsbCkge1xuICBjb25zdCBzb2NrZXROYW1lcyA9IGF3YWl0IGdldFBvdGVudGlhbFdlYnZpZXdQcm9jcyhhZGIpO1xuICBjb25zdCB3ZWJ2aWV3cyA9IFtdO1xuICBmb3IgKGNvbnN0IHNvY2tldE5hbWUgb2Ygc29ja2V0TmFtZXMpIHtcbiAgICBpZiAoZGV2aWNlU29ja2V0ID09PSBDSFJPTUlVTV9ERVZUT09MU19TT0NLRVQgJiYgc29ja2V0TmFtZSA9PT0gYEAke2RldmljZVNvY2tldH1gKSB7XG4gICAgICB3ZWJ2aWV3cy5wdXNoKHtcbiAgICAgICAgcHJvYzogc29ja2V0TmFtZSxcbiAgICAgICAgd2VidmlldzogQ0hST01JVU1fV0lOLFxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBzb2NrZXROYW1lTWF0Y2ggPSBERVZUT09MU19TT0NLRVRfUEFUVEVSTi5leGVjKHNvY2tldE5hbWUpO1xuICAgIGlmICghc29ja2V0TmFtZU1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgY3Jvc3N3YWxrTWF0Y2ggPSBDUk9TU1dBTEtfU09DS0VUX1BBVFRFUk4uZXhlYyhzb2NrZXROYW1lKTtcbiAgICBpZiAoIXNvY2tldE5hbWVNYXRjaFsxXSAmJiAhY3Jvc3N3YWxrTWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChkZXZpY2VTb2NrZXQgJiYgc29ja2V0TmFtZSA9PT0gYEAke2RldmljZVNvY2tldH1gIHx8ICFkZXZpY2VTb2NrZXQpIHtcbiAgICAgIHdlYnZpZXdzLnB1c2goe1xuICAgICAgICBwcm9jOiBzb2NrZXROYW1lLFxuICAgICAgICB3ZWJ2aWV3OiBzb2NrZXROYW1lTWF0Y2hbMV1cbiAgICAgICAgICA/IGAke1dFQlZJRVdfQkFTRX0ke3NvY2tldE5hbWVNYXRjaFsxXX1gXG4gICAgICAgICAgOiBgJHtXRUJWSUVXX0JBU0V9JHtjcm9zc3dhbGtNYXRjaFsxXX1gLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB3ZWJ2aWV3cztcbn1cblxuLyoqXG4gKiBBbGxvY2F0ZXMgYSBsb2NhbCBwb3J0IGZvciBkZXZ0b29scyBjb21tdW5pY2F0aW9uXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb2NrZXROYW1lIFRoZSByZW1vdGUgVW5peCBzb2NrZXQgbmFtZVxuICogQHBhcmFtIHs/bnVtYmVyfSB3ZWJ2aWV3RGV2dG9vbHNQb3J0IFRoZSBsb2NhbCBwb3J0IG51bWJlciBvciBudWxsIHRvIGFwcGx5XG4gKiBhdXRvZGV0ZWN0aW9uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbG9jYWwgcG9ydCBudW1iZXIgaWYgdGhlIHJlbW90ZSBzb2NrZXQgaGFzIGJlZW4gZm9yd2FyZGVkXG4gKiBzdWNjZXNzZnVsbHkgb3IgYG51bGxgIG90aGVyd2lzZVxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBhbGxvY2F0aW5nIHRoZSBsb2NhbCBwb3J0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFsbG9jYXRlRGV2dG9vbHNQb3J0IChhZGIsIHNvY2tldE5hbWUsIHdlYnZpZXdEZXZ0b29sc1BvcnQgPSBudWxsKSB7XG4gIC8vIHNvY2tldCBuYW1lcyBjb21lIHdpdGggJ0AnLCBidXQgdGhpcyBzaG91bGQgbm90IGJlIGEgcGFydCBvZiB0aGUgYWJzdHJhY3RcbiAgLy8gcmVtb3RlIHBvcnQsIHNvIHJlbW92ZSBpdFxuICBjb25zdCByZW1vdGVQb3J0ID0gc29ja2V0TmFtZS5yZXBsYWNlKC9eQC8sICcnKTtcbiAgbGV0IFtzdGFydFBvcnQsIGVuZFBvcnRdID0gREVWVE9PTFNfUE9SVFNfUkFOR0U7XG4gIGlmICh3ZWJ2aWV3RGV2dG9vbHNQb3J0KSB7XG4gICAgZW5kUG9ydCA9IHdlYnZpZXdEZXZ0b29sc1BvcnQgKyAoZW5kUG9ydCAtIHN0YXJ0UG9ydCk7XG4gICAgc3RhcnRQb3J0ID0gd2Vidmlld0RldnRvb2xzUG9ydDtcbiAgfVxuICBsb2dnZXIuZGVidWcoYEZvcndhcmRpbmcgcmVtb3RlIHBvcnQgJHtyZW1vdGVQb3J0fSB0byBhIGxvY2FsIGAgK1xuICAgIGBwb3J0IGluIHJhbmdlICR7c3RhcnRQb3J0fS4uJHtlbmRQb3J0fWApO1xuICBpZiAoIXdlYnZpZXdEZXZ0b29sc1BvcnQpIHtcbiAgICBsb2dnZXIuZGVidWcoYFlvdSBjb3VsZCB1c2UgdGhlICd3ZWJ2aWV3RGV2dG9vbHNQb3J0JyBjYXBhYmlsaXR5IHRvIGN1c3RvbWl6ZSBgICtcbiAgICAgIGB0aGUgc3RhcnRpbmcgcG9ydCBudW1iZXJgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgREVWVE9PTFNfUE9SVF9BTExPQ0FUSU9OX0dVQVJEKGFzeW5jICgpID0+IHtcbiAgICBsZXQgbG9jYWxQb3J0O1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFBvcnQgPSBhd2FpdCBmaW5kQVBvcnROb3RJblVzZShzdGFydFBvcnQsIGVuZFBvcnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgYW55IGZyZWUgcG9ydCB0byBmb3J3YXJkIHRoZSBEZXZ0b29scyBzb2NrZXQgYCArXG4gICAgICAgIGBpbiByYW5nZSAke3N0YXJ0UG9ydH0uLiR7ZW5kUG9ydH0uIFlvdSBjb3VsZCBzZXQgdGhlIHN0YXJ0aW5nIHBvcnQgbnVtYmVyIGAgK1xuICAgICAgICBgbWFudWFsbHkgYnkgcHJvdmlkaW5nIHRoZSAnd2Vidmlld0RldnRvb2xzUG9ydCcgY2FwYWJpbGl0eWApO1xuICAgIH1cbiAgICBhd2FpdCBhZGIuYWRiRXhlYyhbJ2ZvcndhcmQnLCBgdGNwOiR7bG9jYWxQb3J0fWAsIGBsb2NhbGFic3RyYWN0OiR7cmVtb3RlUG9ydH1gXSk7XG4gICAgcmV0dXJuIGxvY2FsUG9ydDtcbiAgfSk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV2Vidmlld1Byb3BzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvYyBUaGUgbmFtZSBvZiB0aGUgRGV2dG9vbHMgVW5peCBzb2NrZXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3ZWJ2aWV3IFRoZSB3ZWIgdmlldyBhbGlhcy4gTG9va3MgbGlrZSBgV0VCVklFV19gXG4gKiBwcmVmaXggcGx1cyBQSUQgb3IgcGFja2FnZSBuYW1lXG4gKiBAcHJvcGVydHkgez9PYmplY3R9IGluZm8gV2VidmlldyBpbmZvcm1hdGlvbiBhcyBpdCBpcyByZXRyaWV2ZWQgYnlcbiAqIC9qc29uL3ZlcnNpb24gQ0RQIGVuZHBvaW50XG4gKiBAcHJvcGVydHkgez9BcnJheTxPYmplY3Q+fSBwYWdlcyBXZWJ2aWV3IHBhZ2VzIGxpc3QgYXMgaXQgaXMgcmV0cmlldmVkIGJ5XG4gKiAvanNvbi9saXN0IENEUCBlbmRwb2ludFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRGV0YWlsQ29sbGVjdGlvbk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IHdlYnZpZXdEZXZ0b29sc1BvcnQgVGhlIHN0YXJ0aW5nIHBvcnQgdG8gdXNlIGZvciB3ZWJ2aWV3IHBhZ2VcbiAqIHByZXNlbmNlIGNoZWNrIChpZiBub3QgdGhlIGRlZmF1bHQgb2YgOTIyMikuXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyBXaGV0aGVyIHRvIGNoZWNrIGZvciB3ZWJ2aWV3XG4gKiBwYWdlcyBwcmVzZW5jZVxuICogQHByb3BlcnR5IHtib29sZWFufSBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24gV2hldGhlciB0byBjb2xsZWN0XG4gKiB3ZWIgdmlldyBkZXRhaWxzIGFuZCBzZW5kIHRoZW0gdG8gQ2hyb21lZHJpdmVyIGNvbnN0cnVjdG9yLCBzbyBpdCBjb3VsZFxuICogc2VsZWN0IGEgYmluYXJ5IG1vcmUgcHJlY2lzZWx5IGJhc2VkIG9uIHRoaXMgaW5mby5cbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSB3cmFwcGVyIGZvciBDaHJvbWUgRGVidWdnZXIgUHJvdG9jb2wgZGF0YSBjb2xsZWN0aW9uLlxuICogTm8gZXJyb3IgaXMgdGhyb3duIGlmIENEUCByZXF1ZXN0IGZhaWxzIC0gaW4gc3VjaCBjYXNlIG5vIGRhdGEgd2lsbCBiZVxuICogcmVjb3JkZWQgaW50byB0aGUgY29ycmVzcG9uZGluZyBgd2Vidmlld3NNYXBwaW5nYCBpdGVtLlxuICpcbiAqIEBwYXJhbSB7QURCfSBhZGIgVGhlIEFEQiBpbnN0YW5jZVxuICogQHBhcmFtIHtBcnJheTxXZWJ2aWV3UHJvcHM+fSB3ZWJ2aWV3c01hcHBpbmcgVGhlIGN1cnJlbnQgd2Vidmlld3MgbWFwcGluZ1xuICogISEhIEVhY2ggaXRlbSBvZiB0aGlzIGFycmF5IGdldHMgbXV0YXRlZCAoYGluZm9gL2BwYWdlc2AgcHJvcGVydGllcyBnZXQgYWRkZWRcbiAqIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBgb3B0c2ApIGlmIHRoZSByZXF1ZXN0ZWQgZGV0YWlscyBoYXZlIGJlZW5cbiAqIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQgZm9yIGl0ICEhIVxuICogQHBhcmFtIHtEZXRhaWxDb2xsZWN0aW9uT3B0aW9uc30gb3B0cyBJZiBib3RoIGBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlc2AgYW5kXG4gKiBgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uYCBwcm9wZXJ0aWVzIGFyZSBmYWxzeSB0aGVuIG5vIGRldGFpbHMgY29sbGVjdGlvblxuICogaXMgcGVyZm9ybWVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RXZWJ2aWV3c0RldGFpbHMgKGFkYiwgd2Vidmlld3NNYXBwaW5nLCBvcHRzID0ge30pIHtcbiAgaWYgKF8uaXNFbXB0eSh3ZWJ2aWV3c01hcHBpbmcpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIHdlYnZpZXdEZXZ0b29sc1BvcnQgPSBudWxsLFxuICAgIGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzID0gbnVsbCxcbiAgICBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24gPSBudWxsLFxuICB9ID0gb3B0cztcblxuICBpZiAoIWVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzKSB7XG4gICAgbG9nZ2VyLmluZm8oYE5vdCBjaGVja2luZyB3aGV0aGVyIHdlYnZpZXdzIGhhdmUgYWN0aXZlIHBhZ2VzOyB1c2UgdGhlIGAgK1xuICAgICAgYCdlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcycgY2FwIHRvIHR1cm4gdGhpcyBjaGVjayBvbmApO1xuICB9XG5cbiAgaWYgKCFlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24pIHtcbiAgICBsb2dnZXIuaW5mbyhgTm90IGNvbGxlY3Rpbmcgd2ViIHZpZXcgZGV0YWlscy4gRGV0YWlscyBjb2xsZWN0aW9uIG1pZ2h0IGhlbHAgYCArXG4gICAgICBgdG8gbWFrZSBDaHJvbWVkcml2ZXIgaW5pdGlhbGl6YXRpb24gbW9yZSBwcmVjaXNlLiBVc2UgdGhlICdlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24nIGAgK1xuICAgICAgYGNhcCB0byB0dXJuIGl0IG9uYCk7XG4gIH1cblxuICBpZiAoIWVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzICYmICFlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBDb25uZWN0IHRvIGVhY2ggZGV2dG9vbHMgc29ja2V0IGFuZCByZXRyaWV2ZSB3ZWIgdmlldyBkZXRhaWxzXG4gIGxvZ2dlci5kZWJ1ZyhgQ29sbGVjdGluZyBDRFAgZGF0YSBvZiAke3V0aWwucGx1cmFsaXplKCd3ZWJ2aWV3Jywgd2Vidmlld3NNYXBwaW5nLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gIGNvbnN0IGRldGFpbENvbGxlY3RvcnMgPSBbXTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIHdlYnZpZXdzTWFwcGluZykge1xuICAgIGRldGFpbENvbGxlY3RvcnMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IGxvY2FsUG9ydDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsUG9ydCA9IGF3YWl0IGFsbG9jYXRlRGV2dG9vbHNQb3J0KGFkYiwgaXRlbS5wcm9jLCB3ZWJ2aWV3RGV2dG9vbHNQb3J0KTtcbiAgICAgICAgaWYgKGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbikge1xuICAgICAgICAgIGl0ZW0uaW5mbyA9IGF3YWl0IGNkcEluZm8obG9jYWxQb3J0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMpIHtcbiAgICAgICAgICBpdGVtLnBhZ2VzID0gYXdhaXQgY2RwTGlzdChsb2NhbFBvcnQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChsb2NhbFBvcnQpIHtcbiAgICAgICAgICBhd2FpdCBhZGIucmVtb3ZlUG9ydEZvcndhcmQobG9jYWxQb3J0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKCkpO1xuICB9XG4gIGF3YWl0IEIuYWxsKGRldGFpbENvbGxlY3RvcnMpO1xuICBsb2dnZXIuZGVidWcoYENEUCBkYXRhIGNvbGxlY3Rpb24gY29tcGxldGVkYCk7XG59XG5cbi8vIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sL1xuYXN5bmMgZnVuY3Rpb24gY2RwTGlzdCAobG9jYWxQb3J0KSB7XG4gIHJldHVybiAoYXdhaXQgYXhpb3Moe1xuICAgIHVybDogYGh0dHA6Ly8xMjcuMC4wLjE6JHtsb2NhbFBvcnR9L2pzb24vbGlzdGAsXG4gICAgdGltZW91dDogQ0RQX1JFUV9USU1FT1VULFxuICB9KSkuZGF0YTtcbn1cblxuLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvXG5hc3luYyBmdW5jdGlvbiBjZHBJbmZvIChsb2NhbFBvcnQpIHtcbiAgcmV0dXJuIChhd2FpdCBheGlvcyh7XG4gICAgdXJsOiBgaHR0cDovLzEyNy4wLjAuMToke2xvY2FsUG9ydH0vanNvbi92ZXJzaW9uYCxcbiAgICB0aW1lb3V0OiBDRFBfUkVRX1RJTUVPVVQsXG4gIH0pKS5kYXRhO1xufVxuXG4vKipcbiAqIFRha2UgYSB3ZWJ2aWV3IG5hbWUgbGlrZSBXRUJWSUVXXzQyOTYgYW5kIHVzZSAnYWRiIHNoZWxsIHBzJyB0byBmaWd1cmUgb3V0XG4gKiB3aGljaCBhcHAgcGFja2FnZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhhdCB3ZWJ2aWV3LiBPbmUgb2YgdGhlIHJlYXNvbnMgd2VcbiAqIHdhbnQgdG8gZG8gdGhpcyBpcyB0byBtYWtlIHN1cmUgd2UncmUgbGlzdGluZyB3ZWJ2aWV3cyBmb3IgdGhlIGFjdHVhbCBBVVQsXG4gKiBub3Qgc29tZSBvdGhlciBydW5uaW5nIGFwcFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhZGIgLSBhbiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSB3ZWJ2aWV3IC0gYSB3ZWJ2aWV3IHByb2Nlc3MgbmFtZVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgYXBwIHJ1bm5pbmcgdGhlIHdlYnZpZXdcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIHJldHJpZXZpbmcgdGhlIHByb2Nlc3MgbmFtZVxuICovXG5oZWxwZXJzLnByb2NGcm9tV2VidmlldyA9IGFzeW5jIGZ1bmN0aW9uIHByb2NGcm9tV2VidmlldyAoYWRiLCB3ZWJ2aWV3KSB7XG4gIGNvbnN0IHBpZE1hdGNoID0gV0VCVklFV19QSURfUEFUVEVSTi5leGVjKHdlYnZpZXcpO1xuICBpZiAoIXBpZE1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBQSUQgZm9yIHdlYnZpZXcgJyR7d2Vidmlld30nYCk7XG4gIH1cblxuICBjb25zdCBwaWQgPSBwaWRNYXRjaFsxXTtcbiAgbG9nZ2VyLmRlYnVnKGAke3dlYnZpZXd9IG1hcHBlZCB0byBwaWQgJHtwaWR9YCk7XG4gIGxvZ2dlci5kZWJ1ZyhgR2V0dGluZyBwcm9jZXNzIG5hbWUgZm9yIHdlYnZpZXcgJyR7d2Vidmlld30nYCk7XG4gIGNvbnN0IHBrZyA9IGF3YWl0IGFkYi5nZXROYW1lQnlQaWQocGlkKTtcbiAgbG9nZ2VyLmRlYnVnKGBHb3QgcHJvY2VzcyBuYW1lOiAnJHtwa2d9J2ApO1xuICByZXR1cm4gcGtnO1xufTtcblxuLyoqXG4gKiBQYXJzZSB3ZWJ2aWV3IG5hbWVzIGZvciBnZXRDb250ZXh0c1xuICpcbiAqIEBwYXJhbSB7QXJyYXk8V2Vidmlld3NNYXBwaW5nPn0gd2Vidmlld3NNYXBwaW5nIFNlZSBub3RlIG9uIGdldFdlYlZpZXdzTWFwcGluZ1xuICogQHBhcmFtIHtHZXRXZWJ2aWV3c09wdHN9IG9wdHMgU2VlIG5vdGUgb24gZ2V0V2ViVmlld3NNYXBwaW5nXG4gKiBAcmV0dXJuIHtBcnJheS48c3RyaW5nPn0gLSBhIGxpc3Qgb2Ygd2VidmlldyBuYW1lc1xuICovXG5oZWxwZXJzLnBhcnNlV2Vidmlld05hbWVzID0gZnVuY3Rpb24gcGFyc2VXZWJ2aWV3TmFtZXMgKHdlYnZpZXdzTWFwcGluZywge1xuICBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyA9IHRydWUsXG4gIGlzQ2hyb21lU2Vzc2lvbiA9IGZhbHNlXG59ID0ge30pIHtcbiAgaWYgKGlzQ2hyb21lU2Vzc2lvbikge1xuICAgIHJldHVybiBbQ0hST01JVU1fV0lOXTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IHt3ZWJ2aWV3LCBwYWdlcywgcHJvYywgd2Vidmlld05hbWV9IG9mIHdlYnZpZXdzTWFwcGluZykge1xuICAgIGlmIChlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyAmJiBwYWdlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgU2tpcHBpbmcgdGhlIHdlYnZpZXcgJyR7d2Vidmlld30nIGF0ICcke3Byb2N9JyBgICtcbiAgICAgICAgYHNpbmNlIGl0IGhhcyByZXBvcnRlZCBoYXZpbmcgemVybyBwYWdlc2ApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh3ZWJ2aWV3TmFtZSkge1xuICAgICAgcmVzdWx0LnB1c2god2Vidmlld05hbWUpO1xuICAgIH1cbiAgfVxuICBsb2dnZXIuZGVidWcoYEZvdW5kICR7dXRpbC5wbHVyYWxpemUoJ3dlYnZpZXcnLCByZXN1bHQubGVuZ3RoLCB0cnVlKX06ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR2V0V2Vidmlld3NPcHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYW5kcm9pZERldmljZVNvY2tldCBbbnVsbF0gLSBkZXZpY2Ugc29ja2V0IG5hbWVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgW3RydWVdIC0gd2hldGhlciB0byBjaGVjayBmb3Igd2Vidmlld1xuICogcGFnZSBwcmVzZW5jZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHdlYnZpZXdEZXZ0b29sc1BvcnQgWzkyMjJdIC0gcG9ydCB0byB1c2UgZm9yIHdlYnZpZXcgcGFnZVxuICogcHJlc2VuY2UgY2hlY2suXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiBbdHJ1ZV0gLSB3aGV0aGVyIHRvIGNvbGxlY3RcbiAqIHdlYiB2aWV3IGRldGFpbHMgYW5kIHNlbmQgdGhlbSB0byBDaHJvbWVkcml2ZXIgY29uc3RydWN0b3IsIHNvIGl0IGNvdWxkXG4gKiBzZWxlY3QgYSBiaW5hcnkgbW9yZSBwcmVjaXNlbHkgYmFzZWQgb24gdGhpcyBpbmZvLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV2Vidmlld3NNYXBwaW5nXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvYyBTZWUgbm90ZSBvbiBXZWJ2aWV3UHJvcHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3ZWJ2aWV3IFNlZSBub3RlIG9uIFdlYnZpZXdQcm9wc1xuICogQHByb3BlcnR5IHs/T2JqZWN0fSBpbmZvIFNlZSBub3RlIG9uIFdlYnZpZXdQcm9wc1xuICogQHByb3BlcnR5IHs/QXJyYXk8T2JqZWN0Pn0gcGFnZXMgU2VlIG5vdGUgb24gV2Vidmlld1Byb3BzXG4gKiBAcHJvcGVyeSB7P3N0cmluZ30gd2Vidmlld05hbWUgQW4gYWN0dWFsIHdlYnZpZXcgbmFtZSBmb3Igc3dpdGNoaW5nIGNvbnRleHRcbiAqL1xuXG4vKipcbiAqIEdldCBhIGxpc3Qgb2YgYXZhaWxhYmxlIHdlYnZpZXdzIG1hcHBpbmcgYnkgaW50cm9zcGVjdGluZyBwcm9jZXNzZXMgd2l0aCBhZGIsXG4gKiB3aGVyZSB3ZWJ2aWV3cyBhcmUgbGlzdGVkLiBJdCdzIHBvc3NpYmxlIHRvIHBhc3MgaW4gYSAnZGV2aWNlU29ja2V0JyBhcmcsIHdoaWNoXG4gKiBsaW1pdHMgdGhlIHdlYnZpZXcgcG9zc2liaWxpdGllcyB0byB0aGUgb25lIHJ1bm5pbmcgb24gdGhlIENocm9taXVtIGRldnRvb2xzXG4gKiBzb2NrZXQgd2UncmUgaW50ZXJlc3RlZCBpbiAoc2VlIG5vdGUgb24gd2Vidmlld3NGcm9tUHJvY3MpLiBXZSBjYW4gYWxzb1xuICogZGlyZWN0IHRoaXMgbWV0aG9kIHRvIHZlcmlmeSB3aGV0aGVyIGEgcGFydGljdWxhciB3ZWJ2aWV3IHByb2Nlc3MgYWN0dWFsbHlcbiAqIGhhcyBhbnkgcGFnZXMgKGlmIGEgcHJvY2VzcyBleGlzdHMgYnV0IG5vIHBhZ2VzIGFyZSBmb3VuZCwgQ2hyb21lZHJpdmVyIHdpbGxcbiAqIG5vdCBhY3R1YWxseSBiZSBhYmxlIHRvIGNvbm5lY3QgdG8gaXQsIHNvIHRoaXMgc2VydmVzIGFzIGEgZ3VhcmQgZm9yIHRoYXRcbiAqIHN0cmFuZ2UgZmFpbHVyZSBtb2RlKS4gVGhlIHN0cmF0ZWd5IGZvciBjaGVja2luZyB3aGV0aGVyIGFueSBwYWdlcyBhcmVcbiAqIGFjdGl2ZSBpbnZvbHZlcyBzZW5kaW5nIGEgcmVxdWVzdCB0byB0aGUgcmVtb3RlIGRlYnVnIHNlcnZlciBvbiB0aGUgZGV2aWNlLFxuICogaGVuY2UgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzcGVjaWZ5IHRoZSBwb3J0IG9uIHRoZSBob3N0IG1hY2hpbmUgd2hpY2hcbiAqIHNob3VsZCBiZSB1c2VkIGZvciB0aGlzIGNvbW11bmljYXRpb24uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFkYiAtIGFuIEFEQiBpbnN0YW5jZVxuICogQHBhcmFtIHtHZXRXZWJ2aWV3c09wdHN9IG9wdHNcbiAqXG4gKiBAcmV0dXJuIHtBcnJheTxXZWJ2aWV3c01hcHBpbmc+fSB3ZWJ2aWV3c01hcHBpbmdcbiAqL1xuaGVscGVycy5nZXRXZWJWaWV3c01hcHBpbmcgPSBhc3luYyBmdW5jdGlvbiBnZXRXZWJWaWV3c01hcHBpbmcgKGFkYiwge1xuICBhbmRyb2lkRGV2aWNlU29ja2V0ID0gbnVsbCxcbiAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgPSB0cnVlLFxuICB3ZWJ2aWV3RGV2dG9vbHNQb3J0ID0gbnVsbCxcbiAgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uID0gdHJ1ZVxufSA9IHt9KSB7XG4gIGxvZ2dlci5kZWJ1ZygnR2V0dGluZyBhIGxpc3Qgb2YgYXZhaWxhYmxlIHdlYnZpZXdzJyk7XG4gIGNvbnN0IHdlYnZpZXdzTWFwcGluZyA9IGF3YWl0IHdlYnZpZXdzRnJvbVByb2NzKGFkYiwgYW5kcm9pZERldmljZVNvY2tldCk7XG5cbiAgYXdhaXQgY29sbGVjdFdlYnZpZXdzRGV0YWlscyhhZGIsIHdlYnZpZXdzTWFwcGluZywge1xuICAgIGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzLFxuICAgIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbixcbiAgICB3ZWJ2aWV3RGV2dG9vbHNQb3J0LFxuICB9KTtcblxuICBmb3IgKGNvbnN0IHdlYnZpZXdNYXBwaW5nIG9mIHdlYnZpZXdzTWFwcGluZykge1xuICAgIGNvbnN0IHt3ZWJ2aWV3LCBpbmZvfSA9IHdlYnZpZXdNYXBwaW5nO1xuICAgIHdlYnZpZXdNYXBwaW5nLndlYnZpZXdOYW1lID0gbnVsbDtcblxuICAgIGxldCB3dk5hbWUgPSB3ZWJ2aWV3O1xuICAgIGxldCBwcm9jZXNzID0gdW5kZWZpbmVkO1xuICAgIGlmICghYW5kcm9pZERldmljZVNvY2tldCkge1xuICAgICAgY29uc3QgcGtnTWF0Y2ggPSBXRUJWSUVXX1BLR19QQVRURVJOLmV4ZWMod2Vidmlldyk7XG4gICAgICB0cnkge1xuICAgICAgICAvLyB3ZWIgdmlldyBuYW1lIGNvdWxkIGVpdGhlciBiZSBzdWZmaXhlZCB3aXRoIFBJRCBvciB0aGUgcGFja2FnZSBuYW1lXG4gICAgICAgIC8vIHBhY2thZ2UgbmFtZXMgY291bGQgbm90IHN0YXJ0IHdpdGggYSBkaWdpdFxuICAgICAgICBjb25zdCBwa2cgPSBwa2dNYXRjaCA/IHBrZ01hdGNoWzFdIDogYXdhaXQgaGVscGVycy5wcm9jRnJvbVdlYnZpZXcoYWRiLCB3ZWJ2aWV3KTtcbiAgICAgICAgd3ZOYW1lID0gYCR7V0VCVklFV19CQVNFfSR7cGtnfWA7XG4gICAgICAgIGNvbnN0IHBpZE1hdGNoID0gV0VCVklFV19QSURfUEFUVEVSTi5leGVjKHdlYnZpZXcpO1xuICAgICAgICBwcm9jZXNzID0ge1xuICAgICAgICAgIG5hbWU6IHBrZyxcbiAgICAgICAgICBpZDogcGlkTWF0Y2ggPyBwaWRNYXRjaFsxXSA6IG51bGwsXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGUubWVzc2FnZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdlYnZpZXdNYXBwaW5nLndlYnZpZXdOYW1lID0gd3ZOYW1lO1xuICAgIGNvbnN0IGtleSA9IHRvRGV0YWlsc0NhY2hlS2V5KGFkYiwgd3ZOYW1lKTtcbiAgICBpZiAoaW5mbyB8fCBwcm9jZXNzKSB7XG4gICAgICBXRUJWSUVXU19ERVRBSUxTX0NBQ0hFLnNldChrZXksIHsgaW5mbywgcHJvY2VzcyB9KTtcbiAgICB9IGVsc2UgaWYgKFdFQlZJRVdTX0RFVEFJTFNfQ0FDSEUuaGFzKGtleSkpIHtcbiAgICAgIFdFQlZJRVdTX0RFVEFJTFNfQ0FDSEUuZGVsZXRlKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB3ZWJ2aWV3c01hcHBpbmc7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFByb2Nlc3NJbmZvXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSBUaGUgcHJvY2VzcyBuYW1lXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGlkIFRoZSBwcm9jZXNzIGlkIChpZiBjb3VsZCBiZSByZXRyaWV2ZWQpXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJWaWV3RGV0YWlsc1xuICogQHByb3BlcnR5IHs/UHJvY2Vzc0luZm99IHByb2Nlc3MgLSBXZWIgdmlldyBwcm9jZXNzIGRldGFpbHNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBpbmZvIC0gV2ViIHZpZXcgZGV0YWlscyBhcyByZXR1cm5lZCBieSAvanNvbi92ZXJzaW9uIENEUCBlbmRwb2ludCwgZm9yIGV4YW1wbGU6XG4gKiB7XG4gKiAgXCJCcm93c2VyXCI6IFwiQ2hyb21lLzcyLjAuMzYwMS4wXCIsXG4gKiAgXCJQcm90b2NvbC1WZXJzaW9uXCI6IFwiMS4zXCIsXG4gKiAgXCJVc2VyLUFnZW50XCI6IFwiTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTNfNikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzcyLjAuMzYwMS4wIFNhZmFyaS81MzcuMzZcIixcbiAqICBcIlY4LVZlcnNpb25cIjogXCI3LjIuMjMzXCIsXG4gKiAgXCJXZWJLaXQtVmVyc2lvblwiOiBcIjUzNy4zNiAoQGNmZWRlOWRiMWQxNTRkZTA0NjhjYjA1Mzg0NzlmMzRjMDc1NWEwZjQpXCIsXG4gKiAgXCJ3ZWJTb2NrZXREZWJ1Z2dlclVybFwiOiBcIndzOi8vbG9jYWxob3N0OjkyMjIvZGV2dG9vbHMvYnJvd3Nlci9iMGI4YTRmYi1iYjE3LTQzNTktOTUzMy1hOGQ5ZjM5MDhiZDhcIlxuICogfVxuICovXG5cbi8qKlxuICogUmV0cmlldmVzIHdlYiB2aWV3IGRldGFpbHMgcHJldmlvdXNseSBjYWNoZWQgYnkgYGdldFdlYnZpZXdzYCBjYWxsXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSB3ZWJ2aWV3IFRoZSBuYW1lIG9mIHRoZSB3ZWIgdmlld1xuICogQHJldHVybnMgez9XZWJWaWV3RGV0YWlsc30gRWl0aGVyIGB1bmRlZmluZWRgIG9yIHRoZSByZWNlbnQgd2ViIHZpZXcgZGV0YWlsc1xuICovXG5oZWxwZXJzLmdldFdlYnZpZXdEZXRhaWxzID0gZnVuY3Rpb24gZ2V0V2Vidmlld0RldGFpbHMgKGFkYiwgd2Vidmlldykge1xuICBjb25zdCBrZXkgPSB0b0RldGFpbHNDYWNoZUtleShhZGIsIHdlYnZpZXcpO1xuICByZXR1cm4gV0VCVklFV1NfREVUQUlMU19DQUNIRS5nZXQoa2V5KTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIENocm9tZSBkcml2ZXIgY2FwYWJpbGl0aWVzIGJhc2VkIG9uIHRoZSBwcm92aWRlZFxuICogQXBwaXVtIGNhcGFiaWxpdGllc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIFVzZXItcHJvdmlkZWQgY2FwYWJpbGl0aWVzIG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IGRldmljZUlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBBbmRyb2lkIGRldmljZSB1bmRlciB0ZXN0XG4gKiBAcGFyYW0gez9XZWJWaWV3RGV0YWlsc30gd2ViVmlld0RldGFpbHNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBjYXBhYmlsaXRpZXMgb2JqZWN0LlxuICogU2VlIGh0dHBzOi8vY2hyb21lZHJpdmVyLmNocm9taXVtLm9yZy9jYXBhYmlsaXRpZXMgZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuaGVscGVycy5jcmVhdGVDaHJvbWVkcml2ZXJDYXBzID0gZnVuY3Rpb24gY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyAob3B0cywgZGV2aWNlSWQsIHdlYlZpZXdEZXRhaWxzKSB7XG4gIGNvbnN0IGNhcHMgPSB7IGNocm9tZU9wdGlvbnM6IHt9IH07XG5cbiAgY29uc3QgYW5kcm9pZFBhY2thZ2UgPSBvcHRzLmNocm9tZU9wdGlvbnM/LmFuZHJvaWRQYWNrYWdlXG4gICAgfHwgb3B0cy5hcHBQYWNrYWdlXG4gICAgfHwgd2ViVmlld0RldGFpbHM/LmluZm8/LlsnQW5kcm9pZC1QYWNrYWdlJ107XG4gIGlmIChhbmRyb2lkUGFja2FnZSkge1xuICAgIC8vIGNocm9tZWRyaXZlciByYWlzZXMgYW4gaW52YWxpZCBhcmd1bWVudCBlcnJvciB3aGVuIGFuZHJvaWRQYWNrYWdlIGlzICdudWxsJ1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSA9IGFuZHJvaWRQYWNrYWdlO1xuICB9XG4gIGlmIChfLmlzQm9vbGVhbihvcHRzLmNocm9tZVVzZVJ1bm5pbmdBcHApKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRVc2VSdW5uaW5nQXBwID0gb3B0cy5jaHJvbWVVc2VSdW5uaW5nQXBwO1xuICB9XG4gIGlmIChvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQYWNrYWdlID0gb3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZTtcbiAgfVxuICBpZiAob3B0cy5jaHJvbWVBbmRyb2lkQWN0aXZpdHkpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZEFjdGl2aXR5ID0gb3B0cy5jaHJvbWVBbmRyb2lkQWN0aXZpdHk7XG4gIH1cbiAgaWYgKG9wdHMuY2hyb21lQW5kcm9pZFByb2Nlc3MpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFByb2Nlc3MgPSBvcHRzLmNocm9tZUFuZHJvaWRQcm9jZXNzO1xuICB9IGVsc2UgaWYgKHdlYlZpZXdEZXRhaWxzPy5wcm9jZXNzPy5uYW1lICYmIHdlYlZpZXdEZXRhaWxzPy5wcm9jZXNzPy5pZCkge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUHJvY2VzcyA9IHdlYlZpZXdEZXRhaWxzLnByb2Nlc3MubmFtZTtcbiAgfVxuICBpZiAoXy50b0xvd2VyKG9wdHMuYnJvd3Nlck5hbWUpID09PSAnY2hyb21pdW0td2VidmlldycpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZEFjdGl2aXR5ID0gb3B0cy5hcHBBY3Rpdml0eTtcbiAgfVxuICBpZiAob3B0cy5wYWdlTG9hZFN0cmF0ZWd5KSB7XG4gICAgY2Fwcy5wYWdlTG9hZFN0cmF0ZWd5ID0gb3B0cy5wYWdlTG9hZFN0cmF0ZWd5O1xuICB9XG4gIGNvbnN0IGlzQ2hyb21lID0gXy50b0xvd2VyKGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSkgPT09ICdjaHJvbWUnO1xuICBpZiAoXy5pbmNsdWRlcyhLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUywgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQYWNrYWdlKSB8fCBpc0Nocm9tZSkge1xuICAgIC8vIGlmIHdlIGhhdmUgZXh0cmFjdGVkIHBhY2thZ2UgZnJvbSBjb250ZXh0IG5hbWUsIGl0IGNvdWxkIGNvbWUgaW4gYXMgYmFyZVxuICAgIC8vIFwiY2hyb21lXCIsIGFuZCBzbyB3ZSBzaG91bGQgbWFrZSBzdXJlIHRoZSBkZXRhaWxzIGFyZSBjb3JyZWN0LCBpbmNsdWRpbmdcbiAgICAvLyBub3QgdXNpbmcgYW4gYWN0aXZpdHkgb3IgcHJvY2VzcyBpZFxuICAgIGlmIChpc0Nocm9tZSkge1xuICAgICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQYWNrYWdlID0gQ0hST01FX1BBQ0tBR0VfTkFNRTtcbiAgICB9XG4gICAgZGVsZXRlIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkQWN0aXZpdHk7XG4gICAgZGVsZXRlIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUHJvY2VzcztcbiAgfVxuICAvLyBhZGQgZGV2aWNlIGlkIGZyb20gYWRiXG4gIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkRGV2aWNlU2VyaWFsID0gZGV2aWNlSWQ7XG5cbiAgaWYgKF8uaXNQbGFpbk9iamVjdChvcHRzLmxvZ2dpbmdQcmVmcykgfHwgXy5pc1BsYWluT2JqZWN0KG9wdHMuY2hyb21lTG9nZ2luZ1ByZWZzKSkge1xuICAgIGlmIChvcHRzLmxvZ2dpbmdQcmVmcykge1xuICAgICAgbG9nZ2VyLndhcm4oYFRoZSAnbG9nZ2luZ1ByZWZzJyBjYXAgaXMgZGVwcmVjYXRlZDsgdXNlIHRoZSAnY2hyb21lTG9nZ2luZ1ByZWZzJyBjYXAgaW5zdGVhZGApO1xuICAgIH1cbiAgICBjYXBzLmxvZ2dpbmdQcmVmcyA9IG9wdHMuY2hyb21lTG9nZ2luZ1ByZWZzIHx8IG9wdHMubG9nZ2luZ1ByZWZzO1xuICB9XG4gIGlmIChvcHRzLmVuYWJsZVBlcmZvcm1hbmNlTG9nZ2luZykge1xuICAgIGxvZ2dlci53YXJuKGBUaGUgJ2VuYWJsZVBlcmZvcm1hbmNlTG9nZ2luZycgY2FwIGlzIGRlcHJlY2F0ZWQ7IHNpbXBseSB1c2UgYCArXG4gICAgICBgdGhlICdjaHJvbWVMb2dnaW5nUHJlZnMnIGNhcCBpbnN0ZWFkLCB3aXRoIGEgJ3BlcmZvcm1hbmNlJyBrZXkgc2V0IHRvICdBTEwnYCk7XG4gICAgY29uc3QgbmV3UHJlZiA9IHtwZXJmb3JtYW5jZTogJ0FMTCd9O1xuICAgIC8vIGRvbid0IG92ZXJ3cml0ZSBvdGhlciBsb2dnaW5nIHByZWZzIHRoYXQgaGF2ZSBiZWVuIHNlbnQgaW4gaWYgdGhleSBleGlzdFxuICAgIGNhcHMubG9nZ2luZ1ByZWZzID0gY2Fwcy5sb2dnaW5nUHJlZnNcbiAgICAgID8gT2JqZWN0LmFzc2lnbih7fSwgY2Fwcy5sb2dnaW5nUHJlZnMsIG5ld1ByZWYpXG4gICAgICA6IG5ld1ByZWY7XG4gIH1cblxuICBpZiAob3B0cy5jaHJvbWVPcHRpb25zPy5Bcmd1bWVudHMpIHtcbiAgICAvLyBtZXJnZSBgQXJndW1lbnRzYCBhbmQgYGFyZ3NgXG4gICAgb3B0cy5jaHJvbWVPcHRpb25zLmFyZ3MgPSBbLi4uKG9wdHMuY2hyb21lT3B0aW9ucy5hcmdzIHx8IFtdKSwgLi4ub3B0cy5jaHJvbWVPcHRpb25zLkFyZ3VtZW50c107XG4gICAgZGVsZXRlIG9wdHMuY2hyb21lT3B0aW9ucy5Bcmd1bWVudHM7XG4gIH1cblxuICBsb2dnZXIuZGVidWcoJ1ByZWNhbGN1bGF0ZWQgQ2hyb21lZHJpdmVyIGNhcGFiaWxpdGllczogJyArXG4gICAgSlNPTi5zdHJpbmdpZnkoY2Fwcy5jaHJvbWVPcHRpb25zLCBudWxsLCAyKSk7XG5cbiAgY29uc3QgcHJvdGVjdGVkQ2FwTmFtZXMgPSBbXTtcbiAgZm9yIChjb25zdCBbb3B0LCB2YWxdIG9mIF8udG9QYWlycyhvcHRzLmNocm9tZU9wdGlvbnMpKSB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQoY2Fwcy5jaHJvbWVPcHRpb25zW29wdF0pKSB7XG4gICAgICBjYXBzLmNocm9tZU9wdGlvbnNbb3B0XSA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvdGVjdGVkQ2FwTmFtZXMucHVzaChvcHQpO1xuICAgIH1cbiAgfVxuICBpZiAoIV8uaXNFbXB0eShwcm90ZWN0ZWRDYXBOYW1lcykpIHtcbiAgICBsb2dnZXIuaW5mbygnVGhlIGZvbGxvd2luZyBDaHJvbWVkcml2ZXIgY2FwYWJpbGl0aWVzIGNhbm5vdCBiZSBvdmVycmlkZGVuICcgK1xuICAgICAgJ2J5IHRoZSBwcm92aWRlZCBjaHJvbWVPcHRpb25zOicpO1xuICAgIGZvciAoY29uc3Qgb3B0TmFtZSBvZiBwcm90ZWN0ZWRDYXBOYW1lcykge1xuICAgICAgbG9nZ2VyLmluZm8oYCAgJHtvcHROYW1lfSAoJHtKU09OLnN0cmluZ2lmeShvcHRzLmNocm9tZU9wdGlvbnNbb3B0TmFtZV0pfSlgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2Fwcztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGhlbHBlcnM7XG5leHBvcnQgeyBoZWxwZXJzLCBOQVRJVkVfV0lOLCBXRUJWSUVXX1dJTiwgV0VCVklFV19CQVNFLCBDSFJPTUlVTV9XSU4sIEtOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTIH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsVUFBVSxHQUFHLFlBQW5COztBQUNBLE1BQU1DLFdBQVcsR0FBRyxTQUFwQjs7QUFDQSxNQUFNQyxZQUFZLEdBQUcsVUFBckI7O0FBQ0EsTUFBTUMsWUFBWSxHQUFJLEdBQUVGLFdBQVksR0FBcEM7O0FBQ0EsTUFBTUcsbUJBQW1CLEdBQUcsSUFB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
360
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOQVRJVkVfV0lOIiwiV0VCVklFV19XSU4iLCJDSFJPTUlVTV9XSU4iLCJXRUJWSUVXX0JBU0UiLCJXRUJWSUVXX1BJRF9QQVRURVJOIiwiUmVnRXhwIiwiV0VCVklFV19QS0dfUEFUVEVSTiIsIkRFVlRPT0xTX1NPQ0tFVF9QQVRURVJOIiwiQ1JPU1NXQUxLX1NPQ0tFVF9QQVRURVJOIiwiQ0hST01JVU1fREVWVE9PTFNfU09DS0VUIiwiQ0hST01FX1BBQ0tBR0VfTkFNRSIsIktOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTIiwiREVWVE9PTFNfUE9SVFNfUkFOR0UiLCJXRUJWSUVXU19ERVRBSUxTX0NBQ0hFIiwiTFJVIiwibWF4IiwidXBkYXRlQWdlT25HZXQiLCJDRFBfUkVRX1RJTUVPVVQiLCJERVZUT09MU19QT1JUX0FMTE9DQVRJT05fR1VBUkQiLCJ1dGlsIiwiZ2V0TG9ja0ZpbGVHdWFyZCIsInBhdGgiLCJyZXNvbHZlIiwib3MiLCJ0bXBkaXIiLCJ0aW1lb3V0IiwidHJ5UmVjb3ZlcnkiLCJoZWxwZXJzIiwidG9EZXRhaWxzQ2FjaGVLZXkiLCJhZGIiLCJ3ZWJ2aWV3IiwiY3VyRGV2aWNlSWQiLCJnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3MiLCJvdXQiLCJzaGVsbCIsIm5hbWVzIiwiYWxsTWF0Y2hlcyIsImxpbmUiLCJzcGxpdCIsImZsYWdzIiwic3QiLCJzb2NrUGF0aCIsInRyaW0iLCJzdGFydHNXaXRoIiwicHVzaCIsInRlc3QiLCJfIiwiaXNFbXB0eSIsImxvZ2dlciIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsImxlbmd0aCIsInBsdXJhbGl6ZSIsInVuaXEiLCJ3ZWJ2aWV3c0Zyb21Qcm9jcyIsImRldmljZVNvY2tldCIsInNvY2tldE5hbWVzIiwid2Vidmlld3MiLCJzb2NrZXROYW1lIiwicHJvYyIsInNvY2tldE5hbWVNYXRjaCIsImV4ZWMiLCJjcm9zc3dhbGtNYXRjaCIsImFsbG9jYXRlRGV2dG9vbHNQb3J0Iiwid2Vidmlld0RldnRvb2xzUG9ydCIsInJlbW90ZVBvcnQiLCJyZXBsYWNlIiwic3RhcnRQb3J0IiwiZW5kUG9ydCIsImxvY2FsUG9ydCIsImZpbmRBUG9ydE5vdEluVXNlIiwiZSIsIkVycm9yIiwiYWRiRXhlYyIsImNvbGxlY3RXZWJ2aWV3c0RldGFpbHMiLCJ3ZWJ2aWV3c01hcHBpbmciLCJvcHRzIiwiZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMiLCJlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24iLCJpbmZvIiwiZGV0YWlsQ29sbGVjdG9ycyIsIml0ZW0iLCJjZHBJbmZvIiwicGFnZXMiLCJjZHBMaXN0IiwicmVtb3ZlUG9ydEZvcndhcmQiLCJCIiwiYWxsIiwiYXhpb3MiLCJ1cmwiLCJkYXRhIiwicHJvY0Zyb21XZWJ2aWV3IiwicGlkTWF0Y2giLCJwaWQiLCJwa2ciLCJnZXROYW1lQnlQaWQiLCJwYXJzZVdlYnZpZXdOYW1lcyIsImlzQ2hyb21lU2Vzc2lvbiIsInJlc3VsdCIsIndlYnZpZXdOYW1lIiwiZ2V0V2ViVmlld3NNYXBwaW5nIiwiYW5kcm9pZERldmljZVNvY2tldCIsIndlYnZpZXdNYXBwaW5nIiwid3ZOYW1lIiwicHJvY2VzcyIsInVuZGVmaW5lZCIsInBrZ01hdGNoIiwibmFtZSIsImlkIiwid2FybiIsIm1lc3NhZ2UiLCJrZXkiLCJzZXQiLCJoYXMiLCJkZWxldGUiLCJnZXRXZWJ2aWV3RGV0YWlscyIsImdldCIsImNyZWF0ZUNocm9tZWRyaXZlckNhcHMiLCJkZXZpY2VJZCIsIndlYlZpZXdEZXRhaWxzIiwiY2FwcyIsImNocm9tZU9wdGlvbnMiLCJhbmRyb2lkUGFja2FnZSIsImFwcFBhY2thZ2UiLCJpc0Jvb2xlYW4iLCJjaHJvbWVVc2VSdW5uaW5nQXBwIiwiYW5kcm9pZFVzZVJ1bm5pbmdBcHAiLCJjaHJvbWVBbmRyb2lkUGFja2FnZSIsImNocm9tZUFuZHJvaWRBY3Rpdml0eSIsImFuZHJvaWRBY3Rpdml0eSIsImNocm9tZUFuZHJvaWRQcm9jZXNzIiwiYW5kcm9pZFByb2Nlc3MiLCJ0b0xvd2VyIiwiYnJvd3Nlck5hbWUiLCJhcHBBY3Rpdml0eSIsInBhZ2VMb2FkU3RyYXRlZ3kiLCJpc0Nocm9tZSIsImluY2x1ZGVzIiwiYW5kcm9pZERldmljZVNlcmlhbCIsImlzUGxhaW5PYmplY3QiLCJsb2dnaW5nUHJlZnMiLCJjaHJvbWVMb2dnaW5nUHJlZnMiLCJlbmFibGVQZXJmb3JtYW5jZUxvZ2dpbmciLCJuZXdQcmVmIiwicGVyZm9ybWFuY2UiLCJPYmplY3QiLCJhc3NpZ24iLCJBcmd1bWVudHMiLCJhcmdzIiwicHJvdGVjdGVkQ2FwTmFtZXMiLCJvcHQiLCJ2YWwiLCJ0b1BhaXJzIiwiaXNVbmRlZmluZWQiLCJvcHROYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3dlYnZpZXctaGVscGVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IGZpbmRBUG9ydE5vdEluVXNlIH0gZnJvbSAncG9ydHNjYW5uZXInO1xuaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuXG5jb25zdCBOQVRJVkVfV0lOID0gJ05BVElWRV9BUFAnO1xuY29uc3QgV0VCVklFV19XSU4gPSAnV0VCVklFVyc7XG5jb25zdCBDSFJPTUlVTV9XSU4gPSAnQ0hST01JVU0nO1xuY29uc3QgV0VCVklFV19CQVNFID0gYCR7V0VCVklFV19XSU59X2A7XG5jb25zdCBXRUJWSUVXX1BJRF9QQVRURVJOID0gbmV3IFJlZ0V4cChgXiR7V0VCVklFV19CQVNFfShcXFxcZCspYCk7XG5jb25zdCBXRUJWSUVXX1BLR19QQVRURVJOID0gbmV3IFJlZ0V4cChgXiR7V0VCVklFV19CQVNFfShbXlxcXFxkXFxcXHNdW1xcXFx3Ll0qKWApO1xuY29uc3QgREVWVE9PTFNfU09DS0VUX1BBVFRFUk4gPSAvQFtcXHcuXStfZGV2dG9vbHNfcmVtb3RlXz8oXFxkKyk/XFxiLztcbmNvbnN0IENST1NTV0FMS19TT0NLRVRfUEFUVEVSTiA9IC9AKFtcXHcuXSspX2RldnRvb2xzX3JlbW90ZVxcYi87XG5jb25zdCBDSFJPTUlVTV9ERVZUT09MU19TT0NLRVQgPSAnY2hyb21lX2RldnRvb2xzX3JlbW90ZSc7XG5jb25zdCBDSFJPTUVfUEFDS0FHRV9OQU1FID0gJ2NvbS5hbmRyb2lkLmNocm9tZSc7XG5jb25zdCBLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUyA9IFtcbiAgQ0hST01FX1BBQ0tBR0VfTkFNRSxcbiAgJ2NvbS5jaHJvbWUuYmV0YScsXG4gICdjb20uY2hyb21lLmRldicsXG4gICdjb20uY2hyb21lLmNhbmFyeScsXG5dO1xuY29uc3QgREVWVE9PTFNfUE9SVFNfUkFOR0UgPSBbMTA5MDAsIDExMDAwXTtcbmNvbnN0IFdFQlZJRVdTX0RFVEFJTFNfQ0FDSEUgPSBuZXcgTFJVKHtcbiAgbWF4OiAxMDAsXG4gIHVwZGF0ZUFnZU9uR2V0OiB0cnVlLFxufSk7XG5jb25zdCBDRFBfUkVRX1RJTUVPVVQgPSAyMDAwOyAvLyBtc1xuY29uc3QgREVWVE9PTFNfUE9SVF9BTExPQ0FUSU9OX0dVQVJEID0gdXRpbC5nZXRMb2NrRmlsZUd1YXJkKFxuICBwYXRoLnJlc29sdmUob3MudG1wZGlyKCksICdhbmRyb2lkX2RldnRvb2xzX3BvcnRfZ3VhcmQnKSxcbiAge3RpbWVvdXQ6IDcsIHRyeVJlY292ZXJ5OiB0cnVlfVxuKTtcblxuY29uc3QgaGVscGVycyA9IHt9O1xuXG5mdW5jdGlvbiB0b0RldGFpbHNDYWNoZUtleSAoYWRiLCB3ZWJ2aWV3KSB7XG4gIHJldHVybiBgJHthZGI/LmN1ckRldmljZUlkfToke3dlYnZpZXd9YDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGdldHMgYSBsaXN0IG9mIGFuZHJvaWQgc3lzdGVtIHByb2Nlc3NlcyBhbmQgcmV0dXJucyBvbmVzXG4gKiB0aGF0IGxvb2sgbGlrZSB3ZWJ2aWV3c1xuICogU2VlIGh0dHBzOi8vY3MuY2hyb21pdW0ub3JnL2Nocm9taXVtL3NyYy9jaHJvbWUvYnJvd3Nlci9kZXZ0b29scy9kZXZpY2UvYW5kcm9pZF9kZXZpY2VfaW5mb19xdWVyeS5jY1xuICogZm9yIG1vcmUgZGV0YWlsc1xuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhZGIgLSBhbiBBREIgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtBcnJheS48c3RyaW5nPn0gLSBhIGxpc3Qgb2YgbWF0Y2hpbmcgd2VidmlldyBzb2NrZXQgbmFtZXMgKGluY2x1ZGluZyB0aGUgbGVhZGluZyAnQCcpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFBvdGVudGlhbFdlYnZpZXdQcm9jcyAoYWRiKSB7XG4gIGNvbnN0IG91dCA9IGF3YWl0IGFkYi5zaGVsbChbJ2NhdCcsICcvcHJvYy9uZXQvdW5peCddKTtcbiAgY29uc3QgbmFtZXMgPSBbXTtcbiAgY29uc3QgYWxsTWF0Y2hlcyA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2Ygb3V0LnNwbGl0KCdcXG4nKSkge1xuICAgIC8vIE51bSBSZWZDb3VudCBQcm90b2NvbCBGbGFncyBUeXBlIFN0IElub2RlIFBhdGhcbiAgICBjb25zdCBbLCwsIGZsYWdzLCwgc3QsLCBzb2NrUGF0aF0gPSBsaW5lLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmICghc29ja1BhdGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoc29ja1BhdGguc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgICBhbGxNYXRjaGVzLnB1c2gobGluZS50cmltKCkpO1xuICAgIH1cbiAgICBpZiAoZmxhZ3MgIT09ICcwMDAxMDAwMCcgfHwgc3QgIT09ICcwMScpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIURFVlRPT0xTX1NPQ0tFVF9QQVRURVJOLnRlc3Qoc29ja1BhdGgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBuYW1lcy5wdXNoKHNvY2tQYXRoKTtcbiAgfVxuICBpZiAoXy5pc0VtcHR5KG5hbWVzKSkge1xuICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgbm8gYWN0aXZlIGRldnRvb2xzIHNvY2tldHMnKTtcbiAgICBpZiAoIV8uaXNFbXB0eShhbGxNYXRjaGVzKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBPdGhlciBzb2NrZXRzIGFyZTogJHtKU09OLnN0cmluZ2lmeShhbGxNYXRjaGVzLCBudWxsLCAyKX1gKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBQYXJzZWQgJHtuYW1lcy5sZW5ndGh9IGFjdGl2ZSBkZXZ0b29scyAke3V0aWwucGx1cmFsaXplKCdzb2NrZXQnLCBuYW1lcy5sZW5ndGgsIGZhbHNlKX06IGAgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkobmFtZXMpKTtcbiAgfVxuICAvLyBzb21ldGltZXMgdGhlIHdlYnZpZXcgcHJvY2VzcyBzaG93cyB1cCBtdWx0aXBsZSB0aW1lcyBwZXIgYXBwXG4gIHJldHVybiBfLnVuaXEobmFtZXMpO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdQcm9jXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvYyAtIFRoZSB3ZWJ2aWV3IHByb2Nlc3MgbmFtZSAoYXMgcmV0dXJuZWQgYnlcbiAqIGdldFBvdGVudGlhbFdlYnZpZXdQcm9jc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHdlYnZpZXcgLSBUaGUgYWN0dWFsIHdlYnZpZXcgY29udGV4dCBuYW1lXG4gKi9cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgYSBsaXN0IG9mIHN5c3RlbSBwcm9jZXNzZXMgdGhhdCBsb29rIGxpa2Ugd2Vidmlld3MsXG4gKiBhbmQgcmV0dXJucyB0aGVtIGFsb25nIHdpdGggdGhlIHdlYnZpZXcgY29udGV4dCBuYW1lIGFwcHJvcHJpYXRlIGZvciBpdC5cbiAqIElmIHdlIHBhc3MgaW4gYSBkZXZpY2VTb2NrZXQsIHdlIG9ubHkgYXR0ZW1wdCB0byBmaW5kIHdlYnZpZXdzIHdoaWNoIG1hdGNoXG4gKiB0aGF0IHNvY2tldCBuYW1lICh0aGlzIGlzIGZvciBhcHBzIHdoaWNoIGVtYmVkIENocm9taXVtLCB3aGljaCBpc24ndCB0aGVcbiAqIHNhbWUgYXMgY2hyb21lLWJhY2tlZCB3ZWJ2aWV3cykuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFkYiAtIGFuIEFEQiBpbnN0YW5jZVxuICogQHBhcmFtIHs/c3RyaW5nfSBkZXZpY2VTb2NrZXQgLSB0aGUgZXhwbGljdGx5LW5hbWVkIGRldmljZSBzb2NrZXQgdG8gdXNlXG4gKlxuICogQHJldHVybiB7QXJyYXkuPFdlYnZpZXdQcm9jPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2Vidmlld3NGcm9tUHJvY3MgKGFkYiwgZGV2aWNlU29ja2V0ID0gbnVsbCkge1xuICBjb25zdCBzb2NrZXROYW1lcyA9IGF3YWl0IGdldFBvdGVudGlhbFdlYnZpZXdQcm9jcyhhZGIpO1xuICBjb25zdCB3ZWJ2aWV3cyA9IFtdO1xuICBmb3IgKGNvbnN0IHNvY2tldE5hbWUgb2Ygc29ja2V0TmFtZXMpIHtcbiAgICBpZiAoZGV2aWNlU29ja2V0ID09PSBDSFJPTUlVTV9ERVZUT09MU19TT0NLRVQgJiYgc29ja2V0TmFtZSA9PT0gYEAke2RldmljZVNvY2tldH1gKSB7XG4gICAgICB3ZWJ2aWV3cy5wdXNoKHtcbiAgICAgICAgcHJvYzogc29ja2V0TmFtZSxcbiAgICAgICAgd2VidmlldzogQ0hST01JVU1fV0lOLFxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBzb2NrZXROYW1lTWF0Y2ggPSBERVZUT09MU19TT0NLRVRfUEFUVEVSTi5leGVjKHNvY2tldE5hbWUpO1xuICAgIGlmICghc29ja2V0TmFtZU1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgY3Jvc3N3YWxrTWF0Y2ggPSBDUk9TU1dBTEtfU09DS0VUX1BBVFRFUk4uZXhlYyhzb2NrZXROYW1lKTtcbiAgICBpZiAoIXNvY2tldE5hbWVNYXRjaFsxXSAmJiAhY3Jvc3N3YWxrTWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChkZXZpY2VTb2NrZXQgJiYgc29ja2V0TmFtZSA9PT0gYEAke2RldmljZVNvY2tldH1gIHx8ICFkZXZpY2VTb2NrZXQpIHtcbiAgICAgIHdlYnZpZXdzLnB1c2goe1xuICAgICAgICBwcm9jOiBzb2NrZXROYW1lLFxuICAgICAgICB3ZWJ2aWV3OiBzb2NrZXROYW1lTWF0Y2hbMV1cbiAgICAgICAgICA/IGAke1dFQlZJRVdfQkFTRX0ke3NvY2tldE5hbWVNYXRjaFsxXX1gXG4gICAgICAgICAgOiBgJHtXRUJWSUVXX0JBU0V9JHtjcm9zc3dhbGtNYXRjaFsxXX1gLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB3ZWJ2aWV3cztcbn1cblxuLyoqXG4gKiBBbGxvY2F0ZXMgYSBsb2NhbCBwb3J0IGZvciBkZXZ0b29scyBjb21tdW5pY2F0aW9uXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb2NrZXROYW1lIFRoZSByZW1vdGUgVW5peCBzb2NrZXQgbmFtZVxuICogQHBhcmFtIHs/bnVtYmVyfSB3ZWJ2aWV3RGV2dG9vbHNQb3J0IFRoZSBsb2NhbCBwb3J0IG51bWJlciBvciBudWxsIHRvIGFwcGx5XG4gKiBhdXRvZGV0ZWN0aW9uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbG9jYWwgcG9ydCBudW1iZXIgaWYgdGhlIHJlbW90ZSBzb2NrZXQgaGFzIGJlZW4gZm9yd2FyZGVkXG4gKiBzdWNjZXNzZnVsbHkgb3IgYG51bGxgIG90aGVyd2lzZVxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBhbGxvY2F0aW5nIHRoZSBsb2NhbCBwb3J0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFsbG9jYXRlRGV2dG9vbHNQb3J0IChhZGIsIHNvY2tldE5hbWUsIHdlYnZpZXdEZXZ0b29sc1BvcnQgPSBudWxsKSB7XG4gIC8vIHNvY2tldCBuYW1lcyBjb21lIHdpdGggJ0AnLCBidXQgdGhpcyBzaG91bGQgbm90IGJlIGEgcGFydCBvZiB0aGUgYWJzdHJhY3RcbiAgLy8gcmVtb3RlIHBvcnQsIHNvIHJlbW92ZSBpdFxuICBjb25zdCByZW1vdGVQb3J0ID0gc29ja2V0TmFtZS5yZXBsYWNlKC9eQC8sICcnKTtcbiAgbGV0IFtzdGFydFBvcnQsIGVuZFBvcnRdID0gREVWVE9PTFNfUE9SVFNfUkFOR0U7XG4gIGlmICh3ZWJ2aWV3RGV2dG9vbHNQb3J0KSB7XG4gICAgZW5kUG9ydCA9IHdlYnZpZXdEZXZ0b29sc1BvcnQgKyAoZW5kUG9ydCAtIHN0YXJ0UG9ydCk7XG4gICAgc3RhcnRQb3J0ID0gd2Vidmlld0RldnRvb2xzUG9ydDtcbiAgfVxuICBsb2dnZXIuZGVidWcoYEZvcndhcmRpbmcgcmVtb3RlIHBvcnQgJHtyZW1vdGVQb3J0fSB0byBhIGxvY2FsIGAgK1xuICAgIGBwb3J0IGluIHJhbmdlICR7c3RhcnRQb3J0fS4uJHtlbmRQb3J0fWApO1xuICBpZiAoIXdlYnZpZXdEZXZ0b29sc1BvcnQpIHtcbiAgICBsb2dnZXIuZGVidWcoYFlvdSBjb3VsZCB1c2UgdGhlICd3ZWJ2aWV3RGV2dG9vbHNQb3J0JyBjYXBhYmlsaXR5IHRvIGN1c3RvbWl6ZSBgICtcbiAgICAgIGB0aGUgc3RhcnRpbmcgcG9ydCBudW1iZXJgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgREVWVE9PTFNfUE9SVF9BTExPQ0FUSU9OX0dVQVJEKGFzeW5jICgpID0+IHtcbiAgICBsZXQgbG9jYWxQb3J0O1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFBvcnQgPSBhd2FpdCBmaW5kQVBvcnROb3RJblVzZShzdGFydFBvcnQsIGVuZFBvcnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgYW55IGZyZWUgcG9ydCB0byBmb3J3YXJkIHRoZSBEZXZ0b29scyBzb2NrZXQgYCArXG4gICAgICAgIGBpbiByYW5nZSAke3N0YXJ0UG9ydH0uLiR7ZW5kUG9ydH0uIFlvdSBjb3VsZCBzZXQgdGhlIHN0YXJ0aW5nIHBvcnQgbnVtYmVyIGAgK1xuICAgICAgICBgbWFudWFsbHkgYnkgcHJvdmlkaW5nIHRoZSAnd2Vidmlld0RldnRvb2xzUG9ydCcgY2FwYWJpbGl0eWApO1xuICAgIH1cbiAgICBhd2FpdCBhZGIuYWRiRXhlYyhbJ2ZvcndhcmQnLCBgdGNwOiR7bG9jYWxQb3J0fWAsIGBsb2NhbGFic3RyYWN0OiR7cmVtb3RlUG9ydH1gXSk7XG4gICAgcmV0dXJuIGxvY2FsUG9ydDtcbiAgfSk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV2Vidmlld1Byb3BzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvYyBUaGUgbmFtZSBvZiB0aGUgRGV2dG9vbHMgVW5peCBzb2NrZXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3ZWJ2aWV3IFRoZSB3ZWIgdmlldyBhbGlhcy4gTG9va3MgbGlrZSBgV0VCVklFV19gXG4gKiBwcmVmaXggcGx1cyBQSUQgb3IgcGFja2FnZSBuYW1lXG4gKiBAcHJvcGVydHkgez9PYmplY3R9IGluZm8gV2VidmlldyBpbmZvcm1hdGlvbiBhcyBpdCBpcyByZXRyaWV2ZWQgYnlcbiAqIC9qc29uL3ZlcnNpb24gQ0RQIGVuZHBvaW50XG4gKiBAcHJvcGVydHkgez9BcnJheTxPYmplY3Q+fSBwYWdlcyBXZWJ2aWV3IHBhZ2VzIGxpc3QgYXMgaXQgaXMgcmV0cmlldmVkIGJ5XG4gKiAvanNvbi9saXN0IENEUCBlbmRwb2ludFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRGV0YWlsQ29sbGVjdGlvbk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IHdlYnZpZXdEZXZ0b29sc1BvcnQgVGhlIHN0YXJ0aW5nIHBvcnQgdG8gdXNlIGZvciB3ZWJ2aWV3IHBhZ2VcbiAqIHByZXNlbmNlIGNoZWNrIChpZiBub3QgdGhlIGRlZmF1bHQgb2YgOTIyMikuXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyBXaGV0aGVyIHRvIGNoZWNrIGZvciB3ZWJ2aWV3XG4gKiBwYWdlcyBwcmVzZW5jZVxuICogQHByb3BlcnR5IHtib29sZWFufSBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24gV2hldGhlciB0byBjb2xsZWN0XG4gKiB3ZWIgdmlldyBkZXRhaWxzIGFuZCBzZW5kIHRoZW0gdG8gQ2hyb21lZHJpdmVyIGNvbnN0cnVjdG9yLCBzbyBpdCBjb3VsZFxuICogc2VsZWN0IGEgYmluYXJ5IG1vcmUgcHJlY2lzZWx5IGJhc2VkIG9uIHRoaXMgaW5mby5cbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSB3cmFwcGVyIGZvciBDaHJvbWUgRGVidWdnZXIgUHJvdG9jb2wgZGF0YSBjb2xsZWN0aW9uLlxuICogTm8gZXJyb3IgaXMgdGhyb3duIGlmIENEUCByZXF1ZXN0IGZhaWxzIC0gaW4gc3VjaCBjYXNlIG5vIGRhdGEgd2lsbCBiZVxuICogcmVjb3JkZWQgaW50byB0aGUgY29ycmVzcG9uZGluZyBgd2Vidmlld3NNYXBwaW5nYCBpdGVtLlxuICpcbiAqIEBwYXJhbSB7QURCfSBhZGIgVGhlIEFEQiBpbnN0YW5jZVxuICogQHBhcmFtIHtBcnJheTxXZWJ2aWV3UHJvcHM+fSB3ZWJ2aWV3c01hcHBpbmcgVGhlIGN1cnJlbnQgd2Vidmlld3MgbWFwcGluZ1xuICogISEhIEVhY2ggaXRlbSBvZiB0aGlzIGFycmF5IGdldHMgbXV0YXRlZCAoYGluZm9gL2BwYWdlc2AgcHJvcGVydGllcyBnZXQgYWRkZWRcbiAqIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBgb3B0c2ApIGlmIHRoZSByZXF1ZXN0ZWQgZGV0YWlscyBoYXZlIGJlZW5cbiAqIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQgZm9yIGl0ICEhIVxuICogQHBhcmFtIHtEZXRhaWxDb2xsZWN0aW9uT3B0aW9uc30gb3B0cyBJZiBib3RoIGBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlc2AgYW5kXG4gKiBgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uYCBwcm9wZXJ0aWVzIGFyZSBmYWxzeSB0aGVuIG5vIGRldGFpbHMgY29sbGVjdGlvblxuICogaXMgcGVyZm9ybWVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RXZWJ2aWV3c0RldGFpbHMgKGFkYiwgd2Vidmlld3NNYXBwaW5nLCBvcHRzID0ge30pIHtcbiAgaWYgKF8uaXNFbXB0eSh3ZWJ2aWV3c01hcHBpbmcpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIHdlYnZpZXdEZXZ0b29sc1BvcnQgPSBudWxsLFxuICAgIGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzID0gbnVsbCxcbiAgICBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24gPSBudWxsLFxuICB9ID0gb3B0cztcblxuICBpZiAoIWVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzKSB7XG4gICAgbG9nZ2VyLmluZm8oYE5vdCBjaGVja2luZyB3aGV0aGVyIHdlYnZpZXdzIGhhdmUgYWN0aXZlIHBhZ2VzOyB1c2UgdGhlIGAgK1xuICAgICAgYCdlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcycgY2FwIHRvIHR1cm4gdGhpcyBjaGVjayBvbmApO1xuICB9XG5cbiAgaWYgKCFlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24pIHtcbiAgICBsb2dnZXIuaW5mbyhgTm90IGNvbGxlY3Rpbmcgd2ViIHZpZXcgZGV0YWlscy4gRGV0YWlscyBjb2xsZWN0aW9uIG1pZ2h0IGhlbHAgYCArXG4gICAgICBgdG8gbWFrZSBDaHJvbWVkcml2ZXIgaW5pdGlhbGl6YXRpb24gbW9yZSBwcmVjaXNlLiBVc2UgdGhlICdlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24nIGAgK1xuICAgICAgYGNhcCB0byB0dXJuIGl0IG9uYCk7XG4gIH1cblxuICBpZiAoIWVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzICYmICFlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBDb25uZWN0IHRvIGVhY2ggZGV2dG9vbHMgc29ja2V0IGFuZCByZXRyaWV2ZSB3ZWIgdmlldyBkZXRhaWxzXG4gIGxvZ2dlci5kZWJ1ZyhgQ29sbGVjdGluZyBDRFAgZGF0YSBvZiAke3V0aWwucGx1cmFsaXplKCd3ZWJ2aWV3Jywgd2Vidmlld3NNYXBwaW5nLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gIGNvbnN0IGRldGFpbENvbGxlY3RvcnMgPSBbXTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIHdlYnZpZXdzTWFwcGluZykge1xuICAgIGRldGFpbENvbGxlY3RvcnMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IGxvY2FsUG9ydDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsUG9ydCA9IGF3YWl0IGFsbG9jYXRlRGV2dG9vbHNQb3J0KGFkYiwgaXRlbS5wcm9jLCB3ZWJ2aWV3RGV2dG9vbHNQb3J0KTtcbiAgICAgICAgaWYgKGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbikge1xuICAgICAgICAgIGl0ZW0uaW5mbyA9IGF3YWl0IGNkcEluZm8obG9jYWxQb3J0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMpIHtcbiAgICAgICAgICBpdGVtLnBhZ2VzID0gYXdhaXQgY2RwTGlzdChsb2NhbFBvcnQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChsb2NhbFBvcnQpIHtcbiAgICAgICAgICBhd2FpdCBhZGIucmVtb3ZlUG9ydEZvcndhcmQobG9jYWxQb3J0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKCkpO1xuICB9XG4gIGF3YWl0IEIuYWxsKGRldGFpbENvbGxlY3RvcnMpO1xuICBsb2dnZXIuZGVidWcoYENEUCBkYXRhIGNvbGxlY3Rpb24gY29tcGxldGVkYCk7XG59XG5cbi8vIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sL1xuYXN5bmMgZnVuY3Rpb24gY2RwTGlzdCAobG9jYWxQb3J0KSB7XG4gIHJldHVybiAoYXdhaXQgYXhpb3Moe1xuICAgIHVybDogYGh0dHA6Ly8xMjcuMC4wLjE6JHtsb2NhbFBvcnR9L2pzb24vbGlzdGAsXG4gICAgdGltZW91dDogQ0RQX1JFUV9USU1FT1VULFxuICB9KSkuZGF0YTtcbn1cblxuLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvXG5hc3luYyBmdW5jdGlvbiBjZHBJbmZvIChsb2NhbFBvcnQpIHtcbiAgcmV0dXJuIChhd2FpdCBheGlvcyh7XG4gICAgdXJsOiBgaHR0cDovLzEyNy4wLjAuMToke2xvY2FsUG9ydH0vanNvbi92ZXJzaW9uYCxcbiAgICB0aW1lb3V0OiBDRFBfUkVRX1RJTUVPVVQsXG4gIH0pKS5kYXRhO1xufVxuXG4vKipcbiAqIFRha2UgYSB3ZWJ2aWV3IG5hbWUgbGlrZSBXRUJWSUVXXzQyOTYgYW5kIHVzZSAnYWRiIHNoZWxsIHBzJyB0byBmaWd1cmUgb3V0XG4gKiB3aGljaCBhcHAgcGFja2FnZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhhdCB3ZWJ2aWV3LiBPbmUgb2YgdGhlIHJlYXNvbnMgd2VcbiAqIHdhbnQgdG8gZG8gdGhpcyBpcyB0byBtYWtlIHN1cmUgd2UncmUgbGlzdGluZyB3ZWJ2aWV3cyBmb3IgdGhlIGFjdHVhbCBBVVQsXG4gKiBub3Qgc29tZSBvdGhlciBydW5uaW5nIGFwcFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhZGIgLSBhbiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSB3ZWJ2aWV3IC0gYSB3ZWJ2aWV3IHByb2Nlc3MgbmFtZVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgYXBwIHJ1bm5pbmcgdGhlIHdlYnZpZXdcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIHJldHJpZXZpbmcgdGhlIHByb2Nlc3MgbmFtZVxuICovXG5oZWxwZXJzLnByb2NGcm9tV2VidmlldyA9IGFzeW5jIGZ1bmN0aW9uIHByb2NGcm9tV2VidmlldyAoYWRiLCB3ZWJ2aWV3KSB7XG4gIGNvbnN0IHBpZE1hdGNoID0gV0VCVklFV19QSURfUEFUVEVSTi5leGVjKHdlYnZpZXcpO1xuICBpZiAoIXBpZE1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBQSUQgZm9yIHdlYnZpZXcgJyR7d2Vidmlld30nYCk7XG4gIH1cblxuICBjb25zdCBwaWQgPSBwaWRNYXRjaFsxXTtcbiAgbG9nZ2VyLmRlYnVnKGAke3dlYnZpZXd9IG1hcHBlZCB0byBwaWQgJHtwaWR9YCk7XG4gIGxvZ2dlci5kZWJ1ZyhgR2V0dGluZyBwcm9jZXNzIG5hbWUgZm9yIHdlYnZpZXcgJyR7d2Vidmlld30nYCk7XG4gIGNvbnN0IHBrZyA9IGF3YWl0IGFkYi5nZXROYW1lQnlQaWQocGlkKTtcbiAgbG9nZ2VyLmRlYnVnKGBHb3QgcHJvY2VzcyBuYW1lOiAnJHtwa2d9J2ApO1xuICByZXR1cm4gcGtnO1xufTtcblxuLyoqXG4gKiBQYXJzZSB3ZWJ2aWV3IG5hbWVzIGZvciBnZXRDb250ZXh0c1xuICpcbiAqIEBwYXJhbSB7QXJyYXk8V2Vidmlld3NNYXBwaW5nPn0gd2Vidmlld3NNYXBwaW5nIFNlZSBub3RlIG9uIGdldFdlYlZpZXdzTWFwcGluZ1xuICogQHBhcmFtIHtHZXRXZWJ2aWV3c09wdHN9IG9wdHMgU2VlIG5vdGUgb24gZ2V0V2ViVmlld3NNYXBwaW5nXG4gKiBAcmV0dXJuIHtBcnJheS48c3RyaW5nPn0gLSBhIGxpc3Qgb2Ygd2VidmlldyBuYW1lc1xuICovXG5oZWxwZXJzLnBhcnNlV2Vidmlld05hbWVzID0gZnVuY3Rpb24gcGFyc2VXZWJ2aWV3TmFtZXMgKHdlYnZpZXdzTWFwcGluZywge1xuICBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyA9IHRydWUsXG4gIGlzQ2hyb21lU2Vzc2lvbiA9IGZhbHNlXG59ID0ge30pIHtcbiAgaWYgKGlzQ2hyb21lU2Vzc2lvbikge1xuICAgIHJldHVybiBbQ0hST01JVU1fV0lOXTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IHt3ZWJ2aWV3LCBwYWdlcywgcHJvYywgd2Vidmlld05hbWV9IG9mIHdlYnZpZXdzTWFwcGluZykge1xuICAgIGlmIChlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyAmJiBwYWdlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgU2tpcHBpbmcgdGhlIHdlYnZpZXcgJyR7d2Vidmlld30nIGF0ICcke3Byb2N9JyBgICtcbiAgICAgICAgYHNpbmNlIGl0IGhhcyByZXBvcnRlZCBoYXZpbmcgemVybyBwYWdlc2ApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh3ZWJ2aWV3TmFtZSkge1xuICAgICAgcmVzdWx0LnB1c2god2Vidmlld05hbWUpO1xuICAgIH1cbiAgfVxuICBsb2dnZXIuZGVidWcoYEZvdW5kICR7dXRpbC5wbHVyYWxpemUoJ3dlYnZpZXcnLCByZXN1bHQubGVuZ3RoLCB0cnVlKX06ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR2V0V2Vidmlld3NPcHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYW5kcm9pZERldmljZVNvY2tldCBbbnVsbF0gLSBkZXZpY2Ugc29ja2V0IG5hbWVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgW3RydWVdIC0gd2hldGhlciB0byBjaGVjayBmb3Igd2Vidmlld1xuICogcGFnZSBwcmVzZW5jZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHdlYnZpZXdEZXZ0b29sc1BvcnQgWzkyMjJdIC0gcG9ydCB0byB1c2UgZm9yIHdlYnZpZXcgcGFnZVxuICogcHJlc2VuY2UgY2hlY2suXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiBbdHJ1ZV0gLSB3aGV0aGVyIHRvIGNvbGxlY3RcbiAqIHdlYiB2aWV3IGRldGFpbHMgYW5kIHNlbmQgdGhlbSB0byBDaHJvbWVkcml2ZXIgY29uc3RydWN0b3IsIHNvIGl0IGNvdWxkXG4gKiBzZWxlY3QgYSBiaW5hcnkgbW9yZSBwcmVjaXNlbHkgYmFzZWQgb24gdGhpcyBpbmZvLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV2Vidmlld3NNYXBwaW5nXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvYyBTZWUgbm90ZSBvbiBXZWJ2aWV3UHJvcHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3ZWJ2aWV3IFNlZSBub3RlIG9uIFdlYnZpZXdQcm9wc1xuICogQHByb3BlcnR5IHs/T2JqZWN0fSBpbmZvIFNlZSBub3RlIG9uIFdlYnZpZXdQcm9wc1xuICogQHByb3BlcnR5IHs/QXJyYXk8T2JqZWN0Pn0gcGFnZXMgU2VlIG5vdGUgb24gV2Vidmlld1Byb3BzXG4gKiBAcHJvcGVyeSB7P3N0cmluZ30gd2Vidmlld05hbWUgQW4gYWN0dWFsIHdlYnZpZXcgbmFtZSBmb3Igc3dpdGNoaW5nIGNvbnRleHRcbiAqL1xuXG4vKipcbiAqIEdldCBhIGxpc3Qgb2YgYXZhaWxhYmxlIHdlYnZpZXdzIG1hcHBpbmcgYnkgaW50cm9zcGVjdGluZyBwcm9jZXNzZXMgd2l0aCBhZGIsXG4gKiB3aGVyZSB3ZWJ2aWV3cyBhcmUgbGlzdGVkLiBJdCdzIHBvc3NpYmxlIHRvIHBhc3MgaW4gYSAnZGV2aWNlU29ja2V0JyBhcmcsIHdoaWNoXG4gKiBsaW1pdHMgdGhlIHdlYnZpZXcgcG9zc2liaWxpdGllcyB0byB0aGUgb25lIHJ1bm5pbmcgb24gdGhlIENocm9taXVtIGRldnRvb2xzXG4gKiBzb2NrZXQgd2UncmUgaW50ZXJlc3RlZCBpbiAoc2VlIG5vdGUgb24gd2Vidmlld3NGcm9tUHJvY3MpLiBXZSBjYW4gYWxzb1xuICogZGlyZWN0IHRoaXMgbWV0aG9kIHRvIHZlcmlmeSB3aGV0aGVyIGEgcGFydGljdWxhciB3ZWJ2aWV3IHByb2Nlc3MgYWN0dWFsbHlcbiAqIGhhcyBhbnkgcGFnZXMgKGlmIGEgcHJvY2VzcyBleGlzdHMgYnV0IG5vIHBhZ2VzIGFyZSBmb3VuZCwgQ2hyb21lZHJpdmVyIHdpbGxcbiAqIG5vdCBhY3R1YWxseSBiZSBhYmxlIHRvIGNvbm5lY3QgdG8gaXQsIHNvIHRoaXMgc2VydmVzIGFzIGEgZ3VhcmQgZm9yIHRoYXRcbiAqIHN0cmFuZ2UgZmFpbHVyZSBtb2RlKS4gVGhlIHN0cmF0ZWd5IGZvciBjaGVja2luZyB3aGV0aGVyIGFueSBwYWdlcyBhcmVcbiAqIGFjdGl2ZSBpbnZvbHZlcyBzZW5kaW5nIGEgcmVxdWVzdCB0byB0aGUgcmVtb3RlIGRlYnVnIHNlcnZlciBvbiB0aGUgZGV2aWNlLFxuICogaGVuY2UgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzcGVjaWZ5IHRoZSBwb3J0IG9uIHRoZSBob3N0IG1hY2hpbmUgd2hpY2hcbiAqIHNob3VsZCBiZSB1c2VkIGZvciB0aGlzIGNvbW11bmljYXRpb24uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFkYiAtIGFuIEFEQiBpbnN0YW5jZVxuICogQHBhcmFtIHtHZXRXZWJ2aWV3c09wdHN9IG9wdHNcbiAqXG4gKiBAcmV0dXJuIHtBcnJheTxXZWJ2aWV3c01hcHBpbmc+fSB3ZWJ2aWV3c01hcHBpbmdcbiAqL1xuaGVscGVycy5nZXRXZWJWaWV3c01hcHBpbmcgPSBhc3luYyBmdW5jdGlvbiBnZXRXZWJWaWV3c01hcHBpbmcgKGFkYiwge1xuICBhbmRyb2lkRGV2aWNlU29ja2V0ID0gbnVsbCxcbiAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgPSB0cnVlLFxuICB3ZWJ2aWV3RGV2dG9vbHNQb3J0ID0gbnVsbCxcbiAgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uID0gdHJ1ZVxufSA9IHt9KSB7XG4gIGxvZ2dlci5kZWJ1ZygnR2V0dGluZyBhIGxpc3Qgb2YgYXZhaWxhYmxlIHdlYnZpZXdzJyk7XG4gIGNvbnN0IHdlYnZpZXdzTWFwcGluZyA9IGF3YWl0IHdlYnZpZXdzRnJvbVByb2NzKGFkYiwgYW5kcm9pZERldmljZVNvY2tldCk7XG5cbiAgYXdhaXQgY29sbGVjdFdlYnZpZXdzRGV0YWlscyhhZGIsIHdlYnZpZXdzTWFwcGluZywge1xuICAgIGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzLFxuICAgIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbixcbiAgICB3ZWJ2aWV3RGV2dG9vbHNQb3J0LFxuICB9KTtcblxuICBmb3IgKGNvbnN0IHdlYnZpZXdNYXBwaW5nIG9mIHdlYnZpZXdzTWFwcGluZykge1xuICAgIGNvbnN0IHt3ZWJ2aWV3LCBpbmZvfSA9IHdlYnZpZXdNYXBwaW5nO1xuICAgIHdlYnZpZXdNYXBwaW5nLndlYnZpZXdOYW1lID0gbnVsbDtcblxuICAgIGxldCB3dk5hbWUgPSB3ZWJ2aWV3O1xuICAgIGxldCBwcm9jZXNzID0gdW5kZWZpbmVkO1xuICAgIGlmICghYW5kcm9pZERldmljZVNvY2tldCkge1xuICAgICAgY29uc3QgcGtnTWF0Y2ggPSBXRUJWSUVXX1BLR19QQVRURVJOLmV4ZWMod2Vidmlldyk7XG4gICAgICB0cnkge1xuICAgICAgICAvLyB3ZWIgdmlldyBuYW1lIGNvdWxkIGVpdGhlciBiZSBzdWZmaXhlZCB3aXRoIFBJRCBvciB0aGUgcGFja2FnZSBuYW1lXG4gICAgICAgIC8vIHBhY2thZ2UgbmFtZXMgY291bGQgbm90IHN0YXJ0IHdpdGggYSBkaWdpdFxuICAgICAgICBjb25zdCBwa2cgPSBwa2dNYXRjaCA/IHBrZ01hdGNoWzFdIDogYXdhaXQgaGVscGVycy5wcm9jRnJvbVdlYnZpZXcoYWRiLCB3ZWJ2aWV3KTtcbiAgICAgICAgd3ZOYW1lID0gYCR7V0VCVklFV19CQVNFfSR7cGtnfWA7XG4gICAgICAgIGNvbnN0IHBpZE1hdGNoID0gV0VCVklFV19QSURfUEFUVEVSTi5leGVjKHdlYnZpZXcpO1xuICAgICAgICBwcm9jZXNzID0ge1xuICAgICAgICAgIG5hbWU6IHBrZyxcbiAgICAgICAgICBpZDogcGlkTWF0Y2ggPyBwaWRNYXRjaFsxXSA6IG51bGwsXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGUubWVzc2FnZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdlYnZpZXdNYXBwaW5nLndlYnZpZXdOYW1lID0gd3ZOYW1lO1xuICAgIGNvbnN0IGtleSA9IHRvRGV0YWlsc0NhY2hlS2V5KGFkYiwgd3ZOYW1lKTtcbiAgICBpZiAoaW5mbyB8fCBwcm9jZXNzKSB7XG4gICAgICBXRUJWSUVXU19ERVRBSUxTX0NBQ0hFLnNldChrZXksIHsgaW5mbywgcHJvY2VzcyB9KTtcbiAgICB9IGVsc2UgaWYgKFdFQlZJRVdTX0RFVEFJTFNfQ0FDSEUuaGFzKGtleSkpIHtcbiAgICAgIFdFQlZJRVdTX0RFVEFJTFNfQ0FDSEUuZGVsZXRlKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB3ZWJ2aWV3c01hcHBpbmc7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFByb2Nlc3NJbmZvXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSBUaGUgcHJvY2VzcyBuYW1lXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGlkIFRoZSBwcm9jZXNzIGlkIChpZiBjb3VsZCBiZSByZXRyaWV2ZWQpXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJWaWV3RGV0YWlsc1xuICogQHByb3BlcnR5IHs/UHJvY2Vzc0luZm99IHByb2Nlc3MgLSBXZWIgdmlldyBwcm9jZXNzIGRldGFpbHNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBpbmZvIC0gV2ViIHZpZXcgZGV0YWlscyBhcyByZXR1cm5lZCBieSAvanNvbi92ZXJzaW9uIENEUCBlbmRwb2ludCwgZm9yIGV4YW1wbGU6XG4gKiB7XG4gKiAgXCJCcm93c2VyXCI6IFwiQ2hyb21lLzcyLjAuMzYwMS4wXCIsXG4gKiAgXCJQcm90b2NvbC1WZXJzaW9uXCI6IFwiMS4zXCIsXG4gKiAgXCJVc2VyLUFnZW50XCI6IFwiTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTNfNikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzcyLjAuMzYwMS4wIFNhZmFyaS81MzcuMzZcIixcbiAqICBcIlY4LVZlcnNpb25cIjogXCI3LjIuMjMzXCIsXG4gKiAgXCJXZWJLaXQtVmVyc2lvblwiOiBcIjUzNy4zNiAoQGNmZWRlOWRiMWQxNTRkZTA0NjhjYjA1Mzg0NzlmMzRjMDc1NWEwZjQpXCIsXG4gKiAgXCJ3ZWJTb2NrZXREZWJ1Z2dlclVybFwiOiBcIndzOi8vbG9jYWxob3N0OjkyMjIvZGV2dG9vbHMvYnJvd3Nlci9iMGI4YTRmYi1iYjE3LTQzNTktOTUzMy1hOGQ5ZjM5MDhiZDhcIlxuICogfVxuICovXG5cbi8qKlxuICogUmV0cmlldmVzIHdlYiB2aWV3IGRldGFpbHMgcHJldmlvdXNseSBjYWNoZWQgYnkgYGdldFdlYnZpZXdzYCBjYWxsXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSB3ZWJ2aWV3IFRoZSBuYW1lIG9mIHRoZSB3ZWIgdmlld1xuICogQHJldHVybnMgez9XZWJWaWV3RGV0YWlsc30gRWl0aGVyIGB1bmRlZmluZWRgIG9yIHRoZSByZWNlbnQgd2ViIHZpZXcgZGV0YWlsc1xuICovXG5oZWxwZXJzLmdldFdlYnZpZXdEZXRhaWxzID0gZnVuY3Rpb24gZ2V0V2Vidmlld0RldGFpbHMgKGFkYiwgd2Vidmlldykge1xuICBjb25zdCBrZXkgPSB0b0RldGFpbHNDYWNoZUtleShhZGIsIHdlYnZpZXcpO1xuICByZXR1cm4gV0VCVklFV1NfREVUQUlMU19DQUNIRS5nZXQoa2V5KTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIENocm9tZSBkcml2ZXIgY2FwYWJpbGl0aWVzIGJhc2VkIG9uIHRoZSBwcm92aWRlZFxuICogQXBwaXVtIGNhcGFiaWxpdGllc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIFVzZXItcHJvdmlkZWQgY2FwYWJpbGl0aWVzIG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IGRldmljZUlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBBbmRyb2lkIGRldmljZSB1bmRlciB0ZXN0XG4gKiBAcGFyYW0gez9XZWJWaWV3RGV0YWlsc30gd2ViVmlld0RldGFpbHNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBjYXBhYmlsaXRpZXMgb2JqZWN0LlxuICogU2VlIGh0dHBzOi8vY2hyb21lZHJpdmVyLmNocm9taXVtLm9yZy9jYXBhYmlsaXRpZXMgZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuaGVscGVycy5jcmVhdGVDaHJvbWVkcml2ZXJDYXBzID0gZnVuY3Rpb24gY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyAob3B0cywgZGV2aWNlSWQsIHdlYlZpZXdEZXRhaWxzKSB7XG4gIGNvbnN0IGNhcHMgPSB7IGNocm9tZU9wdGlvbnM6IHt9IH07XG5cbiAgY29uc3QgYW5kcm9pZFBhY2thZ2UgPSBvcHRzLmNocm9tZU9wdGlvbnM/LmFuZHJvaWRQYWNrYWdlXG4gICAgfHwgb3B0cy5hcHBQYWNrYWdlXG4gICAgfHwgd2ViVmlld0RldGFpbHM/LmluZm8/LlsnQW5kcm9pZC1QYWNrYWdlJ107XG4gIGlmIChhbmRyb2lkUGFja2FnZSkge1xuICAgIC8vIGNocm9tZWRyaXZlciByYWlzZXMgYW4gaW52YWxpZCBhcmd1bWVudCBlcnJvciB3aGVuIGFuZHJvaWRQYWNrYWdlIGlzICdudWxsJ1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSA9IGFuZHJvaWRQYWNrYWdlO1xuICB9XG4gIGlmIChfLmlzQm9vbGVhbihvcHRzLmNocm9tZVVzZVJ1bm5pbmdBcHApKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRVc2VSdW5uaW5nQXBwID0gb3B0cy5jaHJvbWVVc2VSdW5uaW5nQXBwO1xuICB9XG4gIGlmIChvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQYWNrYWdlID0gb3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZTtcbiAgfVxuICBpZiAob3B0cy5jaHJvbWVBbmRyb2lkQWN0aXZpdHkpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZEFjdGl2aXR5ID0gb3B0cy5jaHJvbWVBbmRyb2lkQWN0aXZpdHk7XG4gIH1cbiAgaWYgKG9wdHMuY2hyb21lQW5kcm9pZFByb2Nlc3MpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFByb2Nlc3MgPSBvcHRzLmNocm9tZUFuZHJvaWRQcm9jZXNzO1xuICB9IGVsc2UgaWYgKHdlYlZpZXdEZXRhaWxzPy5wcm9jZXNzPy5uYW1lICYmIHdlYlZpZXdEZXRhaWxzPy5wcm9jZXNzPy5pZCkge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUHJvY2VzcyA9IHdlYlZpZXdEZXRhaWxzLnByb2Nlc3MubmFtZTtcbiAgfVxuICBpZiAoXy50b0xvd2VyKG9wdHMuYnJvd3Nlck5hbWUpID09PSAnY2hyb21pdW0td2VidmlldycpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZEFjdGl2aXR5ID0gb3B0cy5hcHBBY3Rpdml0eTtcbiAgfVxuICBpZiAob3B0cy5wYWdlTG9hZFN0cmF0ZWd5KSB7XG4gICAgY2Fwcy5wYWdlTG9hZFN0cmF0ZWd5ID0gb3B0cy5wYWdlTG9hZFN0cmF0ZWd5O1xuICB9XG4gIGNvbnN0IGlzQ2hyb21lID0gXy50b0xvd2VyKGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSkgPT09ICdjaHJvbWUnO1xuICBpZiAoXy5pbmNsdWRlcyhLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUywgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQYWNrYWdlKSB8fCBpc0Nocm9tZSkge1xuICAgIC8vIGlmIHdlIGhhdmUgZXh0cmFjdGVkIHBhY2thZ2UgZnJvbSBjb250ZXh0IG5hbWUsIGl0IGNvdWxkIGNvbWUgaW4gYXMgYmFyZVxuICAgIC8vIFwiY2hyb21lXCIsIGFuZCBzbyB3ZSBzaG91bGQgbWFrZSBzdXJlIHRoZSBkZXRhaWxzIGFyZSBjb3JyZWN0LCBpbmNsdWRpbmdcbiAgICAvLyBub3QgdXNpbmcgYW4gYWN0aXZpdHkgb3IgcHJvY2VzcyBpZFxuICAgIGlmIChpc0Nocm9tZSkge1xuICAgICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQYWNrYWdlID0gQ0hST01FX1BBQ0tBR0VfTkFNRTtcbiAgICB9XG4gICAgZGVsZXRlIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkQWN0aXZpdHk7XG4gICAgZGVsZXRlIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUHJvY2VzcztcbiAgfVxuICAvLyBhZGQgZGV2aWNlIGlkIGZyb20gYWRiXG4gIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkRGV2aWNlU2VyaWFsID0gZGV2aWNlSWQ7XG5cbiAgaWYgKF8uaXNQbGFpbk9iamVjdChvcHRzLmxvZ2dpbmdQcmVmcykgfHwgXy5pc1BsYWluT2JqZWN0KG9wdHMuY2hyb21lTG9nZ2luZ1ByZWZzKSkge1xuICAgIGlmIChvcHRzLmxvZ2dpbmdQcmVmcykge1xuICAgICAgbG9nZ2VyLndhcm4oYFRoZSAnbG9nZ2luZ1ByZWZzJyBjYXAgaXMgZGVwcmVjYXRlZDsgdXNlIHRoZSAnY2hyb21lTG9nZ2luZ1ByZWZzJyBjYXAgaW5zdGVhZGApO1xuICAgIH1cbiAgICBjYXBzLmxvZ2dpbmdQcmVmcyA9IG9wdHMuY2hyb21lTG9nZ2luZ1ByZWZzIHx8IG9wdHMubG9nZ2luZ1ByZWZzO1xuICB9XG4gIGlmIChvcHRzLmVuYWJsZVBlcmZvcm1hbmNlTG9nZ2luZykge1xuICAgIGxvZ2dlci53YXJuKGBUaGUgJ2VuYWJsZVBlcmZvcm1hbmNlTG9nZ2luZycgY2FwIGlzIGRlcHJlY2F0ZWQ7IHNpbXBseSB1c2UgYCArXG4gICAgICBgdGhlICdjaHJvbWVMb2dnaW5nUHJlZnMnIGNhcCBpbnN0ZWFkLCB3aXRoIGEgJ3BlcmZvcm1hbmNlJyBrZXkgc2V0IHRvICdBTEwnYCk7XG4gICAgY29uc3QgbmV3UHJlZiA9IHtwZXJmb3JtYW5jZTogJ0FMTCd9O1xuICAgIC8vIGRvbid0IG92ZXJ3cml0ZSBvdGhlciBsb2dnaW5nIHByZWZzIHRoYXQgaGF2ZSBiZWVuIHNlbnQgaW4gaWYgdGhleSBleGlzdFxuICAgIGNhcHMubG9nZ2luZ1ByZWZzID0gY2Fwcy5sb2dnaW5nUHJlZnNcbiAgICAgID8gT2JqZWN0LmFzc2lnbih7fSwgY2Fwcy5sb2dnaW5nUHJlZnMsIG5ld1ByZWYpXG4gICAgICA6IG5ld1ByZWY7XG4gIH1cblxuICBpZiAob3B0cy5jaHJvbWVPcHRpb25zPy5Bcmd1bWVudHMpIHtcbiAgICAvLyBtZXJnZSBgQXJndW1lbnRzYCBhbmQgYGFyZ3NgXG4gICAgb3B0cy5jaHJvbWVPcHRpb25zLmFyZ3MgPSBbLi4uKG9wdHMuY2hyb21lT3B0aW9ucy5hcmdzIHx8IFtdKSwgLi4ub3B0cy5jaHJvbWVPcHRpb25zLkFyZ3VtZW50c107XG4gICAgZGVsZXRlIG9wdHMuY2hyb21lT3B0aW9ucy5Bcmd1bWVudHM7XG4gIH1cblxuICBsb2dnZXIuZGVidWcoJ1ByZWNhbGN1bGF0ZWQgQ2hyb21lZHJpdmVyIGNhcGFiaWxpdGllczogJyArXG4gICAgSlNPTi5zdHJpbmdpZnkoY2Fwcy5jaHJvbWVPcHRpb25zLCBudWxsLCAyKSk7XG5cbiAgY29uc3QgcHJvdGVjdGVkQ2FwTmFtZXMgPSBbXTtcbiAgZm9yIChjb25zdCBbb3B0LCB2YWxdIG9mIF8udG9QYWlycyhvcHRzLmNocm9tZU9wdGlvbnMpKSB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQoY2Fwcy5jaHJvbWVPcHRpb25zW29wdF0pKSB7XG4gICAgICBjYXBzLmNocm9tZU9wdGlvbnNbb3B0XSA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvdGVjdGVkQ2FwTmFtZXMucHVzaChvcHQpO1xuICAgIH1cbiAgfVxuICBpZiAoIV8uaXNFbXB0eShwcm90ZWN0ZWRDYXBOYW1lcykpIHtcbiAgICBsb2dnZXIuaW5mbygnVGhlIGZvbGxvd2luZyBDaHJvbWVkcml2ZXIgY2FwYWJpbGl0aWVzIGNhbm5vdCBiZSBvdmVycmlkZGVuICcgK1xuICAgICAgJ2J5IHRoZSBwcm92aWRlZCBjaHJvbWVPcHRpb25zOicpO1xuICAgIGZvciAoY29uc3Qgb3B0TmFtZSBvZiBwcm90ZWN0ZWRDYXBOYW1lcykge1xuICAgICAgbG9nZ2VyLmluZm8oYCAgJHtvcHROYW1lfSAoJHtKU09OLnN0cmluZ2lmeShvcHRzLmNocm9tZU9wdGlvbnNbb3B0TmFtZV0pfSlgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2Fwcztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGhlbHBlcnM7XG5leHBvcnQgeyBoZWxwZXJzLCBOQVRJVkVfV0lOLCBXRUJWSUVXX1dJTiwgV0VCVklFV19CQVNFLCBDSFJPTUlVTV9XSU4sIEtOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTIH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsTUFBTUEsVUFBVSxHQUFHLFlBQVk7QUFBQztBQUNoQyxNQUFNQyxXQUFXLEdBQUcsU0FBUztBQUFDO0FBQzlCLE1BQU1DLFlBQVksR0FBRyxVQUFVO0FBQUM7QUFDaEMsTUFBTUMsWUFBWSxHQUFJLEdBQUVGLFdBQVksR0FBRTtBQUFDO0FBQ3ZDLE1BQU1HLG1CQUFtQixHQUFH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