appium-xcuitest-driver 4.4.3 → 4.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.
@@ -19,13 +19,12 @@ var _bluebird = _interopRequireDefault(require("bluebird"));
19
19
 
20
20
  var _iosPerformanceLog = _interopRequireDefault(require("../device-log/ios-performance-log"));
21
21
 
22
- var _asyncbox = require("asyncbox");
23
-
24
22
  var _lodash = _interopRequireDefault(require("lodash"));
25
23
 
26
24
  const NATIVE_WIN = 'NATIVE_APP';
27
25
  const WEBVIEW_WIN = 'WEBVIEW';
28
26
  const WEBVIEW_BASE = `${WEBVIEW_WIN}_`;
27
+ const RECENT_WEBVIEW_DETECTION_TIMEOUT_MS = 90000;
29
28
  const commands = {},
30
29
  helpers = {},
31
30
  extensions = {};
@@ -59,97 +58,19 @@ extensions.getContextsAndViews = async function getContextsAndViews(useUrl = tru
59
58
  };
60
59
 
61
60
  extensions.useNewSafari = function useNewSafari() {
62
- return parseFloat(this.iosSdkVersion) >= 8.1 && parseFloat(this.opts.platformVersion) >= 8.1 && !this.isRealDevice() && this.opts.safari;
63
- };
64
-
65
- extensions.typeAndNavToUrl = async function typeAndNavToUrl() {
66
- let address = this.opts.address ? this.opts.address : '127.0.0.1';
67
- this.setCurrentUrl(this.caps.safariInitialUrl || `http://${address}:${this.opts.port}/welcome`);
68
- let tries = 0;
69
- const MAX_TRIES = 2;
70
-
71
- let navigate = async () => {
72
- let oldImpWait = this.implicitWaitMs;
73
- this.implicitWaitMs = 7000;
74
- let el = await (0, _asyncbox.retryInterval)(3, 1000, async () => await this.findElement('accessibility id', 'URL'));
75
- this.implicitWaitMs = oldImpWait;
76
-
77
- try {
78
- await this.nativeTap(el.ELEMENT);
79
- } catch (err) {
80
- if (_lodash.default.includes(err.message, 'could not be tapped')) {
81
- if (tries++ >= MAX_TRIES) throw err;
82
- let newPageButton = await this.findElement('xpath', "//XCUIElementTypeButton[contains(@name,'New page')]");
83
- await this.nativeTap(newPageButton.ELEMENT);
84
- return await navigate();
85
- } else {
86
- throw err;
87
- }
88
- }
89
-
90
- try {
91
- let el = await this.findElement('class name', 'XCUIElementTypeTextField');
92
- await this.setValueImmediate(this.getCurrentUrl(), el);
93
- } catch (err) {
94
- if (tries++ >= MAX_TRIES) throw err;
95
- return await navigate();
96
- }
97
-
98
- try {
99
- el = await this.findElement('accessibility id', 'Go');
100
- await this.nativeTap(el.ELEMENT);
101
- } catch (err) {
102
- if (_lodash.default.includes(err.message, 'could not be tapped')) {
103
- this.log.error('Unable to submit URL because \'Go\' button could not be tapped. ' + 'Please make sure your keyboard is toggled on.');
104
- }
105
-
106
- throw err;
107
- }
108
-
109
- await this.navToViewWithTitle(undefined, new RegExp(this.getCurrentUrl(), 'i'));
110
- await this.remote.pageUnload();
111
- };
112
-
113
- await navigate();
114
- };
115
-
116
- extensions.navToViewThroughFavorites = async function navToViewThroughFavorites() {
117
- this.log.debug('We are on iOS7+ simulator: clicking apple button to get into a webview');
118
- let oldImpWait = this.implicitWaitMs;
119
- this.implicitWaitMs = 7000;
120
- let el;
121
-
122
- try {
123
- el = await this.findElement('xpath', '//XCUIElementTypeScrollView[1]/XCUIElementTypeButton[1]');
124
- } catch (err) {
125
- let msg = 'Could not find button to click to get into webview. ' + 'Proceeding on the assumption we have a working one.';
126
- this.log.error(msg);
127
- this.implicitWaitMs = oldImpWait;
128
- return await this.navToViewWithTitle(/.*/i);
129
- }
130
-
131
- this.implicitWaitMs = oldImpWait;
132
-
133
- try {
134
- await this.nativeTap(el.ELEMENT);
135
- } catch (err) {
136
- let msg = 'Could not click button to get into webview. ' + 'Proceeding on the assumption we have a working one.';
137
- this.log.error(msg);
138
- }
139
-
140
- await this.navToViewWithTitle(/apple/i);
61
+ return !this.isRealDevice() && this.opts.safari;
141
62
  };
142
63
 
143
- extensions.navToViewWithTitle = async function navToViewWithTitle(titleRegex, urlRegExp) {
144
- this.log.debug('Navigating to most recently opened webview');
145
- let start = Date.now();
146
- let spinTime = 500;
64
+ extensions.activateRecentWebview = async function activateRecentWebview() {
65
+ this.log.debug('Activating a recent webview');
66
+ const timer = new _support.timing.Timer().start();
67
+ const spinTimeMs = 500;
147
68
 
148
- let spinHandles = async () => {
149
- let res;
69
+ const spinHandles = async () => {
70
+ let contextId;
150
71
 
151
72
  try {
152
- res = await this.getLatestWebviewContextForTitle(titleRegex || urlRegExp);
73
+ contextId = await this.getRecentWebviewContextId(/.*/, /.*/);
153
74
  } catch (err) {
154
75
  if (!err.message.includes('Could not connect to a valid app after')) {
155
76
  const error = new Error(`Could not navigate to webview! Err: ${err.message}`);
@@ -160,22 +81,21 @@ extensions.navToViewWithTitle = async function navToViewWithTitle(titleRegex, ur
160
81
  this.log.debug('Could not navigate to webview. Retrying if possible.');
161
82
  }
162
83
 
163
- if (res) {
164
- let latestWindow = res;
165
- this.log.debug(`Picking webview '${latestWindow}'`);
166
- await this.setContext(latestWindow);
84
+ if (contextId) {
85
+ this.log.debug(`Picking webview '${contextId}'`);
86
+ await this.setContext(contextId);
167
87
  await this.remote.cancelPageLoad();
168
88
  return;
169
89
  }
170
90
 
171
- if (Date.now() - start >= 90000) {
91
+ if (timer.getDuration().asMilliSeconds >= RECENT_WEBVIEW_DETECTION_TIMEOUT_MS) {
172
92
  throw new Error('Could not navigate to webview; there are none!');
173
93
  }
174
94
 
175
95
  this.log.warn('Could not find any webviews yet, refreshing/retrying');
176
96
 
177
97
  if (this.isRealDevice() || !this.opts.safari) {
178
- await _bluebird.default.delay(spinTime);
98
+ await _bluebird.default.delay(spinTimeMs);
179
99
  return await spinHandles();
180
100
  }
181
101
 
@@ -184,11 +104,11 @@ extensions.navToViewWithTitle = async function navToViewWithTitle(titleRegex, ur
184
104
  try {
185
105
  this.log.debug('Finding and tapping reload button');
186
106
  element = await this.findUIElementOrElements('accessibility id', 'ReloadButton', '', false);
187
- await this.nativeTap(element.ELEMENT);
107
+ await this.nativeClick(element);
188
108
  } catch (err) {
189
109
  this.log.warn(`Error finding and tapping reload button: ${err.message}`);
190
110
  this.log.warn('Retrying.');
191
- await _bluebird.default.delay(spinTime);
111
+ await _bluebird.default.delay(spinTimeMs);
192
112
  }
193
113
 
194
114
  return await spinHandles();
@@ -221,38 +141,30 @@ helpers.getCurrentUrl = function getCurrentUrl() {
221
141
  return this._currentUrl;
222
142
  };
223
143
 
224
- extensions.closeAlertBeforeTest = async function closeAlertBeforeTest() {
225
- return true;
226
- };
144
+ extensions.getRecentWebviewContextId = async function getRecentWebviewContextId(titleRegExp, urlRegExp) {
145
+ var _contexts$find;
227
146
 
228
- extensions.navToInitialWebview = async function navToInitialWebview() {
229
- if (this.useNewSafari()) {
230
- await this.typeAndNavToUrl();
231
- } else if (!this.isRealDevice() && this.opts.safari) {
232
- await this.navToViewThroughFavorites();
233
- } else {
234
- await this.navToViewWithTitle(/.*/);
147
+ if (!_lodash.default.isRegExp(titleRegExp) && !_lodash.default.isRegExp(urlRegExp)) {
148
+ throw new _baseDriver.errors.InvalidArgumentError('A regular expression for either web view title or url must be provided');
235
149
  }
236
- };
237
150
 
238
- extensions.getLatestWebviewContextForTitle = async function getLatestWebviewContextForTitle(regExp) {
239
151
  const currentUrl = this.getCurrentUrl();
240
152
 
241
- const contexts = _lodash.default.filter(await this.getContextsAndViews(), 'view');
153
+ const contexts = _lodash.default.filter(await this.getContextsAndViews(false), 'view');
242
154
 
243
155
  if (currentUrl) {
244
- for (const ctx of contexts) {
245
- if ((ctx.view.url || '') === this.getCurrentUrl()) {
246
- return ctx.id;
247
- }
248
- }
249
- }
156
+ const ctx = contexts.find(({
157
+ view
158
+ }) => (view.url || '') === currentUrl);
250
159
 
251
- for (const ctx of contexts) {
252
- if (ctx.view.title && regExp.test(ctx.view.title) || ctx.view.url && regExp.test(ctx.view.url)) {
160
+ if (ctx) {
253
161
  return ctx.id;
254
162
  }
255
163
  }
164
+
165
+ return (_contexts$find = contexts.find(({
166
+ view
167
+ }) => view.title && (titleRegExp === null || titleRegExp === void 0 ? void 0 : titleRegExp.test(view.title)) || view.url && (urlRegExp === null || urlRegExp === void 0 ? void 0 : urlRegExp.test(view.url)))) === null || _contexts$find === void 0 ? void 0 : _contexts$find.id;
256
168
  };
257
169
 
258
170
  extensions.isWebContext = function isWebContext() {
@@ -375,44 +287,28 @@ extensions.connectToRemoteDebugger = async function connectToRemoteDebugger() {
375
287
 
376
288
  extensions.listWebFrames = async function listWebFrames(useUrl = true) {
377
289
  useUrl = useUrl && !this.isRealDevice() && !!this.getCurrentUrl();
378
- this.log.debug(`Selecting by url: ${useUrl} ${useUrl ? `(expected url: '${this.getCurrentUrl()}')` : ''}`);
379
- const currentUrl = useUrl ? this.getCurrentUrl() : undefined;
380
- let pageArray = [];
290
+ this.log.debug(`Selecting by url: ${useUrl}${useUrl ? ` (expected url: '${this.getCurrentUrl()}')` : ''}`);
291
+
292
+ if (!this.remote) {
293
+ await this.connectToRemoteDebugger();
294
+
295
+ if (!this.remote.appIdKey) {
296
+ await this.remote.setConnectionKey();
297
+ }
298
+ }
381
299
 
382
300
  const getWebviewPages = async () => {
383
301
  try {
384
- return await this.remote.selectApp(currentUrl, this.opts.webviewConnectRetries, this.opts.ignoreAboutBlankUrl);
302
+ return await this.remote.selectApp(useUrl ? this.getCurrentUrl() : undefined, this.opts.webviewConnectRetries, this.opts.ignoreAboutBlankUrl);
385
303
  } catch (err) {
386
304
  this.log.debug(`No available web pages: ${err.message}`);
387
305
  return [];
388
306
  }
389
307
  };
390
308
 
391
- if (this.remote && this.remote.appIdKey) {
392
- pageArray = await getWebviewPages();
393
- } else {
394
- if (!this.remote) {
395
- await this.connectToRemoteDebugger();
396
- }
397
-
398
- await this.remote.setConnectionKey();
399
- pageArray = await getWebviewPages();
400
- const alertErrorMsg = 'Close alert failed. Retry.';
401
-
402
- try {
403
- await (0, _asyncbox.retryInterval)(6, 1000, async () => {
404
- if (!(await this.closeAlertBeforeTest())) {
405
- throw new Error(alertErrorMsg);
406
- }
407
- });
408
- } catch (err) {
409
- if (err.message !== alertErrorMsg) {
410
- this.log.errorAndThrow(err);
411
- }
412
- }
413
- }
309
+ const pageArray = await getWebviewPages();
414
310
 
415
- if (pageArray.length === 0) {
311
+ if (_lodash.default.isEmpty(pageArray)) {
416
312
  this.log.debug('No web frames found.');
417
313
  }
418
314
 
@@ -639,4 +535,4 @@ var _default = commands;
639
535
  exports.default = _default;require('source-map-support').install();
640
536
 
641
537
 
642
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2NvbW1hbmRzL2NvbnRleHQuanMiLCJuYW1lcyI6WyJOQVRJVkVfV0lOIiwiV0VCVklFV19XSU4iLCJXRUJWSUVXX0JBU0UiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZ2V0Q3VycmVudENvbnRleHQiLCJjdXJDb250ZXh0IiwiZ2V0Q29udGV4dHNBbmRWaWV3cyIsInVzZVVybCIsImxvZyIsImRlYnVnIiwid2Vidmlld3MiLCJsaXN0V2ViRnJhbWVzIiwiY3R4cyIsImlkIiwidmlldyIsImNvbnRleHRzIiwicHVzaCIsInRvU3RyaW5nIiwidXNlTmV3U2FmYXJpIiwicGFyc2VGbG9hdCIsImlvc1Nka1ZlcnNpb24iLCJvcHRzIiwicGxhdGZvcm1WZXJzaW9uIiwiaXNSZWFsRGV2aWNlIiwic2FmYXJpIiwidHlwZUFuZE5hdlRvVXJsIiwiYWRkcmVzcyIsInNldEN1cnJlbnRVcmwiLCJjYXBzIiwic2FmYXJpSW5pdGlhbFVybCIsInBvcnQiLCJ0cmllcyIsIk1BWF9UUklFUyIsIm5hdmlnYXRlIiwib2xkSW1wV2FpdCIsImltcGxpY2l0V2FpdE1zIiwiZWwiLCJyZXRyeUludGVydmFsIiwiZmluZEVsZW1lbnQiLCJuYXRpdmVUYXAiLCJFTEVNRU5UIiwiZXJyIiwiXyIsImluY2x1ZGVzIiwibWVzc2FnZSIsIm5ld1BhZ2VCdXR0b24iLCJzZXRWYWx1ZUltbWVkaWF0ZSIsImdldEN1cnJlbnRVcmwiLCJlcnJvciIsIm5hdlRvVmlld1dpdGhUaXRsZSIsInVuZGVmaW5lZCIsIlJlZ0V4cCIsInJlbW90ZSIsInBhZ2VVbmxvYWQiLCJuYXZUb1ZpZXdUaHJvdWdoRmF2b3JpdGVzIiwibXNnIiwidGl0bGVSZWdleCIsInVybFJlZ0V4cCIsInN0YXJ0IiwiRGF0ZSIsIm5vdyIsInNwaW5UaW1lIiwic3BpbkhhbmRsZXMiLCJyZXMiLCJnZXRMYXRlc3RXZWJ2aWV3Q29udGV4dEZvclRpdGxlIiwiRXJyb3IiLCJzdGFjayIsImxhdGVzdFdpbmRvdyIsInNldENvbnRleHQiLCJjYW5jZWxQYWdlTG9hZCIsIndhcm4iLCJCIiwiZGVsYXkiLCJlbGVtZW50IiwiZmluZFVJRWxlbWVudE9yRWxlbWVudHMiLCJzdG9wUmVtb3RlIiwiY2xvc2VXaW5kb3dCZWZvcmVEaXNjb25uZWN0aW5nIiwiZXJyb3JBbmRUaHJvdyIsImNsb3NlV2luZG93IiwiZGlzY29ubmVjdCIsImN1cldlYkZyYW1lcyIsImN1cldlYkNvb3JkcyIsInVybCIsIl9jdXJyZW50VXJsIiwiY2xvc2VBbGVydEJlZm9yZVRlc3QiLCJuYXZUb0luaXRpYWxXZWJ2aWV3IiwicmVnRXhwIiwiY3VycmVudFVybCIsImZpbHRlciIsImN0eCIsInRpdGxlIiwidGVzdCIsImlzV2ViQ29udGV4dCIsImlzV2VidmlldyIsImdldE5ld1JlbW90ZURlYnVnZ2VyIiwic29ja2V0UGF0aCIsImRldmljZSIsImdldFdlYkluc3BlY3RvclNvY2tldCIsImNyZWF0ZVJlbW90ZURlYnVnZ2VyIiwiYnVuZGxlSWQiLCJhZGRpdGlvbmFsQnVuZGxlSWRzIiwiYWRkaXRpb25hbFdlYnZpZXdCdW5kbGVJZHMiLCJpc1NhZmFyaSIsImluY2x1ZGVTYWZhcmkiLCJpbmNsdWRlU2FmYXJpSW5XZWJ2aWV3cyIsInBhZ2VMb2FkTXMiLCJyZW1vdGVEZWJ1Z1Byb3h5IiwiZ2FyYmFnZUNvbGxlY3RPbkV4ZWN1dGUiLCJ1dGlsIiwiaGFzVmFsdWUiLCJzYWZhcmlHYXJiYWdlQ29sbGVjdCIsInVkaWQiLCJsb2dBbGxDb21tdW5pY2F0aW9uIiwic2FmYXJpTG9nQWxsQ29tbXVuaWNhdGlvbiIsImxvZ0FsbENvbW11bmljYXRpb25IZXhEdW1wIiwic2FmYXJpTG9nQWxsQ29tbXVuaWNhdGlvbkhleER1bXAiLCJzb2NrZXRDaHVua1NpemUiLCJzYWZhcmlTb2NrZXRDaHVua1NpemUiLCJ3ZWJJbnNwZWN0b3JNYXhGcmFtZUxlbmd0aCIsInNhZmFyaVdlYkluc3BlY3Rvck1heEZyYW1lTGVuZ3RoIiwibmFtZSIsImNhbGxiYWNrIiwic2tpcFJlYWR5Q2hlY2siLCJhbHJlYWR5SW5Db250ZXh0IiwiZGVzaXJlZCIsImN1cnJlbnQiLCJpc05hdGl2ZUNvbnRleHQiLCJjb250ZXh0IiwicmVwbGFjZSIsImlzVW5kZWZpbmVkIiwiZ2V0Q29udGV4dHMiLCJjb250ZXh0SWQiLCJlcnJvcnMiLCJOb1N1Y2hDb250ZXh0RXJyb3IiLCJvbGRDb250ZXh0IiwiY3VyV2luZG93SGFuZGxlIiwiYXBwSWRLZXkiLCJwYWdlSWRLZXkiLCJtYXAiLCJzcGxpdCIsInBhcnNlSW50Iiwic2VsZWN0aW5nTmV3UGFnZSIsInNlbGVjdFBhZ2UiLCJlbmFibGVQZXJmb3JtYW5jZUxvZ2dpbmciLCJsb2dzIiwicGVyZm9ybWFuY2UiLCJJT1NQZXJmb3JtYW5jZUxvZyIsInN0YXJ0Q2FwdHVyZSIsInNhZmFyaUNvbnNvbGUiLCJzdGFydENvbnNvbGUiLCJhZGRMb2dMaW5lIiwiYmluZCIsInNhZmFyaU5ldHdvcmsiLCJzdGFydE5ldHdvcmsiLCJjb25uZWN0VG9SZW1vdGVEZWJ1Z2dlciIsIm9uIiwiUmVtb3RlRGVidWdnZXIiLCJFVkVOVF9QQUdFX0NIQU5HRSIsIm9uUGFnZUNoYW5nZSIsIkVWRU5UX0ZSQU1FU19ERVRBQ0hFRCIsImlzRW1wdHkiLCJwbHVyYWxpemUiLCJsZW5ndGgiLCJqb2luIiwiY29ubmVjdCIsIndlYnZpZXdDb25uZWN0VGltZW91dCIsInBhZ2VBcnJheSIsImdldFdlYnZpZXdQYWdlcyIsInNlbGVjdEFwcCIsIndlYnZpZXdDb25uZWN0UmV0cmllcyIsImlnbm9yZUFib3V0QmxhbmtVcmwiLCJzZXRDb25uZWN0aW9uS2V5IiwiYWxlcnRFcnJvck1zZyIsIm1hcEZuIiwiZnVsbENvbnRleHRMaXN0IiwibW9iaWxlR2V0Q29udGV4dHMiLCJ3YWl0Rm9yV2Vidmlld01zIiwiaXNOdW1iZXIiLCJpc05hTiIsImN1ck9wdCIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJnZXREdXJhdGlvbiIsImFzTWlsbGlTZWNvbmRzIiwidG9GaXhlZCIsInNldFdpbmRvdyIsIm5vb3AiLCJpc0Vycm9yVHlwZSIsIk5vU3VjaFdpbmRvd0Vycm9yIiwiZ2V0V2luZG93SGFuZGxlIiwiTm90SW1wbGVtZW50ZWRFcnJvciIsImdldFdpbmRvd0hhbmRsZXMiLCJwYWdlQ2hhbmdlTm90aWZpY2F0aW9uIiwiSlNPTiIsInN0cmluZ2lmeSIsImlzQ29ubmVjdGVkIiwibmV3SWRzIiwibmV3UGFnZXMiLCJrZXlJZCIsImlzVXJsSWdub3JlZCIsInNhZmFyaUlnbm9yZVdlYkhvc3RuYW1lcyIsImlnbm9yZWRIb3N0cyIsImIiLCJ0cmltIiwiaWdub3JlZEhvc3QiLCJob3N0bmFtZSIsIlVSTCIsImlnbiIsInBhZ2UiLCJpc0tleSIsImluZm8iLCJjdXJBcHBJZEtleSIsImN1clBhZ2VJZEtleSIsIm5ld1BhZ2UiLCJsYXN0IiwibmVlZHNQYWdlTG9hZCIsImNvbnRleHRBcnJheSIsImlzRXF1YWwiLCJmaW5kIiwicGFnZUxvYWQiLCJjdXJyZW50UGFnZUlkIiwicCIsImNhdGNoIiwid2luZG93SGFuZGxlQ2FjaGUiLCJPYmplY3QiLCJhc3NpZ24iXSwic291cmNlUm9vdCI6Ii4uLy4uLy4uIiwic291cmNlcyI6WyJsaWIvY29tbWFuZHMvY29udGV4dC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVSZW1vdGVEZWJ1Z2dlciwgUmVtb3RlRGVidWdnZXIgfSBmcm9tICdhcHBpdW0tcmVtb3RlLWRlYnVnZ2VyJztcbmltcG9ydCB7IGVycm9ycywgaXNFcnJvclR5cGUgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCB7IHV0aWwsIHRpbWluZyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgSU9TUGVyZm9ybWFuY2VMb2cgZnJvbSAnLi4vZGV2aWNlLWxvZy9pb3MtcGVyZm9ybWFuY2UtbG9nJztcbmltcG9ydCB7IHJldHJ5SW50ZXJ2YWwgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5jb25zdCBOQVRJVkVfV0lOID0gJ05BVElWRV9BUFAnO1xuY29uc3QgV0VCVklFV19XSU4gPSAnV0VCVklFVyc7XG5jb25zdCBXRUJWSUVXX0JBU0UgPSBgJHtXRUJWSUVXX1dJTn1fYDtcblxuY29uc3QgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cblxuY29tbWFuZHMuZ2V0Q3VycmVudENvbnRleHQgPSBhc3luYyBmdW5jdGlvbiBnZXRDdXJyZW50Q29udGV4dCAoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1hd2FpdFxuICBpZiAodGhpcy5jdXJDb250ZXh0ICYmIHRoaXMuY3VyQ29udGV4dCAhPT0gTkFUSVZFX1dJTikge1xuICAgIHJldHVybiBgJHtXRUJWSUVXX0JBU0V9JHt0aGlzLmN1ckNvbnRleHR9YDtcbiAgfVxuICByZXR1cm4gTkFUSVZFX1dJTjtcbn07XG5cbmV4dGVuc2lvbnMuZ2V0Q29udGV4dHNBbmRWaWV3cyA9IGFzeW5jIGZ1bmN0aW9uIGdldENvbnRleHRzQW5kVmlld3MgKHVzZVVybCA9IHRydWUpIHtcbiAgdGhpcy5sb2cuZGVidWcoJ1JldHJpZXZpbmcgY29udGV4dHMgYW5kIHZpZXdzJyk7XG4gIGxldCB3ZWJ2aWV3cyA9IGF3YWl0IHRoaXMubGlzdFdlYkZyYW1lcyh1c2VVcmwpO1xuXG4gIGxldCBjdHhzID0gW3tpZDogTkFUSVZFX1dJTiwgdmlldzoge319XTtcbiAgdGhpcy5jb250ZXh0cyA9IFtOQVRJVkVfV0lOXTtcbiAgZm9yIChsZXQgdmlldyBvZiB3ZWJ2aWV3cykge1xuICAgIGN0eHMucHVzaCh7aWQ6IGAke1dFQlZJRVdfQkFTRX0ke3ZpZXcuaWR9YCwgdmlld30pO1xuICAgIHRoaXMuY29udGV4dHMucHVzaCh2aWV3LmlkLnRvU3RyaW5nKCkpO1xuICB9XG4gIHJldHVybiBjdHhzO1xufTtcblxuLy8gUmlnaHQgbm93IHdlIGRvbid0IG5lY2Vzc2FyaWx5IHdhaXQgZm9yIHdlYnZpZXdcbi8vIGFuZCBmcmFtZSB0byBsb2FkLCB3aGljaCBsZWFkcyB0byByYWNlIGNvbmRpdGlvbnMgYW5kIGZsYWtpbmVzcyxcbi8vIGxldCdzIHNlZSBpZiB3ZSBjYW4gdHJhbnNpdGlvbiB0byBzb21ldGhpbmcgYmV0dGVyXG5leHRlbnNpb25zLnVzZU5ld1NhZmFyaSA9IGZ1bmN0aW9uIHVzZU5ld1NhZmFyaSAoKSB7XG4gIHJldHVybiBwYXJzZUZsb2F0KHRoaXMuaW9zU2RrVmVyc2lvbikgPj0gOC4xICYmXG4gICAgcGFyc2VGbG9hdCh0aGlzLm9wdHMucGxhdGZvcm1WZXJzaW9uKSA+PSA4LjEgJiZcbiAgICAhdGhpcy5pc1JlYWxEZXZpY2UoKSAmJlxuICAgIHRoaXMub3B0cy5zYWZhcmk7XG59O1xuXG5leHRlbnNpb25zLnR5cGVBbmROYXZUb1VybCA9IGFzeW5jIGZ1bmN0aW9uIHR5cGVBbmROYXZUb1VybCAoKSB7XG4gIGxldCBhZGRyZXNzID0gdGhpcy5vcHRzLmFkZHJlc3MgPyB0aGlzLm9wdHMuYWRkcmVzcyA6ICcxMjcuMC4wLjEnO1xuICB0aGlzLnNldEN1cnJlbnRVcmwodGhpcy5jYXBzLnNhZmFyaUluaXRpYWxVcmwgfHwgYGh0dHA6Ly8ke2FkZHJlc3N9OiR7dGhpcy5vcHRzLnBvcnR9L3dlbGNvbWVgKTtcblxuICBsZXQgdHJpZXMgPSAwO1xuICBjb25zdCBNQVhfVFJJRVMgPSAyO1xuICBsZXQgbmF2aWdhdGUgPSBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG9sZEltcFdhaXQgPSB0aGlzLmltcGxpY2l0V2FpdE1zO1xuICAgIHRoaXMuaW1wbGljaXRXYWl0TXMgPSA3MDAwO1xuXG4gICAgLy8gZmluZCB0aGUgdXJsIGJhciwgYW5kIHRhcCBvbiBpdC4gcmV0cnkgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHRyeVxuICAgIC8vIHRvbyBzb29uIHdoaWxlIHRoZSB2aWV3IGlzIHN0aWxsIGxvYWRpbmdcbiAgICBsZXQgZWwgPSBhd2FpdCByZXRyeUludGVydmFsKDMsIDEwMDAsIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuZmluZEVsZW1lbnQoJ2FjY2Vzc2liaWxpdHkgaWQnLCAnVVJMJykpO1xuICAgIHRoaXMuaW1wbGljaXRXYWl0TXMgPSBvbGRJbXBXYWl0O1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubmF0aXZlVGFwKGVsLkVMRU1FTlQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKF8uaW5jbHVkZXMoZXJyLm1lc3NhZ2UsICdjb3VsZCBub3QgYmUgdGFwcGVkJykpIHtcbiAgICAgICAgaWYgKHRyaWVzKysgPj0gTUFYX1RSSUVTKSB0aHJvdyBlcnI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcblxuICAgICAgICAvLyBnZW5lcmFsbHkgdGhpcyBtZWFucyB0aGF0IFNhZmFyaSBpcyBpbiBwYWdlIHZpZXdpbmcgbW9kZVxuICAgICAgICAvLyBzbyB0cnkgdG8gb3BlbiBhIG5ldyBwYWdlIGFuZCB0aGVuIHJlZG8gdGhlIG5hdmlnYXRpb25cbiAgICAgICAgbGV0IG5ld1BhZ2VCdXR0b24gPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50KCd4cGF0aCcsIFwiLy9YQ1VJRWxlbWVudFR5cGVCdXR0b25bY29udGFpbnMoQG5hbWUsJ05ldyBwYWdlJyldXCIpO1xuICAgICAgICBhd2FpdCB0aGlzLm5hdGl2ZVRhcChuZXdQYWdlQnV0dG9uLkVMRU1FTlQpO1xuICAgICAgICByZXR1cm4gYXdhaXQgbmF2aWdhdGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBnZXQgdGhlIGxhc3QgYWRkcmVzcyBlbGVtZW50IGFuZCBzZXQgdGhlIHVybFxuICAgIHRyeSB7XG4gICAgICBsZXQgZWwgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50KCdjbGFzcyBuYW1lJywgJ1hDVUlFbGVtZW50VHlwZVRleHRGaWVsZCcpO1xuICAgICAgYXdhaXQgdGhpcy5zZXRWYWx1ZUltbWVkaWF0ZSh0aGlzLmdldEN1cnJlbnRVcmwoKSwgZWwpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gdGhpcyBpcyBmbGFrZXkgb24gY2VydGFpbiBzeXN0ZW1zIHNvIHdlIHJldHJ5IHVudGlsIHdlIGdldCBzb21ldGhpbmdcbiAgICAgIC8vIGlvcyBzaW1zOiBzYWZhcmkgb3BlbnMgYnV0IHRoZSB0ZXh0IGZpZWxkIGNhbid0IGJlIGZvdW5kXG4gICAgICBpZiAodHJpZXMrKyA+PSBNQVhfVFJJRVMpIHRocm93IGVycjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjdXJseVxuICAgICAgcmV0dXJuIGF3YWl0IG5hdmlnYXRlKCk7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBpdCBoYXBwZW5cbiAgICB0cnkge1xuICAgICAgZWwgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50KCdhY2Nlc3NpYmlsaXR5IGlkJywgJ0dvJyk7XG4gICAgICBhd2FpdCB0aGlzLm5hdGl2ZVRhcChlbC5FTEVNRU5UKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChfLmluY2x1ZGVzKGVyci5tZXNzYWdlLCAnY291bGQgbm90IGJlIHRhcHBlZCcpKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKCdVbmFibGUgdG8gc3VibWl0IFVSTCBiZWNhdXNlIFxcJ0dvXFwnIGJ1dHRvbiBjb3VsZCBub3QgYmUgdGFwcGVkLiAnICtcbiAgICAgICAgICAnUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIGtleWJvYXJkIGlzIHRvZ2dsZWQgb24uJyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMubmF2VG9WaWV3V2l0aFRpdGxlKHVuZGVmaW5lZCwgbmV3IFJlZ0V4cCh0aGlzLmdldEN1cnJlbnRVcmwoKSwgJ2knKSk7XG5cbiAgICAvLyB3YWl0IGZvciBwYWdlIHRvIGZpbmlzaCBsb2FkaW5nLlxuICAgIGF3YWl0IHRoaXMucmVtb3RlLnBhZ2VVbmxvYWQoKTtcbiAgfTtcbiAgYXdhaXQgbmF2aWdhdGUoKTtcbn07XG5cbmV4dGVuc2lvbnMubmF2VG9WaWV3VGhyb3VnaEZhdm9yaXRlcyA9IGFzeW5jIGZ1bmN0aW9uIG5hdlRvVmlld1Rocm91Z2hGYXZvcml0ZXMgKCkge1xuICB0aGlzLmxvZy5kZWJ1ZygnV2UgYXJlIG9uIGlPUzcrIHNpbXVsYXRvcjogY2xpY2tpbmcgYXBwbGUgYnV0dG9uIHRvIGdldCBpbnRvIGEgd2VidmlldycpO1xuICBsZXQgb2xkSW1wV2FpdCA9IHRoaXMuaW1wbGljaXRXYWl0TXM7XG4gIHRoaXMuaW1wbGljaXRXYWl0TXMgPSA3MDAwOyAvLyB3YWl0IDdzIGZvciBhcHBsZSBidXR0b24gdG8gZXhpc3RcblxuICBsZXQgZWw7XG4gIHRyeSB7XG4gICAgZWwgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50KCd4cGF0aCcsICcvL1hDVUlFbGVtZW50VHlwZVNjcm9sbFZpZXdbMV0vWENVSUVsZW1lbnRUeXBlQnV0dG9uWzFdJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxldCBtc2cgPSAnQ291bGQgbm90IGZpbmQgYnV0dG9uIHRvIGNsaWNrIHRvIGdldCBpbnRvIHdlYnZpZXcuICcgK1xuICAgICAgICAgICAgICAnUHJvY2VlZGluZyBvbiB0aGUgYXNzdW1wdGlvbiB3ZSBoYXZlIGEgd29ya2luZyBvbmUuJztcbiAgICB0aGlzLmxvZy5lcnJvcihtc2cpO1xuICAgIHRoaXMuaW1wbGljaXRXYWl0TXMgPSBvbGRJbXBXYWl0O1xuICAgIHJldHVybiBhd2FpdCB0aGlzLm5hdlRvVmlld1dpdGhUaXRsZSgvLiovaSk7XG4gIH1cbiAgdGhpcy5pbXBsaWNpdFdhaXRNcyA9IG9sZEltcFdhaXQ7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5uYXRpdmVUYXAoZWwuRUxFTUVOVCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxldCBtc2cgPSAnQ291bGQgbm90IGNsaWNrIGJ1dHRvbiB0byBnZXQgaW50byB3ZWJ2aWV3LiAnICtcbiAgICAgICAgICAgICAgJ1Byb2NlZWRpbmcgb24gdGhlIGFzc3VtcHRpb24gd2UgaGF2ZSBhIHdvcmtpbmcgb25lLic7XG4gICAgdGhpcy5sb2cuZXJyb3IobXNnKTtcbiAgfVxuICBhd2FpdCB0aGlzLm5hdlRvVmlld1dpdGhUaXRsZSgvYXBwbGUvaSk7XG59O1xuXG5leHRlbnNpb25zLm5hdlRvVmlld1dpdGhUaXRsZSA9IGFzeW5jIGZ1bmN0aW9uIG5hdlRvVmlld1dpdGhUaXRsZSAodGl0bGVSZWdleCwgdXJsUmVnRXhwKSB7XG4gIHRoaXMubG9nLmRlYnVnKCdOYXZpZ2F0aW5nIHRvIG1vc3QgcmVjZW50bHkgb3BlbmVkIHdlYnZpZXcnKTtcbiAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgbGV0IHNwaW5UaW1lID0gNTAwO1xuICBsZXQgc3BpbkhhbmRsZXMgPSBhc3luYyAoKSA9PiB7XG4gICAgbGV0IHJlcztcbiAgICB0cnkge1xuICAgICAgcmVzID0gYXdhaXQgdGhpcy5nZXRMYXRlc3RXZWJ2aWV3Q29udGV4dEZvclRpdGxlKHRpdGxlUmVnZXggfHwgdXJsUmVnRXhwKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICghZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ0NvdWxkIG5vdCBjb25uZWN0IHRvIGEgdmFsaWQgYXBwIGFmdGVyJykpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYENvdWxkIG5vdCBuYXZpZ2F0ZSB0byB3ZWJ2aWV3ISBFcnI6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIGVycm9yLnN0YWNrICs9IGBcXG5DYXVzZWQgYnk6ICR7ZXJyLnN0YWNrfWA7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoJ0NvdWxkIG5vdCBuYXZpZ2F0ZSB0byB3ZWJ2aWV3LiBSZXRyeWluZyBpZiBwb3NzaWJsZS4nKTtcbiAgICB9XG4gICAgaWYgKHJlcykge1xuICAgICAgbGV0IGxhdGVzdFdpbmRvdyA9IHJlcztcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBQaWNraW5nIHdlYnZpZXcgJyR7bGF0ZXN0V2luZG93fSdgKTtcbiAgICAgIGF3YWl0IHRoaXMuc2V0Q29udGV4dChsYXRlc3RXaW5kb3cpO1xuICAgICAgYXdhaXQgdGhpcy5yZW1vdGUuY2FuY2VsUGFnZUxvYWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBubyB3ZWJ2aWV3IHdhcyBmb3VuZFxuICAgIGlmICgoRGF0ZS5ub3coKSAtIHN0YXJ0KSA+PSA5MDAwMCkge1xuICAgICAgLy8gdG9vIHNsb3csIGdldCBvdXRcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IG5hdmlnYXRlIHRvIHdlYnZpZXc7IHRoZXJlIGFyZSBub25lIScpO1xuICAgIH1cblxuICAgIHRoaXMubG9nLndhcm4oJ0NvdWxkIG5vdCBmaW5kIGFueSB3ZWJ2aWV3cyB5ZXQsIHJlZnJlc2hpbmcvcmV0cnlpbmcnKTtcbiAgICBpZiAodGhpcy5pc1JlYWxEZXZpY2UoKSB8fCAhdGhpcy5vcHRzLnNhZmFyaSkge1xuICAgICAgLy8gb24gYSByZWFsIGRldmljZSwgd2hlbiBub3QgdXNpbmcgU2FmYXJpLCB3ZSBqdXN0IHdhbnQgdG8gdHJ5IGFnYWluXG4gICAgICBhd2FpdCBCLmRlbGF5KHNwaW5UaW1lKTtcbiAgICAgIHJldHVybiBhd2FpdCBzcGluSGFuZGxlcygpO1xuICAgIH1cblxuICAgIC8vIGZpbmQgdGhlIHJlbG9hZCBidXR0b24gYW5kIHRhcCBpdCwgaWYgcG9zc2libGVcbiAgICBsZXQgZWxlbWVudDtcbiAgICB0cnkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoJ0ZpbmRpbmcgYW5kIHRhcHBpbmcgcmVsb2FkIGJ1dHRvbicpO1xuICAgICAgZWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZFVJRWxlbWVudE9yRWxlbWVudHMoJ2FjY2Vzc2liaWxpdHkgaWQnLCAnUmVsb2FkQnV0dG9uJywgJycsIGZhbHNlKTtcbiAgICAgIGF3YWl0IHRoaXMubmF0aXZlVGFwKGVsZW1lbnQuRUxFTUVOVCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBFcnJvciBmaW5kaW5nIGFuZCB0YXBwaW5nIHJlbG9hZCBidXR0b246ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICB0aGlzLmxvZy53YXJuKCdSZXRyeWluZy4nKTtcbiAgICAgIGF3YWl0IEIuZGVsYXkoc3BpblRpbWUpO1xuICAgIH1cblxuICAgIC8vIHRyeSBpdCBhbGwgYWdhaW5cbiAgICByZXR1cm4gYXdhaXQgc3BpbkhhbmRsZXMoKTtcbiAgfTtcbiAgYXdhaXQgc3BpbkhhbmRsZXMoKTtcbn07XG5cbmhlbHBlcnMuc3RvcFJlbW90ZSA9IGFzeW5jIGZ1bmN0aW9uIHN0b3BSZW1vdGUgKGNsb3NlV2luZG93QmVmb3JlRGlzY29ubmVjdGluZyA9IGZhbHNlKSB7XG4gIGlmICghdGhpcy5yZW1vdGUpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdUcmllZCB0byBsZWF2ZSBhIHdlYiBmcmFtZSBidXQgd2VyZSBub3QgaW4gb25lJyk7XG4gIH1cblxuICBpZiAoY2xvc2VXaW5kb3dCZWZvcmVEaXNjb25uZWN0aW5nKSB7XG4gICAgYXdhaXQgdGhpcy5jbG9zZVdpbmRvdygpO1xuICB9XG4gIGF3YWl0IHRoaXMucmVtb3RlLmRpc2Nvbm5lY3QoKTtcbiAgdGhpcy5jdXJDb250ZXh0ID0gbnVsbDtcbiAgdGhpcy5jdXJXZWJGcmFtZXMgPSBbXTtcbiAgdGhpcy5jdXJXZWJDb29yZHMgPSBudWxsO1xuICB0aGlzLnJlbW90ZSA9IG51bGw7XG59O1xuXG5oZWxwZXJzLnNldEN1cnJlbnRVcmwgPSBmdW5jdGlvbiBzZXRDdXJyZW50VXJsICh1cmwpIHtcbiAgdGhpcy5fY3VycmVudFVybCA9IHVybDtcbn07XG5cbmhlbHBlcnMuZ2V0Q3VycmVudFVybCA9IGZ1bmN0aW9uIGdldEN1cnJlbnRVcmwgKCkge1xuICByZXR1cm4gdGhpcy5fY3VycmVudFVybDtcbn07XG5cbmV4dGVuc2lvbnMuY2xvc2VBbGVydEJlZm9yZVRlc3QgPSBhc3luYyBmdW5jdGlvbiBjbG9zZUFsZXJ0QmVmb3JlVGVzdCAoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1hd2FpdFxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4dGVuc2lvbnMubmF2VG9Jbml0aWFsV2VidmlldyA9IGFzeW5jIGZ1bmN0aW9uIG5hdlRvSW5pdGlhbFdlYnZpZXcgKCkge1xuICBpZiAodGhpcy51c2VOZXdTYWZhcmkoKSkge1xuICAgIGF3YWl0IHRoaXMudHlwZUFuZE5hdlRvVXJsKCk7XG4gIH0gZWxzZSBpZiAoIXRoaXMuaXNSZWFsRGV2aWNlKCkgJiYgdGhpcy5vcHRzLnNhZmFyaSkge1xuICAgIGF3YWl0IHRoaXMubmF2VG9WaWV3VGhyb3VnaEZhdm9yaXRlcygpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IHRoaXMubmF2VG9WaWV3V2l0aFRpdGxlKC8uKi8pO1xuICB9XG59O1xuXG5leHRlbnNpb25zLmdldExhdGVzdFdlYnZpZXdDb250ZXh0Rm9yVGl0bGUgPSBhc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RXZWJ2aWV3Q29udGV4dEZvclRpdGxlIChyZWdFeHApIHtcbiAgY29uc3QgY3VycmVudFVybCA9IHRoaXMuZ2V0Q3VycmVudFVybCgpO1xuXG4gIGNvbnN0IGNvbnRleHRzID0gXy5maWx0ZXIoYXdhaXQgdGhpcy5nZXRDb250ZXh0c0FuZFZpZXdzKCksICd2aWV3Jyk7XG5cbiAgaWYgKGN1cnJlbnRVcmwpIHtcbiAgICAvLyBmaXJzdCB0cnkgdG8gbWF0Y2ggYnkgY3VycmVudCB1cmxcbiAgICBmb3IgKGNvbnN0IGN0eCBvZiBjb250ZXh0cykge1xuICAgICAgaWYgKChjdHgudmlldy51cmwgfHwgJycpID09PSB0aGlzLmdldEN1cnJlbnRVcmwoKSkge1xuICAgICAgICByZXR1cm4gY3R4LmlkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGlmIG5vdCwgdHJ5IHRvIG1hdGNoIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvblxuICBmb3IgKGNvbnN0IGN0eCBvZiBjb250ZXh0cykge1xuICAgIGlmICgoY3R4LnZpZXcudGl0bGUgJiYgcmVnRXhwLnRlc3QoY3R4LnZpZXcudGl0bGUpKSB8fCAoY3R4LnZpZXcudXJsICYmIHJlZ0V4cC50ZXN0KGN0eC52aWV3LnVybCkpKSB7XG4gICAgICByZXR1cm4gY3R4LmlkO1xuICAgIH1cbiAgfVxufTtcblxuZXh0ZW5zaW9ucy5pc1dlYkNvbnRleHQgPSBmdW5jdGlvbiBpc1dlYkNvbnRleHQgKCkge1xuICByZXR1cm4gISF0aGlzLmN1ckNvbnRleHQgJiYgdGhpcy5jdXJDb250ZXh0ICE9PSBOQVRJVkVfV0lOO1xufTtcblxuZXh0ZW5zaW9ucy5pc1dlYnZpZXcgPSBmdW5jdGlvbiBpc1dlYnZpZXcgKCkge1xuICByZXR1cm4gdGhpcy5pc1dlYkNvbnRleHQoKTtcbn07XG5cbmV4dGVuc2lvbnMuZ2V0TmV3UmVtb3RlRGVidWdnZXIgPSBhc3luYyBmdW5jdGlvbiBnZXROZXdSZW1vdGVEZWJ1Z2dlciAoKSB7XG4gIGxldCBzb2NrZXRQYXRoO1xuICBpZiAoIXRoaXMuaXNSZWFsRGV2aWNlKCkpIHtcbiAgICBzb2NrZXRQYXRoID0gYXdhaXQgdGhpcy5vcHRzLmRldmljZS5nZXRXZWJJbnNwZWN0b3JTb2NrZXQoKTtcbiAgfVxuICByZXR1cm4gY3JlYXRlUmVtb3RlRGVidWdnZXIoe1xuICAgIGJ1bmRsZUlkOiB0aGlzLm9wdHMuYnVuZGxlSWQsXG4gICAgYWRkaXRpb25hbEJ1bmRsZUlkczogdGhpcy5vcHRzLmFkZGl0aW9uYWxXZWJ2aWV3QnVuZGxlSWRzLFxuICAgIGlzU2FmYXJpOiB0aGlzLmlzU2FmYXJpKCksXG4gICAgaW5jbHVkZVNhZmFyaTogdGhpcy5vcHRzLmluY2x1ZGVTYWZhcmlJbldlYnZpZXdzLFxuICAgIHVzZU5ld1NhZmFyaTogdGhpcy51c2VOZXdTYWZhcmkoKSxcbiAgICBwYWdlTG9hZE1zOiB0aGlzLnBhZ2VMb2FkTXMsXG4gICAgcGxhdGZvcm1WZXJzaW9uOiB0aGlzLm9wdHMucGxhdGZvcm1WZXJzaW9uLFxuICAgIHNvY2tldFBhdGgsXG4gICAgcmVtb3RlRGVidWdQcm94eTogdGhpcy5vcHRzLnJlbW90ZURlYnVnUHJveHksXG4gICAgZ2FyYmFnZUNvbGxlY3RPbkV4ZWN1dGU6IHV0aWwuaGFzVmFsdWUodGhpcy5vcHRzLnNhZmFyaUdhcmJhZ2VDb2xsZWN0KVxuICAgICAgPyAhIXRoaXMub3B0cy5zYWZhcmlHYXJiYWdlQ29sbGVjdFxuICAgICAgOiBmYWxzZSxcbiAgICB1ZGlkOiB0aGlzLm9wdHMudWRpZCxcbiAgICBsb2dBbGxDb21tdW5pY2F0aW9uOiB0aGlzLm9wdHMuc2FmYXJpTG9nQWxsQ29tbXVuaWNhdGlvbixcbiAgICBsb2dBbGxDb21tdW5pY2F0aW9uSGV4RHVtcDogdGhpcy5vcHRzLnNhZmFyaUxvZ0FsbENvbW11bmljYXRpb25IZXhEdW1wLFxuICAgIHNvY2tldENodW5rU2l6ZTogdGhpcy5vcHRzLnNhZmFyaVNvY2tldENodW5rU2l6ZSxcbiAgICB3ZWJJbnNwZWN0b3JNYXhGcmFtZUxlbmd0aDogdGhpcy5vcHRzLnNhZmFyaVdlYkluc3BlY3Rvck1heEZyYW1lTGVuZ3RoXG4gIH0sIHRoaXMuaXNSZWFsRGV2aWNlKCkpO1xufTtcblxuLyoqXG4gKiBTZXQgY29udGV4dFxuICpcbiAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIGNvbnRleHQgdG8gc2V0LiBJdCBjb3VsZCBiZSAnbnVsbCcgYXMgTkFUSVZFX1dJTi5cbiAqIEBwYXJhbSB7Y2FsbGJhY2t9IGNhbGxiYWNrIFRoZSBjYWxsYmFjay4gKEl0IGlzIG5vdCBjYWxsZWQgaW4gdGhpcyBtZXRob2QpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNraXBSZWFkeUNoZWNrIC0gV2hldGhlciBpdCB3YWl0cyBmb3IgdGhlIG5ldyBjb250ZXh0IGlzIHJlYWR5XG4gKi9cbmNvbW1hbmRzLnNldENvbnRleHQgPSBhc3luYyBmdW5jdGlvbiBzZXRDb250ZXh0IChuYW1lLCBjYWxsYmFjaywgc2tpcFJlYWR5Q2hlY2spIHtcbiAgZnVuY3Rpb24gYWxyZWFkeUluQ29udGV4dCAoZGVzaXJlZCwgY3VycmVudCkge1xuICAgIHJldHVybiAoZGVzaXJlZCA9PT0gY3VycmVudCB8fFxuICAgICAgKGRlc2lyZWQgPT09IG51bGwgJiYgY3VycmVudCA9PT0gTkFUSVZFX1dJTikgfHxcbiAgICAgIChkZXNpcmVkID09PSBOQVRJVkVfV0lOICYmIGN1cnJlbnQgPT09IG51bGwpKTtcbiAgfVxuICBmdW5jdGlvbiBpc05hdGl2ZUNvbnRleHQgKGNvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dCA9PT0gTkFUSVZFX1dJTiB8fCBjb250ZXh0ID09PSBudWxsO1xuICB9XG5cbiAgLy8gYWxsb3cgdGhlIGZ1bGwgY29udGV4dCBsaXN0IHRvIGJlIHBhc3NlZCBpblxuICBpZiAobmFtZSAmJiBuYW1lLmlkKSB7XG4gICAgbmFtZSA9IG5hbWUuaWQ7XG4gIH1cblxuICB0aGlzLmxvZy5kZWJ1ZyhgQXR0ZW1wdGluZyB0byBzZXQgY29udGV4dCB0byAnJHtuYW1lIHx8IE5BVElWRV9XSU59JyBmcm9tICcke3RoaXMuY3VyQ29udGV4dCA/IHRoaXMuY3VyQ29udGV4dCA6IE5BVElWRV9XSU59J2ApO1xuXG4gIGlmIChhbHJlYWR5SW5Db250ZXh0KG5hbWUsIHRoaXMuY3VyQ29udGV4dCkgfHwgYWxyZWFkeUluQ29udGV4dChfLnJlcGxhY2UobmFtZSwgV0VCVklFV19CQVNFLCAnJyksIHRoaXMuY3VyQ29udGV4dCkpIHtcbiAgICAvLyBhbHJlYWR5IGluIHRoZSBuYW1lZCBjb250ZXh0LCBubyBuZWVkIHRvIGRvIGFueXRoaW5nXG4gICAgdGhpcy5sb2cuZGVidWcoYEFscmVhZHkgaW4gJyR7bmFtZSB8fCBOQVRJVkVfV0lOfScgY29udGV4dC4gRG9pbmcgbm90aGluZy5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGlzTmF0aXZlQ29udGV4dChuYW1lKSkge1xuICAgIC8vIHN3aXRjaGluZyBpbnRvIHRoZSBuYXRpdmUgY29udGV4dFxuICAgIHRoaXMuY3VyQ29udGV4dCA9IG51bGw7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gc3dpdGNoaW5nIGludG8gYSB3ZWJ2aWV3IGNvbnRleHRcblxuICAvLyBpZiBjb250ZXh0cyBoYXZlIG5vdCBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLCBnZXQgdGhlbVxuICBpZiAoXy5pc1VuZGVmaW5lZCh0aGlzLmNvbnRleHRzKSkge1xuICAgIGF3YWl0IHRoaXMuZ2V0Q29udGV4dHMoKTtcbiAgfVxuXG4gIGxldCBjb250ZXh0SWQgPSBfLnJlcGxhY2UobmFtZSwgV0VCVklFV19CQVNFLCAnJyk7XG4gIGlmIChjb250ZXh0SWQgPT09ICcnKSB7XG4gICAgLy8gYWxsb3cgdXNlciB0byBwYXNzIGluIFwiV0VCVklFV1wiIHdpdGhvdXQgYW4gaW5kZXhcbiAgICAvLyB0aGUgc2Vjb25kIGNvbnRleHQgd2lsbCBiZSB0aGUgZmlyc3Qgd2VidmlldyBhc1xuICAgIC8vIHRoZSBmaXJzdCBpcyBhbHdheXMgTkFUSVZFX0FQUFxuICAgIGNvbnRleHRJZCA9IHRoaXMuY29udGV4dHNbMV07XG4gIH1cbiAgaWYgKCFfLmluY2x1ZGVzKHRoaXMuY29udGV4dHMsIGNvbnRleHRJZCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vU3VjaENvbnRleHRFcnJvcigpO1xuICB9XG5cbiAgY29uc3Qgb2xkQ29udGV4dCA9IHRoaXMuY3VyQ29udGV4dDtcbiAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5jdXJXaW5kb3dIYW5kbGUgPSBjb250ZXh0SWQ7XG5cbiAgLy8gYGNvbnRleHRJZGAgd2lsbCBiZSBpbiB0aGUgZm9ybSBvZiBgYXBwSWQucGFnZUlkYCBpbiB0aGlzIGNhc2VcbiAgY29uc3QgW2FwcElkS2V5LCBwYWdlSWRLZXldID0gXy5tYXAoY29udGV4dElkLnNwbGl0KCcuJyksIChpZCkgPT4gcGFyc2VJbnQoaWQsIDEwKSk7XG4gIHRyeSB7XG4gICAgdGhpcy5zZWxlY3RpbmdOZXdQYWdlID0gdHJ1ZTtcbiAgICBhd2FpdCB0aGlzLnJlbW90ZS5zZWxlY3RQYWdlKGFwcElkS2V5LCBwYWdlSWRLZXksIHNraXBSZWFkeUNoZWNrKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5jdXJXaW5kb3dIYW5kbGUgPSBvbGRDb250ZXh0O1xuICAgIHRocm93IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLnNlbGVjdGluZ05ld1BhZ2UgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIGF0dGVtcHQgdG8gc3RhcnQgcGVyZm9ybWFuY2UgbG9nZ2luZywgaWYgcmVxdWVzdGVkXG4gIGlmICh0aGlzLm9wdHMuZW5hYmxlUGVyZm9ybWFuY2VMb2dnaW5nICYmIHRoaXMucmVtb3RlKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoYFN0YXJ0aW5nIHBlcmZvcm1hbmNlIGxvZyBvbiAnJHt0aGlzLmN1ckNvbnRleHR9J2ApO1xuICAgIHRoaXMubG9ncy5wZXJmb3JtYW5jZSA9IG5ldyBJT1NQZXJmb3JtYW5jZUxvZyh0aGlzLnJlbW90ZSk7XG4gICAgYXdhaXQgdGhpcy5sb2dzLnBlcmZvcm1hbmNlLnN0YXJ0Q2FwdHVyZSgpO1xuICB9XG5cbiAgLy8gc3RhcnQgc2FmYXJpIGxvZ2dpbmcgaWYgdGhlIGxvZ3MgaGFuZGxlcnMgYXJlIGFjdGl2ZVxuICBpZiAobmFtZSAmJiBuYW1lICE9PSBOQVRJVkVfV0lOICYmIHRoaXMubG9ncykge1xuICAgIGlmICh0aGlzLmxvZ3Muc2FmYXJpQ29uc29sZSkge1xuICAgICAgYXdhaXQgdGhpcy5yZW1vdGUuc3RhcnRDb25zb2xlKHRoaXMubG9ncy5zYWZhcmlDb25zb2xlLmFkZExvZ0xpbmUuYmluZCh0aGlzLmxvZ3Muc2FmYXJpQ29uc29sZSkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2dzLnNhZmFyaU5ldHdvcmspIHtcbiAgICAgIGF3YWl0IHRoaXMucmVtb3RlLnN0YXJ0TmV0d29yayh0aGlzLmxvZ3Muc2FmYXJpTmV0d29yay5hZGRMb2dMaW5lLmJpbmQodGhpcy5sb2dzLnNhZmFyaU5ldHdvcmspKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4dGVuc2lvbnMuY29ubmVjdFRvUmVtb3RlRGVidWdnZXIgPSBhc3luYyBmdW5jdGlvbiBjb25uZWN0VG9SZW1vdGVEZWJ1Z2dlciAoKSB7XG4gIHRoaXMucmVtb3RlID0gYXdhaXQgdGhpcy5nZXROZXdSZW1vdGVEZWJ1Z2dlcigpO1xuXG4gIHRoaXMucmVtb3RlLm9uKFJlbW90ZURlYnVnZ2VyLkVWRU5UX1BBR0VfQ0hBTkdFLCB0aGlzLm9uUGFnZUNoYW5nZS5iaW5kKHRoaXMpKTtcbiAgdGhpcy5yZW1vdGUub24oUmVtb3RlRGVidWdnZXIuRVZFTlRfRlJBTUVTX0RFVEFDSEVELCAoKSA9PiB7XG4gICAgaWYgKCFfLmlzRW1wdHkodGhpcy5jdXJXZWJGcmFtZXMpKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgQ2xlYXJpbmcgJHt1dGlsLnBsdXJhbGl6ZSgnZnJhbWUnLCB0aGlzLmN1cldlYkZyYW1lcy5sZW5ndGgsIHRydWUpfTogJHt0aGlzLmN1cldlYkZyYW1lcy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICB0aGlzLmN1cldlYkZyYW1lcyA9IFtdO1xuICB9KTtcblxuICBhd2FpdCB0aGlzLnJlbW90ZS5jb25uZWN0KHRoaXMub3B0cy53ZWJ2aWV3Q29ubmVjdFRpbWVvdXQpO1xufTtcblxuZXh0ZW5zaW9ucy5saXN0V2ViRnJhbWVzID0gYXN5bmMgZnVuY3Rpb24gbGlzdFdlYkZyYW1lcyAodXNlVXJsID0gdHJ1ZSkge1xuICB1c2VVcmwgPSB1c2VVcmwgJiYgIXRoaXMuaXNSZWFsRGV2aWNlKCkgJiYgISF0aGlzLmdldEN1cnJlbnRVcmwoKTtcbiAgdGhpcy5sb2cuZGVidWcoYFNlbGVjdGluZyBieSB1cmw6ICR7dXNlVXJsfSAke3VzZVVybCA/IGAoZXhwZWN0ZWQgdXJsOiAnJHt0aGlzLmdldEN1cnJlbnRVcmwoKX0nKWAgOiAnJ31gKTtcblxuICBjb25zdCBjdXJyZW50VXJsID0gdXNlVXJsID8gdGhpcy5nZXRDdXJyZW50VXJsKCkgOiB1bmRlZmluZWQ7XG4gIGxldCBwYWdlQXJyYXkgPSBbXTtcbiAgY29uc3QgZ2V0V2Vidmlld1BhZ2VzID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZW1vdGUuc2VsZWN0QXBwKGN1cnJlbnRVcmwsIHRoaXMub3B0cy53ZWJ2aWV3Q29ubmVjdFJldHJpZXMsIHRoaXMub3B0cy5pZ25vcmVBYm91dEJsYW5rVXJsKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBObyBhdmFpbGFibGUgd2ViIHBhZ2VzOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfTtcblxuICBpZiAodGhpcy5yZW1vdGUgJiYgdGhpcy5yZW1vdGUuYXBwSWRLZXkpIHtcbiAgICAvLyBhbHJlYWR5IGNvbm5lY3RlZFxuICAgIHBhZ2VBcnJheSA9IGF3YWl0IGdldFdlYnZpZXdQYWdlcygpO1xuICB9IGVsc2Uge1xuICAgIGlmICghdGhpcy5yZW1vdGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuY29ubmVjdFRvUmVtb3RlRGVidWdnZXIoKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5yZW1vdGUuc2V0Q29ubmVjdGlvbktleSgpO1xuXG4gICAgcGFnZUFycmF5ID0gYXdhaXQgZ2V0V2Vidmlld1BhZ2VzKCk7XG5cbiAgICBjb25zdCBhbGVydEVycm9yTXNnID0gJ0Nsb3NlIGFsZXJ0IGZhaWxlZC4gUmV0cnkuJztcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcmV0cnlJbnRlcnZhbCg2LCAxMDAwLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghYXdhaXQgdGhpcy5jbG9zZUFsZXJ0QmVmb3JlVGVzdCgpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGFsZXJ0RXJyb3JNc2cpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGlmIHRoZSBsb29wIHRvIGNsb3NlIGFsZXJ0cyBmYWlsZWQgdG8gZGlzbWlzcywgaWdub3JlLFxuICAgICAgLy8gb3RoZXJ3aXNlIGxvZyBhbmQgdGhyb3cgdGhlIGVycm9yXG4gICAgICBpZiAoZXJyLm1lc3NhZ2UgIT09IGFsZXJ0RXJyb3JNc2cpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhlcnIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChwYWdlQXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gd2UgaGF2ZSBubyB3ZWIgZnJhbWVzLCBidXQgY29udGludWUgYW55d2F5XG4gICAgdGhpcy5sb2cuZGVidWcoJ05vIHdlYiBmcmFtZXMgZm91bmQuJyk7XG4gIH1cbiAgcmV0dXJuIHBhZ2VBcnJheTtcbn07XG5cbmNvbW1hbmRzLmdldENvbnRleHRzID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q29udGV4dHMgKCkge1xuICB0aGlzLmxvZy5kZWJ1ZygnR2V0dGluZyBsaXN0IG9mIGF2YWlsYWJsZSBjb250ZXh0cycpO1xuICBjb25zdCBjb250ZXh0cyA9IGF3YWl0IHRoaXMuZ2V0Q29udGV4dHNBbmRWaWV3cyhmYWxzZSk7XG5cbiAgY29uc3QgbWFwRm4gPSB0aGlzLm9wdHMuZnVsbENvbnRleHRMaXN0XG4gICAgPyBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGNvbnRleHQuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgdGl0bGU6IGNvbnRleHQudmlldy50aXRsZSxcbiAgICAgICAgdXJsOiBjb250ZXh0LnZpZXcudXJsLFxuICAgICAgICBidW5kbGVJZDogY29udGV4dC52aWV3LmJ1bmRsZUlkLFxuICAgICAgfTtcbiAgICB9XG4gICAgOiAoY29udGV4dCkgPT4gY29udGV4dC5pZC50b1N0cmluZygpO1xuICByZXR1cm4gY29udGV4dHMubWFwKG1hcEZuKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ29udGV4dFxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBjb250ZXh0LiBUaGUgbmF0aXZlIGNvbnRleHRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlICdOQVRJVkVfQVBQJyBhbmQgdGhlIHdlYnZpZXdzIHdpbGwgYmVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAnV0VCVklFV194eHgnXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHRpdGxlIC0gVGhlIHRpdGxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2VidmlldyBjb250ZW50XG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHVybCAtIFRoZSB1cmwgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWJ2aWV3IGNvbnRlbnRcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUgY29udGV4dHMgYXZhaWxhYmxlLCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1cmwgYW5kIHRpdGxlIG9mIGVhY2hcbiAqIHdlYnZpZXdcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIE9wdGlvbnMgc2V0LCB3aGljaCBjYW4gaW5jbHVkZSBgd2FpdEZvcldlYnZpZXdNc2AgdG9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSB0aGUgcGVyaW9kIHRvIHBvbGwgZm9yIGF2YWlsYWJsZSB3ZWJ2aWV3c1xuICogQHJldHVybnMge0FycmF5fSBMaXN0IG9mIENvbnRleHQgb2JqZWN0c1xuICovXG5leHRlbnNpb25zLm1vYmlsZUdldENvbnRleHRzID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0Q29udGV4dHMgKG9wdHMgPSB7fSkge1xuICBsZXQge1xuICAgIHdhaXRGb3JXZWJ2aWV3TXMgPSAwLFxuICB9ID0gb3B0cztcblxuICAvLyBtYWtlIHN1cmUgaXQgaXMgYSBudW1iZXIsIHNvIHRoZSBkdXJhdGlvbiBjaGVjayB3b3JrcyBwcm9wZXJseVxuICBpZiAoIV8uaXNOdW1iZXIod2FpdEZvcldlYnZpZXdNcykpIHtcbiAgICB3YWl0Rm9yV2Vidmlld01zID0gcGFyc2VJbnQod2FpdEZvcldlYnZpZXdNcywgMTApO1xuICAgIGlmIChpc05hTih3YWl0Rm9yV2Vidmlld01zKSkge1xuICAgICAgd2FpdEZvcldlYnZpZXdNcyA9IDA7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY3VyT3B0ID0gdGhpcy5vcHRzLmZ1bGxDb250ZXh0TGlzdDtcbiAgdGhpcy5vcHRzLmZ1bGxDb250ZXh0TGlzdCA9IHRydWU7XG5cbiAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgdHJ5IHtcbiAgICBsZXQgY29udGV4dHM7XG4gICAgZG8ge1xuICAgICAgY29udGV4dHMgPSBhd2FpdCB0aGlzLmdldENvbnRleHRzKCk7XG5cbiAgICAgIGlmIChjb250ZXh0cy5sZW5ndGggPj0gMikge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgRm91bmQgd2VidmlldyBjb250ZXh0IGFmdGVyICR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zYCk7XG4gICAgICAgIHJldHVybiBjb250ZXh0cztcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nLmRlYnVnKGBObyB3ZWJ2aWV3cyBmb3VuZCBpbiAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICAgIH0gd2hpbGUgKHRpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMgPCB3YWl0Rm9yV2Vidmlld01zKTtcbiAgICByZXR1cm4gY29udGV4dHM7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gcmVzZXQgdGhlIG9wdGlvbiBzbyB0aGVyZSBhcmUgbm8gc2lkZSBlZmZlY3RzXG4gICAgdGhpcy5vcHRzLmZ1bGxDb250ZXh0TGlzdCA9IGN1ck9wdDtcbiAgfVxufTtcblxuY29tbWFuZHMuc2V0V2luZG93ID0gYXN5bmMgZnVuY3Rpb24gc2V0V2luZG93IChuYW1lLCBza2lwUmVhZHlDaGVjaykge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2V0Q29udGV4dChuYW1lLCBfLm5vb3AsIHNraXBSZWFkeUNoZWNrKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gdHJhbnNsYXRlIHRoZSBlcnJvciBpbiB0ZXJtcyBvZiB3aW5kb3dzXG4gICAgdGhyb3cgaXNFcnJvclR5cGUoZXJyLCBlcnJvcnMuTm9TdWNoQ29udGV4dEVycm9yKVxuICAgICAgPyBuZXcgZXJyb3JzLk5vU3VjaFdpbmRvd0Vycm9yKClcbiAgICAgIDogZXJyO1xuICB9XG59O1xuXG5jb21tYW5kcy5nZXRXaW5kb3dIYW5kbGUgPSBhc3luYyBmdW5jdGlvbiBnZXRXaW5kb3dIYW5kbGUgKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cbiAgdGhpcy5sb2cuZGVidWcoYEdldHRpbmcgY3VycmVudCB3aW5kb3cgaGFuZGxlYCk7XG4gIHJldHVybiB0aGlzLmN1ckNvbnRleHQ7XG59O1xuXG5jb21tYW5kcy5nZXRXaW5kb3dIYW5kbGVzID0gYXN5bmMgZnVuY3Rpb24gZ2V0V2luZG93SGFuZGxlcyAoKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG4gIHRoaXMubG9nLmRlYnVnKCdHZXR0aW5nIGxpc3Qgb2YgYXZhaWxhYmxlIHdpbmRvdyBoYW5kbGVzJyk7XG4gIGNvbnN0IGNvbnRleHRzID0gYXdhaXQgdGhpcy5nZXRDb250ZXh0c0FuZFZpZXdzKGZhbHNlKTtcbiAgcmV0dXJuIGNvbnRleHRzXG4gICAgLy8gZ2V0IHJpZCBvZiB0aGUgbmF0aXZlIGFwcCBjb250ZXh0XG4gICAgLmZpbHRlcigoY29udGV4dCkgPT4gY29udGV4dC5pZCAhPT0gTkFUSVZFX1dJTilcbiAgICAvLyBnZXQgdGhlIGBhcHAuaWRgIGZvcm1hdCBleHBlY3RlZFxuICAgIC5tYXAoKGNvbnRleHQpID0+IGNvbnRleHQudmlldy5pZC50b1N0cmluZygpKTtcbn07XG5cbmV4dGVuc2lvbnMub25QYWdlQ2hhbmdlID0gYXN5bmMgZnVuY3Rpb24gb25QYWdlQ2hhbmdlIChwYWdlQ2hhbmdlTm90aWZpY2F0aW9uKSB7XG4gIHRoaXMubG9nLmRlYnVnKGBSZW1vdGUgZGVidWdnZXIgbm90aWZpZWQgdXMgb2YgYSBuZXcgcGFnZSBsaXN0aW5nOiAke0pTT04uc3RyaW5naWZ5KHBhZ2VDaGFuZ2VOb3RpZmljYXRpb24pfWApO1xuICBpZiAodGhpcy5zZWxlY3RpbmdOZXdQYWdlKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ1dlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIHNlbGVjdGluZyBhIHBhZ2UsIGlnbm9yaW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghdGhpcy5yZW1vdGUgfHwgIXRoaXMucmVtb3RlLmlzQ29ubmVjdGVkKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ1dlIGhhdmUgbm90IHlldCBjb25uZWN0ZWQsIGlnbm9yaW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qge2FwcElkS2V5LCBwYWdlQXJyYXl9ID0gcGFnZUNoYW5nZU5vdGlmaWNhdGlvbjtcblxuICBsZXQgbmV3SWRzID0gW107XG4gIGxldCBuZXdQYWdlcyA9IFtdO1xuICBsZXQga2V5SWQgPSBudWxsO1xuXG4gIC8vIENoZWNrcyBpZiBhIFVSTCBpcyBibGFja2xpc3RlZCBpbiB0aGUgJ3NhZmFyaUlnbm9yZVdlYkhvc3RuYW1lcycgY2FwYWJpbGl0eVxuICBmdW5jdGlvbiBpc1VybElnbm9yZWQgKHVybCwgc2FmYXJpSWdub3JlV2ViSG9zdG5hbWVzKSB7XG4gICAgY29uc3QgaWdub3JlZEhvc3RzID0gKHNhZmFyaUlnbm9yZVdlYkhvc3RuYW1lcyB8fCAnJylcbiAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAubWFwKChiKSA9PiBiLnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoKGIpID0+ICFfLmlzRW1wdHkoYikpO1xuICAgIGZvciAoY29uc3QgaWdub3JlZEhvc3Qgb2YgaWdub3JlZEhvc3RzKSB7XG4gICAgICBpZiAoaWdub3JlZEhvc3QgPT09ICdhYm91dDpibGFuaycgJiYgdXJsID09PSAnYWJvdXQ6YmxhbmsnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBob3N0bmFtZSA9IG5ldyBVUkwodXJsKS5ob3N0bmFtZTtcbiAgICAgICAgICBpZiAoaG9zdG5hbWUgPT09IGlnbm9yZWRIb3N0KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgICAgIC8vIGRvIG5vdGhpbmcgaWYgaW52YWxpZCBVUkxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGNvbnN0IHBhZ2Ugb2YgcGFnZUFycmF5KSB7XG4gICAgY29uc3QgaWQgPSBwYWdlLmlkLnRvU3RyaW5nKCk7XG4gICAgbmV3SWRzLnB1c2goaWQpO1xuICAgIGlmIChwYWdlLmlzS2V5KSB7XG4gICAgICBrZXlJZCA9IGlkO1xuICAgIH1cbiAgICBjb25zdCBjb250ZXh0SWQgPSBgJHthcHBJZEtleX0uJHtpZH1gO1xuXG4gICAgLy8gYWRkIGlmIHRoaXMgaXMgYSBuZXcgcGFnZVxuICAgIGlmICghXy5pbmNsdWRlcyh0aGlzLmNvbnRleHRzLCBjb250ZXh0SWQpKSB7XG4gICAgICBpZiAoaXNVcmxJZ25vcmVkKHBhZ2UudXJsLCB0aGlzLm9wdHMuc2FmYXJpSWdub3JlV2ViSG9zdG5hbWVzKSkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBOb3QgdHJhY2tpbmcgJyR7cGFnZS51cmx9JyBwYWdlIGJlY2F1c2UgaXQgaXMgYmxhY2tsaXN0ZWQuIGAgK1xuICAgICAgICAgIGAnc2FmYXJpSWdub3JlV2ViSG9zdG5hbWVzJz0ke3RoaXMub3B0cy5zYWZhcmlJZ25vcmVXZWJIb3N0bmFtZXN9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdQYWdlcy5wdXNoKGlkKTtcbiAgICAgICAgdGhpcy5jb250ZXh0cy5wdXNoKGNvbnRleHRJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFrZXlJZCkge1xuICAgIC8vIGlmIHRoZXJlIGlzIG5vIGtleSBpZCwgcHVsbCB0aGUgZmlyc3QgaWQgZnJvbSB0aGUgcGFnZSBhcnJheSBhbmQgdXNlIHRoYXRcbiAgICAvLyBhcyBhIHN0YW5kIGluXG4gICAgdGhpcy5sb2cuZGVidWcoJ05vIGtleSBpZCBmb3VuZC4gQ2hvb3NpbmcgZmlyc3QgaWQgZnJvbSBwYWdlIGFycmF5Jyk7XG4gICAga2V5SWQgPSBuZXdJZHNbMF0gfHwgbnVsbDtcbiAgfVxuXG4gIGlmICghdXRpbC5oYXNWYWx1ZSh0aGlzLmN1ckNvbnRleHQpKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ1dlIGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSB3aW5kb3cgc2V0IHlldCwgaWdub3JpbmcnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBbY3VyQXBwSWRLZXksIGN1clBhZ2VJZEtleV0gPSB0aGlzLmN1ckNvbnRleHQuc3BsaXQoJy4nKTtcblxuICBpZiAoY3VyQXBwSWRLZXkgIT09IGFwcElkS2V5KSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ1BhZ2UgY2hhbmdlIG5vdCByZWZlcnJpbmcgdG8gY3VycmVudGx5IHNlbGVjdGVkIGFwcCwgaWdub3JpbmcuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IG5ld1BhZ2UgPSBudWxsO1xuICBpZiAobmV3UGFnZXMubGVuZ3RoKSB7XG4gICAgbmV3UGFnZSA9IF8ubGFzdChuZXdQYWdlcyk7XG4gICAgdGhpcy5sb2cuZGVidWcoYFdlIGhhdmUgbmV3IHBhZ2VzLCBzZWxlY3RpbmcgcGFnZSAnJHtuZXdQYWdlfSdgKTtcbiAgfSBlbHNlIGlmICghXy5pbmNsdWRlcyhuZXdJZHMsIGN1clBhZ2VJZEtleSkpIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnTmV3IHBhZ2UgbGlzdGluZyBmcm9tIHJlbW90ZSBkZWJ1Z2dlciBkb2VzIG5vdCBjb250YWluICcgK1xuICAgICAgICAgICAgICAgICAnY3VycmVudCB3aW5kb3c7IGFzc3VtaW5nIGl0IGlzIGNsb3NlZCcpO1xuICAgIGlmICghdXRpbC5oYXNWYWx1ZShrZXlJZCkpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yKCdEbyBub3QgaGF2ZSBvdXIgY3VycmVudCB3aW5kb3cgYW55bW9yZSwgYW5kIHRoZXJlICcgK1xuICAgICAgICAgICAgICAgICAgICdhcmUgbm90IGFueSBtb3JlIHRvIGxvYWQhIERvaW5nIG5vdGhpbmcuLi4nKTtcbiAgICAgIHRoaXMuc2V0Q3VycmVudFVybCh1bmRlZmluZWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubG9nLmRlYnVnKGBEZWJ1Z2dlciBhbHJlYWR5IHNlbGVjdGVkIHBhZ2UgJyR7a2V5SWR9JywgYCArXG4gICAgICAgICAgICAgICAgIGBjb25maXJtaW5nIHRoYXQgY2hvaWNlLmApO1xuICAgIHRoaXMuY3VyQ29udGV4dCA9IGAke2FwcElkS2V5fS4ke2tleUlkfWA7XG4gICAgbmV3UGFnZSA9IGtleUlkO1xuICB9IGVsc2Uge1xuICAgIC8vIGF0IHRoaXMgcG9pbnQsIHRoZXJlIGFyZSBubyBuZXcgcGFnZXMsIGFuZCB0aGUgY3VycmVudCBwYWdlIHN0aWxsIGV4aXN0c1xuICAgIHRoaXMubG9nLmRlYnVnKCdDaGVja2luZyBpZiBwYWdlIG5lZWRzIHRvIGxvYWQnKTtcbiAgICAvLyBJZiBhIHdpbmRvdyBuYXZpZ2F0ZXMgdG8gYW4gYW5jaG9yIGl0IGRvZXNuJ3QgYWx3YXlzIGZpcmUgYSBwYWdlXG4gICAgLy8gY2FsbGJhY2sgZXZlbnQuIExldCdzIGNoZWNrIGlmIHdlIHdvdW5kIHVwIGluIHN1Y2ggYSBzaXR1YXRpb24uXG4gICAgY29uc3QgbmVlZHNQYWdlTG9hZCA9ICgoKSA9PiB7XG4gICAgICAvLyBuZWVkIHRvIG1hcCB0aGUgcGFnZSBpZHMgdG8gY29udGV4dCBpZHNcbiAgICAgIGNvbnN0IGNvbnRleHRBcnJheSA9IF8ubWFwKHBhZ2VBcnJheSwgKHBhZ2UpID0+IGAke2FwcElkS2V5fS4ke3BhZ2UuaWR9YCk7XG4gICAgICAvLyBjaGVjayBpZiB0aGUgY3VycmVudCBjb250ZXh0IGV4aXN0cyBpbiBib3RoIG91ciByZWNvcmRlZCBjb250ZXh0cyxcbiAgICAgIC8vIGFuZCB0aGUgcGFnZSBhcnJheVxuICAgICAgcmV0dXJuICFfLmlzRXF1YWwoXy5maW5kKHRoaXMuY29udGV4dHMsIHRoaXMuY3VyQ29udGV4dCksIF8uZmluZChjb250ZXh0QXJyYXksIHRoaXMuY3VyQ29udGV4dCkpO1xuICAgIH0pKCk7XG5cbiAgICBpZiAobmVlZHNQYWdlTG9hZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoJ1BhZ2UgbG9hZCBuZWVkZWQuIExvYWRpbmcuLi4nKTtcbiAgICAgIGF3YWl0IHRoaXMucmVtb3RlLnBhZ2VMb2FkKCk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2cuZGVidWcoJ05ldyBwYWdlIGxpc3RpbmcgaXMgc2FtZSBhcyBvbGQsIGRvaW5nIG5vdGhpbmcnKTtcbiAgfVxuXG4gIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBwYWdlIGxpc3RpbmcgaXNuJ3QgaW5kaWNhdGluZyBhIHJlZGlyZWN0XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMuY3VyQ29udGV4dCkpIHtcbiAgICBsZXQgY3VycmVudFBhZ2VJZCA9IHBhcnNlSW50KF8ubGFzdCh0aGlzLmN1ckNvbnRleHQuc3BsaXQoJy4nKSksIDEwKTtcbiAgICBsZXQgcGFnZSA9IF8uZmluZChwYWdlQXJyYXksIChwKSA9PiBwYXJzZUludChwLmlkLCAxMCkgPT09IGN1cnJlbnRQYWdlSWQpO1xuICAgIGlmIChwYWdlICYmIHBhZ2UudXJsICE9PSB0aGlzLmdldEN1cnJlbnRVcmwoKSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFJlZGlyZWN0ZWQgZnJvbSAnJHt0aGlzLmdldEN1cnJlbnRVcmwoKX0nIHRvICcke3BhZ2UudXJsfSdgKTtcbiAgICAgIHRoaXMuc2V0Q3VycmVudFVybChwYWdlLnVybCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHV0aWwuaGFzVmFsdWUobmV3UGFnZSkpIHtcbiAgICB0aGlzLnNlbGVjdGluZ05ld1BhZ2UgPSB0cnVlO1xuICAgIGNvbnN0IG9sZENvbnRleHQgPSB0aGlzLmN1ckNvbnRleHQ7XG4gICAgdGhpcy5jdXJDb250ZXh0ID0gYCR7YXBwSWRLZXl9LiR7bmV3UGFnZX1gO1xuICAgIC8vIGRvIG5vdCB3YWl0LCBhcyB0aGlzIGNhbiB0YWtlIGEgbG9uZyB0aW1lLCBhbmQgdGhlIHJlc3BvbnNlIGlzIG5vdCBuZWNlc3NhcnlcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tY2FsbGJhY2tzLCBwcm9taXNlL3ByZWZlci1hd2FpdC10by10aGVuXG4gICAgdGhpcy5yZW1vdGUuc2VsZWN0UGFnZShhcHBJZEtleSwgcGFyc2VJbnQobmV3UGFnZSwgMTApKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBGYWlsZWQgdG8gc2VsZWN0IHBhZ2U6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICB0aGlzLmN1ckNvbnRleHQgPSBvbGRDb250ZXh0O1xuICAgIH0pO1xuICAgIHRoaXMuc2VsZWN0aW5nTmV3UGFnZSA9IGZhbHNlO1xuICB9XG4gIHRoaXMud2luZG93SGFuZGxlQ2FjaGUgPSBwYWdlQXJyYXk7XG59O1xuXG5cbk9iamVjdC5hc3NpZ24o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
538
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2NvbW1hbmRzL2NvbnRleHQuanMiLCJuYW1lcyI6WyJOQVRJVkVfV0lOIiwiV0VCVklFV19XSU4iLCJXRUJWSUVXX0JBU0UiLCJSRUNFTlRfV0VCVklFV19ERVRFQ1RJT05fVElNRU9VVF9NUyIsImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJnZXRDdXJyZW50Q29udGV4dCIsImN1ckNvbnRleHQiLCJnZXRDb250ZXh0c0FuZFZpZXdzIiwidXNlVXJsIiwibG9nIiwiZGVidWciLCJ3ZWJ2aWV3cyIsImxpc3RXZWJGcmFtZXMiLCJjdHhzIiwiaWQiLCJ2aWV3IiwiY29udGV4dHMiLCJwdXNoIiwidG9TdHJpbmciLCJ1c2VOZXdTYWZhcmkiLCJpc1JlYWxEZXZpY2UiLCJvcHRzIiwic2FmYXJpIiwiYWN0aXZhdGVSZWNlbnRXZWJ2aWV3IiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0Iiwic3BpblRpbWVNcyIsInNwaW5IYW5kbGVzIiwiY29udGV4dElkIiwiZ2V0UmVjZW50V2Vidmlld0NvbnRleHRJZCIsImVyciIsIm1lc3NhZ2UiLCJpbmNsdWRlcyIsImVycm9yIiwiRXJyb3IiLCJzdGFjayIsInNldENvbnRleHQiLCJyZW1vdGUiLCJjYW5jZWxQYWdlTG9hZCIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ3YXJuIiwiQiIsImRlbGF5IiwiZWxlbWVudCIsImZpbmRVSUVsZW1lbnRPckVsZW1lbnRzIiwibmF0aXZlQ2xpY2siLCJzdG9wUmVtb3RlIiwiY2xvc2VXaW5kb3dCZWZvcmVEaXNjb25uZWN0aW5nIiwiZXJyb3JBbmRUaHJvdyIsImNsb3NlV2luZG93IiwiZGlzY29ubmVjdCIsImN1cldlYkZyYW1lcyIsImN1cldlYkNvb3JkcyIsInNldEN1cnJlbnRVcmwiLCJ1cmwiLCJfY3VycmVudFVybCIsImdldEN1cnJlbnRVcmwiLCJ0aXRsZVJlZ0V4cCIsInVybFJlZ0V4cCIsIl8iLCJpc1JlZ0V4cCIsImVycm9ycyIsIkludmFsaWRBcmd1bWVudEVycm9yIiwiY3VycmVudFVybCIsImZpbHRlciIsImN0eCIsImZpbmQiLCJ0aXRsZSIsInRlc3QiLCJpc1dlYkNvbnRleHQiLCJpc1dlYnZpZXciLCJnZXROZXdSZW1vdGVEZWJ1Z2dlciIsInNvY2tldFBhdGgiLCJkZXZpY2UiLCJnZXRXZWJJbnNwZWN0b3JTb2NrZXQiLCJjcmVhdGVSZW1vdGVEZWJ1Z2dlciIsImJ1bmRsZUlkIiwiYWRkaXRpb25hbEJ1bmRsZUlkcyIsImFkZGl0aW9uYWxXZWJ2aWV3QnVuZGxlSWRzIiwiaXNTYWZhcmkiLCJpbmNsdWRlU2FmYXJpIiwiaW5jbHVkZVNhZmFyaUluV2Vidmlld3MiLCJwYWdlTG9hZE1zIiwicGxhdGZvcm1WZXJzaW9uIiwicmVtb3RlRGVidWdQcm94eSIsImdhcmJhZ2VDb2xsZWN0T25FeGVjdXRlIiwidXRpbCIsImhhc1ZhbHVlIiwic2FmYXJpR2FyYmFnZUNvbGxlY3QiLCJ1ZGlkIiwibG9nQWxsQ29tbXVuaWNhdGlvbiIsInNhZmFyaUxvZ0FsbENvbW11bmljYXRpb24iLCJsb2dBbGxDb21tdW5pY2F0aW9uSGV4RHVtcCIsInNhZmFyaUxvZ0FsbENvbW11bmljYXRpb25IZXhEdW1wIiwic29ja2V0Q2h1bmtTaXplIiwic2FmYXJpU29ja2V0Q2h1bmtTaXplIiwid2ViSW5zcGVjdG9yTWF4RnJhbWVMZW5ndGgiLCJzYWZhcmlXZWJJbnNwZWN0b3JNYXhGcmFtZUxlbmd0aCIsIm5hbWUiLCJjYWxsYmFjayIsInNraXBSZWFkeUNoZWNrIiwiYWxyZWFkeUluQ29udGV4dCIsImRlc2lyZWQiLCJjdXJyZW50IiwiaXNOYXRpdmVDb250ZXh0IiwiY29udGV4dCIsInJlcGxhY2UiLCJpc1VuZGVmaW5lZCIsImdldENvbnRleHRzIiwiTm9TdWNoQ29udGV4dEVycm9yIiwib2xkQ29udGV4dCIsImN1cldpbmRvd0hhbmRsZSIsImFwcElkS2V5IiwicGFnZUlkS2V5IiwibWFwIiwic3BsaXQiLCJwYXJzZUludCIsInNlbGVjdGluZ05ld1BhZ2UiLCJzZWxlY3RQYWdlIiwiZW5hYmxlUGVyZm9ybWFuY2VMb2dnaW5nIiwibG9ncyIsInBlcmZvcm1hbmNlIiwiSU9TUGVyZm9ybWFuY2VMb2ciLCJzdGFydENhcHR1cmUiLCJzYWZhcmlDb25zb2xlIiwic3RhcnRDb25zb2xlIiwiYWRkTG9nTGluZSIsImJpbmQiLCJzYWZhcmlOZXR3b3JrIiwic3RhcnROZXR3b3JrIiwiY29ubmVjdFRvUmVtb3RlRGVidWdnZXIiLCJvbiIsIlJlbW90ZURlYnVnZ2VyIiwiRVZFTlRfUEFHRV9DSEFOR0UiLCJvblBhZ2VDaGFuZ2UiLCJFVkVOVF9GUkFNRVNfREVUQUNIRUQiLCJpc0VtcHR5IiwicGx1cmFsaXplIiwibGVuZ3RoIiwiam9pbiIsImNvbm5lY3QiLCJ3ZWJ2aWV3Q29ubmVjdFRpbWVvdXQiLCJzZXRDb25uZWN0aW9uS2V5IiwiZ2V0V2Vidmlld1BhZ2VzIiwic2VsZWN0QXBwIiwidW5kZWZpbmVkIiwid2Vidmlld0Nvbm5lY3RSZXRyaWVzIiwiaWdub3JlQWJvdXRCbGFua1VybCIsInBhZ2VBcnJheSIsIm1hcEZuIiwiZnVsbENvbnRleHRMaXN0IiwibW9iaWxlR2V0Q29udGV4dHMiLCJ3YWl0Rm9yV2Vidmlld01zIiwiaXNOdW1iZXIiLCJpc05hTiIsImN1ck9wdCIsInRvRml4ZWQiLCJzZXRXaW5kb3ciLCJub29wIiwiaXNFcnJvclR5cGUiLCJOb1N1Y2hXaW5kb3dFcnJvciIsImdldFdpbmRvd0hhbmRsZSIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJnZXRXaW5kb3dIYW5kbGVzIiwicGFnZUNoYW5nZU5vdGlmaWNhdGlvbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJpc0Nvbm5lY3RlZCIsIm5ld0lkcyIsIm5ld1BhZ2VzIiwia2V5SWQiLCJpc1VybElnbm9yZWQiLCJzYWZhcmlJZ25vcmVXZWJIb3N0bmFtZXMiLCJpZ25vcmVkSG9zdHMiLCJiIiwidHJpbSIsImlnbm9yZWRIb3N0IiwiaG9zdG5hbWUiLCJVUkwiLCJpZ24iLCJwYWdlIiwiaXNLZXkiLCJpbmZvIiwiY3VyQXBwSWRLZXkiLCJjdXJQYWdlSWRLZXkiLCJuZXdQYWdlIiwibGFzdCIsIm5lZWRzUGFnZUxvYWQiLCJjb250ZXh0QXJyYXkiLCJpc0VxdWFsIiwicGFnZUxvYWQiLCJjdXJyZW50UGFnZUlkIiwicCIsImNhdGNoIiwid2luZG93SGFuZGxlQ2FjaGUiLCJPYmplY3QiLCJhc3NpZ24iXSwic291cmNlUm9vdCI6Ii4uLy4uLy4uIiwic291cmNlcyI6WyJsaWIvY29tbWFuZHMvY29udGV4dC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVSZW1vdGVEZWJ1Z2dlciwgUmVtb3RlRGVidWdnZXIgfSBmcm9tICdhcHBpdW0tcmVtb3RlLWRlYnVnZ2VyJztcbmltcG9ydCB7IGVycm9ycywgaXNFcnJvclR5cGUgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCB7IHV0aWwsIHRpbWluZyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgSU9TUGVyZm9ybWFuY2VMb2cgZnJvbSAnLi4vZGV2aWNlLWxvZy9pb3MtcGVyZm9ybWFuY2UtbG9nJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmNvbnN0IE5BVElWRV9XSU4gPSAnTkFUSVZFX0FQUCc7XG5jb25zdCBXRUJWSUVXX1dJTiA9ICdXRUJWSUVXJztcbmNvbnN0IFdFQlZJRVdfQkFTRSA9IGAke1dFQlZJRVdfV0lOfV9gO1xuY29uc3QgUkVDRU5UX1dFQlZJRVdfREVURUNUSU9OX1RJTUVPVVRfTVMgPSA5MDAwMDtcblxuY29uc3QgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cblxuY29tbWFuZHMuZ2V0Q3VycmVudENvbnRleHQgPSBhc3luYyBmdW5jdGlvbiBnZXRDdXJyZW50Q29udGV4dCAoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1hd2FpdFxuICBpZiAodGhpcy5jdXJDb250ZXh0ICYmIHRoaXMuY3VyQ29udGV4dCAhPT0gTkFUSVZFX1dJTikge1xuICAgIHJldHVybiBgJHtXRUJWSUVXX0JBU0V9JHt0aGlzLmN1ckNvbnRleHR9YDtcbiAgfVxuICByZXR1cm4gTkFUSVZFX1dJTjtcbn07XG5cbmV4dGVuc2lvbnMuZ2V0Q29udGV4dHNBbmRWaWV3cyA9IGFzeW5jIGZ1bmN0aW9uIGdldENvbnRleHRzQW5kVmlld3MgKHVzZVVybCA9IHRydWUpIHtcbiAgdGhpcy5sb2cuZGVidWcoJ1JldHJpZXZpbmcgY29udGV4dHMgYW5kIHZpZXdzJyk7XG4gIGxldCB3ZWJ2aWV3cyA9IGF3YWl0IHRoaXMubGlzdFdlYkZyYW1lcyh1c2VVcmwpO1xuXG4gIGxldCBjdHhzID0gW3tpZDogTkFUSVZFX1dJTiwgdmlldzoge319XTtcbiAgdGhpcy5jb250ZXh0cyA9IFtOQVRJVkVfV0lOXTtcbiAgZm9yIChsZXQgdmlldyBvZiB3ZWJ2aWV3cykge1xuICAgIGN0eHMucHVzaCh7aWQ6IGAke1dFQlZJRVdfQkFTRX0ke3ZpZXcuaWR9YCwgdmlld30pO1xuICAgIHRoaXMuY29udGV4dHMucHVzaCh2aWV3LmlkLnRvU3RyaW5nKCkpO1xuICB9XG4gIHJldHVybiBjdHhzO1xufTtcblxuLy8gUmlnaHQgbm93IHdlIGRvbid0IG5lY2Vzc2FyaWx5IHdhaXQgZm9yIHdlYnZpZXdcbi8vIGFuZCBmcmFtZSB0byBsb2FkLCB3aGljaCBsZWFkcyB0byByYWNlIGNvbmRpdGlvbnMgYW5kIGZsYWtpbmVzcyxcbi8vIGxldCdzIHNlZSBpZiB3ZSBjYW4gdHJhbnNpdGlvbiB0byBzb21ldGhpbmcgYmV0dGVyXG5leHRlbnNpb25zLnVzZU5ld1NhZmFyaSA9IGZ1bmN0aW9uIHVzZU5ld1NhZmFyaSAoKSB7XG4gIHJldHVybiAhdGhpcy5pc1JlYWxEZXZpY2UoKSAmJiB0aGlzLm9wdHMuc2FmYXJpO1xufTtcblxuZXh0ZW5zaW9ucy5hY3RpdmF0ZVJlY2VudFdlYnZpZXcgPSBhc3luYyBmdW5jdGlvbiBhY3RpdmF0ZVJlY2VudFdlYnZpZXcgKCkge1xuICB0aGlzLmxvZy5kZWJ1ZygnQWN0aXZhdGluZyBhIHJlY2VudCB3ZWJ2aWV3Jyk7XG4gIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gIGNvbnN0IHNwaW5UaW1lTXMgPSA1MDA7XG4gIGNvbnN0IHNwaW5IYW5kbGVzID0gYXN5bmMgKCkgPT4ge1xuICAgIGxldCBjb250ZXh0SWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnRleHRJZCA9IGF3YWl0IHRoaXMuZ2V0UmVjZW50V2Vidmlld0NvbnRleHRJZCgvLiovLCAvLiovKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICghZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ0NvdWxkIG5vdCBjb25uZWN0IHRvIGEgdmFsaWQgYXBwIGFmdGVyJykpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYENvdWxkIG5vdCBuYXZpZ2F0ZSB0byB3ZWJ2aWV3ISBFcnI6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIGVycm9yLnN0YWNrICs9IGBcXG5DYXVzZWQgYnk6ICR7ZXJyLnN0YWNrfWA7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoJ0NvdWxkIG5vdCBuYXZpZ2F0ZSB0byB3ZWJ2aWV3LiBSZXRyeWluZyBpZiBwb3NzaWJsZS4nKTtcbiAgICB9XG4gICAgaWYgKGNvbnRleHRJZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFBpY2tpbmcgd2VidmlldyAnJHtjb250ZXh0SWR9J2ApO1xuICAgICAgYXdhaXQgdGhpcy5zZXRDb250ZXh0KGNvbnRleHRJZCk7XG4gICAgICBhd2FpdCB0aGlzLnJlbW90ZS5jYW5jZWxQYWdlTG9hZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG5vIHdlYnZpZXcgd2FzIGZvdW5kXG4gICAgaWYgKHRpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMgPj0gUkVDRU5UX1dFQlZJRVdfREVURUNUSU9OX1RJTUVPVVRfTVMpIHtcbiAgICAgIC8vIHRvbyBzbG93LCBnZXQgb3V0XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBuYXZpZ2F0ZSB0byB3ZWJ2aWV3OyB0aGVyZSBhcmUgbm9uZSEnKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZy53YXJuKCdDb3VsZCBub3QgZmluZCBhbnkgd2Vidmlld3MgeWV0LCByZWZyZXNoaW5nL3JldHJ5aW5nJyk7XG4gICAgaWYgKHRoaXMuaXNSZWFsRGV2aWNlKCkgfHwgIXRoaXMub3B0cy5zYWZhcmkpIHtcbiAgICAgIC8vIG9uIGEgcmVhbCBkZXZpY2UsIHdoZW4gbm90IHVzaW5nIFNhZmFyaSwgd2UganVzdCB3YW50IHRvIHRyeSBhZ2FpblxuICAgICAgYXdhaXQgQi5kZWxheShzcGluVGltZU1zKTtcbiAgICAgIHJldHVybiBhd2FpdCBzcGluSGFuZGxlcygpO1xuICAgIH1cblxuICAgIC8vIGZpbmQgdGhlIHJlbG9hZCBidXR0b24gYW5kIHRhcCBpdCwgaWYgcG9zc2libGVcbiAgICBsZXQgZWxlbWVudDtcbiAgICB0cnkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoJ0ZpbmRpbmcgYW5kIHRhcHBpbmcgcmVsb2FkIGJ1dHRvbicpO1xuICAgICAgZWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZFVJRWxlbWVudE9yRWxlbWVudHMoJ2FjY2Vzc2liaWxpdHkgaWQnLCAnUmVsb2FkQnV0dG9uJywgJycsIGZhbHNlKTtcbiAgICAgIGF3YWl0IHRoaXMubmF0aXZlQ2xpY2soZWxlbWVudCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBFcnJvciBmaW5kaW5nIGFuZCB0YXBwaW5nIHJlbG9hZCBidXR0b246ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICB0aGlzLmxvZy53YXJuKCdSZXRyeWluZy4nKTtcbiAgICAgIGF3YWl0IEIuZGVsYXkoc3BpblRpbWVNcyk7XG4gICAgfVxuXG4gICAgLy8gdHJ5IGl0IGFsbCBhZ2FpblxuICAgIHJldHVybiBhd2FpdCBzcGluSGFuZGxlcygpO1xuICB9O1xuICBhd2FpdCBzcGluSGFuZGxlcygpO1xufTtcblxuaGVscGVycy5zdG9wUmVtb3RlID0gYXN5bmMgZnVuY3Rpb24gc3RvcFJlbW90ZSAoY2xvc2VXaW5kb3dCZWZvcmVEaXNjb25uZWN0aW5nID0gZmFsc2UpIHtcbiAgaWYgKCF0aGlzLnJlbW90ZSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ1RyaWVkIHRvIGxlYXZlIGEgd2ViIGZyYW1lIGJ1dCB3ZXJlIG5vdCBpbiBvbmUnKTtcbiAgfVxuXG4gIGlmIChjbG9zZVdpbmRvd0JlZm9yZURpc2Nvbm5lY3RpbmcpIHtcbiAgICBhd2FpdCB0aGlzLmNsb3NlV2luZG93KCk7XG4gIH1cbiAgYXdhaXQgdGhpcy5yZW1vdGUuZGlzY29ubmVjdCgpO1xuICB0aGlzLmN1ckNvbnRleHQgPSBudWxsO1xuICB0aGlzLmN1cldlYkZyYW1lcyA9IFtdO1xuICB0aGlzLmN1cldlYkNvb3JkcyA9IG51bGw7XG4gIHRoaXMucmVtb3RlID0gbnVsbDtcbn07XG5cbmhlbHBlcnMuc2V0Q3VycmVudFVybCA9IGZ1bmN0aW9uIHNldEN1cnJlbnRVcmwgKHVybCkge1xuICB0aGlzLl9jdXJyZW50VXJsID0gdXJsO1xufTtcblxuaGVscGVycy5nZXRDdXJyZW50VXJsID0gZnVuY3Rpb24gZ2V0Q3VycmVudFVybCAoKSB7XG4gIHJldHVybiB0aGlzLl9jdXJyZW50VXJsO1xufTtcblxuZXh0ZW5zaW9ucy5nZXRSZWNlbnRXZWJ2aWV3Q29udGV4dElkID0gYXN5bmMgZnVuY3Rpb24gZ2V0UmVjZW50V2Vidmlld0NvbnRleHRJZCAodGl0bGVSZWdFeHAsIHVybFJlZ0V4cCkge1xuICBpZiAoIV8uaXNSZWdFeHAodGl0bGVSZWdFeHApICYmICFfLmlzUmVnRXhwKHVybFJlZ0V4cCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgJ0EgcmVndWxhciBleHByZXNzaW9uIGZvciBlaXRoZXIgd2ViIHZpZXcgdGl0bGUgb3IgdXJsIG11c3QgYmUgcHJvdmlkZWQnXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRVcmwgPSB0aGlzLmdldEN1cnJlbnRVcmwoKTtcbiAgY29uc3QgY29udGV4dHMgPSBfLmZpbHRlcihhd2FpdCB0aGlzLmdldENvbnRleHRzQW5kVmlld3MoZmFsc2UpLCAndmlldycpO1xuICAvLyBmaXJzdCB0cnkgdG8gbWF0Y2ggYnkgY3VycmVudCB1cmxcbiAgaWYgKGN1cnJlbnRVcmwpIHtcbiAgICBjb25zdCBjdHggPSBjb250ZXh0cy5maW5kKCh7dmlld30pID0+ICh2aWV3LnVybCB8fCAnJykgPT09IGN1cnJlbnRVcmwpO1xuICAgIGlmIChjdHgpIHtcbiAgICAgIHJldHVybiBjdHguaWQ7XG4gICAgfVxuICB9XG4gIC8vIGlmIG5vdCwgdHJ5IHRvIG1hdGNoIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvblxuICByZXR1cm4gKGNvbnRleHRzLmZpbmQoKHt2aWV3fSkgPT5cbiAgICB2aWV3LnRpdGxlICYmIHRpdGxlUmVnRXhwPy50ZXN0KHZpZXcudGl0bGUpIHx8IHZpZXcudXJsICYmIHVybFJlZ0V4cD8udGVzdCh2aWV3LnVybClcbiAgKSk/LmlkO1xufTtcblxuZXh0ZW5zaW9ucy5pc1dlYkNvbnRleHQgPSBmdW5jdGlvbiBpc1dlYkNvbnRleHQgKCkge1xuICByZXR1cm4gISF0aGlzLmN1ckNvbnRleHQgJiYgdGhpcy5jdXJDb250ZXh0ICE9PSBOQVRJVkVfV0lOO1xufTtcblxuZXh0ZW5zaW9ucy5pc1dlYnZpZXcgPSBmdW5jdGlvbiBpc1dlYnZpZXcgKCkge1xuICByZXR1cm4gdGhpcy5pc1dlYkNvbnRleHQoKTtcbn07XG5cbmV4dGVuc2lvbnMuZ2V0TmV3UmVtb3RlRGVidWdnZXIgPSBhc3luYyBmdW5jdGlvbiBnZXROZXdSZW1vdGVEZWJ1Z2dlciAoKSB7XG4gIGxldCBzb2NrZXRQYXRoO1xuICBpZiAoIXRoaXMuaXNSZWFsRGV2aWNlKCkpIHtcbiAgICBzb2NrZXRQYXRoID0gYXdhaXQgdGhpcy5vcHRzLmRldmljZS5nZXRXZWJJbnNwZWN0b3JTb2NrZXQoKTtcbiAgfVxuICByZXR1cm4gY3JlYXRlUmVtb3RlRGVidWdnZXIoe1xuICAgIGJ1bmRsZUlkOiB0aGlzLm9wdHMuYnVuZGxlSWQsXG4gICAgYWRkaXRpb25hbEJ1bmRsZUlkczogdGhpcy5vcHRzLmFkZGl0aW9uYWxXZWJ2aWV3QnVuZGxlSWRzLFxuICAgIGlzU2FmYXJpOiB0aGlzLmlzU2FmYXJpKCksXG4gICAgaW5jbHVkZVNhZmFyaTogdGhpcy5vcHRzLmluY2x1ZGVTYWZhcmlJbldlYnZpZXdzLFxuICAgIHVzZU5ld1NhZmFyaTogdGhpcy51c2VOZXdTYWZhcmkoKSxcbiAgICBwYWdlTG9hZE1zOiB0aGlzLnBhZ2VMb2FkTXMsXG4gICAgcGxhdGZvcm1WZXJzaW9uOiB0aGlzLm9wdHMucGxhdGZvcm1WZXJzaW9uLFxuICAgIHNvY2tldFBhdGgsXG4gICAgcmVtb3RlRGVidWdQcm94eTogdGhpcy5vcHRzLnJlbW90ZURlYnVnUHJveHksXG4gICAgZ2FyYmFnZUNvbGxlY3RPbkV4ZWN1dGU6IHV0aWwuaGFzVmFsdWUodGhpcy5vcHRzLnNhZmFyaUdhcmJhZ2VDb2xsZWN0KVxuICAgICAgPyAhIXRoaXMub3B0cy5zYWZhcmlHYXJiYWdlQ29sbGVjdFxuICAgICAgOiBmYWxzZSxcbiAgICB1ZGlkOiB0aGlzLm9wdHMudWRpZCxcbiAgICBsb2dBbGxDb21tdW5pY2F0aW9uOiB0aGlzLm9wdHMuc2FmYXJpTG9nQWxsQ29tbXVuaWNhdGlvbixcbiAgICBsb2dBbGxDb21tdW5pY2F0aW9uSGV4RHVtcDogdGhpcy5vcHRzLnNhZmFyaUxvZ0FsbENvbW11bmljYXRpb25IZXhEdW1wLFxuICAgIHNvY2tldENodW5rU2l6ZTogdGhpcy5vcHRzLnNhZmFyaVNvY2tldENodW5rU2l6ZSxcbiAgICB3ZWJJbnNwZWN0b3JNYXhGcmFtZUxlbmd0aDogdGhpcy5vcHRzLnNhZmFyaVdlYkluc3BlY3Rvck1heEZyYW1lTGVuZ3RoXG4gIH0sIHRoaXMuaXNSZWFsRGV2aWNlKCkpO1xufTtcblxuLyoqXG4gKiBTZXQgY29udGV4dFxuICpcbiAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIGNvbnRleHQgdG8gc2V0LiBJdCBjb3VsZCBiZSAnbnVsbCcgYXMgTkFUSVZFX1dJTi5cbiAqIEBwYXJhbSB7Y2FsbGJhY2t9IGNhbGxiYWNrIFRoZSBjYWxsYmFjay4gKEl0IGlzIG5vdCBjYWxsZWQgaW4gdGhpcyBtZXRob2QpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNraXBSZWFkeUNoZWNrIC0gV2hldGhlciBpdCB3YWl0cyBmb3IgdGhlIG5ldyBjb250ZXh0IGlzIHJlYWR5XG4gKi9cbmNvbW1hbmRzLnNldENvbnRleHQgPSBhc3luYyBmdW5jdGlvbiBzZXRDb250ZXh0IChuYW1lLCBjYWxsYmFjaywgc2tpcFJlYWR5Q2hlY2spIHtcbiAgZnVuY3Rpb24gYWxyZWFkeUluQ29udGV4dCAoZGVzaXJlZCwgY3VycmVudCkge1xuICAgIHJldHVybiAoZGVzaXJlZCA9PT0gY3VycmVudCB8fFxuICAgICAgKGRlc2lyZWQgPT09IG51bGwgJiYgY3VycmVudCA9PT0gTkFUSVZFX1dJTikgfHxcbiAgICAgIChkZXNpcmVkID09PSBOQVRJVkVfV0lOICYmIGN1cnJlbnQgPT09IG51bGwpKTtcbiAgfVxuICBmdW5jdGlvbiBpc05hdGl2ZUNvbnRleHQgKGNvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dCA9PT0gTkFUSVZFX1dJTiB8fCBjb250ZXh0ID09PSBudWxsO1xuICB9XG5cbiAgLy8gYWxsb3cgdGhlIGZ1bGwgY29udGV4dCBsaXN0IHRvIGJlIHBhc3NlZCBpblxuICBpZiAobmFtZSAmJiBuYW1lLmlkKSB7XG4gICAgbmFtZSA9IG5hbWUuaWQ7XG4gIH1cblxuICB0aGlzLmxvZy5kZWJ1ZyhgQXR0ZW1wdGluZyB0byBzZXQgY29udGV4dCB0byAnJHtuYW1lIHx8IE5BVElWRV9XSU59JyBmcm9tICcke3RoaXMuY3VyQ29udGV4dCA/IHRoaXMuY3VyQ29udGV4dCA6IE5BVElWRV9XSU59J2ApO1xuXG4gIGlmIChhbHJlYWR5SW5Db250ZXh0KG5hbWUsIHRoaXMuY3VyQ29udGV4dCkgfHwgYWxyZWFkeUluQ29udGV4dChfLnJlcGxhY2UobmFtZSwgV0VCVklFV19CQVNFLCAnJyksIHRoaXMuY3VyQ29udGV4dCkpIHtcbiAgICAvLyBhbHJlYWR5IGluIHRoZSBuYW1lZCBjb250ZXh0LCBubyBuZWVkIHRvIGRvIGFueXRoaW5nXG4gICAgdGhpcy5sb2cuZGVidWcoYEFscmVhZHkgaW4gJyR7bmFtZSB8fCBOQVRJVkVfV0lOfScgY29udGV4dC4gRG9pbmcgbm90aGluZy5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGlzTmF0aXZlQ29udGV4dChuYW1lKSkge1xuICAgIC8vIHN3aXRjaGluZyBpbnRvIHRoZSBuYXRpdmUgY29udGV4dFxuICAgIHRoaXMuY3VyQ29udGV4dCA9IG51bGw7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gc3dpdGNoaW5nIGludG8gYSB3ZWJ2aWV3IGNvbnRleHRcblxuICAvLyBpZiBjb250ZXh0cyBoYXZlIG5vdCBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLCBnZXQgdGhlbVxuICBpZiAoXy5pc1VuZGVmaW5lZCh0aGlzLmNvbnRleHRzKSkge1xuICAgIGF3YWl0IHRoaXMuZ2V0Q29udGV4dHMoKTtcbiAgfVxuXG4gIGxldCBjb250ZXh0SWQgPSBfLnJlcGxhY2UobmFtZSwgV0VCVklFV19CQVNFLCAnJyk7XG4gIGlmIChjb250ZXh0SWQgPT09ICcnKSB7XG4gICAgLy8gYWxsb3cgdXNlciB0byBwYXNzIGluIFwiV0VCVklFV1wiIHdpdGhvdXQgYW4gaW5kZXhcbiAgICAvLyB0aGUgc2Vjb25kIGNvbnRleHQgd2lsbCBiZSB0aGUgZmlyc3Qgd2VidmlldyBhc1xuICAgIC8vIHRoZSBmaXJzdCBpcyBhbHdheXMgTkFUSVZFX0FQUFxuICAgIGNvbnRleHRJZCA9IHRoaXMuY29udGV4dHNbMV07XG4gIH1cbiAgaWYgKCFfLmluY2x1ZGVzKHRoaXMuY29udGV4dHMsIGNvbnRleHRJZCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vU3VjaENvbnRleHRFcnJvcigpO1xuICB9XG5cbiAgY29uc3Qgb2xkQ29udGV4dCA9IHRoaXMuY3VyQ29udGV4dDtcbiAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5jdXJXaW5kb3dIYW5kbGUgPSBjb250ZXh0SWQ7XG5cbiAgLy8gYGNvbnRleHRJZGAgd2lsbCBiZSBpbiB0aGUgZm9ybSBvZiBgYXBwSWQucGFnZUlkYCBpbiB0aGlzIGNhc2VcbiAgY29uc3QgW2FwcElkS2V5LCBwYWdlSWRLZXldID0gXy5tYXAoY29udGV4dElkLnNwbGl0KCcuJyksIChpZCkgPT4gcGFyc2VJbnQoaWQsIDEwKSk7XG4gIHRyeSB7XG4gICAgdGhpcy5zZWxlY3RpbmdOZXdQYWdlID0gdHJ1ZTtcbiAgICBhd2FpdCB0aGlzLnJlbW90ZS5zZWxlY3RQYWdlKGFwcElkS2V5LCBwYWdlSWRLZXksIHNraXBSZWFkeUNoZWNrKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5jdXJXaW5kb3dIYW5kbGUgPSBvbGRDb250ZXh0O1xuICAgIHRocm93IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLnNlbGVjdGluZ05ld1BhZ2UgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIGF0dGVtcHQgdG8gc3RhcnQgcGVyZm9ybWFuY2UgbG9nZ2luZywgaWYgcmVxdWVzdGVkXG4gIGlmICh0aGlzLm9wdHMuZW5hYmxlUGVyZm9ybWFuY2VMb2dnaW5nICYmIHRoaXMucmVtb3RlKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoYFN0YXJ0aW5nIHBlcmZvcm1hbmNlIGxvZyBvbiAnJHt0aGlzLmN1ckNvbnRleHR9J2ApO1xuICAgIHRoaXMubG9ncy5wZXJmb3JtYW5jZSA9IG5ldyBJT1NQZXJmb3JtYW5jZUxvZyh0aGlzLnJlbW90ZSk7XG4gICAgYXdhaXQgdGhpcy5sb2dzLnBlcmZvcm1hbmNlLnN0YXJ0Q2FwdHVyZSgpO1xuICB9XG5cbiAgLy8gc3RhcnQgc2FmYXJpIGxvZ2dpbmcgaWYgdGhlIGxvZ3MgaGFuZGxlcnMgYXJlIGFjdGl2ZVxuICBpZiAobmFtZSAmJiBuYW1lICE9PSBOQVRJVkVfV0lOICYmIHRoaXMubG9ncykge1xuICAgIGlmICh0aGlzLmxvZ3Muc2FmYXJpQ29uc29sZSkge1xuICAgICAgYXdhaXQgdGhpcy5yZW1vdGUuc3RhcnRDb25zb2xlKHRoaXMubG9ncy5zYWZhcmlDb25zb2xlLmFkZExvZ0xpbmUuYmluZCh0aGlzLmxvZ3Muc2FmYXJpQ29uc29sZSkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2dzLnNhZmFyaU5ldHdvcmspIHtcbiAgICAgIGF3YWl0IHRoaXMucmVtb3RlLnN0YXJ0TmV0d29yayh0aGlzLmxvZ3Muc2FmYXJpTmV0d29yay5hZGRMb2dMaW5lLmJpbmQodGhpcy5sb2dzLnNhZmFyaU5ldHdvcmspKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4dGVuc2lvbnMuY29ubmVjdFRvUmVtb3RlRGVidWdnZXIgPSBhc3luYyBmdW5jdGlvbiBjb25uZWN0VG9SZW1vdGVEZWJ1Z2dlciAoKSB7XG4gIHRoaXMucmVtb3RlID0gYXdhaXQgdGhpcy5nZXROZXdSZW1vdGVEZWJ1Z2dlcigpO1xuXG4gIHRoaXMucmVtb3RlLm9uKFJlbW90ZURlYnVnZ2VyLkVWRU5UX1BBR0VfQ0hBTkdFLCB0aGlzLm9uUGFnZUNoYW5nZS5iaW5kKHRoaXMpKTtcbiAgdGhpcy5yZW1vdGUub24oUmVtb3RlRGVidWdnZXIuRVZFTlRfRlJBTUVTX0RFVEFDSEVELCAoKSA9PiB7XG4gICAgaWYgKCFfLmlzRW1wdHkodGhpcy5jdXJXZWJGcmFtZXMpKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgQ2xlYXJpbmcgJHt1dGlsLnBsdXJhbGl6ZSgnZnJhbWUnLCB0aGlzLmN1cldlYkZyYW1lcy5sZW5ndGgsIHRydWUpfTogJHt0aGlzLmN1cldlYkZyYW1lcy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICB0aGlzLmN1cldlYkZyYW1lcyA9IFtdO1xuICB9KTtcblxuICBhd2FpdCB0aGlzLnJlbW90ZS5jb25uZWN0KHRoaXMub3B0cy53ZWJ2aWV3Q29ubmVjdFRpbWVvdXQpO1xufTtcblxuZXh0ZW5zaW9ucy5saXN0V2ViRnJhbWVzID0gYXN5bmMgZnVuY3Rpb24gbGlzdFdlYkZyYW1lcyAodXNlVXJsID0gdHJ1ZSkge1xuICB1c2VVcmwgPSB1c2VVcmwgJiYgIXRoaXMuaXNSZWFsRGV2aWNlKCkgJiYgISF0aGlzLmdldEN1cnJlbnRVcmwoKTtcbiAgdGhpcy5sb2cuZGVidWcoYFNlbGVjdGluZyBieSB1cmw6ICR7dXNlVXJsfSR7dXNlVXJsID8gYCAoZXhwZWN0ZWQgdXJsOiAnJHt0aGlzLmdldEN1cnJlbnRVcmwoKX0nKWAgOiAnJ31gKTtcblxuICBpZiAoIXRoaXMucmVtb3RlKSB7XG4gICAgYXdhaXQgdGhpcy5jb25uZWN0VG9SZW1vdGVEZWJ1Z2dlcigpO1xuICAgIGlmICghdGhpcy5yZW1vdGUuYXBwSWRLZXkpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVtb3RlLnNldENvbm5lY3Rpb25LZXkoKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZ2V0V2Vidmlld1BhZ2VzID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZW1vdGUuc2VsZWN0QXBwKFxuICAgICAgICB1c2VVcmwgPyB0aGlzLmdldEN1cnJlbnRVcmwoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5vcHRzLndlYnZpZXdDb25uZWN0UmV0cmllcyxcbiAgICAgICAgdGhpcy5vcHRzLmlnbm9yZUFib3V0QmxhbmtVcmxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgTm8gYXZhaWxhYmxlIHdlYiBwYWdlczogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHBhZ2VBcnJheSA9IGF3YWl0IGdldFdlYnZpZXdQYWdlcygpO1xuICBpZiAoXy5pc0VtcHR5KHBhZ2VBcnJheSkpIHtcbiAgICAvLyB3ZSBoYXZlIG5vIHdlYiBmcmFtZXMsIGJ1dCBjb250aW51ZSBhbnl3YXlcbiAgICB0aGlzLmxvZy5kZWJ1ZygnTm8gd2ViIGZyYW1lcyBmb3VuZC4nKTtcbiAgfVxuICByZXR1cm4gcGFnZUFycmF5O1xufTtcblxuY29tbWFuZHMuZ2V0Q29udGV4dHMgPSBhc3luYyBmdW5jdGlvbiBnZXRDb250ZXh0cyAoKSB7XG4gIHRoaXMubG9nLmRlYnVnKCdHZXR0aW5nIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbnRleHRzJyk7XG4gIGNvbnN0IGNvbnRleHRzID0gYXdhaXQgdGhpcy5nZXRDb250ZXh0c0FuZFZpZXdzKGZhbHNlKTtcblxuICBjb25zdCBtYXBGbiA9IHRoaXMub3B0cy5mdWxsQ29udGV4dExpc3RcbiAgICA/IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogY29udGV4dC5pZC50b1N0cmluZygpLFxuICAgICAgICB0aXRsZTogY29udGV4dC52aWV3LnRpdGxlLFxuICAgICAgICB1cmw6IGNvbnRleHQudmlldy51cmwsXG4gICAgICAgIGJ1bmRsZUlkOiBjb250ZXh0LnZpZXcuYnVuZGxlSWQsXG4gICAgICB9O1xuICAgIH1cbiAgICA6IChjb250ZXh0KSA9PiBjb250ZXh0LmlkLnRvU3RyaW5nKCk7XG4gIHJldHVybiBjb250ZXh0cy5tYXAobWFwRm4pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDb250ZXh0XG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvbnRleHQuIFRoZSBuYXRpdmUgY29udGV4dFxuICogICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgJ05BVElWRV9BUFAnIGFuZCB0aGUgd2Vidmlld3Mgd2lsbCBiZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICdXRUJWSUVXX3h4eCdcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdGl0bGUgLSBUaGUgdGl0bGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWJ2aWV3IGNvbnRlbnRcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdXJsIC0gVGhlIHVybCBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYnZpZXcgY29udGVudFxuICovXG5cbi8qKlxuICogR2V0IHRoZSBjb250ZXh0cyBhdmFpbGFibGUsIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVybCBhbmQgdGl0bGUgb2YgZWFjaFxuICogd2Vidmlld1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gT3B0aW9ucyBzZXQsIHdoaWNoIGNhbiBpbmNsdWRlIGB3YWl0Rm9yV2Vidmlld01zYCB0b1xuICogICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoZSBwZXJpb2QgdG8gcG9sbCBmb3IgYXZhaWxhYmxlIHdlYnZpZXdzXG4gKiBAcmV0dXJucyB7QXJyYXl9IExpc3Qgb2YgQ29udGV4dCBvYmplY3RzXG4gKi9cbmV4dGVuc2lvbnMubW9iaWxlR2V0Q29udGV4dHMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXRDb250ZXh0cyAob3B0cyA9IHt9KSB7XG4gIGxldCB7XG4gICAgd2FpdEZvcldlYnZpZXdNcyA9IDAsXG4gIH0gPSBvcHRzO1xuXG4gIC8vIG1ha2Ugc3VyZSBpdCBpcyBhIG51bWJlciwgc28gdGhlIGR1cmF0aW9uIGNoZWNrIHdvcmtzIHByb3Blcmx5XG4gIGlmICghXy5pc051bWJlcih3YWl0Rm9yV2Vidmlld01zKSkge1xuICAgIHdhaXRGb3JXZWJ2aWV3TXMgPSBwYXJzZUludCh3YWl0Rm9yV2Vidmlld01zLCAxMCk7XG4gICAgaWYgKGlzTmFOKHdhaXRGb3JXZWJ2aWV3TXMpKSB7XG4gICAgICB3YWl0Rm9yV2Vidmlld01zID0gMDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjdXJPcHQgPSB0aGlzLm9wdHMuZnVsbENvbnRleHRMaXN0O1xuICB0aGlzLm9wdHMuZnVsbENvbnRleHRMaXN0ID0gdHJ1ZTtcblxuICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICB0cnkge1xuICAgIGxldCBjb250ZXh0cztcbiAgICBkbyB7XG4gICAgICBjb250ZXh0cyA9IGF3YWl0IHRoaXMuZ2V0Q29udGV4dHMoKTtcblxuICAgICAgaWYgKGNvbnRleHRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBGb3VuZCB3ZWJ2aWV3IGNvbnRleHQgYWZ0ZXIgJHt0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzLnRvRml4ZWQoMCl9bXNgKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHRzO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoYE5vIHdlYnZpZXdzIGZvdW5kIGluICR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zYCk7XG4gICAgfSB3aGlsZSAodGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcyA8IHdhaXRGb3JXZWJ2aWV3TXMpO1xuICAgIHJldHVybiBjb250ZXh0cztcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyByZXNldCB0aGUgb3B0aW9uIHNvIHRoZXJlIGFyZSBubyBzaWRlIGVmZmVjdHNcbiAgICB0aGlzLm9wdHMuZnVsbENvbnRleHRMaXN0ID0gY3VyT3B0O1xuICB9XG59O1xuXG5jb21tYW5kcy5zZXRXaW5kb3cgPSBhc3luYyBmdW5jdGlvbiBzZXRXaW5kb3cgKG5hbWUsIHNraXBSZWFkeUNoZWNrKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zZXRDb250ZXh0KG5hbWUsIF8ubm9vcCwgc2tpcFJlYWR5Q2hlY2spO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyB0cmFuc2xhdGUgdGhlIGVycm9yIGluIHRlcm1zIG9mIHdpbmRvd3NcbiAgICB0aHJvdyBpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5Ob1N1Y2hDb250ZXh0RXJyb3IpXG4gICAgICA/IG5ldyBlcnJvcnMuTm9TdWNoV2luZG93RXJyb3IoKVxuICAgICAgOiBlcnI7XG4gIH1cbn07XG5cbmNvbW1hbmRzLmdldFdpbmRvd0hhbmRsZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFdpbmRvd0hhbmRsZSAoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1hd2FpdFxuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuICB0aGlzLmxvZy5kZWJ1ZyhgR2V0dGluZyBjdXJyZW50IHdpbmRvdyBoYW5kbGVgKTtcbiAgcmV0dXJuIHRoaXMuY3VyQ29udGV4dDtcbn07XG5cbmNvbW1hbmRzLmdldFdpbmRvd0hhbmRsZXMgPSBhc3luYyBmdW5jdGlvbiBnZXRXaW5kb3dIYW5kbGVzICgpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cbiAgdGhpcy5sb2cuZGVidWcoJ0dldHRpbmcgbGlzdCBvZiBhdmFpbGFibGUgd2luZG93IGhhbmRsZXMnKTtcbiAgY29uc3QgY29udGV4dHMgPSBhd2FpdCB0aGlzLmdldENvbnRleHRzQW5kVmlld3MoZmFsc2UpO1xuICByZXR1cm4gY29udGV4dHNcbiAgICAvLyBnZXQgcmlkIG9mIHRoZSBuYXRpdmUgYXBwIGNvbnRleHRcbiAgICAuZmlsdGVyKChjb250ZXh0KSA9PiBjb250ZXh0LmlkICE9PSBOQVRJVkVfV0lOKVxuICAgIC8vIGdldCB0aGUgYGFwcC5pZGAgZm9ybWF0IGV4cGVjdGVkXG4gICAgLm1hcCgoY29udGV4dCkgPT4gY29udGV4dC52aWV3LmlkLnRvU3RyaW5nKCkpO1xufTtcblxuZXh0ZW5zaW9ucy5vblBhZ2VDaGFuZ2UgPSBhc3luYyBmdW5jdGlvbiBvblBhZ2VDaGFuZ2UgKHBhZ2VDaGFuZ2VOb3RpZmljYXRpb24pIHtcbiAgdGhpcy5sb2cuZGVidWcoYFJlbW90ZSBkZWJ1Z2dlciBub3RpZmllZCB1cyBvZiBhIG5ldyBwYWdlIGxpc3Rpbmc6ICR7SlNPTi5zdHJpbmdpZnkocGFnZUNoYW5nZU5vdGlmaWNhdGlvbil9YCk7XG4gIGlmICh0aGlzLnNlbGVjdGluZ05ld1BhZ2UpIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnV2UgYXJlIGluIHRoZSBtaWRkbGUgb2Ygc2VsZWN0aW5nIGEgcGFnZSwgaWdub3JpbmcnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCF0aGlzLnJlbW90ZSB8fCAhdGhpcy5yZW1vdGUuaXNDb25uZWN0ZWQpIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnV2UgaGF2ZSBub3QgeWV0IGNvbm5lY3RlZCwgaWdub3JpbmcnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7YXBwSWRLZXksIHBhZ2VBcnJheX0gPSBwYWdlQ2hhbmdlTm90aWZpY2F0aW9uO1xuXG4gIGxldCBuZXdJZHMgPSBbXTtcbiAgbGV0IG5ld1BhZ2VzID0gW107XG4gIGxldCBrZXlJZCA9IG51bGw7XG5cbiAgLy8gQ2hlY2tzIGlmIGEgVVJMIGlzIGJsYWNrbGlzdGVkIGluIHRoZSAnc2FmYXJpSWdub3JlV2ViSG9zdG5hbWVzJyBjYXBhYmlsaXR5XG4gIGZ1bmN0aW9uIGlzVXJsSWdub3JlZCAodXJsLCBzYWZhcmlJZ25vcmVXZWJIb3N0bmFtZXMpIHtcbiAgICBjb25zdCBpZ25vcmVkSG9zdHMgPSAoc2FmYXJpSWdub3JlV2ViSG9zdG5hbWVzIHx8ICcnKVxuICAgICAgLnNwbGl0KCcsJylcbiAgICAgIC5tYXAoKGIpID0+IGIudHJpbSgpKVxuICAgICAgLmZpbHRlcigoYikgPT4gIV8uaXNFbXB0eShiKSk7XG4gICAgZm9yIChjb25zdCBpZ25vcmVkSG9zdCBvZiBpZ25vcmVkSG9zdHMpIHtcbiAgICAgIGlmIChpZ25vcmVkSG9zdCA9PT0gJ2Fib3V0OmJsYW5rJyAmJiB1cmwgPT09ICdhYm91dDpibGFuaycpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGhvc3RuYW1lID0gbmV3IFVSTCh1cmwpLmhvc3RuYW1lO1xuICAgICAgICAgIGlmIChob3N0bmFtZSA9PT0gaWdub3JlZEhvc3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoaWduKSB7XG4gICAgICAgICAgLy8gZG8gbm90aGluZyBpZiBpbnZhbGlkIFVSTFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcGFnZSBvZiBwYWdlQXJyYXkpIHtcbiAgICBjb25zdCBpZCA9IHBhZ2UuaWQudG9TdHJpbmcoKTtcbiAgICBuZXdJZHMucHVzaChpZCk7XG4gICAgaWYgKHBhZ2UuaXNLZXkpIHtcbiAgICAgIGtleUlkID0gaWQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRleHRJZCA9IGAke2FwcElkS2V5fS4ke2lkfWA7XG5cbiAgICAvLyBhZGQgaWYgdGhpcyBpcyBhIG5ldyBwYWdlXG4gICAgaWYgKCFfLmluY2x1ZGVzKHRoaXMuY29udGV4dHMsIGNvbnRleHRJZCkpIHtcbiAgICAgIGlmIChpc1VybElnbm9yZWQocGFnZS51cmwsIHRoaXMub3B0cy5zYWZhcmlJZ25vcmVXZWJIb3N0bmFtZXMpKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYE5vdCB0cmFja2luZyAnJHtwYWdlLnVybH0nIHBhZ2UgYmVjYXVzZSBpdCBpcyBibGFja2xpc3RlZC4gYCArXG4gICAgICAgICAgYCdzYWZhcmlJZ25vcmVXZWJIb3N0bmFtZXMnPSR7dGhpcy5vcHRzLnNhZmFyaUlnbm9yZVdlYkhvc3RuYW1lc31gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1BhZ2VzLnB1c2goaWQpO1xuICAgICAgICB0aGlzLmNvbnRleHRzLnB1c2goY29udGV4dElkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIWtleUlkKSB7XG4gICAgLy8gaWYgdGhlcmUgaXMgbm8ga2V5IGlkLCBwdWxsIHRoZSBmaXJzdCBpZCBmcm9tIHRoZSBwYWdlIGFycmF5IGFuZCB1c2UgdGhhdFxuICAgIC8vIGFzIGEgc3RhbmQgaW5cbiAgICB0aGlzLmxvZy5kZWJ1ZygnTm8ga2V5IGlkIGZvdW5kLiBDaG9vc2luZyBmaXJzdCBpZCBmcm9tIHBhZ2UgYXJyYXknKTtcbiAgICBrZXlJZCA9IG5ld0lkc1swXSB8fCBudWxsO1xuICB9XG5cbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKHRoaXMuY3VyQ29udGV4dCkpIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnV2UgZG8gbm90IGFwcGVhciB0byBoYXZlIHdpbmRvdyBzZXQgeWV0LCBpZ25vcmluZycpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IFtjdXJBcHBJZEtleSwgY3VyUGFnZUlkS2V5XSA9IHRoaXMuY3VyQ29udGV4dC5zcGxpdCgnLicpO1xuXG4gIGlmIChjdXJBcHBJZEtleSAhPT0gYXBwSWRLZXkpIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnUGFnZSBjaGFuZ2Ugbm90IHJlZmVycmluZyB0byBjdXJyZW50bHkgc2VsZWN0ZWQgYXBwLCBpZ25vcmluZy4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgbmV3UGFnZSA9IG51bGw7XG4gIGlmIChuZXdQYWdlcy5sZW5ndGgpIHtcbiAgICBuZXdQYWdlID0gXy5sYXN0KG5ld1BhZ2VzKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgV2UgaGF2ZSBuZXcgcGFnZXMsIHNlbGVjdGluZyBwYWdlICcke25ld1BhZ2V9J2ApO1xuICB9IGVsc2UgaWYgKCFfLmluY2x1ZGVzKG5ld0lkcywgY3VyUGFnZUlkS2V5KSkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdOZXcgcGFnZSBsaXN0aW5nIGZyb20gcmVtb3RlIGRlYnVnZ2VyIGRvZXMgbm90IGNvbnRhaW4gJyArXG4gICAgICAgICAgICAgICAgICdjdXJyZW50IHdpbmRvdzsgYXNzdW1pbmcgaXQgaXMgY2xvc2VkJyk7XG4gICAgaWYgKCF1dGlsLmhhc1ZhbHVlKGtleUlkKSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3IoJ0RvIG5vdCBoYXZlIG91ciBjdXJyZW50IHdpbmRvdyBhbnltb3JlLCBhbmQgdGhlcmUgJyArXG4gICAgICAgICAgICAgICAgICAgJ2FyZSBub3QgYW55IG1vcmUgdG8gbG9hZCEgRG9pbmcgbm90aGluZy4uLicpO1xuICAgICAgdGhpcy5zZXRDdXJyZW50VXJsKHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2cuZGVidWcoYERlYnVnZ2VyIGFscmVhZHkgc2VsZWN0ZWQgcGFnZSAnJHtrZXlJZH0nLCBgICtcbiAgICAgICAgICAgICAgICAgYGNvbmZpcm1pbmcgdGhhdCBjaG9pY2UuYCk7XG4gICAgdGhpcy5jdXJDb250ZXh0ID0gYCR7YXBwSWRLZXl9LiR7a2V5SWR9YDtcbiAgICBuZXdQYWdlID0ga2V5SWQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gYXQgdGhpcyBwb2ludCwgdGhlcmUgYXJlIG5vIG5ldyBwYWdlcywgYW5kIHRoZSBjdXJyZW50IHBhZ2Ugc3RpbGwgZXhpc3RzXG4gICAgdGhpcy5sb2cuZGVidWcoJ0NoZWNraW5nIGlmIHBhZ2UgbmVlZHMgdG8gbG9hZCcpO1xuICAgIC8vIElmIGEgd2luZG93IG5hdmlnYXRlcyB0byBhbiBhbmNob3IgaXQgZG9lc24ndCBhbHdheXMgZmlyZSBhIHBhZ2VcbiAgICAvLyBjYWxsYmFjayBldmVudC4gTGV0J3MgY2hlY2sgaWYgd2Ugd291bmQgdXAgaW4gc3VjaCBhIHNpdHVhdGlvbi5cbiAgICBjb25zdCBuZWVkc1BhZ2VMb2FkID0gKCgpID0+IHtcbiAgICAgIC8vIG5lZWQgdG8gbWFwIHRoZSBwYWdlIGlkcyB0byBjb250ZXh0IGlkc1xuICAgICAgY29uc3QgY29udGV4dEFycmF5ID0gXy5tYXAocGFnZUFycmF5LCAocGFnZSkgPT4gYCR7YXBwSWRLZXl9LiR7cGFnZS5pZH1gKTtcbiAgICAgIC8vIGNoZWNrIGlmIHRoZSBjdXJyZW50IGNvbnRleHQgZXhpc3RzIGluIGJvdGggb3VyIHJlY29yZGVkIGNvbnRleHRzLFxuICAgICAgLy8gYW5kIHRoZSBwYWdlIGFycmF5XG4gICAgICByZXR1cm4gIV8uaXNFcXVhbChfLmZpbmQodGhpcy5jb250ZXh0cywgdGhpcy5jdXJDb250ZXh0KSwgXy5maW5kKGNvbnRleHRBcnJheSwgdGhpcy5jdXJDb250ZXh0KSk7XG4gICAgfSkoKTtcblxuICAgIGlmIChuZWVkc1BhZ2VMb2FkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnUGFnZSBsb2FkIG5lZWRlZC4gTG9hZGluZy4uLicpO1xuICAgICAgYXdhaXQgdGhpcy5yZW1vdGUucGFnZUxvYWQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZy5kZWJ1ZygnTmV3IHBhZ2UgbGlzdGluZyBpcyBzYW1lIGFzIG9sZCwgZG9pbmcgbm90aGluZycpO1xuICB9XG5cbiAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIHBhZ2UgbGlzdGluZyBpc24ndCBpbmRpY2F0aW5nIGEgcmVkaXJlY3RcbiAgaWYgKHV0aWwuaGFzVmFsdWUodGhpcy5jdXJDb250ZXh0KSkge1xuICAgIGxldCBjdXJyZW50UGFnZUlkID0gcGFyc2VJbnQoXy5sYXN0KHRoaXMuY3VyQ29udGV4dC5zcGxpdCgnLicpKSwgMTApO1xuICAgIGxldCBwYWdlID0gXy5maW5kKHBhZ2VBcnJheSwgKHApID0+IHBhcnNlSW50KHAuaWQsIDEwKSA9PT0gY3VycmVudFBhZ2VJZCk7XG4gICAgaWYgKHBhZ2UgJiYgcGFnZS51cmwgIT09IHRoaXMuZ2V0Q3VycmVudFVybCgpKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgUmVkaXJlY3RlZCBmcm9tICcke3RoaXMuZ2V0Q3VycmVudFVybCgpfScgdG8gJyR7cGFnZS51cmx9J2ApO1xuICAgICAgdGhpcy5zZXRDdXJyZW50VXJsKHBhZ2UudXJsKTtcbiAgICB9XG4gIH1cblxuICBpZiAodXRpbC5oYXNWYWx1ZShuZXdQYWdlKSkge1xuICAgIHRoaXMuc2VsZWN0aW5nTmV3UGFnZSA9IHRydWU7XG4gICAgY29uc3Qgb2xkQ29udGV4dCA9IHRoaXMuY3VyQ29udGV4dDtcbiAgICB0aGlzLmN1ckNvbnRleHQgPSBgJHthcHBJZEtleX0uJHtuZXdQYWdlfWA7XG4gICAgLy8gZG8gbm90IHdhaXQsIGFzIHRoaXMgY2FuIHRha2UgYSBsb25nIHRpbWUsIGFuZCB0aGUgcmVzcG9uc2UgaXMgbm90IG5lY2Vzc2FyeVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL3ByZWZlci1hd2FpdC10by1jYWxsYmFja3MsIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLXRoZW5cbiAgICB0aGlzLnJlbW90ZS5zZWxlY3RQYWdlKGFwcElkS2V5LCBwYXJzZUludChuZXdQYWdlLCAxMCkpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIHRoaXMubG9nLndhcm4oYEZhaWxlZCB0byBzZWxlY3QgcGFnZTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIHRoaXMuY3VyQ29udGV4dCA9IG9sZENvbnRleHQ7XG4gICAgfSk7XG4gICAgdGhpcy5zZWxlY3RpbmdOZXdQYWdlID0gZmFsc2U7XG4gIH1cbiAgdGhpcy53aW5kb3dIYW5kbGVDYWNoZSA9IHBhZ2VBcnJheTtcbn07XG5cblxuT2JqZWN0LmFzc2lnbihjb21tYW5kcywgZXh0ZW5zaW9ucywgaGVscGVycyk7XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxVQUFVLEdBQUcsWUFBbkI7QUFDQSxNQUFNQyxXQUFXLEdB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