appium-uiautomator2-driver 1.70.0 → 1.73.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/build/lib/commands/general.js +7 -1
- package/build/lib/commands/gestures.js +14 -6
- package/build/lib/driver.js +17 -12
- package/build/lib/uiautomator2.js +2 -1
- package/lib/commands/general.js +6 -0
- package/lib/commands/gestures.js +29 -4
- package/lib/driver.js +27 -11
- package/lib/uiautomator2.js +1 -0
- package/package.json +5 -5
- package/lib/.DS_Store +0 -0
package/README.md
CHANGED
|
@@ -161,6 +161,7 @@ appium:extractChromeAndroidPackageFromContextName | If set to `true`, tell chrom
|
|
|
161
161
|
appium:showChromedriverLog | If set to `true` then all the output from chromedriver binary will be forwarded to the Appium server log. `false` by default.
|
|
162
162
|
pageLoadStrategy | One of the available page load strategies. See https://www.w3.org/TR/webdriver/#capabilities
|
|
163
163
|
appium:chromeOptions | A mapping, that allows to customize chromedriver options. See https://chromedriver.chromium.org/capabilities for the list of available entries.
|
|
164
|
+
appium:chromeLoggingPrefs | Chrome logging preferences mapping. Basically the same as [goog:loggingPrefs](https://newbedev.com/getting-console-log-output-from-chrome-with-selenium-python-api-bindings). It is set to `{"browser": "ALL"}` by default.
|
|
164
165
|
|
|
165
166
|
### Other
|
|
166
167
|
|
|
@@ -210,7 +211,7 @@ id | This strategy is mapped to the native UiAutomator's `By.res` [locator](http
|
|
|
210
211
|
accessibilityId | This strategy is mapped to the native UiAutomator's `By.desc` [locator](https://developer.android.com/reference/androidx/test/uiautomator/BySelector#desc(java.lang.String)) (exact match of element's content description). | 'my description'
|
|
211
212
|
className | This strategy is mapped to the native UiAutomator's `By.clazz` [locator](https://developer.android.com/reference/androidx/test/uiautomator/BySelector#clazz(java.lang.String)) (exact match of element's class). | 'android.view.View'
|
|
212
213
|
android uiautomator | This strategy is mapped to the native UiAutomator's `UiSelector` [locator](https://developer.android.com/reference/androidx/test/uiautomator/UiSelector)). It is even possible to perform some advanced operations, like scrolling, with this locator type | `new UiScrollable(new UiSelector().resourceId(\"android:id/list\")).scrollIntoView(new UiSelector().text(\"Radio Group\"))`
|
|
213
|
-
xpath | For elements lookup Xpath strategy the driver uses the same XML tree that is generated by page source API. Only Xpath 1.0 is supported. | `By.xpath("//android.view.View[@text=\"Regular\" and @checkable=\"true\"]")`
|
|
214
|
+
xpath | For elements lookup Xpath strategy the driver uses the same XML tree that is generated by page source API. Only Xpath 1.0 is supported for appium-uiatomator2-server versions below 4.25.0. All server versions starting from 4.25.0 support both Xpath 1.0 and 2.0 | `By.xpath("//android.view.View[@text=\"Regular\" and @checkable=\"true\"]")`
|
|
214
215
|
|
|
215
216
|
|
|
216
217
|
## Parallel Tests
|
|
@@ -316,6 +317,7 @@ UiAutomator2 provides several extensions that allow to automate popular mobile g
|
|
|
316
317
|
- mobile: dragGesture
|
|
317
318
|
- mobile: flingGesture
|
|
318
319
|
- mobile: doubleClickGesture
|
|
320
|
+
- mobile: clickGesture
|
|
319
321
|
- mobile: longClickGesture
|
|
320
322
|
- mobile: pinchCloseGesture
|
|
321
323
|
- mobile: pinchOpenGesture
|
|
@@ -682,7 +684,7 @@ Name | Type | Required | Description | Example
|
|
|
682
684
|
intent | string | no | The full name of the intent to broadcast | `com.some.package.name/.YourIntentClassName`
|
|
683
685
|
user | number or string | no | Specify which user to send to; if not specified then send to all users. Possible values are `all`/`current`/`<numeric user id>` | current
|
|
684
686
|
receiverPermission | string | no | Require receiver to hold the given permission | android.permission.READ_PROFILE
|
|
685
|
-
allowBackgroundActivityStarts |
|
|
687
|
+
allowBackgroundActivityStarts | boolean | no | The receiver may start activities even if in the background if set to `true` | false
|
|
686
688
|
action | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | android.intent.action.MAIN
|
|
687
689
|
uri | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | https://appium.io
|
|
688
690
|
mimeType | string | no | See the documentation for [startActivity extension](#mobile-startactivity) | application/json
|
|
@@ -102,6 +102,10 @@ commands.getStrings = async function (language) {
|
|
|
102
102
|
}
|
|
103
103
|
};
|
|
104
104
|
|
|
105
|
+
commands.getDisplayDensity = async function getDisplayDensity() {
|
|
106
|
+
return await this.uiautomator2.jwproxy.command('/appium/device/display_density', 'GET', {});
|
|
107
|
+
};
|
|
108
|
+
|
|
105
109
|
commands.getWindowSize = async function () {
|
|
106
110
|
return await this.uiautomator2.jwproxy.command('/window/current/size', 'GET', {});
|
|
107
111
|
};
|
|
@@ -126,6 +130,7 @@ extensions.executeMobile = async function (mobileCommand, opts = {}) {
|
|
|
126
130
|
dragGesture: 'mobileDragGesture',
|
|
127
131
|
flingGesture: 'mobileFlingGesture',
|
|
128
132
|
doubleClickGesture: 'mobileDoubleClickGesture',
|
|
133
|
+
clickGesture: 'mobileClickGesture',
|
|
129
134
|
longClickGesture: 'mobileLongClickGesture',
|
|
130
135
|
pinchCloseGesture: 'mobilePinchCloseGesture',
|
|
131
136
|
pinchOpenGesture: 'mobilePinchOpenGesture',
|
|
@@ -239,6 +244,7 @@ helpers.wrapBootstrapDisconnect = async function (wrapped) {
|
|
|
239
244
|
helpers.suspendChromedriverProxy = function () {
|
|
240
245
|
this.chromedriver = null;
|
|
241
246
|
this.proxyReqRes = this.uiautomator2.proxyReqRes.bind(this.uiautomator2);
|
|
247
|
+
this.proxyCommand = this.uiautomator2.proxyCommand.bind(this.uiautomator2);
|
|
242
248
|
this.jwpProxyActive = true;
|
|
243
249
|
};
|
|
244
250
|
|
|
@@ -272,4 +278,4 @@ var _default = extensions;
|
|
|
272
278
|
exports.default = _default;require('source-map-support').install();
|
|
273
279
|
|
|
274
280
|
|
|
275
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIl0sIm5hbWVzIjpbImV4dGVuc2lvbnMiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJnZXRQYWdlU291cmNlIiwidWlhdXRvbWF0b3IyIiwiandwcm94eSIsImNvbW1hbmQiLCJnZXRDbGlwYm9hcmQiLCJhZGIiLCJnZXRBcGlMZXZlbCIsImRvU2VuZEtleXMiLCJwYXJhbXMiLCJrZXlldmVudCIsImtleWNvZGUiLCJtZXRhc3RhdGUiLCJsb2ciLCJkZWJ1ZyIsImJhY2siLCJnZXRTdHJpbmdzIiwibGFuZ3VhZ2UiLCJnZXREZXZpY2VMYW5ndWFnZSIsImluZm8iLCJwcmVwcm9jZXNzU3RyaW5nc01hcCIsIm1hcHBpbmciLCJyZXN1bHQiLCJrZXkiLCJ2YWx1ZSIsIl8iLCJ0b1BhaXJzIiwiaXNTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiYXBrU3RyaW5ncyIsIm9wdHMiLCJhcHAiLCJhcHBQYWNrYWdlIiwiZXJyb3JBbmRUaHJvdyIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInB1bGxBcGsiLCJlcnIiLCJtZXNzYWdlIiwiZnMiLCJleGlzdHMiLCJleHRyYWN0U3RyaW5nc0Zyb21BcGsiLCJyaW1yYWYiLCJnZXRXaW5kb3dTaXplIiwiZ2V0V2luZG93UmVjdCIsIndpZHRoIiwiaGVpZ2h0IiwieCIsInkiLCJleGVjdXRlTW9iaWxlIiwibW9iaWxlQ29tbWFuZCIsIm1vYmlsZUNvbW1hbmRzTWFwcGluZyIsInNoZWxsIiwiZXhlY0VtdUNvbnNvbGVDb21tYW5kIiwiZHJhZ0dlc3R1cmUiLCJmbGluZ0dlc3R1cmUiLCJkb3VibGVDbGlja0dlc3R1cmUiLCJsb25nQ2xpY2tHZXN0dXJlIiwicGluY2hDbG9zZUdlc3R1cmUiLCJwaW5jaE9wZW5HZXN0dXJlIiwic3dpcGVHZXN0dXJlIiwic2Nyb2xsR2VzdHVyZSIsInNjcm9sbEJhY2tUbyIsInNjcm9sbCIsInZpZXdwb3J0U2NyZWVuc2hvdCIsInZpZXdwb3J0UmVjdCIsImRlZXBMaW5rIiwic3RhcnRMb2dzQnJvYWRjYXN0Iiwic3RvcExvZ3NCcm9hZGNhc3QiLCJhY2NlcHRBbGVydCIsImRpc21pc3NBbGVydCIsImJhdHRlcnlJbmZvIiwiZGV2aWNlSW5mbyIsImdldERldmljZVRpbWUiLCJjaGFuZ2VQZXJtaXNzaW9ucyIsImdldFBlcm1pc3Npb25zIiwicGVyZm9ybUVkaXRvckFjdGlvbiIsInN0YXJ0U2NyZWVuU3RyZWFtaW5nIiwic3RvcFNjcmVlblN0cmVhbWluZyIsImdldE5vdGlmaWNhdGlvbnMiLCJsaXN0U21zIiwidHlwZSIsInNlbnNvclNldCIsImRlbGV0ZUZpbGUiLCJjbGVhckFwcCIsInN0YXJ0QWN0aXZpdHkiLCJzdGFydFNlcnZpY2UiLCJzdG9wU2VydmljZSIsImJyb2FkY2FzdCIsImdldENvbnRleHRzIiwiaW5zdGFsbE11bHRpcGxlQXBrcyIsInVubG9jayIsImhhcyIsImVycm9ycyIsIlVua25vd25Db21tYW5kRXJyb3IiLCJrZXlzIiwibW9iaWxlVmlld3BvcnRTY3JlZW5zaG90IiwiZ2V0Vmlld3BvcnRTY3JlZW5zaG90IiwibW9iaWxlVmlld1BvcnRSZWN0IiwiZ2V0Vmlld1BvcnRSZWN0Iiwic2V0VXJsIiwidXJsIiwic3RhcnRVcmkiLCJtb2JpbGVEZWVwTGluayIsInBhY2thZ2UiLCJwa2ciLCJ3YWl0Rm9yTGF1bmNoIiwib3Blbk5vdGlmaWNhdGlvbnMiLCJ1cGRhdGVTZXR0aW5ncyIsInNldHRpbmdzIiwiZHJpdmVyT25seVNldHRpbmdzIiwic2VydmVyU2V0dGluZ3MiLCJzZXR0aW5nIiwiQkFTRURSSVZFUl9IQU5ETEVEX1NFVFRJTkdTIiwiaW5jbHVkZXMiLCJpc0VtcHR5IiwidXBkYXRlIiwiZ2V0U2V0dGluZ3MiLCJ3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCIsIndyYXBwZWQiLCJzdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkiLCJjaHJvbWVkcml2ZXIiLCJwcm94eVJlcVJlcyIsImJpbmQiLCJqd3BQcm94eUFjdGl2ZSIsIm1vYmlsZUdldERldmljZUluZm8iLCJtb2JpbGVUeXBlIiwidGV4dCIsImlzVW5kZWZpbmVkIiwidHlwZVVuaWNvZGUiLCJtb2JpbGVJbnN0YWxsTXVsdGlwbGVBcGtzIiwiaXNBcnJheSIsImFwa3MiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsIkIiLCJhbGwiLCJtYXAiLCJjb25maWd1cmVBcHAiLCJBUEtfRVhURU5TSU9OIiwib3B0aW9ucyIsIk9iamVjdCIsImFzc2lnbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxJQUFJQSxVQUFVLEdBQUcsRUFBakI7QUFBQSxJQUNJQyxRQUFRLEdBQUcsRUFEZjtBQUFBLElBRUlDLE9BQU8sR0FBRyxFQUZkOztBQUlBRCxRQUFRLENBQUNFLGFBQVQsR0FBeUIsa0JBQWtCO0FBQ3pDLFNBQU8sTUFBTSxLQUFLQyxZQUFMLENBQWtCQyxPQUFsQixDQUEwQkMsT0FBMUIsQ0FBa0MsU0FBbEMsRUFBNkMsS0FBN0MsRUFBb0QsRUFBcEQsQ0FBYjtBQUNELENBRkQ7O0FBSUFMLFFBQVEsQ0FBQ00sWUFBVCxHQUF3QixrQkFBa0I7QUFDeEMsU0FBUSxPQUFNLEtBQUtDLEdBQUwsQ0FBU0MsV0FBVCxFQUFOLElBQStCLEVBQWhDLEdBQ0YsTUFBTSxLQUFLTCxZQUFMLENBQWtCQyxPQUFsQixDQUEwQkMsT0FBMUIsQ0FBa0MsOEJBQWxDLEVBQWtFLE1BQWxFLEVBQTBFLEVBQTFFLENBREosR0FFRixNQUFNLEtBQUtFLEdBQUwsQ0FBU0QsWUFBVCxFQUZYO0FBR0QsQ0FKRDs7QUFPQU4sUUFBUSxDQUFDUyxVQUFULEdBQXNCLGdCQUFnQkMsTUFBaEIsRUFBd0I7QUFDNUMsUUFBTSxLQUFLUCxZQUFMLENBQWtCQyxPQUFsQixDQUEwQkMsT0FBMUIsQ0FBa0MsT0FBbEMsRUFBMkMsTUFBM0MsRUFBbURLLE1BQW5ELENBQU47QUFDRCxDQUZEOztBQUtBVixRQUFRLENBQUNXLFFBQVQsR0FB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UkQ7O0FBeUNBbEksUUFBUSxDQUFDcUkseUJBQVQsR0FBcUMsZ0JBQWdCckcsSUFBSSxHQUFHLEVBQXZCLEVBQTJCO0FBQzlELE1BQUksQ0FBQ04sZ0JBQUU0RyxPQUFGLENBQVV0RyxJQUFJLENBQUN1RyxJQUFmLENBQUQsSUFBeUI3RyxnQkFBRTRGLE9BQUYsQ0FBVXRGLElBQUksQ0FBQ3VHLElBQWYsQ0FBN0IsRUFBbUQ7QUFDakQsVUFBTSxJQUFJdkMseUJBQU93QyxvQkFBWCxDQUFnQyw4QkFBaEMsQ0FBTjtBQUNEOztBQUNELFFBQU1ELElBQUksR0FBRyxNQUFNRSxrQkFBRUMsR0FBRixDQUFNMUcsSUFBSSxDQUFDdUcsSUFBTCxDQUN0QkksR0FEc0IsQ0FDakIxRyxHQUFELElBQVMsS0FBS2hDLE9BQUwsQ0FBYTJJLFlBQWIsQ0FBMEIzRyxHQUExQixFQUErQixDQUFDNEcseUJBQUQsQ0FBL0IsQ0FEUyxDQUFOLENBQW5CO0FBRUEsUUFBTSxLQUFLdEksR0FBTCxDQUFTc0YsbUJBQVQsQ0FBNkIwQyxJQUE3QixFQUFtQ3ZHLElBQUksQ0FBQzhHLE9BQXhDLENBQU47QUFDRCxDQVBEOztBQVNBQyxNQUFNLENBQUNDLE1BQVAsQ0FBY2pKLFVBQWQsRUFBMEJDLFFBQTFCLEVBQW9DQyxPQUFwQztlQUVlRixVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IGVycm9ycywgQkFTRURSSVZFUl9IQU5ETEVEX1NFVFRJTkdTIH0gZnJvbSAnYXBwaXVtLWJhc2UtZHJpdmVyJztcbmltcG9ydCB7IGZzLCB0ZW1wRGlyIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHsgQVBLX0VYVEVOU0lPTiB9IGZyb20gJy4uL2V4dGVuc2lvbnMnO1xuXG5sZXQgZXh0ZW5zaW9ucyA9IHt9LFxuICAgIGNvbW1hbmRzID0ge30sXG4gICAgaGVscGVycyA9IHt9O1xuXG5jb21tYW5kcy5nZXRQYWdlU291cmNlID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvc291cmNlJywgJ0dFVCcsIHt9KTtcbn07XG5cbmNvbW1hbmRzLmdldENsaXBib2FyZCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpIDwgMjkpXG4gICAgPyAoYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2RldmljZS9nZXRfY2xpcGJvYXJkJywgJ1BPU1QnLCB7fSkpXG4gICAgOiAoYXdhaXQgdGhpcy5hZGIuZ2V0Q2xpcGJvYXJkKCkpO1xufTtcblxuLy8gTmVlZCB0byBvdmVycmlkZSB0aGlzIGZvciBjb3JyZWN0IHVuaWNvZGUgc3VwcG9ydFxuY29tbWFuZHMuZG9TZW5kS2V5cyA9IGFzeW5jIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcva2V5cycsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbi8vIHVpYXV0b21hdG9yMiBkb2Vzbid0IHN1cHBvcnQgbWV0YXN0YXRlIGZvciBrZXlldmVudHNcbmNvbW1hbmRzLmtleWV2ZW50ID0gYXN5bmMgZnVuY3Rpb24gKGtleWNvZGUsIG1ldGFzdGF0ZSkge1xuICBsb2cuZGVidWcoYElnbm9yaW5nIG1ldGFzdGF0ZSAke21ldGFzdGF0ZX1gKTtcbiAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoa2V5Y29kZSk7XG59O1xuXG4vLyBVc2UgQURCIHNpbmNlIHdlIGRvbid0IGhhdmUgVWlBdXRvbWF0b3JcbmNvbW1hbmRzLmJhY2sgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGF3YWl0IHRoaXMuYWRiLmtleWV2ZW50KDQpO1xufTtcblxuY29tbWFuZHMuZ2V0U3RyaW5ncyA9IGFzeW5jIGZ1bmN0aW9uIChsYW5ndWFnZSkge1xuICBpZiAoIWxhbmd1YWdlKSB7XG4gICAgbGFuZ3VhZ2UgPSBhd2FpdCB0aGlzLmFkYi5nZXREZXZpY2VMYW5ndWFnZSgpO1xuICAgIGxvZy5pbmZvKGBObyBsYW5ndWFnZSBzcGVjaWZpZWQsIHJldHVybmluZyBzdHJpbmdzIGZvcjogJHtsYW5ndWFnZX1gKTtcbiAgfVxuXG4gIC8vIENsaWVudHMgcmVxdWlyZSB0aGUgcmVzdWx0aW5nIG1hcHBpbmcgdG8gaGF2ZSBib3RoIGtleXNcbiAgLy8gYW5kIHZhbHVlcyBvZiB0eXBlIHN0cmluZ1xuICBjb25zdCBwcmVwcm9jZXNzU3RyaW5nc01hcCA9IGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKG1hcHBpbmcpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IF8uaXNTdHJpbmcodmFsdWUpID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgaWYgKHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0pIHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIHN0cmluZ3NcbiAgICByZXR1cm4gcHJlcHJvY2Vzc1N0cmluZ3NNYXAodGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSk7XG4gIH1cblxuICBpZiAoIXRoaXMub3B0cy5hcHAgJiYgIXRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coXCJPbmUgb2YgJ2FwcCcgb3IgJ2FwcFBhY2thZ2UnIGNhcGFiaWxpdGllcyBzaG91bGQgbXVzdCBiZSBzcGVjaWZpZWRcIik7XG4gIH1cblxuICBsZXQgYXBwID0gdGhpcy5vcHRzLmFwcDtcbiAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICB0cnkge1xuICAgIGlmICghYXBwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhcHAgPSBhd2FpdCB0aGlzLmFkYi5wdWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlLCB0bXBSb290KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgRmFpbGVkIHRvIHB1bGwgYW4gYXBrIGZyb20gJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFhd2FpdCBmcy5leGlzdHMoYXBwKSkge1xuICAgICAgbG9nLmVycm9yQW5kVGhyb3coYFRoZSBhcHAgYXQgJyR7YXBwfScgZG9lcyBub3QgZXhpc3RgKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qge2Fwa1N0cmluZ3N9ID0gYXdhaXQgdGhpcy5hZGIuZXh0cmFjdFN0cmluZ3NGcm9tQXBrKGFwcCwgbGFuZ3VhZ2UsIHRtcFJvb3QpO1xuICAgICAgdGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSA9IGFwa1N0cmluZ3M7XG4gICAgICByZXR1cm4gcHJlcHJvY2Vzc1N0cmluZ3NNYXAoYXBrU3RyaW5ncyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgQ2Fubm90IGV4dHJhY3Qgc3RyaW5ncyBmcm9tICcke2FwcH0nLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICB9XG59O1xuXG4vLyBtZW1vaXplZCBpbiBjb25zdHJ1Y3RvclxuY29tbWFuZHMuZ2V0V2luZG93U2l6ZSA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL3dpbmRvdy9jdXJyZW50L3NpemUnLCAnR0VUJywge30pO1xufTtcblxuLy8gRm9yIFczQ1xuY29tbWFuZHMuZ2V0V2luZG93UmVjdCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gYXdhaXQgdGhpcy5nZXRXaW5kb3dTaXplKCk7XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgfTtcbn07XG5cbmV4dGVuc2lvbnMuZXhlY3V0ZU1vYmlsZSA9IGFzeW5jIGZ1bmN0aW9uIChtb2JpbGVDb21tYW5kLCBvcHRzID0ge30pIHtcbiAgY29uc3QgbW9iaWxlQ29tbWFuZHNNYXBwaW5nID0ge1xuICAgIHNoZWxsOiAnbW9iaWxlU2hlbGwnLFxuXG4gICAgZXhlY0VtdUNvbnNvbGVDb21tYW5kOiAnbW9iaWxlRXhlY0VtdUNvbnNvbGVDb21tYW5kJyxcblxuICAgIGRyYWdHZXN0dXJlOiAnbW9iaWxlRHJhZ0dlc3R1cmUnLFxuICAgIGZsaW5nR2VzdHVyZTogJ21vYmlsZUZsaW5nR2VzdHVyZScsXG4gICAgZG91YmxlQ2xpY2tHZXN0dXJlOiAnbW9iaWxlRG91YmxlQ2xpY2tHZXN0dXJlJyxcbiAgICBsb25nQ2xpY2tHZXN0dXJlOiAnbW9iaWxlTG9uZ0NsaWNrR2VzdHVyZScsXG4gICAgcGluY2hDbG9zZUdlc3R1cmU6ICdtb2JpbGVQaW5jaENsb3NlR2VzdHVyZScsXG4gICAgcGluY2hPcGVuR2VzdHVyZTogJ21vYmlsZVBpbmNoT3Blbkdlc3R1cmUnLFxuICAgIHN3aXBlR2VzdHVyZTogJ21vYmlsZVN3aXBlR2VzdHVyZScsXG4gICAgc2Nyb2xsR2VzdHVyZTogJ21vYmlsZVNjcm9sbEdlc3R1cmUnLFxuICAgIHNjcm9sbEJhY2tUbzogJ21vYmlsZVNjcm9sbEJhY2tUbycsXG4gICAgc2Nyb2xsOiAnbW9iaWxlU2Nyb2xsJyxcbiAgICB2aWV3cG9ydFNjcmVlbnNob3Q6ICdtb2JpbGVWaWV3cG9ydFNjcmVlbnNob3QnLFxuICAgIHZpZXdwb3J0UmVjdDogJ21vYmlsZVZpZXdQb3J0UmVjdCcsXG5cbiAgICBkZWVwTGluazogJ21vYmlsZURlZXBMaW5rJyxcblxuICAgIHN0YXJ0TG9nc0Jyb2FkY2FzdDogJ21vYmlsZVN0YXJ0TG9nc0Jyb2FkY2FzdCcsXG4gICAgc3RvcExvZ3NCcm9hZGNhc3Q6ICdtb2JpbGVTdG9wTG9nc0Jyb2FkY2FzdCcsXG5cbiAgICBhY2NlcHRBbGVydDogJ21vYmlsZUFjY2VwdEFsZXJ0JyxcbiAgICBkaXNtaXNzQWxlcnQ6ICdtb2JpbGVEaXNtaXNzQWxlcnQnLFxuXG4gICAgYmF0dGVyeUluZm86ICdtb2JpbGVHZXRCYXR0ZXJ5SW5mbycsXG5cbiAgICBkZXZpY2VJbmZvOiAnbW9iaWxlR2V0RGV2aWNlSW5mbycsXG5cbiAgICBnZXREZXZpY2VUaW1lOiAnbW9iaWxlR2V0RGV2aWNlVGltZScsXG5cbiAgICBjaGFuZ2VQZXJtaXNzaW9uczogJ21vYmlsZUNoYW5nZVBlcm1pc3Npb25zJyxcbiAgICBnZXRQZXJtaXNzaW9uczogJ21vYmlsZUdldFBlcm1pc3Npb25zJyxcblxuICAgIHBlcmZvcm1FZGl0b3JBY3Rpb246ICdtb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uJyxcblxuICAgIHN0YXJ0U2NyZWVuU3RyZWFtaW5nOiAnbW9iaWxlU3RhcnRTY3JlZW5TdHJlYW1pbmcnLFxuICAgIHN0b3BTY3JlZW5TdHJlYW1pbmc6ICdtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nJyxcblxuICAgIGdldE5vdGlmaWNhdGlvbnM6ICdtb2JpbGVHZXROb3RpZmljYXRpb25zJyxcblxuICAgIGxpc3RTbXM6ICdtb2JpbGVMaXN0U21zJyxcblxuICAgIHR5cGU6ICdtb2JpbGVUeXBlJyxcbiAgICBzZW5zb3JTZXQ6ICdzZW5zb3JTZXQnLFxuXG4gICAgZGVsZXRlRmlsZTogJ21vYmlsZURlbGV0ZUZpbGUnLFxuXG4gICAgY2xlYXJBcHA6ICdtb2JpbGVDbGVhckFwcCcsXG5cbiAgICBzdGFydEFjdGl2aXR5OiAnbW9iaWxlU3RhcnRBY3Rpdml0eScsXG4gICAgc3RhcnRTZXJ2aWNlOiAnbW9iaWxlU3RhcnRTZXJ2aWNlJyxcbiAgICBzdG9wU2VydmljZTogJ21vYmlsZVN0b3BTZXJ2aWNlJyxcbiAgICBicm9hZGNhc3Q6ICdtb2JpbGVCcm9hZGNhc3QnLFxuXG4gICAgZ2V0Q29udGV4dHM6ICdtb2JpbGVHZXRDb250ZXh0cycsXG5cbiAgICBpbnN0YWxsTXVsdGlwbGVBcGtzOiAnbW9iaWxlSW5zdGFsbE11bHRpcGxlQXBrcycsXG5cbiAgICB1bmxvY2s6ICdtb2JpbGVVbmxvY2snLFxuICB9O1xuXG4gIGlmICghXy5oYXMobW9iaWxlQ29tbWFuZHNNYXBwaW5nLCBtb2JpbGVDb21tYW5kKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuVW5rbm93bkNvbW1hbmRFcnJvcihgVW5rbm93biBtb2JpbGUgY29tbWFuZCBcIiR7bW9iaWxlQ29tbWFuZH1cIi4gYCArXG4gICAgICBgT25seSAke18ua2V5cyhtb2JpbGVDb21tYW5kc01hcHBpbmcpfSBjb21tYW5kcyBhcmUgc3VwcG9ydGVkLmApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzW21vYmlsZUNvbW1hbmRzTWFwcGluZ1ttb2JpbGVDb21tYW5kXV0ob3B0cyk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVWaWV3cG9ydFNjcmVlbnNob3QgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldFZpZXdwb3J0U2NyZWVuc2hvdCgpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSZWN0YW5nbGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZWZ0IC0gVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgUmVjdGFuZ2xlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRvcCAtIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgUmVjdGFuZ2xlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIFJlY3RhbmdsZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIFJlY3RhbmdsZS5cbiAqL1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICogQHJldHVybnMge1JlY3RhbmdsZX0gVGhlIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICovXG5jb21tYW5kcy5tb2JpbGVWaWV3UG9ydFJlY3QgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVWaWV3UG9ydFJlY3QgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXRWaWV3UG9ydFJlY3QoKTtcbn07XG5cbmNvbW1hbmRzLnNldFVybCA9IGFzeW5jIGZ1bmN0aW9uICh1cmwpIHtcbiAgYXdhaXQgdGhpcy5hZGIuc3RhcnRVcmkodXJsLCB0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlZXBMaW5rT3B0c1xuICogQHByb3BlcnR5IHshc3RyaW5nfSB1cmwgLSBUaGUgbmFtZSBvZiBVUkwgdG8gc3RhcnQuXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IHBhY2thZ2UgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBzdGFydCB0aGUgVVJJIHdpdGguXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSB3YWl0Rm9yTGF1bmNoIFt0cnVlXSAtIGlmIGBmYWxzZWAgdGhlbiBhZGIgd29uJ3Qgd2FpdFxuICogZm9yIHRoZSBzdGFydGVkIGFjdGl2aXR5IHRvIHJldHVybiB0aGUgY29udHJvbFxuICovXG5cbi8qKlxuICogU3RhcnQgVVJMIHRoYXQgdGFrZSB1c2VycyBkaXJlY3RseSB0byBzcGVjaWZpYyBjb250ZW50IGluIHRoZSBhcHBcbiAqIEBwYXJhbSB7RGVlcExpbmtPcHRzfSBvcHRzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZURlZXBMaW5rID0gYXN5bmMgZnVuY3Rpb24gKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdXJsLFxuICAgIHBhY2thZ2U6IHBrZyxcbiAgICB3YWl0Rm9yTGF1bmNoLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnN0YXJ0VXJpKHVybCwgcGtnLCB7IHdhaXRGb3JMYXVuY2ggfSk7XG59O1xuXG5jb21tYW5kcy5vcGVuTm90aWZpY2F0aW9ucyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2Uvb3Blbl9ub3RpZmljYXRpb25zJywgJ1BPU1QnLCB7fSk7XG59O1xuXG5jb21tYW5kcy51cGRhdGVTZXR0aW5ncyA9IGFzeW5jIGZ1bmN0aW9uIChzZXR0aW5ncykge1xuICAvLyB3ZSBoYXZlIHNvbWUgc2V0dGluZ3MgdGhhdCBhcmUgc2V0IG9uIHRoZSBzZXR0aW5ncyBvYmplY3QgaW4gdGhlIGRyaXZlclxuICAvLyBvbmx5LCBmb3IgZXhhbXBsZSBpbWFnZSBmaW5kaW5nIHNldHRpbmdzLiBUaGUgdWlhdXRvMiBzZXJ2ZXIgZG9lcyBub3Qga25vd1xuICAvLyB3aGF0IHRvIGRvIHdpdGggdGhlbSwgc28ganVzdCBzZXQgdGhlbSBvbiB0aGlzIGRyaXZlcidzIHNldHRpbmdzIGluc3RhbmNlLFxuICAvLyBhbmQgZG9uJ3QgZm9yd2FyZCB0aGVtIHRvIHRoZSBzZXJ2ZXJcbiAgbGV0IGRyaXZlck9ubHlTZXR0aW5ncyA9IHt9O1xuICBsZXQgc2VydmVyU2V0dGluZ3MgPSB7fTtcbiAgZm9yIChsZXQgW3NldHRpbmcsIHZhbHVlXSBvZiBfLnRvUGFpcnMoc2V0dGluZ3MpKSB7XG4gICAgaWYgKEJBU0VEUklWRVJfSEFORExFRF9TRVRUSU5HUy5pbmNsdWRlcyhzZXR0aW5nKSkge1xuICAgICAgZHJpdmVyT25seVNldHRpbmdzW3NldHRpbmddID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlcnZlclNldHRpbmdzW3NldHRpbmddID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIGlmICghXy5pc0VtcHR5KGRyaXZlck9ubHlTZXR0aW5ncykpIHtcbiAgICBsb2cuaW5mbyhgRm91bmQgc29tZSBzZXR0aW5ncyBkZXNpZ25lZCB0byBiZSBoYW5kbGVkIGJ5IEJhc2VEcml2ZXI6IGAgK1xuICAgICAgICAgICAgIGAke0pTT04uc3RyaW5naWZ5KF8ua2V5cyhkcml2ZXJPbmx5U2V0dGluZ3MpKX0uIE5vdCBgICtcbiAgICAgICAgICAgICBgc2VuZGluZyB0aGVzZSBvbiB0byB0aGUgVWlBdXRvbWF0b3IyIHNlcnZlciBhbmQgaW5zdGVhZCBgICtcbiAgICAgICAgICAgICBgc2V0dGluZyBkaXJlY3RseSBvbiB0aGUgZHJpdmVyYCk7XG4gICAgYXdhaXQgdGhpcy5zZXR0aW5ncy51cGRhdGUoZHJpdmVyT25seVNldHRpbmdzKTtcbiAgfVxuICBpZiAoIV8uaXNFbXB0eShzZXJ2ZXJTZXR0aW5ncykpIHtcbiAgICBsb2cuaW5mbygnRm9yd2FyZGluZyB0aGUgZm9sbG93aW5nIHNldHRpbmdzIHRvIHRoZSBVaUF1dG9tYXRvcjIgc2VydmVyOiAnICtcbiAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShfLmtleXMoc2VydmVyU2V0dGluZ3MpKSk7XG4gICAgYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL3NldHRpbmdzJywgJ1BPU1QnLFxuICAgICAge3NldHRpbmdzOiBzZXJ2ZXJTZXR0aW5nc30pO1xuICB9XG59O1xuXG5jb21tYW5kcy5nZXRTZXR0aW5ncyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgLy8gYXMgYWJvdmUsIHdlIG1pZ2h0IGhhdmUgc29tZSBkcml2ZXItb25seSBzZXR0aW5ncyB0byByZXR1cm4gYXMgd2VsbFxuICBjb25zdCBkcml2ZXJPbmx5U2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzLmdldFNldHRpbmdzKCk7XG4gIGNvbnN0IHNlcnZlclNldHRpbmdzID0gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL3NldHRpbmdzJywgJ0dFVCcpO1xuICByZXR1cm4gey4uLmRyaXZlck9ubHlTZXR0aW5ncywgLi4uc2VydmVyU2V0dGluZ3N9O1xufTtcblxuLyoqXG4gKiBPdmVycmlkaW5nIGFwcGl1bS1hbmRyb2lkLWRyaXZlcidzIHdyYXBCb290c3RyYXBEaXNjb25uZWN0LFxuICogdW5saWtlIGluIGFwcGl1bS1hbmRyb2lkLWRyaXZlciBhdm9pZGluZyBhZGIgcmVzdGFydGluZyBhcyBpdCBpbnRlcm5cbiAqIGtpbGxzIFVpQXV0b21hdG9yMiBzZXJ2ZXIgcnVubmluZyBpbiB0aGUgZGV2aWNlLlxuICoqL1xuaGVscGVycy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdCA9IGFzeW5jIGZ1bmN0aW9uICh3cmFwcGVkKSB7XG4gIGF3YWl0IHdyYXBwZWQoKTtcbn07XG5cbi8vIFN0b3AgcHJveHlpbmcgdG8gYW55IENocm9tZWRyaXZlciBhbmQgcmVkaXJlY3QgdG8gdWlhdXRvbWF0b3IyXG5oZWxwZXJzLnN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5jaHJvbWVkcml2ZXIgPSBudWxsO1xuICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy51aWF1dG9tYXRvcjIucHJveHlSZXFSZXMuYmluZCh0aGlzLnVpYXV0b21hdG9yMik7XG4gIHRoaXMuandwUHJveHlBY3RpdmUgPSB0cnVlO1xufTtcblxuLyoqXG4gKiBUaGUgbGlzdCBvZiBhdmFpbGFibGUgaW5mbyBlbnRyaWVzIGNhbiBiZSBmb3VuZCBhdFxuICogaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0tdWlhdXRvbWF0b3IyLXNlcnZlci9ibG9iL21hc3Rlci9hcHAvc3JjL21haW4vamF2YS9pby9hcHBpdW0vdWlhdXRvbWF0b3IyL2hhbmRsZXIvR2V0RGV2aWNlSW5mby5qYXZhXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldERldmljZUluZm8gPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZGV2aWNlL2luZm8nLCAnR0VUJyk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFR5cGluZ09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ3xudW1iZXJ8Ym9vbGVhbn0gdGV4dCAtIFRoZSB0ZXh0IHRvIHR5cGVcbiAqL1xuXG4vKipcbiAqIFR5cGVzIHRoZSBnaXZlbiBVbmljb2RlIHN0cmluZy5cbiAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIGZvY3VzIGlzIGFscmVhZHkgcHV0XG4gKiB0byB0aGUgZGVzdGluYXRpb24gaW5wdXQgZmllbGQgYmVmb3JlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC5cbiAqXG4gKiBAcGFyYW0ge1R5cGluZ09wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGlucHV0IHRleHQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gYWRiXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYHRleHRgIHByb3BlcnR5IGhhcyBub3QgYmVlbiBwcm92aWRlZFxuICovXG5jb21tYW5kcy5tb2JpbGVUeXBlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlVHlwZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB0ZXh0LFxuICB9ID0gb3B0cztcbiAgaWYgKF8uaXNVbmRlZmluZWQodGV4dCkpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlICd0ZXh0JyBhcmd1bWVudCBpcyBtYW5kYXRvcnlgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIudHlwZVVuaWNvZGUodGV4dCk7XG59O1xuXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWxsb3dUZXN0UGFja2FnZXMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGFsbG93IHRlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzIGluc3RhbGxhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlU2RjYXJkIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSB0byBpbnN0YWxsIHRoZSBhcHAgb24gc2RjYXJkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiB0aGUgZGV2aWNlIG1lbW9yeS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyByZXF1ZXN0ZWQgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBhZnRlciB0aGUgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlciBBbmRyb2lkIDYrLlxuICogQHByb3BlcnR5IHtib29sZWFufSByZXBsYWNlIFt0cnVlXSAtIFNldCBpdCB0byBmYWxzZSBpZiB5b3UgZG9uJ3Qgd2FudFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB0byBiZSB1cGdyYWRlZC9yZWluc3RhbGxlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGl0IGlzIGFscmVhZHkgcHJlc2VudCBvbiB0aGUgZGV2aWNlLlxuICogQHByb3BlcnR5IHtib29sZWFufSBwYXJ0aWFsSW5zdGFsbCBbZmFsc2VdIC0gSW5zdGFsbCBhcGtzIHBhcnRpYWxseS4gSXQgaXMgdXNlZCBmb3IgJ2luc3RhbGwtbXVsdGlwbGUnLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2FuZHJvaWQuc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzExMTA2NC93aGF0LWlzLWEtcGFydGlhbC1hcHBsaWNhdGlvbi1pbnN0YWxsLXZpYS1hZGJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEluc3RhbGxNdWx0aXBsZUFwa3NPcHRpb25zXG4gKiBAcHJvcGVydHkge0FycmF5PHN0cmluZz59IGFwa3MgLSBUaGUgbGlzdCBvZiBBUEtzIHRvIGluc3RhbGwuIEVhY2ggQVBLIHNob3VsZCBiZSBhIHBhdGggdG8gYSBhcGtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGRvd25sb2FkYWJsZSBVUkwgYXMgSFRUUC9IVFRQUy5cbiAqIEBwcm9wZXJ0eSB7SW5zdGFsbE9wdGlvbnN9IG9wdGlvbnNcbiAqL1xuXG4vKipcbiAqIEluc3RhbGwgbXVsdGlwbGUgQVBLcyB3aXRoIGBpbnN0YWxsLW11bHRpcGxlYCBvcHRpb24uXG4gKlxuICogQHBhcmFtIHtJbnN0YWxsTXVsdGlwbGVBcGtzT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgaW5zdGFsbGluZyB0aGUgZ2l2ZW4gQVBLcy5cbiAqL1xuY29tbWFuZHMubW9iaWxlSW5zdGFsbE11bHRpcGxlQXBrcyA9IGFzeW5jIGZ1bmN0aW9uIChvcHRzID0ge30pIHtcbiAgaWYgKCFfLmlzQXJyYXkob3B0cy5hcGtzKSB8fCBfLmlzRW1wdHkob3B0cy5hcGtzKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoJ05vIGFwa3MgYXJlIGdpdmVuIHRvIGluc3RhbGwnKTtcbiAgfVxuICBjb25zdCBhcGtzID0gYXdhaXQgQi5hbGwob3B0cy5hcGtzXG4gICAgLm1hcCgoYXBwKSA9PiB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKGFwcCwgW0FQS19FWFRFTlNJT05dKSkpO1xuICBhd2FpdCB0aGlzLmFkYi5pbnN0YWxsTXVsdGlwbGVBcGtzKGFwa3MsIG9wdHMub3B0aW9ucyk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcblxuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJmaWxlIjoibGliL2NvbW1hbmRzL2dlbmVyYWwuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
|
281
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIl0sIm5hbWVzIjpbImV4dGVuc2lvbnMiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJnZXRQYWdlU291cmNlIiwidWlhdXRvbWF0b3IyIiwiandwcm94eSIsImNvbW1hbmQiLCJnZXRDbGlwYm9hcmQiLCJhZGIiLCJnZXRBcGlMZXZlbCIsImRvU2VuZEtleXMiLCJwYXJhbXMiLCJrZXlldmVudCIsImtleWNvZGUiLCJtZXRhc3RhdGUiLCJsb2ciLCJkZWJ1ZyIsImJhY2siLCJnZXRTdHJpbmdzIiwibGFuZ3VhZ2UiLCJnZXREZXZpY2VMYW5ndWFnZSIsImluZm8iLCJwcmVwcm9jZXNzU3RyaW5nc01hcCIsIm1hcHBpbmciLCJyZXN1bHQiLCJrZXkiLCJ2YWx1ZSIsIl8iLCJ0b1BhaXJzIiwiaXNTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiYXBrU3RyaW5ncyIsIm9wdHMiLCJhcHAiLCJhcHBQYWNrYWdlIiwiZXJyb3JBbmRUaHJvdyIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInB1bGxBcGsiLCJlcnIiLCJtZXNzYWdlIiwiZnMiLCJleGlzdHMiLCJleHRyYWN0U3RyaW5nc0Zyb21BcGsiLCJyaW1yYWYiLCJnZXREaXNwbGF5RGVuc2l0eSIsImdldFdpbmRvd1NpemUiLCJnZXRXaW5kb3dSZWN0Iiwid2lkdGgiLCJoZWlnaHQiLCJ4IiwieSIsImV4ZWN1dGVNb2JpbGUiLCJtb2JpbGVDb21tYW5kIiwibW9iaWxlQ29tbWFuZHNNYXBwaW5nIiwic2hlbGwiLCJleGVjRW11Q29uc29sZUNvbW1hbmQiLCJkcmFnR2VzdHVyZSIsImZsaW5nR2VzdHVyZSIsImRvdWJsZUNsaWNrR2VzdHVyZSIsImNsaWNrR2VzdHVyZSIsImxvbmdDbGlja0dlc3R1cmUiLCJwaW5jaENsb3NlR2VzdHVyZSIsInBpbmNoT3Blbkdlc3R1cmUiLCJzd2lwZUdlc3R1cmUiLCJzY3JvbGxHZXN0dXJlIiwic2Nyb2xsQmFja1RvIiwic2Nyb2xsIiwidmlld3BvcnRTY3JlZW5zaG90Iiwidmlld3BvcnRSZWN0IiwiZGVlcExpbmsiLCJzdGFydExvZ3NCcm9hZGNhc3QiLCJzdG9wTG9nc0Jyb2FkY2FzdCIsImFjY2VwdEFsZXJ0IiwiZGlzbWlzc0FsZXJ0IiwiYmF0dGVyeUluZm8iLCJkZXZpY2VJbmZvIiwiZ2V0RGV2aWNlVGltZSIsImNoYW5nZVBlcm1pc3Npb25zIiwiZ2V0UGVybWlzc2lvbnMiLCJwZXJmb3JtRWRpdG9yQWN0aW9uIiwic3RhcnRTY3JlZW5TdHJlYW1pbmciLCJzdG9wU2NyZWVuU3RyZWFtaW5nIiwiZ2V0Tm90aWZpY2F0aW9ucyIsImxpc3RTbXMiLCJ0eXBlIiwic2Vuc29yU2V0IiwiZGVsZXRlRmlsZSIsImNsZWFyQXBwIiwic3RhcnRBY3Rpdml0eSIsInN0YXJ0U2VydmljZSIsInN0b3BTZXJ2aWNlIiwiYnJvYWRjYXN0IiwiZ2V0Q29udGV4dHMiLCJpbnN0YWxsTXVsdGlwbGVBcGtzIiwidW5sb2NrIiwiaGFzIiwiZXJyb3JzIiwiVW5rbm93bkNvbW1hbmRFcnJvciIsImtleXMiLCJtb2JpbGVWaWV3cG9ydFNjcmVlbnNob3QiLCJnZXRWaWV3cG9ydFNjcmVlbnNob3QiLCJtb2JpbGVWaWV3UG9ydFJlY3QiLCJnZXRWaWV3UG9ydFJlY3QiLCJzZXRVcmwiLCJ1cmwiLCJzdGFydFVyaSIsIm1vYmlsZURlZXBMaW5rIiwicGFja2FnZSIsInBrZyIsIndhaXRGb3JMYXVuY2giLCJvcGVuTm90aWZpY2F0aW9ucyIsInVwZGF0ZVNldHRpbmdzIiwic2V0dGluZ3MiLCJkcml2ZXJPbmx5U2V0dGluZ3MiLCJzZXJ2ZXJTZXR0aW5ncyIsInNldHRpbmciLCJCQVNFRFJJVkVSX0hBTkRMRURfU0VUVElOR1MiLCJpbmNsdWRlcyIsImlzRW1wdHkiLCJ1cGRhdGUiLCJnZXRTZXR0aW5ncyIsIndyYXBCb290c3RyYXBEaXNjb25uZWN0Iiwid3JhcHBlZCIsInN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSIsImNocm9tZWRyaXZlciIsInByb3h5UmVxUmVzIiwiYmluZCIsInByb3h5Q29tbWFuZCIsImp3cFByb3h5QWN0aXZlIiwibW9iaWxlR2V0RGV2aWNlSW5mbyIsIm1vYmlsZVR5cGUiLCJ0ZXh0IiwiaXNVbmRlZmluZWQiLCJ0eXBlVW5pY29kZSIsIm1vYmlsZUluc3RhbGxNdWx0aXBsZUFwa3MiLCJpc0FycmF5IiwiYXBrcyIsIkludmFsaWRBcmd1bWVudEVycm9yIiwiQiIsImFsbCIsIm1hcCIsImNvbmZpZ3VyZUFwcCIsIkFQS19FWFRFTlNJT04iLCJvcHRpb25zIiwiT2JqZWN0IiwiYXNzaWduIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLElBQUlBLFVBQVUsR0FBRyxFQUFqQjtBQUFBLElBQ0lDLFFBQVEsR0FBRyxFQURmO0FBQUEsSUFFSUMsT0FBTyxHQUFHLEVBRmQ7O0FBSUFELFFBQVEsQ0FBQ0UsYUFBVCxHQUF5QixrQkFBa0I7QUFDekMsU0FBTyxNQUFNLEtBQUtDLFlBQUwsQ0FBa0JDLE9BQWxCLENBQTBCQyxPQUExQixDQUFrQyxTQUFsQyxFQUE2QyxLQUE3QyxFQUFvRCxFQUFwRCxDQUFiO0FBQ0QsQ0FGRDs7QUFJQUwsUUFBUSxDQUFDTSxZQUFULEdBQXdCLGtCQUFrQjtBQUN4QyxTQUFRLE9BQU0sS0FBS0MsR0FBTCxDQUFTQyxXQUFULEVBQU4sSUFBK0IsRUFBaEMsR0FDRixNQUFNLEtBQUtMLFlBQUwsQ0FBa0JDLE9BQWxCLENBQTBCQyxPQUExQixDQUFrQyw4QkFBbEMsRUFBa0UsTUFBbEUsRUFBMEUsRUFBMUUsQ0FESixHQUVGLE1BQU0sS0FBS0UsR0FBTCxDQUFTRCxZQUFULEVBRlg7QUFHRCxDQUpEOztBQU9BTixRQUFRLENBQUNTLFVBQVQsR0FBc0IsZ0JBQWdCQyxNQUFoQixFQUF3QjtBQUM1QyxRQUFNLEtBQUtQLFlBQUwsQ0FBa0JDLE9BQWxCLENBQTBCQyxPQUExQixDQUFrQyxPQUFsQyxFQUEyQyxNQUEzQyxFQUFt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Y2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgZXJyb3JzLCBCQVNFRFJJVkVSX0hBTkRMRURfU0VUVElOR1MgfSBmcm9tICdhcHBpdW0tYmFzZS1kcml2ZXInO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyBBUEtfRVhURU5TSU9OIH0gZnJvbSAnLi4vZXh0ZW5zaW9ucyc7XG5cbmxldCBleHRlbnNpb25zID0ge30sXG4gICAgY29tbWFuZHMgPSB7fSxcbiAgICBoZWxwZXJzID0ge307XG5cbmNvbW1hbmRzLmdldFBhZ2VTb3VyY2UgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9zb3VyY2UnLCAnR0VUJywge30pO1xufTtcblxuY29tbWFuZHMuZ2V0Q2xpcGJvYXJkID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCAyOSlcbiAgICA/IChhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZGV2aWNlL2dldF9jbGlwYm9hcmQnLCAnUE9TVCcsIHt9KSlcbiAgICA6IChhd2FpdCB0aGlzLmFkYi5nZXRDbGlwYm9hcmQoKSk7XG59O1xuXG4vLyBOZWVkIHRvIG92ZXJyaWRlIHRoaXMgZm9yIGNvcnJlY3QgdW5pY29kZSBzdXBwb3J0XG5jb21tYW5kcy5kb1NlbmRLZXlzID0gYXN5bmMgZnVuY3Rpb24gKHBhcmFtcykge1xuICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9rZXlzJywgJ1BPU1QnLCBwYXJhbXMpO1xufTtcblxuLy8gdWlhdXRvbWF0b3IyIGRvZXNuJ3Qgc3VwcG9ydCBtZXRhc3RhdGUgZm9yIGtleWV2ZW50c1xuY29tbWFuZHMua2V5ZXZlbnQgPSBhc3luYyBmdW5jdGlvbiAoa2V5Y29kZSwgbWV0YXN0YXRlKSB7XG4gIGxvZy5kZWJ1ZyhgSWdub3JpbmcgbWV0YXN0YXRlICR7bWV0YXN0YXRlfWApO1xuICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudChrZXljb2RlKTtcbn07XG5cbi8vIFVzZSBBREIgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBVaUF1dG9tYXRvclxuY29tbWFuZHMuYmFjayA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoNCk7XG59O1xuXG5jb21tYW5kcy5nZXRTdHJpbmdzID0gYXN5bmMgZnVuY3Rpb24gKGxhbmd1YWdlKSB7XG4gIGlmICghbGFuZ3VhZ2UpIHtcbiAgICBsYW5ndWFnZSA9IGF3YWl0IHRoaXMuYWRiLmdldERldmljZUxhbmd1YWdlKCk7XG4gICAgbG9nLmluZm8oYE5vIGxhbmd1YWdlIHNwZWNpZmllZCwgcmV0dXJuaW5nIHN0cmluZ3MgZm9yOiAke2xhbmd1YWdlfWApO1xuICB9XG5cbiAgLy8gQ2xpZW50cyByZXF1aXJlIHRoZSByZXN1bHRpbmcgbWFwcGluZyB0byBoYXZlIGJvdGgga2V5c1xuICAvLyBhbmQgdmFsdWVzIG9mIHR5cGUgc3RyaW5nXG4gIGNvbnN0IHByZXByb2Nlc3NTdHJpbmdzTWFwID0gZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMobWFwcGluZykpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gXy5pc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBpZiAodGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSkge1xuICAgIC8vIFJldHVybiBjYWNoZWQgc3RyaW5nc1xuICAgIHJldHVybiBwcmVwcm9jZXNzU3RyaW5nc01hcCh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKTtcbiAgfVxuXG4gIGlmICghdGhpcy5vcHRzLmFwcCAmJiAhdGhpcy5vcHRzLmFwcFBhY2thZ2UpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhcIk9uZSBvZiAnYXBwJyBvciAnYXBwUGFja2FnZScgY2FwYWJpbGl0aWVzIHNob3VsZCBtdXN0IGJlIHNwZWNpZmllZFwiKTtcbiAgfVxuXG4gIGxldCBhcHAgPSB0aGlzLm9wdHMuYXBwO1xuICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gIHRyeSB7XG4gICAgaWYgKCFhcHApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFwcCA9IGF3YWl0IHRoaXMuYWRiLnB1bGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UsIHRtcFJvb3QpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBGYWlsZWQgdG8gcHVsbCBhbiBhcGsgZnJvbSAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhhcHApKSB7XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGFwcCBhdCAnJHthcHB9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7YXBrU3RyaW5nc30gPSBhd2FpdCB0aGlzLmFkYi5leHRyYWN0U3RyaW5nc0Zyb21BcGsoYXBwLCBsYW5ndWFnZSwgdG1wUm9vdCk7XG4gICAgICB0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdID0gYXBrU3RyaW5ncztcbiAgICAgIHJldHVybiBwcmVwcm9jZXNzU3RyaW5nc01hcChhcGtTdHJpbmdzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgZXh0cmFjdCBzdHJpbmdzIGZyb20gJyR7YXBwfScuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5yaW1yYWYodG1wUm9vdCk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLmdldERpc3BsYXlEZW5zaXR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGlzcGxheURlbnNpdHkgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2RldmljZS9kaXNwbGF5X2RlbnNpdHknLCAnR0VUJywge30pO1xufTtcblxuLy8gbWVtb2l6ZWQgaW4gY29uc3RydWN0b3JcbmNvbW1hbmRzLmdldFdpbmRvd1NpemUgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy93aW5kb3cvY3VycmVudC9zaXplJywgJ0dFVCcsIHt9KTtcbn07XG5cbi8vIEZvciBXM0NcbmNvbW1hbmRzLmdldFdpbmRvd1JlY3QgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IGF3YWl0IHRoaXMuZ2V0V2luZG93U2l6ZSgpO1xuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gIH07XG59O1xuXG5leHRlbnNpb25zLmV4ZWN1dGVNb2JpbGUgPSBhc3luYyBmdW5jdGlvbiAobW9iaWxlQ29tbWFuZCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IG1vYmlsZUNvbW1hbmRzTWFwcGluZyA9IHtcbiAgICBzaGVsbDogJ21vYmlsZVNoZWxsJyxcblxuICAgIGV4ZWNFbXVDb25zb2xlQ29tbWFuZDogJ21vYmlsZUV4ZWNFbXVDb25zb2xlQ29tbWFuZCcsXG5cbiAgICBkcmFnR2VzdHVyZTogJ21vYmlsZURyYWdHZXN0dXJlJyxcbiAgICBmbGluZ0dlc3R1cmU6ICdtb2JpbGVGbGluZ0dlc3R1cmUnLFxuICAgIGRvdWJsZUNsaWNrR2VzdHVyZTogJ21vYmlsZURvdWJsZUNsaWNrR2VzdHVyZScsXG4gICAgY2xpY2tHZXN0dXJlOiAnbW9iaWxlQ2xpY2tHZXN0dXJlJyxcbiAgICBsb25nQ2xpY2tHZXN0dXJlOiAnbW9iaWxlTG9uZ0NsaWNrR2VzdHVyZScsXG4gICAgcGluY2hDbG9zZUdlc3R1cmU6ICdtb2JpbGVQaW5jaENsb3NlR2VzdHVyZScsXG4gICAgcGluY2hPcGVuR2VzdHVyZTogJ21vYmlsZVBpbmNoT3Blbkdlc3R1cmUnLFxuICAgIHN3aXBlR2VzdHVyZTogJ21vYmlsZVN3aXBlR2VzdHVyZScsXG4gICAgc2Nyb2xsR2VzdHVyZTogJ21vYmlsZVNjcm9sbEdlc3R1cmUnLFxuICAgIHNjcm9sbEJhY2tUbzogJ21vYmlsZVNjcm9sbEJhY2tUbycsXG4gICAgc2Nyb2xsOiAnbW9iaWxlU2Nyb2xsJyxcbiAgICB2aWV3cG9ydFNjcmVlbnNob3Q6ICdtb2JpbGVWaWV3cG9ydFNjcmVlbnNob3QnLFxuICAgIHZpZXdwb3J0UmVjdDogJ21vYmlsZVZpZXdQb3J0UmVjdCcsXG5cbiAgICBkZWVwTGluazogJ21vYmlsZURlZXBMaW5rJyxcblxuICAgIHN0YXJ0TG9nc0Jyb2FkY2FzdDogJ21vYmlsZVN0YXJ0TG9nc0Jyb2FkY2FzdCcsXG4gICAgc3RvcExvZ3NCcm9hZGNhc3Q6ICdtb2JpbGVTdG9wTG9nc0Jyb2FkY2FzdCcsXG5cbiAgICBhY2NlcHRBbGVydDogJ21vYmlsZUFjY2VwdEFsZXJ0JyxcbiAgICBkaXNtaXNzQWxlcnQ6ICdtb2JpbGVEaXNtaXNzQWxlcnQnLFxuXG4gICAgYmF0dGVyeUluZm86ICdtb2JpbGVHZXRCYXR0ZXJ5SW5mbycsXG5cbiAgICBkZXZpY2VJbmZvOiAnbW9iaWxlR2V0RGV2aWNlSW5mbycsXG5cbiAgICBnZXREZXZpY2VUaW1lOiAnbW9iaWxlR2V0RGV2aWNlVGltZScsXG5cbiAgICBjaGFuZ2VQZXJtaXNzaW9uczogJ21vYmlsZUNoYW5nZVBlcm1pc3Npb25zJyxcbiAgICBnZXRQZXJtaXNzaW9uczogJ21vYmlsZUdldFBlcm1pc3Npb25zJyxcblxuICAgIHBlcmZvcm1FZGl0b3JBY3Rpb246ICdtb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uJyxcblxuICAgIHN0YXJ0U2NyZWVuU3RyZWFtaW5nOiAnbW9iaWxlU3RhcnRTY3JlZW5TdHJlYW1pbmcnLFxuICAgIHN0b3BTY3JlZW5TdHJlYW1pbmc6ICdtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nJyxcblxuICAgIGdldE5vdGlmaWNhdGlvbnM6ICdtb2JpbGVHZXROb3RpZmljYXRpb25zJyxcblxuICAgIGxpc3RTbXM6ICdtb2JpbGVMaXN0U21zJyxcblxuICAgIHR5cGU6ICdtb2JpbGVUeXBlJyxcbiAgICBzZW5zb3JTZXQ6ICdzZW5zb3JTZXQnLFxuXG4gICAgZGVsZXRlRmlsZTogJ21vYmlsZURlbGV0ZUZpbGUnLFxuXG4gICAgY2xlYXJBcHA6ICdtb2JpbGVDbGVhckFwcCcsXG5cbiAgICBzdGFydEFjdGl2aXR5OiAnbW9iaWxlU3RhcnRBY3Rpdml0eScsXG4gICAgc3RhcnRTZXJ2aWNlOiAnbW9iaWxlU3RhcnRTZXJ2aWNlJyxcbiAgICBzdG9wU2VydmljZTogJ21vYmlsZVN0b3BTZXJ2aWNlJyxcbiAgICBicm9hZGNhc3Q6ICdtb2JpbGVCcm9hZGNhc3QnLFxuXG4gICAgZ2V0Q29udGV4dHM6ICdtb2JpbGVHZXRDb250ZXh0cycsXG5cbiAgICBpbnN0YWxsTXVsdGlwbGVBcGtzOiAnbW9iaWxlSW5zdGFsbE11bHRpcGxlQXBrcycsXG5cbiAgICB1bmxvY2s6ICdtb2JpbGVVbmxvY2snLFxuICB9O1xuXG4gIGlmICghXy5oYXMobW9iaWxlQ29tbWFuZHNNYXBwaW5nLCBtb2JpbGVDb21tYW5kKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuVW5rbm93bkNvbW1hbmRFcnJvcihgVW5rbm93biBtb2JpbGUgY29tbWFuZCBcIiR7bW9iaWxlQ29tbWFuZH1cIi4gYCArXG4gICAgICBgT25seSAke18ua2V5cyhtb2JpbGVDb21tYW5kc01hcHBpbmcpfSBjb21tYW5kcyBhcmUgc3VwcG9ydGVkLmApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzW21vYmlsZUNvbW1hbmRzTWFwcGluZ1ttb2JpbGVDb21tYW5kXV0ob3B0cyk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVWaWV3cG9ydFNjcmVlbnNob3QgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldFZpZXdwb3J0U2NyZWVuc2hvdCgpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSZWN0YW5nbGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZWZ0IC0gVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgUmVjdGFuZ2xlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRvcCAtIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgUmVjdGFuZ2xlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIFJlY3RhbmdsZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIFJlY3RhbmdsZS5cbiAqL1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICogQHJldHVybnMge1JlY3RhbmdsZX0gVGhlIHZpZXdwb3J0IGNvb3JkaW5hdGVzLlxuICovXG5jb21tYW5kcy5tb2JpbGVWaWV3UG9ydFJlY3QgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVWaWV3UG9ydFJlY3QgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXRWaWV3UG9ydFJlY3QoKTtcbn07XG5cbmNvbW1hbmRzLnNldFVybCA9IGFzeW5jIGZ1bmN0aW9uICh1cmwpIHtcbiAgYXdhaXQgdGhpcy5hZGIuc3RhcnRVcmkodXJsLCB0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlZXBMaW5rT3B0c1xuICogQHByb3BlcnR5IHshc3RyaW5nfSB1cmwgLSBUaGUgbmFtZSBvZiBVUkwgdG8gc3RhcnQuXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IHBhY2thZ2UgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBzdGFydCB0aGUgVVJJIHdpdGguXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSB3YWl0Rm9yTGF1bmNoIFt0cnVlXSAtIGlmIGBmYWxzZWAgdGhlbiBhZGIgd29uJ3Qgd2FpdFxuICogZm9yIHRoZSBzdGFydGVkIGFjdGl2aXR5IHRvIHJldHVybiB0aGUgY29udHJvbFxuICovXG5cbi8qKlxuICogU3RhcnQgVVJMIHRoYXQgdGFrZSB1c2VycyBkaXJlY3RseSB0byBzcGVjaWZpYyBjb250ZW50IGluIHRoZSBhcHBcbiAqIEBwYXJhbSB7RGVlcExpbmtPcHRzfSBvcHRzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZURlZXBMaW5rID0gYXN5bmMgZnVuY3Rpb24gKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdXJsLFxuICAgIHBhY2thZ2U6IHBrZyxcbiAgICB3YWl0Rm9yTGF1bmNoLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnN0YXJ0VXJpKHVybCwgcGtnLCB7IHdhaXRGb3JMYXVuY2ggfSk7XG59O1xuXG5jb21tYW5kcy5vcGVuTm90aWZpY2F0aW9ucyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2Uvb3Blbl9ub3RpZmljYXRpb25zJywgJ1BPU1QnLCB7fSk7XG59O1xuXG5jb21tYW5kcy51cGRhdGVTZXR0aW5ncyA9IGFzeW5jIGZ1bmN0aW9uIChzZXR0aW5ncykge1xuICAvLyB3ZSBoYXZlIHNvbWUgc2V0dGluZ3MgdGhhdCBhcmUgc2V0IG9uIHRoZSBzZXR0aW5ncyBvYmplY3QgaW4gdGhlIGRyaXZlclxuICAvLyBvbmx5LCBmb3IgZXhhbXBsZSBpbWFnZSBmaW5kaW5nIHNldHRpbmdzLiBUaGUgdWlhdXRvMiBzZXJ2ZXIgZG9lcyBub3Qga25vd1xuICAvLyB3aGF0IHRvIGRvIHdpdGggdGhlbSwgc28ganVzdCBzZXQgdGhlbSBvbiB0aGlzIGRyaXZlcidzIHNldHRpbmdzIGluc3RhbmNlLFxuICAvLyBhbmQgZG9uJ3QgZm9yd2FyZCB0aGVtIHRvIHRoZSBzZXJ2ZXJcbiAgbGV0IGRyaXZlck9ubHlTZXR0aW5ncyA9IHt9O1xuICBsZXQgc2VydmVyU2V0dGluZ3MgPSB7fTtcbiAgZm9yIChsZXQgW3NldHRpbmcsIHZhbHVlXSBvZiBfLnRvUGFpcnMoc2V0dGluZ3MpKSB7XG4gICAgaWYgKEJBU0VEUklWRVJfSEFORExFRF9TRVRUSU5HUy5pbmNsdWRlcyhzZXR0aW5nKSkge1xuICAgICAgZHJpdmVyT25seVNldHRpbmdzW3NldHRpbmddID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlcnZlclNldHRpbmdzW3NldHRpbmddID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIGlmICghXy5pc0VtcHR5KGRyaXZlck9ubHlTZXR0aW5ncykpIHtcbiAgICBsb2cuaW5mbyhgRm91bmQgc29tZSBzZXR0aW5ncyBkZXNpZ25lZCB0byBiZSBoYW5kbGVkIGJ5IEJhc2VEcml2ZXI6IGAgK1xuICAgICAgICAgICAgIGAke0pTT04uc3RyaW5naWZ5KF8ua2V5cyhkcml2ZXJPbmx5U2V0dGluZ3MpKX0uIE5vdCBgICtcbiAgICAgICAgICAgICBgc2VuZGluZyB0aGVzZSBvbiB0byB0aGUgVWlBdXRvbWF0b3IyIHNlcnZlciBhbmQgaW5zdGVhZCBgICtcbiAgICAgICAgICAgICBgc2V0dGluZyBkaXJlY3RseSBvbiB0aGUgZHJpdmVyYCk7XG4gICAgYXdhaXQgdGhpcy5zZXR0aW5ncy51cGRhdGUoZHJpdmVyT25seVNldHRpbmdzKTtcbiAgfVxuICBpZiAoIV8uaXNFbXB0eShzZXJ2ZXJTZXR0aW5ncykpIHtcbiAgICBsb2cuaW5mbygnRm9yd2FyZGluZyB0aGUgZm9sbG93aW5nIHNldHRpbmdzIHRvIHRoZSBVaUF1dG9tYXRvcjIgc2VydmVyOiAnICtcbiAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShfLmtleXMoc2VydmVyU2V0dGluZ3MpKSk7XG4gICAgYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL3NldHRpbmdzJywgJ1BPU1QnLFxuICAgICAge3NldHRpbmdzOiBzZXJ2ZXJTZXR0aW5nc30pO1xuICB9XG59O1xuXG5jb21tYW5kcy5nZXRTZXR0aW5ncyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgLy8gYXMgYWJvdmUsIHdlIG1pZ2h0IGhhdmUgc29tZSBkcml2ZXItb25seSBzZXR0aW5ncyB0byByZXR1cm4gYXMgd2VsbFxuICBjb25zdCBkcml2ZXJPbmx5U2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzLmdldFNldHRpbmdzKCk7XG4gIGNvbnN0IHNlcnZlclNldHRpbmdzID0gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL3NldHRpbmdzJywgJ0dFVCcpO1xuICByZXR1cm4gey4uLmRyaXZlck9ubHlTZXR0aW5ncywgLi4uc2VydmVyU2V0dGluZ3N9O1xufTtcblxuLyoqXG4gKiBPdmVycmlkaW5nIGFwcGl1bS1hbmRyb2lkLWRyaXZlcidzIHdyYXBCb290c3RyYXBEaXNjb25uZWN0LFxuICogdW5saWtlIGluIGFwcGl1bS1hbmRyb2lkLWRyaXZlciBhdm9pZGluZyBhZGIgcmVzdGFydGluZyBhcyBpdCBpbnRlcm5cbiAqIGtpbGxzIFVpQXV0b21hdG9yMiBzZXJ2ZXIgcnVubmluZyBpbiB0aGUgZGV2aWNlLlxuICoqL1xuaGVscGVycy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdCA9IGFzeW5jIGZ1bmN0aW9uICh3cmFwcGVkKSB7XG4gIGF3YWl0IHdyYXBwZWQoKTtcbn07XG5cbi8vIFN0b3AgcHJveHlpbmcgdG8gYW55IENocm9tZWRyaXZlciBhbmQgcmVkaXJlY3QgdG8gdWlhdXRvbWF0b3IyXG5oZWxwZXJzLnN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5jaHJvbWVkcml2ZXIgPSBudWxsO1xuICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy51aWF1dG9tYXRvcjIucHJveHlSZXFSZXMuYmluZCh0aGlzLnVpYXV0b21hdG9yMik7XG4gIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy51aWF1dG9tYXRvcjIucHJveHlDb21tYW5kLmJpbmQodGhpcy51aWF1dG9tYXRvcjIpO1xuICB0aGlzLmp3cFByb3h5QWN0aXZlID0gdHJ1ZTtcbn07XG5cbi8qKlxuICogVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGluZm8gZW50cmllcyBjYW4gYmUgZm91bmQgYXRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtLXVpYXV0b21hdG9yMi1zZXJ2ZXIvYmxvYi9tYXN0ZXIvYXBwL3NyYy9tYWluL2phdmEvaW8vYXBwaXVtL3VpYXV0b21hdG9yMi9oYW5kbGVyL0dldERldmljZUluZm8uamF2YVxuICovXG5jb21tYW5kcy5tb2JpbGVHZXREZXZpY2VJbmZvID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2RldmljZS9pbmZvJywgJ0dFVCcpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUeXBpbmdPcHRpb25zXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd8bnVtYmVyfGJvb2xlYW59IHRleHQgLSBUaGUgdGV4dCB0byB0eXBlXG4gKi9cblxuLyoqXG4gKiBUeXBlcyB0aGUgZ2l2ZW4gVW5pY29kZSBzdHJpbmcuXG4gKiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBmb2N1cyBpcyBhbHJlYWR5IHB1dFxuICogdG8gdGhlIGRlc3RpbmF0aW9uIGlucHV0IGZpZWxkIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuXG4gKlxuICogQHBhcmFtIHtUeXBpbmdPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBpbnB1dCB0ZXh0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzZW50IHRvIGFkYlxuICogQHRocm93cyB7RXJyb3J9IGlmIGB0ZXh0YCBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gcHJvdmlkZWRcbiAqL1xuY29tbWFuZHMubW9iaWxlVHlwZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVR5cGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdGV4dCxcbiAgfSA9IG9wdHM7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHRleHQpKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYFRoZSAndGV4dCcgYXJndW1lbnQgaXMgbWFuZGF0b3J5YCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnR5cGVVbmljb2RlKHRleHQpO1xufTtcblxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEluc3RhbGxPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93VGVzdFBhY2thZ2VzIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBhbGxvdyB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcyBpbnN0YWxsYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVNkY2FyZCBbZmFsc2VdIC0gU2V0IHRvIHRydWUgdG8gaW5zdGFsbCB0aGUgYXBwIG9uIHNkY2FyZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgdGhlIGRldmljZSBtZW1vcnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGdyYW50UGVybWlzc2lvbnMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGdyYW50IGFsbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgQW5kcm9pZCA2Ky5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVwbGFjZSBbdHJ1ZV0gLSBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IGRvbid0IHdhbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gdG8gYmUgdXBncmFkZWQvcmVpbnN0YWxsZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQgb24gdGhlIGRldmljZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcGFydGlhbEluc3RhbGwgW2ZhbHNlXSAtIEluc3RhbGwgYXBrcyBwYXJ0aWFsbHkuIEl0IGlzIHVzZWQgZm9yICdpbnN0YWxsLW11bHRpcGxlJy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9hbmRyb2lkLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8xMTEwNjQvd2hhdC1pcy1hLXBhcnRpYWwtYXBwbGljYXRpb24taW5zdGFsbC12aWEtYWRiXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsTXVsdGlwbGVBcGtzT3B0aW9uc1xuICogQHByb3BlcnR5IHtBcnJheTxzdHJpbmc+fSBhcGtzIC0gVGhlIGxpc3Qgb2YgQVBLcyB0byBpbnN0YWxsLiBFYWNoIEFQSyBzaG91bGQgYmUgYSBwYXRoIHRvIGEgYXBrXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBkb3dubG9hZGFibGUgVVJMIGFzIEhUVFAvSFRUUFMuXG4gKiBAcHJvcGVydHkge0luc3RhbGxPcHRpb25zfSBvcHRpb25zXG4gKi9cblxuLyoqXG4gKiBJbnN0YWxsIG11bHRpcGxlIEFQS3Mgd2l0aCBgaW5zdGFsbC1tdWx0aXBsZWAgb3B0aW9uLlxuICpcbiAqIEBwYXJhbSB7SW5zdGFsbE11bHRpcGxlQXBrc09wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIGluc3RhbGxpbmcgdGhlIGdpdmVuIEFQS3MuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUluc3RhbGxNdWx0aXBsZUFwa3MgPSBhc3luYyBmdW5jdGlvbiAob3B0cyA9IHt9KSB7XG4gIGlmICghXy5pc0FycmF5KG9wdHMuYXBrcykgfHwgXy5pc0VtcHR5KG9wdHMuYXBrcykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdObyBhcGtzIGFyZSBnaXZlbiB0byBpbnN0YWxsJyk7XG4gIH1cbiAgY29uc3QgYXBrcyA9IGF3YWl0IEIuYWxsKG9wdHMuYXBrc1xuICAgIC5tYXAoKGFwcCkgPT4gdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcChhcHAsIFtBUEtfRVhURU5TSU9OXSkpKTtcbiAgYXdhaXQgdGhpcy5hZGIuaW5zdGFsbE11bHRpcGxlQXBrcyhhcGtzLCBvcHRzLm9wdGlvbnMpO1xufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5cbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
|
|
@@ -29,11 +29,7 @@ function toPoint(x, y) {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
function toRect(left, top, width, height) {
|
|
32
|
-
|
|
33
|
-
return undefined;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
return {
|
|
32
|
+
return [left, top, width, height].some(v => !_lodash.default.isFinite(v)) ? undefined : {
|
|
37
33
|
left,
|
|
38
34
|
top,
|
|
39
35
|
width,
|
|
@@ -41,6 +37,18 @@ function toRect(left, top, width, height) {
|
|
|
41
37
|
};
|
|
42
38
|
}
|
|
43
39
|
|
|
40
|
+
commands.mobileClickGesture = async function mobileClickGesture(opts = {}) {
|
|
41
|
+
const {
|
|
42
|
+
elementId,
|
|
43
|
+
x,
|
|
44
|
+
y
|
|
45
|
+
} = opts;
|
|
46
|
+
return await this.uiautomator2.jwproxy.command('/appium/gestures/click', 'POST', {
|
|
47
|
+
origin: toOrigin(elementId),
|
|
48
|
+
offset: toPoint(x, y)
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
|
|
44
52
|
commands.mobileLongClickGesture = async function mobileLongClickGesture(opts = {}) {
|
|
45
53
|
const {
|
|
46
54
|
elementId,
|
|
@@ -218,4 +226,4 @@ var _default = commands;
|
|
|
218
226
|
exports.default = _default;require('source-map-support').install();
|
|
219
227
|
|
|
220
228
|
|
|
221
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZXN0dXJlcy5qcyJdLCJuYW1lcyI6WyJjb21tYW5kcyIsInRvT3JpZ2luIiwiZWxlbWVudCIsInV0aWwiLCJ3cmFwRWxlbWVudCIsInVud3JhcEVsZW1lbnQiLCJ1bmRlZmluZWQiLCJ0b1BvaW50IiwieCIsInkiLCJfIiwiaXNGaW5pdGUiLCJ0b1JlY3QiLCJsZWZ0IiwidG9wIiwid2lkdGgiLCJoZWlnaHQiLCJzb21lIiwidiIsIm1vYmlsZUxvbmdDbGlja0dlc3R1cmUiLCJvcHRzIiwiZWxlbWVudElkIiwiZHVyYXRpb24iLCJ1aWF1dG9tYXRvcjIiLCJqd3Byb3h5IiwiY29tbWFuZCIsIm9yaWdpbiIsIm9mZnNldCIsIm1vYmlsZURvdWJsZUNsaWNrR2VzdHVyZSIsIm1vYmlsZURyYWdHZXN0dXJlIiwic3RhcnRYIiwic3RhcnRZIiwiZW5kWCIsImVuZFkiLCJzcGVlZCIsInN0YXJ0IiwiZW5kIiwibW9iaWxlRmxpbmdHZXN0dXJlIiwiZGlyZWN0aW9uIiwiYXJlYSIsIm1vYmlsZVBpbmNoQ2xvc2VHZXN0dXJlIiwicGVyY2VudCIsIm1vYmlsZVBpbmNoT3Blbkdlc3R1cmUiLCJtb2JpbGVTd2lwZUdlc3R1cmUiLCJtb2JpbGVTY3JvbGxHZXN0dXJlIiwibW9iaWxlU2Nyb2xsQmFja1RvIiwiZWxlbWVudFRvSWQiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsIm1vYmlsZVNjcm9sbCIsInN0cmF0ZWd5Iiwic2VsZWN0b3IiLCJtYXhTd2lwZXMiLCJwYXJhbXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsUUFBUSxHQUFHLEVBQWpCOztBQUdBLFNBQVNDLFFBQVQsQ0FBbUJDLE9BQW5CLEVBQTRCO0FBQzFCLFNBQU9BLE9BQU8sR0FBR0Msb0JBQUtDLFdBQUwsQ0FBaUJELG9CQUFLRSxhQUFMLENBQW1CSCxPQUFuQixDQUFqQixDQUFILEdBQW1ESSxTQUFqRTtB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LFNBQU8sTUFBTSxLQUFLekIsWUFBTCxDQUFrQkMsT0FBbEIsQ0FBMEJDLE9BQTFCLENBQ1YsbUJBQWtCdEIsb0JBQUtFLGFBQUwsQ0FBbUJnQixTQUFuQixDQUE4QixjQUFhbEIsb0JBQUtFLGFBQUwsQ0FBbUJ5QyxXQUFuQixDQUFnQyxFQURuRixFQUNzRixNQUR0RixFQUM4RixFQUQ5RixDQUFiO0FBRUQsQ0FQRDs7QUFzQ0E5QyxRQUFRLENBQUNpRCxZQUFULEdBQXdCLGdCQUFnQjdCLElBQUksR0FBRyxFQUF2QixFQUEyQjtBQUNqRCxRQUFNO0FBQ0psQixJQUFBQSxPQURJO0FBQ0ttQixJQUFBQSxTQURMO0FBRUo2QixJQUFBQSxRQUZJO0FBRU1DLElBQUFBLFFBRk47QUFFZ0JDLElBQUFBO0FBRmhCLE1BR0ZoQyxJQUhKOztBQUlBLE1BQUksQ0FBQzhCLFFBQUQsSUFBYSxDQUFDQyxRQUFsQixFQUE0QjtBQUMxQixVQUFNLElBQUlKLHlCQUFPQyxvQkFBWCxDQUFpQyx1REFBakMsQ0FBTjtBQUNEOztBQUNELFNBQU8sTUFBTSxLQUFLekIsWUFBTCxDQUFrQkMsT0FBbEIsQ0FBMEJDLE9BQTFCLENBQWtDLGVBQWxDLEVBQW1ELE1BQW5ELEVBQTJEO0FBQ3RFQyxJQUFBQSxNQUFNLEVBQUV6QixRQUFRLENBQUNvQixTQUFTLElBQUluQixPQUFkLENBRHNEO0FBRXRFbUQsSUFBQUEsTUFBTSxFQUFFO0FBQUNILE1BQUFBLFFBQUQ7QUFBV0MsTUFBQUEsUUFBWDtBQUFxQkMsTUFBQUE7QUFBckI7QUFGOEQsR0FBM0QsQ0FBYjtBQUlELENBWkQ7O2VBY2VwRCxRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0tYmFzZS1kcml2ZXInO1xuXG5jb25zdCBjb21tYW5kcyA9IHt9O1xuXG5cbmZ1bmN0aW9uIHRvT3JpZ2luIChlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50ID8gdXRpbC53cmFwRWxlbWVudCh1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCkpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB0b1BvaW50ICh4LCB5KSB7XG4gIHJldHVybiBfLmlzRmluaXRlKHgpICYmIF8uaXNGaW5pdGUoeSkgPyB7eCwgeX0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHRvUmVjdCAobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KSB7XG4gIGlmIChbbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0XS5zb21lKCh2KSA9PiAhXy5pc0Zpbml0ZSh2KSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB7bGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0fTtcbn1cblxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IExvbmdDbGlja09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZWxlbWVudElkIC0gVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIGNsaWNrZWQuXG4gKiBJZiB0aGUgZWxlbWVudCBpcyBtaXNzaW5nIHRoZW4gYm90aCBjbGljayBvZmZzZXQgY29vcmRpbmF0ZXMgbXVzdCBiZSBwcm92aWRlZC5cbiAqIElmIGJvdGggdGhlIGVsZW1lbnQgaWQgYW5kIG9mZnNldCBhcmUgcHJvdmlkZWQgdGhlbiB0aGUgY29vcmRpbmF0ZXNcbiAqIGFyZSBwYXJzZWQgYXMgcmVsYXRpdmUgb2Zmc2V0cyBmcm9tIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGVsZW1lbnQuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIHRvIGNsaWNrIG9uXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIHRvIGNsaWNrIG9uXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGR1cmF0aW9uIFs1MDBdIC0gQ2xpY2sgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLlxuICogVGhlIHZhbHVlIG11c3Qgbm90IGJlIG5lZ2F0aXZlXG4gKi9cblxuLyoqXG4gKiBQZXJmb3JtcyBhIGNsaWNrIHRoYXQgbGFzdHMgZm9yIHRoZSBnaXZlbiBkdXJhdGlvblxuICpcbiAqIEBwYXJhbSB7P0xvbmdDbGlja09wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlTG9uZ0NsaWNrR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUxvbmdDbGlja0dlc3R1cmUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudElkLFxuICAgIHgsIHksXG4gICAgZHVyYXRpb24sXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL2xvbmdfY2xpY2snLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgb2Zmc2V0OiB0b1BvaW50KHgsIHkpLFxuICAgIGR1cmF0aW9uLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRG91YmxlQ2xpY2tPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnRJZCAtIFRoZSBpZCBvZiB0aGUgZWxlbWVudCB0byBiZSBkb3VibGUgY2xpY2tlZC5cbiAqIElmIHRoZSBlbGVtZW50IGlzIG1pc3NpbmcgdGhlbiBib3RoIGNsaWNrIG9mZnNldCBjb29yZGluYXRlcyBtdXN0IGJlIHByb3ZpZGVkLlxuICogSWYgYm90aCB0aGUgZWxlbWVudCBpZCBhbmQgb2Zmc2V0IGFyZSBwcm92aWRlZCB0aGVuIHRoZSBjb29yZGluYXRlc1xuICogYXJlIHBhcnNlZCBhcyByZWxhdGl2ZSBvZmZzZXRzIGZyb20gdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgdG8gZG91YmxlIGNsaWNrIG9uXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIHRvIGRvdWJsZSBjbGljayBvblxuICovXG5cbi8qKlxuICogUGVyZm9ybXMgYSBjbGljayB0aGF0IGxhc3RzIGZvciB0aGUgZ2l2ZW4gZHVyYXRpb25cbiAqXG4gKiBAcGFyYW0gez9Eb3VibGVDbGlja09wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlRG91YmxlQ2xpY2tHZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlRG91YmxlQ2xpY2tHZXN0dXJlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRJZCxcbiAgICB4LCB5LFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9kb3VibGVfY2xpY2snLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgb2Zmc2V0OiB0b1BvaW50KHgsIHkpLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRHJhZ09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZWxlbWVudElkIC0gVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIGRyYWdnZWQuXG4gKiBJZiB0aGUgZWxlbWVudCBpZCBpcyBtaXNzaW5nIHRoZW4gdGhlIHN0YXJ0IGNvb3JkaW5hdGVzIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBJZiBib3RoIHRoZSBlbGVtZW50IGlkIGFuZCB0aGUgc3RhcnQgY29vcmRpbmF0ZXMgYXJlIHByb3ZpZGVkIHRoZW4gdGhlc2VcbiAqIGNvb3JkaW5hdGVzIGFyZSBjb25zaWRlcmVkIGFzIG9mZnNldHMgZnJvbSB0aGUgdG9wIGxlZnQgZWxlbWVudCBjb3JuZXIuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHN0YXJ0WCAtIFRoZSB4IGNvb3JkaW5hdGUgd2hlcmUgdGhlIGRyYWdnaW5nIHN0YXJ0c1xuICogQHByb3BlcnR5IHs/bnVtYmVyfSBzdGFydFkgLSBUaGUgeSBjb29yZGluYXRlIHdoZXJlIHRoZSBkcmFnZ2luZyBzdGFydHNcbiAqIEBwcm9wZXJ0eSB7IW51bWJlcn0gZW5kWCAtIFRoZSB4IGNvb3JkaW5hdGUgd2hlcmUgdGhlIGRyYWdnaW5nIGVuZHNcbiAqIEBwcm9wZXJ0eSB7IW51bWJlcn0gZW5kWSAtIFRoZSB5IGNvb3JkaW5hdGUgd2hlcmUgdGhlIGRyYWdnaW5nIGVuZHNcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gc3BlZWQgWzI1MDAgKiBkaXNwbGF5RGVuc2l0eV0gLSBUaGUgc3BlZWQgYXQgd2hpY2ggdG8gcGVyZm9ybVxuICogdGhpcyBnZXN0dXJlIGluIHBpeGVscyBwZXIgc2Vjb25kLiBUaGUgdmFsdWUgbXVzdCBub3QgYmUgbmVnYXRpdmVcbiAqL1xuXG4vKipcbiAqIERyYWdzIHRoaXMgb2JqZWN0IHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uXG4gKlxuICogQHBhcmFtIHs/RHJhZ09wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlRHJhZ0dlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVEcmFnR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgc3RhcnRYLCBzdGFydFksXG4gICAgZW5kWCwgZW5kWSxcbiAgICBzcGVlZCxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvZHJhZycsICdQT1NUJywge1xuICAgIG9yaWdpbjogdG9PcmlnaW4oZWxlbWVudElkKSxcbiAgICBzdGFydDogdG9Qb2ludChzdGFydFgsIHN0YXJ0WSksXG4gICAgZW5kOiB0b1BvaW50KGVuZFgsIGVuZFkpLFxuICAgIHNwZWVkLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRmxpbmdPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnRJZCAtIFRoZSBpZCBvZiB0aGUgZWxlbWVudCB0byBiZSBmbGluZ2VkLlxuICogSWYgdGhlIGVsZW1lbnQgaWQgaXMgbWlzc2luZyB0aGVuIGZsaW5nIGJvdW5kaW5nIGFyZWEgbXVzdCBiZSBwcm92aWRlZC5cbiAqIElmIGJvdGggdGhlIGVsZW1lbnQgaWQgYW5kIHRoZSBmbGluZyBib3VuZGluZyBhcmVhIGFyZSBwcm92aWRlZCB0aGVuIHRoaXNcbiAqIGFyZWEgaXMgZWZmZWN0aXZlbHkgaWdub3JlZC5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gbGVmdCAtIFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIGZsaW5nIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdG9wIC0gVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBmbGluZyBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBmbGluZyBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIGZsaW5nIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gZGlyZWN0aW9uIC0gRGlyZWN0aW9uIG9mIHRoZSBmbGluZy5cbiAqIEFjY2VwdGFibGUgdmFsdWVzIGFyZTogYHVwYCwgYGRvd25gLCBgbGVmdGAgYW5kIGByaWdodGAgKGNhc2UgaW5zZW5zaXRpdmUpXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHNwZWVkIFs3NTAwICogZGlzcGxheURlbnNpdHldIC0gVGhlIHNwZWVkIGF0IHdoaWNoIHRvIHBlcmZvcm0gdGhpc1xuICogZ2VzdHVyZSBpbiBwaXhlbHMgcGVyIHNlY29uZC4gVGhlIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBtaW5pbXVtIGZsaW5nXG4gKiB2ZWxvY2l0eSBmb3IgdGhlIGdpdmVuIHZpZXcgKDUwIGJ5IGRlZmF1bHQpXG4gKi9cblxuLyoqXG4gKiBEcmFncyB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7P0ZsaW5nT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHByb3ZpZGVkIG9wdGlvbnMgYXJlIG5vdCB2YWxpZFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIG9iamVjdCBjYW4gc3RpbGwgc2Nyb2xsIGluIHRoZSBnaXZlbiBkaXJlY3Rpb24uXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUZsaW5nR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUZsaW5nR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0LFxuICAgIGRpcmVjdGlvbixcbiAgICBzcGVlZCxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvZmxpbmcnLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgYXJlYTogdG9SZWN0KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCksXG4gICAgZGlyZWN0aW9uLFxuICAgIHNwZWVkLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUGluY2hPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnRJZCAtIFRoZSBpZCBvZiB0aGUgZWxlbWVudCB0byBiZSBwaW5jaGVkLlxuICogSWYgdGhlIGVsZW1lbnQgaWQgaXMgbWlzc2luZyB0aGVuIHBpbmNoIGJvdW5kaW5nIGFyZWEgbXVzdCBiZSBwcm92aWRlZC5cbiAqIElmIGJvdGggdGhlIGVsZW1lbnQgaWQgYW5kIHRoZSBwaW5jaCBib3VuZGluZyBhcmVhIGFyZSBwcm92aWRlZCB0aGVuIHRoZVxuICogYXJlYSBpcyBlZmZlY3RpdmVseSBpZ25vcmVkLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBsZWZ0IC0gVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcGluY2ggYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0b3AgLSBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHBpbmNoIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHBpbmNoIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgcGluY2ggYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHshbnVtYmVyfSBwZXJjZW50IC0gVGhlIHNpemUgb2YgdGhlIHBpbmNoIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgcGluY2ggYXJlYSBzaXplLlxuICogVmFsaWQgdmFsdWVzIG11c3QgYmUgZmxvYXQgbnVtYmVycyBpbiByYW5nZSAwLi4xLCB3aGVyZSAxLjAgaXMgMTAwJVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBzcGVlZCBbMjUwMCAqIGRpc3BsYXlEZW5zaXR5XSAtIFRoZSBzcGVlZCBhdCB3aGljaCB0byBwZXJmb3JtXG4gKiB0aGlzIGdlc3R1cmUgaW4gcGl4ZWxzIHBlciBzZWNvbmQuIFRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBuZWdhdGl2ZVxuICovXG5cbi8qKlxuICogUGVyZm9ybXMgYSBwaW5jaCBjbG9zZSBnZXN0dXJlLlxuICpcbiAqIEBwYXJhbSB7P1BpbmNoT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHByb3ZpZGVkIG9wdGlvbnMgYXJlIG5vdCB2YWxpZFxuICovXG5jb21tYW5kcy5tb2JpbGVQaW5jaENsb3NlR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVBpbmNoQ2xvc2VHZXN0dXJlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRJZCxcbiAgICBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsXG4gICAgcGVyY2VudCxcbiAgICBzcGVlZCxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvcGluY2hfY2xvc2UnLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgYXJlYTogdG9SZWN0KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCksXG4gICAgcGVyY2VudCxcbiAgICBzcGVlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgcGluY2ggb3BlbiBnZXN0dXJlLlxuICpcbiAqIEBwYXJhbSB7P1BpbmNoT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHByb3ZpZGVkIG9wdGlvbnMgYXJlIG5vdCB2YWxpZFxuICovXG5jb21tYW5kcy5tb2JpbGVQaW5jaE9wZW5HZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUGluY2hPcGVuR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0LFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL3BpbmNoX29wZW4nLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgYXJlYTogdG9SZWN0KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCksXG4gICAgcGVyY2VudCxcbiAgICBzcGVlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN3aXBlT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgLSBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgc3dpcGVkLlxuICogSWYgdGhlIGVsZW1lbnQgaWQgaXMgbWlzc2luZyB0aGVuIHN3aXBlIGJvdW5kaW5nIGFyZWEgbXVzdCBiZSBwcm92aWRlZC5cbiAqIElmIGJvdGggdGhlIGVsZW1lbnQgaWQgYW5kIHRoZSBzd2lwZSBib3VuZGluZyBhcmVhIGFyZSBwcm92aWRlZCB0aGVuIHRoZVxuICogYXJlYSBpcyBlZmZlY3RpdmVseSBpZ25vcmVkLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBsZWZ0IC0gVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgc3dpcGUgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0b3AgLSBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHN3aXBlIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHN3aXBlIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgc3dpcGUgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHshc3RyaW5nfSBkaXJlY3Rpb24gLSBEaXJlY3Rpb24gb2YgdGhlIHN3aXBlLlxuICogQWNjZXB0YWJsZSB2YWx1ZXMgYXJlOiBgdXBgLCBgZG93bmAsIGBsZWZ0YCBhbmQgYHJpZ2h0YCAoY2FzZSBpbnNlbnNpdGl2ZSlcbiAqIEBwcm9wZXJ0eSB7IW51bWJlcn0gcGVyY2VudCAtIFRoZSBzaXplIG9mIHRoZSBzd2lwZSBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHN3aXBlIGFyZWEgc2l6ZS5cbiAqIFZhbGlkIHZhbHVlcyBtdXN0IGJlIGZsb2F0IG51bWJlcnMgaW4gcmFuZ2UgMC4uMSwgd2hlcmUgMS4wIGlzIDEwMCVcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gc3BlZWQgWzUwMDAgKiBkaXNwbGF5RGVuc2l0eV0gLSBUaGUgc3BlZWQgYXQgd2hpY2ggdG8gcGVyZm9ybSB0aGlzXG4gKiBnZXN0dXJlIGluIHBpeGVscyBwZXIgc2Vjb25kLiBUaGUgdmFsdWUgbXVzdCBub3QgYmUgbmVnYXRpdmVcbiAqL1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgc3dpcGUgZ2VzdHVyZS5cbiAqXG4gKiBAcGFyYW0gez9Td2lwZU9wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlU3dpcGVHZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3dpcGVHZXN0dXJlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRJZCxcbiAgICBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsXG4gICAgZGlyZWN0aW9uLFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL3N3aXBlJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIGFyZWE6IHRvUmVjdChsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpLFxuICAgIGRpcmVjdGlvbixcbiAgICBwZXJjZW50LFxuICAgIHNwZWVkLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2Nyb2xsT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgLSBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgc2Nyb2xsZWQuXG4gKiBJZiB0aGUgZWxlbWVudCBpZCBpcyBtaXNzaW5nIHRoZW4gc2Nyb2xsIGJvdW5kaW5nIGFyZWEgbXVzdCBiZSBwcm92aWRlZC5cbiAqIElmIGJvdGggdGhlIGVsZW1lbnQgaWQgYW5kIHRoZSBzY3JvbGwgYm91bmRpbmcgYXJlYSBhcmUgcHJvdmlkZWQgdGhlbiB0aGlzXG4gKiBhcmVhIGlzIGVmZmVjdGl2ZWx5IGlnbm9yZWQuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGxlZnQgLSBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSBzY3JvbGwgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0b3AgLSBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHNjcm9sbCBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBzY3JvbGwgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBzY3JvbGwgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHshc3RyaW5nfSBkaXJlY3Rpb24gLSBEaXJlY3Rpb24gb2YgdGhlIHNjcm9sbC5cbiAqIEFjY2VwdGFibGUgdmFsdWVzIGFyZTogYHVwYCwgYGRvd25gLCBgbGVmdGAgYW5kIGByaWdodGAgKGNhc2UgaW5zZW5zaXRpdmUpXG4gKiBAcHJvcGVydHkgeyFudW1iZXJ9IHBlcmNlbnQgLSBUaGUgc2l6ZSBvZiB0aGUgc2Nyb2xsIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgc2Nyb2xsaW5nIGFyZWEgc2l6ZS5cbiAqIFZhbGlkIHZhbHVlcyBtdXN0IGJlIGZsb2F0IG51bWJlcnMgZ3JlYXRlciB0aGFuIHplcm8sIHdoZXJlIDEuMCBpcyAxMDAlXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHNwZWVkIFs1MDAwICogZGlzcGxheURlbnNpdHldIC0gVGhlIHNwZWVkIGF0IHdoaWNoIHRvIHBlcmZvcm0gdGhpcyBnZXN0dXJlXG4gKiBpbiBwaXhlbHMgcGVyIHNlY29uZC4gVGhlIHZhbHVlIG11c3Qgbm90IGJlIG5lZ2F0aXZlXG4gKi9cblxuLyoqXG4gKiBQZXJmb3JtcyBhIHNjcm9sbCBnZXN0dXJlLlxuICpcbiAqIEBwYXJhbSB7P1Njcm9sbE9wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBvYmplY3QgY2FuIHN0aWxsIHNjcm9sbCBpbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uLlxuICovXG5jb21tYW5kcy5tb2JpbGVTY3JvbGxHZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU2Nyb2xsR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0LFxuICAgIGRpcmVjdGlvbixcbiAgICBwZXJjZW50LFxuICAgIHNwZWVkLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9zY3JvbGwnLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgYXJlYTogdG9SZWN0KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCksXG4gICAgZGlyZWN0aW9uLFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTY3JvbGxFbGVtZW50VG9FbGVtZW50T3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGVsZW1lbnRJZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgc2Nyb2xsYWJsZSBlbGVtZW50LFxuICogd2hpY2ggaXMgZ29pbmcgdG8gYmUgc2Nyb2xsZWQuIEl0IGlzIHJlcXVpcmVkIHRoaXMgZWxlbWVudFxuICogaXMgYSB2YWxpZCBzY3JvbGxhYmxlIGNvbnRhaW5lciBhbmQgaXQgd2FzIGxvY2F0ZWQgYnkgYC1hbmRyb2lkIHVpYXV0b21hdG9yYFxuICogc3RyYXRlZ3kuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZWxlbWVudFRvSWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGl0ZW0sIHdoaWNoIGJlbG9uZ3NcbiAqIHRvIHRoZSBzY3JvbGxhYmxlIGVsZW1lbnQgYWJvdmUsIGFuZCB3aGljaCBzaG91bGQgYmVjb21lIHZpc2libGUgYWZ0ZXJcbiAqIHRoZSBzY3JvbGxpbmcgb3BlcmF0aW9uIGlzIGZpbmlzaGVkLiBJdCBpcyByZXF1aXJlZCB0aGlzIGVsZW1lbnRcbiAqIHdhcyBsb2NhdGVkIGJ5IGAtYW5kcm9pZCB1aWF1dG9tYXRvcmAgc3RyYXRlZ3kuXG4gKi9cblxuLyoqXG4gKiBTY3JvbGxzIHRoZSBnaXZlbiBzY3JvbGxhYmxlIGVsZW1lbnQgYGVsZW1lbnRJZGAgdW50aWwgYGVsZW1lbnRUb0lkYFxuICogYmVjb21lcyB2aXNpYmxlLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgdGhlIGBlbGVtZW50VG9JZGBcbiAqIGlzIGFscmVhZHkgdmlzaWJsZSBpbiB0aGUgdmlldyBwb3J0LiBPdGhlcndpc2UgaXQgd291bGQgc2Nyb2xsXG4gKiB0byB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgdGhlIHNjcm9sbGFibGUgY29udHJvbCBhbmQgdHJpZXMgdG8gcmVhY2ggdGhlIGRlc3RpbmF0aW9uIGVsZW1lbnRcbiAqIGJ5IHNjcm9sbGluZyBpdHMgcGFyZW50IHRvIHRoZSBlbmQgc3RlcCBieSBzdGVwLiBUaGUgc2Nyb2xsIGRpcmVjdGlvbiAodmVydGljYWwgb3IgaG9yaXpvbnRhbClcbiAqIGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogQHBhcmFtIHtTY3JvbGxFbGVtZW50VG9FbGVtZW50T3B0c30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBzY3JvbGxpbmcgb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWRcbiAqL1xuY29tbWFuZHMubW9iaWxlU2Nyb2xsQmFja1RvID0gYXN5bmMgZnVuY3Rpb24gKG9wdHMgPSB7fSkge1xuICBjb25zdCB7ZWxlbWVudElkLCBlbGVtZW50VG9JZH0gPSBvcHRzO1xuICBpZiAoIWVsZW1lbnRJZCB8fCAhZWxlbWVudFRvSWQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBCb3RoIGVsZW1lbnRJZCBhbmQgZWxlbWVudFRvSWQgYXJndW1lbnRzIG11c3QgYmUgcHJvdmlkZWRgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKFxuICAgIGAvYXBwaXVtL2VsZW1lbnQvJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudElkKX0vc2Nyb2xsX3RvLyR7dXRpbC51bndyYXBFbGVtZW50KGVsZW1lbnRUb0lkKX1gLCAnUE9TVCcsIHt9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2Nyb2xsT3B0c1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgVGhlIGlkZW50aWZpZXIgb2YgYW4gZWxlbWVudC4gSXQgaXMgcmVxdWlyZWQgdGhpcyBlbGVtZW50XG4gKiBpcyBhIHZhbGlkIHNjcm9sbGFibGUgY29udGFpbmVyIGFuZCBpdCB3YXMgbG9jYXRlZCBieSBgLWFuZHJvaWQgdWlhdXRvbWF0b3JgXG4gKiBzdHJhdGVneS4gSWYgdGhpcyBwcm9wZXJ0eSBpcyBub3QgcHJvdmlkZWQgdGhlbiB0aGUgZmlyc3QgY3VycmVudGx5IGF2YWlsYWJsZSBzY3JvbGxhYmxlIHZpZXdcbiAqIGlzIHNlbGVjdGVkIGZvciB0aGUgaW50ZXJhY3Rpb24uXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IHN0cmF0ZWd5IFRoZSBmb2xsb3dpbmcgc3RyYXRlZ2llcyBhcmUgc3VwcG9ydGVkOlxuICogLSBgYWNjZXNzaWJpbGl0eSBpZGAgKFVpU2VsZWN0b3IoKS5kZXNjcmlwdGlvbilcbiAqIC0gYGNsYXNzIG5hbWVgIChVaVNlbGVjdG9yKCkuY2xhc3NOYW1lKVxuICogLSBgLWFuZHJvaWQgdWlhdXRvbWF0b3JgIChVaVNlbGVjdG9yKVxuICogQHByb3BlcnR5IHshc3RyaW5nfSBzZWxlY3RvciBUaGUgY29ycmVzcG9uZGluZyBsb29rdXAgdmFsdWUgZm9yIHRoZSBnaXZlblxuICogc3RyYXRlZ3kuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IG1heFN3aXBlcyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3dpcGVzIHRvIHBlcmZvcm1cbiAqIG9uIHRoZSB0YXJnZXQgc2Nyb2xsYWJsZSB2aWV3IGluIG9yZGVyIHRvIHJlYWNoIHRoZSBkZXN0aW5hdGlvbiBlbGVtZW50LlxuICogSW4gY2FzZSB0aGlzIHZhbHVlIGlzIHVuc2V0IHRoZW4gaXQgd291bGQgYmUgcmV0cmlldmVkIGZyb20gdGhlIHNjcm9sbGFibGVcbiAqIGVsZW1lbnQgaXRzZWxmICh2dWEgYGdldE1heFNlYXJjaFN3aXBlcygpYCBwcm9wZXJ0eSkuXG4gKi9cblxuLyoqXG4gKiBTY3JvbGxzIHRoZSBnaXZlbiBzY3JvbGxhYmxlIGVsZW1lbnQgdW50aWwgdGhlIGVsZW1lbnQgaWRlbnRpZmllZFxuICogYnkgYHN0cmF0ZWd5YCBhbmQgYHNlbGVjdG9yYCBiZWNvbWVzIHZpc2libGUuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBpbW1lZGlhdGVseSBpZiB0aGVcbiAqIGRlc3RpbmF0aW9uIGVsZW1lbnQgaXMgYWxyZWFkeSB2aXNpYmxlIGluIHRoZSB2aWV3IHBvcnQuIE90aGVyd2lzZSBpdCB3b3VsZCBzY3JvbGxcbiAqIHRvIHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGUgc2Nyb2xsYWJsZSBjb250cm9sIGFuZCB0cmllcyB0byByZWFjaCB0aGUgZGVzdGluYXRpb24gZWxlbWVudFxuICogYnkgc2Nyb2xsaW5nIGl0cyBwYXJlbnQgdG8gdGhlIGVuZCBzdGVwIGJ5IHN0ZXAuIFRoZSBzY3JvbGwgZGlyZWN0aW9uICh2ZXJ0aWNhbCBvciBob3Jpem9udGFsKVxuICogaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseS5cbiAqXG4gKiBAcGFyYW0ge1Njcm9sbE9wdHN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgc2Nyb2xsaW5nIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVNjcm9sbCA9IGFzeW5jIGZ1bmN0aW9uIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnQsIGVsZW1lbnRJZCwgLy8gYGVsZW1lbnRgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgZWxlbWVudElkYCBpbnN0ZWFkXG4gICAgc3RyYXRlZ3ksIHNlbGVjdG9yLCBtYXhTd2lwZXNcbiAgfSA9IG9wdHM7XG4gIGlmICghc3RyYXRlZ3kgfHwgIXNlbGVjdG9yKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgQm90aCBzdHJhdGVneSBhbmQgc2VsZWN0b3IgYXJndW1lbnRzIG11c3QgYmUgcHJvdmlkZWRgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvdG91Y2gvc2Nyb2xsJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQgfHwgZWxlbWVudCksXG4gICAgcGFyYW1zOiB7c3RyYXRlZ3ksIHNlbGVjdG9yLCBtYXhTd2lwZXN9LFxuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvZ2VzdHVyZXMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
|
229
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZXN0dXJlcy5qcyJdLCJuYW1lcyI6WyJjb21tYW5kcyIsInRvT3JpZ2luIiwiZWxlbWVudCIsInV0aWwiLCJ3cmFwRWxlbWVudCIsInVud3JhcEVsZW1lbnQiLCJ1bmRlZmluZWQiLCJ0b1BvaW50IiwieCIsInkiLCJfIiwiaXNGaW5pdGUiLCJ0b1JlY3QiLCJsZWZ0IiwidG9wIiwid2lkdGgiLCJoZWlnaHQiLCJzb21lIiwidiIsIm1vYmlsZUNsaWNrR2VzdHVyZSIsIm9wdHMiLCJlbGVtZW50SWQiLCJ1aWF1dG9tYXRvcjIiLCJqd3Byb3h5IiwiY29tbWFuZCIsIm9yaWdpbiIsIm9mZnNldCIsIm1vYmlsZUxvbmdDbGlja0dlc3R1cmUiLCJkdXJhdGlvbiIsIm1vYmlsZURvdWJsZUNsaWNrR2VzdHVyZSIsIm1vYmlsZURyYWdHZXN0dXJlIiwic3RhcnRYIiwic3RhcnRZIiwiZW5kWCIsImVuZFkiLCJzcGVlZCIsInN0YXJ0IiwiZW5kIiwibW9iaWxlRmxpbmdHZXN0dXJlIiwiZGlyZWN0aW9uIiwiYXJlYSIsIm1vYmlsZVBpbmNoQ2xvc2VHZXN0dXJlIiwicGVyY2VudCIsIm1vYmlsZVBpbmNoT3Blbkdlc3R1cmUiLCJtb2JpbGVTd2lwZUdlc3R1cmUiLCJtb2JpbGVTY3JvbGxHZXN0dXJlIiwibW9iaWxlU2Nyb2xsQmFja1RvIiwiZWxlbWVudFRvSWQiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsIm1vYmlsZVNjcm9sbCIsInN0cmF0ZWd5Iiwic2VsZWN0b3IiLCJtYXhTd2lwZXMiLCJwYXJhbXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsUUFBUSxHQUFHLEVBQWpCOztBQUdBLFNBQVNDLFFBQVQsQ0FBbUJDLE9BQW5CLEVBQTRCO0FBQzFCLFNBQU9BLE9BQU8sR0FBR0Msb0JBQUtDLFdBQUwsQ0FBaUJELG9CQUFLRSxhQUFMLENBQW1CSCxPQUFuQixDQUFq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QSxNQUFNLEVBQUV4QixRQUFRLENBQUNvQixTQUFTLElBQUluQixPQUFkLENBRHNEO0FBRXRFb0QsSUFBQUEsTUFBTSxFQUFFO0FBQUNILE1BQUFBLFFBQUQ7QUFBV0MsTUFBQUEsUUFBWDtBQUFxQkMsTUFBQUE7QUFBckI7QUFGOEQsR0FBM0QsQ0FBYjtBQUlELENBWkQ7O2VBY2VyRCxRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0tYmFzZS1kcml2ZXInO1xuXG5jb25zdCBjb21tYW5kcyA9IHt9O1xuXG5cbmZ1bmN0aW9uIHRvT3JpZ2luIChlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50ID8gdXRpbC53cmFwRWxlbWVudCh1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudCkpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB0b1BvaW50ICh4LCB5KSB7XG4gIHJldHVybiBfLmlzRmluaXRlKHgpICYmIF8uaXNGaW5pdGUoeSkgPyB7eCwgeX0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHRvUmVjdCAobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHJldHVybiBbbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0XS5zb21lKCh2KSA9PiAhXy5pc0Zpbml0ZSh2KSlcbiAgICA/IHVuZGVmaW5lZFxuICAgIDoge2xlZnQsIHRvcCwgd2lkdGgsIGhlaWdodH07XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2xpY2tPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnRJZCAtIFRoZSBpZCBvZiB0aGUgZWxlbWVudCB0byBiZSBjbGlja2VkLlxuICogSWYgdGhlIGVsZW1lbnQgaXMgbWlzc2luZyB0aGVuIGJvdGggY2xpY2sgb2Zmc2V0IGNvb3JkaW5hdGVzIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBJZiBib3RoIHRoZSBlbGVtZW50IGlkIGFuZCBvZmZzZXQgYXJlIHByb3ZpZGVkIHRoZW4gdGhlIGNvb3JkaW5hdGVzXG4gKiBhcmUgcGFyc2VkIGFzIHJlbGF0aXZlIG9mZnNldHMgZnJvbSB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBlbGVtZW50LlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSB0byBjbGljayBvblxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSB0byBjbGljayBvblxuICovXG5cbi8qKlxuICogUGVyZm9ybXMgYSBzaW1wbGUgY2xpY2svdGFwIGdlc3R1cmVcbiAqXG4gKiBAcGFyYW0gez9DbGlja09wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlQ2xpY2tHZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlQ2xpY2tHZXN0dXJlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRJZCxcbiAgICB4LCB5LFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9jbGljaycsICdQT1NUJywge1xuICAgIG9yaWdpbjogdG9PcmlnaW4oZWxlbWVudElkKSxcbiAgICBvZmZzZXQ6IHRvUG9pbnQoeCwgeSksXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBMb25nQ2xpY2tPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnRJZCAtIFRoZSBpZCBvZiB0aGUgZWxlbWVudCB0byBiZSBjbGlja2VkLlxuICogSWYgdGhlIGVsZW1lbnQgaXMgbWlzc2luZyB0aGVuIGJvdGggY2xpY2sgb2Zmc2V0IGNvb3JkaW5hdGVzIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBJZiBib3RoIHRoZSBlbGVtZW50IGlkIGFuZCBvZmZzZXQgYXJlIHByb3ZpZGVkIHRoZW4gdGhlIGNvb3JkaW5hdGVzXG4gKiBhcmUgcGFyc2VkIGFzIHJlbGF0aXZlIG9mZnNldHMgZnJvbSB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBlbGVtZW50LlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSB0byBjbGljayBvblxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSB0byBjbGljayBvblxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBkdXJhdGlvbiBbNTAwXSAtIENsaWNrIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy5cbiAqIFRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBuZWdhdGl2ZVxuICovXG5cbi8qKlxuICogUGVyZm9ybXMgYSBjbGljayB0aGF0IGxhc3RzIGZvciB0aGUgZ2l2ZW4gZHVyYXRpb25cbiAqXG4gKiBAcGFyYW0gez9Mb25nQ2xpY2tPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUxvbmdDbGlja0dlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVMb25nQ2xpY2tHZXN0dXJlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRJZCxcbiAgICB4LCB5LFxuICAgIGR1cmF0aW9uLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9sb25nX2NsaWNrJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIG9mZnNldDogdG9Qb2ludCh4LCB5KSxcbiAgICBkdXJhdGlvbixcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERvdWJsZUNsaWNrT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgLSBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgZG91YmxlIGNsaWNrZWQuXG4gKiBJZiB0aGUgZWxlbWVudCBpcyBtaXNzaW5nIHRoZW4gYm90aCBjbGljayBvZmZzZXQgY29vcmRpbmF0ZXMgbXVzdCBiZSBwcm92aWRlZC5cbiAqIElmIGJvdGggdGhlIGVsZW1lbnQgaWQgYW5kIG9mZnNldCBhcmUgcHJvdmlkZWQgdGhlbiB0aGUgY29vcmRpbmF0ZXNcbiAqIGFyZSBwYXJzZWQgYXMgcmVsYXRpdmUgb2Zmc2V0cyBmcm9tIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGVsZW1lbnQuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIHRvIGRvdWJsZSBjbGljayBvblxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSB0byBkb3VibGUgY2xpY2sgb25cbiAqL1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgY2xpY2sgdGhhdCBsYXN0cyBmb3IgdGhlIGdpdmVuIGR1cmF0aW9uXG4gKlxuICogQHBhcmFtIHs/RG91YmxlQ2xpY2tPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZURvdWJsZUNsaWNrR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZURvdWJsZUNsaWNrR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgeCwgeSxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvZG91YmxlX2NsaWNrJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIG9mZnNldDogdG9Qb2ludCh4LCB5KSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERyYWdPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnRJZCAtIFRoZSBpZCBvZiB0aGUgZWxlbWVudCB0byBiZSBkcmFnZ2VkLlxuICogSWYgdGhlIGVsZW1lbnQgaWQgaXMgbWlzc2luZyB0aGVuIHRoZSBzdGFydCBjb29yZGluYXRlcyBtdXN0IGJlIHByb3ZpZGVkLlxuICogSWYgYm90aCB0aGUgZWxlbWVudCBpZCBhbmQgdGhlIHN0YXJ0IGNvb3JkaW5hdGVzIGFyZSBwcm92aWRlZCB0aGVuIHRoZXNlXG4gKiBjb29yZGluYXRlcyBhcmUgY29uc2lkZXJlZCBhcyBvZmZzZXRzIGZyb20gdGhlIHRvcCBsZWZ0IGVsZW1lbnQgY29ybmVyLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBzdGFydFggLSBUaGUgeCBjb29yZGluYXRlIHdoZXJlIHRoZSBkcmFnZ2luZyBzdGFydHNcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gc3RhcnRZIC0gVGhlIHkgY29vcmRpbmF0ZSB3aGVyZSB0aGUgZHJhZ2dpbmcgc3RhcnRzXG4gKiBAcHJvcGVydHkgeyFudW1iZXJ9IGVuZFggLSBUaGUgeCBjb29yZGluYXRlIHdoZXJlIHRoZSBkcmFnZ2luZyBlbmRzXG4gKiBAcHJvcGVydHkgeyFudW1iZXJ9IGVuZFkgLSBUaGUgeSBjb29yZGluYXRlIHdoZXJlIHRoZSBkcmFnZ2luZyBlbmRzXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHNwZWVkIFsyNTAwICogZGlzcGxheURlbnNpdHldIC0gVGhlIHNwZWVkIGF0IHdoaWNoIHRvIHBlcmZvcm1cbiAqIHRoaXMgZ2VzdHVyZSBpbiBwaXhlbHMgcGVyIHNlY29uZC4gVGhlIHZhbHVlIG11c3Qgbm90IGJlIG5lZ2F0aXZlXG4gKi9cblxuLyoqXG4gKiBEcmFncyB0aGlzIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7P0RyYWdPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZURyYWdHZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlRHJhZ0dlc3R1cmUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudElkLFxuICAgIHN0YXJ0WCwgc3RhcnRZLFxuICAgIGVuZFgsIGVuZFksXG4gICAgc3BlZWQsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL2RyYWcnLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgc3RhcnQ6IHRvUG9pbnQoc3RhcnRYLCBzdGFydFkpLFxuICAgIGVuZDogdG9Qb2ludChlbmRYLCBlbmRZKSxcbiAgICBzcGVlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEZsaW5nT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgLSBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgZmxpbmdlZC5cbiAqIElmIHRoZSBlbGVtZW50IGlkIGlzIG1pc3NpbmcgdGhlbiBmbGluZyBib3VuZGluZyBhcmVhIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBJZiBib3RoIHRoZSBlbGVtZW50IGlkIGFuZCB0aGUgZmxpbmcgYm91bmRpbmcgYXJlYSBhcmUgcHJvdmlkZWQgdGhlbiB0aGlzXG4gKiBhcmVhIGlzIGVmZmVjdGl2ZWx5IGlnbm9yZWQuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGxlZnQgLSBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSBmbGluZyBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHRvcCAtIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgZmxpbmcgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgZmxpbmcgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBmbGluZyBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IGRpcmVjdGlvbiAtIERpcmVjdGlvbiBvZiB0aGUgZmxpbmcuXG4gKiBBY2NlcHRhYmxlIHZhbHVlcyBhcmU6IGB1cGAsIGBkb3duYCwgYGxlZnRgIGFuZCBgcmlnaHRgIChjYXNlIGluc2Vuc2l0aXZlKVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBzcGVlZCBbNzUwMCAqIGRpc3BsYXlEZW5zaXR5XSAtIFRoZSBzcGVlZCBhdCB3aGljaCB0byBwZXJmb3JtIHRoaXNcbiAqIGdlc3R1cmUgaW4gcGl4ZWxzIHBlciBzZWNvbmQuIFRoZSB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbWluaW11bSBmbGluZ1xuICogdmVsb2NpdHkgZm9yIHRoZSBnaXZlbiB2aWV3ICg1MCBieSBkZWZhdWx0KVxuICovXG5cbi8qKlxuICogRHJhZ3MgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbi5cbiAqXG4gKiBAcGFyYW0gez9GbGluZ09wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBvYmplY3QgY2FuIHN0aWxsIHNjcm9sbCBpbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uLlxuICovXG5jb21tYW5kcy5tb2JpbGVGbGluZ0dlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVGbGluZ0dlc3R1cmUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudElkLFxuICAgIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCxcbiAgICBkaXJlY3Rpb24sXG4gICAgc3BlZWQsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL2ZsaW5nJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIGFyZWE6IHRvUmVjdChsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpLFxuICAgIGRpcmVjdGlvbixcbiAgICBzcGVlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBpbmNoT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgLSBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgcGluY2hlZC5cbiAqIElmIHRoZSBlbGVtZW50IGlkIGlzIG1pc3NpbmcgdGhlbiBwaW5jaCBib3VuZGluZyBhcmVhIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBJZiBib3RoIHRoZSBlbGVtZW50IGlkIGFuZCB0aGUgcGluY2ggYm91bmRpbmcgYXJlYSBhcmUgcHJvdmlkZWQgdGhlbiB0aGVcbiAqIGFyZWEgaXMgZWZmZWN0aXZlbHkgaWdub3JlZC5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gbGVmdCAtIFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHBpbmNoIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdG9wIC0gVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBwaW5jaCBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBwaW5jaCBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHBpbmNoIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7IW51bWJlcn0gcGVyY2VudCAtIFRoZSBzaXplIG9mIHRoZSBwaW5jaCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHBpbmNoIGFyZWEgc2l6ZS5cbiAqIFZhbGlkIHZhbHVlcyBtdXN0IGJlIGZsb2F0IG51bWJlcnMgaW4gcmFuZ2UgMC4uMSwgd2hlcmUgMS4wIGlzIDEwMCVcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gc3BlZWQgWzI1MDAgKiBkaXNwbGF5RGVuc2l0eV0gLSBUaGUgc3BlZWQgYXQgd2hpY2ggdG8gcGVyZm9ybVxuICogdGhpcyBnZXN0dXJlIGluIHBpeGVscyBwZXIgc2Vjb25kLiBUaGUgdmFsdWUgbXVzdCBub3QgYmUgbmVnYXRpdmVcbiAqL1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgcGluY2ggY2xvc2UgZ2VzdHVyZS5cbiAqXG4gKiBAcGFyYW0gez9QaW5jaE9wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlUGluY2hDbG9zZUdlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVQaW5jaENsb3NlR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0LFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL3BpbmNoX2Nsb3NlJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIGFyZWE6IHRvUmVjdChsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpLFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIHBpbmNoIG9wZW4gZ2VzdHVyZS5cbiAqXG4gKiBAcGFyYW0gez9QaW5jaE9wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlUGluY2hPcGVuR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVBpbmNoT3Blbkdlc3R1cmUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudElkLFxuICAgIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCxcbiAgICBwZXJjZW50LFxuICAgIHNwZWVkLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9waW5jaF9vcGVuJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIGFyZWE6IHRvUmVjdChsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpLFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTd2lwZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZWxlbWVudElkIC0gVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIHN3aXBlZC5cbiAqIElmIHRoZSBlbGVtZW50IGlkIGlzIG1pc3NpbmcgdGhlbiBzd2lwZSBib3VuZGluZyBhcmVhIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBJZiBib3RoIHRoZSBlbGVtZW50IGlkIGFuZCB0aGUgc3dpcGUgYm91bmRpbmcgYXJlYSBhcmUgcHJvdmlkZWQgdGhlbiB0aGVcbiAqIGFyZWEgaXMgZWZmZWN0aXZlbHkgaWdub3JlZC5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gbGVmdCAtIFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHN3aXBlIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdG9wIC0gVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBzd2lwZSBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBzd2lwZSBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHN3aXBlIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gZGlyZWN0aW9uIC0gRGlyZWN0aW9uIG9mIHRoZSBzd2lwZS5cbiAqIEFjY2VwdGFibGUgdmFsdWVzIGFyZTogYHVwYCwgYGRvd25gLCBgbGVmdGAgYW5kIGByaWdodGAgKGNhc2UgaW5zZW5zaXRpdmUpXG4gKiBAcHJvcGVydHkgeyFudW1iZXJ9IHBlcmNlbnQgLSBUaGUgc2l6ZSBvZiB0aGUgc3dpcGUgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBzd2lwZSBhcmVhIHNpemUuXG4gKiBWYWxpZCB2YWx1ZXMgbXVzdCBiZSBmbG9hdCBudW1iZXJzIGluIHJhbmdlIDAuLjEsIHdoZXJlIDEuMCBpcyAxMDAlXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHNwZWVkIFs1MDAwICogZGlzcGxheURlbnNpdHldIC0gVGhlIHNwZWVkIGF0IHdoaWNoIHRvIHBlcmZvcm0gdGhpc1xuICogZ2VzdHVyZSBpbiBwaXhlbHMgcGVyIHNlY29uZC4gVGhlIHZhbHVlIG11c3Qgbm90IGJlIG5lZ2F0aXZlXG4gKi9cblxuLyoqXG4gKiBQZXJmb3JtcyBhIHN3aXBlIGdlc3R1cmUuXG4gKlxuICogQHBhcmFtIHs/U3dpcGVPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN3aXBlR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVN3aXBlR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0LFxuICAgIGRpcmVjdGlvbixcbiAgICBwZXJjZW50LFxuICAgIHNwZWVkLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9zd2lwZScsICdQT1NUJywge1xuICAgIG9yaWdpbjogdG9PcmlnaW4oZWxlbWVudElkKSxcbiAgICBhcmVhOiB0b1JlY3QobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KSxcbiAgICBkaXJlY3Rpb24sXG4gICAgcGVyY2VudCxcbiAgICBzcGVlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNjcm9sbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZWxlbWVudElkIC0gVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIHNjcm9sbGVkLlxuICogSWYgdGhlIGVsZW1lbnQgaWQgaXMgbWlzc2luZyB0aGVuIHNjcm9sbCBib3VuZGluZyBhcmVhIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBJZiBib3RoIHRoZSBlbGVtZW50IGlkIGFuZCB0aGUgc2Nyb2xsIGJvdW5kaW5nIGFyZWEgYXJlIHByb3ZpZGVkIHRoZW4gdGhpc1xuICogYXJlYSBpcyBlZmZlY3RpdmVseSBpZ25vcmVkLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBsZWZ0IC0gVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgc2Nyb2xsIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdG9wIC0gVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBzY3JvbGwgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgc2Nyb2xsIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgc2Nyb2xsIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gZGlyZWN0aW9uIC0gRGlyZWN0aW9uIG9mIHRoZSBzY3JvbGwuXG4gKiBBY2NlcHRhYmxlIHZhbHVlcyBhcmU6IGB1cGAsIGBkb3duYCwgYGxlZnRgIGFuZCBgcmlnaHRgIChjYXNlIGluc2Vuc2l0aXZlKVxuICogQHByb3BlcnR5IHshbnVtYmVyfSBwZXJjZW50IC0gVGhlIHNpemUgb2YgdGhlIHNjcm9sbCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHNjcm9sbGluZyBhcmVhIHNpemUuXG4gKiBWYWxpZCB2YWx1ZXMgbXVzdCBiZSBmbG9hdCBudW1iZXJzIGdyZWF0ZXIgdGhhbiB6ZXJvLCB3aGVyZSAxLjAgaXMgMTAwJVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBzcGVlZCBbNTAwMCAqIGRpc3BsYXlEZW5zaXR5XSAtIFRoZSBzcGVlZCBhdCB3aGljaCB0byBwZXJmb3JtIHRoaXMgZ2VzdHVyZVxuICogaW4gcGl4ZWxzIHBlciBzZWNvbmQuIFRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBuZWdhdGl2ZVxuICovXG5cbi8qKlxuICogUGVyZm9ybXMgYSBzY3JvbGwgZ2VzdHVyZS5cbiAqXG4gKiBAcGFyYW0gez9TY3JvbGxPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgb2JqZWN0IGNhbiBzdGlsbCBzY3JvbGwgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbi5cbiAqL1xuY29tbWFuZHMubW9iaWxlU2Nyb2xsR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVNjcm9sbEdlc3R1cmUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudElkLFxuICAgIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCxcbiAgICBkaXJlY3Rpb24sXG4gICAgcGVyY2VudCxcbiAgICBzcGVlZCxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvc2Nyb2xsJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIGFyZWE6IHRvUmVjdChsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpLFxuICAgIGRpcmVjdGlvbixcbiAgICBwZXJjZW50LFxuICAgIHNwZWVkLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2Nyb2xsRWxlbWVudFRvRWxlbWVudE9wdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlbGVtZW50SWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHNjcm9sbGFibGUgZWxlbWVudCxcbiAqIHdoaWNoIGlzIGdvaW5nIHRvIGJlIHNjcm9sbGVkLiBJdCBpcyByZXF1aXJlZCB0aGlzIGVsZW1lbnRcbiAqIGlzIGEgdmFsaWQgc2Nyb2xsYWJsZSBjb250YWluZXIgYW5kIGl0IHdhcyBsb2NhdGVkIGJ5IGAtYW5kcm9pZCB1aWF1dG9tYXRvcmBcbiAqIHN0cmF0ZWd5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVsZW1lbnRUb0lkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBpdGVtLCB3aGljaCBiZWxvbmdzXG4gKiB0byB0aGUgc2Nyb2xsYWJsZSBlbGVtZW50IGFib3ZlLCBhbmQgd2hpY2ggc2hvdWxkIGJlY29tZSB2aXNpYmxlIGFmdGVyXG4gKiB0aGUgc2Nyb2xsaW5nIG9wZXJhdGlvbiBpcyBmaW5pc2hlZC4gSXQgaXMgcmVxdWlyZWQgdGhpcyBlbGVtZW50XG4gKiB3YXMgbG9jYXRlZCBieSBgLWFuZHJvaWQgdWlhdXRvbWF0b3JgIHN0cmF0ZWd5LlxuICovXG5cbi8qKlxuICogU2Nyb2xscyB0aGUgZ2l2ZW4gc2Nyb2xsYWJsZSBlbGVtZW50IGBlbGVtZW50SWRgIHVudGlsIGBlbGVtZW50VG9JZGBcbiAqIGJlY29tZXMgdmlzaWJsZS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGltbWVkaWF0ZWx5IGlmIHRoZSBgZWxlbWVudFRvSWRgXG4gKiBpcyBhbHJlYWR5IHZpc2libGUgaW4gdGhlIHZpZXcgcG9ydC4gT3RoZXJ3aXNlIGl0IHdvdWxkIHNjcm9sbFxuICogdG8gdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBzY3JvbGxhYmxlIGNvbnRyb2wgYW5kIHRyaWVzIHRvIHJlYWNoIHRoZSBkZXN0aW5hdGlvbiBlbGVtZW50XG4gKiBieSBzY3JvbGxpbmcgaXRzIHBhcmVudCB0byB0aGUgZW5kIHN0ZXAgYnkgc3RlcC4gVGhlIHNjcm9sbCBkaXJlY3Rpb24gKHZlcnRpY2FsIG9yIGhvcml6b250YWwpXG4gKiBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEBwYXJhbSB7U2Nyb2xsRWxlbWVudFRvRWxlbWVudE9wdHN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgc2Nyb2xsaW5nIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVNjcm9sbEJhY2tUbyA9IGFzeW5jIGZ1bmN0aW9uIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2VsZW1lbnRJZCwgZWxlbWVudFRvSWR9ID0gb3B0cztcbiAgaWYgKCFlbGVtZW50SWQgfHwgIWVsZW1lbnRUb0lkKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgQm90aCBlbGVtZW50SWQgYW5kIGVsZW1lbnRUb0lkIGFyZ3VtZW50cyBtdXN0IGJlIHByb3ZpZGVkYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZChcbiAgICBgL2FwcGl1bS9lbGVtZW50LyR7dXRpbC51bndyYXBFbGVtZW50KGVsZW1lbnRJZCl9L3Njcm9sbF90by8ke3V0aWwudW53cmFwRWxlbWVudChlbGVtZW50VG9JZCl9YCwgJ1BPU1QnLCB7fSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNjcm9sbE9wdHNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZWxlbWVudElkIFRoZSBpZGVudGlmaWVyIG9mIGFuIGVsZW1lbnQuIEl0IGlzIHJlcXVpcmVkIHRoaXMgZWxlbWVudFxuICogaXMgYSB2YWxpZCBzY3JvbGxhYmxlIGNvbnRhaW5lciBhbmQgaXQgd2FzIGxvY2F0ZWQgYnkgYC1hbmRyb2lkIHVpYXV0b21hdG9yYFxuICogc3RyYXRlZ3kuIElmIHRoaXMgcHJvcGVydHkgaXMgbm90IHByb3ZpZGVkIHRoZW4gdGhlIGZpcnN0IGN1cnJlbnRseSBhdmFpbGFibGUgc2Nyb2xsYWJsZSB2aWV3XG4gKiBpcyBzZWxlY3RlZCBmb3IgdGhlIGludGVyYWN0aW9uLlxuICogQHByb3BlcnR5IHshc3RyaW5nfSBzdHJhdGVneSBUaGUgZm9sbG93aW5nIHN0cmF0ZWdpZXMgYXJlIHN1cHBvcnRlZDpcbiAqIC0gYGFjY2Vzc2liaWxpdHkgaWRgIChVaVNlbGVjdG9yKCkuZGVzY3JpcHRpb24pXG4gKiAtIGBjbGFzcyBuYW1lYCAoVWlTZWxlY3RvcigpLmNsYXNzTmFtZSlcbiAqIC0gYC1hbmRyb2lkIHVpYXV0b21hdG9yYCAoVWlTZWxlY3RvcilcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gc2VsZWN0b3IgVGhlIGNvcnJlc3BvbmRpbmcgbG9va3VwIHZhbHVlIGZvciB0aGUgZ2l2ZW5cbiAqIHN0cmF0ZWd5LlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBtYXhTd2lwZXMgVGhlIG1heGltdW0gbnVtYmVyIG9mIHN3aXBlcyB0byBwZXJmb3JtXG4gKiBvbiB0aGUgdGFyZ2V0IHNjcm9sbGFibGUgdmlldyBpbiBvcmRlciB0byByZWFjaCB0aGUgZGVzdGluYXRpb24gZWxlbWVudC5cbiAqIEluIGNhc2UgdGhpcyB2YWx1ZSBpcyB1bnNldCB0aGVuIGl0IHdvdWxkIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBzY3JvbGxhYmxlXG4gKiBlbGVtZW50IGl0c2VsZiAodnVhIGBnZXRNYXhTZWFyY2hTd2lwZXMoKWAgcHJvcGVydHkpLlxuICovXG5cbi8qKlxuICogU2Nyb2xscyB0aGUgZ2l2ZW4gc2Nyb2xsYWJsZSBlbGVtZW50IHVudGlsIHRoZSBlbGVtZW50IGlkZW50aWZpZWRcbiAqIGJ5IGBzdHJhdGVneWAgYW5kIGBzZWxlY3RvcmAgYmVjb21lcyB2aXNpYmxlLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgdGhlXG4gKiBkZXN0aW5hdGlvbiBlbGVtZW50IGlzIGFscmVhZHkgdmlzaWJsZSBpbiB0aGUgdmlldyBwb3J0LiBPdGhlcndpc2UgaXQgd291bGQgc2Nyb2xsXG4gKiB0byB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgdGhlIHNjcm9sbGFibGUgY29udHJvbCBhbmQgdHJpZXMgdG8gcmVhY2ggdGhlIGRlc3RpbmF0aW9uIGVsZW1lbnRcbiAqIGJ5IHNjcm9sbGluZyBpdHMgcGFyZW50IHRvIHRoZSBlbmQgc3RlcCBieSBzdGVwLiBUaGUgc2Nyb2xsIGRpcmVjdGlvbiAodmVydGljYWwgb3IgaG9yaXpvbnRhbClcbiAqIGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogQHBhcmFtIHtTY3JvbGxPcHRzfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIHNjcm9sbGluZyBvcGVyYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZFxuICovXG5jb21tYW5kcy5tb2JpbGVTY3JvbGwgPSBhc3luYyBmdW5jdGlvbiAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50LCBlbGVtZW50SWQsIC8vIGBlbGVtZW50YCBpcyBkZXByZWNhdGVkLCB1c2UgYGVsZW1lbnRJZGAgaW5zdGVhZFxuICAgIHN0cmF0ZWd5LCBzZWxlY3RvciwgbWF4U3dpcGVzXG4gIH0gPSBvcHRzO1xuICBpZiAoIXN0cmF0ZWd5IHx8ICFzZWxlY3Rvcikge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYEJvdGggc3RyYXRlZ3kgYW5kIHNlbGVjdG9yIGFyZ3VtZW50cyBtdXN0IGJlIHByb3ZpZGVkYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL3RvdWNoL3Njcm9sbCcsICdQT1NUJywge1xuICAgIG9yaWdpbjogdG9PcmlnaW4oZWxlbWVudElkIHx8IGVsZW1lbnQpLFxuICAgIHBhcmFtczoge3N0cmF0ZWd5LCBzZWxlY3RvciwgbWF4U3dpcGVzfSxcbiAgfSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJmaWxlIjoibGliL2NvbW1hbmRzL2dlc3R1cmVzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
|
package/build/lib/driver.js
CHANGED
|
@@ -52,8 +52,8 @@ const DEVICE_PORT_ALLOCATION_GUARD = _appiumSupport.util.getLockFileGuard(_path.
|
|
|
52
52
|
const DEVICE_PORT = 6790;
|
|
53
53
|
const MJPEG_SERVER_DEVICE_PORT = 7810;
|
|
54
54
|
const LOCALHOST_IP4 = '127.0.0.1';
|
|
55
|
-
const NO_PROXY = [['GET', new RegExp('^/session/(?!.*/)')], ['GET', new RegExp('^/session/[^/]+/alert_[^/]+')], ['GET', new RegExp('^/session/[^/]+/alert/[^/]+')], ['GET', new RegExp('^/session/[^/]+/appium/[^/]+/current_activity')], ['GET', new RegExp('^/session/[^/]+/appium/[^/]+/current_package')], ['GET', new RegExp('^/session/[^/]+/appium/app/[^/]+')], ['GET', new RegExp('^/session/[^/]+/appium/device/[^/]+')], ['GET', new RegExp('^/session/[^/]+/appium/settings')], ['GET', new RegExp('^/session/[^/]+/context')], ['GET', new RegExp('^/session/[^/]+/contexts')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/attribute')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/displayed')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/enabled')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/location_in_view')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/name')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/screenshot')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/selected')], ['GET', new RegExp('^/session/[^/]+/ime/[^/]+')], ['GET', new RegExp('^/session/[^/]+/location')], ['GET', new RegExp('^/session/[^/]+/
|
|
56
|
-
const CHROME_NO_PROXY = [['GET', new RegExp('^/session/[^/]+/appium')], ['GET', new RegExp('^/session/[^/]+/context')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/rect')], ['GET', new RegExp('^/session/[^/]+/
|
|
55
|
+
const NO_PROXY = [['GET', new RegExp('^/session/(?!.*/)')], ['GET', new RegExp('^/session/[^/]+/alert_[^/]+')], ['GET', new RegExp('^/session/[^/]+/alert/[^/]+')], ['GET', new RegExp('^/session/[^/]+/appium/[^/]+/current_activity')], ['GET', new RegExp('^/session/[^/]+/appium/[^/]+/current_package')], ['GET', new RegExp('^/session/[^/]+/appium/app/[^/]+')], ['GET', new RegExp('^/session/[^/]+/appium/device/[^/]+')], ['GET', new RegExp('^/session/[^/]+/appium/settings')], ['GET', new RegExp('^/session/[^/]+/context')], ['GET', new RegExp('^/session/[^/]+/contexts')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/attribute')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/displayed')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/enabled')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/location_in_view')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/name')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/screenshot')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/selected')], ['GET', new RegExp('^/session/[^/]+/ime/[^/]+')], ['GET', new RegExp('^/session/[^/]+/location')], ['GET', new RegExp('^/session/[^/]+/network_connection')], ['GET', new RegExp('^/session/[^/]+/screenshot')], ['GET', new RegExp('^/session/[^/]+/timeouts')], ['GET', new RegExp('^/session/[^/]+/url')], ['POST', new RegExp('^/session/[^/]+/[^/]+_alert$')], ['POST', new RegExp('^/session/[^/]+/actions')], ['POST', new RegExp('^/session/[^/]+/alert/[^/]+')], ['POST', new RegExp('^/session/[^/]+/app/[^/]')], ['POST', new RegExp('^/session/[^/]+/appium/[^/]+/start_activity')], ['POST', new RegExp('^/session/[^/]+/appium/app/[^/]+')], ['POST', new RegExp('^/session/[^/]+/appium/compare_images')], ['POST', new RegExp('^/session/[^/]+/appium/device/(?!set_clipboard)[^/]+')], ['POST', new RegExp('^/session/[^/]+/appium/element/[^/]+/replace_value')], ['POST', new RegExp('^/session/[^/]+/appium/element/[^/]+/value')], ['POST', new RegExp('^/session/[^/]+/appium/getPerformanceData')], ['POST', new RegExp('^/session/[^/]+/appium/performanceData/types')], ['POST', new RegExp('^/session/[^/]+/appium/settings')], ['POST', new RegExp('^/session/[^/]+/appium/execute_driver')], ['POST', new RegExp('^/session/[^/]+/appium/start_recording_screen')], ['POST', new RegExp('^/session/[^/]+/appium/stop_recording_screen')], ['POST', new RegExp('^/session/[^/]+/appium/.*event')], ['POST', new RegExp('^/session/[^/]+/context')], ['POST', new RegExp('^/session/[^/]+/element')], ['POST', new RegExp('^/session/[^/]+/ime/[^/]+')], ['POST', new RegExp('^/session/[^/]+/keys')], ['POST', new RegExp('^/session/[^/]+/location')], ['POST', new RegExp('^/session/[^/]+/network_connection')], ['POST', new RegExp('^/session/[^/]+/timeouts')], ['POST', new RegExp('^/session/[^/]+/touch/multi/perform')], ['POST', new RegExp('^/session/[^/]+/touch/perform')], ['POST', new RegExp('^/session/[^/]+/url')], ['GET', new RegExp('^/session/[^/]+/log/types')], ['POST', new RegExp('^/session/[^/]+/execute')], ['POST', new RegExp('^/session/[^/]+/execute_async')], ['POST', new RegExp('^/session/[^/]+/log')], ['GET', new RegExp('^/session/[^/]+/se/log/types')], ['GET', new RegExp('^/session/[^/]+/window/rect')], ['POST', new RegExp('^/session/[^/]+/execute/async')], ['POST', new RegExp('^/session/[^/]+/execute/sync')], ['POST', new RegExp('^/session/[^/]+/se/log')]];
|
|
56
|
+
const CHROME_NO_PROXY = [['GET', new RegExp('^/session/[^/]+/appium')], ['GET', new RegExp('^/session/[^/]+/context')], ['GET', new RegExp('^/session/[^/]+/element/[^/]+/rect')], ['GET', new RegExp('^/session/[^/]+/orientation')], ['POST', new RegExp('^/session/[^/]+/appium')], ['POST', new RegExp('^/session/[^/]+/context')], ['POST', new RegExp('^/session/[^/]+/orientation')], ['POST', new RegExp('^/session/[^/]+/touch/multi/perform')], ['POST', new RegExp('^/session/[^/]+/touch/perform')], ['POST', new RegExp('^/session/[^/]+/execute$')], ['POST', new RegExp('^/session/[^/]+/execute/sync')], ['GET', new RegExp('^/session/[^/]+/log/types$')], ['POST', new RegExp('^/session/[^/]+/log$')], ['GET', new RegExp('^/session/[^/]+/se/log/types$')], ['POST', new RegExp('^/session/[^/]+/se/log$')]];
|
|
57
57
|
const MEMOIZED_FUNCTIONS = ['getStatusBarHeight', 'getDevicePixelRatio'];
|
|
58
58
|
|
|
59
59
|
class AndroidUiautomator2Driver extends _appiumBaseDriver.BaseDriver {
|
|
@@ -367,6 +367,7 @@ class AndroidUiautomator2Driver extends _appiumBaseDriver.BaseDriver {
|
|
|
367
367
|
};
|
|
368
368
|
this.uiautomator2 = new _uiautomator.UiAutomator2Server(uiautomator2Opts);
|
|
369
369
|
this.proxyReqRes = this.uiautomator2.proxyReqRes.bind(this.uiautomator2);
|
|
370
|
+
this.proxyCommand = this.uiautomator2.proxyCommand.bind(this.uiautomator2);
|
|
370
371
|
|
|
371
372
|
if (this.opts.skipServerInstallation) {
|
|
372
373
|
_logger.default.info(`'skipServerInstallation' is set. Skipping UIAutomator2 server installation.`);
|
|
@@ -400,17 +401,21 @@ class AndroidUiautomator2Driver extends _appiumBaseDriver.BaseDriver {
|
|
|
400
401
|
}
|
|
401
402
|
|
|
402
403
|
if (this.opts.app) {
|
|
403
|
-
if (
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
404
|
+
if (this.opts.noReset && !(await this.adb.isAppInstalled(this.opts.appPackage)) || !this.opts.noReset) {
|
|
405
|
+
if (!this.opts.noSign && !(await this.adb.checkApkCert(this.opts.app, this.opts.appPackage, {
|
|
406
|
+
requireDefaultCert: false
|
|
407
|
+
}))) {
|
|
408
|
+
await helpers.signApp(this.adb, this.opts.app);
|
|
409
|
+
}
|
|
408
410
|
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
411
|
+
if (!this.opts.skipUninstall) {
|
|
412
|
+
await this.adb.uninstallApk(this.opts.appPackage);
|
|
413
|
+
}
|
|
412
414
|
|
|
413
|
-
|
|
415
|
+
await helpers.installApk(this.adb, this.opts);
|
|
416
|
+
} else {
|
|
417
|
+
_logger.default.debug('noReset has been requested and the app is already installed. Doing nothing');
|
|
418
|
+
}
|
|
414
419
|
} else {
|
|
415
420
|
if (this.opts.fullReset) {
|
|
416
421
|
_logger.default.errorAndThrow('Full reset requires an app capability, use fastReset if app is not provided');
|
|
@@ -641,4 +646,4 @@ var _default = AndroidUiautomator2Driver;
|
|
|
641
646
|
exports.default = _default;require('source-map-support').install();
|
|
642
647
|
|
|
643
648
|
|
|
644
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kcml2ZXIuanMiXSwibmFtZXMiOlsiaGVscGVycyIsIk9iamVjdCIsImFzc2lnbiIsInVpYXV0b21hdG9yMkhlbHBlcnMiLCJhbmRyb2lkSGVscGVycyIsIkRFVklDRV9QT1JUX1JBTkdFIiwiREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRCIsInV0aWwiLCJnZXRMb2NrRmlsZUd1YXJkIiwicGF0aCIsInJlc29sdmUiLCJvcyIsInRtcGRpciIsInRpbWVvdXQiLCJ0cnlSZWNvdmVyeSIsIkRFVklDRV9QT1JUIiwiTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUIiwiTE9DQUxIT1NUX0lQNCIsIk5PX1BST1hZIiwiUmVnRXhwIiwiQ0hST01FX05PX1BST1hZIiwiTUVNT0laRURfRlVOQ1RJT05TIiwiQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlciIsIkJhc2VEcml2ZXIiLCJjb25zdHJ1Y3RvciIsIm9wdHMiLCJzaG91bGRWYWxpZGF0ZUNhcHMiLCJzaGVsbCIsImxvY2F0b3JTdHJhdGVnaWVzIiwiZGVzaXJlZENhcENvbnN0cmFpbnRzIiwidWlhdXRvbWF0b3IyIiwiandwUHJveHlBY3RpdmUiLCJkZWZhdWx0SU1FIiwiandwUHJveHlBdm9pZCIsImFwa1N0cmluZ3MiLCJzZXR0aW5ncyIsIkRldmljZVNldHRpbmdzIiwiaWdub3JlVW5pbXBvcnRhbnRWaWV3cyIsImFsbG93SW52aXNpYmxlRWxlbWVudHMiLCJvblNldHRpbmdzVXBkYXRlIiwiYmluZCIsImNocm9tZWRyaXZlciIsInNlc3Npb25DaHJvbWVkcml2ZXJzIiwiZm4iLCJfIiwibWVtb2l6ZSIsInZhbGlkYXRlRGVzaXJlZENhcHMiLCJjYXBzIiwiY3JlYXRlU2Vzc2lvbiIsImFyZ3MiLCJzZXNzaW9uSWQiLCJzZXJ2ZXJEZXRhaWxzIiwicGxhdGZvcm0iLCJ3ZWJTdG9yYWdlRW5hYmxlZCIsInRha2VzU2NyZWVuc2hvdCIsImphdmFzY3JpcHRFbmFibGVkIiwiZGF0YWJhc2VFbmFibGVkIiwibmV0d29ya0Nvbm5lY3Rpb25FbmFibGVkIiwibG9jYXRpb25Db250ZXh0RW5hYmxlZCIsIndhcm5pbmdzIiwiZGVzaXJlZCIsImN1ckNvbnRleHQiLCJkZWZhdWx0Q29udGV4dE5hbWUiLCJkZWZhdWx0T3B0cyIsImZ1bGxSZXNldCIsImF1dG9MYXVuY2giLCJhZGJQb3J0IiwiREVGQVVMVF9BREJfUE9SVCIsImFuZHJvaWRJbnN0YWxsVGltZW91dCIsImRlZmF1bHRzIiwiaXNDaHJvbWVTZXNzaW9uIiwibG9nZ2VyIiwiaW5mbyIsInBrZyIsImFjdGl2aXR5IiwiZ2V0Q2hyb21lUGtnIiwiYnJvd3Nlck5hbWUiLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJyZWJvb3QiLCJzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIiwiYXBwIiwiY29uZmlndXJlQXBwIiwiQVBLX0VYVEVOU0lPTiIsIkFQS1NfRVhURU5TSU9OIiwiY2hlY2tBcHBQcmVzZW50Iiwic3RhcnRVaUF1dG9tYXRvcjJTZXNzaW9uIiwiZmlsbERldmljZURldGFpbHMiLCJtanBlZ1NjcmVlbnNob3RVcmwiLCJtanBlZ1N0cmVhbSIsIm1qcGVnIiwiTUpwZWdTdHJlYW0iLCJzdGFydCIsImUiLCJkZWxldGVTZXNzaW9uIiwicGl4ZWxSYXRpbyIsImdldERldmljZVBpeGVsUmF0aW8iLCJzdGF0QmFySGVpZ2h0IiwiZ2V0U3RhdHVzQmFySGVpZ2h0Iiwidmlld3BvcnRSZWN0IiwiZ2V0Vmlld1BvcnRSZWN0IiwiZHJpdmVyRGF0YSIsImdldFNlc3Npb24iLCJzZXNzaW9uRGF0YSIsImRlYnVnIiwidWlhMkRhdGEiLCJqd3Byb3h5IiwiY29tbWFuZCIsImlzRW11bGF0b3IiLCJhZGIiLCJhdmQiLCJkZXZpY2VOYW1lIiwiZXJyb3JBbmRUaHJvdyIsInBsYXRmb3JtVmVyc2lvbiIsImF2ZERldmljZSIsInJlcGxhY2UiLCJhbGxvY2F0ZVN5c3RlbVBvcnQiLCJmb3J3YXJkUG9ydCIsImxvY2FsUG9ydCIsInN5c3RlbVBvcnQiLCJfaGFzU3lzdGVtUG9ydEluQ2FwcyIsInN0YXJ0UG9ydCIsImVuZFBvcnQiLCJyZWxlYXNlU3lzdGVtUG9ydCIsInJlbW92ZVBvcnRGb3J3YXJkIiwiYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQiLCJtanBlZ1NlcnZlclBvcnQiLCJyZWxlYXNlTWpwZWdTZXJ2ZXJQb3J0IiwidWRpZCIsImVtUG9ydCIsImdldERldmljZUluZm9Gcm9tQ2FwcyIsImNyZWF0ZUFEQiIsImFwaUxldmVsIiwiZ2V0QXBpTGV2ZWwiLCJzZXRIaWRkZW5BcGlQb2xpY3kiLCJpZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvciIsImhhc1ZhbHVlIiwiZ3BzRW5hYmxlZCIsInRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIiLCJ3YXJuIiwiYXBwSW5mbyIsImdldExhdW5jaEluZm8iLCJjdXJEZXZpY2VJZCIsImRldmljZVVESUQiLCJpbml0RGV2aWNlIiwiaW5pdFVpQXV0b21hdG9yMlNlcnZlciIsImRpc2FibGVXaW5kb3dBbmltYXRpb24iLCJpc0FuaW1hdGlvbk9uIiwic2V0QW5pbWF0aW9uU3RhdGUiLCJfd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQiLCJpbml0QVVUIiwic3RhcnRTZXNzaW9uIiwiYWRkRGV2aWNlSW5mb1RvQ2FwcyIsInNraXBVbmxvY2siLCJ1bmxvY2siLCJzdGFydENocm9tZVNlc3Npb24iLCJlbnN1cmVBcHBTdGFydHMiLCJvcmllbnRhdGlvbiIsInNldE9yaWVudGF0aW9uIiwiYXV0b1dlYnZpZXciLCJ2aWV3TmFtZSIsImRlZmF1bHRXZWJ2aWV3TmFtZSIsImF1dG9XZWJ2aWV3VGltZW91dCIsInNldENvbnRleHQiLCJhcGlWZXJzaW9uIiwibWFudWZhY3R1cmVyIiwibW9kZWwiLCJyZWFsRGlzcGxheVNpemUiLCJkaXNwbGF5RGVuc2l0eSIsIm1vYmlsZUdldERldmljZUluZm8iLCJkZXZpY2VBcGlMZXZlbCIsInBhcnNlSW50IiwiZGV2aWNlU2NyZWVuU2l6ZSIsImRldmljZVNjcmVlbkRlbnNpdHkiLCJkZXZpY2VNb2RlbCIsImRldmljZU1hbnVmYWN0dXJlciIsInVpYXV0b21hdG9yMk9wdHMiLCJob3N0IiwicmVtb3RlQWRiSG9zdCIsImRldmljZVBvcnQiLCJhcGsiLCJ0bXBEaXIiLCJkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSIsInJlYWRUaW1lb3V0IiwidWlhdXRvbWF0b3IyU2VydmVyUmVhZFRpbWVvdXQiLCJVaUF1dG9tYXRvcjJTZXJ2ZXIiLCJwcm94eVJlcVJlcyIsInNraXBTZXJ2ZXJJbnN0YWxsYXRpb24iLCJpbnN0YWxsU2VydmVyQXBrIiwidWlhdXRvbWF0b3IyU2VydmVySW5zdGFsbFRpbWVvdXQiLCJhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QiLCJTRVRUSU5HU19IRUxQRVJfUEtHX0lEIiwiU0VSVkVSX1BBQ0tBR0VfSUQiLCJTRVJWRVJfVEVTVF9QQUNLQUdFX0lEIiwic3RkZXJyIiwibWVzc2FnZSIsInVuaW5zdGFsbE90aGVyUGFja2FnZXMiLCJwYXJzZUFycmF5Iiwib3RoZXJBcHBzIiwiQiIsImFsbCIsIm1hcCIsImluc3RhbGxPdGhlckFwa3MiLCJub1NpZ24iLCJjaGVja0Fwa0NlcnQiLCJyZXF1aXJlRGVmYXVsdENlcnQiLCJzaWduQXBwIiwic2tpcFVuaW5zdGFsbCIsInVuaW5zdGFsbEFwayIsImluc3RhbGxBcGsiLCJmYXN0UmVzZXQiLCJyZXNldEFwcCIsImFwcFdhaXRQYWNrYWdlIiwiYXBwV2FpdEFjdGl2aXR5IiwiYW5kcm9pZENvdmVyYWdlIiwic3RhcnRBcHAiLCJhY3Rpb24iLCJpbnRlbnRBY3Rpb24iLCJjYXRlZ29yeSIsImludGVudENhdGVnb3J5IiwiZmxhZ3MiLCJpbnRlbnRGbGFncyIsIndhaXRQa2ciLCJ3YWl0QWN0aXZpdHkiLCJ3YWl0Rm9yTGF1bmNoIiwiYXBwV2FpdEZvckxhdW5jaCIsIndhaXREdXJhdGlvbiIsImFwcFdhaXREdXJhdGlvbiIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwic3RvcEFwcCIsImRvbnRTdG9wQXBwT25SZXNldCIsInJldHJ5IiwidXNlciIsInVzZXJQcm9maWxlIiwiaXNFbXB0eSIsIl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzIiwic3RvcFJlY29yZGluZ1NjcmVlbiIsImlnbiIsInJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyIsInNlcnZlciIsIm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmciLCJzdG9wQ2hyb21lZHJpdmVyUHJveGllcyIsImVyciIsInVuaWNvZGVLZXlib2FyZCIsInJlc2V0S2V5Ym9hcmQiLCJzZXRJTUUiLCJlbmRBbmRyb2lkQ292ZXJhZ2UiLCJhbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQiLCJicm9hZGNhc3QiLCJmb3JjZVN0b3AiLCJzdG9wTG9nY2F0IiwiZXJyb3IiLCJzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5IiwiYXZkTmFtZSIsImtpbGxFbXVsYXRvciIsInN0b3AiLCJmcyIsImV4aXN0cyIsIndyYXBCb290c3RyYXBEaXNjb25uZWN0Iiwid3JhcHBlZCIsInJlc3RhcnQiLCJwcm94eUFjdGl2ZSIsImNhblByb3h5IiwiZ2V0UHJveHlBdm9pZExpc3QiLCJuYXRpdmVXZWJTY3JlZW5zaG90IiwiaXNDaHJvbWVCcm93c2VyIiwiY21kIiwidG9QYWlycyIsImFuZHJvaWRDb21tYW5kcyIsInByb3RvdHlwZSIsImNvbW1hbmRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLE9BQU8sR0FBR0MsTUFBTSxDQUFDQyxNQUFQLENBQWMsRUFBZCxFQUFrQkMsZ0JBQWxCLEVBQXVDQyxtQ0FBdkMsQ0FBaEI7QUFJQSxNQUFNQyxpQkFBaUIsR0FBRyxDQUFDLElBQUQsRUFBTyxJQUFQLENBQTFCOztBQUlBLE1BQU1DLDRCQUE0QixHQUFHQyxvQkFBS0MsZ0JBQUws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LElBQUlkLE1BQUosQ0FBVyw0QkFBWCxDQUFSLENBQXhCLENBQXJCO0FBQ0Q7O0FBRUQsV0FBTyxLQUFLYyxhQUFaO0FBQ0Q7O0FBRWtCLE1BQWZxQyxlQUFlLEdBQUk7QUFDckIsV0FBT3RFLE9BQU8sQ0FBQ3lRLGVBQVIsQ0FBd0IsS0FBS2hQLElBQUwsQ0FBVW1ELFdBQWxDLENBQVA7QUFDRDs7QUFubUJnRDs7OztBQXVtQm5ELEtBQUssSUFBSSxDQUFDOEwsR0FBRCxFQUFNL04sRUFBTixDQUFULElBQXNCQyxnQkFBRStOLE9BQUYsQ0FBVUMsb0NBQVYsQ0FBdEIsRUFBa0Q7QUFDaER0UCxFQUFBQSx5QkFBeUIsQ0FBQ3VQLFNBQTFCLENBQW9DSCxHQUFwQyxJQUEyQy9OLEVBQTNDO0FBQ0Q7O0FBR0QsS0FBSyxJQUFJLENBQUMrTixHQUFELEVBQU0vTixFQUFOLENBQVQsSUFBc0JDLGdCQUFFK04sT0FBRixDQUFVRyxjQUFWLENBQXRCLEVBQTJDO0FBQ3pDeFAsRUFBQUEseUJBQXlCLENBQUN1UCxTQUExQixDQUFvQ0gsR0FBcEMsSUFBMkMvTixFQUEzQztBQUNEOztlQUdjckIseUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQmFzZURyaXZlciwgRGV2aWNlU2V0dGluZ3MgfSBmcm9tICdhcHBpdW0tYmFzZS1kcml2ZXInO1xuaW1wb3J0IHtcbiAgVWlBdXRvbWF0b3IyU2VydmVyLCBTRVJWRVJfUEFDS0FHRV9JRCwgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRFxufSBmcm9tICcuL3VpYXV0b21hdG9yMic7XG5pbXBvcnQgeyBmcywgdXRpbCwgbWpwZWcgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgY29tbWFuZHMgZnJvbSAnLi9jb21tYW5kcy9pbmRleCc7XG5pbXBvcnQgeyBERUZBVUxUX0FEQl9QT1JUIH0gZnJvbSAnYXBwaXVtLWFkYic7XG5pbXBvcnQgdWlhdXRvbWF0b3IySGVscGVycyBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtcbiAgYW5kcm9pZEhlbHBlcnMsIGFuZHJvaWRDb21tYW5kcywgU0VUVElOR1NfSEVMUEVSX1BLR19JRFxufSBmcm9tICdhcHBpdW0tYW5kcm9pZC1kcml2ZXInO1xuaW1wb3J0IGRlc2lyZWRDYXBDb25zdHJhaW50cyBmcm9tICcuL2Rlc2lyZWQtY2Fwcyc7XG5pbXBvcnQgeyBmaW5kQVBvcnROb3RJblVzZSwgY2hlY2tQb3J0U3RhdHVzIH0gZnJvbSAncG9ydHNjYW5uZXInO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQVBLX0VYVEVOU0lPTiwgQVBLU19FWFRFTlNJT04gfSBmcm9tICcuL2V4dGVuc2lvbnMnO1xuXG5cbmNvbnN0IGhlbHBlcnMgPSBPYmplY3QuYXNzaWduKHt9LCB1aWF1dG9tYXRvcjJIZWxwZXJzLCBhbmRyb2lkSGVscGVycyk7XG5cbi8vIFRoZSByYW5nZSBvZiBwb3J0cyB3ZSBjYW4gdXNlIG9uIHRoZSBzeXN0ZW0gZm9yIGNvbW11bmljYXRpbmcgdG8gdGhlXG4vLyBVaUF1dG9tYXRvcjIgSFRUUCBzZXJ2ZXIgb24gdGhlIGRldmljZVxuY29uc3QgREVWSUNFX1BPUlRfUkFOR0UgPSBbODIwMCwgODI5OV07XG5cbi8vIFRoZSBndWFyZCBpcyBuZWVkZWQgdG8gYXZvaWQgZHluYW1pYyBzeXN0ZW0gcG9ydCBhbGxvY2F0aW9uIGNvbmZsaWN0cyBmb3Jcbi8vIHBhcmFsbGVsIGRyaXZlciBzZXNzaW9uc1xuY29uc3QgREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRCA9IHV0aWwuZ2V0TG9ja0ZpbGVHdWFyZChcbiAgcGF0aC5yZXNvbHZlKG9zLnRtcGRpcigpLCAndWlhMl9kZXZpY2VfcG9ydF9ndWFyZCcpLFxuICB7dGltZW91dDogMjUsIHRyeVJlY292ZXJ5OiB0cnVlfVxuKTtcblxuLy8gVGhpcyBpcyB0aGUgcG9ydCB0aGF0IFVpQXV0b21hdG9yMiBsaXN0ZW5zIHRvIG9uIHRoZSBkZXZpY2UuIFdlIHdpbGwgZm9yd2FyZFxuLy8gb25lIG9mIHRoZSBwb3J0cyBhYm92ZSBvbiB0aGUgc3lzdGVtIHRvIHRoaXMgcG9ydCBvbiB0aGUgZGV2aWNlLlxuY29uc3QgREVWSUNFX1BPUlQgPSA2NzkwO1xuLy8gVGhpcyBpcyB0aGUgcG9ydCB0aGF0IHRoZSBVaUF1dG9tYXRvcjIgTUpQRUcgc2VydmVyIGxpc3RlbnMgdG8gb24gdGhlIGRldmljZS5cbi8vIFdlIHdpbGwgZm9yd2FyZCBvbmUgb2YgdGhlIHBvcnRzIGFib3ZlIG9uIHRoZSBzeXN0ZW0gdG8gdGhpcyBwb3J0IG9uIHRoZVxuLy8gZGV2aWNlLlxuY29uc3QgTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUID0gNzgxMDtcblxuY29uc3QgTE9DQUxIT1NUX0lQNCA9ICcxMjcuMC4wLjEnO1xuXG4vLyBOT19QUk9YWSBjb250YWlucyB0aGUgcGF0aHMgdGhhdCB3ZSBuZXZlciB3YW50IHRvIHByb3h5IHRvIFVpQXV0b21hdG9yMiBzZXJ2ZXIuXG4vLyBUT0RPOiAgQWRkIHRoZSBsaXN0IG9mIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBVaUF1dG9tYXRvcjIgc2VydmVyLlxuLy8gVE9ETzogTmVlZCB0byBzZWdyZWdhdGUgdGhlIHBhdGhzIGJldHRlciB3YXkgdXNpbmcgcmVndWxhciBleHByZXNzaW9ucyB3aGVyZXZlciBhcHBsaWNhYmxlLlxuLy8gKE5vdCBzZWdyZWdhdGluZyByaWdodCBhd2F5IGJlY2F1c2UgbW9yZSBwYXRocyB0byBiZSBhZGRlZCBpbiB0aGUgTk9fUFJPWFkgbGlzdClcbmNvbnN0IE5PX1BST1hZID0gW1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi8oPyEuKi8pJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hbGVydF9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYWxlcnQvW14vXSsnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9bXi9dKy9jdXJyZW50X2FjdGl2aXR5JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vW14vXSsvY3VycmVudF9wYWNrYWdlJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc2V0dGluZ3MnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHRzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL2F0dHJpYnV0ZScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9kaXNwbGF5ZWQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvZW5hYmxlZCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9sb2NhdGlvbl9pbl92aWV3JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL25hbWUnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvc2NyZWVuc2hvdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9zZWxlY3RlZCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvaW1lL1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2NhdGlvbicpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nL3R5cGVzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9uZXR3b3JrX2Nvbm5lY3Rpb24nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NjcmVlbnNob3QnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RpbWVvdXRzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy91cmwnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9bXi9dK19hbGVydCQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hY3Rpb25zJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYWxlcnQvW14vXSsnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHAvW14vXScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9bXi9dKy9zdGFydF9hY3Rpdml0eScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9hcHAvW14vXSsnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vY29tcGFyZV9pbWFnZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlLyg/IXNldF9jbGlwYm9hcmQpW14vXSsnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZWxlbWVudC9bXi9dKy9yZXBsYWNlX3ZhbHVlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2VsZW1lbnQvW14vXSsvdmFsdWUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZ2V0UGVyZm9ybWFuY2VEYXRhJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3BlcmZvcm1hbmNlRGF0YS90eXBlcycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zZXR0aW5ncycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9leGVjdXRlX2RyaXZlcicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zdGFydF9yZWNvcmRpbmdfc2NyZWVuJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL3N0b3BfcmVjb3JkaW5nX3NjcmVlbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS8uKmV2ZW50JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvY29udGV4dCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9pbWUvW14vXSsnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9rZXlzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9jYXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2cnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9uZXR3b3JrX2Nvbm5lY3Rpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90aW1lb3V0cycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL211bHRpL3BlcmZvcm0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdXJsJyldLFxuXG4gIC8vIE1KU09OV1AgY29tbWFuZHNcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlX2FzeW5jJyldLFxuICAvLyBXM0MgY29tbWFuZHNcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvd2luZG93L3JlY3QnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL2FzeW5jJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9zeW5jJyldLFxuXTtcblxuLy8gVGhpcyBpcyBhIHNldCBvZiBtZXRob2RzIGFuZCBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gQ2hyb21lZHJpdmVyLlxuY29uc3QgQ0hST01FX05PX1BST1hZID0gW1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvcmVjdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nL3R5cGVzJCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nJCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvbXVsdGkvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3RvdWNoL3BlcmZvcm0nKV0sXG5cbiAgLy8gdGhpcyBpcyBuZWVkZWQgdG8gbWFrZSB0aGUgbW9iaWxlOiBjb21tYW5kcyB3b3JraW5nIGluIHdlYiBjb250ZXh0XG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlJCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcbl07XG5cbmNvbnN0IE1FTU9JWkVEX0ZVTkNUSU9OUyA9IFtcbiAgJ2dldFN0YXR1c0JhckhlaWdodCcsXG4gICdnZXREZXZpY2VQaXhlbFJhdGlvJyxcbl07XG5cbmNsYXNzIEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXIgZXh0ZW5kcyBCYXNlRHJpdmVyIHtcbiAgY29uc3RydWN0b3IgKG9wdHMgPSB7fSwgc2hvdWxkVmFsaWRhdGVDYXBzID0gdHJ1ZSkge1xuICAgIC8vIGBzaGVsbGAgb3ZlcndyaXRlcyBhZGIuc2hlbGwsIHNvIHJlbW92ZVxuICAgIGRlbGV0ZSBvcHRzLnNoZWxsO1xuXG4gICAgc3VwZXIob3B0cywgc2hvdWxkVmFsaWRhdGVDYXBzKTtcbiAgICB0aGlzLmxvY2F0b3JTdHJhdGVnaWVzID0gW1xuICAgICAgJ3hwYXRoJyxcbiAgICAgICdpZCcsXG4gICAgICAnY2xhc3MgbmFtZScsXG4gICAgICAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgICAnY3NzIHNlbGVjdG9yJyxcbiAgICAgICctYW5kcm9pZCB1aWF1dG9tYXRvcidcbiAgICBdO1xuICAgIHRoaXMuZGVzaXJlZENhcENvbnN0cmFpbnRzID0gZGVzaXJlZENhcENvbnN0cmFpbnRzO1xuICAgIHRoaXMudWlhdXRvbWF0b3IyID0gbnVsbDtcbiAgICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5kZWZhdWx0SU1FID0gbnVsbDtcbiAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBOT19QUk9YWTtcbiAgICB0aGlzLmFwa1N0cmluZ3MgPSB7fTsgLy8gbWFwIG9mIGxhbmd1YWdlIC0+IHN0cmluZ3Mgb2JqXG5cbiAgICB0aGlzLnNldHRpbmdzID0gbmV3IERldmljZVNldHRpbmdzKHtpZ25vcmVVbmltcG9ydGFudFZpZXdzOiBmYWxzZSwgYWxsb3dJbnZpc2libGVFbGVtZW50czogZmFsc2V9LFxuICAgICAgICB0aGlzLm9uU2V0dGluZ3NVcGRhdGUuYmluZCh0aGlzKSk7XG4gICAgLy8gaGFuZGxlIHdlYnZpZXcgbWVjaGFuaWNzIGZyb20gQW5kcm9pZERyaXZlclxuICAgIHRoaXMuY2hyb21lZHJpdmVyID0gbnVsbDtcbiAgICB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzID0ge307XG5cbiAgICAvLyBtZW1vaXplIGZ1bmN0aW9ucyBoZXJlLCBzbyB0aGF0IHRoZXkgYXJlIGRvbmUgb24gYSBwZXItaW5zdGFuY2UgYmFzaXNcbiAgICBmb3IgKGNvbnN0IGZuIG9mIE1FTU9JWkVEX0ZVTkNUSU9OUykge1xuICAgICAgdGhpc1tmbl0gPSBfLm1lbW9pemUodGhpc1tmbl0pO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlRGVzaXJlZENhcHMgKGNhcHMpIHtcbiAgICByZXR1cm4gc3VwZXIudmFsaWRhdGVEZXNpcmVkQ2FwcyhjYXBzKSAmJiBhbmRyb2lkSGVscGVycy52YWxpZGF0ZURlc2lyZWRDYXBzKGNhcHMpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlU2Vzc2lvbiAoLi4uYXJncykge1xuICAgIHRyeSB7XG4gICAgICAvLyBUT0RPIGhhbmRsZSBvdGhlclNlc3Npb25EYXRhIGZvciBtdWx0aXBsZSBzZXNzaW9uc1xuICAgICAgbGV0IFtzZXNzaW9uSWQsIGNhcHNdID0gYXdhaXQgc3VwZXIuY3JlYXRlU2Vzc2lvbiguLi5hcmdzKTtcblxuICAgICAgbGV0IHNlcnZlckRldGFpbHMgPSB7XG4gICAgICAgIHBsYXRmb3JtOiAnTElOVVgnLFxuICAgICAgICB3ZWJTdG9yYWdlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRha2VzU2NyZWVuc2hvdDogdHJ1ZSxcbiAgICAgICAgamF2YXNjcmlwdEVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGRhdGFiYXNlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIG5ldHdvcmtDb25uZWN0aW9uRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbG9jYXRpb25Db250ZXh0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHdhcm5pbmdzOiB7fSxcbiAgICAgICAgZGVzaXJlZDogdGhpcy5jYXBzLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5jYXBzID0gT2JqZWN0LmFzc2lnbihzZXJ2ZXJEZXRhaWxzLCB0aGlzLmNhcHMpO1xuXG4gICAgICB0aGlzLmN1ckNvbnRleHQgPSB0aGlzLmRlZmF1bHRDb250ZXh0TmFtZSgpO1xuXG4gICAgICBsZXQgZGVmYXVsdE9wdHMgPSB7XG4gICAgICAgIGZ1bGxSZXNldDogZmFsc2UsXG4gICAgICAgIGF1dG9MYXVuY2g6IHRydWUsXG4gICAgICAgIGFkYlBvcnQ6IERFRkFVTFRfQURCX1BPUlQsXG4gICAgICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dDogOTAwMDBcbiAgICAgIH07XG4gICAgICBfLmRlZmF1bHRzKHRoaXMub3B0cywgZGVmYXVsdE9wdHMpO1xuXG4gICAgICBpZiAodGhpcy5pc0Nocm9tZVNlc3Npb24pIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXCJXZSdyZSBnb2luZyB0byBydW4gYSBDaHJvbWUtYmFzZWQgc2Vzc2lvblwiKTtcbiAgICAgICAgbGV0IHtwa2csIGFjdGl2aXR5fSA9IGhlbHBlcnMuZ2V0Q2hyb21lUGtnKHRoaXMub3B0cy5icm93c2VyTmFtZSk7XG4gICAgICAgIHRoaXMub3B0cy5hcHBQYWNrYWdlID0gdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBwa2c7XG4gICAgICAgIHRoaXMub3B0cy5hcHBBY3Rpdml0eSA9IHRoaXMuY2Fwcy5hcHBBY3Rpdml0eSA9IGFjdGl2aXR5O1xuICAgICAgICBsb2dnZXIuaW5mbyhgQ2hyb21lLXR5cGUgcGFja2FnZSBhbmQgYWN0aXZpdHkgYXJlICR7cGtnfSBhbmQgJHthY3Rpdml0eX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgdGhpcy5zZXRBdmRGcm9tQ2FwYWJpbGl0aWVzKGNhcHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLmFwcCkge1xuICAgICAgICAvLyBmaW5kIGFuZCBjb3B5LCBvciBkb3dubG9hZCBhbmQgdW56aXAgYW4gYXBwIHVybCBvciBwYXRoXG4gICAgICAgIHRoaXMub3B0cy5hcHAgPSBhd2FpdCB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKHRoaXMub3B0cy5hcHAsIFtBUEtfRVhURU5TSU9OLCBBUEtTX0VYVEVOU0lPTl0pO1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrQXBwUHJlc2VudCgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdHMuYXBwUGFja2FnZSkge1xuICAgICAgICAvLyB0aGUgYXBwIGlzbid0IGFuIGFjdHVhbCBhcHAgZmlsZSBidXQgcmF0aGVyIHNvbWV0aGluZyB3ZSB3YW50IHRvXG4gICAgICAgIC8vIGFzc3VtZSBpcyBvbiB0aGUgZGV2aWNlIGFuZCBqdXN0IGxhdW5jaCB2aWEgdGhlIGFwcFBhY2thZ2VcbiAgICAgICAgbG9nZ2VyLmluZm8oYFN0YXJ0aW5nICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfScgZGlyZWN0bHkgb24gdGhlIGRldmljZWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYE5laXRoZXIgJ2FwcCcgbm9yICdhcHBQYWNrYWdlJyB3YXMgc2V0LiBTdGFydGluZyBVaUF1dG9tYXRvcjIgYCArXG4gICAgICAgICAgJ3dpdGhvdXQgdGhlIHRhcmdldCBhcHBsaWNhdGlvbicpO1xuICAgICAgfVxuICAgICAgdGhpcy5vcHRzLmFkYlBvcnQgPSB0aGlzLm9wdHMuYWRiUG9ydCB8fCBERUZBVUxUX0FEQl9QT1JUO1xuXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0VWlBdXRvbWF0b3IyU2Vzc2lvbigpO1xuICAgICAgYXdhaXQgdGhpcy5maWxsRGV2aWNlRGV0YWlscygpO1xuICAgICAgaWYgKHRoaXMub3B0cy5tanBlZ1NjcmVlbnNob3RVcmwpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFN0YXJ0aW5nIE1KUEVHIHN0cmVhbSByZWFkaW5nIFVSTDogJyR7dGhpcy5vcHRzLm1qcGVnU2NyZWVuc2hvdFVybH0nYCk7XG4gICAgICAgIHRoaXMubWpwZWdTdHJlYW0gPSBuZXcgbWpwZWcuTUpwZWdTdHJlYW0odGhpcy5vcHRzLm1qcGVnU2NyZWVuc2hvdFVybCk7XG4gICAgICAgIGF3YWl0IHRoaXMubWpwZWdTdHJlYW0uc3RhcnQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbc2Vzc2lvbklkLCB0aGlzLmNhcHNdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmaWxsRGV2aWNlRGV0YWlscyAoKSB7XG4gICAgdGhpcy5jYXBzLnBpeGVsUmF0aW8gPSBhd2FpdCB0aGlzLmdldERldmljZVBpeGVsUmF0aW8oKTtcbiAgICB0aGlzLmNhcHMuc3RhdEJhckhlaWdodCA9IGF3YWl0IHRoaXMuZ2V0U3RhdHVzQmFySGVpZ2h0KCk7XG4gICAgdGhpcy5jYXBzLnZpZXdwb3J0UmVjdCA9IGF3YWl0IHRoaXMuZ2V0Vmlld1BvcnRSZWN0KCk7XG4gIH1cblxuICBnZXQgZHJpdmVyRGF0YSAoKSB7XG4gICAgLy8gVE9ETyBmaWxsIG91dCByZXNvdXJjZSBpbmZvIGhlcmVcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBhc3luYyBnZXRTZXNzaW9uICgpIHtcbiAgICBsZXQgc2Vzc2lvbkRhdGEgPSBhd2FpdCBzdXBlci5nZXRTZXNzaW9uKCk7XG4gICAgbG9nZ2VyLmRlYnVnKCdHZXR0aW5nIHNlc3Npb24gZGV0YWlscyBmcm9tIHNlcnZlciB0byBtaXggaW4nKTtcbiAgICBsZXQgdWlhMkRhdGEgPSBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy8nLCAnR0VUJywge30pO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzZXNzaW9uRGF0YSwgdWlhMkRhdGEpO1xuICB9XG5cbiAgaXNFbXVsYXRvciAoKSB7XG4gICAgcmV0dXJuIGhlbHBlcnMuaXNFbXVsYXRvcih0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgfVxuXG4gIHNldEF2ZEZyb21DYXBhYmlsaXRpZXMgKGNhcHMpIHtcbiAgICBpZiAodGhpcy5vcHRzLmF2ZCkge1xuICAgICAgbG9nZ2VyLmluZm8oJ2F2ZCBuYW1lIGRlZmluZWQsIGlnbm9yaW5nIGRldmljZSBuYW1lIGFuZCBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2Fwcy5kZXZpY2VOYW1lKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KCdhdmQgb3IgZGV2aWNlTmFtZSBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWNhcHMucGxhdGZvcm1WZXJzaW9uKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KCdhdmQgb3IgcGxhdGZvcm1WZXJzaW9uIHNob3VsZCBiZSBzcGVjaWZpZWQgd2hlbiByZWJvb3Qgb3B0aW9uIGlzIGVuYWJsZWQnKTtcbiAgICAgIH1cbiAgICAgIGxldCBhdmREZXZpY2UgPSBjYXBzLmRldmljZU5hbWUucmVwbGFjZSgvW15hLXpBLVowLTlfLl0vZywgJy0nKTtcbiAgICAgIHRoaXMub3B0cy5hdmQgPSBgJHthdmREZXZpY2V9X18ke2NhcHMucGxhdGZvcm1WZXJzaW9ufWA7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWxsb2NhdGVTeXN0ZW1Qb3J0ICgpIHtcbiAgICBjb25zdCBmb3J3YXJkUG9ydCA9IGFzeW5jIChsb2NhbFBvcnQpID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRm9yd2FyZGluZyBVaUF1dG9tYXRvcjIgU2VydmVyIHBvcnQgJHtERVZJQ0VfUE9SVH0gdG8gbG9jYWwgcG9ydCAke2xvY2FsUG9ydH1gKTtcbiAgICAgIGlmICgoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKGxvY2FsUG9ydCwgTE9DQUxIT1NUX0lQNCkpID09PSAnb3BlbicpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYFVpQXV0b21hdG9yMiBTZXJ2ZXIgY2Fubm90IHN0YXJ0IGJlY2F1c2UgdGhlIGxvY2FsIHBvcnQgIyR7bG9jYWxQb3J0fSBpcyBidXN5LiBgICtcbiAgICAgICAgICBgTWFrZSBzdXJlIHRoZSBwb3J0IHlvdSBwcm92aWRlIHZpYSAnc3lzdGVtUG9ydCcgY2FwYWJpbGl0eSBpcyBub3Qgb2NjdXBpZWQuIGAgK1xuICAgICAgICAgIGBUaGlzIHNpdHVhdGlvbiBtaWdodCBvZnRlbiBiZSBhIHJlc3VsdCBvZiBhbiBpbmFjY3VyYXRlIHNlc3Npb25zIG1hbmFnZW1lbnQsIGUuZy4gYCArXG4gICAgICAgICAgYG9sZCBhdXRvbWF0aW9uIHNlc3Npb25zIG9uIHRoZSBzYW1lIGRldmljZSBtdXN0IGFsd2F5cyBiZSBjbG9zZWQgYmVmb3JlIHN0YXJ0aW5nIG5ldyBvbmVzLmApO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yd2FyZFBvcnQobG9jYWxQb3J0LCBERVZJQ0VfUE9SVCk7XG4gICAgfTtcblxuICAgIGlmICh0aGlzLm9wdHMuc3lzdGVtUG9ydCkge1xuICAgICAgdGhpcy5faGFzU3lzdGVtUG9ydEluQ2FwcyA9IHRydWU7XG4gICAgICByZXR1cm4gYXdhaXQgZm9yd2FyZFBvcnQodGhpcy5vcHRzLnN5c3RlbVBvcnQpO1xuICAgIH1cblxuICAgIGF3YWl0IERFVklDRV9QT1JUX0FMTE9DQVRJT05fR1VBUkQoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgW3N0YXJ0UG9ydCwgZW5kUG9ydF0gPSBERVZJQ0VfUE9SVF9SQU5HRTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMub3B0cy5zeXN0ZW1Qb3J0ID0gYXdhaXQgZmluZEFQb3J0Tm90SW5Vc2Uoc3RhcnRQb3J0LCBlbmRQb3J0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coXG4gICAgICAgICAgYENhbm5vdCBmaW5kIGFueSBmcmVlIHBvcnQgaW4gcmFuZ2UgJHtzdGFydFBvcnR9Li4ke2VuZFBvcnR9fS4gYCArXG4gICAgICAgICAgYFBsZWFzZSBzZXQgdGhlIGF2YWlsYWJsZSBwb3J0IG51bWJlciBieSBwcm92aWRpbmcgdGhlIHN5c3RlbVBvcnQgY2FwYWJpbGl0eSBvciBgICtcbiAgICAgICAgICBgZG91YmxlIGNoZWNrIHRoZSBwcm9jZXNzZXMgdGhhdCBhcmUgbG9ja2luZyBwb3J0cyB3aXRoaW4gdGhpcyByYW5nZSBhbmQgdGVybWluYXRlIGAgK1xuICAgICAgICAgIGB0aGVzZSB3aGljaCBhcmUgbm90IG5lZWRlZCBhbnltb3JlYCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBmb3J3YXJkUG9ydCh0aGlzLm9wdHMuc3lzdGVtUG9ydCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyByZWxlYXNlU3lzdGVtUG9ydCAoKSB7XG4gICAgaWYgKCF0aGlzLm9wdHMuc3lzdGVtUG9ydCB8fCAhdGhpcy5hZGIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5faGFzU3lzdGVtUG9ydEluQ2Fwcykge1xuICAgICAgYXdhaXQgdGhpcy5hZGIucmVtb3ZlUG9ydEZvcndhcmQodGhpcy5vcHRzLnN5c3RlbVBvcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBERVZJQ0VfUE9SVF9BTExPQ0FUSU9OX0dVQVJEKGFzeW5jICgpID0+IGF3YWl0IHRoaXMuYWRiLnJlbW92ZVBvcnRGb3J3YXJkKHRoaXMub3B0cy5zeXN0ZW1Qb3J0KSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQgKCkge1xuICAgIGlmICh0aGlzLm9wdHMubWpwZWdTZXJ2ZXJQb3J0KSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5mb3J3YXJkUG9ydCh0aGlzLm9wdHMubWpwZWdTZXJ2ZXJQb3J0LCBNSlBFR19TRVJWRVJfREVWSUNFX1BPUlQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlbGVhc2VNanBlZ1NlcnZlclBvcnQgKCkge1xuICAgIGlmICh0aGlzLm9wdHMubWpwZWdTZXJ2ZXJQb3J0KSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5yZW1vdmVQb3J0Rm9yd2FyZCh0aGlzLm9wdHMubWpwZWdTZXJ2ZXJQb3J0KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydFVpQXV0b21hdG9yMlNlc3Npb24gKCkge1xuICAgIC8vIGdldCBkZXZpY2UgdWRpZCBmb3IgdGhpcyBzZXNzaW9uXG4gICAgbGV0IHt1ZGlkLCBlbVBvcnR9ID0gYXdhaXQgaGVscGVycy5nZXREZXZpY2VJbmZvRnJvbUNhcHModGhpcy5vcHRzKTtcbiAgICB0aGlzLm9wdHMudWRpZCA9IHVkaWQ7XG4gICAgdGhpcy5vcHRzLmVtUG9ydCA9IGVtUG9ydDtcblxuICAgIC8vIG5vdyB0aGF0IHdlIGtub3cgb3VyIGphdmEgdmVyc2lvbiBhbmQgZGV2aWNlIGluZm8sIHdlIGNhbiBjcmVhdGUgb3VyXG4gICAgLy8gQURCIGluc3RhbmNlXG4gICAgdGhpcy5hZGIgPSBhd2FpdCBhbmRyb2lkSGVscGVycy5jcmVhdGVBREIodGhpcy5vcHRzKTtcblxuICAgIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKTtcblxuICAgIGlmIChhcGlMZXZlbCA8IDIxKSB7XG4gICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdygnVUlBdXRvbWF0b3IyIGlzIG9ubHkgc3VwcG9ydGVkIHNpbmNlIEFuZHJvaWQgNS4wIChMb2xsaXBvcCkuICcgK1xuICAgICAgICAnWW91IGNvdWxkIHN0aWxsIHVzZSBvdGhlciBzdXBwb3J0ZWQgYmFja2VuZHMgaW4gb3JkZXIgdG8gYXV0b21hdGUgb2xkZXIgQW5kcm9pZCB2ZXJzaW9ucy4nKTtcbiAgICB9XG5cbiAgICBpZiAoYXBpTGV2ZWwgPj0gMjgpIHsgLy8gQW5kcm9pZCBQXG4gICAgICBsb2dnZXIuaW5mbygnUmVsYXhpbmcgaGlkZGVuIGFwaSBwb2xpY3knKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEhpZGRlbkFwaVBvbGljeSgnMScsICEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiB3ZSBoYXZlIHRvIGVuYWJsZS9kaXNhYmxlIGdwcyBiZWZvcmUgcnVubmluZyB0aGUgYXBwbGljYXRpb25cbiAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMuZ3BzRW5hYmxlZCkpIHtcbiAgICAgIGlmICh0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgVHJ5aW5nIHRvICR7dGhpcy5vcHRzLmdwc0VuYWJsZWQgPyAnZW5hYmxlJyA6ICdkaXNhYmxlJ30gZ3BzIGxvY2F0aW9uIHByb3ZpZGVyYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIodGhpcy5vcHRzLmdwc0VuYWJsZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFNvcnJ5ISAnZ3BzRW5hYmxlZCcgY2FwYWJpbGl0eSBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZ2V0IGFwcFBhY2thZ2UgZXQgYWwgZnJvbSBtYW5pZmVzdCBpZiBuZWNlc3NhcnlcbiAgICBjb25zdCBhcHBJbmZvID0gYXdhaXQgaGVscGVycy5nZXRMYXVuY2hJbmZvKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIC8vIGFuZCBnZXQgaXQgb250byBvdXIgJ29wdHMnIG9iamVjdCBzbyB3ZSB1c2UgaXQgZnJvbSBub3cgb25cbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0cywgYXBwSW5mbyB8fCB7fSk7XG5cbiAgICAvLyBzZXQgYWN0dWFsIGRldmljZSBuYW1lLCB1ZGlkLCBwbGF0Zm9ybSB2ZXJzaW9uLCBzY3JlZW4gc2l6ZSwgc2NyZWVuIGRlbnNpdHksIG1vZGVsIGFuZCBtYW51ZmFjdHVyZXIgZGV0YWlsc1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VOYW1lID0gdGhpcy5hZGIuY3VyRGV2aWNlSWQ7XG4gICAgdGhpcy5jYXBzLmRldmljZVVESUQgPSB0aGlzLm9wdHMudWRpZDtcblxuICAgIC8vIHN0YXJ0IGFuIGF2ZCwgc2V0IHRoZSBsYW5ndWFnZS9sb2NhbGUsIHBpY2sgYW4gZW11bGF0b3IsIGV0Yy4uLlxuICAgIC8vIFRPRE8gd2l0aCBtdWx0aXBsZSBkZXZpY2VzIHdlJ2xsIG5lZWQgdG8gcGFyYW1ldGVyaXplIHRoaXNcbiAgICB0aGlzLmRlZmF1bHRJTUUgPSBhd2FpdCBoZWxwZXJzLmluaXREZXZpY2UodGhpcy5hZGIsIHRoaXMub3B0cyk7XG5cbiAgICAvLyBQcmVwYXJlIHRoZSBkZXZpY2UgYnkgZm9yd2FyZGluZyB0aGUgVWlBdXRvbWF0b3IyIHBvcnRcbiAgICAvLyBUaGlzIGNhbGwgbXV0YXRlcyB0aGlzLm9wdHMuc3lzdGVtUG9ydCBpZiBpdCBpcyBub3Qgc2V0IGV4cGxpY2l0bHlcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlU3lzdGVtUG9ydCgpO1xuXG4gICAgLy8gUHJlcGFyZSB0aGUgZGV2aWNlIGJ5IGZvcndhcmRpbmcgdGhlIFVpQXV0b21hdG9yMiBNSlBFRyBzZXJ2ZXIgcG9ydCAoaWZcbiAgICAvLyBhcHBsaWNhYmxlKVxuICAgIGF3YWl0IHRoaXMuYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQoKTtcblxuICAgIC8vIHNldCB1cCB0aGUgbW9kaWZpZWQgVWlBdXRvbWF0b3IyIHNlcnZlciBldGNcbiAgICBhd2FpdCB0aGlzLmluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIoKTtcblxuICAgIC8vIFNob3VsZCBiZSBhZnRlciBpbnN0YWxsaW5nIGlvLmFwcGl1bS5zZXR0aW5ncyBpbiBoZWxwZXJzLmluaXREZXZpY2VcbiAgICBpZiAodGhpcy5vcHRzLmRpc2FibGVXaW5kb3dBbmltYXRpb24gJiYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCAyNikpIHsgLy8gQVBJIGxldmVsIDI2IGlzIEFuZHJvaWQgOC4wLlxuICAgICAgLy8gR3JhbnRpbmcgYW5kcm9pZC5wZXJtaXNzaW9uLlNFVF9BTklNQVRJT05fU0NBTEUgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSBhbmltYXRpb25zIHVuZGVyIEFQSSBsZXZlbCAyNlxuICAgICAgLy8gUmVhZCBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9wdWxsLzExNjQwI2lzc3VlY29tbWVudC00MzgyNjA0NzdcbiAgICAgIC8vIGAtLW5vLXdpbmRvdy1hbmltYXRpb25gIHdvcmtzIG92ZXIgQW5kcm9pZCA4IHRvIGRpc2FibGUgYWxsIG9mIGFuaW1hdGlvbnNcbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FuaW1hdGlvbk9uKCkpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0Rpc2FibGluZyBhbmltYXRpb24gdmlhIGlvLmFwcGl1bS5zZXR0aW5ncycpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRBbmltYXRpb25TdGF0ZShmYWxzZSk7XG4gICAgICAgIHRoaXMuX3dhc1dpbmRvd0FuaW1hdGlvbkRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdXaW5kb3cgYW5pbWF0aW9uIGlzIGFscmVhZHkgZGlzYWJsZWQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZXQgdXAgYXBwIHVuZGVyIHRlc3RcbiAgICAvLyBwcmVwYXJlIG91ciBhY3R1YWwgQVVULCBnZXQgaXQgb24gdGhlIGRldmljZSwgZXRjLi4uXG4gICAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG5cbiAgICAvLyBBZGRpbmcgQVVUIHBhY2thZ2UgbmFtZSBpbiB0aGUgY2FwYWJpbGl0aWVzIGlmIHBhY2thZ2UgbmFtZSBub3QgZXhpc3QgaW4gY2Fwc1xuICAgIGlmICghdGhpcy5jYXBzLmFwcFBhY2thZ2UgJiYgYXBwSW5mbykge1xuICAgICAgdGhpcy5jYXBzLmFwcFBhY2thZ2UgPSBhcHBJbmZvLmFwcFBhY2thZ2U7XG4gICAgfVxuXG4gICAgLy8gbGF1bmNoIFVpQXV0b21hdG9yMiBhbmQgd2FpdCB0aWxsIGl0cyBvbmxpbmUgYW5kIHdlIGhhdmUgYSBzZXNzaW9uXG4gICAgYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuc3RhcnRTZXNzaW9uKHRoaXMuY2Fwcyk7XG5cbiAgICBhd2FpdCB0aGlzLmFkZERldmljZUluZm9Ub0NhcHMoKTtcblxuICAgIC8vIFVubG9jayB0aGUgZGV2aWNlIGFmdGVyIHRoZSBzZXNzaW9uIGlzIHN0YXJ0ZWQuXG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVubG9jaykge1xuICAgICAgLy8gdW5sb2NrIHRoZSBkZXZpY2UgdG8gcHJlcGFyZSBpdCBmb3IgdGVzdGluZ1xuICAgICAgYXdhaXQgaGVscGVycy51bmxvY2sodGhpcywgdGhpcy5hZGIsIHRoaXMuY2Fwcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgJ3NraXBVbmxvY2snIGNhcGFiaWxpdHkgc2V0LCBzbyBza2lwcGluZyBkZXZpY2UgdW5sb2NrYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7IC8vIHN0YXJ0IGEgY2hyb21lZHJpdmVyIHNlc3Npb25cbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRDaHJvbWVTZXNzaW9uKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRzLmF1dG9MYXVuY2ggJiYgdGhpcy5vcHRzLmFwcFBhY2thZ2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQXBwU3RhcnRzKCk7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIGluaXRpYWwgb3JpZW50YXRpb24gaXMgcmVxdWVzdGVkLCBzZXQgaXRcbiAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMub3JpZW50YXRpb24pKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYFNldHRpbmcgaW5pdGlhbCBvcmllbnRhdGlvbiB0byAnJHt0aGlzLm9wdHMub3JpZW50YXRpb259J2ApO1xuICAgICAgYXdhaXQgdGhpcy5zZXRPcmllbnRhdGlvbih0aGlzLm9wdHMub3JpZW50YXRpb24pO1xuICAgIH1cblxuICAgIC8vIGlmIHdlIHdhbnQgdG8gaW1tZWRpYXRlbHkgZ2V0IGludG8gYSB3ZWJ2aWV3LCBzZXQgb3VyIGNvbnRleHRcbiAgICAvLyBhcHByb3ByaWF0ZWx5XG4gICAgaWYgKHRoaXMub3B0cy5hdXRvV2Vidmlldykge1xuICAgICAgY29uc3Qgdmlld05hbWUgPSB0aGlzLmRlZmF1bHRXZWJ2aWV3TmFtZSgpO1xuICAgICAgY29uc3QgdGltZW91dCA9IHRoaXMub3B0cy5hdXRvV2Vidmlld1RpbWVvdXQgfHwgMjAwMDtcbiAgICAgIGxvZ2dlci5pbmZvKGBTZXR0aW5nIGF1dG8gd2VidmlldyB0byBjb250ZXh0ICcke3ZpZXdOYW1lfScgd2l0aCB0aW1lb3V0ICR7dGltZW91dH1tc2ApO1xuICAgICAgYXdhaXQgcmV0cnlJbnRlcnZhbCh0aW1lb3V0IC8gNTAwLCA1MDAsIHRoaXMuc2V0Q29udGV4dC5iaW5kKHRoaXMpLCB2aWV3TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gbm93IHRoYXQgZXZlcnl0aGluZyBoYXMgc3RhcnRlZCBzdWNjZXNzZnVsbHksIHR1cm4gb24gcHJveHlpbmcgc28gYWxsXG4gICAgLy8gc3Vic2VxdWVudCBzZXNzaW9uIHJlcXVlc3RzIGdvIHN0cmFpZ2h0IHRvL2Zyb20gdWlhdXRvbWF0b3IyXG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG4gIH1cblxuICBhc3luYyBhZGREZXZpY2VJbmZvVG9DYXBzICgpIHtcbiAgICBjb25zdCB7XG4gICAgICBhcGlWZXJzaW9uLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uLFxuICAgICAgbWFudWZhY3R1cmVyLFxuICAgICAgbW9kZWwsXG4gICAgICByZWFsRGlzcGxheVNpemUsXG4gICAgICBkaXNwbGF5RGVuc2l0eSxcbiAgICB9ID0gYXdhaXQgdGhpcy5tb2JpbGVHZXREZXZpY2VJbmZvKCk7XG4gICAgdGhpcy5jYXBzLmRldmljZUFwaUxldmVsID0gcGFyc2VJbnQoYXBpVmVyc2lvbiwgMTApO1xuICAgIHRoaXMuY2Fwcy5wbGF0Zm9ybVZlcnNpb24gPSBwbGF0Zm9ybVZlcnNpb247XG4gICAgdGhpcy5jYXBzLmRldmljZVNjcmVlblNpemUgPSByZWFsRGlzcGxheVNpemU7XG4gICAgdGhpcy5jYXBzLmRldmljZVNjcmVlbkRlbnNpdHkgPSBkaXNwbGF5RGVuc2l0eTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTW9kZWwgPSBtb2RlbDtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTWFudWZhY3R1cmVyID0gbWFudWZhY3R1cmVyO1xuICB9XG5cbiAgYXN5bmMgaW5pdFVpQXV0b21hdG9yMlNlcnZlciAoKSB7XG4gICAgLy8gYnJva2VuIG91dCBmb3IgcmVhZGFiaWxpdHlcbiAgICBjb25zdCB1aWF1dG9tYXRvcjJPcHRzID0ge1xuICAgICAgaG9zdDogdGhpcy5vcHRzLnJlbW90ZUFkYkhvc3QgfHwgdGhpcy5vcHRzLmhvc3QgfHwgTE9DQUxIT1NUX0lQNCxcbiAgICAgIHN5c3RlbVBvcnQ6IHRoaXMub3B0cy5zeXN0ZW1Qb3J0LFxuICAgICAgZGV2aWNlUG9ydDogREVWSUNFX1BPUlQsXG4gICAgICBhZGI6IHRoaXMuYWRiLFxuICAgICAgYXBrOiB0aGlzLm9wdHMuYXBwLFxuICAgICAgdG1wRGlyOiB0aGlzLm9wdHMudG1wRGlyLFxuICAgICAgYXBwUGFja2FnZTogdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgICBhcHBBY3Rpdml0eTogdGhpcy5vcHRzLmFwcEFjdGl2aXR5LFxuICAgICAgZGlzYWJsZVdpbmRvd0FuaW1hdGlvbjogISF0aGlzLm9wdHMuZGlzYWJsZVdpbmRvd0FuaW1hdGlvbixcbiAgICAgIGRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlOiB0aGlzLm9wdHMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UsXG4gICAgICByZWFkVGltZW91dDogdGhpcy5vcHRzLnVpYXV0b21hdG9yMlNlcnZlclJlYWRUaW1lb3V0LFxuICAgIH07XG4gICAgLy8gbm93IHRoYXQgd2UgaGF2ZSBwYWNrYWdlIGFuZCBhY3Rpdml0eSwgd2UgY2FuIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZlxuICAgIC8vIHVpYXV0b21hdG9yMiB3aXRoIHRoZSBhcHByb3ByaWF0ZSBvcHRpb25zXG4gICAgdGhpcy51aWF1dG9tYXRvcjIgPSBuZXcgVWlBdXRvbWF0b3IyU2VydmVyKHVpYXV0b21hdG9yMk9wdHMpO1xuICAgIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLnVpYXV0b21hdG9yMi5wcm94eVJlcVJlcy5iaW5kKHRoaXMudWlhdXRvbWF0b3IyKTtcblxuICAgIGlmICh0aGlzLm9wdHMuc2tpcFNlcnZlckluc3RhbGxhdGlvbikge1xuICAgICAgbG9nZ2VyLmluZm8oYCdza2lwU2VydmVySW5zdGFsbGF0aW9uJyBpcyBzZXQuIFNraXBwaW5nIFVJQXV0b21hdG9yMiBzZXJ2ZXIgaW5zdGFsbGF0aW9uLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5pbnN0YWxsU2VydmVyQXBrKHRoaXMub3B0cy51aWF1dG9tYXRvcjJTZXJ2ZXJJbnN0YWxsVGltZW91dCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5hZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QoXG4gICAgICAgICAgU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgU0VSVkVSX1BBQ0tBR0VfSUQsIFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQsXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBDYW5ub3QgYWRkIHNlcnZlciBwYWNrYWdlcyB0byB0aGUgRG96ZSB3aGl0ZWxpc3QuIE9yaWdpbmFsIGVycm9yOiBgICtcbiAgICAgICAgICAoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5pdEFVVCAoKSB7XG4gICAgLy8gVW5pbnN0YWxsIGFueSB1bmluc3RhbGxPdGhlclBhY2thZ2VzIHdoaWNoIHdlcmUgc3BlY2lmaWVkIGluIGNhcHNcbiAgICBpZiAodGhpcy5vcHRzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyhcbiAgICAgICAgdGhpcy5hZGIsXG4gICAgICAgIGhlbHBlcnMucGFyc2VBcnJheSh0aGlzLm9wdHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyksXG4gICAgICAgIFtTRVRUSU5HU19IRUxQRVJfUEtHX0lELCBTRVJWRVJfUEFDS0FHRV9JRCwgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCBhbnkgXCJvdGhlckFwcHNcIiB0aGF0IHdlcmUgc3BlY2lmaWVkIGluIGNhcHNcbiAgICBpZiAodGhpcy5vcHRzLm90aGVyQXBwcykge1xuICAgICAgbGV0IG90aGVyQXBwcztcbiAgICAgIHRyeSB7XG4gICAgICAgIG90aGVyQXBwcyA9IGhlbHBlcnMucGFyc2VBcnJheSh0aGlzLm9wdHMub3RoZXJBcHBzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBwYXJzZSBcIm90aGVyQXBwc1wiIGNhcGFiaWxpdHk6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgb3RoZXJBcHBzID0gYXdhaXQgQi5hbGwob3RoZXJBcHBzXG4gICAgICAgIC5tYXAoKGFwcCkgPT4gdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcChhcHAsIFtBUEtfRVhURU5TSU9OLCBBUEtTX0VYVEVOU0lPTl0pKSk7XG4gICAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxPdGhlckFwa3Mob3RoZXJBcHBzLCB0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRzLmFwcCkge1xuICAgICAgaWYgKCF0aGlzLm9wdHMubm9TaWduXG4gICAgICAgICYmICFhd2FpdCB0aGlzLmFkYi5jaGVja0Fwa0NlcnQodGhpcy5vcHRzLmFwcCwgdGhpcy5vcHRzLmFwcFBhY2thZ2UsIHtcbiAgICAgICAgICByZXF1aXJlRGVmYXVsdENlcnQ6IGZhbHNlLFxuICAgICAgICB9KSkge1xuICAgICAgICBhd2FpdCBoZWxwZXJzLnNpZ25BcHAodGhpcy5hZGIsIHRoaXMub3B0cy5hcHApO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgICAgYXdhaXQgaGVscGVycy5pbnN0YWxsQXBrKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCkge1xuICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdygnRnVsbCByZXNldCByZXF1aXJlcyBhbiBhcHAgY2FwYWJpbGl0eSwgdXNlIGZhc3RSZXNldCBpZiBhcHAgaXMgbm90IHByb3ZpZGVkJyk7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZGVidWcoJ05vIGFwcCBjYXBhYmlsaXR5LiBBc3N1bWluZyBpdCBpcyBhbHJlYWR5IG9uIHRoZSBkZXZpY2UnKTtcbiAgICAgIGlmICh0aGlzLm9wdHMuZmFzdFJlc2V0ICYmIHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICAgIGF3YWl0IGhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZW5zdXJlQXBwU3RhcnRzICgpIHtcbiAgICAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhbiBhY3Rpdml0eSBhbmQgcGFja2FnZSB0byB3YWl0IGZvclxuICAgIGNvbnN0IGFwcFdhaXRQYWNrYWdlID0gdGhpcy5vcHRzLmFwcFdhaXRQYWNrYWdlIHx8IHRoaXMub3B0cy5hcHBQYWNrYWdlO1xuICAgIGNvbnN0IGFwcFdhaXRBY3Rpdml0eSA9IHRoaXMub3B0cy5hcHBXYWl0QWN0aXZpdHkgfHwgdGhpcy5vcHRzLmFwcEFjdGl2aXR5O1xuXG4gICAgbG9nZ2VyLmluZm8oYFN0YXJ0aW5nICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfS8ke3RoaXMub3B0cy5hcHBBY3Rpdml0eX0gYCArXG4gICAgICBgYW5kIHdhaXRpbmcgZm9yICcke2FwcFdhaXRQYWNrYWdlfS8ke2FwcFdhaXRBY3Rpdml0eX0nYCk7XG5cbiAgICBpZiAodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSkge1xuICAgICAgbG9nZ2VyLmluZm8oYGFuZHJvaWRDb3ZlcmFnZSBpcyBjb25maWd1cmVkLiBgICtcbiAgICAgICAgYCBTdGFydGluZyBpbnN0cnVtZW50YXRpb24gb2YgJyR7dGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZX0nLi4uYCk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5hbmRyb2lkQ292ZXJhZ2UodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSwgYXBwV2FpdFBhY2thZ2UsIGFwcFdhaXRBY3Rpdml0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnN0YXJ0QXBwKHtcbiAgICAgICAgcGtnOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICAgICAgYWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgICAgYWN0aW9uOiB0aGlzLm9wdHMuaW50ZW50QWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogdGhpcy5vcHRzLmludGVudENhdGVnb3J5LFxuICAgICAgICBmbGFnczogdGhpcy5vcHRzLmludGVudEZsYWdzLFxuICAgICAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgICAgIHdhaXRBY3Rpdml0eTogdGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSxcbiAgICAgICAgd2FpdEZvckxhdW5jaDogdGhpcy5vcHRzLmFwcFdhaXRGb3JMYXVuY2gsXG4gICAgICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICAgICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHM6IHRoaXMub3B0cy5vcHRpb25hbEludGVudEFyZ3VtZW50cyxcbiAgICAgICAgc3RvcEFwcDogIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQsXG4gICAgICAgIHJldHJ5OiB0cnVlLFxuICAgICAgICB1c2VyOiB0aGlzLm9wdHMudXNlclByb2ZpbGUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIGxvZ2dlci5kZWJ1ZygnRGVsZXRpbmcgVWlBdXRvbWF0b3IyIHNlc3Npb24nKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BSZWNvcmRpbmdTY3JlZW4oKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgICBhd2FpdCBhbmRyb2lkSGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnModGhpcy5zZXJ2ZXIsIHRoaXMuc2Vzc2lvbklkKTtcblxuICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZygpO1xuXG4gICAgaWYgKHRoaXMudWlhdXRvbWF0b3IyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BDaHJvbWVkcml2ZXJQcm94aWVzKCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byBzdG9wIENocm9tZURyaXZlciBwcm94aWVzOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuandwUHJveHlBY3RpdmUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5kZWxldGVTZXNzaW9uKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gcHJveHkgZGVsZXRlU2Vzc2lvbiB0byBVaUF1dG9tYXRvcjI6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudWlhdXRvbWF0b3IyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMuYWRiKSB7XG4gICAgICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCAmJiB0aGlzLm9wdHMucmVzZXRLZXlib2FyZCAmJiB0aGlzLmRlZmF1bHRJTUUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBSZXNldHRpbmcgSU1FIHRvICcke3RoaXMuZGVmYXVsdElNRX0nYCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0SU1FKHRoaXMuZGVmYXVsdElNRSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gcmVzZXQgSU1FOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSkge1xuICAgICAgICBsb2dnZXIuaW5mbygnU2h1dHRpbmcgZG93biB0aGUgYWRiIHByb2Nlc3Mgb2YgaW5zdHJ1bWVudGF0aW9uLi4uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmVuZEFuZHJvaWRDb3ZlcmFnZSgpO1xuICAgICAgICAvLyBVc2UgdGhpcyBicm9hZGNhc3QgaW50ZW50IHRvIG5vdGlmeSBpdCdzIHRpbWUgdG8gZHVtcCBjb3ZlcmFnZSB0byBmaWxlXG4gICAgICAgIGlmICh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50KSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFNlbmRpbmcgaW50ZW50IGJyb2FkY2FzdCAnJHt0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50fScgYXQgdGhlIGVuZCBvZiBpbnN0cnVtZW50aW5nLmApO1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmJyb2FkY2FzdCh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIud2FybignTm8gYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50IGlzIGNvbmZpZ3VyZWQgaW4gY2Fwcy4gUG9zc2libHkgeW91IGNhbm5vdCBnZXQgY292ZXJhZ2UgZmlsZS4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0Nocm9tZVNlc3Npb24gJiYgIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gZm9yY2Ugc3RvcCBhcHA6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ2FwYWJpbGl0eSAnZnVsbFJlc2V0JyBzZXQgdG8gJ3RydWUnLCBVbmluc3RhbGxpbmcgJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9J2ApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byB1bmluc3RhbGwgYXBwOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVGhpcyB2YWx1ZSBjYW4gYmUgdHJ1ZSBpZiB0ZXN0IHRhcmdldCBkZXZpY2UgaXMgPD0gMjZcbiAgICAgIGlmICh0aGlzLl93YXNXaW5kb3dBbmltYXRpb25EaXNhYmxlZCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnUmVzdG9yaW5nIHdpbmRvdyBhbmltYXRpb24gc3RhdGUnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QW5pbWF0aW9uU3RhdGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zdG9wTG9nY2F0KCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbGVhc2VTeXN0ZW1Qb3J0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHJlbW92ZSBzeXN0ZW0gcG9ydCBmb3J3YXJkOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIC8vIElnbm9yZSwgdGhpcyBibG9jayB3aWxsIGFsc28gYmUgY2FsbGVkIHdoZW4gd2UgZmFsbCBpbiBjYXRjaCBibG9ja1xuICAgICAgICAvLyBhbmQgYmVmb3JlIGV2ZW4gcG9ydCBmb3J3YXJkLlxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWxlYXNlTWpwZWdTZXJ2ZXJQb3J0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHJlbW92ZSBNSlBFRyBzZXJ2ZXIgcG9ydCBmb3J3YXJkOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIC8vIElnbm9yZSwgdGhpcyBibG9jayB3aWxsIGFsc28gYmUgY2FsbGVkIHdoZW4gd2UgZmFsbCBpbiBjYXRjaCBibG9ja1xuICAgICAgICAvLyBhbmQgYmVmb3JlIGV2ZW4gcG9ydCBmb3J3YXJkLlxuICAgICAgfVxuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOCkgeyAvLyBBbmRyb2lkIFBcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1Jlc3RvcmluZyBoaWRkZW4gYXBpIHBvbGljeSB0byB0aGUgZGV2aWNlIGRlZmF1bHQgY29uZmlndXJhdGlvbicpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5KCEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgbGV0IGF2ZE5hbWUgPSB0aGlzLm9wdHMuYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ2xvc2luZyBlbXVsYXRvciAnJHthdmROYW1lfSdgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5raWxsRW11bGF0b3IoYXZkTmFtZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gY2xvc2UgZW11bGF0b3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMubWpwZWdTdHJlYW0pIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdDbG9zaW5nIE1KUEVHIHN0cmVhbScpO1xuICAgICAgdGhpcy5tanBlZ1N0cmVhbS5zdG9wKCk7XG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZVNlc3Npb24oKTtcbiAgfVxuXG4gIGFzeW5jIGNoZWNrQXBwUHJlc2VudCAoKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdDaGVja2luZyB3aGV0aGVyIGFwcCBpcyBhY3R1YWxseSBwcmVzZW50Jyk7XG4gICAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKHRoaXMub3B0cy5hcHApKSkge1xuICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBmaW5kIGFwcCBhcGsgYXQgJyR7dGhpcy5vcHRzLmFwcH0nYCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25TZXR0aW5nc1VwZGF0ZSAoKSB7XG4gICAgLy8gaW50ZW50aW9uYWxseSBkbyBub3RoaW5nIGhlcmUsIHNpbmNlIGNvbW1hbmRzLnVwZGF0ZVNldHRpbmdzIHByb3hpZXNcbiAgICAvLyBzZXR0aW5ncyB0byB0aGUgdWlhdXRvMiBzZXJ2ZXIgYWxyZWFkeVxuICB9XG5cbiAgLy8gTmVlZCB0byBvdmVycmlkZSBhbmRyb2lkLWRyaXZlcidzIHZlcnNpb24gb2YgdGhpcyBzaW5jZSB3ZSBkb24ndCBhY3R1YWxseVxuICAvLyBoYXZlIGEgYm9vdHN0cmFwOyBpbnN0ZWFkIHdlIGp1c3QgcmVzdGFydCBhZGIgYW5kIHJlLWZvcndhcmQgdGhlIFVpQXV0b21hdG9yMlxuICAvLyBwb3J0XG4gIGFzeW5jIHdyYXBCb290c3RyYXBEaXNjb25uZWN0ICh3cmFwcGVkKSB7XG4gICAgYXdhaXQgd3JhcHBlZCgpO1xuICAgIGF3YWl0IHRoaXMuYWRiLnJlc3RhcnQoKTtcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlU3lzdGVtUG9ydCgpO1xuICAgIGF3YWl0IHRoaXMuYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQoKTtcbiAgfVxuXG4gIHByb3h5QWN0aXZlIChzZXNzaW9uSWQpIHtcbiAgICBzdXBlci5wcm94eUFjdGl2ZShzZXNzaW9uSWQpO1xuXG4gICAgLy8gd2UgYWx3YXlzIGhhdmUgYW4gYWN0aXZlIHByb3h5IHRvIHRoZSBVaUF1dG9tYXRvcjIgc2VydmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjYW5Qcm94eSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuY2FuUHJveHkoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGNhbiBhbHdheXMgcHJveHkgdG8gdGhlIHVpYXV0b21hdG9yMiBzZXJ2ZXJcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldFByb3h5QXZvaWRMaXN0IChzZXNzaW9uSWQpIHtcbiAgICBzdXBlci5nZXRQcm94eUF2b2lkTGlzdChzZXNzaW9uSWQpO1xuICAgIC8vIHdlIGFyZSBtYWludGFpbmluZyB0d28gc2V0cyBvZiBOT19QUk9YWSBsaXN0cywgb25lIGZvciBjaHJvbWVkcml2ZXIoQ0hST01FX05PX1BST1hZKVxuICAgIC8vIGFuZCBvbmUgZm9yIHVpYXV0b21hdG9yMihOT19QUk9YWSksIGJhc2VkIG9uIGN1cnJlbnQgY29udGV4dCB3aWxsIHJldHVybiByZWxhdGVkIE5PX1BST1hZIGxpc3RcbiAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLmNocm9tZWRyaXZlcikpIHtcbiAgICAgIC8vIGlmIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgd2VidmlldyhjaHJvbWVkcml2ZXIpLCB0aGVuIHJldHVybiBDSFJPTUVfTk9fUFJPWFkgbGlzdFxuICAgICAgdGhpcy5qd3BQcm94eUF2b2lkID0gQ0hST01FX05PX1BST1hZO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBOT19QUk9YWTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5uYXRpdmVXZWJTY3JlZW5zaG90KSB7XG4gICAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBbLi4udGhpcy5qd3BQcm94eUF2b2lkLCBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zY3JlZW5zaG90JyldXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5qd3BQcm94eUF2b2lkO1xuICB9XG5cbiAgZ2V0IGlzQ2hyb21lU2Vzc2lvbiAoKSB7XG4gICAgcmV0dXJuIGhlbHBlcnMuaXNDaHJvbWVCcm93c2VyKHRoaXMub3B0cy5icm93c2VyTmFtZSk7XG4gIH1cbn1cblxuLy8gZmlyc3QgYWRkIHRoZSBhbmRyb2lkLWRyaXZlciBjb21tYW5kcyB3aGljaCB3ZSB3aWxsIGZhbGwgYmFjayB0b1xuZm9yIChsZXQgW2NtZCwgZm5dIG9mIF8udG9QYWlycyhhbmRyb2lkQ29tbWFuZHMpKSB7XG4gIEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXIucHJvdG90eXBlW2NtZF0gPSBmbjtcbn1cblxuLy8gdGhlbiBvdmVyd3JpdGUgd2l0aCBhbnkgdWlhdXRvbWF0b3IyLXNwZWNpZmljIGNvbW1hbmRzXG5mb3IgKGxldCBbY21kLCBmbl0gb2YgXy50b1BhaXJzKGNvbW1hbmRzKSkge1xuICBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG59XG5cbmV4cG9ydCB7IEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXIgfTtcbmV4cG9ydCBkZWZhdWx0IEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXI7XG4iXSwiZmlsZSI6ImxpYi9kcml2ZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
|
649
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kcml2ZXIuanMiXSwibmFtZXMiOlsiaGVscGVycyIsIk9iamVjdCIsImFzc2lnbiIsInVpYXV0b21hdG9yMkhlbHBlcnMiLCJhbmRyb2lkSGVscGVycyIsIkRFVklDRV9QT1JUX1JBTkdFIiwiREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRCIsInV0aWwiLCJnZXRMb2NrRmlsZUd1YXJkIiwicGF0aCIsInJlc29sdmUiLCJvcyIsInRtcGRpciIsInRpbWVvdXQiLCJ0cnlSZWNvdmVyeSIsIkRFVklDRV9QT1JUIiwiTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUIiwiTE9DQUxIT1NUX0lQNCIsIk5PX1BST1hZIiwiUmVnRXhwIiwiQ0hST01FX05PX1BST1hZIiwiTUVNT0laRURfRlVOQ1RJT05TIiwiQW5kcm9pZFVpYXV0b21hdG9yMkRyaXZlciIsIkJhc2VEcml2ZXIiLCJjb25zdHJ1Y3RvciIsIm9wdHMiLCJzaG91bGRWYWxpZGF0ZUNhcHMiLCJzaGVsbCIsImxvY2F0b3JTdHJhdGVnaWVzIiwiZGVzaXJlZENhcENvbnN0cmFpbnRzIiwidWlhdXRvbWF0b3IyIiwiandwUHJveHlBY3RpdmUiLCJkZWZhdWx0SU1FIiwiandwUHJveHlBdm9pZCIsImFwa1N0cmluZ3MiLCJzZXR0aW5ncyIsIkRldmljZVNldHRpbmdzIiwiaWdub3JlVW5pbXBvcnRhbnRWaWV3cyIsImFsbG93SW52aXNpYmxlRWxlbWVudHMiLCJvblNldHRpbmdzVXBkYXRlIiwiYmluZCIsImNocm9tZWRyaXZlciIsInNlc3Npb25DaHJvbWVkcml2ZXJzIiwiZm4iLCJfIiwibWVtb2l6ZSIsInZhbGlkYXRlRGVzaXJlZENhcHMiLCJjYXBzIiwiY3JlYXRlU2Vzc2lvbiIsImFyZ3MiLCJzZXNzaW9uSWQiLCJzZXJ2ZXJEZXRhaWxzIiwicGxhdGZvcm0iLCJ3ZWJTdG9yYWdlRW5hYmxlZCIsInRha2VzU2NyZWVuc2hvdCIsImphdmFzY3JpcHRFbmFibGVkIiwiZGF0YWJhc2VFbmFibGVkIiwibmV0d29ya0Nvbm5lY3Rpb25FbmFibGVkIiwibG9jYXRpb25Db250ZXh0RW5hYmxlZCIsIndhcm5pbmdzIiwiZGVzaXJlZCIsImN1ckNvbnRleHQiLCJkZWZhdWx0Q29udGV4dE5hbWUiLCJkZWZhdWx0T3B0cyIsImZ1bGxSZXNldCIsImF1dG9MYXVuY2giLCJhZGJQb3J0IiwiREVGQVVMVF9BREJfUE9SVCIsImFuZHJvaWRJbnN0YWxsVGltZW91dCIsImRlZmF1bHRzIiwiaXNDaHJvbWVTZXNzaW9uIiwibG9nZ2VyIiwiaW5mbyIsInBrZyIsImFjdGl2aXR5IiwiZ2V0Q2hyb21lUGtnIiwiYnJvd3Nlck5hbWUiLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJyZWJvb3QiLCJzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIiwiYXBwIiwiY29uZmlndXJlQXBwIiwiQVBLX0VYVEVOU0lPTiIsIkFQS1NfRVhURU5TSU9OIiwiY2hlY2tBcHBQcmVzZW50Iiwic3RhcnRVaUF1dG9tYXRvcjJTZXNzaW9uIiwiZmlsbERldmljZURldGFpbHMiLCJtanBlZ1NjcmVlbnNob3RVcmwiLCJtanBlZ1N0cmVhbSIsIm1qcGVnIiwiTUpwZWdTdHJlYW0iLCJzdGFydCIsImUiLCJkZWxldGVTZXNzaW9uIiwicGl4ZWxSYXRpbyIsImdldERldmljZVBpeGVsUmF0aW8iLCJzdGF0QmFySGVpZ2h0IiwiZ2V0U3RhdHVzQmFySGVpZ2h0Iiwidmlld3BvcnRSZWN0IiwiZ2V0Vmlld1BvcnRSZWN0IiwiZHJpdmVyRGF0YSIsImdldFNlc3Npb24iLCJzZXNzaW9uRGF0YSIsImRlYnVnIiwidWlhMkRhdGEiLCJqd3Byb3h5IiwiY29tbWFuZCIsImlzRW11bGF0b3IiLCJhZGIiLCJhdmQiLCJkZXZpY2VOYW1lIiwiZXJyb3JBbmRUaHJvdyIsInBsYXRmb3JtVmVyc2lvbiIsImF2ZERldmljZSIsInJlcGxhY2UiLCJhbGxvY2F0ZVN5c3RlbVBvcnQiLCJmb3J3YXJkUG9ydCIsImxvY2FsUG9ydCIsInN5c3RlbVBvcnQiLCJfaGFzU3lzdGVtUG9ydEluQ2FwcyIsInN0YXJ0UG9ydCIsImVuZFBvcnQiLCJyZWxlYXNlU3lzdGVtUG9ydCIsInJlbW92ZVBvcnRGb3J3YXJkIiwiYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQiLCJtanBlZ1NlcnZlclBvcnQiLCJyZWxlYXNlTWpwZWdTZXJ2ZXJQb3J0IiwidWRpZCIsImVtUG9ydCIsImdldERldmljZUluZm9Gcm9tQ2FwcyIsImNyZWF0ZUFEQiIsImFwaUxldmVsIiwiZ2V0QXBpTGV2ZWwiLCJzZXRIaWRkZW5BcGlQb2xpY3kiLCJpZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvciIsImhhc1ZhbHVlIiwiZ3BzRW5hYmxlZCIsInRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIiLCJ3YXJuIiwiYXBwSW5mbyIsImdldExhdW5jaEluZm8iLCJjdXJEZXZpY2VJZCIsImRldmljZVVESUQiLCJpbml0RGV2aWNlIiwiaW5pdFVpQXV0b21hdG9yMlNlcnZlciIsImRpc2FibGVXaW5kb3dBbmltYXRpb24iLCJpc0FuaW1hdGlvbk9uIiwic2V0QW5pbWF0aW9uU3RhdGUiLCJfd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQiLCJpbml0QVVUIiwic3RhcnRTZXNzaW9uIiwiYWRkRGV2aWNlSW5mb1RvQ2FwcyIsInNraXBVbmxvY2siLCJ1bmxvY2siLCJzdGFydENocm9tZVNlc3Npb24iLCJlbnN1cmVBcHBTdGFydHMiLCJvcmllbnRhdGlvbiIsInNldE9yaWVudGF0aW9uIiwiYXV0b1dlYnZpZXciLCJ2aWV3TmFtZSIsImRlZmF1bHRXZWJ2aWV3TmFtZSIsImF1dG9XZWJ2aWV3VGltZW91dCIsInNldENvbnRleHQiLCJhcGlWZXJzaW9uIiwibWFudWZhY3R1cmVyIiwibW9kZWwiLCJyZWFsRGlzcGxheVNpemUiLCJkaXNwbGF5RGVuc2l0eSIsIm1vYmlsZUdldERldmljZUluZm8iLCJkZXZpY2VBcGlMZXZlbCIsInBhcnNlSW50IiwiZGV2aWNlU2NyZWVuU2l6ZSIsImRldmljZVNjcmVlbkRlbnNpdHkiLCJkZXZpY2VNb2RlbCIsImRldmljZU1hbnVmYWN0dXJlciIsInVpYXV0b21hdG9yMk9wdHMiLCJob3N0IiwicmVtb3RlQWRiSG9zdCIsImRldmljZVBvcnQiLCJhcGsiLCJ0bXBEaXIiLCJkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSIsInJlYWRUaW1lb3V0IiwidWlhdXRvbWF0b3IyU2VydmVyUmVhZFRpbWVvdXQiLCJVaUF1dG9tYXRvcjJTZXJ2ZXIiLCJwcm94eVJlcVJlcyIsInByb3h5Q29tbWFuZCIsInNraXBTZXJ2ZXJJbnN0YWxsYXRpb24iLCJpbnN0YWxsU2VydmVyQXBrIiwidWlhdXRvbWF0b3IyU2VydmVySW5zdGFsbFRpbWVvdXQiLCJhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QiLCJTRVRUSU5HU19IRUxQRVJfUEtHX0lEIiwiU0VSVkVSX1BBQ0tBR0VfSUQiLCJTRVJWRVJfVEVTVF9QQUNLQUdFX0lEIiwic3RkZXJyIiwibWVzc2FnZSIsInVuaW5zdGFsbE90aGVyUGFja2FnZXMiLCJwYXJzZUFycmF5Iiwib3RoZXJBcHBzIiwiQiIsImFsbCIsIm1hcCIsImluc3RhbGxPdGhlckFwa3MiLCJub1Jlc2V0IiwiaXNBcHBJbnN0YWxsZWQiLCJub1NpZ24iLCJjaGVja0Fwa0NlcnQiLCJyZXF1aXJlRGVmYXVsdENlcnQiLCJzaWduQXBwIiwic2tpcFVuaW5zdGFsbCIsInVuaW5zdGFsbEFwayIsImluc3RhbGxBcGsiLCJmYXN0UmVzZXQiLCJyZXNldEFwcCIsImFwcFdhaXRQYWNrYWdlIiwiYXBwV2FpdEFjdGl2aXR5IiwiYW5kcm9pZENvdmVyYWdlIiwic3RhcnRBcHAiLCJhY3Rpb24iLCJpbnRlbnRBY3Rpb24iLCJjYXRlZ29yeSIsImludGVudENhdGVnb3J5IiwiZmxhZ3MiLCJpbnRlbnRGbGFncyIsIndhaXRQa2ciLCJ3YWl0QWN0aXZpdHkiLCJ3YWl0Rm9yTGF1bmNoIiwiYXBwV2FpdEZvckxhdW5jaCIsIndhaXREdXJhdGlvbiIsImFwcFdhaXREdXJhdGlvbiIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwic3RvcEFwcCIsImRvbnRTdG9wQXBwT25SZXNldCIsInJldHJ5IiwidXNlciIsInVzZXJQcm9maWxlIiwiaXNFbXB0eSIsIl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzIiwic3RvcFJlY29yZGluZ1NjcmVlbiIsImlnbiIsInJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyIsInNlcnZlciIsIm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmciLCJzdG9wQ2hyb21lZHJpdmVyUHJveGllcyIsImVyciIsInVuaWNvZGVLZXlib2FyZCIsInJlc2V0S2V5Ym9hcmQiLCJzZXRJTUUiLCJlbmRBbmRyb2lkQ292ZXJhZ2UiLCJhbmRyb2lkQ292ZXJhZ2VFbmRJbnRlbnQiLCJicm9hZGNhc3QiLCJmb3JjZVN0b3AiLCJzdG9wTG9nY2F0IiwiZXJyb3IiLCJzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5IiwiYXZkTmFtZSIsImtpbGxFbXVsYXRvciIsInN0b3AiLCJmcyIsImV4aXN0cyIsIndyYXBCb290c3RyYXBEaXNjb25uZWN0Iiwid3JhcHBlZCIsInJlc3RhcnQiLCJwcm94eUFjdGl2ZSIsImNhblByb3h5IiwiZ2V0UHJveHlBdm9pZExpc3QiLCJuYXRpdmVXZWJTY3JlZW5zaG90IiwiaXNDaHJvbWVCcm93c2VyIiwiY21kIiwidG9QYWlycyIsImFuZHJvaWRDb21tYW5kcyIsInByb3RvdHlwZSIsImNvbW1hbmRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLE9BQU8sR0FBR0MsTUFBTSxDQUFDQyxNQUFQLENBQWMsRUFBZCxFQUFrQkMsZ0JBQWxCLEVBQXVDQyxtQ0FBdkMsQ0FBaEI7QUFJQSxNQUFNQyxpQkFBaUIsR0FBRyxDQUFDLElBQUQsRUFBTyxJQUFQLENB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Q0Q7O0FBR0QsS0FBSyxJQUFJLENBQUNrTyxHQUFELEVBQU1sTyxFQUFOLENBQVQsSUFBc0JDLGdCQUFFa08sT0FBRixDQUFVRyxjQUFWLENBQXRCLEVBQTJDO0FBQ3pDM1AsRUFBQUEseUJBQXlCLENBQUMwUCxTQUExQixDQUFvQ0gsR0FBcEMsSUFBMkNsTyxFQUEzQztBQUNEOztlQUdjckIseUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQmFzZURyaXZlciwgRGV2aWNlU2V0dGluZ3MgfSBmcm9tICdhcHBpdW0tYmFzZS1kcml2ZXInO1xuaW1wb3J0IHtcbiAgVWlBdXRvbWF0b3IyU2VydmVyLCBTRVJWRVJfUEFDS0FHRV9JRCwgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRFxufSBmcm9tICcuL3VpYXV0b21hdG9yMic7XG5pbXBvcnQgeyBmcywgdXRpbCwgbWpwZWcgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgY29tbWFuZHMgZnJvbSAnLi9jb21tYW5kcy9pbmRleCc7XG5pbXBvcnQgeyBERUZBVUxUX0FEQl9QT1JUIH0gZnJvbSAnYXBwaXVtLWFkYic7XG5pbXBvcnQgdWlhdXRvbWF0b3IySGVscGVycyBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtcbiAgYW5kcm9pZEhlbHBlcnMsIGFuZHJvaWRDb21tYW5kcywgU0VUVElOR1NfSEVMUEVSX1BLR19JRFxufSBmcm9tICdhcHBpdW0tYW5kcm9pZC1kcml2ZXInO1xuaW1wb3J0IGRlc2lyZWRDYXBDb25zdHJhaW50cyBmcm9tICcuL2Rlc2lyZWQtY2Fwcyc7XG5pbXBvcnQgeyBmaW5kQVBvcnROb3RJblVzZSwgY2hlY2tQb3J0U3RhdHVzIH0gZnJvbSAncG9ydHNjYW5uZXInO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQVBLX0VYVEVOU0lPTiwgQVBLU19FWFRFTlNJT04gfSBmcm9tICcuL2V4dGVuc2lvbnMnO1xuXG5cbmNvbnN0IGhlbHBlcnMgPSBPYmplY3QuYXNzaWduKHt9LCB1aWF1dG9tYXRvcjJIZWxwZXJzLCBhbmRyb2lkSGVscGVycyk7XG5cbi8vIFRoZSByYW5nZSBvZiBwb3J0cyB3ZSBjYW4gdXNlIG9uIHRoZSBzeXN0ZW0gZm9yIGNvbW11bmljYXRpbmcgdG8gdGhlXG4vLyBVaUF1dG9tYXRvcjIgSFRUUCBzZXJ2ZXIgb24gdGhlIGRldmljZVxuY29uc3QgREVWSUNFX1BPUlRfUkFOR0UgPSBbODIwMCwgODI5OV07XG5cbi8vIFRoZSBndWFyZCBpcyBuZWVkZWQgdG8gYXZvaWQgZHluYW1pYyBzeXN0ZW0gcG9ydCBhbGxvY2F0aW9uIGNvbmZsaWN0cyBmb3Jcbi8vIHBhcmFsbGVsIGRyaXZlciBzZXNzaW9uc1xuY29uc3QgREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRCA9IHV0aWwuZ2V0TG9ja0ZpbGVHdWFyZChcbiAgcGF0aC5yZXNvbHZlKG9zLnRtcGRpcigpLCAndWlhMl9kZXZpY2VfcG9ydF9ndWFyZCcpLFxuICB7dGltZW91dDogMjUsIHRyeVJlY292ZXJ5OiB0cnVlfVxuKTtcblxuLy8gVGhpcyBpcyB0aGUgcG9ydCB0aGF0IFVpQXV0b21hdG9yMiBsaXN0ZW5zIHRvIG9uIHRoZSBkZXZpY2UuIFdlIHdpbGwgZm9yd2FyZFxuLy8gb25lIG9mIHRoZSBwb3J0cyBhYm92ZSBvbiB0aGUgc3lzdGVtIHRvIHRoaXMgcG9ydCBvbiB0aGUgZGV2aWNlLlxuY29uc3QgREVWSUNFX1BPUlQgPSA2NzkwO1xuLy8gVGhpcyBpcyB0aGUgcG9ydCB0aGF0IHRoZSBVaUF1dG9tYXRvcjIgTUpQRUcgc2VydmVyIGxpc3RlbnMgdG8gb24gdGhlIGRldmljZS5cbi8vIFdlIHdpbGwgZm9yd2FyZCBvbmUgb2YgdGhlIHBvcnRzIGFib3ZlIG9uIHRoZSBzeXN0ZW0gdG8gdGhpcyBwb3J0IG9uIHRoZVxuLy8gZGV2aWNlLlxuY29uc3QgTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUID0gNzgxMDtcblxuY29uc3QgTE9DQUxIT1NUX0lQNCA9ICcxMjcuMC4wLjEnO1xuXG4vLyBOT19QUk9YWSBjb250YWlucyB0aGUgcGF0aHMgdGhhdCB3ZSBuZXZlciB3YW50IHRvIHByb3h5IHRvIFVpQXV0b21hdG9yMiBzZXJ2ZXIuXG4vLyBUT0RPOiAgQWRkIHRoZSBsaXN0IG9mIHBhdGhzIHRoYXQgd2UgbmV2ZXIgd2FudCB0byBwcm94eSB0byBVaUF1dG9tYXRvcjIgc2VydmVyLlxuLy8gVE9ETzogTmVlZCB0byBzZWdyZWdhdGUgdGhlIHBhdGhzIGJldHRlciB3YXkgdXNpbmcgcmVndWxhciBleHByZXNzaW9ucyB3aGVyZXZlciBhcHBsaWNhYmxlLlxuLy8gKE5vdCBzZWdyZWdhdGluZyByaWdodCBhd2F5IGJlY2F1c2UgbW9yZSBwYXRocyB0byBiZSBhZGRlZCBpbiB0aGUgTk9fUFJPWFkgbGlzdClcbmNvbnN0IE5PX1BST1hZID0gW1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi8oPyEuKi8pJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hbGVydF9bXi9dKycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYWxlcnQvW14vXSsnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9bXi9dKy9jdXJyZW50X2FjdGl2aXR5JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vW14vXSsvY3VycmVudF9wYWNrYWdlJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZGV2aWNlL1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc2V0dGluZ3MnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHRzJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL2F0dHJpYnV0ZScpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9kaXNwbGF5ZWQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvZW5hYmxlZCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9sb2NhdGlvbl9pbl92aWV3JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50L1teL10rL25hbWUnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvc2NyZWVuc2hvdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9zZWxlY3RlZCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvaW1lL1teL10rJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9sb2NhdGlvbicpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zY3JlZW5zaG90JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90aW1lb3V0cycpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdXJsJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvW14vXStfYWxlcnQkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYWN0aW9ucycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FsZXJ0L1teL10rJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwL1teL10nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vW14vXSsvc3RhcnRfYWN0aXZpdHknKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vYXBwL1teL10rJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2NvbXBhcmVfaW1hZ2VzJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2RldmljZS8oPyFzZXRfY2xpcGJvYXJkKVteL10rJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2VsZW1lbnQvW14vXSsvcmVwbGFjZV92YWx1ZScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9lbGVtZW50L1teL10rL3ZhbHVlJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtL2dldFBlcmZvcm1hbmNlRGF0YScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9wZXJmb3JtYW5jZURhdGEvdHlwZXMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc2V0dGluZ3MnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vZXhlY3V0ZV9kcml2ZXInKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vc3RhcnRfcmVjb3JkaW5nX3NjcmVlbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2FwcGl1bS9zdG9wX3JlY29yZGluZ19zY3JlZW4nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0vLipldmVudCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9lbGVtZW50JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvaW1lL1teL10rJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsva2V5cycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvY2F0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbmV0d29ya19jb25uZWN0aW9uJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdGltZW91dHMnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9tdWx0aS9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3VybCcpXSxcblxuICAvLyBNSlNPTldQIGNvbW1hbmRzXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZy90eXBlcycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlX2FzeW5jJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nJyldLFxuICAvLyBXM0MgY29tbWFuZHNcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zZS9sb2cvdHlwZXMnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3dpbmRvdy9yZWN0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9hc3luYycpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUvc3luYycpXSxcbiAgLy8gRm9yIFNlbGVuaXVtIHY0IChXM0MgZG9lcyBub3QgaGF2ZSB0aGlzIHJvdXRlKVxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvc2UvbG9nJyldLFxuXTtcblxuLy8gVGhpcyBpcyBhIHNldCBvZiBtZXRob2RzIGFuZCBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG8gQ2hyb21lZHJpdmVyLlxuY29uc3QgQ0hST01FX05PX1BST1hZID0gW1xuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2NvbnRleHQnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2VsZW1lbnQvW14vXSsvcmVjdCcpXSxcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvb3JpZW50YXRpb24nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9tdWx0aS9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvcGVyZm9ybScpXSxcblxuICAvLyB0aGlzIGlzIG5lZWRlZCB0byBtYWtlIHRoZSBtb2JpbGU6IGNvbW1hbmRzIHdvcmtpbmcgaW4gd2ViIGNvbnRleHRcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUkJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZXhlY3V0ZS9zeW5jJyldLFxuXG4gIC8vIE1KU09OV1AgY29tbWFuZHNcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvbG9nL3R5cGVzJCcpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2xvZyQnKV0sXG4gIC8vIFczQyBjb21tYW5kc1xuICAvLyBGb3IgU2VsZW5pdW0gdjQgKFczQyBkb2VzIG5vdCBoYXZlIHRoaXMgcm91dGUpXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZy90eXBlcyQnKV0sXG4gIC8vIEZvciBTZWxlbml1bSB2NCAoVzNDIGRvZXMgbm90IGhhdmUgdGhpcyByb3V0ZSlcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NlL2xvZyQnKV0sXG5dO1xuXG5jb25zdCBNRU1PSVpFRF9GVU5DVElPTlMgPSBbXG4gICdnZXRTdGF0dXNCYXJIZWlnaHQnLFxuICAnZ2V0RGV2aWNlUGl4ZWxSYXRpbycsXG5dO1xuXG5jbGFzcyBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyIGV4dGVuZHMgQmFzZURyaXZlciB7XG4gIGNvbnN0cnVjdG9yIChvcHRzID0ge30sIHNob3VsZFZhbGlkYXRlQ2FwcyA9IHRydWUpIHtcbiAgICAvLyBgc2hlbGxgIG92ZXJ3cml0ZXMgYWRiLnNoZWxsLCBzbyByZW1vdmVcbiAgICBkZWxldGUgb3B0cy5zaGVsbDtcblxuICAgIHN1cGVyKG9wdHMsIHNob3VsZFZhbGlkYXRlQ2Fwcyk7XG4gICAgdGhpcy5sb2NhdG9yU3RyYXRlZ2llcyA9IFtcbiAgICAgICd4cGF0aCcsXG4gICAgICAnaWQnLFxuICAgICAgJ2NsYXNzIG5hbWUnLFxuICAgICAgJ2FjY2Vzc2liaWxpdHkgaWQnLFxuICAgICAgJ2NzcyBzZWxlY3RvcicsXG4gICAgICAnLWFuZHJvaWQgdWlhdXRvbWF0b3InXG4gICAgXTtcbiAgICB0aGlzLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IGRlc2lyZWRDYXBDb25zdHJhaW50cztcbiAgICB0aGlzLnVpYXV0b21hdG9yMiA9IG51bGw7XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuZGVmYXVsdElNRSA9IG51bGw7XG4gICAgdGhpcy5qd3BQcm94eUF2b2lkID0gTk9fUFJPWFk7XG4gICAgdGhpcy5hcGtTdHJpbmdzID0ge307IC8vIG1hcCBvZiBsYW5ndWFnZSAtPiBzdHJpbmdzIG9ialxuXG4gICAgdGhpcy5zZXR0aW5ncyA9IG5ldyBEZXZpY2VTZXR0aW5ncyh7aWdub3JlVW5pbXBvcnRhbnRWaWV3czogZmFsc2UsIGFsbG93SW52aXNpYmxlRWxlbWVudHM6IGZhbHNlfSxcbiAgICAgICAgdGhpcy5vblNldHRpbmdzVXBkYXRlLmJpbmQodGhpcykpO1xuICAgIC8vIGhhbmRsZSB3ZWJ2aWV3IG1lY2hhbmljcyBmcm9tIEFuZHJvaWREcml2ZXJcbiAgICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gICAgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVycyA9IHt9O1xuXG4gICAgLy8gbWVtb2l6ZSBmdW5jdGlvbnMgaGVyZSwgc28gdGhhdCB0aGV5IGFyZSBkb25lIG9uIGEgcGVyLWluc3RhbmNlIGJhc2lzXG4gICAgZm9yIChjb25zdCBmbiBvZiBNRU1PSVpFRF9GVU5DVElPTlMpIHtcbiAgICAgIHRoaXNbZm5dID0gXy5tZW1vaXplKHRoaXNbZm5dKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlRGVzaXJlZENhcHMoY2FwcykgJiYgYW5kcm9pZEhlbHBlcnMudmFsaWRhdGVEZXNpcmVkQ2FwcyhjYXBzKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVE9ETyBoYW5kbGUgb3RoZXJTZXNzaW9uRGF0YSBmb3IgbXVsdGlwbGUgc2Vzc2lvbnNcbiAgICAgIGxldCBbc2Vzc2lvbklkLCBjYXBzXSA9IGF3YWl0IHN1cGVyLmNyZWF0ZVNlc3Npb24oLi4uYXJncyk7XG5cbiAgICAgIGxldCBzZXJ2ZXJEZXRhaWxzID0ge1xuICAgICAgICBwbGF0Zm9ybTogJ0xJTlVYJyxcbiAgICAgICAgd2ViU3RvcmFnZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0YWtlc1NjcmVlbnNob3Q6IHRydWUsXG4gICAgICAgIGphdmFzY3JpcHRFbmFibGVkOiB0cnVlLFxuICAgICAgICBkYXRhYmFzZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBuZXR3b3JrQ29ubmVjdGlvbkVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxvY2F0aW9uQ29udGV4dEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB3YXJuaW5nczoge30sXG4gICAgICAgIGRlc2lyZWQ6IHRoaXMuY2FwcyxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FwcyA9IE9iamVjdC5hc3NpZ24oc2VydmVyRGV0YWlscywgdGhpcy5jYXBzKTtcblxuICAgICAgdGhpcy5jdXJDb250ZXh0ID0gdGhpcy5kZWZhdWx0Q29udGV4dE5hbWUoKTtcblxuICAgICAgbGV0IGRlZmF1bHRPcHRzID0ge1xuICAgICAgICBmdWxsUmVzZXQ6IGZhbHNlLFxuICAgICAgICBhdXRvTGF1bmNoOiB0cnVlLFxuICAgICAgICBhZGJQb3J0OiBERUZBVUxUX0FEQl9QT1JULFxuICAgICAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQ6IDkwMDAwXG4gICAgICB9O1xuICAgICAgXy5kZWZhdWx0cyh0aGlzLm9wdHMsIGRlZmF1bHRPcHRzKTtcblxuICAgICAgaWYgKHRoaXMuaXNDaHJvbWVTZXNzaW9uKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiV2UncmUgZ29pbmcgdG8gcnVuIGEgQ2hyb21lLWJhc2VkIHNlc3Npb25cIik7XG4gICAgICAgIGxldCB7cGtnLCBhY3Rpdml0eX0gPSBoZWxwZXJzLmdldENocm9tZVBrZyh0aGlzLm9wdHMuYnJvd3Nlck5hbWUpO1xuICAgICAgICB0aGlzLm9wdHMuYXBwUGFja2FnZSA9IHRoaXMuY2Fwcy5hcHBQYWNrYWdlID0gcGtnO1xuICAgICAgICB0aGlzLm9wdHMuYXBwQWN0aXZpdHkgPSB0aGlzLmNhcHMuYXBwQWN0aXZpdHkgPSBhY3Rpdml0eTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYENocm9tZS10eXBlIHBhY2thZ2UgYW5kIGFjdGl2aXR5IGFyZSAke3BrZ30gYW5kICR7YWN0aXZpdHl9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdHMucmVib290KSB7XG4gICAgICAgIHRoaXMuc2V0QXZkRnJvbUNhcGFiaWxpdGllcyhjYXBzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgICAgLy8gZmluZCBhbmQgY29weSwgb3IgZG93bmxvYWQgYW5kIHVuemlwIGFuIGFwcCB1cmwgb3IgcGF0aFxuICAgICAgICB0aGlzLm9wdHMuYXBwID0gYXdhaXQgdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcCh0aGlzLm9wdHMuYXBwLCBbQVBLX0VYVEVOU0lPTiwgQVBLU19FWFRFTlNJT05dKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcFByZXNlbnQoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRzLmFwcFBhY2thZ2UpIHtcbiAgICAgICAgLy8gdGhlIGFwcCBpc24ndCBhbiBhY3R1YWwgYXBwIGZpbGUgYnV0IHJhdGhlciBzb21ldGhpbmcgd2Ugd2FudCB0b1xuICAgICAgICAvLyBhc3N1bWUgaXMgb24gdGhlIGRldmljZSBhbmQganVzdCBsYXVuY2ggdmlhIHRoZSBhcHBQYWNrYWdlXG4gICAgICAgIGxvZ2dlci5pbmZvKGBTdGFydGluZyAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nIGRpcmVjdGx5IG9uIHRoZSBkZXZpY2VgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBOZWl0aGVyICdhcHAnIG5vciAnYXBwUGFja2FnZScgd2FzIHNldC4gU3RhcnRpbmcgVWlBdXRvbWF0b3IyIGAgK1xuICAgICAgICAgICd3aXRob3V0IHRoZSB0YXJnZXQgYXBwbGljYXRpb24nKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3B0cy5hZGJQb3J0ID0gdGhpcy5vcHRzLmFkYlBvcnQgfHwgREVGQVVMVF9BREJfUE9SVDtcblxuICAgICAgYXdhaXQgdGhpcy5zdGFydFVpQXV0b21hdG9yMlNlc3Npb24oKTtcbiAgICAgIGF3YWl0IHRoaXMuZmlsbERldmljZURldGFpbHMoKTtcbiAgICAgIGlmICh0aGlzLm9wdHMubWpwZWdTY3JlZW5zaG90VXJsKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBTdGFydGluZyBNSlBFRyBzdHJlYW0gcmVhZGluZyBVUkw6ICcke3RoaXMub3B0cy5tanBlZ1NjcmVlbnNob3RVcmx9J2ApO1xuICAgICAgICB0aGlzLm1qcGVnU3RyZWFtID0gbmV3IG1qcGVnLk1KcGVnU3RyZWFtKHRoaXMub3B0cy5tanBlZ1NjcmVlbnNob3RVcmwpO1xuICAgICAgICBhd2FpdCB0aGlzLm1qcGVnU3RyZWFtLnN0YXJ0KCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW3Nlc3Npb25JZCwgdGhpcy5jYXBzXTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24oKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZmlsbERldmljZURldGFpbHMgKCkge1xuICAgIHRoaXMuY2Fwcy5waXhlbFJhdGlvID0gYXdhaXQgdGhpcy5nZXREZXZpY2VQaXhlbFJhdGlvKCk7XG4gICAgdGhpcy5jYXBzLnN0YXRCYXJIZWlnaHQgPSBhd2FpdCB0aGlzLmdldFN0YXR1c0JhckhlaWdodCgpO1xuICAgIHRoaXMuY2Fwcy52aWV3cG9ydFJlY3QgPSBhd2FpdCB0aGlzLmdldFZpZXdQb3J0UmVjdCgpO1xuICB9XG5cbiAgZ2V0IGRyaXZlckRhdGEgKCkge1xuICAgIC8vIFRPRE8gZmlsbCBvdXQgcmVzb3VyY2UgaW5mbyBoZXJlXG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgYXN5bmMgZ2V0U2Vzc2lvbiAoKSB7XG4gICAgbGV0IHNlc3Npb25EYXRhID0gYXdhaXQgc3VwZXIuZ2V0U2Vzc2lvbigpO1xuICAgIGxvZ2dlci5kZWJ1ZygnR2V0dGluZyBzZXNzaW9uIGRldGFpbHMgZnJvbSBzZXJ2ZXIgdG8gbWl4IGluJyk7XG4gICAgbGV0IHVpYTJEYXRhID0gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvJywgJ0dFVCcsIHt9KTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc2Vzc2lvbkRhdGEsIHVpYTJEYXRhKTtcbiAgfVxuXG4gIGlzRW11bGF0b3IgKCkge1xuICAgIHJldHVybiBoZWxwZXJzLmlzRW11bGF0b3IodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gIH1cblxuICBzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIChjYXBzKSB7XG4gICAgaWYgKHRoaXMub3B0cy5hdmQpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdhdmQgbmFtZSBkZWZpbmVkLCBpZ25vcmluZyBkZXZpY2UgbmFtZSBhbmQgcGxhdGZvcm0gdmVyc2lvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWNhcHMuZGV2aWNlTmFtZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdygnYXZkIG9yIGRldmljZU5hbWUgc2hvdWxkIGJlIHNwZWNpZmllZCB3aGVuIHJlYm9vdCBvcHRpb24gaXMgZW5hYmxlcycpO1xuICAgICAgfVxuICAgICAgaWYgKCFjYXBzLnBsYXRmb3JtVmVyc2lvbikge1xuICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdygnYXZkIG9yIHBsYXRmb3JtVmVyc2lvbiBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVkJyk7XG4gICAgICB9XG4gICAgICBsZXQgYXZkRGV2aWNlID0gY2Fwcy5kZXZpY2VOYW1lLnJlcGxhY2UoL1teYS16QS1aMC05Xy5dL2csICctJyk7XG4gICAgICB0aGlzLm9wdHMuYXZkID0gYCR7YXZkRGV2aWNlfV9fJHtjYXBzLnBsYXRmb3JtVmVyc2lvbn1gO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFsbG9jYXRlU3lzdGVtUG9ydCAoKSB7XG4gICAgY29uc3QgZm9yd2FyZFBvcnQgPSBhc3luYyAobG9jYWxQb3J0KSA9PiB7XG4gICAgICBsb2dnZXIuZGVidWcoYEZvcndhcmRpbmcgVWlBdXRvbWF0b3IyIFNlcnZlciBwb3J0ICR7REVWSUNFX1BPUlR9IHRvIGxvY2FsIHBvcnQgJHtsb2NhbFBvcnR9YCk7XG4gICAgICBpZiAoKGF3YWl0IGNoZWNrUG9ydFN0YXR1cyhsb2NhbFBvcnQsIExPQ0FMSE9TVF9JUDQpKSA9PT0gJ29wZW4nKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBVaUF1dG9tYXRvcjIgU2VydmVyIGNhbm5vdCBzdGFydCBiZWNhdXNlIHRoZSBsb2NhbCBwb3J0ICMke2xvY2FsUG9ydH0gaXMgYnVzeS4gYCArXG4gICAgICAgICAgYE1ha2Ugc3VyZSB0aGUgcG9ydCB5b3UgcHJvdmlkZSB2aWEgJ3N5c3RlbVBvcnQnIGNhcGFiaWxpdHkgaXMgbm90IG9jY3VwaWVkLiBgICtcbiAgICAgICAgICBgVGhpcyBzaXR1YXRpb24gbWlnaHQgb2Z0ZW4gYmUgYSByZXN1bHQgb2YgYW4gaW5hY2N1cmF0ZSBzZXNzaW9ucyBtYW5hZ2VtZW50LCBlLmcuIGAgK1xuICAgICAgICAgIGBvbGQgYXV0b21hdGlvbiBzZXNzaW9ucyBvbiB0aGUgc2FtZSBkZXZpY2UgbXVzdCBhbHdheXMgYmUgY2xvc2VkIGJlZm9yZSBzdGFydGluZyBuZXcgb25lcy5gKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYWRiLmZvcndhcmRQb3J0KGxvY2FsUG9ydCwgREVWSUNFX1BPUlQpO1xuICAgIH07XG5cbiAgICBpZiAodGhpcy5vcHRzLnN5c3RlbVBvcnQpIHtcbiAgICAgIHRoaXMuX2hhc1N5c3RlbVBvcnRJbkNhcHMgPSB0cnVlO1xuICAgICAgcmV0dXJuIGF3YWl0IGZvcndhcmRQb3J0KHRoaXMub3B0cy5zeXN0ZW1Qb3J0KTtcbiAgICB9XG5cbiAgICBhd2FpdCBERVZJQ0VfUE9SVF9BTExPQ0FUSU9OX0dVQVJEKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IFtzdGFydFBvcnQsIGVuZFBvcnRdID0gREVWSUNFX1BPUlRfUkFOR0U7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLm9wdHMuc3lzdGVtUG9ydCA9IGF3YWl0IGZpbmRBUG9ydE5vdEluVXNlKHN0YXJ0UG9ydCwgZW5kUG9ydCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KFxuICAgICAgICAgIGBDYW5ub3QgZmluZCBhbnkgZnJlZSBwb3J0IGluIHJhbmdlICR7c3RhcnRQb3J0fS4uJHtlbmRQb3J0fX0uIGAgK1xuICAgICAgICAgIGBQbGVhc2Ugc2V0IHRoZSBhdmFpbGFibGUgcG9ydCBudW1iZXIgYnkgcHJvdmlkaW5nIHRoZSBzeXN0ZW1Qb3J0IGNhcGFiaWxpdHkgb3IgYCArXG4gICAgICAgICAgYGRvdWJsZSBjaGVjayB0aGUgcHJvY2Vzc2VzIHRoYXQgYXJlIGxvY2tpbmcgcG9ydHMgd2l0aGluIHRoaXMgcmFuZ2UgYW5kIHRlcm1pbmF0ZSBgICtcbiAgICAgICAgICBgdGhlc2Ugd2hpY2ggYXJlIG5vdCBuZWVkZWQgYW55bW9yZWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgZm9yd2FyZFBvcnQodGhpcy5vcHRzLnN5c3RlbVBvcnQpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVsZWFzZVN5c3RlbVBvcnQgKCkge1xuICAgIGlmICghdGhpcy5vcHRzLnN5c3RlbVBvcnQgfHwgIXRoaXMuYWRiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2hhc1N5c3RlbVBvcnRJbkNhcHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnJlbW92ZVBvcnRGb3J3YXJkKHRoaXMub3B0cy5zeXN0ZW1Qb3J0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgREVWSUNFX1BPUlRfQUxMT0NBVElPTl9HVUFSRChhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmFkYi5yZW1vdmVQb3J0Rm9yd2FyZCh0aGlzLm9wdHMuc3lzdGVtUG9ydCkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0ICgpIHtcbiAgICBpZiAodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yd2FyZFBvcnQodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCwgTUpQRUdfU0VSVkVSX0RFVklDRV9QT1JUKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyByZWxlYXNlTWpwZWdTZXJ2ZXJQb3J0ICgpIHtcbiAgICBpZiAodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIucmVtb3ZlUG9ydEZvcndhcmQodGhpcy5vcHRzLm1qcGVnU2VydmVyUG9ydCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRVaUF1dG9tYXRvcjJTZXNzaW9uICgpIHtcbiAgICAvLyBnZXQgZGV2aWNlIHVkaWQgZm9yIHRoaXMgc2Vzc2lvblxuICAgIGxldCB7dWRpZCwgZW1Qb3J0fSA9IGF3YWl0IGhlbHBlcnMuZ2V0RGV2aWNlSW5mb0Zyb21DYXBzKHRoaXMub3B0cyk7XG4gICAgdGhpcy5vcHRzLnVkaWQgPSB1ZGlkO1xuICAgIHRoaXMub3B0cy5lbVBvcnQgPSBlbVBvcnQ7XG5cbiAgICAvLyBub3cgdGhhdCB3ZSBrbm93IG91ciBqYXZhIHZlcnNpb24gYW5kIGRldmljZSBpbmZvLCB3ZSBjYW4gY3JlYXRlIG91clxuICAgIC8vIEFEQiBpbnN0YW5jZVxuICAgIHRoaXMuYWRiID0gYXdhaXQgYW5kcm9pZEhlbHBlcnMuY3JlYXRlQURCKHRoaXMub3B0cyk7XG5cbiAgICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG5cbiAgICBpZiAoYXBpTGV2ZWwgPCAyMSkge1xuICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coJ1VJQXV0b21hdG9yMiBpcyBvbmx5IHN1cHBvcnRlZCBzaW5jZSBBbmRyb2lkIDUuMCAoTG9sbGlwb3ApLiAnICtcbiAgICAgICAgJ1lvdSBjb3VsZCBzdGlsbCB1c2Ugb3RoZXIgc3VwcG9ydGVkIGJhY2tlbmRzIGluIG9yZGVyIHRvIGF1dG9tYXRlIG9sZGVyIEFuZHJvaWQgdmVyc2lvbnMuJyk7XG4gICAgfVxuXG4gICAgaWYgKGFwaUxldmVsID49IDI4KSB7IC8vIEFuZHJvaWQgUFxuICAgICAgbG9nZ2VyLmluZm8oJ1JlbGF4aW5nIGhpZGRlbiBhcGkgcG9saWN5Jyk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXRIaWRkZW5BcGlQb2xpY3koJzEnLCAhIXRoaXMub3B0cy5pZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvcik7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgd2UgaGF2ZSB0byBlbmFibGUvZGlzYWJsZSBncHMgYmVmb3JlIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uXG4gICAgaWYgKHV0aWwuaGFzVmFsdWUodGhpcy5vcHRzLmdwc0VuYWJsZWQpKSB7XG4gICAgICBpZiAodGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFRyeWluZyB0byAke3RoaXMub3B0cy5ncHNFbmFibGVkID8gJ2VuYWJsZScgOiAnZGlzYWJsZSd9IGdwcyBsb2NhdGlvbiBwcm92aWRlcmApO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi50b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyKHRoaXMub3B0cy5ncHNFbmFibGVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBTb3JyeSEgJ2dwc0VuYWJsZWQnIGNhcGFiaWxpdHkgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9yc2ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGdldCBhcHBQYWNrYWdlIGV0IGFsIGZyb20gbWFuaWZlc3QgaWYgbmVjZXNzYXJ5XG4gICAgY29uc3QgYXBwSW5mbyA9IGF3YWl0IGhlbHBlcnMuZ2V0TGF1bmNoSW5mbyh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICAvLyBhbmQgZ2V0IGl0IG9udG8gb3VyICdvcHRzJyBvYmplY3Qgc28gd2UgdXNlIGl0IGZyb20gbm93IG9uXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIGFwcEluZm8gfHwge30pO1xuXG4gICAgLy8gc2V0IGFjdHVhbCBkZXZpY2UgbmFtZSwgdWRpZCwgcGxhdGZvcm0gdmVyc2lvbiwgc2NyZWVuIHNpemUsIHNjcmVlbiBkZW5zaXR5LCBtb2RlbCBhbmQgbWFudWZhY3R1cmVyIGRldGFpbHNcbiAgICB0aGlzLmNhcHMuZGV2aWNlTmFtZSA9IHRoaXMuYWRiLmN1ckRldmljZUlkO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VVRElEID0gdGhpcy5vcHRzLnVkaWQ7XG5cbiAgICAvLyBzdGFydCBhbiBhdmQsIHNldCB0aGUgbGFuZ3VhZ2UvbG9jYWxlLCBwaWNrIGFuIGVtdWxhdG9yLCBldGMuLi5cbiAgICAvLyBUT0RPIHdpdGggbXVsdGlwbGUgZGV2aWNlcyB3ZSdsbCBuZWVkIHRvIHBhcmFtZXRlcml6ZSB0aGlzXG4gICAgdGhpcy5kZWZhdWx0SU1FID0gYXdhaXQgaGVscGVycy5pbml0RGV2aWNlKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuXG4gICAgLy8gUHJlcGFyZSB0aGUgZGV2aWNlIGJ5IGZvcndhcmRpbmcgdGhlIFVpQXV0b21hdG9yMiBwb3J0XG4gICAgLy8gVGhpcyBjYWxsIG11dGF0ZXMgdGhpcy5vcHRzLnN5c3RlbVBvcnQgaWYgaXQgaXMgbm90IHNldCBleHBsaWNpdGx5XG4gICAgYXdhaXQgdGhpcy5hbGxvY2F0ZVN5c3RlbVBvcnQoKTtcblxuICAgIC8vIFByZXBhcmUgdGhlIGRldmljZSBieSBmb3J3YXJkaW5nIHRoZSBVaUF1dG9tYXRvcjIgTUpQRUcgc2VydmVyIHBvcnQgKGlmXG4gICAgLy8gYXBwbGljYWJsZSlcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlTWpwZWdTZXJ2ZXJQb3J0KCk7XG5cbiAgICAvLyBzZXQgdXAgdGhlIG1vZGlmaWVkIFVpQXV0b21hdG9yMiBzZXJ2ZXIgZXRjXG4gICAgYXdhaXQgdGhpcy5pbml0VWlBdXRvbWF0b3IyU2VydmVyKCk7XG5cbiAgICAvLyBTaG91bGQgYmUgYWZ0ZXIgaW5zdGFsbGluZyBpby5hcHBpdW0uc2V0dGluZ3MgaW4gaGVscGVycy5pbml0RGV2aWNlXG4gICAgaWYgKHRoaXMub3B0cy5kaXNhYmxlV2luZG93QW5pbWF0aW9uICYmIChhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpIDwgMjYpKSB7IC8vIEFQSSBsZXZlbCAyNiBpcyBBbmRyb2lkIDguMC5cbiAgICAgIC8vIEdyYW50aW5nIGFuZHJvaWQucGVybWlzc2lvbi5TRVRfQU5JTUFUSU9OX1NDQUxFIGlzIG5lY2Vzc2FyeSB0byBoYW5kbGUgYW5pbWF0aW9ucyB1bmRlciBBUEkgbGV2ZWwgMjZcbiAgICAgIC8vIFJlYWQgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vcHVsbC8xMTY0MCNpc3N1ZWNvbW1lbnQtNDM4MjYwNDc3XG4gICAgICAvLyBgLS1uby13aW5kb3ctYW5pbWF0aW9uYCB3b3JrcyBvdmVyIEFuZHJvaWQgOCB0byBkaXNhYmxlIGFsbCBvZiBhbmltYXRpb25zXG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuaXNBbmltYXRpb25PbigpKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdEaXNhYmxpbmcgYW5pbWF0aW9uIHZpYSBpby5hcHBpdW0uc2V0dGluZ3MnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QW5pbWF0aW9uU3RhdGUoZmFsc2UpO1xuICAgICAgICB0aGlzLl93YXNXaW5kb3dBbmltYXRpb25EaXNhYmxlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuaW5mbygnV2luZG93IGFuaW1hdGlvbiBpcyBhbHJlYWR5IGRpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2V0IHVwIGFwcCB1bmRlciB0ZXN0XG4gICAgLy8gcHJlcGFyZSBvdXIgYWN0dWFsIEFVVCwgZ2V0IGl0IG9uIHRoZSBkZXZpY2UsIGV0Yy4uLlxuICAgIGF3YWl0IHRoaXMuaW5pdEFVVCgpO1xuXG4gICAgLy8gQWRkaW5nIEFVVCBwYWNrYWdlIG5hbWUgaW4gdGhlIGNhcGFiaWxpdGllcyBpZiBwYWNrYWdlIG5hbWUgbm90IGV4aXN0IGluIGNhcHNcbiAgICBpZiAoIXRoaXMuY2Fwcy5hcHBQYWNrYWdlICYmIGFwcEluZm8pIHtcbiAgICAgIHRoaXMuY2Fwcy5hcHBQYWNrYWdlID0gYXBwSW5mby5hcHBQYWNrYWdlO1xuICAgIH1cblxuICAgIC8vIGxhdW5jaCBVaUF1dG9tYXRvcjIgYW5kIHdhaXQgdGlsbCBpdHMgb25saW5lIGFuZCB3ZSBoYXZlIGEgc2Vzc2lvblxuICAgIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLnN0YXJ0U2Vzc2lvbih0aGlzLmNhcHMpO1xuXG4gICAgYXdhaXQgdGhpcy5hZGREZXZpY2VJbmZvVG9DYXBzKCk7XG5cbiAgICAvLyBVbmxvY2sgdGhlIGRldmljZSBhZnRlciB0aGUgc2Vzc2lvbiBpcyBzdGFydGVkLlxuICAgIGlmICghdGhpcy5vcHRzLnNraXBVbmxvY2spIHtcbiAgICAgIC8vIHVubG9jayB0aGUgZGV2aWNlIHRvIHByZXBhcmUgaXQgZm9yIHRlc3RpbmdcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB0aGlzLmNhcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuZGVidWcoYCdza2lwVW5sb2NrJyBjYXBhYmlsaXR5IHNldCwgc28gc2tpcHBpbmcgZGV2aWNlIHVubG9ja2ApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ2hyb21lU2Vzc2lvbikgeyAvLyBzdGFydCBhIGNocm9tZWRyaXZlciBzZXNzaW9uXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0Q2hyb21lU2Vzc2lvbih0aGlzKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0cy5hdXRvTGF1bmNoICYmIHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUFwcFN0YXJ0cygpO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSBpbml0aWFsIG9yaWVudGF0aW9uIGlzIHJlcXVlc3RlZCwgc2V0IGl0XG4gICAgaWYgKHV0aWwuaGFzVmFsdWUodGhpcy5vcHRzLm9yaWVudGF0aW9uKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBTZXR0aW5nIGluaXRpYWwgb3JpZW50YXRpb24gdG8gJyR7dGhpcy5vcHRzLm9yaWVudGF0aW9ufSdgKTtcbiAgICAgIGF3YWl0IHRoaXMuc2V0T3JpZW50YXRpb24odGhpcy5vcHRzLm9yaWVudGF0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBpZiB3ZSB3YW50IHRvIGltbWVkaWF0ZWx5IGdldCBpbnRvIGEgd2Vidmlldywgc2V0IG91ciBjb250ZXh0XG4gICAgLy8gYXBwcm9wcmlhdGVseVxuICAgIGlmICh0aGlzLm9wdHMuYXV0b1dlYnZpZXcpIHtcbiAgICAgIGNvbnN0IHZpZXdOYW1lID0gdGhpcy5kZWZhdWx0V2Vidmlld05hbWUoKTtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLm9wdHMuYXV0b1dlYnZpZXdUaW1lb3V0IHx8IDIwMDA7XG4gICAgICBsb2dnZXIuaW5mbyhgU2V0dGluZyBhdXRvIHdlYnZpZXcgdG8gY29udGV4dCAnJHt2aWV3TmFtZX0nIHdpdGggdGltZW91dCAke3RpbWVvdXR9bXNgKTtcbiAgICAgIGF3YWl0IHJldHJ5SW50ZXJ2YWwodGltZW91dCAvIDUwMCwgNTAwLCB0aGlzLnNldENvbnRleHQuYmluZCh0aGlzKSwgdmlld05hbWUpO1xuICAgIH1cblxuICAgIC8vIG5vdyB0aGF0IGV2ZXJ5dGhpbmcgaGFzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LCB0dXJuIG9uIHByb3h5aW5nIHNvIGFsbFxuICAgIC8vIHN1YnNlcXVlbnQgc2Vzc2lvbiByZXF1ZXN0cyBnbyBzdHJhaWdodCB0by9mcm9tIHVpYXV0b21hdG9yMlxuICAgIHRoaXMuandwUHJveHlBY3RpdmUgPSB0cnVlO1xuICB9XG5cbiAgYXN5bmMgYWRkRGV2aWNlSW5mb1RvQ2FwcyAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXBpVmVyc2lvbixcbiAgICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICAgIG1hbnVmYWN0dXJlcixcbiAgICAgIG1vZGVsLFxuICAgICAgcmVhbERpc3BsYXlTaXplLFxuICAgICAgZGlzcGxheURlbnNpdHksXG4gICAgfSA9IGF3YWl0IHRoaXMubW9iaWxlR2V0RGV2aWNlSW5mbygpO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VBcGlMZXZlbCA9IHBhcnNlSW50KGFwaVZlcnNpb24sIDEwKTtcbiAgICB0aGlzLmNhcHMucGxhdGZvcm1WZXJzaW9uID0gcGxhdGZvcm1WZXJzaW9uO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VTY3JlZW5TaXplID0gcmVhbERpc3BsYXlTaXplO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VTY3JlZW5EZW5zaXR5ID0gZGlzcGxheURlbnNpdHk7XG4gICAgdGhpcy5jYXBzLmRldmljZU1vZGVsID0gbW9kZWw7XG4gICAgdGhpcy5jYXBzLmRldmljZU1hbnVmYWN0dXJlciA9IG1hbnVmYWN0dXJlcjtcbiAgfVxuXG4gIGFzeW5jIGluaXRVaUF1dG9tYXRvcjJTZXJ2ZXIgKCkge1xuICAgIC8vIGJyb2tlbiBvdXQgZm9yIHJlYWRhYmlsaXR5XG4gICAgY29uc3QgdWlhdXRvbWF0b3IyT3B0cyA9IHtcbiAgICAgIGhvc3Q6IHRoaXMub3B0cy5yZW1vdGVBZGJIb3N0IHx8IHRoaXMub3B0cy5ob3N0IHx8IExPQ0FMSE9TVF9JUDQsXG4gICAgICBzeXN0ZW1Qb3J0OiB0aGlzLm9wdHMuc3lzdGVtUG9ydCxcbiAgICAgIGRldmljZVBvcnQ6IERFVklDRV9QT1JULFxuICAgICAgYWRiOiB0aGlzLmFkYixcbiAgICAgIGFwazogdGhpcy5vcHRzLmFwcCxcbiAgICAgIHRtcERpcjogdGhpcy5vcHRzLnRtcERpcixcbiAgICAgIGFwcFBhY2thZ2U6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgICAgYXBwQWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgIGRpc2FibGVXaW5kb3dBbmltYXRpb246ICEhdGhpcy5vcHRzLmRpc2FibGVXaW5kb3dBbmltYXRpb24sXG4gICAgICBkaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZTogdGhpcy5vcHRzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlLFxuICAgICAgcmVhZFRpbWVvdXQ6IHRoaXMub3B0cy51aWF1dG9tYXRvcjJTZXJ2ZXJSZWFkVGltZW91dCxcbiAgICB9O1xuICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgcGFja2FnZSBhbmQgYWN0aXZpdHksIHdlIGNhbiBjcmVhdGUgYW4gaW5zdGFuY2Ugb2ZcbiAgICAvLyB1aWF1dG9tYXRvcjIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgb3B0aW9uc1xuICAgIHRoaXMudWlhdXRvbWF0b3IyID0gbmV3IFVpQXV0b21hdG9yMlNlcnZlcih1aWF1dG9tYXRvcjJPcHRzKTtcbiAgICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy51aWF1dG9tYXRvcjIucHJveHlSZXFSZXMuYmluZCh0aGlzLnVpYXV0b21hdG9yMik7XG4gICAgdGhpcy5wcm94eUNvbW1hbmQgPSB0aGlzLnVpYXV0b21hdG9yMi5wcm94eUNvbW1hbmQuYmluZCh0aGlzLnVpYXV0b21hdG9yMik7XG5cbiAgICBpZiAodGhpcy5vcHRzLnNraXBTZXJ2ZXJJbnN0YWxsYXRpb24pIHtcbiAgICAgIGxvZ2dlci5pbmZvKGAnc2tpcFNlcnZlckluc3RhbGxhdGlvbicgaXMgc2V0LiBTa2lwcGluZyBVSUF1dG9tYXRvcjIgc2VydmVyIGluc3RhbGxhdGlvbi5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuaW5zdGFsbFNlcnZlckFwayh0aGlzLm9wdHMudWlhdXRvbWF0b3IyU2VydmVySW5zdGFsbFRpbWVvdXQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuYWRkVG9EZXZpY2VJZGxlV2hpdGVsaXN0KFxuICAgICAgICAgIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIFNFUlZFUl9QQUNLQUdFX0lELCBTRVJWRVJfVEVTVF9QQUNLQUdFX0lELFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIud2FybihgQ2Fubm90IGFkZCBzZXJ2ZXIgcGFja2FnZXMgdG8gdGhlIERvemUgd2hpdGVsaXN0LiBPcmlnaW5hbCBlcnJvcjogYCArXG4gICAgICAgICAgKGUuc3RkZXJyIHx8IGUubWVzc2FnZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGluaXRBVVQgKCkge1xuICAgIC8vIFVuaW5zdGFsbCBhbnkgdW5pbnN0YWxsT3RoZXJQYWNrYWdlcyB3aGljaCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSB7XG4gICAgICBhd2FpdCBoZWxwZXJzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMoXG4gICAgICAgIHRoaXMuYWRiLFxuICAgICAgICBoZWxwZXJzLnBhcnNlQXJyYXkodGhpcy5vcHRzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpLFxuICAgICAgICBbU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgU0VSVkVSX1BBQ0tBR0VfSUQsIFNFUlZFUl9URVNUX1BBQ0tBR0VfSURdXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEluc3RhbGwgYW55IFwib3RoZXJBcHBzXCIgdGhhdCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy5vdGhlckFwcHMpIHtcbiAgICAgIGxldCBvdGhlckFwcHM7XG4gICAgICB0cnkge1xuICAgICAgICBvdGhlckFwcHMgPSBoZWxwZXJzLnBhcnNlQXJyYXkodGhpcy5vcHRzLm90aGVyQXBwcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgcGFyc2UgXCJvdGhlckFwcHNcIiBjYXBhYmlsaXR5OiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIG90aGVyQXBwcyA9IGF3YWl0IEIuYWxsKG90aGVyQXBwc1xuICAgICAgICAubWFwKChhcHApID0+IHRoaXMuaGVscGVycy5jb25maWd1cmVBcHAoYXBwLCBbQVBLX0VYVEVOU0lPTiwgQVBLU19FWFRFTlNJT05dKSkpO1xuICAgICAgYXdhaXQgaGVscGVycy5pbnN0YWxsT3RoZXJBcGtzKG90aGVyQXBwcywgdGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0cy5hcHApIHtcbiAgICAgIGlmICh0aGlzLm9wdHMubm9SZXNldCAmJiAhKGF3YWl0IHRoaXMuYWRiLmlzQXBwSW5zdGFsbGVkKHRoaXMub3B0cy5hcHBQYWNrYWdlKSlcbiAgICAgICAgICB8fCAhdGhpcy5vcHRzLm5vUmVzZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdHMubm9TaWduICYmICFhd2FpdCB0aGlzLmFkYi5jaGVja0Fwa0NlcnQodGhpcy5vcHRzLmFwcCwgdGhpcy5vcHRzLmFwcFBhY2thZ2UsIHtcbiAgICAgICAgICByZXF1aXJlRGVmYXVsdENlcnQ6IGZhbHNlLFxuICAgICAgICB9KSkge1xuICAgICAgICAgIGF3YWl0IGhlbHBlcnMuc2lnbkFwcCh0aGlzLmFkYiwgdGhpcy5vcHRzLmFwcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgaGVscGVycy5pbnN0YWxsQXBrKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdub1Jlc2V0IGhhcyBiZWVuIHJlcXVlc3RlZCBhbmQgdGhlIGFwcCBpcyBhbHJlYWR5IGluc3RhbGxlZC4gRG9pbmcgbm90aGluZycpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCkge1xuICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdygnRnVsbCByZXNldCByZXF1aXJlcyBhbiBhcHAgY2FwYWJpbGl0eSwgdXNlIGZhc3RSZXNldCBpZiBhcHAgaXMgbm90IHByb3ZpZGVkJyk7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZGVidWcoJ05vIGFwcCBjYXBhYmlsaXR5LiBBc3N1bWluZyBpdCBpcyBhbHJlYWR5IG9uIHRoZSBkZXZpY2UnKTtcbiAgICAgIGlmICh0aGlzLm9wdHMuZmFzdFJlc2V0ICYmIHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICAgIGF3YWl0IGhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZW5zdXJlQXBwU3RhcnRzICgpIHtcbiAgICAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhbiBhY3Rpdml0eSBhbmQgcGFja2FnZSB0byB3YWl0IGZvclxuICAgIGNvbnN0IGFwcFdhaXRQYWNrYWdlID0gdGhpcy5vcHRzLmFwcFdhaXRQYWNrYWdlIHx8IHRoaXMub3B0cy5hcHBQYWNrYWdlO1xuICAgIGNvbnN0IGFwcFdhaXRBY3Rpdml0eSA9IHRoaXMub3B0cy5hcHBXYWl0QWN0aXZpdHkgfHwgdGhpcy5vcHRzLmFwcEFjdGl2aXR5O1xuXG4gICAgbG9nZ2VyLmluZm8oYFN0YXJ0aW5nICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfS8ke3RoaXMub3B0cy5hcHBBY3Rpdml0eX0gYCArXG4gICAgICBgYW5kIHdhaXRpbmcgZm9yICcke2FwcFdhaXRQYWNrYWdlfS8ke2FwcFdhaXRBY3Rpdml0eX0nYCk7XG5cbiAgICBpZiAodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSkge1xuICAgICAgbG9nZ2VyLmluZm8oYGFuZHJvaWRDb3ZlcmFnZSBpcyBjb25maWd1cmVkLiBgICtcbiAgICAgICAgYCBTdGFydGluZyBpbnN0cnVtZW50YXRpb24gb2YgJyR7dGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZX0nLi4uYCk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5hbmRyb2lkQ292ZXJhZ2UodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSwgYXBwV2FpdFBhY2thZ2UsIGFwcFdhaXRBY3Rpdml0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnN0YXJ0QXBwKHtcbiAgICAgICAgcGtnOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICAgICAgYWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgICAgYWN0aW9uOiB0aGlzLm9wdHMuaW50ZW50QWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogdGhpcy5vcHRzLmludGVudENhdGVnb3J5LFxuICAgICAgICBmbGFnczogdGhpcy5vcHRzLmludGVudEZsYWdzLFxuICAgICAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgICAgIHdhaXRBY3Rpdml0eTogdGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSxcbiAgICAgICAgd2FpdEZvckxhdW5jaDogdGhpcy5vcHRzLmFwcFdhaXRGb3JMYXVuY2gsXG4gICAgICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICAgICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHM6IHRoaXMub3B0cy5vcHRpb25hbEludGVudEFyZ3VtZW50cyxcbiAgICAgICAgc3RvcEFwcDogIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQsXG4gICAgICAgIHJldHJ5OiB0cnVlLFxuICAgICAgICB1c2VyOiB0aGlzLm9wdHMudXNlclByb2ZpbGUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIGxvZ2dlci5kZWJ1ZygnRGVsZXRpbmcgVWlBdXRvbWF0b3IyIHNlc3Npb24nKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BSZWNvcmRpbmdTY3JlZW4oKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgICBhd2FpdCBhbmRyb2lkSGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnModGhpcy5zZXJ2ZXIsIHRoaXMuc2Vzc2lvbklkKTtcblxuICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZygpO1xuXG4gICAgaWYgKHRoaXMudWlhdXRvbWF0b3IyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BDaHJvbWVkcml2ZXJQcm94aWVzKCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byBzdG9wIENocm9tZURyaXZlciBwcm94aWVzOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuandwUHJveHlBY3RpdmUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5kZWxldGVTZXNzaW9uKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gcHJveHkgZGVsZXRlU2Vzc2lvbiB0byBVaUF1dG9tYXRvcjI6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudWlhdXRvbWF0b3IyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMuYWRiKSB7XG4gICAgICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCAmJiB0aGlzLm9wdHMucmVzZXRLZXlib2FyZCAmJiB0aGlzLmRlZmF1bHRJTUUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBSZXNldHRpbmcgSU1FIHRvICcke3RoaXMuZGVmYXVsdElNRX0nYCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0SU1FKHRoaXMuZGVmYXVsdElNRSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gcmVzZXQgSU1FOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jYXBzLmFuZHJvaWRDb3ZlcmFnZSkge1xuICAgICAgICBsb2dnZXIuaW5mbygnU2h1dHRpbmcgZG93biB0aGUgYWRiIHByb2Nlc3Mgb2YgaW5zdHJ1bWVudGF0aW9uLi4uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmVuZEFuZHJvaWRDb3ZlcmFnZSgpO1xuICAgICAgICAvLyBVc2UgdGhpcyBicm9hZGNhc3QgaW50ZW50IHRvIG5vdGlmeSBpdCdzIHRpbWUgdG8gZHVtcCBjb3ZlcmFnZSB0byBmaWxlXG4gICAgICAgIGlmICh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50KSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFNlbmRpbmcgaW50ZW50IGJyb2FkY2FzdCAnJHt0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50fScgYXQgdGhlIGVuZCBvZiBpbnN0cnVtZW50aW5nLmApO1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmJyb2FkY2FzdCh0aGlzLmNhcHMuYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIud2FybignTm8gYW5kcm9pZENvdmVyYWdlRW5kSW50ZW50IGlzIGNvbmZpZ3VyZWQgaW4gY2Fwcy4gUG9zc2libHkgeW91IGNhbm5vdCBnZXQgY292ZXJhZ2UgZmlsZS4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0cy5hcHBQYWNrYWdlKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0Nocm9tZVNlc3Npb24gJiYgIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gZm9yY2Ugc3RvcCBhcHA6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ2FwYWJpbGl0eSAnZnVsbFJlc2V0JyBzZXQgdG8gJ3RydWUnLCBVbmluc3RhbGxpbmcgJyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9J2ApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byB1bmluc3RhbGwgYXBwOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVGhpcyB2YWx1ZSBjYW4gYmUgdHJ1ZSBpZiB0ZXN0IHRhcmdldCBkZXZpY2UgaXMgPD0gMjZcbiAgICAgIGlmICh0aGlzLl93YXNXaW5kb3dBbmltYXRpb25EaXNhYmxlZCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnUmVzdG9yaW5nIHdpbmRvdyBhbmltYXRpb24gc3RhdGUnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QW5pbWF0aW9uU3RhdGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zdG9wTG9nY2F0KCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbGVhc2VTeXN0ZW1Qb3J0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHJlbW92ZSBzeXN0ZW0gcG9ydCBmb3J3YXJkOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIC8vIElnbm9yZSwgdGhpcyBibG9jayB3aWxsIGFsc28gYmUgY2FsbGVkIHdoZW4gd2UgZmFsbCBpbiBjYXRjaCBibG9ja1xuICAgICAgICAvLyBhbmQgYmVmb3JlIGV2ZW4gcG9ydCBmb3J3YXJkLlxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWxlYXNlTWpwZWdTZXJ2ZXJQb3J0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHJlbW92ZSBNSlBFRyBzZXJ2ZXIgcG9ydCBmb3J3YXJkOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIC8vIElnbm9yZSwgdGhpcyBibG9jayB3aWxsIGFsc28gYmUgY2FsbGVkIHdoZW4gd2UgZmFsbCBpbiBjYXRjaCBibG9ja1xuICAgICAgICAvLyBhbmQgYmVmb3JlIGV2ZW4gcG9ydCBmb3J3YXJkLlxuICAgICAgfVxuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOCkgeyAvLyBBbmRyb2lkIFBcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1Jlc3RvcmluZyBoaWRkZW4gYXBpIHBvbGljeSB0byB0aGUgZGV2aWNlIGRlZmF1bHQgY29uZmlndXJhdGlvbicpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5KCEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5yZWJvb3QpIHtcbiAgICAgICAgbGV0IGF2ZE5hbWUgPSB0aGlzLm9wdHMuYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ2xvc2luZyBlbXVsYXRvciAnJHthdmROYW1lfSdgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5raWxsRW11bGF0b3IoYXZkTmFtZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gY2xvc2UgZW11bGF0b3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMubWpwZWdTdHJlYW0pIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdDbG9zaW5nIE1KUEVHIHN0cmVhbScpO1xuICAgICAgdGhpcy5tanBlZ1N0cmVhbS5zdG9wKCk7XG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZVNlc3Npb24oKTtcbiAgfVxuXG4gIGFzeW5jIGNoZWNrQXBwUHJlc2VudCAoKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdDaGVja2luZyB3aGV0aGVyIGFwcCBpcyBhY3R1YWxseSBwcmVzZW50Jyk7XG4gICAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKHRoaXMub3B0cy5hcHApKSkge1xuICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBmaW5kIGFwcCBhcGsgYXQgJyR7dGhpcy5vcHRzLmFwcH0nYCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25TZXR0aW5nc1VwZGF0ZSAoKSB7XG4gICAgLy8gaW50ZW50aW9uYWxseSBkbyBub3RoaW5nIGhlcmUsIHNpbmNlIGNvbW1hbmRzLnVwZGF0ZVNldHRpbmdzIHByb3hpZXNcbiAgICAvLyBzZXR0aW5ncyB0byB0aGUgdWlhdXRvMiBzZXJ2ZXIgYWxyZWFkeVxuICB9XG5cbiAgLy8gTmVlZCB0byBvdmVycmlkZSBhbmRyb2lkLWRyaXZlcidzIHZlcnNpb24gb2YgdGhpcyBzaW5jZSB3ZSBkb24ndCBhY3R1YWxseVxuICAvLyBoYXZlIGEgYm9vdHN0cmFwOyBpbnN0ZWFkIHdlIGp1c3QgcmVzdGFydCBhZGIgYW5kIHJlLWZvcndhcmQgdGhlIFVpQXV0b21hdG9yMlxuICAvLyBwb3J0XG4gIGFzeW5jIHdyYXBCb290c3RyYXBEaXNjb25uZWN0ICh3cmFwcGVkKSB7XG4gICAgYXdhaXQgd3JhcHBlZCgpO1xuICAgIGF3YWl0IHRoaXMuYWRiLnJlc3RhcnQoKTtcbiAgICBhd2FpdCB0aGlzLmFsbG9jYXRlU3lzdGVtUG9ydCgpO1xuICAgIGF3YWl0IHRoaXMuYWxsb2NhdGVNanBlZ1NlcnZlclBvcnQoKTtcbiAgfVxuXG4gIHByb3h5QWN0aXZlIChzZXNzaW9uSWQpIHtcbiAgICBzdXBlci5wcm94eUFjdGl2ZShzZXNzaW9uSWQpO1xuXG4gICAgLy8gd2UgYWx3YXlzIGhhdmUgYW4gYWN0aXZlIHByb3h5IHRvIHRoZSBVaUF1dG9tYXRvcjIgc2VydmVyXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjYW5Qcm94eSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIuY2FuUHJveHkoc2Vzc2lvbklkKTtcblxuICAgIC8vIHdlIGNhbiBhbHdheXMgcHJveHkgdG8gdGhlIHVpYXV0b21hdG9yMiBzZXJ2ZXJcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldFByb3h5QXZvaWRMaXN0IChzZXNzaW9uSWQpIHtcbiAgICBzdXBlci5nZXRQcm94eUF2b2lkTGlzdChzZXNzaW9uSWQpO1xuICAgIC8vIHdlIGFyZSBtYWludGFpbmluZyB0d28gc2V0cyBvZiBOT19QUk9YWSBsaXN0cywgb25lIGZvciBjaHJvbWVkcml2ZXIoQ0hST01FX05PX1BST1hZKVxuICAgIC8vIGFuZCBvbmUgZm9yIHVpYXV0b21hdG9yMihOT19QUk9YWSksIGJhc2VkIG9uIGN1cnJlbnQgY29udGV4dCB3aWxsIHJldHVybiByZWxhdGVkIE5PX1BST1hZIGxpc3RcbiAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLmNocm9tZWRyaXZlcikpIHtcbiAgICAgIC8vIGlmIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgd2VidmlldyhjaHJvbWVkcml2ZXIpLCB0aGVuIHJldHVybiBDSFJPTUVfTk9fUFJPWFkgbGlzdFxuICAgICAgdGhpcy5qd3BQcm94eUF2b2lkID0gQ0hST01FX05PX1BST1hZO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBOT19QUk9YWTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5uYXRpdmVXZWJTY3JlZW5zaG90KSB7XG4gICAgICB0aGlzLmp3cFByb3h5QXZvaWQgPSBbLi4udGhpcy5qd3BQcm94eUF2b2lkLCBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9zY3JlZW5zaG90JyldXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5qd3BQcm94eUF2b2lkO1xuICB9XG5cbiAgZ2V0IGlzQ2hyb21lU2Vzc2lvbiAoKSB7XG4gICAgcmV0dXJuIGhlbHBlcnMuaXNDaHJvbWVCcm93c2VyKHRoaXMub3B0cy5icm93c2VyTmFtZSk7XG4gIH1cbn1cblxuLy8gZmlyc3QgYWRkIHRoZSBhbmRyb2lkLWRyaXZlciBjb21tYW5kcyB3aGljaCB3ZSB3aWxsIGZhbGwgYmFjayB0b1xuZm9yIChsZXQgW2NtZCwgZm5dIG9mIF8udG9QYWlycyhhbmRyb2lkQ29tbWFuZHMpKSB7XG4gIEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXIucHJvdG90eXBlW2NtZF0gPSBmbjtcbn1cblxuLy8gdGhlbiBvdmVyd3JpdGUgd2l0aCBhbnkgdWlhdXRvbWF0b3IyLXNwZWNpZmljIGNvbW1hbmRzXG5mb3IgKGxldCBbY21kLCBmbl0gb2YgXy50b1BhaXJzKGNvbW1hbmRzKSkge1xuICBBbmRyb2lkVWlhdXRvbWF0b3IyRHJpdmVyLnByb3RvdHlwZVtjbWRdID0gZm47XG59XG5cbmV4cG9ydCB7IEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXIgfTtcbmV4cG9ydCBkZWZhdWx0IEFuZHJvaWRVaWF1dG9tYXRvcjJEcml2ZXI7XG4iXSwiZmlsZSI6ImxpYi9kcml2ZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
|
@@ -76,6 +76,7 @@ class UiAutomator2Server {
|
|
|
76
76
|
|
|
77
77
|
this.jwproxy = new UIA2Proxy(proxyOpts);
|
|
78
78
|
this.proxyReqRes = this.jwproxy.proxyReqRes.bind(this.jwproxy);
|
|
79
|
+
this.proxyCommand = this.jwproxy.command.bind(this.jwproxy);
|
|
79
80
|
this.jwproxy.didInstrumentationExit = false;
|
|
80
81
|
}
|
|
81
82
|
|
|
@@ -387,4 +388,4 @@ var _default = UiAutomator2Server;
|
|
|
387
388
|
exports.default = _default;require('source-map-support').install();
|
|
388
389
|
|
|
389
390
|
|
|
390
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91aWF1dG9tYXRvcjIuanMiXSwibmFtZXMiOlsiUkVRRF9QQVJBTVMiLCJTRVJWRVJfTEFVTkNIX1RJTUVPVVQiLCJTRVJWRVJfSU5TVEFMTF9SRVRSSUVTIiwiU0VSVklDRVNfTEFVTkNIX1RJTUVPVVQiLCJTRVJWRVJfUEFDS0FHRV9JRCIsIlNFUlZFUl9URVNUX1BBQ0tBR0VfSUQiLCJJTlNUUlVNRU5UQVRJT05fVEFSR0VUIiwiaW5zdHJ1bWVudGF0aW9uTG9nZ2VyIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiVUlBMlByb3h5IiwiSldQcm94eSIsInByb3h5Q29tbWFuZCIsInVybCIsIm1ldGhvZCIsImJvZHkiLCJkaWRJbnN0cnVtZW50YXRpb25FeGl0IiwiZXJyb3JzIiwiSW52YWxpZENvbnRleHRFcnJvciIsIlVpQXV0b21hdG9yMlNlcnZlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsInJlcSIsInV0aWwiLCJoYXNWYWx1ZSIsIkVycm9yIiwiZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UiLCJwcm94eU9wdHMiLCJzZXJ2ZXIiLCJob3N0IiwicG9ydCIsInN5c3RlbVBvcnQiLCJrZWVwQWxpdmUiLCJyZWFkVGltZW91dCIsInRpbWVvdXQiLCJqd3Byb3h5IiwicHJveHlSZXFSZXMiLCJiaW5kIiwiaW5zdGFsbFNlcnZlckFwayIsImluc3RhbGxUaW1lb3V0IiwidG1wUm9vdCIsInRlbXBEaXIiLCJvcGVuRGlyIiwicGFja2FnZUluZm9zTWFwcGVyIiwiYXBwUGF0aCIsImFwcElkIiwiaGVscGVycyIsImlzV3JpdGVhYmxlIiwibG9nIiwiaW5mbyIsImRzdFBhdGgiLCJwYXRoIiwicmVzb2x2ZSIsImJhc2VuYW1lIiwiZnMiLCJjb3B5RmlsZSIsInBhY2thZ2VzSW5mbyIsIkIiLCJhbGwiLCJtYXAiLCJhcGtQYXRoIiwidGVzdEFwa1BhdGgiLCJzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyIsInNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyIsImlzQXBwSW5zdGFsbGVkIiwiYWRiIiwiY2hlY2tBcGtDZXJ0Iiwic2lnbkFwcCIsImFwcFN0YXRlIiwiZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUiLCJkZWJ1ZyIsIkFQUF9JTlNUQUxMX1NUQVRFIiwiT0xERVJfVkVSU0lPTl9JTlNUQUxMRUQiLCJORVdFUl9WRVJTSU9OX0lOU1RBTExFRCIsImluY2x1ZGVzIiwiTk9UX0lOU1RBTExFRCIsInVuaW5zdGFsbEFwayIsImVyciIsIndhcm4iLCJtZXNzYWdlIiwiaW5zdGFsbCIsIm5vSW5jcmVtZW50YWwiLCJyZXBsYWNlIiwidGltZW91dENhcE5hbWUiLCJyaW1yYWYiLCJ2ZXJpZnlTZXJ2aWNlc0F2YWlsYWJpbGl0eSIsImlzUG1TZXJ2aWNlQXZhaWxhYmxlIiwicG1PdXRwdXQiLCJwbUVycm9yIiwic2hlbGwiLCJlIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImVycm9yIiwibGluZSIsInNwbGl0Iiwic3RhcnRTZXNzaW9uIiwiY2FwcyIsImNsZWFudXBBdXRvbWF0aW9uTGVmdG92ZXJzIiwic2tpcFNlcnZlckluc3RhbGxhdGlvbiIsInNlcnZlclZlcnNpb24iLCJ1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0IiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0IiwicmV0cmllcyIsIm1heFJldHJpZXMiLCJkZWxheUJldHdlZW5SZXRyaWVzIiwic3RhcnRJbnN0cnVtZW50YXRpb25Qcm9jZXNzIiwiY29tbWFuZCIsImVycm9yQW5kVGhyb3ciLCJkZWxheSIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ0b0ZpeGVkIiwiY2FwYWJpbGl0aWVzIiwiZmlyc3RNYXRjaCIsImFsd2F5c01hdGNoIiwiY21kIiwiZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiIsInB1c2giLCJfIiwiaXNCb29sZWFuIiwiaW5zdHJ1bWVudGF0aW9uUHJvY2VzcyIsImNyZWF0ZVN1YlByb2Nlc3MiLCJvbiIsInN0ZG91dCIsInN0ZGVyciIsIm91dHB1dCIsInRyaW0iLCJjb2RlIiwiZGVsZXRlU2Vzc2lvbiIsInN0cmljdENsZWFudXAiLCJ2YWx1ZSIsImRhdGEiLCJhY3RpdmVTZXNzaW9uSWRzIiwiaWQiLCJmaWx0ZXIiLCJCb29sZWFuIiwibGVuZ3RoIiwiSlNPTiIsInN0cmluZ2lmeSIsInBsdXJhbGl6ZSIsImF4aW9zIiwiZGVsZXRlIiwiZm9yY2VTdG9wIiwiaWdub3JlIiwia2lsbFByb2Nlc3Nlc0J5TmFtZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxXQUFXLEdBQUcsQ0FBQyxLQUFELEVBQVEsUUFBUixFQUFrQixNQUFsQixFQUEwQixZQUExQixFQUF3QyxZQUF4QyxFQUFzRCx3QkFBdEQsQ0FBcEI7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxLQUE5QjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLEVBQS9CO0FBQ0EsTUFBTUMsdUJBQXVCLEdBQUcsS0FBaEM7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRywrQkFBMUI7O0FBQ0EsTUFBTUMsc0JBQXNCLEdBQUksR0FBRUQsaUJBQWtCLE9BQXBEOztBQUNBLE1BQU1FLHNCQUFzQixHQUFJLEdBQUVELHNCQUF1QiwwQ0FBekQ7OztBQUNBLE1BQU1FLHFCQUFxQixHQUFHQyxzQkFBT0MsU0FBUCxDQUFpQixpQkFBakIsQ0FBOUI7O0FBRUEsTUFBTUMsU0FBTixTQUF3QkMseUJBQXhCLENBQWdDO0FBQ1osUUFBWkMsWUFBWSxDQUFFQyxHQUFGLEVBQU9DLE1BQVAsRUFBZUMsSUFBSSxHQUFHLElBQXRCLEVBQTRCO0FBQzVDLFFBQUksS0FBS0Msc0JBQVQsRUFBaUM7QUFDL0IsWUFBTSxJQUFJQyx5QkFBT0MsbUJBQVgsQ0FDSCxJQUFHSixNQUFPLElBQUdELEdBQUkscURBQWxCLEdBQ0EsaUVBREEsR0FFQSxnRUFISSxDQUFOO0FBSUQ7O0FBQ0QsV0FBTyxNQUFNLE1BQU1ELFlBQU4sQ0FBbUJDLEdBQW5CLEVBQXdCQyxNQUF4QixFQUFnQ0MsSUFBaEMsQ0FBYjtBQUNEOztBQVQ2Qjs7QUFZaEMsTUFBTUksa0JBQU4sQ0FBeUI7QUFDdkJDLEVBQUFBLFdBQVcsQ0FBRUMsSUFBSSxHQUFHLEVBQVQsRUFBYTtBQUN0QixTQUFLLElBQUlDLEdBQVQsSUFBZ0J0QixXQUFoQixFQUE2QjtBQUMzQixVQUFJLENBQUNxQixJQUFELElBQVMsQ0FBQ0Usb0JBQUtDLFFBQUwsQ0FBY0gsSUFBSSxDQUFDQyxHQUFELENBQWxCLENBQWQsRUFBd0M7QUFDdEMsY0FBTSxJQUFJRyxLQUFKLENBQVcsV0FBVUgsR0FBSSxnQkFBekIsQ0FBTjtBQUNEOztBQUNELFdBQUtBLEdBQUwsSUFBWUQsSUFBSSxDQUFDQyxHQUFELENBQWhCO0FBQ0Q7O0FBQ0QsU0FBS0ksbUNBQUwsR0FBMkNMLElBQUksQ0FBQ0ssbUNBQWhEO0FBQ0EsVUFBTUMsU0FBUyxHQUFHO0FBQ2hCQyxNQUFBQSxNQUFNLEVBQUUsS0FBS0MsSUFERztBQUVoQkMsTUFBQUEsSUFBSSxFQUFFLEtBQUtDLFVBRks7QUFHaEJDLE1BQUFBLFNBQVMsRUFBRTtBQUhLLEtBQWxCOztBQUtBLFFBQUlYLElBQUksQ0FBQ1ksV0FBTCxJQUFvQlosSUFBSSxDQUFDWSxXQUFMLEdBQW1CLENBQTNDLEVBQThDO0FBQzVDTixNQUFBQSxTQUFTLENBQUNPLE9BQVYsR0FBb0JiLElBQUksQ0FBQ1ksV0FBekI7QUFDRDs7QUFDRCxTQUFLRSxPQUFMLEdBQWUsSUFBSXpCLFNBQUosQ0FBY2lCLFNBQWQsQ0FBZjtBQUNBLFNBQUtTLFdBQUwsR0FBbUIsS0FBS0QsT0FBTCxDQUFhQyxXQUFiLENBQXlCQyxJQUF6QixDQUE4QixLQUFLRixPQUFuQyxDQUFuQjtBQUNBLFNBQUtBLE9BQUwsQ0FBYW5CLHNCQUFiLEdBQXNDLEtBQXRDO0FBQ0Q7O0FBT3FCLFFBQWhCc0IsZ0JBQWdCLENBQUVDLGNBQWMsR0FBR3JDLHNCQUFzQixHQUFHLElBQTVDLEVBQWtEO0FBQ3RFLFVBQU1zQyxPQUFPLEdBQUcsTUFBTUMsdUJBQVFDLE9BQVIsRUFBdEI7O0FBQ0EsVUFBTUMsa0JBQWtCLEdBQUcsT0FBTztBQUFDQyxNQUFBQSxPQUFEO0FBQVVDLE1BQUFBO0FBQVYsS0FBUCxLQUE0QjtBQUNyRCxVQUFJLE1BQU1DLGlCQUFRQyxXQUFSLENBQW9CSCxPQUFwQixDQUFWLEVBQXdDO0FBQ3RDLGVBQU87QUFBRUEsVUFBQUEsT0FBRjtBQUFXQyxVQUFBQTtBQUFYLFNBQVA7QUFDRDs7QUFFREcsc0JBQUlDLElBQUosQ0FBVSxzQkFBcUJMLE9BQVEsc0JBQTlCLEdBQ04sZ0RBQStDSixPQUFRLHFCQURqRCxHQUVOLHNHQUZIOztBQUdBLFlBQU1VLE9BQU8sR0FBR0MsY0FBS0MsT0FBTCxDQUFhWixPQUFiLEVBQXNCVyxjQUFLRSxRQUFMLENBQWNULE9BQWQsQ0FBdEIsQ0FBaEI7O0FBQ0EsWUFBTVUsa0JBQUdDLFFBQUgsQ0FBWVgsT0FBWixFQUFxQk0sT0FBckIsQ0FBTjtBQUNBLGFBQU87QUFDTE4sUUFBQUEsT0FBTyxFQUFFTSxPQURKO0FBRUxMLFFBQUFBO0FBRkssT0FBUDtBQUlELEtBZEQ7O0FBZ0JBLFFBQUk7QUFDRixZQUFNVyxZQUFZLEdBQUcsTUFBTUMsa0JBQUVDLEdBQUYsQ0FBTUQsa0JBQUVFLEdBQUYsQ0FBTSxDQUNyQztBQUNFZixRQUFBQSxPQUFPLEVBQUVnQix5Q0FEWDtBQUVFZixRQUFBQSxLQUFLLEVBQUV6QztBQUZULE9BRHFDLEVBSWxDO0FBQ0R3QyxRQUFBQSxPQUFPLEVBQUVpQix1Q0FEUjtBQUVEaEIsUUFBQUEsS0FBSyxFQUFFeEM7QUFGTixPQUprQyxDQUFOLEVBUTlCc0Msa0JBUjhCLENBQU4sQ0FBM0I7QUFVQSxVQUFJbUIsNkJBQTZCLEdBQUcsS0FBcEM7QUFDQSxVQUFJQywyQkFBMkIsR0FBRyxLQUFsQzs7QUFDQSxXQUFLLE1BQU07QUFBQ2xCLFFBQUFBLEtBQUQ7QUFBUUQsUUFBQUE7QUFBUixPQUFYLElBQStCWSxZQUEvQixFQUE2QztBQUMzQyxZQUFJWCxLQUFLLEtBQUt4QyxzQkFBZCxFQUFzQztBQUNwQyxnQkFBTTJELGNBQWMsR0FBRyxNQUFNLEtBQUtDLEdBQUwsQ0FBU0QsY0FBVCxDQUF3Qm5CLEtBQXhCLENBQTdCOztBQUlBLGNBQUksRUFBQyxNQUFNLEtBQUtvQixHQUFMLENBQVNDLFlBQVQsQ0FBc0J0QixPQUF0QixFQUErQkMsS0FBL0IsQ0FBUCxDQUFKLEVBQWtEO0FBQ2hELGtCQUFNQyxpQkFBUXFCLE9BQVIsQ0FBZ0IsS0FBS0YsR0FBckIsRUFBMEJyQixPQUExQixDQUFOO0FBQ0FrQixZQUFBQSw2QkFBNkIsR0FBR0EsNkJBQTZCLElBQUlFLGNBQWpFO0FBQ0FELFlBQUFBLDJCQUEyQixHQUFHLElBQTlCO0FBQ0Q7O0FBRUQsY0FBSSxDQUFDQyxjQUFMLEVBQXFCO0FBQ25CRCxZQUFBQSwyQkFBMkIsR0FBRyxJQUE5QjtBQUNEOztBQUNEO0FBQ0Q7O0FBRUQsY0FBTUssUUFBUSxHQUFHLE1BQU0sS0FBS0gsR0FBTCxDQUFTSSwwQkFBVCxDQUFvQ3pCLE9BQXBDLEVBQTZDQyxLQUE3QyxDQUF2Qjs7QUFDQUcsd0JBQUlzQixLQUFKLENBQVcsR0FBRXpCLEtBQU0sd0JBQXVCdUIsUUFBUyxFQUFuRDs7QUFDQSxZQUFJLE1BQU0sS0FBS0gsR0FBTCxDQUFTQyxZQUFULENBQXNCdEIsT0FBdEIsRUFBK0JDLEtBQS9CLENBQVYsRUFBaUQ7QUFDL0NpQixVQUFBQSw2QkFBNkIsR0FBR0EsNkJBQTZCLElBQUksQ0FDL0QsS0FBS0csR0FBTCxDQUFTTSxpQkFBVCxDQUEyQkMsdUJBRG9DLEVBRS9ELEtBQUtQLEdBQUwsQ0FBU00saUJBQVQsQ0FBMkJFLHVCQUZvQyxFQUcvREMsUUFIK0QsQ0FHdEROLFFBSHNELENBQWpFO0FBSUQsU0FMRCxNQUtPO0FBQ0wsZ0JBQU10QixpQkFBUXFCLE9BQVIsQ0FBZ0IsS0FBS0YsR0FBckIsRUFBMEJyQixPQUExQixDQUFOO0FBQ0FrQixVQUFBQSw2QkFBNkIsR0FBR0EsNkJBQTZCLElBQUksQ0FBQyxDQUNoRSxLQUFLRyxHQUFMLENBQVNNLGlCQUFULENBQTJCSSxhQURxQyxFQUVoRUQsUUFGZ0UsQ0FFdkROLFFBRnVELENBQWxFO0FBR0Q7O0FBQ0RMLFFBQUFBLDJCQUEyQixHQUFHQSwyQkFBMkIsSUFBSUQsNkJBQS9CLElBQWdFLENBQzVGLEtBQUtHLEdBQUwsQ0FBU00saUJBQVQsQ0FBMkJJLGFBRGlFLEVBRTVGRCxRQUY0RixDQUVuRk4sUUFGbUYsQ0FBOUY7QUFHRDs7QUFDRHBCLHNCQUFJQyxJQUFKLENBQVUsdUJBQXNCYywyQkFBMkIsR0FBRyxFQUFILEdBQVEsTUFBTywyQkFBMUU7O0FBQ0EsVUFBSUEsMkJBQTJCLElBQUlELDZCQUFuQyxFQUFrRTtBQUNoRWQsd0JBQUlDLElBQUosQ0FBUyxrREFBVDtBQUNEOztBQUNELFdBQUssTUFBTTtBQUFDSixRQUFBQSxLQUFEO0FBQVFELFFBQUFBO0FBQVIsT0FBWCxJQUErQlksWUFBL0IsRUFBNkM7QUFDM0MsWUFBSU0sNkJBQUosRUFBbUM7QUFDakMsY0FBSTtBQUNGLGtCQUFNLEtBQUtHLEdBQUwsQ0FBU1csWUFBVCxDQUFzQi9CLEtBQXRCLENBQU47QUFDRCxXQUZELENBRUUsT0FBT2dDLEdBQVAsRUFBWTtBQUNaN0IsNEJBQUk4QixJQUFKLENBQVUsdUJBQXNCakMsS0FBTSxNQUFLZ0MsR0FBRyxDQUFDRSxPQUFRLEVBQXZEO0FBQ0Q7QUFDRjs7QUFDRCxZQUFJaEIsMkJBQUosRUFBaUM7QUFDL0IsZ0JBQU0sS0FBS0UsR0FBTCxDQUFTZSxPQUFULENBQWlCcEMsT0FBakIsRUFBMEI7QUFDOUJxQyxZQUFBQSxhQUFhLEVBQUUsSUFEZTtBQUU5QkMsWUFBQUEsT0FBTyxFQUFFLElBRnFCO0FBRzlCaEQsWUFBQUEsT0FBTyxFQUFFSyxjQUhxQjtBQUk5QjRDLFlBQUFBLGNBQWMsRUFBRTtBQUpjLFdBQTFCLENBQU47QUFNRDtBQUNGO0FBQ0YsS0FyRUQsU0FxRVU7QUFDUixZQUFNN0Isa0JBQUc4QixNQUFILENBQVU1QyxPQUFWLENBQU47QUFDRDs7QUFFRCxVQUFNLEtBQUs2QywwQkFBTCxFQUFOO0FBQ0Q7O0FBRStCLFFBQTFCQSwwQkFBMEIsR0FBSTtBQUNsQ3JDLG9CQUFJc0IsS0FBSixDQUFXLGlCQUFnQm5FLHVCQUF3QixpQ0FBbkQ7O0FBQ0EsUUFBSW1GLG9CQUFvQixHQUFHLEtBQTNCO0FBQ0EsUUFBSUMsUUFBUSxHQUFHLEVBQWY7QUFDQSxRQUFJQyxPQUFPLEdBQUcsSUFBZDs7QUFDQSxRQUFJO0FBQ0YsWUFBTSxnQ0FBaUIsWUFBWTtBQUNqQyxZQUFJLENBQUNGLG9CQUFMLEVBQTJCO0FBQ3pCRSxVQUFBQSxPQUFPLEdBQUcsSUFBVjtBQUNBRCxVQUFBQSxRQUFRLEdBQUcsRUFBWDs7QUFDQSxjQUFJO0FBQ0ZBLFlBQUFBLFFBQVEsR0FBRyxNQUFNLEtBQUt0QixHQUFMLENBQVN3QixLQUFULENBQWUsQ0FBQyxJQUFELEVBQU8sTUFBUCxFQUFlLGlCQUFmLENBQWYsQ0FBakI7QUFDRCxXQUZELENBRUUsT0FBT0MsQ0FBUCxFQUFVO0FBQ1ZGLFlBQUFBLE9BQU8sR0FBR0UsQ0FBVjtBQUNEOztBQUNELGNBQUlILFFBQVEsQ0FBQ2IsUUFBVCxDQUFrQixzQ0FBbEIsQ0FBSixFQUErRDtBQUM3RGMsWUFBQUEsT0FBTyxHQUFHLElBQUkvRCxLQUFKLENBQVcsb0NBQW1DOEQsUUFBUyxFQUF2RCxDQUFWO0FBQ0FBLFlBQUFBLFFBQVEsR0FBRyxFQUFYO0FBQ0QsV0FIRCxNQUdPLElBQUlBLFFBQVEsQ0FBQ2IsUUFBVCxDQUFrQnBFLHNCQUFsQixDQUFKLEVBQStDO0FBQ3BEaUYsWUFBQUEsUUFBUSxHQUFHLEVBQVg7O0FBQ0F2Qyw0QkFBSXNCLEtBQUosQ0FBVywyQkFBMEJoRSxzQkFBdUIsZ0JBQTVEOztBQUVBZ0YsWUFBQUEsb0JBQW9CLEdBQUcsSUFBdkI7QUFDRCxXQUxNLE1BS0EsSUFBSSxDQUFDRSxPQUFMLEVBQWM7QUFDbkJBLFlBQUFBLE9BQU8sR0FBRyxJQUFJL0QsS0FBSixDQUFVLDZEQUFWLENBQVY7QUFDRDtBQUNGOztBQUNELGVBQU82RCxvQkFBUDtBQUNELE9BdEJLLEVBc0JIO0FBQ0RLLFFBQUFBLE1BQU0sRUFBRXhGLHVCQURQO0FBRUR5RixRQUFBQSxVQUFVLEVBQUU7QUFGWCxPQXRCRyxDQUFOO0FBMEJELEtBM0JELENBMkJFLE9BQU9mLEdBQVAsRUFBWTtBQUNaN0Isc0JBQUk2QyxLQUFKLENBQVcsMENBQXlDdkYsc0JBQXVCLE1BQUssQ0FBQ2tGLE9BQU8sSUFBSSxFQUFaLEVBQWdCVCxPQUFRLEVBQXhHOztBQUNBLFVBQUlRLFFBQUosRUFBYztBQUNadkMsd0JBQUlzQixLQUFKLENBQVUsb0JBQVY7O0FBQ0EsYUFBSyxNQUFNd0IsSUFBWCxJQUFtQlAsUUFBUSxDQUFDUSxLQUFULENBQWUsSUFBZixDQUFuQixFQUF5QztBQUN2Qy9DLDBCQUFJc0IsS0FBSixDQUFXLE9BQU13QixJQUFJLENBQUNaLE9BQUwsQ0FBYSxrQkFBYixFQUFpQyxFQUFqQyxDQUFxQyxFQUF0RDtBQUNEO0FBQ0Y7QUFDRjtBQUNGOztBQUVpQixRQUFaYyxZQUFZLENBQUVDLElBQUYsRUFBUTtBQUN4QixVQUFNLEtBQUtDLDBCQUFMLEVBQU47O0FBQ0EsUUFBSUQsSUFBSSxDQUFDRSxzQkFBVCxFQUFpQztBQUMvQm5ELHNCQUFJQyxJQUFKLENBQVUsd0ZBQVY7QUFDRCxLQUZELE1BRU87QUFDTEQsc0JBQUlDLElBQUosQ0FBVSxnQ0FBK0JtRCxpQ0FBYyxFQUF2RDs7QUFDQXBELHNCQUFJQyxJQUFKLENBQVUsbUNBQWtDVyx5Q0FBUSxvQkFBbUJDLHVDQUFZLEdBQW5GO0FBQ0Q7O0FBRUQsVUFBTTNCLE9BQU8sR0FBRytELElBQUksQ0FBQ0ksK0JBQUwsSUFBd0NwRyxxQkFBeEQ7QUFDQSxVQUFNcUcsS0FBSyxHQUFHLElBQUlDLHNCQUFPQyxLQUFYLEdBQW1CQyxLQUFuQixFQUFkO0FBQ0EsUUFBSUMsT0FBTyxHQUFHLENBQWQ7QUFDQSxVQUFNQyxVQUFVLEdBQUcsQ0FBbkI7QUFDQSxVQUFNQyxtQkFBbUIsR0FBRyxJQUE1Qjs7QUFDQSxXQUFPRixPQUFPLEdBQUdDLFVBQWpCLEVBQTZCO0FBQzNCM0Qsc0JBQUlDLElBQUosQ0FBVSxpQkFBZ0JmLE9BQVEscUNBQWxDOztBQUNBLFdBQUtDLE9BQUwsQ0FBYW5CLHNCQUFiLEdBQXNDLEtBQXRDO0FBQ0EsWUFBTSxLQUFLNkYsMkJBQUwsRUFBTjs7QUFDQSxVQUFJLENBQUMsS0FBSzFFLE9BQUwsQ0FBYW5CLHNCQUFsQixFQUEwQztBQUN4QyxZQUFJO0FBQ0YsZ0JBQU0sZ0NBQWlCLFlBQVk7QUFDakMsZ0JBQUk7QUFDRixvQkFBTSxLQUFLbUIsT0FBTCxDQUFhMkUsT0FBYixDQUFxQixTQUFyQixFQUFnQyxLQUFoQyxDQUFOO0FBQ0EscUJBQU8sSUFBUDtBQUNELGFBSEQsQ0FHRSxPQUFPakMsR0FBUCxFQUFZO0FBRVoscUJBQU8sS0FBSzFDLE9BQUwsQ0FBYW5CLHNCQUFwQjtBQUNEO0FBQ0YsV0FSSyxFQVFIO0FBQ0QyRSxZQUFBQSxNQUFNLEVBQUV6RCxPQURQO0FBRUQwRCxZQUFBQSxVQUFVLEVBQUU7QUFGWCxXQVJHLENBQU47QUFZRCxTQWJELENBYUUsT0FBT2YsR0FBUCxFQUFZO0FBQ1o3QiwwQkFBSStELGFBQUosQ0FBbUIsNERBQTJEN0UsT0FBUSxjQUFwRSxHQUNkLHlGQURjLEdBRWIsMEZBRkw7QUFHRDtBQUNGOztBQUNELFVBQUksQ0FBQyxLQUFLQyxPQUFMLENBQWFuQixzQkFBbEIsRUFBMEM7QUFDeEM7QUFDRDs7QUFFRDBGLE1BQUFBLE9BQU87O0FBQ1AsVUFBSUEsT0FBTyxJQUFJQyxVQUFmLEVBQTJCO0FBQ3pCM0Qsd0JBQUkrRCxhQUFKLENBQWtCLHdEQUNkLHdGQURKO0FBRUQ7O0FBQ0QvRCxzQkFBSThCLElBQUosQ0FBVSxnRUFBRCxHQUNKLG1DQUFrQzRCLE9BQVEsT0FBTUMsVUFBVSxHQUFHLENBQUUsR0FEcEU7O0FBRUEsWUFBTSxLQUFLVCwwQkFBTCxDQUFnQyxJQUFoQyxDQUFOO0FBQ0EsWUFBTXpDLGtCQUFFdUQsS0FBRixDQUFRSixtQkFBUixDQUFOO0FBQ0Q7O0FBRUQ1RCxvQkFBSXNCLEtBQUosQ0FBVyx5REFBRCxHQUNMLEdBQUVnQyxLQUFLLENBQUNXLFdBQU4sR0FBb0JDLGNBQXBCLENBQW1DQyxPQUFuQyxDQUEyQyxDQUEzQyxDQUE4QyxJQURyRDs7QUFFQSxVQUFNLEtBQUtoRixPQUFMLENBQWEyRSxPQUFiLENBQXFCLFVBQXJCLEVBQWlDLE1BQWpDLEVBQXlDO0FBQzdDTSxNQUFBQSxZQUFZLEVBQUU7QUFDWkMsUUFBQUEsVUFBVSxFQUFFLENBQUNwQixJQUFELENBREE7QUFFWnFCLFFBQUFBLFdBQVcsRUFBRTtBQUZEO0FBRCtCLEtBQXpDLENBQU47QUFNRDs7QUFFZ0MsUUFBM0JULDJCQUEyQixHQUFJO0FBQ25DLFVBQU1VLEdBQUcsR0FBRyxDQUFDLElBQUQsRUFBTyxZQUFQLEVBQXFCLElBQXJCLENBQVo7O0FBQ0EsUUFBSSxLQUFLQyxzQkFBVCxFQUFpQztBQUMvQkQsTUFBQUEsR0FBRyxDQUFDRSxJQUFKLENBQVMsdUJBQVQ7QUFDRDs7QUFDRCxRQUFJQyxnQkFBRUMsU0FBRixDQUFZLEtBQUtqRyxtQ0FBakIsQ0FBSixFQUEyRDtBQUN6RDZGLE1BQUFBLEdBQUcsQ0FBQ0UsSUFBSixDQUFTLElBQVQsRUFBZSx5Q0FBZixFQUEwRCxLQUFLL0YsbUNBQS9EO0FBQ0Q7O0FBRUQ2RixJQUFBQSxHQUFHLENBQUNFLElBQUosQ0FBUyxJQUFULEVBQWUsa0JBQWYsRUFBbUMsSUFBbkM7QUFDQUYsSUFBQUEsR0FBRyxDQUFDRSxJQUFKLENBQVNuSCxzQkFBVDtBQUNBLFVBQU1zSCxzQkFBc0IsR0FBRyxLQUFLM0QsR0FBTCxDQUFTNEQsZ0JBQVQsQ0FBMEIsQ0FBQyxPQUFELEVBQVUsR0FBR04sR0FBYixDQUExQixDQUEvQjtBQUNBSyxJQUFBQSxzQkFBc0IsQ0FBQ0UsRUFBdkIsQ0FBMEIsUUFBMUIsRUFBb0MsQ0FBQ0MsTUFBRCxFQUFTQyxNQUFULEtBQW9CO0FBQ3RELFlBQU1DLE1BQU0sR0FBR1AsZ0JBQUVRLElBQUYsQ0FBT0gsTUFBTSxJQUFJQyxNQUFqQixDQUFmOztBQUNBLFVBQUlDLE1BQUosRUFBWTtBQUNWMUgsUUFBQUEscUJBQXFCLENBQUMrRCxLQUF0QixDQUE0QjJELE1BQTVCO0FBQ0Q7QUFDRixLQUxEO0FBTUFMLElBQUFBLHNCQUFzQixDQUFDRSxFQUF2QixDQUEwQixNQUExQixFQUFtQ0ssSUFBRCxJQUFVO0FBQzFDNUgsTUFBQUEscUJBQXFCLENBQUMrRCxLQUF0QixDQUE2QixvQ0FBbUM2RCxJQUFLLEVBQXJFO0FBQ0EsV0FBS2hHLE9BQUwsQ0FBYW5CLHNCQUFiLEdBQXNDLElBQXRDO0FBQ0QsS0FIRDtBQUlBLFVBQU00RyxzQkFBc0IsQ0FBQ25CLEtBQXZCLENBQTZCLENBQTdCLENBQU47QUFDRDs7QUFFa0IsUUFBYjJCLGFBQWEsR0FBSTtBQUNyQnBGLG9CQUFJc0IsS0FBSixDQUFVLHNDQUFWOztBQUdBLFFBQUk7QUFDRixZQUFNLEtBQUtuQyxPQUFMLENBQWEyRSxPQUFiLENBQXFCLEdBQXJCLEVBQTBCLFFBQTFCLENBQU47QUFDRCxLQUZELENBRUUsT0FBT2pDLEdBQVAsRUFBWTtBQUNaN0Isc0JBQUk4QixJQUFKLENBQVUsOERBQUQsR0FDSixjQUFhRCxHQUFJLEVBRHRCO0FBRUQ7QUFDRjs7QUFFK0IsUUFBMUJxQiwwQkFBMEIsQ0FBRW1DLGFBQWEsR0FBRyxLQUFsQixFQUF5QjtBQUN2RHJGLG9CQUFJc0IsS0FBSixDQUFXLGNBQWErRCxhQUFhLEdBQUcsUUFBSCxHQUFjLFNBQVUsa0NBQTdEOztBQUVBLFFBQUk7QUFDRixZQUFNO0FBQUNDLFFBQUFBO0FBQUQsVUFBVSxDQUFDLE1BQU0sb0JBQU07QUFDM0J6SCxRQUFBQSxHQUFHLEVBQUcsVUFBUyxLQUFLZ0IsSUFBSyxJQUFHLEtBQUtFLFVBQVcsa0JBRGpCO0FBRTNCRyxRQUFBQSxPQUFPLEVBQUU7QUFGa0IsT0FBTixDQUFQLEVBR1pxRyxJQUhKO0FBSUEsWUFBTUMsZ0JBQWdCLEdBQUdGLEtBQUssQ0FBQzNFLEdBQU4sQ0FBVSxDQUFDO0FBQUM4RSxRQUFBQTtBQUFELE9BQUQsS0FBVUEsRUFBcEIsRUFBd0JDLE1BQXhCLENBQStCQyxPQUEvQixDQUF6Qjs7QUFDQSxVQUFJSCxnQkFBZ0IsQ0FBQ0ksTUFBckIsRUFBNkI7QUFDM0I1Rix3QkFBSXNCLEtBQUosQ0FBVyxzREFBcUR1RSxJQUFJLENBQUNDLFNBQUwsQ0FBZU4sZ0JBQWYsQ0FBaUMsRUFBakc7O0FBQ0F4Rix3QkFBSXNCLEtBQUosQ0FBVyxlQUFjL0Msb0JBQUt3SCxTQUFMLENBQWUsa0JBQWYsRUFBbUNQLGdCQUFnQixDQUFDSSxNQUFwRCxFQUE0RCxJQUE1RCxDQUFrRSxFQUEzRjs7QUFDQSxjQUFNbkYsa0JBQUVDLEdBQUYsQ0FBTThFLGdCQUFnQixDQUN6QjdFLEdBRFMsQ0FDSjhFLEVBQUQsSUFBUU8sZUFBTUMsTUFBTixDQUFjLFVBQVMsS0FBS3BILElBQUssSUFBRyxLQUFLRSxVQUFXLG1CQUFrQjBHLEVBQUcsRUFBekUsQ0FESCxDQUFOLENBQU47QUFJQSxjQUFNaEYsa0JBQUV1RCxLQUFGLENBQVEsSUFBUixDQUFOO0FBQ0QsT0FSRCxNQVFPO0FBQ0xoRSx3QkFBSXNCLEtBQUosQ0FBVSx5Q0FBVjtBQUNEO0FBQ0YsS0FqQkQsQ0FpQkUsT0FBT29CLENBQVAsRUFBVTtBQUNWMUMsc0JBQUlzQixLQUFKLENBQVcsNENBQTJDb0IsQ0FBQyxDQUFDWCxPQUFRLEdBQWhFO0FBQ0Q7O0FBRUQsUUFBSTtBQUNGLFlBQU0sS0FBS2QsR0FBTCxDQUFTaUYsU0FBVCxDQUFtQjdJLHNCQUFuQixDQUFOO0FBQ0QsS0FGRCxDQUVFLE9BQU84SSxNQUFQLEVBQWUsQ0FBRTs7QUFDbkIsUUFBSSxDQUFDZCxhQUFMLEVBQW9CO0FBQ2xCO0FBQ0Q7O0FBRUQsUUFBSTtBQUNGLFlBQU0sS0FBS3BFLEdBQUwsQ0FBU21GLG1CQUFULENBQTZCLGFBQTdCLENBQU47QUFDRCxLQUZELENBRUUsT0FBT0QsTUFBUCxFQUFlLENBQUU7QUFDcEI7O0FBMVNzQjs7O2VBOFNWaEksa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgSldQcm94eSwgZXJyb3JzIH0gZnJvbSAnYXBwaXVtLWJhc2UtZHJpdmVyJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7XG4gIFNFUlZFUl9BUEtfUEFUSCBhcyBhcGtQYXRoLFxuICBURVNUX0FQS19QQVRIIGFzIHRlc3RBcGtQYXRoLFxuICB2ZXJzaW9uIGFzIHNlcnZlclZlcnNpb25cbn0gZnJvbSAnYXBwaXVtLXVpYXV0b21hdG9yMi1zZXJ2ZXInO1xuaW1wb3J0IHtcbiAgdXRpbCwgbG9nZ2VyLCB0ZW1wRGlyLCBmcywgdGltaW5nXG59IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBoZWxwZXJzIGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbmNvbnN0IFJFUURfUEFSQU1TID0gWydhZGInLCAndG1wRGlyJywgJ2hvc3QnLCAnc3lzdGVtUG9ydCcsICdkZXZpY2VQb3J0JywgJ2Rpc2FibGVXaW5kb3dBbmltYXRpb24nXTtcbmNvbnN0IFNFUlZFUl9MQVVOQ0hfVElNRU9VVCA9IDMwMDAwO1xuY29uc3QgU0VSVkVSX0lOU1RBTExfUkVUUklFUyA9IDIwO1xuY29uc3QgU0VSVklDRVNfTEFVTkNIX1RJTUVPVVQgPSAzMDAwMDtcbmNvbnN0IFNFUlZFUl9QQUNLQUdFX0lEID0gJ2lvLmFwcGl1bS51aWF1dG9tYXRvcjIuc2VydmVyJztcbmNvbnN0IFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQgPSBgJHtTRVJWRVJfUEFDS0FHRV9JRH0udGVzdGA7XG5jb25zdCBJTlNUUlVNRU5UQVRJT05fVEFSR0VUID0gYCR7U0VSVkVSX1RFU1RfUEFDS0FHRV9JRH0vYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyYDtcbmNvbnN0IGluc3RydW1lbnRhdGlvbkxvZ2dlciA9IGxvZ2dlci5nZXRMb2dnZXIoJ0luc3RydW1lbnRhdGlvbicpO1xuXG5jbGFzcyBVSUEyUHJveHkgZXh0ZW5kcyBKV1Byb3h5IHtcbiAgYXN5bmMgcHJveHlDb21tYW5kICh1cmwsIG1ldGhvZCwgYm9keSA9IG51bGwpIHtcbiAgICBpZiAodGhpcy5kaWRJbnN0cnVtZW50YXRpb25FeGl0KSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRDb250ZXh0RXJyb3IoXG4gICAgICAgIGAnJHttZXRob2R9ICR7dXJsfScgY2Fubm90IGJlIHByb3hpZWQgdG8gVWlBdXRvbWF0b3IyIHNlcnZlciBiZWNhdXNlIGAgK1xuICAgICAgICAndGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIGlzIG5vdCBydW5uaW5nIChwcm9iYWJseSBjcmFzaGVkKS4gJyArXG4gICAgICAgICdDaGVjayB0aGUgc2VydmVyIGxvZyBhbmQvb3IgdGhlIGxvZ2NhdCBvdXRwdXQgZm9yIG1vcmUgZGV0YWlscycpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgc3VwZXIucHJveHlDb21tYW5kKHVybCwgbWV0aG9kLCBib2R5KTtcbiAgfVxufVxuXG5jbGFzcyBVaUF1dG9tYXRvcjJTZXJ2ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9KSB7XG4gICAgZm9yIChsZXQgcmVxIG9mIFJFUURfUEFSQU1TKSB7XG4gICAgICBpZiAoIW9wdHMgfHwgIXV0aWwuaGFzVmFsdWUob3B0c1tyZXFdKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9wdGlvbiAnJHtyZXF9JyBpcyByZXF1aXJlZCFgKTtcbiAgICAgIH1cbiAgICAgIHRoaXNbcmVxXSA9IG9wdHNbcmVxXTtcbiAgICB9XG4gICAgdGhpcy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSA9IG9wdHMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2U7XG4gICAgY29uc3QgcHJveHlPcHRzID0ge1xuICAgICAgc2VydmVyOiB0aGlzLmhvc3QsXG4gICAgICBwb3J0OiB0aGlzLnN5c3RlbVBvcnQsXG4gICAgICBrZWVwQWxpdmU6IHRydWUsXG4gICAgfTtcbiAgICBpZiAob3B0cy5yZWFkVGltZW91dCAmJiBvcHRzLnJlYWRUaW1lb3V0ID4gMCkge1xuICAgICAgcHJveHlPcHRzLnRpbWVvdXQgPSBvcHRzLnJlYWRUaW1lb3V0O1xuICAgIH1cbiAgICB0aGlzLmp3cHJveHkgPSBuZXcgVUlBMlByb3h5KHByb3h5T3B0cyk7XG4gICAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuandwcm94eS5wcm94eVJlcVJlcy5iaW5kKHRoaXMuandwcm94eSk7XG4gICAgdGhpcy5qd3Byb3h5LmRpZEluc3RydW1lbnRhdGlvbkV4aXQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxscyB0aGUgYXBrcyBvbiB0byB0aGUgZGV2aWNlIG9yIGVtdWxhdG9yLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5zdGFsbFRpbWVvdXQgLSBJbnN0YWxsYXRpb24gdGltZW91dFxuICAgKi9cbiAgYXN5bmMgaW5zdGFsbFNlcnZlckFwayAoaW5zdGFsbFRpbWVvdXQgPSBTRVJWRVJfSU5TVEFMTF9SRVRSSUVTICogMTAwMCkge1xuICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICBjb25zdCBwYWNrYWdlSW5mb3NNYXBwZXIgPSBhc3luYyAoe2FwcFBhdGgsIGFwcElkfSkgPT4ge1xuICAgICAgaWYgKGF3YWl0IGhlbHBlcnMuaXNXcml0ZWFibGUoYXBwUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIHsgYXBwUGF0aCwgYXBwSWQgfTtcbiAgICAgIH1cblxuICAgICAgbG9nLmluZm8oYFNlcnZlciBwYWNrYWdlIGF0ICcke2FwcFBhdGh9JyBpcyBub3Qgd3JpdGVhYmxlLiBgICtcbiAgICAgICAgYFdpbGwgY29weSBpdCBpbnRvIHRoZSB0ZW1wb3JhcnkgbG9jYXRpb24gYXQgJyR7dG1wUm9vdH0nIGFzIGEgd29ya2Fyb3VuZC4gYCArXG4gICAgICAgIGBDb25zaWRlciBtYWtpbmcgdGhpcyBmaWxlIHdyaXRlYWJsZSBtYW51YWxseSBpbiBvcmRlciB0byBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiBzZXNzaW9uIHN0YXJ0dXAuYCk7XG4gICAgICBjb25zdCBkc3RQYXRoID0gcGF0aC5yZXNvbHZlKHRtcFJvb3QsIHBhdGguYmFzZW5hbWUoYXBwUGF0aCkpO1xuICAgICAgYXdhaXQgZnMuY29weUZpbGUoYXBwUGF0aCwgZHN0UGF0aCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcHBQYXRoOiBkc3RQYXRoLFxuICAgICAgICBhcHBJZCxcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYWNrYWdlc0luZm8gPSBhd2FpdCBCLmFsbChCLm1hcChbXG4gICAgICAgIHtcbiAgICAgICAgICBhcHBQYXRoOiBhcGtQYXRoLFxuICAgICAgICAgIGFwcElkOiBTRVJWRVJfUEFDS0FHRV9JRCxcbiAgICAgICAgfSwge1xuICAgICAgICAgIGFwcFBhdGg6IHRlc3RBcGtQYXRoLFxuICAgICAgICAgIGFwcElkOiBTRVJWRVJfVEVTVF9QQUNLQUdFX0lELFxuICAgICAgICB9LFxuICAgICAgXSwgcGFja2FnZUluZm9zTWFwcGVyKSk7XG5cbiAgICAgIGxldCBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IGZhbHNlO1xuICAgICAgbGV0IHNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCB7YXBwSWQsIGFwcFBhdGh9IG9mIHBhY2thZ2VzSW5mbykge1xuICAgICAgICBpZiAoYXBwSWQgPT09IFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQpIHtcbiAgICAgICAgICBjb25zdCBpc0FwcEluc3RhbGxlZCA9IGF3YWl0IHRoaXMuYWRiLmlzQXBwSW5zdGFsbGVkKGFwcElkKTtcblxuICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIHBvaW50IGluIGdldHRpbmcgdGhlIHN0YXRlIGZvciB0ZXN0IHNlcnZlcixcbiAgICAgICAgICAvLyBzaW5jZSBpdCBkb2VzIG5vdCBjb250YWluIHZlcnNpb24gaW5mb1xuICAgICAgICAgIGlmICghYXdhaXQgdGhpcy5hZGIuY2hlY2tBcGtDZXJ0KGFwcFBhdGgsIGFwcElkKSkge1xuICAgICAgICAgICAgYXdhaXQgaGVscGVycy5zaWduQXBwKHRoaXMuYWRiLCBhcHBQYXRoKTtcbiAgICAgICAgICAgIHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzID0gc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgfHwgaXNBcHBJbnN0YWxsZWQ7XG4gICAgICAgICAgICBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghaXNBcHBJbnN0YWxsZWQpIHtcbiAgICAgICAgICAgIHNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXBwU3RhdGUgPSBhd2FpdCB0aGlzLmFkYi5nZXRBcHBsaWNhdGlvbkluc3RhbGxTdGF0ZShhcHBQYXRoLCBhcHBJZCk7XG4gICAgICAgIGxvZy5kZWJ1ZyhgJHthcHBJZH0gaW5zdGFsbGF0aW9uIHN0YXRlOiAke2FwcFN0YXRlfWApO1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuY2hlY2tBcGtDZXJ0KGFwcFBhdGgsIGFwcElkKSkge1xuICAgICAgICAgIHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzID0gc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgfHwgW1xuICAgICAgICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuT0xERVJfVkVSU0lPTl9JTlNUQUxMRUQsXG4gICAgICAgICAgICB0aGlzLmFkYi5BUFBfSU5TVEFMTF9TVEFURS5ORVdFUl9WRVJTSU9OX0lOU1RBTExFRCxcbiAgICAgICAgICBdLmluY2x1ZGVzKGFwcFN0YXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBoZWxwZXJzLnNpZ25BcHAodGhpcy5hZGIsIGFwcFBhdGgpO1xuICAgICAgICAgIHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzID0gc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgfHwgIVtcbiAgICAgICAgICAgIHRoaXMuYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk5PVF9JTlNUQUxMRUQsXG4gICAgICAgICAgXS5pbmNsdWRlcyhhcHBTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzID0gc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzIHx8IHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzIHx8IFtcbiAgICAgICAgICB0aGlzLmFkYi5BUFBfSU5TVEFMTF9TVEFURS5OT1RfSU5TVEFMTEVELFxuICAgICAgICBdLmluY2x1ZGVzKGFwcFN0YXRlKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKGBTZXJ2ZXIgcGFja2FnZXMgYXJlICR7c2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzID8gJycgOiAnbm90ICd9Z29pbmcgdG8gYmUgKHJlKWluc3RhbGxlZGApO1xuICAgICAgaWYgKHNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyAmJiBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcykge1xuICAgICAgICBsb2cuaW5mbygnRnVsbCBwYWNrYWdlcyByZWluc3RhbGwgaXMgZ29pbmcgdG8gYmUgcGVyZm9ybWVkJyk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHthcHBJZCwgYXBwUGF0aH0gb2YgcGFja2FnZXNJbmZvKSB7XG4gICAgICAgIGlmIChzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsoYXBwSWQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nLndhcm4oYEVycm9yIHVuaW5zdGFsbGluZyAnJHthcHBJZH0nOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGIuaW5zdGFsbChhcHBQYXRoLCB7XG4gICAgICAgICAgICBub0luY3JlbWVudGFsOiB0cnVlLFxuICAgICAgICAgICAgcmVwbGFjZTogdHJ1ZSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IGluc3RhbGxUaW1lb3V0LFxuICAgICAgICAgICAgdGltZW91dENhcE5hbWU6ICd1aWF1dG9tYXRvcjJTZXJ2ZXJJbnN0YWxsVGltZW91dCdcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBmcy5yaW1yYWYodG1wUm9vdCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy52ZXJpZnlTZXJ2aWNlc0F2YWlsYWJpbGl0eSgpO1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5U2VydmljZXNBdmFpbGFiaWxpdHkgKCkge1xuICAgIGxvZy5kZWJ1ZyhgV2FpdGluZyB1cCB0byAke1NFUlZJQ0VTX0xBVU5DSF9USU1FT1VUfW1zIGZvciBzZXJ2aWNlcyB0byBiZSBhdmFpbGFibGVgKTtcbiAgICBsZXQgaXNQbVNlcnZpY2VBdmFpbGFibGUgPSBmYWxzZTtcbiAgICBsZXQgcG1PdXRwdXQgPSAnJztcbiAgICBsZXQgcG1FcnJvciA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoIWlzUG1TZXJ2aWNlQXZhaWxhYmxlKSB7XG4gICAgICAgICAgcG1FcnJvciA9IG51bGw7XG4gICAgICAgICAgcG1PdXRwdXQgPSAnJztcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcG1PdXRwdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ3BtJywgJ2xpc3QnLCAnaW5zdHJ1bWVudGF0aW9uJ10pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHBtRXJyb3IgPSBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocG1PdXRwdXQuaW5jbHVkZXMoJ0NvdWxkIG5vdCBhY2Nlc3MgdGhlIFBhY2thZ2UgTWFuYWdlcicpKSB7XG4gICAgICAgICAgICBwbUVycm9yID0gbmV3IEVycm9yKGBQcm9ibGVtIHJ1bm5pbmcgUGFja2FnZSBNYW5hZ2VyOiAke3BtT3V0cHV0fWApO1xuICAgICAgICAgICAgcG1PdXRwdXQgPSAnJzsgLy8gcmVtb3ZlIG91dHB1dCwgc28gaXQgaXMgbm90IHByaW50ZWQgYmVsb3dcbiAgICAgICAgICB9IGVsc2UgaWYgKHBtT3V0cHV0LmluY2x1ZGVzKElOU1RSVU1FTlRBVElPTl9UQVJHRVQpKSB7XG4gICAgICAgICAgICBwbU91dHB1dCA9ICcnOyAvLyByZW1vdmUgb3V0cHV0LCBzbyBpdCBpcyBub3QgcHJpbnRlZCBiZWxvd1xuICAgICAgICAgICAgbG9nLmRlYnVnKGBJbnN0cnVtZW50YXRpb24gdGFyZ2V0ICcke0lOU1RSVU1FTlRBVElPTl9UQVJHRVR9JyBpcyBhdmFpbGFibGVgKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzXG4gICAgICAgICAgICBpc1BtU2VydmljZUF2YWlsYWJsZSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICghcG1FcnJvcikge1xuICAgICAgICAgICAgcG1FcnJvciA9IG5ldyBFcnJvcignVGhlIGluc3RydW1lbnRhdGlvbiB0YXJnZXQgaXMgbm90IGxpc3RlZCBieSBQYWNrYWdlIE1hbmFnZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzUG1TZXJ2aWNlQXZhaWxhYmxlO1xuICAgICAgfSwge1xuICAgICAgICB3YWl0TXM6IFNFUlZJQ0VTX0xBVU5DSF9USU1FT1VULFxuICAgICAgICBpbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cuZXJyb3IoYFVuYWJsZSB0byBmaW5kIGluc3RydW1lbnRhdGlvbiB0YXJnZXQgJyR7SU5TVFJVTUVOVEFUSU9OX1RBUkdFVH0nOiAkeyhwbUVycm9yIHx8IHt9KS5tZXNzYWdlfWApO1xuICAgICAgaWYgKHBtT3V0cHV0KSB7XG4gICAgICAgIGxvZy5kZWJ1ZygnQXZhaWxhYmxlIHRhcmdldHM6Jyk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBwbU91dHB1dC5zcGxpdCgnXFxuJykpIHtcbiAgICAgICAgICBsb2cuZGVidWcoYCAgICAke2xpbmUucmVwbGFjZSgnaW5zdHJ1bWVudGF0aW9uOicsICcnKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0U2Vzc2lvbiAoY2Fwcykge1xuICAgIGF3YWl0IHRoaXMuY2xlYW51cEF1dG9tYXRpb25MZWZ0b3ZlcnMoKTtcbiAgICBpZiAoY2Fwcy5za2lwU2VydmVySW5zdGFsbGF0aW9uKSB7XG4gICAgICBsb2cuaW5mbyhgJ3NraXBTZXJ2ZXJJbnN0YWxsYXRpb24nIGlzIHNldC4gQXR0ZW1wdGluZyB0byB1c2UgVUlBdXRvbWF0b3IyIHNlcnZlciBmcm9tIHRoZSBkZXZpY2VgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmluZm8oYFN0YXJ0aW5nIFVJQXV0b21hdG9yMiBzZXJ2ZXIgJHtzZXJ2ZXJWZXJzaW9ufWApO1xuICAgICAgbG9nLmluZm8oYFVzaW5nIFVJQXV0b21hdG9yMiBzZXJ2ZXIgZnJvbSAnJHthcGtQYXRofScgYW5kIHRlc3QgZnJvbSAnJHt0ZXN0QXBrUGF0aH0nYCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGltZW91dCA9IGNhcHMudWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCB8fCBTRVJWRVJfTEFVTkNIX1RJTUVPVVQ7XG4gICAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgICBsZXQgcmV0cmllcyA9IDA7XG4gICAgY29uc3QgbWF4UmV0cmllcyA9IDI7XG4gICAgY29uc3QgZGVsYXlCZXR3ZWVuUmV0cmllcyA9IDMwMDA7XG4gICAgd2hpbGUgKHJldHJpZXMgPCBtYXhSZXRyaWVzKSB7XG4gICAgICBsb2cuaW5mbyhgV2FpdGluZyB1cCB0byAke3RpbWVvdXR9bXMgZm9yIFVpQXV0b21hdG9yMiB0byBiZSBvbmxpbmUuLi5gKTtcbiAgICAgIHRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0ID0gZmFsc2U7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0SW5zdHJ1bWVudGF0aW9uUHJvY2VzcygpO1xuICAgICAgaWYgKCF0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy9zdGF0dXMnLCAnR0VUJyk7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIC8vIHNob3J0IGNpcmN1aXQgdG8gcmV0cnkgb3IgZmFpbCBmYXN0XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICB3YWl0TXM6IHRpbWVvdXQsXG4gICAgICAgICAgICBpbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIGNhbm5vdCBiZSBpbml0aWFsaXplZCB3aXRoaW4gJHt0aW1lb3V0fW1zIHRpbWVvdXQuIGBcbiAgICAgICAgICAgICsgJ01ha2Ugc3VyZSB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBkb2VzIG5vdCBjcmFzaCBhbmQgaW52ZXN0aWdhdGUgdGhlIGxvZ2NhdCBvdXRwdXQuICdcbiAgICAgICAgICAgICsgYFlvdSBjb3VsZCBhbHNvIHRyeSB0byBpbmNyZWFzZSB0aGUgdmFsdWUgb2YgJ3VpYXV0b21hdG9yMlNlcnZlckxhdW5jaFRpbWVvdXQnIGNhcGFiaWxpdHlgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcmV0cmllcysrO1xuICAgICAgaWYgKHJldHJpZXMgPj0gbWF4UmV0cmllcykge1xuICAgICAgICBsb2cuZXJyb3JBbmRUaHJvdygnVGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIGNhbm5vdCBiZSBpbml0aWFsaXplZC4gJ1xuICAgICAgICAgICsgJ01ha2Ugc3VyZSB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBkb2VzIG5vdCBjcmFzaCBhbmQgaW52ZXN0aWdhdGUgdGhlIGxvZ2NhdCBvdXRwdXQuJyk7XG4gICAgICB9XG4gICAgICBsb2cud2FybihgVGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIGhhcyBiZWVuIHVuZXhwZWN0ZWRseSB0ZXJtaW5hdGVkLiBgXG4gICAgICAgICsgYFJldHJ5aW5nIFVpQXV0b21hdG9yMiBzdGFydHVwICgjJHtyZXRyaWVzfSBvZiAke21heFJldHJpZXMgLSAxfSlgKTtcbiAgICAgIGF3YWl0IHRoaXMuY2xlYW51cEF1dG9tYXRpb25MZWZ0b3ZlcnModHJ1ZSk7XG4gICAgICBhd2FpdCBCLmRlbGF5KGRlbGF5QmV0d2VlblJldHJpZXMpO1xuICAgIH1cblxuICAgIGxvZy5kZWJ1ZyhgVGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBpbnN0cnVtZW50YXRpb24gcHJvY2VzcyB0b29rIGBcbiAgICAgICsgYCR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zYCk7XG4gICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy9zZXNzaW9uJywgJ1BPU1QnLCB7XG4gICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgZmlyc3RNYXRjaDogW2NhcHNdLFxuICAgICAgICBhbHdheXNNYXRjaDoge30sXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzdGFydEluc3RydW1lbnRhdGlvblByb2Nlc3MgKCkge1xuICAgIGNvbnN0IGNtZCA9IFsnYW0nLCAnaW5zdHJ1bWVudCcsICctdyddO1xuICAgIGlmICh0aGlzLmRpc2FibGVXaW5kb3dBbmltYXRpb24pIHtcbiAgICAgIGNtZC5wdXNoKCctLW5vLXdpbmRvdy1hbmltYXRpb24nKTtcbiAgICB9XG4gICAgaWYgKF8uaXNCb29sZWFuKHRoaXMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UpKSB7XG4gICAgICBjbWQucHVzaCgnLWUnLCAnRElTQUJMRV9TVVBQUkVTU19BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTJywgdGhpcy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSk7XG4gICAgfVxuICAgIC8vIERpc2FibGUgR29vZ2xlIGFuYWx5dGljcyB0byBwcmV2ZW50IHBvc3NpYmxlIGZhdGFsIGV4Y2VwdGlvblxuICAgIGNtZC5wdXNoKCctZScsICdkaXNhYmxlQW5hbHl0aWNzJywgdHJ1ZSk7XG4gICAgY21kLnB1c2goSU5TVFJVTUVOVEFUSU9OX1RBUkdFVCk7XG4gICAgY29uc3QgaW5zdHJ1bWVudGF0aW9uUHJvY2VzcyA9IHRoaXMuYWRiLmNyZWF0ZVN1YlByb2Nlc3MoWydzaGVsbCcsIC4uLmNtZF0pO1xuICAgIGluc3RydW1lbnRhdGlvblByb2Nlc3Mub24oJ291dHB1dCcsIChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gXy50cmltKHN0ZG91dCB8fCBzdGRlcnIpO1xuICAgICAgaWYgKG91dHB1dCkge1xuICAgICAgICBpbnN0cnVtZW50YXRpb25Mb2dnZXIuZGVidWcob3V0cHV0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpbnN0cnVtZW50YXRpb25Qcm9jZXNzLm9uKCdleGl0JywgKGNvZGUpID0+IHtcbiAgICAgIGluc3RydW1lbnRhdGlvbkxvZ2dlci5kZWJ1ZyhgVGhlIHByb2Nlc3MgaGFzIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApO1xuICAgICAgdGhpcy5qd3Byb3h5LmRpZEluc3RydW1lbnRhdGlvbkV4aXQgPSB0cnVlO1xuICAgIH0pO1xuICAgIGF3YWl0IGluc3RydW1lbnRhdGlvblByb2Nlc3Muc3RhcnQoMCk7XG4gIH1cblxuICBhc3luYyBkZWxldGVTZXNzaW9uICgpIHtcbiAgICBsb2cuZGVidWcoJ0RlbGV0aW5nIFVpQXV0b21hdG9yMiBzZXJ2ZXIgc2Vzc2lvbicpO1xuICAgIC8vIHJlbHkgb24gandwcm94eSdzIGludGVsbGlnZW5jZSB0byBrbm93IHdoYXQgd2UncmUgdGFsa2luZyBhYm91dCBhbmRcbiAgICAvLyBkZWxldGUgdGhlIGN1cnJlbnQgc2Vzc2lvblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnLycsICdERUxFVEUnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy53YXJuKGBEaWQgbm90IGdldCBjb25maXJtYXRpb24gVWlBdXRvbWF0b3IyIGRlbGV0ZVNlc3Npb24gd29ya2VkOyBgICtcbiAgICAgICAgICBgRXJyb3Igd2FzOiAke2Vycn1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjbGVhbnVwQXV0b21hdGlvbkxlZnRvdmVycyAoc3RyaWN0Q2xlYW51cCA9IGZhbHNlKSB7XG4gICAgbG9nLmRlYnVnKGBQZXJmb3JtaW5nICR7c3RyaWN0Q2xlYW51cCA/ICdzdHJpY3QnIDogJ3NoYWxsb3cnfSBjbGVhbnVwIG9mIGF1dG9tYXRpb24gbGVmdG92ZXJzYCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qge3ZhbHVlfSA9IChhd2FpdCBheGlvcyh7XG4gICAgICAgIHVybDogYGh0dHA6Ly8ke3RoaXMuaG9zdH06JHt0aGlzLnN5c3RlbVBvcnR9L3dkL2h1Yi9zZXNzaW9uc2AsXG4gICAgICAgIHRpbWVvdXQ6IDUwMCxcbiAgICAgIH0pKS5kYXRhO1xuICAgICAgY29uc3QgYWN0aXZlU2Vzc2lvbklkcyA9IHZhbHVlLm1hcCgoe2lkfSkgPT4gaWQpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgIGlmIChhY3RpdmVTZXNzaW9uSWRzLmxlbmd0aCkge1xuICAgICAgICBsb2cuZGVidWcoYFRoZSBmb2xsb3dpbmcgb2Jzb2xldGUgc2Vzc2lvbnMgYXJlIHN0aWxsIHJ1bm5pbmc6ICR7SlNPTi5zdHJpbmdpZnkoYWN0aXZlU2Vzc2lvbklkcyl9YCk7XG4gICAgICAgIGxvZy5kZWJ1ZyhgQ2xlYW5pbmcgdXAgJHt1dGlsLnBsdXJhbGl6ZSgnb2Jzb2xldGUgc2Vzc2lvbicsIGFjdGl2ZVNlc3Npb25JZHMubGVuZ3RoLCB0cnVlKX1gKTtcbiAgICAgICAgYXdhaXQgQi5hbGwoYWN0aXZlU2Vzc2lvbklkc1xuICAgICAgICAgIC5tYXAoKGlkKSA9PiBheGlvcy5kZWxldGUoYGh0dHA6Ly8ke3RoaXMuaG9zdH06JHt0aGlzLnN5c3RlbVBvcnR9L3dkL2h1Yi9zZXNzaW9uLyR7aWR9YCkpXG4gICAgICAgICk7XG4gICAgICAgIC8vIExldCBhbGwgc2Vzc2lvbnMgdG8gYmUgcHJvcGVybHkgdGVybWluYXRlZCBiZWZvcmUgY29udGludWluZ1xuICAgICAgICBhd2FpdCBCLmRlbGF5KDEwMDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLmRlYnVnKCdObyBvYnNvbGV0ZSBzZXNzaW9ucyBoYXZlIGJlZW4gZGV0ZWN0ZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZGVidWcoYE5vIG9ic29sZXRlIHNlc3Npb25zIGhhdmUgYmVlbiBkZXRlY3RlZCAoJHtlLm1lc3NhZ2V9KWApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AoU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCk7XG4gICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuICAgIGlmICghc3RyaWN0Q2xlYW51cCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTA3NDlcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIua2lsbFByb2Nlc3Nlc0J5TmFtZSgndWlhdXRvbWF0b3InKTtcbiAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gIH1cbn1cblxuZXhwb3J0IHsgVWlBdXRvbWF0b3IyU2VydmVyLCBJTlNUUlVNRU5UQVRJT05fVEFSR0VULCBTRVJWRVJfUEFDS0FHRV9JRCwgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCB9O1xuZXhwb3J0IGRlZmF1bHQgVWlBdXRvbWF0b3IyU2VydmVyO1xuIl0sImZpbGUiOiJsaWIvdWlhdXRvbWF0b3IyLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
|
|
391
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91aWF1dG9tYXRvcjIuanMiXSwibmFtZXMiOlsiUkVRRF9QQVJBTVMiLCJTRVJWRVJfTEFVTkNIX1RJTUVPVVQiLCJTRVJWRVJfSU5TVEFMTF9SRVRSSUVTIiwiU0VSVklDRVNfTEFVTkNIX1RJTUVPVVQiLCJTRVJWRVJfUEFDS0FHRV9JRCIsIlNFUlZFUl9URVNUX1BBQ0tBR0VfSUQiLCJJTlNUUlVNRU5UQVRJT05fVEFSR0VUIiwiaW5zdHJ1bWVudGF0aW9uTG9nZ2VyIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiVUlBMlByb3h5IiwiSldQcm94eSIsInByb3h5Q29tbWFuZCIsInVybCIsIm1ldGhvZCIsImJvZHkiLCJkaWRJbnN0cnVtZW50YXRpb25FeGl0IiwiZXJyb3JzIiwiSW52YWxpZENvbnRleHRFcnJvciIsIlVpQXV0b21hdG9yMlNlcnZlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsInJlcSIsInV0aWwiLCJoYXNWYWx1ZSIsIkVycm9yIiwiZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UiLCJwcm94eU9wdHMiLCJzZXJ2ZXIiLCJob3N0IiwicG9ydCIsInN5c3RlbVBvcnQiLCJrZWVwQWxpdmUiLCJyZWFkVGltZW91dCIsInRpbWVvdXQiLCJqd3Byb3h5IiwicHJveHlSZXFSZXMiLCJiaW5kIiwiY29tbWFuZCIsImluc3RhbGxTZXJ2ZXJBcGsiLCJpbnN0YWxsVGltZW91dCIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInBhY2thZ2VJbmZvc01hcHBlciIsImFwcFBhdGgiLCJhcHBJZCIsImhlbHBlcnMiLCJpc1dyaXRlYWJsZSIsImxvZyIsImluZm8iLCJkc3RQYXRoIiwicGF0aCIsInJlc29sdmUiLCJiYXNlbmFtZSIsImZzIiwiY29weUZpbGUiLCJwYWNrYWdlc0luZm8iLCJCIiwiYWxsIiwibWFwIiwiYXBrUGF0aCIsInRlc3RBcGtQYXRoIiwic2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMiLCJzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMiLCJpc0FwcEluc3RhbGxlZCIsImFkYiIsImNoZWNrQXBrQ2VydCIsInNpZ25BcHAiLCJhcHBTdGF0ZSIsImdldEFwcGxpY2F0aW9uSW5zdGFsbFN0YXRlIiwiZGVidWciLCJBUFBfSU5TVEFMTF9TVEFURSIsIk9MREVSX1ZFUlNJT05fSU5TVEFMTEVEIiwiTkVXRVJfVkVSU0lPTl9JTlNUQUxMRUQiLCJpbmNsdWRlcyIsIk5PVF9JTlNUQUxMRUQiLCJ1bmluc3RhbGxBcGsiLCJlcnIiLCJ3YXJuIiwibWVzc2FnZSIsImluc3RhbGwiLCJub0luY3JlbWVudGFsIiwicmVwbGFjZSIsInRpbWVvdXRDYXBOYW1lIiwicmltcmFmIiwidmVyaWZ5U2VydmljZXNBdmFpbGFiaWxpdHkiLCJpc1BtU2VydmljZUF2YWlsYWJsZSIsInBtT3V0cHV0IiwicG1FcnJvciIsInNoZWxsIiwiZSIsIndhaXRNcyIsImludGVydmFsTXMiLCJlcnJvciIsImxpbmUiLCJzcGxpdCIsInN0YXJ0U2Vzc2lvbiIsImNhcHMiLCJjbGVhbnVwQXV0b21hdGlvbkxlZnRvdmVycyIsInNraXBTZXJ2ZXJJbnN0YWxsYXRpb24iLCJzZXJ2ZXJWZXJzaW9uIiwidWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJzdGFydCIsInJldHJpZXMiLCJtYXhSZXRyaWVzIiwiZGVsYXlCZXR3ZWVuUmV0cmllcyIsInN0YXJ0SW5zdHJ1bWVudGF0aW9uUHJvY2VzcyIsImVycm9yQW5kVGhyb3ciLCJkZWxheSIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ0b0ZpeGVkIiwiY2FwYWJpbGl0aWVzIiwiZmlyc3RNYXRjaCIsImFsd2F5c01hdGNoIiwiY21kIiwiZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiIsInB1c2giLCJfIiwiaXNCb29sZWFuIiwiaW5zdHJ1bWVudGF0aW9uUHJvY2VzcyIsImNyZWF0ZVN1YlByb2Nlc3MiLCJvbiIsInN0ZG91dCIsInN0ZGVyciIsIm91dHB1dCIsInRyaW0iLCJjb2RlIiwiZGVsZXRlU2Vzc2lvbiIsInN0cmljdENsZWFudXAiLCJ2YWx1ZSIsImRhdGEiLCJhY3RpdmVTZXNzaW9uSWRzIiwiaWQiLCJmaWx0ZXIiLCJCb29sZWFuIiwibGVuZ3RoIiwiSlNPTiIsInN0cmluZ2lmeSIsInBsdXJhbGl6ZSIsImF4aW9zIiwiZGVsZXRlIiwiZm9yY2VTdG9wIiwiaWdub3JlIiwia2lsbFByb2Nlc3Nlc0J5TmFtZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxXQUFXLEdBQUcsQ0FBQyxLQUFELEVBQVEsUUFBUixFQUFrQixNQUFsQixFQUEwQixZQUExQixFQUF3QyxZQUF4QyxFQUFzRCx3QkFBdEQsQ0FBcEI7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxLQUE5QjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLEVBQS9CO0FBQ0EsTUFBTUMsdUJBQXVCLEdBQUcsS0FBaEM7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRywrQkFBMUI7O0FBQ0EsTUFBTUMsc0JBQXNCLEdBQUksR0FBRUQsaUJBQWtCLE9BQXBEOztBQUNBLE1BQU1FLHNCQUFzQixHQUFJLEdBQUVELHNCQUF1QiwwQ0FBekQ7OztBQUNBLE1BQU1FLHFCQUFxQixHQUFHQyxzQkFBT0MsU0FBUCxDQUFpQixpQkFBakIsQ0FBOUI7O0FBRUEsTUFBTUMsU0FBTixTQUF3QkMseUJBQXhCLENBQWdDO0FBQ1osUUFBWkMsWUFBWSxDQUFFQyxHQUFGLEVBQU9DLE1BQVAsRUFBZUMsSUFBSSxHQUFHLElBQXRCLEVBQTRCO0FBQzVDLFFBQUksS0FBS0Msc0JBQVQsRUFBaUM7QUFDL0IsWUFBTSxJQUFJQyx5QkFBT0MsbUJBQVgsQ0FDSCxJQUFHSixNQUFPLElBQUdELEdBQUkscURBQWxCLEdBQ0EsaUVBREEsR0FFQSxnRUFISSxDQUFOO0FBSUQ7O0FBQ0Qs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QVNrRixtQkFBVCxDQUE2QixhQUE3QixDQUFOO0FBQ0QsS0FGRCxDQUVFLE9BQU9ELE1BQVAsRUFBZSxDQUFFO0FBQ3BCOztBQTNTc0I7OztlQStTVmhJLGtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEpXUHJveHksIGVycm9ycyB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQge1xuICBTRVJWRVJfQVBLX1BBVEggYXMgYXBrUGF0aCxcbiAgVEVTVF9BUEtfUEFUSCBhcyB0ZXN0QXBrUGF0aCxcbiAgdmVyc2lvbiBhcyBzZXJ2ZXJWZXJzaW9uXG59IGZyb20gJ2FwcGl1bS11aWF1dG9tYXRvcjItc2VydmVyJztcbmltcG9ydCB7XG4gIHV0aWwsIGxvZ2dlciwgdGVtcERpciwgZnMsIHRpbWluZ1xufSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgaGVscGVycyBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5jb25zdCBSRVFEX1BBUkFNUyA9IFsnYWRiJywgJ3RtcERpcicsICdob3N0JywgJ3N5c3RlbVBvcnQnLCAnZGV2aWNlUG9ydCcsICdkaXNhYmxlV2luZG93QW5pbWF0aW9uJ107XG5jb25zdCBTRVJWRVJfTEFVTkNIX1RJTUVPVVQgPSAzMDAwMDtcbmNvbnN0IFNFUlZFUl9JTlNUQUxMX1JFVFJJRVMgPSAyMDtcbmNvbnN0IFNFUlZJQ0VTX0xBVU5DSF9USU1FT1VUID0gMzAwMDA7XG5jb25zdCBTRVJWRVJfUEFDS0FHRV9JRCA9ICdpby5hcHBpdW0udWlhdXRvbWF0b3IyLnNlcnZlcic7XG5jb25zdCBTRVJWRVJfVEVTVF9QQUNLQUdFX0lEID0gYCR7U0VSVkVSX1BBQ0tBR0VfSUR9LnRlc3RgO1xuY29uc3QgSU5TVFJVTUVOVEFUSU9OX1RBUkdFVCA9IGAke1NFUlZFUl9URVNUX1BBQ0tBR0VfSUR9L2FuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lcmA7XG5jb25zdCBpbnN0cnVtZW50YXRpb25Mb2dnZXIgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdJbnN0cnVtZW50YXRpb24nKTtcblxuY2xhc3MgVUlBMlByb3h5IGV4dGVuZHMgSldQcm94eSB7XG4gIGFzeW5jIHByb3h5Q29tbWFuZCAodXJsLCBtZXRob2QsIGJvZHkgPSBudWxsKSB7XG4gICAgaWYgKHRoaXMuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQ29udGV4dEVycm9yKFxuICAgICAgICBgJyR7bWV0aG9kfSAke3VybH0nIGNhbm5vdCBiZSBwcm94aWVkIHRvIFVpQXV0b21hdG9yMiBzZXJ2ZXIgYmVjYXVzZSBgICtcbiAgICAgICAgJ3RoZSBpbnN0cnVtZW50YXRpb24gcHJvY2VzcyBpcyBub3QgcnVubmluZyAocHJvYmFibHkgY3Jhc2hlZCkuICcgK1xuICAgICAgICAnQ2hlY2sgdGhlIHNlcnZlciBsb2cgYW5kL29yIHRoZSBsb2djYXQgb3V0cHV0IGZvciBtb3JlIGRldGFpbHMnKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHN1cGVyLnByb3h5Q29tbWFuZCh1cmwsIG1ldGhvZCwgYm9keSk7XG4gIH1cbn1cblxuY2xhc3MgVWlBdXRvbWF0b3IyU2VydmVyIHtcbiAgY29uc3RydWN0b3IgKG9wdHMgPSB7fSkge1xuICAgIGZvciAobGV0IHJlcSBvZiBSRVFEX1BBUkFNUykge1xuICAgICAgaWYgKCFvcHRzIHx8ICF1dGlsLmhhc1ZhbHVlKG9wdHNbcmVxXSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPcHRpb24gJyR7cmVxfScgaXMgcmVxdWlyZWQhYCk7XG4gICAgICB9XG4gICAgICB0aGlzW3JlcV0gPSBvcHRzW3JlcV07XG4gICAgfVxuICAgIHRoaXMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UgPSBvcHRzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlO1xuICAgIGNvbnN0IHByb3h5T3B0cyA9IHtcbiAgICAgIHNlcnZlcjogdGhpcy5ob3N0LFxuICAgICAgcG9ydDogdGhpcy5zeXN0ZW1Qb3J0LFxuICAgICAga2VlcEFsaXZlOiB0cnVlLFxuICAgIH07XG4gICAgaWYgKG9wdHMucmVhZFRpbWVvdXQgJiYgb3B0cy5yZWFkVGltZW91dCA+IDApIHtcbiAgICAgIHByb3h5T3B0cy50aW1lb3V0ID0gb3B0cy5yZWFkVGltZW91dDtcbiAgICB9XG4gICAgdGhpcy5qd3Byb3h5ID0gbmV3IFVJQTJQcm94eShwcm94eU9wdHMpO1xuICAgIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLmp3cHJveHkucHJveHlSZXFSZXMuYmluZCh0aGlzLmp3cHJveHkpO1xuICAgIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy5qd3Byb3h5LmNvbW1hbmQuYmluZCh0aGlzLmp3cHJveHkpO1xuICAgIHRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0ID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbHMgdGhlIGFwa3Mgb24gdG8gdGhlIGRldmljZSBvciBlbXVsYXRvci5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluc3RhbGxUaW1lb3V0IC0gSW5zdGFsbGF0aW9uIHRpbWVvdXRcbiAgICovXG4gIGFzeW5jIGluc3RhbGxTZXJ2ZXJBcGsgKGluc3RhbGxUaW1lb3V0ID0gU0VSVkVSX0lOU1RBTExfUkVUUklFUyAqIDEwMDApIHtcbiAgICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgY29uc3QgcGFja2FnZUluZm9zTWFwcGVyID0gYXN5bmMgKHthcHBQYXRoLCBhcHBJZH0pID0+IHtcbiAgICAgIGlmIChhd2FpdCBoZWxwZXJzLmlzV3JpdGVhYmxlKGFwcFBhdGgpKSB7XG4gICAgICAgIHJldHVybiB7IGFwcFBhdGgsIGFwcElkIH07XG4gICAgICB9XG5cbiAgICAgIGxvZy5pbmZvKGBTZXJ2ZXIgcGFja2FnZSBhdCAnJHthcHBQYXRofScgaXMgbm90IHdyaXRlYWJsZS4gYCArXG4gICAgICAgIGBXaWxsIGNvcHkgaXQgaW50byB0aGUgdGVtcG9yYXJ5IGxvY2F0aW9uIGF0ICcke3RtcFJvb3R9JyBhcyBhIHdvcmthcm91bmQuIGAgK1xuICAgICAgICBgQ29uc2lkZXIgbWFraW5nIHRoaXMgZmlsZSB3cml0ZWFibGUgbWFudWFsbHkgaW4gb3JkZXIgdG8gaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2Ygc2Vzc2lvbiBzdGFydHVwLmApO1xuICAgICAgY29uc3QgZHN0UGF0aCA9IHBhdGgucmVzb2x2ZSh0bXBSb290LCBwYXRoLmJhc2VuYW1lKGFwcFBhdGgpKTtcbiAgICAgIGF3YWl0IGZzLmNvcHlGaWxlKGFwcFBhdGgsIGRzdFBhdGgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXBwUGF0aDogZHN0UGF0aCxcbiAgICAgICAgYXBwSWQsXG4gICAgICB9O1xuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFja2FnZXNJbmZvID0gYXdhaXQgQi5hbGwoQi5tYXAoW1xuICAgICAgICB7XG4gICAgICAgICAgYXBwUGF0aDogYXBrUGF0aCxcbiAgICAgICAgICBhcHBJZDogU0VSVkVSX1BBQ0tBR0VfSUQsXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBhcHBQYXRoOiB0ZXN0QXBrUGF0aCxcbiAgICAgICAgICBhcHBJZDogU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCxcbiAgICAgICAgfSxcbiAgICAgIF0sIHBhY2thZ2VJbmZvc01hcHBlcikpO1xuXG4gICAgICBsZXQgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgPSBmYWxzZTtcbiAgICAgIGxldCBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3Qge2FwcElkLCBhcHBQYXRofSBvZiBwYWNrYWdlc0luZm8pIHtcbiAgICAgICAgaWYgKGFwcElkID09PSBTRVJWRVJfVEVTVF9QQUNLQUdFX0lEKSB7XG4gICAgICAgICAgY29uc3QgaXNBcHBJbnN0YWxsZWQgPSBhd2FpdCB0aGlzLmFkYi5pc0FwcEluc3RhbGxlZChhcHBJZCk7XG5cbiAgICAgICAgICAvLyBUaGVyZSBpcyBubyBwb2ludCBpbiBnZXR0aW5nIHRoZSBzdGF0ZSBmb3IgdGVzdCBzZXJ2ZXIsXG4gICAgICAgICAgLy8gc2luY2UgaXQgZG9lcyBub3QgY29udGFpbiB2ZXJzaW9uIGluZm9cbiAgICAgICAgICBpZiAoIWF3YWl0IHRoaXMuYWRiLmNoZWNrQXBrQ2VydChhcHBQYXRoLCBhcHBJZCkpIHtcbiAgICAgICAgICAgIGF3YWl0IGhlbHBlcnMuc2lnbkFwcCh0aGlzLmFkYiwgYXBwUGF0aCk7XG4gICAgICAgICAgICBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzIHx8IGlzQXBwSW5zdGFsbGVkO1xuICAgICAgICAgICAgc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWlzQXBwSW5zdGFsbGVkKSB7XG4gICAgICAgICAgICBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFwcFN0YXRlID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUoYXBwUGF0aCwgYXBwSWQpO1xuICAgICAgICBsb2cuZGVidWcoYCR7YXBwSWR9IGluc3RhbGxhdGlvbiBzdGF0ZTogJHthcHBTdGF0ZX1gKTtcbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmNoZWNrQXBrQ2VydChhcHBQYXRoLCBhcHBJZCkpIHtcbiAgICAgICAgICBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzIHx8IFtcbiAgICAgICAgICAgIHRoaXMuYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk9MREVSX1ZFUlNJT05fSU5TVEFMTEVELFxuICAgICAgICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuTkVXRVJfVkVSU0lPTl9JTlNUQUxMRUQsXG4gICAgICAgICAgXS5pbmNsdWRlcyhhcHBTdGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgaGVscGVycy5zaWduQXBwKHRoaXMuYWRiLCBhcHBQYXRoKTtcbiAgICAgICAgICBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzIHx8ICFbXG4gICAgICAgICAgICB0aGlzLmFkYi5BUFBfSU5TVEFMTF9TVEFURS5OT1RfSU5TVEFMTEVELFxuICAgICAgICAgIF0uaW5jbHVkZXMoYXBwU3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IHNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyB8fCBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyB8fCBbXG4gICAgICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuTk9UX0lOU1RBTExFRCxcbiAgICAgICAgXS5pbmNsdWRlcyhhcHBTdGF0ZSk7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgU2VydmVyIHBhY2thZ2VzIGFyZSAke3Nob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA/ICcnIDogJ25vdCAnfWdvaW5nIHRvIGJlIChyZSlpbnN0YWxsZWRgKTtcbiAgICAgIGlmIChzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgJiYgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMpIHtcbiAgICAgICAgbG9nLmluZm8oJ0Z1bGwgcGFja2FnZXMgcmVpbnN0YWxsIGlzIGdvaW5nIHRvIGJlIHBlcmZvcm1lZCcpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCB7YXBwSWQsIGFwcFBhdGh9IG9mIHBhY2thZ2VzSW5mbykge1xuICAgICAgICBpZiAoc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKGFwcElkKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZy53YXJuKGBFcnJvciB1bmluc3RhbGxpbmcgJyR7YXBwSWR9JzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcykge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmluc3RhbGwoYXBwUGF0aCwge1xuICAgICAgICAgICAgbm9JbmNyZW1lbnRhbDogdHJ1ZSxcbiAgICAgICAgICAgIHJlcGxhY2U6IHRydWUsXG4gICAgICAgICAgICB0aW1lb3V0OiBpbnN0YWxsVGltZW91dCxcbiAgICAgICAgICAgIHRpbWVvdXRDYXBOYW1lOiAndWlhdXRvbWF0b3IyU2VydmVySW5zdGFsbFRpbWVvdXQnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMudmVyaWZ5U2VydmljZXNBdmFpbGFiaWxpdHkoKTtcbiAgfVxuXG4gIGFzeW5jIHZlcmlmeVNlcnZpY2VzQXZhaWxhYmlsaXR5ICgpIHtcbiAgICBsb2cuZGVidWcoYFdhaXRpbmcgdXAgdG8gJHtTRVJWSUNFU19MQVVOQ0hfVElNRU9VVH1tcyBmb3Igc2VydmljZXMgdG8gYmUgYXZhaWxhYmxlYCk7XG4gICAgbGV0IGlzUG1TZXJ2aWNlQXZhaWxhYmxlID0gZmFsc2U7XG4gICAgbGV0IHBtT3V0cHV0ID0gJyc7XG4gICAgbGV0IHBtRXJyb3IgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKCFpc1BtU2VydmljZUF2YWlsYWJsZSkge1xuICAgICAgICAgIHBtRXJyb3IgPSBudWxsO1xuICAgICAgICAgIHBtT3V0cHV0ID0gJyc7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBtT3V0cHV0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydwbScsICdsaXN0JywgJ2luc3RydW1lbnRhdGlvbiddKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBwbUVycm9yID0gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHBtT3V0cHV0LmluY2x1ZGVzKCdDb3VsZCBub3QgYWNjZXNzIHRoZSBQYWNrYWdlIE1hbmFnZXInKSkge1xuICAgICAgICAgICAgcG1FcnJvciA9IG5ldyBFcnJvcihgUHJvYmxlbSBydW5uaW5nIFBhY2thZ2UgTWFuYWdlcjogJHtwbU91dHB1dH1gKTtcbiAgICAgICAgICAgIHBtT3V0cHV0ID0gJyc7IC8vIHJlbW92ZSBvdXRwdXQsIHNvIGl0IGlzIG5vdCBwcmludGVkIGJlbG93XG4gICAgICAgICAgfSBlbHNlIGlmIChwbU91dHB1dC5pbmNsdWRlcyhJTlNUUlVNRU5UQVRJT05fVEFSR0VUKSkge1xuICAgICAgICAgICAgcG1PdXRwdXQgPSAnJzsgLy8gcmVtb3ZlIG91dHB1dCwgc28gaXQgaXMgbm90IHByaW50ZWQgYmVsb3dcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhgSW5zdHJ1bWVudGF0aW9uIHRhcmdldCAnJHtJTlNUUlVNRU5UQVRJT05fVEFSR0VUfScgaXMgYXZhaWxhYmxlYCk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hdG9taWMtdXBkYXRlc1xuICAgICAgICAgICAgaXNQbVNlcnZpY2VBdmFpbGFibGUgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXBtRXJyb3IpIHtcbiAgICAgICAgICAgIHBtRXJyb3IgPSBuZXcgRXJyb3IoJ1RoZSBpbnN0cnVtZW50YXRpb24gdGFyZ2V0IGlzIG5vdCBsaXN0ZWQgYnkgUGFja2FnZSBNYW5hZ2VyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1BtU2VydmljZUF2YWlsYWJsZTtcbiAgICAgIH0sIHtcbiAgICAgICAgd2FpdE1zOiBTRVJWSUNFU19MQVVOQ0hfVElNRU9VVCxcbiAgICAgICAgaW50ZXJ2YWxNczogMTAwMCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLmVycm9yKGBVbmFibGUgdG8gZmluZCBpbnN0cnVtZW50YXRpb24gdGFyZ2V0ICcke0lOU1RSVU1FTlRBVElPTl9UQVJHRVR9JzogJHsocG1FcnJvciB8fCB7fSkubWVzc2FnZX1gKTtcbiAgICAgIGlmIChwbU91dHB1dCkge1xuICAgICAgICBsb2cuZGVidWcoJ0F2YWlsYWJsZSB0YXJnZXRzOicpO1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcG1PdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKGAgICAgJHtsaW5lLnJlcGxhY2UoJ2luc3RydW1lbnRhdGlvbjonLCAnJyl9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydFNlc3Npb24gKGNhcHMpIHtcbiAgICBhd2FpdCB0aGlzLmNsZWFudXBBdXRvbWF0aW9uTGVmdG92ZXJzKCk7XG4gICAgaWYgKGNhcHMuc2tpcFNlcnZlckluc3RhbGxhdGlvbikge1xuICAgICAgbG9nLmluZm8oYCdza2lwU2VydmVySW5zdGFsbGF0aW9uJyBpcyBzZXQuIEF0dGVtcHRpbmcgdG8gdXNlIFVJQXV0b21hdG9yMiBzZXJ2ZXIgZnJvbSB0aGUgZGV2aWNlYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5pbmZvKGBTdGFydGluZyBVSUF1dG9tYXRvcjIgc2VydmVyICR7c2VydmVyVmVyc2lvbn1gKTtcbiAgICAgIGxvZy5pbmZvKGBVc2luZyBVSUF1dG9tYXRvcjIgc2VydmVyIGZyb20gJyR7YXBrUGF0aH0nIGFuZCB0ZXN0IGZyb20gJyR7dGVzdEFwa1BhdGh9J2ApO1xuICAgIH1cblxuICAgIGNvbnN0IHRpbWVvdXQgPSBjYXBzLnVpYXV0b21hdG9yMlNlcnZlckxhdW5jaFRpbWVvdXQgfHwgU0VSVkVSX0xBVU5DSF9USU1FT1VUO1xuICAgIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gICAgbGV0IHJldHJpZXMgPSAwO1xuICAgIGNvbnN0IG1heFJldHJpZXMgPSAyO1xuICAgIGNvbnN0IGRlbGF5QmV0d2VlblJldHJpZXMgPSAzMDAwO1xuICAgIHdoaWxlIChyZXRyaWVzIDwgbWF4UmV0cmllcykge1xuICAgICAgbG9nLmluZm8oYFdhaXRpbmcgdXAgdG8gJHt0aW1lb3V0fW1zIGZvciBVaUF1dG9tYXRvcjIgdG8gYmUgb25saW5lLi4uYCk7XG4gICAgICB0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCA9IGZhbHNlO1xuICAgICAgYXdhaXQgdGhpcy5zdGFydEluc3RydW1lbnRhdGlvblByb2Nlc3MoKTtcbiAgICAgIGlmICghdGhpcy5qd3Byb3h5LmRpZEluc3RydW1lbnRhdGlvbkV4aXQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcvc3RhdHVzJywgJ0dFVCcpO1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAvLyBzaG9ydCBjaXJjdWl0IHRvIHJldHJ5IG9yIGZhaWwgZmFzdFxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5qd3Byb3h5LmRpZEluc3RydW1lbnRhdGlvbkV4aXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgd2FpdE1zOiB0aW1lb3V0LFxuICAgICAgICAgICAgaW50ZXJ2YWxNczogMTAwMCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbG9nLmVycm9yQW5kVGhyb3coYFRoZSBpbnN0cnVtZW50YXRpb24gcHJvY2VzcyBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgd2l0aGluICR7dGltZW91dH1tcyB0aW1lb3V0LiBgXG4gICAgICAgICAgICArICdNYWtlIHN1cmUgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgZG9lcyBub3QgY3Jhc2ggYW5kIGludmVzdGlnYXRlIHRoZSBsb2djYXQgb3V0cHV0LiAnXG4gICAgICAgICAgICArIGBZb3UgY291bGQgYWxzbyB0cnkgdG8gaW5jcmVhc2UgdGhlIHZhbHVlIG9mICd1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0JyBjYXBhYmlsaXR5YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5qd3Byb3h5LmRpZEluc3RydW1lbnRhdGlvbkV4aXQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHJpZXMrKztcbiAgICAgIGlmIChyZXRyaWVzID49IG1heFJldHJpZXMpIHtcbiAgICAgICAgbG9nLmVycm9yQW5kVGhyb3coJ1RoZSBpbnN0cnVtZW50YXRpb24gcHJvY2VzcyBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQuICdcbiAgICAgICAgICArICdNYWtlIHN1cmUgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgZG9lcyBub3QgY3Jhc2ggYW5kIGludmVzdGlnYXRlIHRoZSBsb2djYXQgb3V0cHV0LicpO1xuICAgICAgfVxuICAgICAgbG9nLndhcm4oYFRoZSBpbnN0cnVtZW50YXRpb24gcHJvY2VzcyBoYXMgYmVlbiB1bmV4cGVjdGVkbHkgdGVybWluYXRlZC4gYFxuICAgICAgICArIGBSZXRyeWluZyBVaUF1dG9tYXRvcjIgc3RhcnR1cCAoIyR7cmV0cmllc30gb2YgJHttYXhSZXRyaWVzIC0gMX0pYCk7XG4gICAgICBhd2FpdCB0aGlzLmNsZWFudXBBdXRvbWF0aW9uTGVmdG92ZXJzKHRydWUpO1xuICAgICAgYXdhaXQgQi5kZWxheShkZWxheUJldHdlZW5SZXRyaWVzKTtcbiAgICB9XG5cbiAgICBsb2cuZGVidWcoYFRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgdG9vayBgXG4gICAgICArIGAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICAgIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcvc2Vzc2lvbicsICdQT1NUJywge1xuICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgIGZpcnN0TWF0Y2g6IFtjYXBzXSxcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHt9LFxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRJbnN0cnVtZW50YXRpb25Qcm9jZXNzICgpIHtcbiAgICBjb25zdCBjbWQgPSBbJ2FtJywgJ2luc3RydW1lbnQnLCAnLXcnXTtcbiAgICBpZiAodGhpcy5kaXNhYmxlV2luZG93QW5pbWF0aW9uKSB7XG4gICAgICBjbWQucHVzaCgnLS1uby13aW5kb3ctYW5pbWF0aW9uJyk7XG4gICAgfVxuICAgIGlmIChfLmlzQm9vbGVhbih0aGlzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlKSkge1xuICAgICAgY21kLnB1c2goJy1lJywgJ0RJU0FCTEVfU1VQUFJFU1NfQUNDRVNTSUJJTElUWV9TRVJWSUNFUycsIHRoaXMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UpO1xuICAgIH1cbiAgICAvLyBEaXNhYmxlIEdvb2dsZSBhbmFseXRpY3MgdG8gcHJldmVudCBwb3NzaWJsZSBmYXRhbCBleGNlcHRpb25cbiAgICBjbWQucHVzaCgnLWUnLCAnZGlzYWJsZUFuYWx5dGljcycsIHRydWUpO1xuICAgIGNtZC5wdXNoKElOU1RSVU1FTlRBVElPTl9UQVJHRVQpO1xuICAgIGNvbnN0IGluc3RydW1lbnRhdGlvblByb2Nlc3MgPSB0aGlzLmFkYi5jcmVhdGVTdWJQcm9jZXNzKFsnc2hlbGwnLCAuLi5jbWRdKTtcbiAgICBpbnN0cnVtZW50YXRpb25Qcm9jZXNzLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IF8udHJpbShzdGRvdXQgfHwgc3RkZXJyKTtcbiAgICAgIGlmIChvdXRwdXQpIHtcbiAgICAgICAgaW5zdHJ1bWVudGF0aW9uTG9nZ2VyLmRlYnVnKG91dHB1dCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaW5zdHJ1bWVudGF0aW9uUHJvY2Vzcy5vbignZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgICBpbnN0cnVtZW50YXRpb25Mb2dnZXIuZGVidWcoYFRoZSBwcm9jZXNzIGhhcyBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gKTtcbiAgICAgIHRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0ID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhd2FpdCBpbnN0cnVtZW50YXRpb25Qcm9jZXNzLnN0YXJ0KDApO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbiAoKSB7XG4gICAgbG9nLmRlYnVnKCdEZWxldGluZyBVaUF1dG9tYXRvcjIgc2VydmVyIHNlc3Npb24nKTtcbiAgICAvLyByZWx5IG9uIGp3cHJveHkncyBpbnRlbGxpZ2VuY2UgdG8ga25vdyB3aGF0IHdlJ3JlIHRhbGtpbmcgYWJvdXQgYW5kXG4gICAgLy8gZGVsZXRlIHRoZSBjdXJyZW50IHNlc3Npb25cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy8nLCAnREVMRVRFJyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cud2FybihgRGlkIG5vdCBnZXQgY29uZmlybWF0aW9uIFVpQXV0b21hdG9yMiBkZWxldGVTZXNzaW9uIHdvcmtlZDsgYCArXG4gICAgICAgICAgYEVycm9yIHdhczogJHtlcnJ9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY2xlYW51cEF1dG9tYXRpb25MZWZ0b3ZlcnMgKHN0cmljdENsZWFudXAgPSBmYWxzZSkge1xuICAgIGxvZy5kZWJ1ZyhgUGVyZm9ybWluZyAke3N0cmljdENsZWFudXAgPyAnc3RyaWN0JyA6ICdzaGFsbG93J30gY2xlYW51cCBvZiBhdXRvbWF0aW9uIGxlZnRvdmVyc2ApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHt2YWx1ZX0gPSAoYXdhaXQgYXhpb3Moe1xuICAgICAgICB1cmw6IGBodHRwOi8vJHt0aGlzLmhvc3R9OiR7dGhpcy5zeXN0ZW1Qb3J0fS93ZC9odWIvc2Vzc2lvbnNgLFxuICAgICAgICB0aW1lb3V0OiA1MDAsXG4gICAgICB9KSkuZGF0YTtcbiAgICAgIGNvbnN0IGFjdGl2ZVNlc3Npb25JZHMgPSB2YWx1ZS5tYXAoKHtpZH0pID0+IGlkKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBpZiAoYWN0aXZlU2Vzc2lvbklkcy5sZW5ndGgpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBUaGUgZm9sbG93aW5nIG9ic29sZXRlIHNlc3Npb25zIGFyZSBzdGlsbCBydW5uaW5nOiAke0pTT04uc3RyaW5naWZ5KGFjdGl2ZVNlc3Npb25JZHMpfWApO1xuICAgICAgICBsb2cuZGVidWcoYENsZWFuaW5nIHVwICR7dXRpbC5wbHVyYWxpemUoJ29ic29sZXRlIHNlc3Npb24nLCBhY3RpdmVTZXNzaW9uSWRzLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgICAgIGF3YWl0IEIuYWxsKGFjdGl2ZVNlc3Npb25JZHNcbiAgICAgICAgICAubWFwKChpZCkgPT4gYXhpb3MuZGVsZXRlKGBodHRwOi8vJHt0aGlzLmhvc3R9OiR7dGhpcy5zeXN0ZW1Qb3J0fS93ZC9odWIvc2Vzc2lvbi8ke2lkfWApKVxuICAgICAgICApO1xuICAgICAgICAvLyBMZXQgYWxsIHNlc3Npb25zIHRvIGJlIHByb3Blcmx5IHRlcm1pbmF0ZWQgYmVmb3JlIGNvbnRpbnVpbmdcbiAgICAgICAgYXdhaXQgQi5kZWxheSgxMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy5kZWJ1ZygnTm8gb2Jzb2xldGUgc2Vzc2lvbnMgaGF2ZSBiZWVuIGRldGVjdGVkJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmRlYnVnKGBObyBvYnNvbGV0ZSBzZXNzaW9ucyBoYXZlIGJlZW4gZGV0ZWN0ZWQgKCR7ZS5tZXNzYWdlfSlgKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQpO1xuICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICBpZiAoIXN0cmljdENsZWFudXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzEwNzQ5XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmtpbGxQcm9jZXNzZXNCeU5hbWUoJ3VpYXV0b21hdG9yJyk7XG4gICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuICB9XG59XG5cbmV4cG9ydCB7IFVpQXV0b21hdG9yMlNlcnZlciwgSU5TVFJVTUVOVEFUSU9OX1RBUkdFVCwgU0VSVkVSX1BBQ0tBR0VfSUQsIFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQgfTtcbmV4cG9ydCBkZWZhdWx0IFVpQXV0b21hdG9yMlNlcnZlcjtcbiJdLCJmaWxlIjoibGliL3VpYXV0b21hdG9yMi5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
package/lib/commands/general.js
CHANGED
|
@@ -87,6 +87,10 @@ commands.getStrings = async function (language) {
|
|
|
87
87
|
}
|
|
88
88
|
};
|
|
89
89
|
|
|
90
|
+
commands.getDisplayDensity = async function getDisplayDensity () {
|
|
91
|
+
return await this.uiautomator2.jwproxy.command('/appium/device/display_density', 'GET', {});
|
|
92
|
+
};
|
|
93
|
+
|
|
90
94
|
// memoized in constructor
|
|
91
95
|
commands.getWindowSize = async function () {
|
|
92
96
|
return await this.uiautomator2.jwproxy.command('/window/current/size', 'GET', {});
|
|
@@ -112,6 +116,7 @@ extensions.executeMobile = async function (mobileCommand, opts = {}) {
|
|
|
112
116
|
dragGesture: 'mobileDragGesture',
|
|
113
117
|
flingGesture: 'mobileFlingGesture',
|
|
114
118
|
doubleClickGesture: 'mobileDoubleClickGesture',
|
|
119
|
+
clickGesture: 'mobileClickGesture',
|
|
115
120
|
longClickGesture: 'mobileLongClickGesture',
|
|
116
121
|
pinchCloseGesture: 'mobilePinchCloseGesture',
|
|
117
122
|
pinchOpenGesture: 'mobilePinchOpenGesture',
|
|
@@ -272,6 +277,7 @@ helpers.wrapBootstrapDisconnect = async function (wrapped) {
|
|
|
272
277
|
helpers.suspendChromedriverProxy = function () {
|
|
273
278
|
this.chromedriver = null;
|
|
274
279
|
this.proxyReqRes = this.uiautomator2.proxyReqRes.bind(this.uiautomator2);
|
|
280
|
+
this.proxyCommand = this.uiautomator2.proxyCommand.bind(this.uiautomator2);
|
|
275
281
|
this.jwpProxyActive = true;
|
|
276
282
|
};
|
|
277
283
|
|
package/lib/commands/gestures.js
CHANGED
|
@@ -14,12 +14,37 @@ function toPoint (x, y) {
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
function toRect (left, top, width, height) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
return {left, top, width, height};
|
|
17
|
+
return [left, top, width, height].some((v) => !_.isFinite(v))
|
|
18
|
+
? undefined
|
|
19
|
+
: {left, top, width, height};
|
|
21
20
|
}
|
|
22
21
|
|
|
22
|
+
/**
|
|
23
|
+
* @typedef {Object} ClickOptions
|
|
24
|
+
* @property {?string} elementId - The id of the element to be clicked.
|
|
25
|
+
* If the element is missing then both click offset coordinates must be provided.
|
|
26
|
+
* If both the element id and offset are provided then the coordinates
|
|
27
|
+
* are parsed as relative offsets from the top left corner of the element.
|
|
28
|
+
* @property {?number} x - The x coordinate to click on
|
|
29
|
+
* @property {?number} y - The y coordinate to click on
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Performs a simple click/tap gesture
|
|
34
|
+
*
|
|
35
|
+
* @param {?ClickOptions} opts
|
|
36
|
+
* @throws {Error} if provided options are not valid
|
|
37
|
+
*/
|
|
38
|
+
commands.mobileClickGesture = async function mobileClickGesture (opts = {}) {
|
|
39
|
+
const {
|
|
40
|
+
elementId,
|
|
41
|
+
x, y,
|
|
42
|
+
} = opts;
|
|
43
|
+
return await this.uiautomator2.jwproxy.command('/appium/gestures/click', 'POST', {
|
|
44
|
+
origin: toOrigin(elementId),
|
|
45
|
+
offset: toPoint(x, y),
|
|
46
|
+
});
|
|
47
|
+
};
|
|
23
48
|
|
|
24
49
|
/**
|
|
25
50
|
* @typedef {Object} LongClickOptions
|
package/lib/driver.js
CHANGED
|
@@ -67,7 +67,6 @@ const NO_PROXY = [
|
|
|
67
67
|
['GET', new RegExp('^/session/[^/]+/element/[^/]+/selected')],
|
|
68
68
|
['GET', new RegExp('^/session/[^/]+/ime/[^/]+')],
|
|
69
69
|
['GET', new RegExp('^/session/[^/]+/location')],
|
|
70
|
-
['GET', new RegExp('^/session/[^/]+/log/types')],
|
|
71
70
|
['GET', new RegExp('^/session/[^/]+/network_connection')],
|
|
72
71
|
['GET', new RegExp('^/session/[^/]+/screenshot')],
|
|
73
72
|
['GET', new RegExp('^/session/[^/]+/timeouts')],
|
|
@@ -94,7 +93,6 @@ const NO_PROXY = [
|
|
|
94
93
|
['POST', new RegExp('^/session/[^/]+/ime/[^/]+')],
|
|
95
94
|
['POST', new RegExp('^/session/[^/]+/keys')],
|
|
96
95
|
['POST', new RegExp('^/session/[^/]+/location')],
|
|
97
|
-
['POST', new RegExp('^/session/[^/]+/log')],
|
|
98
96
|
['POST', new RegExp('^/session/[^/]+/network_connection')],
|
|
99
97
|
['POST', new RegExp('^/session/[^/]+/timeouts')],
|
|
100
98
|
['POST', new RegExp('^/session/[^/]+/touch/multi/perform')],
|
|
@@ -102,12 +100,18 @@ const NO_PROXY = [
|
|
|
102
100
|
['POST', new RegExp('^/session/[^/]+/url')],
|
|
103
101
|
|
|
104
102
|
// MJSONWP commands
|
|
103
|
+
['GET', new RegExp('^/session/[^/]+/log/types')],
|
|
105
104
|
['POST', new RegExp('^/session/[^/]+/execute')],
|
|
106
105
|
['POST', new RegExp('^/session/[^/]+/execute_async')],
|
|
106
|
+
['POST', new RegExp('^/session/[^/]+/log')],
|
|
107
107
|
// W3C commands
|
|
108
|
+
// For Selenium v4 (W3C does not have this route)
|
|
109
|
+
['GET', new RegExp('^/session/[^/]+/se/log/types')],
|
|
108
110
|
['GET', new RegExp('^/session/[^/]+/window/rect')],
|
|
109
111
|
['POST', new RegExp('^/session/[^/]+/execute/async')],
|
|
110
112
|
['POST', new RegExp('^/session/[^/]+/execute/sync')],
|
|
113
|
+
// For Selenium v4 (W3C does not have this route)
|
|
114
|
+
['POST', new RegExp('^/session/[^/]+/se/log')],
|
|
111
115
|
];
|
|
112
116
|
|
|
113
117
|
// This is a set of methods and paths that we never want to proxy to Chromedriver.
|
|
@@ -115,11 +119,9 @@ const CHROME_NO_PROXY = [
|
|
|
115
119
|
['GET', new RegExp('^/session/[^/]+/appium')],
|
|
116
120
|
['GET', new RegExp('^/session/[^/]+/context')],
|
|
117
121
|
['GET', new RegExp('^/session/[^/]+/element/[^/]+/rect')],
|
|
118
|
-
['GET', new RegExp('^/session/[^/]+/log/types$')],
|
|
119
122
|
['GET', new RegExp('^/session/[^/]+/orientation')],
|
|
120
123
|
['POST', new RegExp('^/session/[^/]+/appium')],
|
|
121
124
|
['POST', new RegExp('^/session/[^/]+/context')],
|
|
122
|
-
['POST', new RegExp('^/session/[^/]+/log$')],
|
|
123
125
|
['POST', new RegExp('^/session/[^/]+/orientation')],
|
|
124
126
|
['POST', new RegExp('^/session/[^/]+/touch/multi/perform')],
|
|
125
127
|
['POST', new RegExp('^/session/[^/]+/touch/perform')],
|
|
@@ -127,6 +129,15 @@ const CHROME_NO_PROXY = [
|
|
|
127
129
|
// this is needed to make the mobile: commands working in web context
|
|
128
130
|
['POST', new RegExp('^/session/[^/]+/execute$')],
|
|
129
131
|
['POST', new RegExp('^/session/[^/]+/execute/sync')],
|
|
132
|
+
|
|
133
|
+
// MJSONWP commands
|
|
134
|
+
['GET', new RegExp('^/session/[^/]+/log/types$')],
|
|
135
|
+
['POST', new RegExp('^/session/[^/]+/log$')],
|
|
136
|
+
// W3C commands
|
|
137
|
+
// For Selenium v4 (W3C does not have this route)
|
|
138
|
+
['GET', new RegExp('^/session/[^/]+/se/log/types$')],
|
|
139
|
+
// For Selenium v4 (W3C does not have this route)
|
|
140
|
+
['POST', new RegExp('^/session/[^/]+/se/log$')],
|
|
130
141
|
];
|
|
131
142
|
|
|
132
143
|
const MEMOIZED_FUNCTIONS = [
|
|
@@ -487,6 +498,7 @@ class AndroidUiautomator2Driver extends BaseDriver {
|
|
|
487
498
|
// uiautomator2 with the appropriate options
|
|
488
499
|
this.uiautomator2 = new UiAutomator2Server(uiautomator2Opts);
|
|
489
500
|
this.proxyReqRes = this.uiautomator2.proxyReqRes.bind(this.uiautomator2);
|
|
501
|
+
this.proxyCommand = this.uiautomator2.proxyCommand.bind(this.uiautomator2);
|
|
490
502
|
|
|
491
503
|
if (this.opts.skipServerInstallation) {
|
|
492
504
|
logger.info(`'skipServerInstallation' is set. Skipping UIAutomator2 server installation.`);
|
|
@@ -527,16 +539,20 @@ class AndroidUiautomator2Driver extends BaseDriver {
|
|
|
527
539
|
}
|
|
528
540
|
|
|
529
541
|
if (this.opts.app) {
|
|
530
|
-
if (!this.opts.
|
|
531
|
-
|
|
542
|
+
if (this.opts.noReset && !(await this.adb.isAppInstalled(this.opts.appPackage))
|
|
543
|
+
|| !this.opts.noReset) {
|
|
544
|
+
if (!this.opts.noSign && !await this.adb.checkApkCert(this.opts.app, this.opts.appPackage, {
|
|
532
545
|
requireDefaultCert: false,
|
|
533
546
|
})) {
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
547
|
+
await helpers.signApp(this.adb, this.opts.app);
|
|
548
|
+
}
|
|
549
|
+
if (!this.opts.skipUninstall) {
|
|
550
|
+
await this.adb.uninstallApk(this.opts.appPackage);
|
|
551
|
+
}
|
|
552
|
+
await helpers.installApk(this.adb, this.opts);
|
|
553
|
+
} else {
|
|
554
|
+
logger.debug('noReset has been requested and the app is already installed. Doing nothing');
|
|
538
555
|
}
|
|
539
|
-
await helpers.installApk(this.adb, this.opts);
|
|
540
556
|
} else {
|
|
541
557
|
if (this.opts.fullReset) {
|
|
542
558
|
logger.errorAndThrow('Full reset requires an app capability, use fastReset if app is not provided');
|
package/lib/uiautomator2.js
CHANGED
|
@@ -55,6 +55,7 @@ class UiAutomator2Server {
|
|
|
55
55
|
}
|
|
56
56
|
this.jwproxy = new UIA2Proxy(proxyOpts);
|
|
57
57
|
this.proxyReqRes = this.jwproxy.proxyReqRes.bind(this.jwproxy);
|
|
58
|
+
this.proxyCommand = this.jwproxy.command.bind(this.jwproxy);
|
|
58
59
|
this.jwproxy.didInstrumentationExit = false;
|
|
59
60
|
}
|
|
60
61
|
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"automated testing",
|
|
8
8
|
"android"
|
|
9
9
|
],
|
|
10
|
-
"version": "1.
|
|
10
|
+
"version": "1.73.0",
|
|
11
11
|
"author": "appium",
|
|
12
12
|
"license": "Apache-2.0",
|
|
13
13
|
"repository": {
|
|
@@ -42,11 +42,11 @@
|
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"@babel/runtime": "^7.0.0",
|
|
44
44
|
"appium-adb": "^8.10.0",
|
|
45
|
-
"appium-android-driver": "^4.
|
|
45
|
+
"appium-android-driver": "^4.51.0",
|
|
46
46
|
"appium-base-driver": "^7.0.0",
|
|
47
47
|
"appium-chromedriver": "^4.23.1",
|
|
48
48
|
"appium-support": "^2.49.0",
|
|
49
|
-
"appium-uiautomator2-server": "^4.
|
|
49
|
+
"appium-uiautomator2-server": "^4.28.0",
|
|
50
50
|
"asyncbox": "^2.3.1",
|
|
51
51
|
"axios": "^0.x",
|
|
52
52
|
"bluebird": "^3.5.1",
|
|
@@ -81,6 +81,7 @@
|
|
|
81
81
|
"test"
|
|
82
82
|
],
|
|
83
83
|
"devDependencies": {
|
|
84
|
+
"@xmldom/xmldom": "^0.x",
|
|
84
85
|
"android-apidemos": "^3.0.0",
|
|
85
86
|
"appium-gulp-plugins": "^5.4.0",
|
|
86
87
|
"appium-test-support": "^1.0.0",
|
|
@@ -95,10 +96,9 @@
|
|
|
95
96
|
"pngjs": "^6.0.0",
|
|
96
97
|
"pre-commit": "^1.2.2",
|
|
97
98
|
"rimraf": "^3.0.0",
|
|
98
|
-
"sinon": "^
|
|
99
|
+
"sinon": "^12.0.0",
|
|
99
100
|
"unzipper": "^0.10.0",
|
|
100
101
|
"wd": "^1.10.3",
|
|
101
|
-
"xmldom": "^0.x",
|
|
102
102
|
"xpath": "^0.x"
|
|
103
103
|
}
|
|
104
104
|
}
|
package/lib/.DS_Store
DELETED
|
Binary file
|