obsidian-integration-testing 8.1.1 → 8.1.2

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 CHANGED
@@ -740,7 +740,7 @@ Besides the required `appiumUrl` and `avdName`, the transport accepts these opti
740
740
  | `appId` | App package (Android) or bundle ID (iOS). | `'md.obsidian'` |
741
741
  | `appiumStartTimeoutInMilliseconds` | Max wait for the auto-started Appium server to become ready; only when the harness auto-starts it. | `180000` |
742
742
  | `deviceIdleTimeoutInMilliseconds` | Max wait after boot for a started emulator to go idle before the session; avoids inflated cold setup. 0 skips. | `60000` |
743
- | `isAppiumConsoleVisible` | Show the auto-started Appium server console window. Hidden (`windowsHide`) by default so it never steals focus. | `false` |
743
+ | `isAppiumConsoleVisible` | Show the auto-started Appium server console window and live output. Hidden and quiet by default. | `false` |
744
744
  | `isEmulatorVisible` | Show the auto-started emulator window. Hidden (`-no-window`, headless) by default so it never steals focus. | `false` |
745
745
  | `layoutReadyTimeoutInMilliseconds` | Max wait for `app.workspace.layoutReady` after the vault (re)opens; raise on slow emulators. | `90000` |
746
746
  | `sessionConnectionRetryTimeoutInMilliseconds` | Max wait to establish the Appium session (UiAutomator2 install + app launch); the dominant startup cost. | `180000` |
@@ -21,7 +21,7 @@ __export(library_exports, {
21
21
  LIBRARY_VERSION: () => LIBRARY_VERSION
22
22
  });
23
23
  module.exports = __toCommonJS(library_exports);
24
- const LIBRARY_VERSION = false ? "dev" : "8.1.0";
24
+ const LIBRARY_VERSION = false ? "dev" : "8.1.1";
25
25
  // Annotate the CommonJS export names for ESM import in node:
26
26
  0 && (module.exports = {
27
27
  LIBRARY_VERSION
@@ -392,11 +392,12 @@ class AppiumTransportFactory {
392
392
  }
393
393
  }
394
394
  startAppiumServer(port, isAppiumConsoleVisible) {
395
+ const isConsoleHidden = (0, import_visibility.shouldHideAppiumConsole)(isAppiumConsoleVisible);
395
396
  const child = (0, import_node_child_process.spawn)(`npx appium --log-timestamp --port ${String(port)} --allow-insecure=${CHROMEDRIVER_AUTODOWNLOAD_FEATURE}`, {
396
397
  detached: true,
397
398
  shell: true,
398
- stdio: ["ignore", "inherit", "inherit"],
399
- windowsHide: (0, import_visibility.shouldHideAppiumConsole)(isAppiumConsoleVisible)
399
+ stdio: isConsoleHidden ? "ignore" : ["ignore", "inherit", "inherit"],
400
+ windowsHide: isConsoleHidden
400
401
  });
401
402
  child.unref();
402
403
  return child;
@@ -745,4 +746,4 @@ function stripForbiddenFetchHeaders(requestOptions) {
745
746
  createTransportFromOptions,
746
747
  getOrCreateTransport
747
748
  });
748
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHtcbiAgYXR0YWNoLFxuICByZW1vdGVcbn0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5LmNqcyc7XG5pbXBvcnQgdHlwZSB7IE93bmVkSW5zdGFuY2VDb25maWcgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5janMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHtcbiAgcmVzb2x2ZUFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzLFxuICByZXNvbHZlU2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xufSBmcm9tICcuL2FwcGl1bS1zZXNzaW9uLWNvbmZpZy5janMnO1xuaW1wb3J0IHtcbiAgY2hlY2tEZXZpY2VJZGxlLFxuICByZXNvbHZlRGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xufSBmcm9tICcuL2RldmljZS1yZWFkaW5lc3MuY2pzJztcbmltcG9ydCB7IGJ1aWxkRW11bGF0b3JBcmdzIH0gZnJvbSAnLi9lbXVsYXRvci1hcmdzLmNqcyc7XG5pbXBvcnQgeyBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3IgfSBmcm9tICcuL2luY29tcGF0aWJsZS1pbnN0YWxsZXItdmVyc2lvbi1lcnJvci5janMnO1xuaW1wb3J0IHsgY2hlY2tJbnN0YWxsZXJDb21wYXRpYmlsaXR5IH0gZnJvbSAnLi9pbnN0YWxsZXItY29tcGF0aWJpbGl0eS5janMnO1xuaW1wb3J0IHsga2lsbFByb2Nlc3NUcmVlIH0gZnJvbSAnLi9raWxsLXByb2Nlc3MtdHJlZS5janMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cuY2pzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuQ29uZmlnRGlyIH0gZnJvbSAnLi9vYnNpZGlhbi1jb25maWcuY2pzJztcbmltcG9ydCB7IHJlc29sdmVPYnNpZGlhbkV4ZWN1dGFibGUgfSBmcm9tICcuL29ic2lkaWFuLWV4ZWN1dGFibGUuY2pzJztcbmltcG9ydCB7XG4gIGRldGVjdEluc3RhbGxlZFNoZWxsVmVyc2lvbixcbiAgZW5zdXJlU2hlbGxDYWNoZWRcbn0gZnJvbSAnLi9vYnNpZGlhbi1pbnN0YWxsZXIuY2pzJztcbmltcG9ydCB7IGdldFZlcnNpb25NZXRhZGF0YSB9IGZyb20gJy4vb2JzaWRpYW4tbWV0YWRhdGEuY2pzJztcbmltcG9ydCB7XG4gIGVuc3VyZUFzYXJDYWNoZWQsXG4gIGZpbmROZXdlc3RBc2FyLFxuICByZXNvbHZlQ29uY3JldGVWZXJzaW9uXG59IGZyb20gJy4vb2JzaWRpYW4tdmVyc2lvbi1zd2l0Y2guY2pzJztcbmltcG9ydCB7IGNvbXBhcmVWZXJzaW9ucyB9IGZyb20gJy4vb2JzaWRpYW4tdmVyc2lvbi5janMnO1xuaW1wb3J0IHsgcmVzb2x2ZURlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcyB9IGZyb20gJy4vcmVuZGVyZXItYm9vdC1kZXRlY3Rpb24uY2pzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5janMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLmNqcyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4vdHlwZS1ndWFyZHMuY2pzJztcbmltcG9ydCB7XG4gIHNob3VsZEhpZGVBcHBpdW1Db25zb2xlLFxuICBzaG91bGRIaWRlRW11bGF0b3JXaW5kb3dcbn0gZnJvbSAnLi92aXNpYmlsaXR5LmNqcyc7XG5cbmNvbnN0IEFQUF9QQUNLQUdFID0gJ21kLm9ic2lkaWFuJztcbmNvbnN0IEFQUF9BQ1RJVklUWSA9IGAke0FQUF9QQUNLQUdFfS5NYWluQWN0aXZpdHlgO1xuY29uc3QgQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCA9IDM7XG5jb25zdCBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IE9XTkVEX1VTRVJfREFUQV9QUkVGSVggPSAndXNlcmRhdGEtJztcbi8vIEFwcGl1bSBpbnNlY3VyZSBmZWF0dXJlIGxldHRpbmcgdGhlIFVpQXV0b21hdG9yMiBkcml2ZXIgYXV0by1kb3dubG9hZCBhXG4vLyBDaHJvbWVkcml2ZXIgbWF0Y2hpbmcgT2JzaWRpYW4ncyBXZWJWaWV3IENocm9tZSB2ZXJzaW9uLiBFbmFibGluZyBpdCBvbiB0aGVcbi8vIEFwcGl1bSBzZXJ2ZXIgKGl0IGhhcyBubyBlZmZlY3QgYXMgYSBjYXBhYmlsaXR5KSBhdm9pZHMgdGhlIGZhaWx1cmVcbi8vIFwiTm8gQ2hyb21lZHJpdmVyIGZvdW5kIHRoYXQgY2FuIGF1dG9tYXRlIENocm9tZSAuLi5cIi5cbmNvbnN0IENIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRSA9ICd1aWF1dG9tYXRvcjI6Y2hyb21lZHJpdmVyX2F1dG9kb3dubG9hZCc7XG5jb25zdCBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuY29uc3QgREVGQVVMVF9UUkFOU1BPUlRfVFlQRSA9ICdvYnNpZGlhbi1jZHAnO1xuY29uc3QgREVWSUNFX0lETEVfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgRU1VTEFUT1JfT1VUUFVUX1RBSUxfTUFYX0xFTkdUSCA9IDgwMDA7XG5jb25zdCBLRVlDT0RFX01FTlUgPSA4MjtcbmNvbnN0IEtFWUNPREVfV0FLRVVQID0gMjI0O1xuY29uc3QgU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjAwMDA7XG5jb25zdCBTRVJWRVJfTEFVTkNIX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuXG4vKipcbiAqIEhvdyB0aGUgcmVxdWVzdGVkIGFwcCAoYXNhcikgdmVyc2lvbiB3aWxsIGJlIGFwcGxpZWQgdG8gYW4gb3duZWQgaW5zdGFuY2U7IGF0XG4gKiBtb3N0IG9uZSBmaWVsZCBpcyBzZXQgKHNlZSB7QGxpbmsgcmVzb2x2ZUFzYXJQbGFufSkuXG4gKi9cbmludGVyZmFjZSBBc2FyUGxhbiB7XG4gIC8qKiBUaGUgdXNlcidzIG5ld2VzdCBpbnN0YWxsZWQgYXNhciB0byBwcm92aXNpb24gYXMtaXMgKG5vIGRvd25sb2FkKS4gKi9cbiAgcmVhZG9ubHkgYXNhcj86IE93bmVkSW5zdGFuY2VDb25maWdbJ2FzYXInXTtcblxuICAvKiogVGhlIGFwcCB2ZXJzaW9uIHRvIGRvd25sb2FkIGFuZCBhc2FyLXN3YXAgb250byB0aGUgc2hlbGwuICovXG4gIHJlYWRvbmx5IGFzYXJWZXJzaW9uVG9Td2FwPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBUaGUgYXBwIHZlcnNpb24gd2hvc2Ugb3duIGluc3RhbGxlciBzaGVsbCB0byBkb3dubG9hZCAoYSBkb3duZ3JhZGUpLiAqL1xuICByZWFkb25seSBkb3duZ3JhZGVJbnN0YWxsZXJWZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIERldGFpbHMgb2YgYW4gZW11bGF0b3IgcHJvY2VzcyB0aGF0IGhhcyBleGl0ZWQuXG4gKi9cbmludGVyZmFjZSBFbXVsYXRvckV4aXRJbmZvIHtcbiAgLyoqIEV4aXQgY29kZSwgb3IgYG51bGxgIGlmIHRoZSBwcm9jZXNzIHdhcyB0ZXJtaW5hdGVkIGJ5IGEgc2lnbmFsLiAqL1xuICBjb2RlOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKiBUZXJtaW5hdGluZyBzaWduYWwsIG9yIGBudWxsYCBpZiB0aGUgcHJvY2VzcyBleGl0ZWQgbm9ybWFsbHkuICovXG4gIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsO1xufVxuXG4vKipcbiAqIEEgc3Bhd25lZCBlbXVsYXRvciBwcm9jZXNzIHRvZ2V0aGVyIHdpdGggaGVscGVycyB0byBpbnNwZWN0IGl0cyBjYXB0dXJlZFxuICogb3V0cHV0IGFuZCBleGl0IHN0YXR1cy5cbiAqL1xuaW50ZXJmYWNlIEVtdWxhdG9yTGF1bmNoIHtcbiAgLyoqIFRoZSBzcGF3bmVkIGVtdWxhdG9yIHByb2Nlc3MuICovXG4gIHByb2Nlc3M6IENoaWxkUHJvY2VzcztcblxuICAvKiogUmV0dXJucyB0aGUgZXhpdCBkZXRhaWxzIG9uY2UgdGhlIHByb2Nlc3MgaGFzIGV4aXRlZCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLiAqL1xuICByZWFkRXhpdEluZm86ICgpID0+IEVtdWxhdG9yRXhpdEluZm8gfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFJldHVybnMgdGhlIGNhcHR1cmVkIHN0ZG91dCtzdGRlcnIgKGJvdW5kZWQgdG8gdGhlIG1vc3QgcmVjZW50IG91dHB1dCkuICovXG4gIHJlYWRPdXRwdXQ6ICgpID0+IHN0cmluZztcblxuICAvKiogU3RvcHMgYWNjdW11bGF0aW5nIG91dHB1dC4gQ2FsbCBvbmNlIHN0YXJ0dXAgaGFzIHN1Y2NlZWRlZC4gKi9cbiAgc3RvcENhcHR1cmU6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkuZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyB7XG4gIC8qKiBBVkQgbmFtZSB0byBjb25uZWN0IHRvIChzdGFydGluZyBhIG5ldyBlbXVsYXRvciBpZiBub3QgYWxyZWFkeSBydW5uaW5nKS4gKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKiBSZXNvbHZlZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIHBvc3QtYm9vdCBkZXZpY2UtaWRsZSB3YWl0IChgMGAgc2tpcHMgaXQpLiAqL1xuICByZWFkb25seSBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuICovXG4gIHJlYWRvbmx5IGlzRW11bGF0b3JWaXNpYmxlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Yge0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkuZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdCB7XG4gIC8qKiBUaGUgYWN0dWFsIGRldmljZSBJRCB0aGF0IGlzIGNvbm5lY3RlZCAobWF5IGRpZmZlciBmcm9tIHRoZSByZXF1ZXN0ZWQgb25lKS4gKi9cbiAgcmVhZG9ubHkgYWN0dWFsRGV2aWNlSWQ6IHN0cmluZztcblxuICAvKiogVGhlIGVtdWxhdG9yIHByb2Nlc3MsIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLiAqL1xuICByZWFkb25seSBlbXVsYXRvclByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIGxvY2FsbHktaW5zdGFsbGVkIE9ic2lkaWFuIHNoZWxsIHJlc29sdmVkIGJ5IHtAbGluayByZXNvbHZlSW5zdGFsbGVkU2hlbGxPck51bGx9LlxuICovXG5pbnRlcmZhY2UgSW5zdGFsbGVkU2hlbGwge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgaW5zdGFsbGVkIHNoZWxsIGV4ZWN1dGFibGUuICovXG4gIHJlYWRvbmx5IGV4ZVBhdGg6IHN0cmluZztcblxuICAvKiogVGhlIGRldGVjdGVkIHNoZWxsIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgY2Fubm90IGJlIGRldGVybWluZWQuICovXG4gIHJlYWRvbmx5IHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LnN0YXJ0QXBwaXVtQW5kRW11bGF0b3J9LlxuICovXG5pbnRlcmZhY2UgU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyB7XG4gIC8qKiBSZXNvbHZlZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIHRvIGJlY29tZSByZWFkeS4gKi9cbiAgcmVhZG9ubHkgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLiAqL1xuICByZWFkb25seSBhcHBpdW1Vcmw6IFVSTDtcblxuICAvKiogQVZEIG5hbWUgdG8gc3RhcnQuICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKiogUmVzb2x2ZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBwb3N0LWJvb3QgZGV2aWNlLWlkbGUgd2FpdCAoYDBgIHNraXBzIGl0KS4gKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBjb25zb2xlIHdpbmRvdyBpcyBzaG93biAob21pdHRlZCBcdTIxOTIgaGlkZGVuKS4gKi9cbiAgcmVhZG9ubHkgaXNBcHBpdW1Db25zb2xlVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuICovXG4gIHJlYWRvbmx5IGlzRW11bGF0b3JWaXNpYmxlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgcG9ydC4gKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIEFwcGl1bSBhdXRvLXN0YXJ0IGlzIGFsbG93ZWQuICovXG4gIHJlYWRvbmx5IHNob3VsZEF1dG9TdGFydEFwcGl1bT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LnN0YXJ0QXBwaXVtQW5kRW11bGF0b3J9LlxuICovXG5pbnRlcmZhY2UgU3RhcnRBcHBpdW1BbmRFbXVsYXRvclJlc3VsdCB7XG4gIC8qKiBUaGUgYWN0dWFsIGRldmljZSBJRCB0aGF0IGlzIGNvbm5lY3RlZCAobWF5IGRpZmZlciBmcm9tIHRoZSByZXF1ZXN0ZWQgb25lKS4gKi9cbiAgcmVhZG9ubHkgYWN0dWFsRGV2aWNlSWQ6IHN0cmluZztcblxuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgcHJvY2VzcywgaWYgb25lIHdhcyBhdXRvLXN0YXJ0ZWQuICovXG4gIHJlYWRvbmx5IGFwcGl1bVByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRoZSBlbXVsYXRvciBwcm9jZXNzLCBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZC4gKi9cbiAgcmVhZG9ubHkgZW11bGF0b3JQcm9jZXNzPzogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xufVxuXG5sZXQgY2FjaGVkVHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFbmNhcHN1bGF0ZXMgYWxsIEFwcGl1bSB0cmFuc3BvcnQgY3JlYXRpb24gbG9naWMsIGluY2x1ZGluZyBBcHBpdW0gc2VydmVyXG4gKiBzdGFydHVwLCBlbXVsYXRvciBtYW5hZ2VtZW50LCBhbmQgV2ViRHJpdmVySU8gc2Vzc2lvbiBlc3RhYmxpc2htZW50LlxuICpcbiAqIFVzaW5nIGEgY2xhc3MgYXZvaWRzIHRocmVhZGluZyB0aGUgdHJhbnNwb3J0IGB0eXBlYCBsYWJlbCB0aHJvdWdoIGV2ZXJ5XG4gKiBoZWxwZXIgZnVuY3Rpb24gXHUyMDE0IGB0aGlzLmxvZygpYCBhdXRvbWF0aWNhbGx5IHByZWZpeGVzIGl0LlxuICovXG5jbGFzcyBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5IHtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZykge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBBcHBpdW0gdHJhbnNwb3J0IGJ5IGVzdGFibGlzaGluZyBhIFdlYkRyaXZlcklPIHNlc3Npb24uXG4gICAqXG4gICAqIElmIGBvcHRpb25zLnNlc3Npb25JZGAgaXMgcHJlc2VudCwgcmVhdHRhY2hlcyB0byB0aGUgZXhpc3Rpbmcgc2Vzc2lvblxuICAgKiBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS4gVGhpcyBhdm9pZHMgZHVwbGljYXRlIEFwcGl1bS9BREIgY29ubmVjdGlvbnNcbiAgICogd2hlbiB0ZXN0IHdvcmtlcnMgcmV1c2UgdGhlIGdsb2JhbCBzZXR1cCdzIHNlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQW5kcm9pZCBBcHBpdW0gdHJhbnNwb3J0IG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIEEgY29uZmlndXJlZCBBcHBpdW0gdHJhbnNwb3J0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZShvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICAgIGlmIChvcHRpb25zLnNlc3Npb25JZCAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuZGV2aWNlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0YWNoVG9FeGlzdGluZ1Nlc3Npb24ob3B0aW9ucy5zZXNzaW9uSWQsIG9wdGlvbnMuZGV2aWNlSWQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZU5ld1Nlc3Npb24ob3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGF0dGFjaFRvRXhpc3RpbmdTZXNzaW9uKFxuICAgIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIGRldmljZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9uc1xuICApOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRpb25zLmFwcGl1bVVybCk7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcih1cmwucG9ydCk7XG4gICAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkID8/IEFQUF9QQUNLQUdFO1xuXG4gICAgdGhpcy5sb2coYFJlYXR0YWNoaW5nIHRvIGV4aXN0aW5nIEFwcGl1bSBzZXNzaW9uICR7c2Vzc2lvbklkfSAoZGV2aWNlPSR7ZGV2aWNlSWR9KWApO1xuXG4gICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IGF0dGFjaCh7XG4gICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgcGxhdGZvcm1OYW1lOiAnQW5kcm9pZCdcbiAgICAgIH0sXG4gICAgICBob3N0bmFtZTogdXJsLmhvc3RuYW1lLFxuICAgICAgbG9nTGV2ZWw6ICd3YXJuJyxcbiAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgIHBvcnQsXG4gICAgICBzZXNzaW9uSWQsXG4gICAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBzdHJpcEZvcmJpZGRlbkZldGNoSGVhZGVyc1xuICAgIH0pO1xuXG4gICAgdGhpcy5sb2coJ1JlYXR0YWNoZWQgdG8gQXBwaXVtIHNlc3Npb24uJyk7XG5cbiAgICByZXR1cm4gbmV3IEFwcGl1bVRyYW5zcG9ydCh7XG4gICAgICBhcHBJZCxcbiAgICAgIGJyb3dzZXIsXG4gICAgICBkZXZpY2VJZCxcbiAgICAgIGlzU2Vzc2lvbk93bmVyOiBmYWxzZSxcbiAgICAgIHBsYXRmb3JtOiAnYW5kcm9pZCcsXG4gICAgICAuLi4ob3B0aW9ucy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSksXG4gICAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSksXG4gICAgICAuLi4ob3B0aW9ucy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSlcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsOiBVUkwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzVXJsID0gbmV3IFVSTCgnL3N0YXR1cycsIHVybCk7XG4gICAgICBjb25zdCByZXEgPSBodHRwLmdldChzdGF0dXNVcmwsIHsgdGltZW91dDogQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LCAocmVzKSA9PiB7XG4gICAgICAgIHJlcy5yZXN1bWUoKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgICByZXEub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICAgIHJlcS5kZXN0cm95KCk7XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59IGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmVxLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgcmVqZWN0KFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgcmVhY2ggQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59OiAke2Vyci5tZXNzYWdlfS4gSXMgdGhlIEFwcGl1bSBzZXJ2ZXIgcnVubmluZz9gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZU5ld1Nlc3Npb24ob3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgICB0aGlzLmxvZyhgQ3JlYXRpbmcgQXBwaXVtVHJhbnNwb3J0ICh1cmw9JHtvcHRpb25zLmFwcGl1bVVybH0sIGF2ZD0ke29wdGlvbnMuYXZkTmFtZX0pYCk7XG5cbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdGlvbnMuYXBwaXVtVXJsKTtcblxuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIodXJsLnBvcnQpO1xuICAgIGlmIChpc05hTihwb3J0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBvcnQgaW4gYXBwaXVtVXJsOiAke3VybC5wb3J0fWApO1xuICAgIH1cblxuICAgIGNvbnN0IGFwcElkID0gb3B0aW9ucy5hcHBJZCA/PyBBUFBfUEFDS0FHRTtcblxuICAgIGxldCBhcHBpdW1Qcm9jZXNzOiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGVtdWxhdG9yUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3RhcnRBcHBpdW1BbmRFbXVsYXRvcih7XG4gICAgICAgIGFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzOiByZXNvbHZlQXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMob3B0aW9ucyksXG4gICAgICAgIGFwcGl1bVVybDogdXJsLFxuICAgICAgICBhdmROYW1lOiBvcHRpb25zLmF2ZE5hbWUsXG4gICAgICAgIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHJlc29sdmVEZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgICAgICBpc0FwcGl1bUNvbnNvbGVWaXNpYmxlOiBvcHRpb25zLmlzQXBwaXVtQ29uc29sZVZpc2libGUsXG4gICAgICAgIGlzRW11bGF0b3JWaXNpYmxlOiBvcHRpb25zLmlzRW11bGF0b3JWaXNpYmxlLFxuICAgICAgICBwb3J0LFxuICAgICAgICBzaG91bGRBdXRvU3RhcnRBcHBpdW06IG9wdGlvbnMuc2hvdWxkQXV0b1N0YXJ0QXBwaXVtXG4gICAgICB9KTtcblxuICAgICAgYXBwaXVtUHJvY2VzcyA9IHJlc3VsdC5hcHBpdW1Qcm9jZXNzO1xuICAgICAgZW11bGF0b3JQcm9jZXNzID0gcmVzdWx0LmVtdWxhdG9yUHJvY2VzcztcbiAgICAgIGNvbnN0IGFjdHVhbERldmljZUlkID0gcmVzdWx0LmFjdHVhbERldmljZUlkO1xuXG4gICAgICBjb25zdCBzZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dCA9IHJlc29sdmVTZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpO1xuICAgICAgdGhpcy5sb2coXG4gICAgICAgIGBDb25uZWN0aW5nIHRvIEFwcGl1bSAoZGV2aWNlPSR7YWN0dWFsRGV2aWNlSWR9LCBhcHA9JHthcHBJZH0sIHJldHJ5VGltZW91dDogJHtTdHJpbmcoc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXQpfW1zLCByZXRyaWVzOiAke1N0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCl9KS4uLmBcbiAgICAgICk7XG4gICAgICBjb25zdCBicm93c2VyID0gYXdhaXQgcmVtb3RlKHtcbiAgICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgJ2FwcGl1bTphcHBBY3Rpdml0eSc6IEFQUF9BQ1RJVklUWSxcbiAgICAgICAgICAnYXBwaXVtOmFwcFBhY2thZ2UnOiBhcHBJZCxcbiAgICAgICAgICAnYXBwaXVtOmF1dG9HcmFudFBlcm1pc3Npb25zJzogdHJ1ZSxcbiAgICAgICAgICAnYXBwaXVtOmF1dG9tYXRpb25OYW1lJzogJ1VpQXV0b21hdG9yMicsXG4gICAgICAgICAgJ2FwcGl1bTpuZXdDb21tYW5kVGltZW91dCc6IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTpub1Jlc2V0JzogdHJ1ZSxcbiAgICAgICAgICAnYXBwaXVtOnVkaWQnOiBhY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgICAnYXBwaXVtOnVpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0JzogU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTp1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0JzogU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAncGxhdGZvcm1OYW1lJzogJ0FuZHJvaWQnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCxcbiAgICAgICAgY29ubmVjdGlvblJldHJ5VGltZW91dDogc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXQsXG4gICAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgdHJhbnNmb3JtUmVxdWVzdDogc3RyaXBGb3JiaWRkZW5GZXRjaEhlYWRlcnNcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmxvZygnQXBwaXVtIHNlc3Npb24gZXN0YWJsaXNoZWQuJyk7XG4gICAgICBjb25zdCBhcHBpdW1UcmFuc3BvcnQgPSBuZXcgQXBwaXVtVHJhbnNwb3J0KHtcbiAgICAgICAgYXBwSWQsXG4gICAgICAgIGJyb3dzZXIsXG4gICAgICAgIGRldmljZUlkOiBhY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgcGxhdGZvcm06ICdhbmRyb2lkJyxcbiAgICAgICAgLi4uKG9wdGlvbnMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzIH0pLFxuICAgICAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSksXG4gICAgICAgIC4uLihvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsRGlzcG9zZSA9IGFwcGl1bVRyYW5zcG9ydC5kaXNwb3NlLmJpbmQoYXBwaXVtVHJhbnNwb3J0KTtcbiAgICAgIGNvbnN0IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgPSBhcHBpdW1UcmFuc3BvcnQ7XG4gICAgICB0cmFuc3BvcnQuZGlzcG9zZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbERpc3Bvc2UoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdHJhbnNwb3J0LmRpc3Bvc2VTeW5jID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0cmFuc3BvcnQ7XG5cbiAgICAgIGZ1bmN0aW9uIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgICAgLy8gQ2Fubm90IHVzZSB0aGlzLmxvZyBpbnNpZGUgbmVzdGVkIGZ1bmN0aW9uIFx1MjAxNCBgdGhpc2AgaXMgbm90IGNhcHR1cmVkLlxuICAgICAgICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7b3B0aW9ucy50eXBlfV0gQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICAgICAga2lsbFByb2Nlc3NUcmVlKGVtdWxhdG9yUHJvY2Vzcyk7XG4gICAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHtvcHRpb25zLnR5cGV9XSBBdXRvLXN0YXJ0ZWQgZW11bGF0b3Igc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgIHRoaXMubG9nKCdLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgaWYgKGVtdWxhdG9yUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoZW11bGF0b3JQcm9jZXNzKTtcbiAgICAgICAgdGhpcy5sb2coJ0tpbGxlZCBhdXRvLXN0YXJ0ZWQgZW11bGF0b3IgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVEZXZpY2VDb25uZWN0ZWQocGFyYW1zOiBFbnN1cmVEZXZpY2VDb25uZWN0ZWRQYXJhbXMpOiBQcm9taXNlPEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdD4ge1xuICAgIGNvbnN0IHsgYXZkTmFtZSwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgaXNFbXVsYXRvclZpc2libGUgfSA9IHBhcmFtcztcbiAgICBjb25zdCBkZXZpY2VJZHNCZWZvcmUgPSBhd2FpdCB0aGlzLmdldENvbm5lY3RlZERldmljZUlkcygpO1xuICAgIHRoaXMubG9nKGBDaGVja2luZyBleGlzdGluZyBkZXZpY2VzIGZvciBBVkQgXCIke2F2ZE5hbWV9XCIuLi4gKGNvbm5lY3RlZDogWyR7ZGV2aWNlSWRzQmVmb3JlLmpvaW4oJywgJyl9XSlgKTtcblxuICAgIGNvbnN0IGV4aXN0aW5nRGV2aWNlSWQgPSBhd2FpdCB0aGlzLmZpbmREZXZpY2VCeUF2ZE5hbWUoYXZkTmFtZSwgZGV2aWNlSWRzQmVmb3JlKTtcblxuICAgIGlmIChleGlzdGluZ0RldmljZUlkKSB7XG4gICAgICB0aGlzLmxvZyhgQVZEIFwiJHthdmROYW1lfVwiIGlzIGFscmVhZHkgcnVubmluZyBvbiBkZXZpY2UgJHtleGlzdGluZ0RldmljZUlkfSwgcmV1c2luZy5gKTtcbiAgICAgIGF3YWl0IHRoaXMuc3VwcHJlc3NFcnJvckRpYWxvZ3MoZXhpc3RpbmdEZXZpY2VJZCk7XG4gICAgICByZXR1cm4geyBhY3R1YWxEZXZpY2VJZDogZXhpc3RpbmdEZXZpY2VJZCB9O1xuICAgIH1cblxuICAgIHRoaXMubG9nKGBBVkQgXCIke2F2ZE5hbWV9XCIgbm90IGZvdW5kIG9uIGFueSBleGlzdGluZyBkZXZpY2UsIHN0YXJ0aW5nIGEgbmV3IGVtdWxhdG9yLi4uYCk7XG4gICAgY29uc3QgZW11bGF0b3IgPSB0aGlzLnN0YXJ0RW11bGF0b3IoYXZkTmFtZSwgaXNFbXVsYXRvclZpc2libGUpO1xuXG4gICAgbGV0IGFjdHVhbERldmljZUlkOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGFjdHVhbERldmljZUlkID0gYXdhaXQgdGhpcy53YWl0Rm9yTmV3RGV2aWNlKGRldmljZUlkc0JlZm9yZSwgZW11bGF0b3IsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBlbXVsYXRvci5zdG9wQ2FwdHVyZSgpO1xuICAgIH1cblxuICAgIHRoaXMubG9nKGBFbXVsYXRvciBcIiR7YXZkTmFtZX1cIiBzdGFydGVkLCBkZXZpY2UgJHthY3R1YWxEZXZpY2VJZH0gaXMgY29ubmVjdGVkLmApO1xuICAgIGF3YWl0IHRoaXMuc3VwcHJlc3NFcnJvckRpYWxvZ3MoYWN0dWFsRGV2aWNlSWQpO1xuICAgIHJldHVybiB7IGFjdHVhbERldmljZUlkLCBlbXVsYXRvclByb2Nlc3M6IGVtdWxhdG9yLnByb2Nlc3MgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmluZERldmljZUJ5QXZkTmFtZShhdmROYW1lOiBzdHJpbmcsIGRldmljZUlkczogc3RyaW5nW10pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGZvciAoY29uc3QgZGV2aWNlSWQgb2YgZGV2aWNlSWRzKSB7XG4gICAgICBjb25zdCBydW5uaW5nQXZkID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBleGVjRmlsZShcbiAgICAgICAgICAnYWRiJyxcbiAgICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdlbXUnLCAnYXZkJywgJ25hbWUnXSxcbiAgICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgICAoX2Vycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoc3Rkb3V0LnNwbGl0KCdcXG4nKVswXT8udHJpbSgpID8/ICcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHJ1bm5pbmdBdmQgPT09IGF2ZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGRldmljZUlkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldENvbm5lY3RlZERldmljZUlkcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBleGVjRmlsZSgnYWRiJywgWydkZXZpY2VzJ10sIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LCAoZXJyb3IsIHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gJ2FkYiBkZXZpY2VzJzogJHtlcnJvci5tZXNzYWdlfS4gSXMgQURCIGluc3RhbGxlZCBhbmQgaW4gUEFUSD9gKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICB0aGlzLmxvZyhgQURCIHN0ZGVycjogJHtzdGRlcnIudHJpbSgpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoc3Rkb3V0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgbGluZXMgPSBvdXRwdXQuc3BsaXQoJ1xcbicpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgICByZXR1cm4gbGluZXNcbiAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUuaW5jbHVkZXMoJ1xcdGRldmljZScpKVxuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zcGxpdCgnXFx0JylbMF0gPz8gJycpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZXZpY2VQcm9wKGRldmljZUlkOiBzdHJpbmcsIHByb3A6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShcbiAgICAgICAgJ2FkYicsXG4gICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2dldHByb3AnLCBwcm9wXSxcbiAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgIChlcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgLy8gUmV0dXJuIG5vIG91dHB1dCBvbiB0aW1lb3V0L2Vycm9yIChub3QgcGFydGlhbCBzdGRvdXQpIHNvIGEgbm9uLXJlc3BvbnNpdmUgZ3Vlc3QgcmVhZHMgYXMgXCJub3QgaWRsZVwiLlxuICAgICAgICAgIHJlc29sdmUoZXJyb3IgPyAnJyA6IHN0ZG91dCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxpc3RJbnN0YWxsZWRQYWNrYWdlcyhkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAnYWRiJyxcbiAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnY21kJywgJ3BhY2thZ2UnLCAnbGlzdCcsICdwYWNrYWdlcyddLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAvLyBSZXR1cm4gbm8gb3V0cHV0IG9uIHRpbWVvdXQvZXJyb3Igc28gYSBjaHVybmluZyBndWVzdCdzIHNsb3cvcGFydGlhbCBwYWNrYWdlIGxpc3QgY2FuJ3QgZmFsc2VseSByZWFkIGFzIGlkbGUuXG4gICAgICAgICAgcmVzb2x2ZShlcnJvciA/ICcnIDogc3Rkb3V0KTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7dGhpcy50eXBlfV0gJHttZXNzYWdlfWApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRW11bGF0b3JCaW5hcnkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZGtSb290ID0gcHJvY2Vzcy5lbnZbJ0FORFJPSURfSE9NRSddID8/IHByb2Nlc3MuZW52WydBTkRST0lEX1NES19ST09UJ107XG4gICAgaWYgKCFzZGtSb290KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgZmluZCBBbmRyb2lkIGVtdWxhdG9yOiBuZWl0aGVyIEFORFJPSURfSE9NRSBub3IgQU5EUk9JRF9TREtfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGpvaW4oc2RrUm9vdCwgJ2VtdWxhdG9yJywgJ2VtdWxhdG9yJyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRLZXlFdmVudChkZXZpY2VJZDogc3RyaW5nLCBrZXlDb2RlOiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdpbnB1dCcsICdrZXlldmVudCcsIFN0cmluZyhrZXlDb2RlKV0sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgICBgV2FybmluZzogZmFpbGVkIHRvICR7ZGVzY3JpcHRpb259IChrZXlldmVudCAke1N0cmluZyhrZXlDb2RlKX0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydEFwcGl1bUFuZEVtdWxhdG9yKHBhcmFtczogU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyk6IFByb21pc2U8U3RhcnRBcHBpdW1BbmRFbXVsYXRvclJlc3VsdD4ge1xuICAgIGNvbnN0IHsgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMsIGFwcGl1bVVybCwgYXZkTmFtZSwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgaXNBcHBpdW1Db25zb2xlVmlzaWJsZSwgaXNFbXVsYXRvclZpc2libGUsIHBvcnQsIHNob3VsZEF1dG9TdGFydEFwcGl1bSB9ID0gcGFyYW1zO1xuXG4gICAgbGV0IG5lZWRzQXBwaXVtU3RhcnQgPSBmYWxzZTtcblxuICAgIHRoaXMubG9nKGBDaGVja2luZyBBcHBpdW0gc2VydmVyIGF0ICR7YXBwaXVtVXJsLmhyZWZ9Li4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBpdW1SZWFjaGFibGUoYXBwaXVtVXJsKTtcbiAgICAgIHRoaXMubG9nKCdBcHBpdW0gc2VydmVyIGlzIHJlYWNoYWJsZS4nKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKHNob3VsZEF1dG9TdGFydEFwcGl1bSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBuZWVkc0FwcGl1bVN0YXJ0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBsZXQgYXBwaXVtUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5lZWRzQXBwaXVtU3RhcnQpIHtcbiAgICAgIHRoaXMubG9nKGBBcHBpdW0gbm90IHJlYWNoYWJsZSwgYXV0by1zdGFydGluZyBvbiBwb3J0ICR7U3RyaW5nKHBvcnQpfS4uLmApO1xuICAgICAgYXBwaXVtUHJvY2VzcyA9IHRoaXMuc3RhcnRBcHBpdW1TZXJ2ZXIocG9ydCwgaXNBcHBpdW1Db25zb2xlVmlzaWJsZSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFssIGRldmljZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIG5lZWRzQXBwaXVtU3RhcnRcbiAgICAgICAgICA/IHRoaXMud2FpdEZvckFwcGl1bVJlYWR5KGFwcGl1bVVybCwgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2coJ0F1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGlzIHJlYWR5LicpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgICAgdGhpcy5lbnN1cmVEZXZpY2VDb25uZWN0ZWQoeyBhdmROYW1lLCBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzLCBpc0VtdWxhdG9yVmlzaWJsZSB9KVxuICAgICAgXSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFjdHVhbERldmljZUlkOiBkZXZpY2VSZXN1bHQuYWN0dWFsRGV2aWNlSWQsXG4gICAgICAgIGFwcGl1bVByb2Nlc3MsXG4gICAgICAgIGVtdWxhdG9yUHJvY2VzczogZGV2aWNlUmVzdWx0LmVtdWxhdG9yUHJvY2Vzc1xuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgICAga2lsbFByb2Nlc3NUcmVlKGFwcGl1bVByb2Nlc3MpO1xuICAgICAgICB0aGlzLmxvZygnS2lsbGVkIGF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGFmdGVyIHN0YXJ0dXAgZmFpbHVyZS4nKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRBcHBpdW1TZXJ2ZXIocG9ydDogbnVtYmVyLCBpc0FwcGl1bUNvbnNvbGVWaXNpYmxlPzogYm9vbGVhbik6IENoaWxkUHJvY2VzcyB7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihgbnB4IGFwcGl1bSAtLWxvZy10aW1lc3RhbXAgLS1wb3J0ICR7U3RyaW5nKHBvcnQpfSAtLWFsbG93LWluc2VjdXJlPSR7Q0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFfWAsIHtcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAnaW5oZXJpdCcsICdpbmhlcml0J10sXG4gICAgICB3aW5kb3dzSGlkZTogc2hvdWxkSGlkZUFwcGl1bUNvbnNvbGUoaXNBcHBpdW1Db25zb2xlVmlzaWJsZSlcbiAgICB9KTtcblxuICAgIGNoaWxkLnVucmVmKCk7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEVtdWxhdG9yKGF2ZE5hbWU6IHN0cmluZywgaXNFbXVsYXRvclZpc2libGU/OiBib29sZWFuKTogRW11bGF0b3JMYXVuY2gge1xuICAgIGNvbnN0IGVtdWxhdG9yQmluYXJ5ID0gdGhpcy5yZXNvbHZlRW11bGF0b3JCaW5hcnkoKTtcbiAgICBjb25zdCBhcmdzID0gYnVpbGRFbXVsYXRvckFyZ3MoeyBhdmROYW1lLCBpc0hpZGRlbjogc2hvdWxkSGlkZUVtdWxhdG9yV2luZG93KGlzRW11bGF0b3JWaXNpYmxlKSB9KTtcbiAgICB0aGlzLmxvZyhgUnVubmluZzogJHtlbXVsYXRvckJpbmFyeX0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAvKlxuICAgICAqIFBpcGUgKHJhdGhlciB0aGFuIGlnbm9yZSkgc3Rkb3V0L3N0ZGVyciBzbyBhbiBlYXJseSBmYWlsdXJlIHN1Y2ggYXNcbiAgICAgKiBcIng4Nl82NCBlbXVsYXRpb24gY3VycmVudGx5IHJlcXVpcmVzIGhhcmR3YXJlIGFjY2VsZXJhdGlvblwiIGNhbiBiZVxuICAgICAqIHN1cmZhY2VkIGltbWVkaWF0ZWx5IGluc3RlYWQgb2Ygd2FpdGluZyBvdXQgdGhlIGZ1bGwgYm9vdCB0aW1lb3V0LlxuICAgICAqL1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oZW11bGF0b3JCaW5hcnksIGFyZ3MsIHtcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddXG4gICAgfSk7XG5cbiAgICBsZXQgY2FwdHVyZWRPdXRwdXQgPSAnJztcbiAgICBsZXQgZXhpdEluZm86IEVtdWxhdG9yRXhpdEluZm8gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGlzQ2FwdHVyaW5nID0gdHJ1ZTtcblxuICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGFwcGVuZE91dHB1dCk7XG4gICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgYXBwZW5kT3V0cHV0KTtcbiAgICBjaGlsZC5vbmNlKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgZXhpdEluZm8gPSB7IGNvZGUsIHNpZ25hbCB9O1xuICAgIH0pO1xuXG4gICAgY2hpbGQudW5yZWYoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBwcm9jZXNzOiBjaGlsZCxcbiAgICAgIHJlYWRFeGl0SW5mbzogKCkgPT4gZXhpdEluZm8sXG4gICAgICByZWFkT3V0cHV0OiAoKSA9PiBjYXB0dXJlZE91dHB1dCxcbiAgICAgIHN0b3BDYXB0dXJlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIExlYXZlIHRoZSBgZGF0YWAgbGlzdGVuZXJzIGF0dGFjaGVkIHNvIHRoZSBwaXBlcyBrZWVwIGRyYWluaW5nIChhXG4gICAgICAgICAqIGZ1bGwgT1MgcGlwZSBidWZmZXIgd291bGQgYmxvY2sgdGhlIGxvbmctcnVubmluZyBlbXVsYXRvcik7IHRoZSBmbGFnXG4gICAgICAgICAqIGp1c3QgZnJlZXplcyB0aGUgY2FwdHVyZWQgdGFpbCBvbmNlIHN0YXJ0dXAgaGFzIHN1Y2NlZWRlZC5cbiAgICAgICAgICovXG4gICAgICAgIGlzQ2FwdHVyaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGFwcGVuZE91dHB1dChjaHVuazogQnVmZmVyKTogdm9pZCB7XG4gICAgICBpZiAoIWlzQ2FwdHVyaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhcHR1cmVkT3V0cHV0ID0gKGNhcHR1cmVkT3V0cHV0ICsgY2h1bmsudG9TdHJpbmcoKSkuc2xpY2UoLUVNVUxBVE9SX09VVFBVVF9UQUlMX01BWF9MRU5HVEgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyB0aGUgZ3Vlc3QncyBjcmFzaC9BTlIgZGlhbG9ncyBvbiB0aGUgZ2l2ZW4gZGV2aWNlLlxuICAgKlxuICAgKiBBIHJlc291cmNlLXN0YXJ2ZWQgZW11bGF0b3IgY2FuIHJhaXNlIGEgXCJQcm9jZXNzIHN5c3RlbSBpc24ndCByZXNwb25kaW5nXCJcbiAgICogQU5SIChhbiBgQWN0aXZpdHlNYW5hZ2VyU2VydmljZWAgdGltZW91dCkgd2hvc2UgZGlhbG9nIG92ZXJsYXlzIHRoZSBVSS4gSWZcbiAgICogaXQgYXBwZWFycyBiZWZvcmUgQXBwaXVtIGF0dGFjaGVzLCBub3RoaW5nIGNhbiBkaXNtaXNzIGl0IGFuZCB0aGUgcnVuIGhhbmdzXG4gICAqIG9yIGZhaWxzIGludGVybWl0dGVudGx5LiBTZXR0aW5nIHRoZSBgaGlkZV9lcnJvcl9kaWFsb2dzYCBnbG9iYWwgXHUyMDE0IHRoZSBzYW1lXG4gICAqIGZsYWcgQW5kcm9pZCdzIG93biB0ZXN0IGluZnJhIHVzZXMgXHUyMDE0IHRlbGxzIGBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlYCB0b1xuICAgKiBuZXZlciBkcmF3IGNyYXNoL0FOUiBkaWFsb2dzLCBzbyB0aGUgQU5SIGNhbiBubyBsb25nZXIgYmxvY2sgYXV0b21hdGlvbi5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgZWFybGllc3QgcG9pbnQgYXQgd2hpY2ggdGhlIGZsYWcgY2FuIGJlIHNldDogdGhlIGZyYW1ld29ya1xuICAgKiAoYHN5c3RlbV9zZXJ2ZXJgKSBtdXN0IGJlIHVwIGJlZm9yZSBgc2V0dGluZ3MgcHV0YCB3b3Jrcywgc28gY2FsbGVycyBpbnZva2VcbiAgICogaXQgb25seSBhZnRlciBgc3lzLmJvb3RfY29tcGxldGVkYC4gSXQgbmFycm93cyBcdTIwMTQgYnV0IGNhbm5vdCBmdWxseSBjbG9zZSBcdTIwMTRcbiAgICogdGhlIHJhY2Ugd2l0aCBhbiBBTlIgdGhhdCBmaXJlcyBiZXR3ZWVuIGJvb3QgY29tcGxldGluZyBhbmQgdGhpcyBjYWxsOyBhXG4gICAqIHByZS1iYWtlZCBzbmFwc2hvdCB3aXRoIHRoZSBmbGFnIGFscmVhZHkgc2V0IGlzIHRoZSBvbmx5IHdheSB0byBlbGltaW5hdGVcbiAgICogaXQgZW50aXJlbHkuIEJlc3QtZWZmb3J0OiBhIGZhaWx1cmUgaXMgbG9nZ2VkLCBub3QgdGhyb3duLCBzaW5jZSBpdCBvbmx5XG4gICAqIHN1cHByZXNzZXMgYSBzeW1wdG9tLlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gY29uZmlndXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzdXBwcmVzc0Vycm9yRGlhbG9ncyhkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coYERpc2FibGluZyBjcmFzaC9BTlIgZGlhbG9ncyBvbiBkZXZpY2UgJHtkZXZpY2VJZH0gKHNldHRpbmdzIHB1dCBnbG9iYWwgaGlkZV9lcnJvcl9kaWFsb2dzIDEpLi4uYCk7XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdzZXR0aW5ncycsICdwdXQnLCAnZ2xvYmFsJywgJ2hpZGVfZXJyb3JfZGlhbG9ncycsICcxJ10sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgICBgV2FybmluZzogZmFpbGVkIHRvIGRpc2FibGUgY3Jhc2gvQU5SIGRpYWxvZ3M6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcid9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JBcHBpdW1SZWFkeSh1cmw6IFVSTCwgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgQXBwaXVtIGF0ICR7dXJsLmhyZWZ9ICh0aW1lb3V0OiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLCBwb2xsOiAke1N0cmluZyhBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmBcbiAgICApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gc3RhcnQgKyB0aW1lb3V0SW5NaWxsaXNlY29uZHM7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybCk7XG4gICAgICAgIHRoaXMubG9nKGBBcHBpdW0gc2VydmVyIHJlYWR5IGFmdGVyICR7U3RyaW5nKERhdGUubm93KCkgLSBzdGFydCl9bXMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aGlzLmxvZyhgQXBwaXVtIHNlcnZlciBub3QgcmVhZHkgeWV0IChlbGFwc2VkOiAke1N0cmluZyhEYXRlLm5vdygpIC0gc3RhcnQpfW1zKS4gUmV0cnlpbmcuLi5gKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcodGltZW91dEluTWlsbGlzZWNvbmRzKX1tc2BcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQm9vdChkZXZpY2VJZDogc3RyaW5nLCBkZWFkbGluZTogbnVtYmVyLCBlbXVsYXRvcjogRW11bGF0b3JMYXVuY2gpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZW1haW5pbmdNcyA9IE1hdGgubWF4KDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSk7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGZpbmlzaCBib290aW5nIChyZW1haW5pbmc6ICR7U3RyaW5nKHJlbWFpbmluZ01zKX1tcywgcG9sbDogJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBpc0Jvb3RlZCA9IGF3YWl0IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAgICdhZGInLFxuICAgICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2dldHByb3AnLCAnc3lzLmJvb3RfY29tcGxldGVkJ10sXG4gICAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgICAgKF9lcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHN0ZG91dC50cmltKCkgPT09ICcxJyk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpc0Jvb3RlZCkge1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGJvb3QgY29tcGxldGVkLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXRJbmZvID0gZW11bGF0b3IucmVhZEV4aXRJbmZvKCk7XG4gICAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJ1aWxkRW11bGF0b3JFeGl0TWVzc2FnZShleGl0SW5mbywgZW11bGF0b3IucmVhZE91dHB1dCgpKSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBjb25uZWN0ZWQgYnV0IGRpZCBub3QgZmluaXNoIGJvb3Rpbmcgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciBhIGZyZXNobHktYm9vdGVkIGVtdWxhdG9yIHRvIGJlY29tZSBpZGxlIGJlZm9yZSB0aGUgc2Vzc2lvbiBpc1xuICAgKiBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogYHN5cy5ib290X2NvbXBsZXRlZGAgZmlyZXMgYmVmb3JlIHRoZSBndWVzdCBpcyBhY3R1YWxseSBpZGxlIFx1MjAxNCBwYWNrYWdlXG4gICAqIG9wdGltaXphdGlvbiBhbmQgc2VydmljZXMga2VlcCBjaHVybmluZyBcdTIwMTQgc28gZXN0YWJsaXNoaW5nIHRoZSBBcHBpdW1cbiAgICogc2Vzc2lvbiBpbW1lZGlhdGVseSBtYWtlcyBldmVyeSBzZXJpYWxpemVkIFVpQXV0b21hdG9yMiBgYWRiYCByb3VuZC10cmlwXG4gICAqIGNvbnRlbmQgd2l0aCB0aGF0IHdvcmsgYW5kIGluZmxhdGVzIHNlc3Npb24gZXN0YWJsaXNobWVudCB+M3guIFRoaXMgcG9sbHNcbiAgICogYSBsYXRlciwgcXVpZXRlciBzaWduYWwgKGJvb3QgYW5pbWF0aW9uIHN0b3BwZWQgKyBwYWNrYWdlIG1hbmFnZXIgc2VydmluZyxcbiAgICogdmlhIHtAbGluayBjaGVja0RldmljZUlkbGV9KSBhbmQgcmV0dXJucyBhcyBzb29uIGFzIGl0IGlzIHNhdGlzZmllZC5cbiAgICpcbiAgICogQmVzdC1lZmZvcnQ6IGlmIHRoZSBndWVzdCBkb2VzIG5vdCByZXBvcnQgaWRsZSB3aXRoaW4gdGhlIGJ1ZGdldCBpdCBsb2dzIGFcbiAgICogd2FybmluZyBhbmQgcHJvY2VlZHMgKGEgc2xvdyBzZXNzaW9uIGlzIGJldHRlciB0aGFuIGEgZmFpbGVkIHJ1biksIGFuZCBhXG4gICAqIGJ1ZGdldCBvZiBgMGAgc2tpcHMgdGhlIHdhaXQgZW50aXJlbHkuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRCB0byBwb2xsLlxuICAgKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gTWF4aW11bSB0aW1lIHRvIHdhaXQ7IGAwYCBza2lwcyB0aGUgd2FpdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckRldmljZUlkbGUoZGV2aWNlSWQ6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGltZW91dEluTWlsbGlzZWNvbmRzIDw9IDApIHtcbiAgICAgIHRoaXMubG9nKGBTa2lwcGluZyBwb3N0LWJvb3QgaWRsZSB3YWl0IGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gKHRpbWVvdXQgaXMgMCkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gc3RhcnQgKyB0aW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGJlY29tZSBpZGxlICh0aW1lb3V0OiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLCBwb2xsOiAke1N0cmluZyhERVZJQ0VfSURMRV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBbYm9vdEFuaW1hdGlvblByb3AsIHBhY2thZ2VMaXN0T3V0cHV0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdGhpcy5nZXREZXZpY2VQcm9wKGRldmljZUlkLCAnaW5pdC5zdmMuYm9vdGFuaW0nKSxcbiAgICAgICAgdGhpcy5saXN0SW5zdGFsbGVkUGFja2FnZXMoZGV2aWNlSWQpXG4gICAgICBdKTtcblxuICAgICAgaWYgKGNoZWNrRGV2aWNlSWRsZSh7IGJvb3RBbmltYXRpb25Qcm9wLCBwYWNrYWdlTGlzdE91dHB1dCB9KSkge1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGlzIGlkbGUgYWZ0ZXIgJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IG5vdCBpZGxlIHlldCAoZWxhcHNlZDogJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcykuIFJldHJ5aW5nLi4uYCk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIERFVklDRV9JRExFX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMubG9nKFxuICAgICAgYFdhcm5pbmc6IGRldmljZSAke2RldmljZUlkfSBkaWQgbm90IHJlcG9ydCBpZGxlIHdpdGhpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zOyBwcm9jZWVkaW5nIHdpdGggc2Vzc2lvbiBlc3RhYmxpc2htZW50IGFueXdheS5gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvck5ld0RldmljZShkZXZpY2VJZHNCZWZvcmU6IHN0cmluZ1tdLCBlbXVsYXRvcjogRW11bGF0b3JMYXVuY2gsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgYSBuZXcgZGV2aWNlIHRvIGFwcGVhciBpbiBBREIgKHRpbWVvdXQ6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1N0cmluZyhFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gXG4gICAgKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgY29uc3QgY3VycmVudElkcyA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGVkRGV2aWNlSWRzKCk7XG4gICAgICBjb25zdCBuZXdJZHMgPSBjdXJyZW50SWRzLmZpbHRlcigoaWQpID0+ICFkZXZpY2VJZHNCZWZvcmUuaW5jbHVkZXMoaWQpKTtcblxuICAgICAgaWYgKG5ld0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGFjdHVhbERldmljZUlkID0gbmV3SWRzWzBdID8/ICcnO1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7YWN0dWFsRGV2aWNlSWR9IGFwcGVhcmVkIGluIEFEQiwgd2FpdGluZyBmb3IgYm9vdCB0byBjb21wbGV0ZS4uLmApO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JCb290KGFjdHVhbERldmljZUlkLCBkZWFkbGluZSwgZW11bGF0b3IpO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JEZXZpY2VJZGxlKGFjdHVhbERldmljZUlkLCBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzKTtcbiAgICAgICAgYXdhaXQgdGhpcy53YWtlU2NyZWVuKGFjdHVhbERldmljZUlkKTtcbiAgICAgICAgcmV0dXJuIGFjdHVhbERldmljZUlkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleGl0SW5mbyA9IGVtdWxhdG9yLnJlYWRFeGl0SW5mbygpO1xuICAgICAgaWYgKGV4aXRJbmZvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihidWlsZEVtdWxhdG9yRXhpdE1lc3NhZ2UoZXhpdEluZm8sIGVtdWxhdG9yLnJlYWRPdXRwdXQoKSkpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE5vIG5ldyBlbXVsYXRvciBkZXZpY2UgYXBwZWFyZWQgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWtlU2NyZWVuKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZyhgV2FraW5nIHNjcmVlbiBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uLi5gKTtcblxuICAgIGF3YWl0IHRoaXMuc2VuZEtleUV2ZW50KGRldmljZUlkLCBLRVlDT0RFX1dBS0VVUCwgJ3dha2Ugc2NyZWVuJyk7XG4gICAgYXdhaXQgdGhpcy5zZW5kS2V5RXZlbnQoZGV2aWNlSWQsIEtFWUNPREVfTUVOVSwgJ2Rpc21pc3MgbG9jayBzY3JlZW4nKTtcblxuICAgIHRoaXMubG9nKGBTY3JlZW4gd2FrZSBjb21wbGV0ZSBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlbiBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIGFuIG93bmVkIGRlc2t0b3AgQ0RQIHRyYW5zcG9ydC5cbiAqIEByZXR1cm5zIEEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGNvbnN0IHR5cGUgPSBvcHRpb25zPy50eXBlID8/IERFRkFVTFRfVFJBTlNQT1JUX1RZUEU7XG5cbiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudHlwZSA9PT0gJ29ic2lkaWFuLWNkcCcpIHtcbiAgICByZXR1cm4gY3JlYXRlQ2RwVHJhbnNwb3J0KG9wdGlvbnMpO1xuICB9XG5cbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5KHR5cGUpO1xuICByZXR1cm4gZmFjdG9yeS5jcmVhdGUob3B0aW9ucyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhY2hlZCB0cmFuc3BvcnQgaW5zdGFuY2UsIGNyZWF0aW5nIG9uZSBmcm9tIHRoZSBnaXZlbiBvcHRpb25zXG4gKiBpZiBub3QgYWxyZWFkeSBjYWNoZWQuXG4gKlxuICogVGhlIHRyYW5zcG9ydCBpcyBjYWNoZWQgcGVyIHdvcmtlciBwcm9jZXNzIHNvIFdlYlNvY2tldC9BcHBpdW0gc2Vzc2lvbnNcbiAqIGFyZSByZXVzZWQgYWNyb3NzIGNhbGxzIHdpdGhpbiB0aGUgc2FtZSB0ZXN0IHdvcmtlci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBDTEkgdHJhbnNwb3J0LlxuICogQHJldHVybnMgVGhlIGNhY2hlZCBvciBuZXdseSBjcmVhdGVkIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlVHJhbnNwb3J0KG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGlmIChjYWNoZWRUcmFuc3BvcnQpIHtcbiAgICByZXR1cm4gY2FjaGVkVHJhbnNwb3J0O1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzIC0tIFNpbmdsZS10aHJlYWRlZCB3b3JrZXI7IG5vIGNvbmN1cnJlbnQgd3JpdGVzLlxuICBjYWNoZWRUcmFuc3BvcnQgPSByZXN1bHQ7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZSBmb3IgYW4gZW11bGF0b3IgcHJvY2VzcyB0aGF0IGV4aXRlZCBkdXJpbmdcbiAqIHN0YXJ0dXAsIGFwcGVuZGluZyB0aGUgY2FwdHVyZWQgb3V0cHV0IHRhaWwgd2hlbiBhdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIGV4aXRJbmZvIC0gVGhlIGVtdWxhdG9yJ3MgZXhpdCBkZXRhaWxzLlxuICogQHBhcmFtIG91dHB1dCAtIFRoZSBjYXB0dXJlZCBzdGRvdXQrc3RkZXJyIHRhaWwuXG4gKiBAcmV0dXJucyBBIGh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkRW11bGF0b3JFeGl0TWVzc2FnZShleGl0SW5mbzogRW11bGF0b3JFeGl0SW5mbywgb3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWFzb24gPSBleGl0SW5mby5zaWduYWwgPT09IG51bGxcbiAgICA/IGBleGl0ZWQgcHJlbWF0dXJlbHkgd2l0aCBjb2RlICR7U3RyaW5nKGV4aXRJbmZvLmNvZGUpfWBcbiAgICA6IGB3YXMgdGVybWluYXRlZCBieSBzaWduYWwgJHtleGl0SW5mby5zaWduYWx9YDtcbiAgY29uc3QgdHJpbW1lZE91dHB1dCA9IG91dHB1dC50cmltKCk7XG4gIGNvbnN0IGRldGFpbHMgPSB0cmltbWVkT3V0cHV0Lmxlbmd0aCA+IDBcbiAgICA/IGBcXG5cXG5FbXVsYXRvciBvdXRwdXQgKHRhaWwpOlxcbiR7dHJpbW1lZE91dHB1dH1gXG4gICAgOiAnJztcbiAgcmV0dXJuIGBBbmRyb2lkIGVtdWxhdG9yICR7cmVhc29ufSBkdXJpbmcgc3RhcnR1cC4ke2RldGFpbHN9YDtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBwcm9hY3RpdmUgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgY2hlY2sgZm9yIGFuIGFzYXItc3dhcCBhbmQgYWN0c1xuICogb24gdGhlIHZlcmRpY3Q6IHRocm93cyB7QGxpbmsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yfSBmb3IgYW5cbiAqIGluc3RhbGxlciBiZWxvdyB0aGUgYXBwJ3MgcnVuIGZsb29yLCBhbmQgbG9ncyBhIHdhcm5pbmcgZm9yIGFcbiAqIHJ1bm5hYmxlLWJ1dC1iZWxvdy1yZWNvbW1lbmRlZCBpbnN0YWxsZXIuXG4gKlxuICogQHBhcmFtIGFwcFZlcnNpb24gLSBUaGUgYXBwIChhc2FyKSB2ZXJzaW9uIHRoYXQgd2lsbCBiZSBzd2FwcGVkIG9udG8gdGhlIHNoZWxsLFxuICogICBvciBgdW5kZWZpbmVkYCB3aGVuIG5vIGFzYXItc3dhcCB3aWxsIGhhcHBlbiAobm90aGluZyBpcyBjaGVja2VkIHRoZW4pLlxuICogQHBhcmFtIGluc3RhbGxlclZlcnNpb24gLSBUaGUgcmVzb2x2ZWQgaW5zdGFsbGVyL3NoZWxsIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgLlxuICogQHJldHVybnMgVGhlIHZlcmRpY3QsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm8gYXNhci1zd2FwIHRvIGNoZWNrLlxuICovXG5mdW5jdGlvbiBjaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHkoXG4gIGFwcFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgaW5zdGFsbGVyVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkIHtcbiAgaWYgKGFwcFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBjb21wYXRpYmlsaXR5ID0gY2hlY2tJbnN0YWxsZXJDb21wYXRpYmlsaXR5KHtcbiAgICBhcHBWZXJzaW9uLFxuICAgIGluc3RhbGxlclZlcnNpb24sXG4gICAgbWV0YWRhdGE6IGdldFZlcnNpb25NZXRhZGF0YShhcHBWZXJzaW9uKVxuICB9KTtcblxuICBpZiAoY29tcGF0aWJpbGl0eS50aWVyID09PSAndW5ydW5uYWJsZScpIHtcbiAgICB0aHJvdyBuZXcgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yKHtcbiAgICAgIGFwcFZlcnNpb246IGNvbXBhdGliaWxpdHkuYXBwVmVyc2lvbixcbiAgICAgIGluc3RhbGxlclZlcnNpb246IGVuc3VyZU5vbk51bGxhYmxlKGNvbXBhdGliaWxpdHkuaW5zdGFsbGVyVmVyc2lvbiksXG4gICAgICBtaW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb246IGVuc3VyZU5vbk51bGxhYmxlKGNvbXBhdGliaWxpdHkubWluUnVubmFibGVJbnN0YWxsZXJWZXJzaW9uKVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGNvbXBhdGliaWxpdHkudGllciA9PT0gJ25hZ2dlZCcpIHtcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdICR7ZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5tZXNzYWdlKX1gKTtcbiAgfVxuXG4gIHJldHVybiBjb21wYXRpYmlsaXR5O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkZXNrdG9wIENEUCB0cmFuc3BvcnQuIFdoZW4gYW4gZXhwbGljaXQgYHBvcnRgIGlzIGdpdmVuIHRoZVxuICogdHJhbnNwb3J0IGF0dGFjaGVzIHRvIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiBvbiB0aGF0IHBvcnQ7IG90aGVyd2lzZSBpdFxuICogbGF1bmNoZXMgYW5kIG93bnMgYW4gaXNvbGF0ZWQgaW5zdGFuY2UgKHRoZSBkZWZhdWx0LCBoZXJtZXRpYyBtb2RlKS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENEUCB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgY29uZmlndXJlZCBDRFAgdHJhbnNwb3J0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVDZHBUcmFuc3BvcnQob3B0aW9ucz86IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKG9wdGlvbnM/LnBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG93bmVkU3VmZml4ID0gb3B0aW9ucy5pc0hhcm5lc3NPd25lZEluc3RhbmNlID8gJyAoaGFybmVzcy1vd25lZCknIDogJyc7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6b2JzaWRpYW4tY2RwXSBBdHRhY2hpbmcgdG8gcnVubmluZyBPYnNpZGlhbiR7b3duZWRTdWZmaXh9IChob3N0PSR7b3B0aW9ucy5ob3N0ID8/ICdsb2NhbGhvc3QnfSwgcG9ydD0ke1N0cmluZyhvcHRpb25zLnBvcnQpfSlgKTtcbiAgICByZXR1cm4gbmV3IERlc2t0b3BDZHBUcmFuc3BvcnQoe1xuICAgICAgLi4uKG9wdGlvbnMuaG9zdCAhPT0gdW5kZWZpbmVkICYmIHsgY2RwSG9zdDogb3B0aW9ucy5ob3N0IH0pLFxuICAgICAgY2RwUG9ydDogb3B0aW9ucy5wb3J0LFxuICAgICAgLi4uKG9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzIH0pLFxuICAgICAgLi4uKG9wdGlvbnMuaXNIYXJuZXNzT3duZWRJbnN0YW5jZSAhPT0gdW5kZWZpbmVkICYmIHsgaXNIYXJuZXNzT3duZWRJbnN0YW5jZTogb3B0aW9ucy5pc0hhcm5lc3NPd25lZEluc3RhbmNlIH0pXG4gICAgfSk7XG4gIH1cblxuICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdIENyZWF0aW5nIG93bmVkIGlzb2xhdGVkIE9ic2lkaWFuIGluc3RhbmNlJyk7XG4gIGNvbnN0IG93bmVkSW5zdGFuY2UgPSBhd2FpdCByZXNvbHZlT3duZWRJbnN0YW5jZUNvbmZpZyhvcHRpb25zKTtcbiAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KHtcbiAgICAuLi4ob3B0aW9ucz8uaG9zdCAhPT0gdW5kZWZpbmVkICYmIHsgY2RwSG9zdDogb3B0aW9ucy5ob3N0IH0pLFxuICAgIC4uLihvcHRpb25zPy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSksXG4gICAgZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzOiByZXNvbHZlRGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgIC4uLihvcHRpb25zPy5pc09ic2lkaWFuQXBwVmlzaWJsZSAhPT0gdW5kZWZpbmVkICYmIHsgaXNPYnNpZGlhbkFwcFZpc2libGU6IG9wdGlvbnMuaXNPYnNpZGlhbkFwcFZpc2libGUgfSksXG4gICAgb3duZWRJbnN0YW5jZSxcbiAgICAuLi4ob3B0aW9ucz8uc2hvdWxkRGlzYWJsZVNhbmRib3ggIT09IHVuZGVmaW5lZCAmJiB7IHNob3VsZERpc2FibGVTYW5kYm94OiBvcHRpb25zLnNob3VsZERpc2FibGVTYW5kYm94IH0pXG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmcmVzaCwgaXNvbGF0ZWQgdXNlci1kYXRhIGRpcmVjdG9yeSBmb3IgYW4gb3duZWQgaW5zdGFuY2UuXG4gKlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIG5ldyBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU93bmVkVXNlckRhdGFEaXIoKTogc3RyaW5nIHtcbiAgY29uc3Qgcm9vdCA9IGpvaW4odG1wZGlyKCksICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJyk7XG4gIG1rZGlyU3luYyhyb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgcmV0dXJuIG1rZHRlbXBTeW5jKGpvaW4ocm9vdCwgT1dORURfVVNFUl9EQVRBX1BSRUZJWCkpO1xufVxuXG4vKipcbiAqIERlY2lkZXMgaG93IHRoZSByZXF1ZXN0ZWQgYXBwIChhc2FyKSB2ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCB0byBhbiBvd25lZFxuICogaW5zdGFuY2UsIHdpdGhvdXQgZG93bmxvYWRpbmcgYW55dGhpbmcgeWV0OiBhbiB1cGdyYWRlLW9ubHkgYXNhci1zd2FwIG9udG8gdGhlXG4gKiBzaGVsbCwgYSBkb3duZ3JhZGUgdG8gdGhlIGFwcCdzIG93biBpbnN0YWxsZXIgc2hlbGwsIG9yIHRoZSB1c2VyJ3MgbmV3ZXN0XG4gKiBpbnN0YWxsZWQgYXNhciB3aGVuIG5laXRoZXIgdmVyc2lvbiBpcyBwaW5uZWQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDRFAgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcGFyYW0gc2hlbGxWZXJzaW9uIC0gVGhlIHJlc29sdmVkIGluc3RhbGxlci9zaGVsbCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYC5cbiAqIEByZXR1cm5zIFRoZSBhc2FyIHBsYW4gKGF0IG1vc3Qgb25lIG9mIGl0cyBmaWVsZHMgaXMgc2V0KS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUFzYXJQbGFuKFxuICBvcHRpb25zOiBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPEFzYXJQbGFuPiB7XG4gIGlmIChvcHRpb25zPy5vYnNpZGlhblZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGFzYXJWZXJzaW9uID0gYXdhaXQgcmVzb2x2ZUNvbmNyZXRlVmVyc2lvbihvcHRpb25zLm9ic2lkaWFuVmVyc2lvbik7XG4gICAgaWYgKHNoZWxsVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIGNvbXBhcmVWZXJzaW9ucyhhc2FyVmVyc2lvbiwgc2hlbGxWZXJzaW9uKSA+PSAwKSB7XG4gICAgICByZXR1cm4geyBhc2FyVmVyc2lvblRvU3dhcDogYXNhclZlcnNpb24gfTtcbiAgICB9XG5cbiAgICAvLyBBc2FyLXN3YXAgaXMgdXBncmFkZS1vbmx5LCBzbyBpdCBjYW5ub3QgYXBwbHkgYSB2ZXJzaW9uIG9sZGVyIHRoYW4gdGhlXG4gICAgLy8gU2hlbGwncyBidW5kbGVkIG9uZSBcdTIwMTQgYW5kIHdoZW4gdGhlIHNoZWxsIHZlcnNpb24gaXMgdW5rbm93biAoYSBMaW51eFxuICAgIC8vIFBhdGgtcGFyc2UgbWlzcykgd2UgY2Fubm90IHByb3ZlIHRoZSBzd2FwIHdvdWxkIGFwcGx5IGF0IGFsbC4gSW4gYm90aFxuICAgIC8vIENhc2VzIHVzZSB0aGUgcmVxdWVzdGVkIHZlcnNpb24ncyBvd24gaW5zdGFsbGVyIHNoZWxsLCB3aG9zZSBidW5kbGVkIGFzYXJcbiAgICAvLyBJcyBleGFjdGx5IHRoaXMgdmVyc2lvbiwgc28gdGhlIHBpbiBpcyBhbHdheXMgaG9ub3JlZC5cbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdIFVzaW5nIHRoZSAke2FzYXJWZXJzaW9ufSBpbnN0YWxsZXIgc2hlbGwgKHNoZWxsIHZlcnNpb24gJHtzaGVsbFZlcnNpb24gPz8gJ3Vua25vd24nfTsgYXNhci1zd2FwIGlzIHVwZ3JhZGUtb25seSkuYCk7XG4gICAgcmV0dXJuIHsgZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbjogYXNhclZlcnNpb24gfTtcbiAgfVxuXG4gIGlmIChvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG5ld2VzdCA9IGZpbmROZXdlc3RBc2FyKGdldE9ic2lkaWFuQ29uZmlnRGlyKCkpO1xuICAgIGlmIChuZXdlc3QgJiYgKHNoZWxsVmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8IGNvbXBhcmVWZXJzaW9ucyhuZXdlc3QudmVyc2lvbiwgc2hlbGxWZXJzaW9uKSA+PSAwKSkge1xuICAgICAgcmV0dXJuIHsgYXNhcjogeyBwYXRoOiBuZXdlc3QucGF0aCwgdmVyc2lvbjogbmV3ZXN0LnZlcnNpb24gfSB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7fTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgbG9jYWxseS1pbnN0YWxsZWQgT2JzaWRpYW4gc2hlbGwsIHRvbGVyYXRpbmcgaXRzIGFic2VuY2UuXG4gKlxuICogVW5saWtlIHtAbGluayByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlfSAod2hpY2ggdGhyb3dzIHdoZW4gT2JzaWRpYW4gaXMgbm90XG4gKiBpbnN0YWxsZWQpLCB0aGlzIHJldHVybnMgYHVuZGVmaW5lZGAgaW4gdGhhdCBjYXNlLCBzbyBhIGNhbGxlciBwaW5uaW5nIGFuXG4gKiBpbnN0YWxsZXIgdmVyc2lvbiBjYW4gZmFsbCBiYWNrIHRvIGRvd25sb2FkaW5nIHRoZSBwaW5uZWQgc2hlbGwgaW5zdGVhZCBvZlxuICogZmFpbGluZyBvbiBhIGhvc3Qgd2l0aCBubyBPYnNpZGlhbiBpbnN0YWxsZWQgKGUuZy4gQ0kpLlxuICpcbiAqIEByZXR1cm5zIFRoZSBpbnN0YWxsZWQgc2hlbGwncyBwYXRoIGFuZCBkZXRlY3RlZCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuXG4gKiAgIG5vIE9ic2lkaWFuIGlzIGluc3RhbGxlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUluc3RhbGxlZFNoZWxsT3JOdWxsKCk6IFByb21pc2U8SW5zdGFsbGVkU2hlbGwgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBleGVQYXRoID0gYXdhaXQgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZSgpO1xuICAgIHJldHVybiB7IGV4ZVBhdGgsIHNoZWxsVmVyc2lvbjogZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uKGV4ZVBhdGgpIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgc2hlbGwgZXhlY3V0YWJsZSwgYXNhciBwcm92aXNpb25pbmcsIGFuZCBpc29sYXRlZCB1c2VyLWRhdGEgZGlyXG4gKiBmb3IgYSBoYXJuZXNzLW93bmVkIGluc3RhbmNlIGZyb20gdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIGtub2JzLlxuICpcbiAqIC0gYG9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbmAgcGlucyB0aGUgRWxlY3Ryb24gc2hlbGwgKGRvd25sb2FkcyArIGV4dHJhY3RzIGFcbiAqICAgcG9ydGFibGUgYnVpbGQgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhlIGluc3RhbGxlZCBzaGVsbCkuXG4gKiAtIGBvYnNpZGlhblZlcnNpb25gIHBpbnMgdGhlIGFwcDogYW4gYXNhci1zd2FwIHdoZW4gaXQgaXMgPj0gdGhlIHNoZWxsIHZlcnNpb25cbiAqICAgKGNoZWFwKSwgb3RoZXJ3aXNlIHRoZSBtYXRjaGluZyBpbnN0YWxsZXIgc2hlbGwgaXMgdXNlZCAoZG93bmdyYWRlKS5cbiAqIC0gV2hlbiBuZWl0aGVyIGlzIHNldCwgdGhlIHVzZXIncyBuZXdlc3QgaW5zdGFsbGVkIGFzYXIgaXMgY29waWVkIGluIChzbyB0aGVcbiAqICAgb3duZWQgaW5zdGFuY2UgbWF0Y2hlcyB0aGUgdmVyc2lvbiB0aGUgdXNlciBjdXJyZW50bHkgcnVucykgd2l0aCB6ZXJvIG5ldHdvcmsuXG4gKlxuICogVGhlIGNvbmNyZXRlIChhcHAsIGluc3RhbGxlcikgdmVyc2lvbiBwYWlyIGlzIHJlc29sdmVkICpiZWZvcmUqIGFueSBzaGVsbC9hc2FyXG4gKiBkb3dubG9hZCwgc28gYSBwcm9hY3RpdmUgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgY2hlY2tcbiAqICh7QGxpbmsgY2hlY2tJbnN0YWxsZXJDb21wYXRpYmlsaXR5fSkgY2FuIGZhaWwgZmFzdDogYW4gaW5zdGFsbGVyIGJlbG93IHRoZVxuICogYXBwJ3MgcnVuIGZsb29yIHRocm93cyB7QGxpbmsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yfSBiZWZvcmVcbiAqIGFueXRoaW5nIGlzIGRvd25sb2FkZWQgb3IgbGF1bmNoZWQgKHN1cGVyc2VkaW5nIHRoZSByZWFjdGl2ZSBkZWFkLWJvb3RcbiAqIGZhc3QtZmFpbCBmb3IgdGFibGUta25vd24gY29tYm9zKSwgYW5kIGEgcnVubmFibGUtYnV0LWJlbG93LXJlY29tbWVuZGVkXG4gKiBpbnN0YWxsZXIgbG9ncyBhIHdhcm5pbmcuIFRoZSB2ZXJkaWN0IGlzIHRocmVhZGVkIG9udG8gdGhlIHJldHVybmVkIGNvbmZpZyBzb1xuICogdGhlIHRyYW5zcG9ydCBjYW4gc3VyZmFjZSBpdCBhcyBkYXRhLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ0RQIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIG93bmVkLWluc3RhbmNlIGNvbmZpZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU93bmVkSW5zdGFuY2VDb25maWcob3B0aW9ucz86IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T3duZWRJbnN0YW5jZUNvbmZpZz4ge1xuICAvLyBSZXNvbHZlIHRoZSBjb25jcmV0ZSBzaGVsbCAoaW5zdGFsbGVyKSB2ZXJzaW9uIGZpcnN0LCBidXQgZm9yIGEgcGlubmVkXG4gIC8vIEluc3RhbGxlciBERUZFUiByZXNvbHZpbmcvZG93bmxvYWRpbmcgdGhlIGFjdHVhbCBzaGVsbCB1bnRpbCBhZnRlciB0aGVcbiAgLy8gUHJvYWN0aXZlIGNvbXBhdGliaWxpdHkgY2hlY2ssIHNvIGFuIHVucnVubmFibGUgcGluIGZhaWxzIGZhc3QgXHUyMDE0IGJlZm9yZSB0aGVcbiAgLy8gKHBvc3NpYmx5IHNsb3cpIGluc3RhbGxlZC1zaGVsbCBkZXRlY3Rpb24gYW5kIGFueSBkb3dubG9hZC5cbiAgbGV0IGV4ZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgcGlubmVkSW5zdGFsbGVyVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZVBhdGggPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlKCk7XG4gICAgc2hlbGxWZXJzaW9uID0gZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uKGV4ZVBhdGgpO1xuICB9IGVsc2Uge1xuICAgIC8vIEEgcGlubmVkIGluc3RhbGxlciB2ZXJzaW9uIGZ1bGx5IGRldGVybWluZXMgdGhlIHNoZWxsIHZlcnNpb24gdXAgZnJvbnQsXG4gICAgLy8gV2l0aG91dCByZXF1aXJpbmcgYSBsb2NhbGx5LWluc3RhbGxlZCBPYnNpZGlhbiAoYSBDSSBydW5uZXIgaGFzIG5vbmUpLlxuICAgIHBpbm5lZEluc3RhbGxlclZlcnNpb24gPSBhd2FpdCByZXNvbHZlQ29uY3JldGVWZXJzaW9uKG9wdGlvbnMub2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uKTtcbiAgICBzaGVsbFZlcnNpb24gPSBwaW5uZWRJbnN0YWxsZXJWZXJzaW9uO1xuICB9XG5cbiAgLy8gRGVjaWRlIGhvdyB0aGUgYXBwIChhc2FyKSB2ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCwgc3RpbGwgV0lUSE9VVCBkb3dubG9hZGluZy5cbiAgY29uc3QgcGxhbiA9IGF3YWl0IHJlc29sdmVBc2FyUGxhbihvcHRpb25zLCBzaGVsbFZlcnNpb24pO1xuXG4gIC8vIFRoZSBhcHAgdmVyc2lvbiB0aGF0IHdpbGwgcnVuIGFzIGFuIGFzYXItc3dhcCBvbnRvIGBzaGVsbFZlcnNpb25gIFx1MjAxNCB0aGUgb25seVxuICAvLyBDb21iaW5hdGlvbiB0aGF0IGNhbiBkZWFkLWJvb3QuIFRoZSBkb3duZ3JhZGUgLyBvd24taW5zdGFsbGVyIHBhdGhzIHJ1biB0aGVcbiAgLy8gQXBwJ3Mgb3duIGluc3RhbGxlciBzaGVsbCwgc28gdGhleSBhbHdheXMgYm9vdCBhbmQgYXJlIG5vdCBjaGVja2VkLlxuICBjb25zdCBzd2FwQXBwVmVyc2lvbiA9IHBsYW4uYXNhclZlcnNpb25Ub1N3YXAgPz8gcGxhbi5hc2FyPy52ZXJzaW9uO1xuICBjb25zdCBjb21wYXRpYmlsaXR5ID0gY2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5KHN3YXBBcHBWZXJzaW9uLCBzaGVsbFZlcnNpb24pO1xuXG4gIC8vIFRoZSBwaW4gaXMga25vd24gcnVubmFibGUgXHUyMDE0IHJlc29sdmUvZG93bmxvYWQgdGhlIGRlZmVycmVkIHNoZWxsICsgYXNhciBub3cuXG4gIC8vIFJldXNlIHRoZSBpbnN0YWxsZWQgc2hlbGwgb25seSB3aGVuIGl0IGFscmVhZHkgbWF0Y2hlcyB0aGUgcGluIChzYXZlcyB0aGVcbiAgLy8gRG93bmxvYWQpOyBvdGhlcndpc2UgZG93bmxvYWQgYW5kIGV4dHJhY3QgdGhlIHBpbm5lZCBpbnN0YWxsZXIuXG4gIGlmIChwaW5uZWRJbnN0YWxsZXJWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBpbnN0YWxsZWQgPSBhd2FpdCByZXNvbHZlSW5zdGFsbGVkU2hlbGxPck51bGwoKTtcbiAgICBleGVQYXRoID0gaW5zdGFsbGVkPy5zaGVsbFZlcnNpb24gPT09IHBpbm5lZEluc3RhbGxlclZlcnNpb24gPyBpbnN0YWxsZWQuZXhlUGF0aCA6IGF3YWl0IGVuc3VyZVNoZWxsQ2FjaGVkKHBpbm5lZEluc3RhbGxlclZlcnNpb24pO1xuICB9XG4gIGlmIChwbGFuLmRvd25ncmFkZUluc3RhbGxlclZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZVBhdGggPSBhd2FpdCBlbnN1cmVTaGVsbENhY2hlZChwbGFuLmRvd25ncmFkZUluc3RhbGxlclZlcnNpb24pO1xuICB9XG5cbiAgY29uc3QgYXNhciA9IHBsYW4uYXNhclZlcnNpb25Ub1N3YXAgPT09IHVuZGVmaW5lZFxuICAgID8gcGxhbi5hc2FyXG4gICAgOiB7IHBhdGg6IGF3YWl0IGVuc3VyZUFzYXJDYWNoZWQocGxhbi5hc2FyVmVyc2lvblRvU3dhcCksIHZlcnNpb246IHBsYW4uYXNhclZlcnNpb25Ub1N3YXAgfTtcblxuICByZXR1cm4ge1xuICAgIC4uLihhc2FyICYmIHsgYXNhciB9KSxcbiAgICAuLi4oY29tcGF0aWJpbGl0eSAmJiB7IGNvbXBhdGliaWxpdHkgfSksXG4gICAgZXhlUGF0aDogZW5zdXJlTm9uTnVsbGFibGUoZXhlUGF0aCksXG4gICAgdXNlckRhdGFEaXI6IGNyZWF0ZU93bmVkVXNlckRhdGFEaXIoKVxuICB9O1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYENvbm5lY3Rpb25gIGFuZCBgQ29udGVudC1MZW5ndGhgIGZyb20gYSBXZWJEcml2ZXIgcmVxdWVzdCdzIGhlYWRlcnMuXG4gKlxuICogVGhlIGJ1bmRsZWQgYHdlYmRyaXZlcmAgcGFja2FnZSBzZXRzIGJvdGggaGVhZGVycyBleHBsaWNpdGx5LiBUaGV5IGFyZVxuICogZm9yYmlkZGVuIHJlcXVlc3QgaGVhZGVycyBwZXIgdGhlIEZldGNoIHNwZWM6IE5vZGUgdXAgdG8gMjUgYWNjZXB0ZWQgdGhlbVxuICogc2lsZW50bHksIGJ1dCBOb2RlIDI2IHJlamVjdHMgdGhlbSB3aXRoIGBVTkRfRVJSX0lOVkFMSURfQVJHYCwgYnJlYWtpbmcgdGhlXG4gKiBBcHBpdW0gYC9zZXNzaW9uYCByZXF1ZXN0LiBUaGUgdHJhbnNwb3J0IGxheWVyIG1hbmFnZXMgY29ubmVjdGlvbiByZXVzZSBhbmRcbiAqIHRoZSBGZXRjaCBBUEkgY29tcHV0ZXMgYENvbnRlbnQtTGVuZ3RoYCBmcm9tIHRoZSBib2R5LCBzbyBkcm9wcGluZyBib3RoIGlzXG4gKiBzYWZlIG9uIGV2ZXJ5IE5vZGUgdmVyc2lvbi4gU2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vd2ViZHJpdmVyaW8vd2ViZHJpdmVyaW8vaXNzdWVzLzE1MjY1fS5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdE9wdGlvbnMgLSBUaGUgcmVxdWVzdCBvcHRpb25zIGFib3V0IHRvIGJlIHNlbnQgYnkgV2ViRHJpdmVySU8uXG4gKiBAcmV0dXJucyBUaGUgc2FtZSByZXF1ZXN0IG9wdGlvbnMgd2l0aCB0aGUgZm9yYmlkZGVuIGhlYWRlcnMgcmVtb3ZlZC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBGb3JiaWRkZW5GZXRjaEhlYWRlcnMocmVxdWVzdE9wdGlvbnM6IFJlcXVlc3RJbml0KTogUmVxdWVzdEluaXQge1xuICBpZiAocmVxdWVzdE9wdGlvbnMuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICByZXF1ZXN0T3B0aW9ucy5oZWFkZXJzLmRlbGV0ZSgnQ29ubmVjdGlvbicpO1xuICAgIHJlcXVlc3RPcHRpb25zLmhlYWRlcnMuZGVsZXRlKCdDb250ZW50LUxlbmd0aCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlcXVlc3RPcHRpb25zO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVVBLGdDQUdPO0FBQ1AscUJB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UyxPQUFPLFFBQVEsRUFBRTtBQUFBLElBQ2hFO0FBQUEsRUFDRjtBQUVBLFNBQU8sQ0FBQztBQUNWO0FBYUEsZUFBZSw4QkFBbUU7QUFDaEYsTUFBSTtBQUNGLFVBQU0sVUFBVSxVQUFNLHNEQUEwQjtBQUNoRCxXQUFPLEVBQUUsU0FBUyxrQkFBYyx1REFBNEIsT0FBTyxFQUFFO0FBQUEsRUFDdkUsUUFBUTtBQUNOLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUF5QkEsZUFBZSwyQkFBMkIsU0FBcUU7QUFLN0csTUFBSTtBQUNKLE1BQUk7QUFDSixNQUFJO0FBRUosTUFBSSxTQUFTLDZCQUE2QixRQUFXO0FBQ25ELGNBQVUsVUFBTSxzREFBMEI7QUFDMUMsdUJBQWUsdURBQTRCLE9BQU87QUFBQSxFQUNwRCxPQUFPO0FBR0wsNkJBQXlCLFVBQU0sdURBQXVCLFFBQVEsd0JBQXdCO0FBQ3RGLG1CQUFlO0FBQUEsRUFDakI7QUFHQSxRQUFNLE9BQU8sTUFBTSxnQkFBZ0IsU0FBUyxZQUFZO0FBS3hELFFBQU0saUJBQWlCLEtBQUsscUJBQXFCLEtBQUssTUFBTTtBQUM1RCxRQUFNLGdCQUFnQiw0QkFBNEIsZ0JBQWdCLFlBQVk7QUFLOUUsTUFBSSwyQkFBMkIsUUFBVztBQUN4QyxVQUFNLFlBQVksTUFBTSw0QkFBNEI7QUFDcEQsY0FBVSxXQUFXLGlCQUFpQix5QkFBeUIsVUFBVSxVQUFVLFVBQU0sNkNBQWtCLHNCQUFzQjtBQUFBLEVBQ25JO0FBQ0EsTUFBSSxLQUFLLDhCQUE4QixRQUFXO0FBQ2hELGNBQVUsVUFBTSw2Q0FBa0IsS0FBSyx5QkFBeUI7QUFBQSxFQUNsRTtBQUVBLFFBQU0sT0FBTyxLQUFLLHNCQUFzQixTQUNwQyxLQUFLLE9BQ0wsRUFBRSxNQUFNLFVBQU0saURBQWlCLEtBQUssaUJBQWlCLEdBQUcsU0FBUyxLQUFLLGtCQUFrQjtBQUU1RixTQUFPO0FBQUEsSUFDTCxHQUFJLFFBQVEsRUFBRSxLQUFLO0FBQUEsSUFDbkIsR0FBSSxpQkFBaUIsRUFBRSxjQUFjO0FBQUEsSUFDckMsYUFBUyxzQ0FBa0IsT0FBTztBQUFBLElBQ2xDLGFBQWEsdUJBQXVCO0FBQUEsRUFDdEM7QUFDRjtBQWVBLFNBQVMsMkJBQTJCLGdCQUEwQztBQUM1RSxNQUFJLGVBQWUsbUJBQW1CLFNBQVM7QUFDN0MsbUJBQWUsUUFBUSxPQUFPLFlBQVk7QUFDMUMsbUJBQWUsUUFBUSxPQUFPLGdCQUFnQjtBQUFBLEVBQ2hEO0FBRUEsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogWyJodHRwIiwgImtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcyIsICJwcm9jZXNzIl0KfQo=
749
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHtcbiAgYXR0YWNoLFxuICByZW1vdGVcbn0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5LmNqcyc7XG5pbXBvcnQgdHlwZSB7IE93bmVkSW5zdGFuY2VDb25maWcgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5janMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHtcbiAgcmVzb2x2ZUFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzLFxuICByZXNvbHZlU2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xufSBmcm9tICcuL2FwcGl1bS1zZXNzaW9uLWNvbmZpZy5janMnO1xuaW1wb3J0IHtcbiAgY2hlY2tEZXZpY2VJZGxlLFxuICByZXNvbHZlRGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xufSBmcm9tICcuL2RldmljZS1yZWFkaW5lc3MuY2pzJztcbmltcG9ydCB7IGJ1aWxkRW11bGF0b3JBcmdzIH0gZnJvbSAnLi9lbXVsYXRvci1hcmdzLmNqcyc7XG5pbXBvcnQgeyBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3IgfSBmcm9tICcuL2luY29tcGF0aWJsZS1pbnN0YWxsZXItdmVyc2lvbi1lcnJvci5janMnO1xuaW1wb3J0IHsgY2hlY2tJbnN0YWxsZXJDb21wYXRpYmlsaXR5IH0gZnJvbSAnLi9pbnN0YWxsZXItY29tcGF0aWJpbGl0eS5janMnO1xuaW1wb3J0IHsga2lsbFByb2Nlc3NUcmVlIH0gZnJvbSAnLi9raWxsLXByb2Nlc3MtdHJlZS5janMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cuY2pzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuQ29uZmlnRGlyIH0gZnJvbSAnLi9vYnNpZGlhbi1jb25maWcuY2pzJztcbmltcG9ydCB7IHJlc29sdmVPYnNpZGlhbkV4ZWN1dGFibGUgfSBmcm9tICcuL29ic2lkaWFuLWV4ZWN1dGFibGUuY2pzJztcbmltcG9ydCB7XG4gIGRldGVjdEluc3RhbGxlZFNoZWxsVmVyc2lvbixcbiAgZW5zdXJlU2hlbGxDYWNoZWRcbn0gZnJvbSAnLi9vYnNpZGlhbi1pbnN0YWxsZXIuY2pzJztcbmltcG9ydCB7IGdldFZlcnNpb25NZXRhZGF0YSB9IGZyb20gJy4vb2JzaWRpYW4tbWV0YWRhdGEuY2pzJztcbmltcG9ydCB7XG4gIGVuc3VyZUFzYXJDYWNoZWQsXG4gIGZpbmROZXdlc3RBc2FyLFxuICByZXNvbHZlQ29uY3JldGVWZXJzaW9uXG59IGZyb20gJy4vb2JzaWRpYW4tdmVyc2lvbi1zd2l0Y2guY2pzJztcbmltcG9ydCB7IGNvbXBhcmVWZXJzaW9ucyB9IGZyb20gJy4vb2JzaWRpYW4tdmVyc2lvbi5janMnO1xuaW1wb3J0IHsgcmVzb2x2ZURlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcyB9IGZyb20gJy4vcmVuZGVyZXItYm9vdC1kZXRlY3Rpb24uY2pzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5janMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLmNqcyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4vdHlwZS1ndWFyZHMuY2pzJztcbmltcG9ydCB7XG4gIHNob3VsZEhpZGVBcHBpdW1Db25zb2xlLFxuICBzaG91bGRIaWRlRW11bGF0b3JXaW5kb3dcbn0gZnJvbSAnLi92aXNpYmlsaXR5LmNqcyc7XG5cbmNvbnN0IEFQUF9QQUNLQUdFID0gJ21kLm9ic2lkaWFuJztcbmNvbnN0IEFQUF9BQ1RJVklUWSA9IGAke0FQUF9QQUNLQUdFfS5NYWluQWN0aXZpdHlgO1xuY29uc3QgQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCA9IDM7XG5jb25zdCBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IE9XTkVEX1VTRVJfREFUQV9QUkVGSVggPSAndXNlcmRhdGEtJztcbi8vIEFwcGl1bSBpbnNlY3VyZSBmZWF0dXJlIGxldHRpbmcgdGhlIFVpQXV0b21hdG9yMiBkcml2ZXIgYXV0by1kb3dubG9hZCBhXG4vLyBDaHJvbWVkcml2ZXIgbWF0Y2hpbmcgT2JzaWRpYW4ncyBXZWJWaWV3IENocm9tZSB2ZXJzaW9uLiBFbmFibGluZyBpdCBvbiB0aGVcbi8vIEFwcGl1bSBzZXJ2ZXIgKGl0IGhhcyBubyBlZmZlY3QgYXMgYSBjYXBhYmlsaXR5KSBhdm9pZHMgdGhlIGZhaWx1cmVcbi8vIFwiTm8gQ2hyb21lZHJpdmVyIGZvdW5kIHRoYXQgY2FuIGF1dG9tYXRlIENocm9tZSAuLi5cIi5cbmNvbnN0IENIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRSA9ICd1aWF1dG9tYXRvcjI6Y2hyb21lZHJpdmVyX2F1dG9kb3dubG9hZCc7XG5jb25zdCBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuY29uc3QgREVGQVVMVF9UUkFOU1BPUlRfVFlQRSA9ICdvYnNpZGlhbi1jZHAnO1xuY29uc3QgREVWSUNFX0lETEVfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgRU1VTEFUT1JfT1VUUFVUX1RBSUxfTUFYX0xFTkdUSCA9IDgwMDA7XG5jb25zdCBLRVlDT0RFX01FTlUgPSA4MjtcbmNvbnN0IEtFWUNPREVfV0FLRVVQID0gMjI0O1xuY29uc3QgU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjAwMDA7XG5jb25zdCBTRVJWRVJfTEFVTkNIX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuXG4vKipcbiAqIEhvdyB0aGUgcmVxdWVzdGVkIGFwcCAoYXNhcikgdmVyc2lvbiB3aWxsIGJlIGFwcGxpZWQgdG8gYW4gb3duZWQgaW5zdGFuY2U7IGF0XG4gKiBtb3N0IG9uZSBmaWVsZCBpcyBzZXQgKHNlZSB7QGxpbmsgcmVzb2x2ZUFzYXJQbGFufSkuXG4gKi9cbmludGVyZmFjZSBBc2FyUGxhbiB7XG4gIC8qKiBUaGUgdXNlcidzIG5ld2VzdCBpbnN0YWxsZWQgYXNhciB0byBwcm92aXNpb24gYXMtaXMgKG5vIGRvd25sb2FkKS4gKi9cbiAgcmVhZG9ubHkgYXNhcj86IE93bmVkSW5zdGFuY2VDb25maWdbJ2FzYXInXTtcblxuICAvKiogVGhlIGFwcCB2ZXJzaW9uIHRvIGRvd25sb2FkIGFuZCBhc2FyLXN3YXAgb250byB0aGUgc2hlbGwuICovXG4gIHJlYWRvbmx5IGFzYXJWZXJzaW9uVG9Td2FwPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBUaGUgYXBwIHZlcnNpb24gd2hvc2Ugb3duIGluc3RhbGxlciBzaGVsbCB0byBkb3dubG9hZCAoYSBkb3duZ3JhZGUpLiAqL1xuICByZWFkb25seSBkb3duZ3JhZGVJbnN0YWxsZXJWZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIERldGFpbHMgb2YgYW4gZW11bGF0b3IgcHJvY2VzcyB0aGF0IGhhcyBleGl0ZWQuXG4gKi9cbmludGVyZmFjZSBFbXVsYXRvckV4aXRJbmZvIHtcbiAgLyoqIEV4aXQgY29kZSwgb3IgYG51bGxgIGlmIHRoZSBwcm9jZXNzIHdhcyB0ZXJtaW5hdGVkIGJ5IGEgc2lnbmFsLiAqL1xuICBjb2RlOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKiBUZXJtaW5hdGluZyBzaWduYWwsIG9yIGBudWxsYCBpZiB0aGUgcHJvY2VzcyBleGl0ZWQgbm9ybWFsbHkuICovXG4gIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsO1xufVxuXG4vKipcbiAqIEEgc3Bhd25lZCBlbXVsYXRvciBwcm9jZXNzIHRvZ2V0aGVyIHdpdGggaGVscGVycyB0byBpbnNwZWN0IGl0cyBjYXB0dXJlZFxuICogb3V0cHV0IGFuZCBleGl0IHN0YXR1cy5cbiAqL1xuaW50ZXJmYWNlIEVtdWxhdG9yTGF1bmNoIHtcbiAgLyoqIFRoZSBzcGF3bmVkIGVtdWxhdG9yIHByb2Nlc3MuICovXG4gIHByb2Nlc3M6IENoaWxkUHJvY2VzcztcblxuICAvKiogUmV0dXJucyB0aGUgZXhpdCBkZXRhaWxzIG9uY2UgdGhlIHByb2Nlc3MgaGFzIGV4aXRlZCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLiAqL1xuICByZWFkRXhpdEluZm86ICgpID0+IEVtdWxhdG9yRXhpdEluZm8gfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFJldHVybnMgdGhlIGNhcHR1cmVkIHN0ZG91dCtzdGRlcnIgKGJvdW5kZWQgdG8gdGhlIG1vc3QgcmVjZW50IG91dHB1dCkuICovXG4gIHJlYWRPdXRwdXQ6ICgpID0+IHN0cmluZztcblxuICAvKiogU3RvcHMgYWNjdW11bGF0aW5nIG91dHB1dC4gQ2FsbCBvbmNlIHN0YXJ0dXAgaGFzIHN1Y2NlZWRlZC4gKi9cbiAgc3RvcENhcHR1cmU6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkuZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyB7XG4gIC8qKiBBVkQgbmFtZSB0byBjb25uZWN0IHRvIChzdGFydGluZyBhIG5ldyBlbXVsYXRvciBpZiBub3QgYWxyZWFkeSBydW5uaW5nKS4gKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKiBSZXNvbHZlZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIHBvc3QtYm9vdCBkZXZpY2UtaWRsZSB3YWl0IChgMGAgc2tpcHMgaXQpLiAqL1xuICByZWFkb25seSBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuICovXG4gIHJlYWRvbmx5IGlzRW11bGF0b3JWaXNpYmxlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Yge0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkuZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdCB7XG4gIC8qKiBUaGUgYWN0dWFsIGRldmljZSBJRCB0aGF0IGlzIGNvbm5lY3RlZCAobWF5IGRpZmZlciBmcm9tIHRoZSByZXF1ZXN0ZWQgb25lKS4gKi9cbiAgcmVhZG9ubHkgYWN0dWFsRGV2aWNlSWQ6IHN0cmluZztcblxuICAvKiogVGhlIGVtdWxhdG9yIHByb2Nlc3MsIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLiAqL1xuICByZWFkb25seSBlbXVsYXRvclByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIGxvY2FsbHktaW5zdGFsbGVkIE9ic2lkaWFuIHNoZWxsIHJlc29sdmVkIGJ5IHtAbGluayByZXNvbHZlSW5zdGFsbGVkU2hlbGxPck51bGx9LlxuICovXG5pbnRlcmZhY2UgSW5zdGFsbGVkU2hlbGwge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgaW5zdGFsbGVkIHNoZWxsIGV4ZWN1dGFibGUuICovXG4gIHJlYWRvbmx5IGV4ZVBhdGg6IHN0cmluZztcblxuICAvKiogVGhlIGRldGVjdGVkIHNoZWxsIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgY2Fubm90IGJlIGRldGVybWluZWQuICovXG4gIHJlYWRvbmx5IHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LnN0YXJ0QXBwaXVtQW5kRW11bGF0b3J9LlxuICovXG5pbnRlcmZhY2UgU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyB7XG4gIC8qKiBSZXNvbHZlZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIHRvIGJlY29tZSByZWFkeS4gKi9cbiAgcmVhZG9ubHkgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLiAqL1xuICByZWFkb25seSBhcHBpdW1Vcmw6IFVSTDtcblxuICAvKiogQVZEIG5hbWUgdG8gc3RhcnQuICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKiogUmVzb2x2ZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBwb3N0LWJvb3QgZGV2aWNlLWlkbGUgd2FpdCAoYDBgIHNraXBzIGl0KS4gKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBjb25zb2xlIHdpbmRvdyBpcyBzaG93biAob21pdHRlZCBcdTIxOTIgaGlkZGVuKS4gKi9cbiAgcmVhZG9ubHkgaXNBcHBpdW1Db25zb2xlVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuICovXG4gIHJlYWRvbmx5IGlzRW11bGF0b3JWaXNpYmxlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgcG9ydC4gKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIEFwcGl1bSBhdXRvLXN0YXJ0IGlzIGFsbG93ZWQuICovXG4gIHJlYWRvbmx5IHNob3VsZEF1dG9TdGFydEFwcGl1bT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LnN0YXJ0QXBwaXVtQW5kRW11bGF0b3J9LlxuICovXG5pbnRlcmZhY2UgU3RhcnRBcHBpdW1BbmRFbXVsYXRvclJlc3VsdCB7XG4gIC8qKiBUaGUgYWN0dWFsIGRldmljZSBJRCB0aGF0IGlzIGNvbm5lY3RlZCAobWF5IGRpZmZlciBmcm9tIHRoZSByZXF1ZXN0ZWQgb25lKS4gKi9cbiAgcmVhZG9ubHkgYWN0dWFsRGV2aWNlSWQ6IHN0cmluZztcblxuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgcHJvY2VzcywgaWYgb25lIHdhcyBhdXRvLXN0YXJ0ZWQuICovXG4gIHJlYWRvbmx5IGFwcGl1bVByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRoZSBlbXVsYXRvciBwcm9jZXNzLCBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZC4gKi9cbiAgcmVhZG9ubHkgZW11bGF0b3JQcm9jZXNzPzogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xufVxuXG5sZXQgY2FjaGVkVHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFbmNhcHN1bGF0ZXMgYWxsIEFwcGl1bSB0cmFuc3BvcnQgY3JlYXRpb24gbG9naWMsIGluY2x1ZGluZyBBcHBpdW0gc2VydmVyXG4gKiBzdGFydHVwLCBlbXVsYXRvciBtYW5hZ2VtZW50LCBhbmQgV2ViRHJpdmVySU8gc2Vzc2lvbiBlc3RhYmxpc2htZW50LlxuICpcbiAqIFVzaW5nIGEgY2xhc3MgYXZvaWRzIHRocmVhZGluZyB0aGUgdHJhbnNwb3J0IGB0eXBlYCBsYWJlbCB0aHJvdWdoIGV2ZXJ5XG4gKiBoZWxwZXIgZnVuY3Rpb24gXHUyMDE0IGB0aGlzLmxvZygpYCBhdXRvbWF0aWNhbGx5IHByZWZpeGVzIGl0LlxuICovXG5jbGFzcyBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5IHtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZykge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBBcHBpdW0gdHJhbnNwb3J0IGJ5IGVzdGFibGlzaGluZyBhIFdlYkRyaXZlcklPIHNlc3Npb24uXG4gICAqXG4gICAqIElmIGBvcHRpb25zLnNlc3Npb25JZGAgaXMgcHJlc2VudCwgcmVhdHRhY2hlcyB0byB0aGUgZXhpc3Rpbmcgc2Vzc2lvblxuICAgKiBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS4gVGhpcyBhdm9pZHMgZHVwbGljYXRlIEFwcGl1bS9BREIgY29ubmVjdGlvbnNcbiAgICogd2hlbiB0ZXN0IHdvcmtlcnMgcmV1c2UgdGhlIGdsb2JhbCBzZXR1cCdzIHNlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQW5kcm9pZCBBcHBpdW0gdHJhbnNwb3J0IG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIEEgY29uZmlndXJlZCBBcHBpdW0gdHJhbnNwb3J0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZShvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICAgIGlmIChvcHRpb25zLnNlc3Npb25JZCAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuZGV2aWNlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0YWNoVG9FeGlzdGluZ1Nlc3Npb24ob3B0aW9ucy5zZXNzaW9uSWQsIG9wdGlvbnMuZGV2aWNlSWQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZU5ld1Nlc3Npb24ob3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGF0dGFjaFRvRXhpc3RpbmdTZXNzaW9uKFxuICAgIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIGRldmljZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9uc1xuICApOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRpb25zLmFwcGl1bVVybCk7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcih1cmwucG9ydCk7XG4gICAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkID8/IEFQUF9QQUNLQUdFO1xuXG4gICAgdGhpcy5sb2coYFJlYXR0YWNoaW5nIHRvIGV4aXN0aW5nIEFwcGl1bSBzZXNzaW9uICR7c2Vzc2lvbklkfSAoZGV2aWNlPSR7ZGV2aWNlSWR9KWApO1xuXG4gICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IGF0dGFjaCh7XG4gICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgcGxhdGZvcm1OYW1lOiAnQW5kcm9pZCdcbiAgICAgIH0sXG4gICAgICBob3N0bmFtZTogdXJsLmhvc3RuYW1lLFxuICAgICAgbG9nTGV2ZWw6ICd3YXJuJyxcbiAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgIHBvcnQsXG4gICAgICBzZXNzaW9uSWQsXG4gICAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBzdHJpcEZvcmJpZGRlbkZldGNoSGVhZGVyc1xuICAgIH0pO1xuXG4gICAgdGhpcy5sb2coJ1JlYXR0YWNoZWQgdG8gQXBwaXVtIHNlc3Npb24uJyk7XG5cbiAgICByZXR1cm4gbmV3IEFwcGl1bVRyYW5zcG9ydCh7XG4gICAgICBhcHBJZCxcbiAgICAgIGJyb3dzZXIsXG4gICAgICBkZXZpY2VJZCxcbiAgICAgIGlzU2Vzc2lvbk93bmVyOiBmYWxzZSxcbiAgICAgIHBsYXRmb3JtOiAnYW5kcm9pZCcsXG4gICAgICAuLi4ob3B0aW9ucy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSksXG4gICAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSksXG4gICAgICAuLi4ob3B0aW9ucy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSlcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsOiBVUkwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzVXJsID0gbmV3IFVSTCgnL3N0YXR1cycsIHVybCk7XG4gICAgICBjb25zdCByZXEgPSBodHRwLmdldChzdGF0dXNVcmwsIHsgdGltZW91dDogQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LCAocmVzKSA9PiB7XG4gICAgICAgIHJlcy5yZXN1bWUoKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgICByZXEub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICAgIHJlcS5kZXN0cm95KCk7XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59IGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmVxLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgcmVqZWN0KFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgcmVhY2ggQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59OiAke2Vyci5tZXNzYWdlfS4gSXMgdGhlIEFwcGl1bSBzZXJ2ZXIgcnVubmluZz9gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZU5ld1Nlc3Npb24ob3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgICB0aGlzLmxvZyhgQ3JlYXRpbmcgQXBwaXVtVHJhbnNwb3J0ICh1cmw9JHtvcHRpb25zLmFwcGl1bVVybH0sIGF2ZD0ke29wdGlvbnMuYXZkTmFtZX0pYCk7XG5cbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdGlvbnMuYXBwaXVtVXJsKTtcblxuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIodXJsLnBvcnQpO1xuICAgIGlmIChpc05hTihwb3J0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBvcnQgaW4gYXBwaXVtVXJsOiAke3VybC5wb3J0fWApO1xuICAgIH1cblxuICAgIGNvbnN0IGFwcElkID0gb3B0aW9ucy5hcHBJZCA/PyBBUFBfUEFDS0FHRTtcblxuICAgIGxldCBhcHBpdW1Qcm9jZXNzOiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGVtdWxhdG9yUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3RhcnRBcHBpdW1BbmRFbXVsYXRvcih7XG4gICAgICAgIGFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzOiByZXNvbHZlQXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMob3B0aW9ucyksXG4gICAgICAgIGFwcGl1bVVybDogdXJsLFxuICAgICAgICBhdmROYW1lOiBvcHRpb25zLmF2ZE5hbWUsXG4gICAgICAgIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHJlc29sdmVEZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgICAgICBpc0FwcGl1bUNvbnNvbGVWaXNpYmxlOiBvcHRpb25zLmlzQXBwaXVtQ29uc29sZVZpc2libGUsXG4gICAgICAgIGlzRW11bGF0b3JWaXNpYmxlOiBvcHRpb25zLmlzRW11bGF0b3JWaXNpYmxlLFxuICAgICAgICBwb3J0LFxuICAgICAgICBzaG91bGRBdXRvU3RhcnRBcHBpdW06IG9wdGlvbnMuc2hvdWxkQXV0b1N0YXJ0QXBwaXVtXG4gICAgICB9KTtcblxuICAgICAgYXBwaXVtUHJvY2VzcyA9IHJlc3VsdC5hcHBpdW1Qcm9jZXNzO1xuICAgICAgZW11bGF0b3JQcm9jZXNzID0gcmVzdWx0LmVtdWxhdG9yUHJvY2VzcztcbiAgICAgIGNvbnN0IGFjdHVhbERldmljZUlkID0gcmVzdWx0LmFjdHVhbERldmljZUlkO1xuXG4gICAgICBjb25zdCBzZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dCA9IHJlc29sdmVTZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpO1xuICAgICAgdGhpcy5sb2coXG4gICAgICAgIGBDb25uZWN0aW5nIHRvIEFwcGl1bSAoZGV2aWNlPSR7YWN0dWFsRGV2aWNlSWR9LCBhcHA9JHthcHBJZH0sIHJldHJ5VGltZW91dDogJHtTdHJpbmcoc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXQpfW1zLCByZXRyaWVzOiAke1N0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCl9KS4uLmBcbiAgICAgICk7XG4gICAgICBjb25zdCBicm93c2VyID0gYXdhaXQgcmVtb3RlKHtcbiAgICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgJ2FwcGl1bTphcHBBY3Rpdml0eSc6IEFQUF9BQ1RJVklUWSxcbiAgICAgICAgICAnYXBwaXVtOmFwcFBhY2thZ2UnOiBhcHBJZCxcbiAgICAgICAgICAnYXBwaXVtOmF1dG9HcmFudFBlcm1pc3Npb25zJzogdHJ1ZSxcbiAgICAgICAgICAnYXBwaXVtOmF1dG9tYXRpb25OYW1lJzogJ1VpQXV0b21hdG9yMicsXG4gICAgICAgICAgJ2FwcGl1bTpuZXdDb21tYW5kVGltZW91dCc6IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTpub1Jlc2V0JzogdHJ1ZSxcbiAgICAgICAgICAnYXBwaXVtOnVkaWQnOiBhY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgICAnYXBwaXVtOnVpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0JzogU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTp1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0JzogU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAncGxhdGZvcm1OYW1lJzogJ0FuZHJvaWQnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCxcbiAgICAgICAgY29ubmVjdGlvblJldHJ5VGltZW91dDogc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXQsXG4gICAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgdHJhbnNmb3JtUmVxdWVzdDogc3RyaXBGb3JiaWRkZW5GZXRjaEhlYWRlcnNcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmxvZygnQXBwaXVtIHNlc3Npb24gZXN0YWJsaXNoZWQuJyk7XG4gICAgICBjb25zdCBhcHBpdW1UcmFuc3BvcnQgPSBuZXcgQXBwaXVtVHJhbnNwb3J0KHtcbiAgICAgICAgYXBwSWQsXG4gICAgICAgIGJyb3dzZXIsXG4gICAgICAgIGRldmljZUlkOiBhY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgcGxhdGZvcm06ICdhbmRyb2lkJyxcbiAgICAgICAgLi4uKG9wdGlvbnMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzIH0pLFxuICAgICAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSksXG4gICAgICAgIC4uLihvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsRGlzcG9zZSA9IGFwcGl1bVRyYW5zcG9ydC5kaXNwb3NlLmJpbmQoYXBwaXVtVHJhbnNwb3J0KTtcbiAgICAgIGNvbnN0IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgPSBhcHBpdW1UcmFuc3BvcnQ7XG4gICAgICB0cmFuc3BvcnQuZGlzcG9zZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbERpc3Bvc2UoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdHJhbnNwb3J0LmRpc3Bvc2VTeW5jID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0cmFuc3BvcnQ7XG5cbiAgICAgIGZ1bmN0aW9uIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgICAgLy8gQ2Fubm90IHVzZSB0aGlzLmxvZyBpbnNpZGUgbmVzdGVkIGZ1bmN0aW9uIFx1MjAxNCBgdGhpc2AgaXMgbm90IGNhcHR1cmVkLlxuICAgICAgICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7b3B0aW9ucy50eXBlfV0gQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICAgICAga2lsbFByb2Nlc3NUcmVlKGVtdWxhdG9yUHJvY2Vzcyk7XG4gICAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHtvcHRpb25zLnR5cGV9XSBBdXRvLXN0YXJ0ZWQgZW11bGF0b3Igc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgIHRoaXMubG9nKCdLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgaWYgKGVtdWxhdG9yUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoZW11bGF0b3JQcm9jZXNzKTtcbiAgICAgICAgdGhpcy5sb2coJ0tpbGxlZCBhdXRvLXN0YXJ0ZWQgZW11bGF0b3IgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVEZXZpY2VDb25uZWN0ZWQocGFyYW1zOiBFbnN1cmVEZXZpY2VDb25uZWN0ZWRQYXJhbXMpOiBQcm9taXNlPEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdD4ge1xuICAgIGNvbnN0IHsgYXZkTmFtZSwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgaXNFbXVsYXRvclZpc2libGUgfSA9IHBhcmFtcztcbiAgICBjb25zdCBkZXZpY2VJZHNCZWZvcmUgPSBhd2FpdCB0aGlzLmdldENvbm5lY3RlZERldmljZUlkcygpO1xuICAgIHRoaXMubG9nKGBDaGVja2luZyBleGlzdGluZyBkZXZpY2VzIGZvciBBVkQgXCIke2F2ZE5hbWV9XCIuLi4gKGNvbm5lY3RlZDogWyR7ZGV2aWNlSWRzQmVmb3JlLmpvaW4oJywgJyl9XSlgKTtcblxuICAgIGNvbnN0IGV4aXN0aW5nRGV2aWNlSWQgPSBhd2FpdCB0aGlzLmZpbmREZXZpY2VCeUF2ZE5hbWUoYXZkTmFtZSwgZGV2aWNlSWRzQmVmb3JlKTtcblxuICAgIGlmIChleGlzdGluZ0RldmljZUlkKSB7XG4gICAgICB0aGlzLmxvZyhgQVZEIFwiJHthdmROYW1lfVwiIGlzIGFscmVhZHkgcnVubmluZyBvbiBkZXZpY2UgJHtleGlzdGluZ0RldmljZUlkfSwgcmV1c2luZy5gKTtcbiAgICAgIGF3YWl0IHRoaXMuc3VwcHJlc3NFcnJvckRpYWxvZ3MoZXhpc3RpbmdEZXZpY2VJZCk7XG4gICAgICByZXR1cm4geyBhY3R1YWxEZXZpY2VJZDogZXhpc3RpbmdEZXZpY2VJZCB9O1xuICAgIH1cblxuICAgIHRoaXMubG9nKGBBVkQgXCIke2F2ZE5hbWV9XCIgbm90IGZvdW5kIG9uIGFueSBleGlzdGluZyBkZXZpY2UsIHN0YXJ0aW5nIGEgbmV3IGVtdWxhdG9yLi4uYCk7XG4gICAgY29uc3QgZW11bGF0b3IgPSB0aGlzLnN0YXJ0RW11bGF0b3IoYXZkTmFtZSwgaXNFbXVsYXRvclZpc2libGUpO1xuXG4gICAgbGV0IGFjdHVhbERldmljZUlkOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGFjdHVhbERldmljZUlkID0gYXdhaXQgdGhpcy53YWl0Rm9yTmV3RGV2aWNlKGRldmljZUlkc0JlZm9yZSwgZW11bGF0b3IsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBlbXVsYXRvci5zdG9wQ2FwdHVyZSgpO1xuICAgIH1cblxuICAgIHRoaXMubG9nKGBFbXVsYXRvciBcIiR7YXZkTmFtZX1cIiBzdGFydGVkLCBkZXZpY2UgJHthY3R1YWxEZXZpY2VJZH0gaXMgY29ubmVjdGVkLmApO1xuICAgIGF3YWl0IHRoaXMuc3VwcHJlc3NFcnJvckRpYWxvZ3MoYWN0dWFsRGV2aWNlSWQpO1xuICAgIHJldHVybiB7IGFjdHVhbERldmljZUlkLCBlbXVsYXRvclByb2Nlc3M6IGVtdWxhdG9yLnByb2Nlc3MgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmluZERldmljZUJ5QXZkTmFtZShhdmROYW1lOiBzdHJpbmcsIGRldmljZUlkczogc3RyaW5nW10pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGZvciAoY29uc3QgZGV2aWNlSWQgb2YgZGV2aWNlSWRzKSB7XG4gICAgICBjb25zdCBydW5uaW5nQXZkID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBleGVjRmlsZShcbiAgICAgICAgICAnYWRiJyxcbiAgICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdlbXUnLCAnYXZkJywgJ25hbWUnXSxcbiAgICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgICAoX2Vycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoc3Rkb3V0LnNwbGl0KCdcXG4nKVswXT8udHJpbSgpID8/ICcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHJ1bm5pbmdBdmQgPT09IGF2ZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGRldmljZUlkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldENvbm5lY3RlZERldmljZUlkcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBleGVjRmlsZSgnYWRiJywgWydkZXZpY2VzJ10sIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LCAoZXJyb3IsIHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gJ2FkYiBkZXZpY2VzJzogJHtlcnJvci5tZXNzYWdlfS4gSXMgQURCIGluc3RhbGxlZCBhbmQgaW4gUEFUSD9gKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICB0aGlzLmxvZyhgQURCIHN0ZGVycjogJHtzdGRlcnIudHJpbSgpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoc3Rkb3V0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgbGluZXMgPSBvdXRwdXQuc3BsaXQoJ1xcbicpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgICByZXR1cm4gbGluZXNcbiAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUuaW5jbHVkZXMoJ1xcdGRldmljZScpKVxuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zcGxpdCgnXFx0JylbMF0gPz8gJycpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZXZpY2VQcm9wKGRldmljZUlkOiBzdHJpbmcsIHByb3A6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShcbiAgICAgICAgJ2FkYicsXG4gICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2dldHByb3AnLCBwcm9wXSxcbiAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgIChlcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgLy8gUmV0dXJuIG5vIG91dHB1dCBvbiB0aW1lb3V0L2Vycm9yIChub3QgcGFydGlhbCBzdGRvdXQpIHNvIGEgbm9uLXJlc3BvbnNpdmUgZ3Vlc3QgcmVhZHMgYXMgXCJub3QgaWRsZVwiLlxuICAgICAgICAgIHJlc29sdmUoZXJyb3IgPyAnJyA6IHN0ZG91dCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxpc3RJbnN0YWxsZWRQYWNrYWdlcyhkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAnYWRiJyxcbiAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnY21kJywgJ3BhY2thZ2UnLCAnbGlzdCcsICdwYWNrYWdlcyddLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAvLyBSZXR1cm4gbm8gb3V0cHV0IG9uIHRpbWVvdXQvZXJyb3Igc28gYSBjaHVybmluZyBndWVzdCdzIHNsb3cvcGFydGlhbCBwYWNrYWdlIGxpc3QgY2FuJ3QgZmFsc2VseSByZWFkIGFzIGlkbGUuXG4gICAgICAgICAgcmVzb2x2ZShlcnJvciA/ICcnIDogc3Rkb3V0KTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7dGhpcy50eXBlfV0gJHttZXNzYWdlfWApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRW11bGF0b3JCaW5hcnkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZGtSb290ID0gcHJvY2Vzcy5lbnZbJ0FORFJPSURfSE9NRSddID8/IHByb2Nlc3MuZW52WydBTkRST0lEX1NES19ST09UJ107XG4gICAgaWYgKCFzZGtSb290KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgZmluZCBBbmRyb2lkIGVtdWxhdG9yOiBuZWl0aGVyIEFORFJPSURfSE9NRSBub3IgQU5EUk9JRF9TREtfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGpvaW4oc2RrUm9vdCwgJ2VtdWxhdG9yJywgJ2VtdWxhdG9yJyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRLZXlFdmVudChkZXZpY2VJZDogc3RyaW5nLCBrZXlDb2RlOiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdpbnB1dCcsICdrZXlldmVudCcsIFN0cmluZyhrZXlDb2RlKV0sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgICBgV2FybmluZzogZmFpbGVkIHRvICR7ZGVzY3JpcHRpb259IChrZXlldmVudCAke1N0cmluZyhrZXlDb2RlKX0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydEFwcGl1bUFuZEVtdWxhdG9yKHBhcmFtczogU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyk6IFByb21pc2U8U3RhcnRBcHBpdW1BbmRFbXVsYXRvclJlc3VsdD4ge1xuICAgIGNvbnN0IHsgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMsIGFwcGl1bVVybCwgYXZkTmFtZSwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgaXNBcHBpdW1Db25zb2xlVmlzaWJsZSwgaXNFbXVsYXRvclZpc2libGUsIHBvcnQsIHNob3VsZEF1dG9TdGFydEFwcGl1bSB9ID0gcGFyYW1zO1xuXG4gICAgbGV0IG5lZWRzQXBwaXVtU3RhcnQgPSBmYWxzZTtcblxuICAgIHRoaXMubG9nKGBDaGVja2luZyBBcHBpdW0gc2VydmVyIGF0ICR7YXBwaXVtVXJsLmhyZWZ9Li4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBpdW1SZWFjaGFibGUoYXBwaXVtVXJsKTtcbiAgICAgIHRoaXMubG9nKCdBcHBpdW0gc2VydmVyIGlzIHJlYWNoYWJsZS4nKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKHNob3VsZEF1dG9TdGFydEFwcGl1bSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBuZWVkc0FwcGl1bVN0YXJ0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBsZXQgYXBwaXVtUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5lZWRzQXBwaXVtU3RhcnQpIHtcbiAgICAgIHRoaXMubG9nKGBBcHBpdW0gbm90IHJlYWNoYWJsZSwgYXV0by1zdGFydGluZyBvbiBwb3J0ICR7U3RyaW5nKHBvcnQpfS4uLmApO1xuICAgICAgYXBwaXVtUHJvY2VzcyA9IHRoaXMuc3RhcnRBcHBpdW1TZXJ2ZXIocG9ydCwgaXNBcHBpdW1Db25zb2xlVmlzaWJsZSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFssIGRldmljZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIG5lZWRzQXBwaXVtU3RhcnRcbiAgICAgICAgICA/IHRoaXMud2FpdEZvckFwcGl1bVJlYWR5KGFwcGl1bVVybCwgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2coJ0F1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGlzIHJlYWR5LicpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgICAgdGhpcy5lbnN1cmVEZXZpY2VDb25uZWN0ZWQoeyBhdmROYW1lLCBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzLCBpc0VtdWxhdG9yVmlzaWJsZSB9KVxuICAgICAgXSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFjdHVhbERldmljZUlkOiBkZXZpY2VSZXN1bHQuYWN0dWFsRGV2aWNlSWQsXG4gICAgICAgIGFwcGl1bVByb2Nlc3MsXG4gICAgICAgIGVtdWxhdG9yUHJvY2VzczogZGV2aWNlUmVzdWx0LmVtdWxhdG9yUHJvY2Vzc1xuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgICAga2lsbFByb2Nlc3NUcmVlKGFwcGl1bVByb2Nlc3MpO1xuICAgICAgICB0aGlzLmxvZygnS2lsbGVkIGF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGFmdGVyIHN0YXJ0dXAgZmFpbHVyZS4nKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRBcHBpdW1TZXJ2ZXIocG9ydDogbnVtYmVyLCBpc0FwcGl1bUNvbnNvbGVWaXNpYmxlPzogYm9vbGVhbik6IENoaWxkUHJvY2VzcyB7XG4gICAgY29uc3QgaXNDb25zb2xlSGlkZGVuID0gc2hvdWxkSGlkZUFwcGl1bUNvbnNvbGUoaXNBcHBpdW1Db25zb2xlVmlzaWJsZSk7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihgbnB4IGFwcGl1bSAtLWxvZy10aW1lc3RhbXAgLS1wb3J0ICR7U3RyaW5nKHBvcnQpfSAtLWFsbG93LWluc2VjdXJlPSR7Q0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFfWAsIHtcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogaXNDb25zb2xlSGlkZGVuID8gJ2lnbm9yZScgOiBbJ2lnbm9yZScsICdpbmhlcml0JywgJ2luaGVyaXQnXSxcbiAgICAgIHdpbmRvd3NIaWRlOiBpc0NvbnNvbGVIaWRkZW5cbiAgICB9KTtcblxuICAgIGNoaWxkLnVucmVmKCk7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEVtdWxhdG9yKGF2ZE5hbWU6IHN0cmluZywgaXNFbXVsYXRvclZpc2libGU/OiBib29sZWFuKTogRW11bGF0b3JMYXVuY2gge1xuICAgIGNvbnN0IGVtdWxhdG9yQmluYXJ5ID0gdGhpcy5yZXNvbHZlRW11bGF0b3JCaW5hcnkoKTtcbiAgICBjb25zdCBhcmdzID0gYnVpbGRFbXVsYXRvckFyZ3MoeyBhdmROYW1lLCBpc0hpZGRlbjogc2hvdWxkSGlkZUVtdWxhdG9yV2luZG93KGlzRW11bGF0b3JWaXNpYmxlKSB9KTtcbiAgICB0aGlzLmxvZyhgUnVubmluZzogJHtlbXVsYXRvckJpbmFyeX0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAvKlxuICAgICAqIFBpcGUgKHJhdGhlciB0aGFuIGlnbm9yZSkgc3Rkb3V0L3N0ZGVyciBzbyBhbiBlYXJseSBmYWlsdXJlIHN1Y2ggYXNcbiAgICAgKiBcIng4Nl82NCBlbXVsYXRpb24gY3VycmVudGx5IHJlcXVpcmVzIGhhcmR3YXJlIGFjY2VsZXJhdGlvblwiIGNhbiBiZVxuICAgICAqIHN1cmZhY2VkIGltbWVkaWF0ZWx5IGluc3RlYWQgb2Ygd2FpdGluZyBvdXQgdGhlIGZ1bGwgYm9vdCB0aW1lb3V0LlxuICAgICAqL1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oZW11bGF0b3JCaW5hcnksIGFyZ3MsIHtcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddXG4gICAgfSk7XG5cbiAgICBsZXQgY2FwdHVyZWRPdXRwdXQgPSAnJztcbiAgICBsZXQgZXhpdEluZm86IEVtdWxhdG9yRXhpdEluZm8gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGlzQ2FwdHVyaW5nID0gdHJ1ZTtcblxuICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGFwcGVuZE91dHB1dCk7XG4gICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgYXBwZW5kT3V0cHV0KTtcbiAgICBjaGlsZC5vbmNlKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgZXhpdEluZm8gPSB7IGNvZGUsIHNpZ25hbCB9O1xuICAgIH0pO1xuXG4gICAgY2hpbGQudW5yZWYoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBwcm9jZXNzOiBjaGlsZCxcbiAgICAgIHJlYWRFeGl0SW5mbzogKCkgPT4gZXhpdEluZm8sXG4gICAgICByZWFkT3V0cHV0OiAoKSA9PiBjYXB0dXJlZE91dHB1dCxcbiAgICAgIHN0b3BDYXB0dXJlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIExlYXZlIHRoZSBgZGF0YWAgbGlzdGVuZXJzIGF0dGFjaGVkIHNvIHRoZSBwaXBlcyBrZWVwIGRyYWluaW5nIChhXG4gICAgICAgICAqIGZ1bGwgT1MgcGlwZSBidWZmZXIgd291bGQgYmxvY2sgdGhlIGxvbmctcnVubmluZyBlbXVsYXRvcik7IHRoZSBmbGFnXG4gICAgICAgICAqIGp1c3QgZnJlZXplcyB0aGUgY2FwdHVyZWQgdGFpbCBvbmNlIHN0YXJ0dXAgaGFzIHN1Y2NlZWRlZC5cbiAgICAgICAgICovXG4gICAgICAgIGlzQ2FwdHVyaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGFwcGVuZE91dHB1dChjaHVuazogQnVmZmVyKTogdm9pZCB7XG4gICAgICBpZiAoIWlzQ2FwdHVyaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhcHR1cmVkT3V0cHV0ID0gKGNhcHR1cmVkT3V0cHV0ICsgY2h1bmsudG9TdHJpbmcoKSkuc2xpY2UoLUVNVUxBVE9SX09VVFBVVF9UQUlMX01BWF9MRU5HVEgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyB0aGUgZ3Vlc3QncyBjcmFzaC9BTlIgZGlhbG9ncyBvbiB0aGUgZ2l2ZW4gZGV2aWNlLlxuICAgKlxuICAgKiBBIHJlc291cmNlLXN0YXJ2ZWQgZW11bGF0b3IgY2FuIHJhaXNlIGEgXCJQcm9jZXNzIHN5c3RlbSBpc24ndCByZXNwb25kaW5nXCJcbiAgICogQU5SIChhbiBgQWN0aXZpdHlNYW5hZ2VyU2VydmljZWAgdGltZW91dCkgd2hvc2UgZGlhbG9nIG92ZXJsYXlzIHRoZSBVSS4gSWZcbiAgICogaXQgYXBwZWFycyBiZWZvcmUgQXBwaXVtIGF0dGFjaGVzLCBub3RoaW5nIGNhbiBkaXNtaXNzIGl0IGFuZCB0aGUgcnVuIGhhbmdzXG4gICAqIG9yIGZhaWxzIGludGVybWl0dGVudGx5LiBTZXR0aW5nIHRoZSBgaGlkZV9lcnJvcl9kaWFsb2dzYCBnbG9iYWwgXHUyMDE0IHRoZSBzYW1lXG4gICAqIGZsYWcgQW5kcm9pZCdzIG93biB0ZXN0IGluZnJhIHVzZXMgXHUyMDE0IHRlbGxzIGBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlYCB0b1xuICAgKiBuZXZlciBkcmF3IGNyYXNoL0FOUiBkaWFsb2dzLCBzbyB0aGUgQU5SIGNhbiBubyBsb25nZXIgYmxvY2sgYXV0b21hdGlvbi5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgZWFybGllc3QgcG9pbnQgYXQgd2hpY2ggdGhlIGZsYWcgY2FuIGJlIHNldDogdGhlIGZyYW1ld29ya1xuICAgKiAoYHN5c3RlbV9zZXJ2ZXJgKSBtdXN0IGJlIHVwIGJlZm9yZSBgc2V0dGluZ3MgcHV0YCB3b3Jrcywgc28gY2FsbGVycyBpbnZva2VcbiAgICogaXQgb25seSBhZnRlciBgc3lzLmJvb3RfY29tcGxldGVkYC4gSXQgbmFycm93cyBcdTIwMTQgYnV0IGNhbm5vdCBmdWxseSBjbG9zZSBcdTIwMTRcbiAgICogdGhlIHJhY2Ugd2l0aCBhbiBBTlIgdGhhdCBmaXJlcyBiZXR3ZWVuIGJvb3QgY29tcGxldGluZyBhbmQgdGhpcyBjYWxsOyBhXG4gICAqIHByZS1iYWtlZCBzbmFwc2hvdCB3aXRoIHRoZSBmbGFnIGFscmVhZHkgc2V0IGlzIHRoZSBvbmx5IHdheSB0byBlbGltaW5hdGVcbiAgICogaXQgZW50aXJlbHkuIEJlc3QtZWZmb3J0OiBhIGZhaWx1cmUgaXMgbG9nZ2VkLCBub3QgdGhyb3duLCBzaW5jZSBpdCBvbmx5XG4gICAqIHN1cHByZXNzZXMgYSBzeW1wdG9tLlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gY29uZmlndXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzdXBwcmVzc0Vycm9yRGlhbG9ncyhkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coYERpc2FibGluZyBjcmFzaC9BTlIgZGlhbG9ncyBvbiBkZXZpY2UgJHtkZXZpY2VJZH0gKHNldHRpbmdzIHB1dCBnbG9iYWwgaGlkZV9lcnJvcl9kaWFsb2dzIDEpLi4uYCk7XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdzZXR0aW5ncycsICdwdXQnLCAnZ2xvYmFsJywgJ2hpZGVfZXJyb3JfZGlhbG9ncycsICcxJ10sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgICBgV2FybmluZzogZmFpbGVkIHRvIGRpc2FibGUgY3Jhc2gvQU5SIGRpYWxvZ3M6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcid9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JBcHBpdW1SZWFkeSh1cmw6IFVSTCwgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgQXBwaXVtIGF0ICR7dXJsLmhyZWZ9ICh0aW1lb3V0OiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLCBwb2xsOiAke1N0cmluZyhBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmBcbiAgICApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gc3RhcnQgKyB0aW1lb3V0SW5NaWxsaXNlY29uZHM7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybCk7XG4gICAgICAgIHRoaXMubG9nKGBBcHBpdW0gc2VydmVyIHJlYWR5IGFmdGVyICR7U3RyaW5nKERhdGUubm93KCkgLSBzdGFydCl9bXMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aGlzLmxvZyhgQXBwaXVtIHNlcnZlciBub3QgcmVhZHkgeWV0IChlbGFwc2VkOiAke1N0cmluZyhEYXRlLm5vdygpIC0gc3RhcnQpfW1zKS4gUmV0cnlpbmcuLi5gKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcodGltZW91dEluTWlsbGlzZWNvbmRzKX1tc2BcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQm9vdChkZXZpY2VJZDogc3RyaW5nLCBkZWFkbGluZTogbnVtYmVyLCBlbXVsYXRvcjogRW11bGF0b3JMYXVuY2gpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZW1haW5pbmdNcyA9IE1hdGgubWF4KDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSk7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGZpbmlzaCBib290aW5nIChyZW1haW5pbmc6ICR7U3RyaW5nKHJlbWFpbmluZ01zKX1tcywgcG9sbDogJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBpc0Jvb3RlZCA9IGF3YWl0IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAgICdhZGInLFxuICAgICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2dldHByb3AnLCAnc3lzLmJvb3RfY29tcGxldGVkJ10sXG4gICAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgICAgKF9lcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHN0ZG91dC50cmltKCkgPT09ICcxJyk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpc0Jvb3RlZCkge1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGJvb3QgY29tcGxldGVkLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXRJbmZvID0gZW11bGF0b3IucmVhZEV4aXRJbmZvKCk7XG4gICAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJ1aWxkRW11bGF0b3JFeGl0TWVzc2FnZShleGl0SW5mbywgZW11bGF0b3IucmVhZE91dHB1dCgpKSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBjb25uZWN0ZWQgYnV0IGRpZCBub3QgZmluaXNoIGJvb3Rpbmcgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciBhIGZyZXNobHktYm9vdGVkIGVtdWxhdG9yIHRvIGJlY29tZSBpZGxlIGJlZm9yZSB0aGUgc2Vzc2lvbiBpc1xuICAgKiBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogYHN5cy5ib290X2NvbXBsZXRlZGAgZmlyZXMgYmVmb3JlIHRoZSBndWVzdCBpcyBhY3R1YWxseSBpZGxlIFx1MjAxNCBwYWNrYWdlXG4gICAqIG9wdGltaXphdGlvbiBhbmQgc2VydmljZXMga2VlcCBjaHVybmluZyBcdTIwMTQgc28gZXN0YWJsaXNoaW5nIHRoZSBBcHBpdW1cbiAgICogc2Vzc2lvbiBpbW1lZGlhdGVseSBtYWtlcyBldmVyeSBzZXJpYWxpemVkIFVpQXV0b21hdG9yMiBgYWRiYCByb3VuZC10cmlwXG4gICAqIGNvbnRlbmQgd2l0aCB0aGF0IHdvcmsgYW5kIGluZmxhdGVzIHNlc3Npb24gZXN0YWJsaXNobWVudCB+M3guIFRoaXMgcG9sbHNcbiAgICogYSBsYXRlciwgcXVpZXRlciBzaWduYWwgKGJvb3QgYW5pbWF0aW9uIHN0b3BwZWQgKyBwYWNrYWdlIG1hbmFnZXIgc2VydmluZyxcbiAgICogdmlhIHtAbGluayBjaGVja0RldmljZUlkbGV9KSBhbmQgcmV0dXJucyBhcyBzb29uIGFzIGl0IGlzIHNhdGlzZmllZC5cbiAgICpcbiAgICogQmVzdC1lZmZvcnQ6IGlmIHRoZSBndWVzdCBkb2VzIG5vdCByZXBvcnQgaWRsZSB3aXRoaW4gdGhlIGJ1ZGdldCBpdCBsb2dzIGFcbiAgICogd2FybmluZyBhbmQgcHJvY2VlZHMgKGEgc2xvdyBzZXNzaW9uIGlzIGJldHRlciB0aGFuIGEgZmFpbGVkIHJ1biksIGFuZCBhXG4gICAqIGJ1ZGdldCBvZiBgMGAgc2tpcHMgdGhlIHdhaXQgZW50aXJlbHkuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRCB0byBwb2xsLlxuICAgKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gTWF4aW11bSB0aW1lIHRvIHdhaXQ7IGAwYCBza2lwcyB0aGUgd2FpdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckRldmljZUlkbGUoZGV2aWNlSWQ6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGltZW91dEluTWlsbGlzZWNvbmRzIDw9IDApIHtcbiAgICAgIHRoaXMubG9nKGBTa2lwcGluZyBwb3N0LWJvb3QgaWRsZSB3YWl0IGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gKHRpbWVvdXQgaXMgMCkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gc3RhcnQgKyB0aW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGJlY29tZSBpZGxlICh0aW1lb3V0OiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLCBwb2xsOiAke1N0cmluZyhERVZJQ0VfSURMRV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBbYm9vdEFuaW1hdGlvblByb3AsIHBhY2thZ2VMaXN0T3V0cHV0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdGhpcy5nZXREZXZpY2VQcm9wKGRldmljZUlkLCAnaW5pdC5zdmMuYm9vdGFuaW0nKSxcbiAgICAgICAgdGhpcy5saXN0SW5zdGFsbGVkUGFja2FnZXMoZGV2aWNlSWQpXG4gICAgICBdKTtcblxuICAgICAgaWYgKGNoZWNrRGV2aWNlSWRsZSh7IGJvb3RBbmltYXRpb25Qcm9wLCBwYWNrYWdlTGlzdE91dHB1dCB9KSkge1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGlzIGlkbGUgYWZ0ZXIgJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IG5vdCBpZGxlIHlldCAoZWxhcHNlZDogJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcykuIFJldHJ5aW5nLi4uYCk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIERFVklDRV9JRExFX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMubG9nKFxuICAgICAgYFdhcm5pbmc6IGRldmljZSAke2RldmljZUlkfSBkaWQgbm90IHJlcG9ydCBpZGxlIHdpdGhpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zOyBwcm9jZWVkaW5nIHdpdGggc2Vzc2lvbiBlc3RhYmxpc2htZW50IGFueXdheS5gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvck5ld0RldmljZShkZXZpY2VJZHNCZWZvcmU6IHN0cmluZ1tdLCBlbXVsYXRvcjogRW11bGF0b3JMYXVuY2gsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgYSBuZXcgZGV2aWNlIHRvIGFwcGVhciBpbiBBREIgKHRpbWVvdXQ6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1N0cmluZyhFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gXG4gICAgKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgY29uc3QgY3VycmVudElkcyA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGVkRGV2aWNlSWRzKCk7XG4gICAgICBjb25zdCBuZXdJZHMgPSBjdXJyZW50SWRzLmZpbHRlcigoaWQpID0+ICFkZXZpY2VJZHNCZWZvcmUuaW5jbHVkZXMoaWQpKTtcblxuICAgICAgaWYgKG5ld0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGFjdHVhbERldmljZUlkID0gbmV3SWRzWzBdID8/ICcnO1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7YWN0dWFsRGV2aWNlSWR9IGFwcGVhcmVkIGluIEFEQiwgd2FpdGluZyBmb3IgYm9vdCB0byBjb21wbGV0ZS4uLmApO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JCb290KGFjdHVhbERldmljZUlkLCBkZWFkbGluZSwgZW11bGF0b3IpO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JEZXZpY2VJZGxlKGFjdHVhbERldmljZUlkLCBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzKTtcbiAgICAgICAgYXdhaXQgdGhpcy53YWtlU2NyZWVuKGFjdHVhbERldmljZUlkKTtcbiAgICAgICAgcmV0dXJuIGFjdHVhbERldmljZUlkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleGl0SW5mbyA9IGVtdWxhdG9yLnJlYWRFeGl0SW5mbygpO1xuICAgICAgaWYgKGV4aXRJbmZvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihidWlsZEVtdWxhdG9yRXhpdE1lc3NhZ2UoZXhpdEluZm8sIGVtdWxhdG9yLnJlYWRPdXRwdXQoKSkpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE5vIG5ldyBlbXVsYXRvciBkZXZpY2UgYXBwZWFyZWQgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWtlU2NyZWVuKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZyhgV2FraW5nIHNjcmVlbiBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uLi5gKTtcblxuICAgIGF3YWl0IHRoaXMuc2VuZEtleUV2ZW50KGRldmljZUlkLCBLRVlDT0RFX1dBS0VVUCwgJ3dha2Ugc2NyZWVuJyk7XG4gICAgYXdhaXQgdGhpcy5zZW5kS2V5RXZlbnQoZGV2aWNlSWQsIEtFWUNPREVfTUVOVSwgJ2Rpc21pc3MgbG9jayBzY3JlZW4nKTtcblxuICAgIHRoaXMubG9nKGBTY3JlZW4gd2FrZSBjb21wbGV0ZSBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlbiBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIGFuIG93bmVkIGRlc2t0b3AgQ0RQIHRyYW5zcG9ydC5cbiAqIEByZXR1cm5zIEEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGNvbnN0IHR5cGUgPSBvcHRpb25zPy50eXBlID8/IERFRkFVTFRfVFJBTlNQT1JUX1RZUEU7XG5cbiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudHlwZSA9PT0gJ29ic2lkaWFuLWNkcCcpIHtcbiAgICByZXR1cm4gY3JlYXRlQ2RwVHJhbnNwb3J0KG9wdGlvbnMpO1xuICB9XG5cbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5KHR5cGUpO1xuICByZXR1cm4gZmFjdG9yeS5jcmVhdGUob3B0aW9ucyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhY2hlZCB0cmFuc3BvcnQgaW5zdGFuY2UsIGNyZWF0aW5nIG9uZSBmcm9tIHRoZSBnaXZlbiBvcHRpb25zXG4gKiBpZiBub3QgYWxyZWFkeSBjYWNoZWQuXG4gKlxuICogVGhlIHRyYW5zcG9ydCBpcyBjYWNoZWQgcGVyIHdvcmtlciBwcm9jZXNzIHNvIFdlYlNvY2tldC9BcHBpdW0gc2Vzc2lvbnNcbiAqIGFyZSByZXVzZWQgYWNyb3NzIGNhbGxzIHdpdGhpbiB0aGUgc2FtZSB0ZXN0IHdvcmtlci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBDTEkgdHJhbnNwb3J0LlxuICogQHJldHVybnMgVGhlIGNhY2hlZCBvciBuZXdseSBjcmVhdGVkIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlVHJhbnNwb3J0KG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGlmIChjYWNoZWRUcmFuc3BvcnQpIHtcbiAgICByZXR1cm4gY2FjaGVkVHJhbnNwb3J0O1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzIC0tIFNpbmdsZS10aHJlYWRlZCB3b3JrZXI7IG5vIGNvbmN1cnJlbnQgd3JpdGVzLlxuICBjYWNoZWRUcmFuc3BvcnQgPSByZXN1bHQ7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZSBmb3IgYW4gZW11bGF0b3IgcHJvY2VzcyB0aGF0IGV4aXRlZCBkdXJpbmdcbiAqIHN0YXJ0dXAsIGFwcGVuZGluZyB0aGUgY2FwdHVyZWQgb3V0cHV0IHRhaWwgd2hlbiBhdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIGV4aXRJbmZvIC0gVGhlIGVtdWxhdG9yJ3MgZXhpdCBkZXRhaWxzLlxuICogQHBhcmFtIG91dHB1dCAtIFRoZSBjYXB0dXJlZCBzdGRvdXQrc3RkZXJyIHRhaWwuXG4gKiBAcmV0dXJucyBBIGh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkRW11bGF0b3JFeGl0TWVzc2FnZShleGl0SW5mbzogRW11bGF0b3JFeGl0SW5mbywgb3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWFzb24gPSBleGl0SW5mby5zaWduYWwgPT09IG51bGxcbiAgICA/IGBleGl0ZWQgcHJlbWF0dXJlbHkgd2l0aCBjb2RlICR7U3RyaW5nKGV4aXRJbmZvLmNvZGUpfWBcbiAgICA6IGB3YXMgdGVybWluYXRlZCBieSBzaWduYWwgJHtleGl0SW5mby5zaWduYWx9YDtcbiAgY29uc3QgdHJpbW1lZE91dHB1dCA9IG91dHB1dC50cmltKCk7XG4gIGNvbnN0IGRldGFpbHMgPSB0cmltbWVkT3V0cHV0Lmxlbmd0aCA+IDBcbiAgICA/IGBcXG5cXG5FbXVsYXRvciBvdXRwdXQgKHRhaWwpOlxcbiR7dHJpbW1lZE91dHB1dH1gXG4gICAgOiAnJztcbiAgcmV0dXJuIGBBbmRyb2lkIGVtdWxhdG9yICR7cmVhc29ufSBkdXJpbmcgc3RhcnR1cC4ke2RldGFpbHN9YDtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBwcm9hY3RpdmUgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgY2hlY2sgZm9yIGFuIGFzYXItc3dhcCBhbmQgYWN0c1xuICogb24gdGhlIHZlcmRpY3Q6IHRocm93cyB7QGxpbmsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yfSBmb3IgYW5cbiAqIGluc3RhbGxlciBiZWxvdyB0aGUgYXBwJ3MgcnVuIGZsb29yLCBhbmQgbG9ncyBhIHdhcm5pbmcgZm9yIGFcbiAqIHJ1bm5hYmxlLWJ1dC1iZWxvdy1yZWNvbW1lbmRlZCBpbnN0YWxsZXIuXG4gKlxuICogQHBhcmFtIGFwcFZlcnNpb24gLSBUaGUgYXBwIChhc2FyKSB2ZXJzaW9uIHRoYXQgd2lsbCBiZSBzd2FwcGVkIG9udG8gdGhlIHNoZWxsLFxuICogICBvciBgdW5kZWZpbmVkYCB3aGVuIG5vIGFzYXItc3dhcCB3aWxsIGhhcHBlbiAobm90aGluZyBpcyBjaGVja2VkIHRoZW4pLlxuICogQHBhcmFtIGluc3RhbGxlclZlcnNpb24gLSBUaGUgcmVzb2x2ZWQgaW5zdGFsbGVyL3NoZWxsIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgLlxuICogQHJldHVybnMgVGhlIHZlcmRpY3QsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm8gYXNhci1zd2FwIHRvIGNoZWNrLlxuICovXG5mdW5jdGlvbiBjaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHkoXG4gIGFwcFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgaW5zdGFsbGVyVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkIHtcbiAgaWYgKGFwcFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBjb21wYXRpYmlsaXR5ID0gY2hlY2tJbnN0YWxsZXJDb21wYXRpYmlsaXR5KHtcbiAgICBhcHBWZXJzaW9uLFxuICAgIGluc3RhbGxlclZlcnNpb24sXG4gICAgbWV0YWRhdGE6IGdldFZlcnNpb25NZXRhZGF0YShhcHBWZXJzaW9uKVxuICB9KTtcblxuICBpZiAoY29tcGF0aWJpbGl0eS50aWVyID09PSAndW5ydW5uYWJsZScpIHtcbiAgICB0aHJvdyBuZXcgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yKHtcbiAgICAgIGFwcFZlcnNpb246IGNvbXBhdGliaWxpdHkuYXBwVmVyc2lvbixcbiAgICAgIGluc3RhbGxlclZlcnNpb246IGVuc3VyZU5vbk51bGxhYmxlKGNvbXBhdGliaWxpdHkuaW5zdGFsbGVyVmVyc2lvbiksXG4gICAgICBtaW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb246IGVuc3VyZU5vbk51bGxhYmxlKGNvbXBhdGliaWxpdHkubWluUnVubmFibGVJbnN0YWxsZXJWZXJzaW9uKVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGNvbXBhdGliaWxpdHkudGllciA9PT0gJ25hZ2dlZCcpIHtcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdICR7ZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5tZXNzYWdlKX1gKTtcbiAgfVxuXG4gIHJldHVybiBjb21wYXRpYmlsaXR5O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkZXNrdG9wIENEUCB0cmFuc3BvcnQuIFdoZW4gYW4gZXhwbGljaXQgYHBvcnRgIGlzIGdpdmVuIHRoZVxuICogdHJhbnNwb3J0IGF0dGFjaGVzIHRvIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiBvbiB0aGF0IHBvcnQ7IG90aGVyd2lzZSBpdFxuICogbGF1bmNoZXMgYW5kIG93bnMgYW4gaXNvbGF0ZWQgaW5zdGFuY2UgKHRoZSBkZWZhdWx0LCBoZXJtZXRpYyBtb2RlKS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENEUCB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgY29uZmlndXJlZCBDRFAgdHJhbnNwb3J0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVDZHBUcmFuc3BvcnQob3B0aW9ucz86IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKG9wdGlvbnM/LnBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG93bmVkU3VmZml4ID0gb3B0aW9ucy5pc0hhcm5lc3NPd25lZEluc3RhbmNlID8gJyAoaGFybmVzcy1vd25lZCknIDogJyc7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6b2JzaWRpYW4tY2RwXSBBdHRhY2hpbmcgdG8gcnVubmluZyBPYnNpZGlhbiR7b3duZWRTdWZmaXh9IChob3N0PSR7b3B0aW9ucy5ob3N0ID8/ICdsb2NhbGhvc3QnfSwgcG9ydD0ke1N0cmluZyhvcHRpb25zLnBvcnQpfSlgKTtcbiAgICByZXR1cm4gbmV3IERlc2t0b3BDZHBUcmFuc3BvcnQoe1xuICAgICAgLi4uKG9wdGlvbnMuaG9zdCAhPT0gdW5kZWZpbmVkICYmIHsgY2RwSG9zdDogb3B0aW9ucy5ob3N0IH0pLFxuICAgICAgY2RwUG9ydDogb3B0aW9ucy5wb3J0LFxuICAgICAgLi4uKG9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzIH0pLFxuICAgICAgLi4uKG9wdGlvbnMuaXNIYXJuZXNzT3duZWRJbnN0YW5jZSAhPT0gdW5kZWZpbmVkICYmIHsgaXNIYXJuZXNzT3duZWRJbnN0YW5jZTogb3B0aW9ucy5pc0hhcm5lc3NPd25lZEluc3RhbmNlIH0pXG4gICAgfSk7XG4gIH1cblxuICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdIENyZWF0aW5nIG93bmVkIGlzb2xhdGVkIE9ic2lkaWFuIGluc3RhbmNlJyk7XG4gIGNvbnN0IG93bmVkSW5zdGFuY2UgPSBhd2FpdCByZXNvbHZlT3duZWRJbnN0YW5jZUNvbmZpZyhvcHRpb25zKTtcbiAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KHtcbiAgICAuLi4ob3B0aW9ucz8uaG9zdCAhPT0gdW5kZWZpbmVkICYmIHsgY2RwSG9zdDogb3B0aW9ucy5ob3N0IH0pLFxuICAgIC4uLihvcHRpb25zPy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSksXG4gICAgZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzOiByZXNvbHZlRGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgIC4uLihvcHRpb25zPy5pc09ic2lkaWFuQXBwVmlzaWJsZSAhPT0gdW5kZWZpbmVkICYmIHsgaXNPYnNpZGlhbkFwcFZpc2libGU6IG9wdGlvbnMuaXNPYnNpZGlhbkFwcFZpc2libGUgfSksXG4gICAgb3duZWRJbnN0YW5jZSxcbiAgICAuLi4ob3B0aW9ucz8uc2hvdWxkRGlzYWJsZVNhbmRib3ggIT09IHVuZGVmaW5lZCAmJiB7IHNob3VsZERpc2FibGVTYW5kYm94OiBvcHRpb25zLnNob3VsZERpc2FibGVTYW5kYm94IH0pXG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmcmVzaCwgaXNvbGF0ZWQgdXNlci1kYXRhIGRpcmVjdG9yeSBmb3IgYW4gb3duZWQgaW5zdGFuY2UuXG4gKlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIG5ldyBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU93bmVkVXNlckRhdGFEaXIoKTogc3RyaW5nIHtcbiAgY29uc3Qgcm9vdCA9IGpvaW4odG1wZGlyKCksICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJyk7XG4gIG1rZGlyU3luYyhyb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgcmV0dXJuIG1rZHRlbXBTeW5jKGpvaW4ocm9vdCwgT1dORURfVVNFUl9EQVRBX1BSRUZJWCkpO1xufVxuXG4vKipcbiAqIERlY2lkZXMgaG93IHRoZSByZXF1ZXN0ZWQgYXBwIChhc2FyKSB2ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCB0byBhbiBvd25lZFxuICogaW5zdGFuY2UsIHdpdGhvdXQgZG93bmxvYWRpbmcgYW55dGhpbmcgeWV0OiBhbiB1cGdyYWRlLW9ubHkgYXNhci1zd2FwIG9udG8gdGhlXG4gKiBzaGVsbCwgYSBkb3duZ3JhZGUgdG8gdGhlIGFwcCdzIG93biBpbnN0YWxsZXIgc2hlbGwsIG9yIHRoZSB1c2VyJ3MgbmV3ZXN0XG4gKiBpbnN0YWxsZWQgYXNhciB3aGVuIG5laXRoZXIgdmVyc2lvbiBpcyBwaW5uZWQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDRFAgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcGFyYW0gc2hlbGxWZXJzaW9uIC0gVGhlIHJlc29sdmVkIGluc3RhbGxlci9zaGVsbCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYC5cbiAqIEByZXR1cm5zIFRoZSBhc2FyIHBsYW4gKGF0IG1vc3Qgb25lIG9mIGl0cyBmaWVsZHMgaXMgc2V0KS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUFzYXJQbGFuKFxuICBvcHRpb25zOiBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPEFzYXJQbGFuPiB7XG4gIGlmIChvcHRpb25zPy5vYnNpZGlhblZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGFzYXJWZXJzaW9uID0gYXdhaXQgcmVzb2x2ZUNvbmNyZXRlVmVyc2lvbihvcHRpb25zLm9ic2lkaWFuVmVyc2lvbik7XG4gICAgaWYgKHNoZWxsVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIGNvbXBhcmVWZXJzaW9ucyhhc2FyVmVyc2lvbiwgc2hlbGxWZXJzaW9uKSA+PSAwKSB7XG4gICAgICByZXR1cm4geyBhc2FyVmVyc2lvblRvU3dhcDogYXNhclZlcnNpb24gfTtcbiAgICB9XG5cbiAgICAvLyBBc2FyLXN3YXAgaXMgdXBncmFkZS1vbmx5LCBzbyBpdCBjYW5ub3QgYXBwbHkgYSB2ZXJzaW9uIG9sZGVyIHRoYW4gdGhlXG4gICAgLy8gU2hlbGwncyBidW5kbGVkIG9uZSBcdTIwMTQgYW5kIHdoZW4gdGhlIHNoZWxsIHZlcnNpb24gaXMgdW5rbm93biAoYSBMaW51eFxuICAgIC8vIFBhdGgtcGFyc2UgbWlzcykgd2UgY2Fubm90IHByb3ZlIHRoZSBzd2FwIHdvdWxkIGFwcGx5IGF0IGFsbC4gSW4gYm90aFxuICAgIC8vIENhc2VzIHVzZSB0aGUgcmVxdWVzdGVkIHZlcnNpb24ncyBvd24gaW5zdGFsbGVyIHNoZWxsLCB3aG9zZSBidW5kbGVkIGFzYXJcbiAgICAvLyBJcyBleGFjdGx5IHRoaXMgdmVyc2lvbiwgc28gdGhlIHBpbiBpcyBhbHdheXMgaG9ub3JlZC5cbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdIFVzaW5nIHRoZSAke2FzYXJWZXJzaW9ufSBpbnN0YWxsZXIgc2hlbGwgKHNoZWxsIHZlcnNpb24gJHtzaGVsbFZlcnNpb24gPz8gJ3Vua25vd24nfTsgYXNhci1zd2FwIGlzIHVwZ3JhZGUtb25seSkuYCk7XG4gICAgcmV0dXJuIHsgZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbjogYXNhclZlcnNpb24gfTtcbiAgfVxuXG4gIGlmIChvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG5ld2VzdCA9IGZpbmROZXdlc3RBc2FyKGdldE9ic2lkaWFuQ29uZmlnRGlyKCkpO1xuICAgIGlmIChuZXdlc3QgJiYgKHNoZWxsVmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8IGNvbXBhcmVWZXJzaW9ucyhuZXdlc3QudmVyc2lvbiwgc2hlbGxWZXJzaW9uKSA+PSAwKSkge1xuICAgICAgcmV0dXJuIHsgYXNhcjogeyBwYXRoOiBuZXdlc3QucGF0aCwgdmVyc2lvbjogbmV3ZXN0LnZlcnNpb24gfSB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7fTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgbG9jYWxseS1pbnN0YWxsZWQgT2JzaWRpYW4gc2hlbGwsIHRvbGVyYXRpbmcgaXRzIGFic2VuY2UuXG4gKlxuICogVW5saWtlIHtAbGluayByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlfSAod2hpY2ggdGhyb3dzIHdoZW4gT2JzaWRpYW4gaXMgbm90XG4gKiBpbnN0YWxsZWQpLCB0aGlzIHJldHVybnMgYHVuZGVmaW5lZGAgaW4gdGhhdCBjYXNlLCBzbyBhIGNhbGxlciBwaW5uaW5nIGFuXG4gKiBpbnN0YWxsZXIgdmVyc2lvbiBjYW4gZmFsbCBiYWNrIHRvIGRvd25sb2FkaW5nIHRoZSBwaW5uZWQgc2hlbGwgaW5zdGVhZCBvZlxuICogZmFpbGluZyBvbiBhIGhvc3Qgd2l0aCBubyBPYnNpZGlhbiBpbnN0YWxsZWQgKGUuZy4gQ0kpLlxuICpcbiAqIEByZXR1cm5zIFRoZSBpbnN0YWxsZWQgc2hlbGwncyBwYXRoIGFuZCBkZXRlY3RlZCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuXG4gKiAgIG5vIE9ic2lkaWFuIGlzIGluc3RhbGxlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUluc3RhbGxlZFNoZWxsT3JOdWxsKCk6IFByb21pc2U8SW5zdGFsbGVkU2hlbGwgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBleGVQYXRoID0gYXdhaXQgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZSgpO1xuICAgIHJldHVybiB7IGV4ZVBhdGgsIHNoZWxsVmVyc2lvbjogZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uKGV4ZVBhdGgpIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgc2hlbGwgZXhlY3V0YWJsZSwgYXNhciBwcm92aXNpb25pbmcsIGFuZCBpc29sYXRlZCB1c2VyLWRhdGEgZGlyXG4gKiBmb3IgYSBoYXJuZXNzLW93bmVkIGluc3RhbmNlIGZyb20gdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIGtub2JzLlxuICpcbiAqIC0gYG9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbmAgcGlucyB0aGUgRWxlY3Ryb24gc2hlbGwgKGRvd25sb2FkcyArIGV4dHJhY3RzIGFcbiAqICAgcG9ydGFibGUgYnVpbGQgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhlIGluc3RhbGxlZCBzaGVsbCkuXG4gKiAtIGBvYnNpZGlhblZlcnNpb25gIHBpbnMgdGhlIGFwcDogYW4gYXNhci1zd2FwIHdoZW4gaXQgaXMgPj0gdGhlIHNoZWxsIHZlcnNpb25cbiAqICAgKGNoZWFwKSwgb3RoZXJ3aXNlIHRoZSBtYXRjaGluZyBpbnN0YWxsZXIgc2hlbGwgaXMgdXNlZCAoZG93bmdyYWRlKS5cbiAqIC0gV2hlbiBuZWl0aGVyIGlzIHNldCwgdGhlIHVzZXIncyBuZXdlc3QgaW5zdGFsbGVkIGFzYXIgaXMgY29waWVkIGluIChzbyB0aGVcbiAqICAgb3duZWQgaW5zdGFuY2UgbWF0Y2hlcyB0aGUgdmVyc2lvbiB0aGUgdXNlciBjdXJyZW50bHkgcnVucykgd2l0aCB6ZXJvIG5ldHdvcmsuXG4gKlxuICogVGhlIGNvbmNyZXRlIChhcHAsIGluc3RhbGxlcikgdmVyc2lvbiBwYWlyIGlzIHJlc29sdmVkICpiZWZvcmUqIGFueSBzaGVsbC9hc2FyXG4gKiBkb3dubG9hZCwgc28gYSBwcm9hY3RpdmUgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgY2hlY2tcbiAqICh7QGxpbmsgY2hlY2tJbnN0YWxsZXJDb21wYXRpYmlsaXR5fSkgY2FuIGZhaWwgZmFzdDogYW4gaW5zdGFsbGVyIGJlbG93IHRoZVxuICogYXBwJ3MgcnVuIGZsb29yIHRocm93cyB7QGxpbmsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yfSBiZWZvcmVcbiAqIGFueXRoaW5nIGlzIGRvd25sb2FkZWQgb3IgbGF1bmNoZWQgKHN1cGVyc2VkaW5nIHRoZSByZWFjdGl2ZSBkZWFkLWJvb3RcbiAqIGZhc3QtZmFpbCBmb3IgdGFibGUta25vd24gY29tYm9zKSwgYW5kIGEgcnVubmFibGUtYnV0LWJlbG93LXJlY29tbWVuZGVkXG4gKiBpbnN0YWxsZXIgbG9ncyBhIHdhcm5pbmcuIFRoZSB2ZXJkaWN0IGlzIHRocmVhZGVkIG9udG8gdGhlIHJldHVybmVkIGNvbmZpZyBzb1xuICogdGhlIHRyYW5zcG9ydCBjYW4gc3VyZmFjZSBpdCBhcyBkYXRhLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ0RQIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIG93bmVkLWluc3RhbmNlIGNvbmZpZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU93bmVkSW5zdGFuY2VDb25maWcob3B0aW9ucz86IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T3duZWRJbnN0YW5jZUNvbmZpZz4ge1xuICAvLyBSZXNvbHZlIHRoZSBjb25jcmV0ZSBzaGVsbCAoaW5zdGFsbGVyKSB2ZXJzaW9uIGZpcnN0LCBidXQgZm9yIGEgcGlubmVkXG4gIC8vIEluc3RhbGxlciBERUZFUiByZXNvbHZpbmcvZG93bmxvYWRpbmcgdGhlIGFjdHVhbCBzaGVsbCB1bnRpbCBhZnRlciB0aGVcbiAgLy8gUHJvYWN0aXZlIGNvbXBhdGliaWxpdHkgY2hlY2ssIHNvIGFuIHVucnVubmFibGUgcGluIGZhaWxzIGZhc3QgXHUyMDE0IGJlZm9yZSB0aGVcbiAgLy8gKHBvc3NpYmx5IHNsb3cpIGluc3RhbGxlZC1zaGVsbCBkZXRlY3Rpb24gYW5kIGFueSBkb3dubG9hZC5cbiAgbGV0IGV4ZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgcGlubmVkSW5zdGFsbGVyVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZVBhdGggPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlKCk7XG4gICAgc2hlbGxWZXJzaW9uID0gZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uKGV4ZVBhdGgpO1xuICB9IGVsc2Uge1xuICAgIC8vIEEgcGlubmVkIGluc3RhbGxlciB2ZXJzaW9uIGZ1bGx5IGRldGVybWluZXMgdGhlIHNoZWxsIHZlcnNpb24gdXAgZnJvbnQsXG4gICAgLy8gV2l0aG91dCByZXF1aXJpbmcgYSBsb2NhbGx5LWluc3RhbGxlZCBPYnNpZGlhbiAoYSBDSSBydW5uZXIgaGFzIG5vbmUpLlxuICAgIHBpbm5lZEluc3RhbGxlclZlcnNpb24gPSBhd2FpdCByZXNvbHZlQ29uY3JldGVWZXJzaW9uKG9wdGlvbnMub2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uKTtcbiAgICBzaGVsbFZlcnNpb24gPSBwaW5uZWRJbnN0YWxsZXJWZXJzaW9uO1xuICB9XG5cbiAgLy8gRGVjaWRlIGhvdyB0aGUgYXBwIChhc2FyKSB2ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCwgc3RpbGwgV0lUSE9VVCBkb3dubG9hZGluZy5cbiAgY29uc3QgcGxhbiA9IGF3YWl0IHJlc29sdmVBc2FyUGxhbihvcHRpb25zLCBzaGVsbFZlcnNpb24pO1xuXG4gIC8vIFRoZSBhcHAgdmVyc2lvbiB0aGF0IHdpbGwgcnVuIGFzIGFuIGFzYXItc3dhcCBvbnRvIGBzaGVsbFZlcnNpb25gIFx1MjAxNCB0aGUgb25seVxuICAvLyBDb21iaW5hdGlvbiB0aGF0IGNhbiBkZWFkLWJvb3QuIFRoZSBkb3duZ3JhZGUgLyBvd24taW5zdGFsbGVyIHBhdGhzIHJ1biB0aGVcbiAgLy8gQXBwJ3Mgb3duIGluc3RhbGxlciBzaGVsbCwgc28gdGhleSBhbHdheXMgYm9vdCBhbmQgYXJlIG5vdCBjaGVja2VkLlxuICBjb25zdCBzd2FwQXBwVmVyc2lvbiA9IHBsYW4uYXNhclZlcnNpb25Ub1N3YXAgPz8gcGxhbi5hc2FyPy52ZXJzaW9uO1xuICBjb25zdCBjb21wYXRpYmlsaXR5ID0gY2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5KHN3YXBBcHBWZXJzaW9uLCBzaGVsbFZlcnNpb24pO1xuXG4gIC8vIFRoZSBwaW4gaXMga25vd24gcnVubmFibGUgXHUyMDE0IHJlc29sdmUvZG93bmxvYWQgdGhlIGRlZmVycmVkIHNoZWxsICsgYXNhciBub3cuXG4gIC8vIFJldXNlIHRoZSBpbnN0YWxsZWQgc2hlbGwgb25seSB3aGVuIGl0IGFscmVhZHkgbWF0Y2hlcyB0aGUgcGluIChzYXZlcyB0aGVcbiAgLy8gRG93bmxvYWQpOyBvdGhlcndpc2UgZG93bmxvYWQgYW5kIGV4dHJhY3QgdGhlIHBpbm5lZCBpbnN0YWxsZXIuXG4gIGlmIChwaW5uZWRJbnN0YWxsZXJWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBpbnN0YWxsZWQgPSBhd2FpdCByZXNvbHZlSW5zdGFsbGVkU2hlbGxPck51bGwoKTtcbiAgICBleGVQYXRoID0gaW5zdGFsbGVkPy5zaGVsbFZlcnNpb24gPT09IHBpbm5lZEluc3RhbGxlclZlcnNpb24gPyBpbnN0YWxsZWQuZXhlUGF0aCA6IGF3YWl0IGVuc3VyZVNoZWxsQ2FjaGVkKHBpbm5lZEluc3RhbGxlclZlcnNpb24pO1xuICB9XG4gIGlmIChwbGFuLmRvd25ncmFkZUluc3RhbGxlclZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZVBhdGggPSBhd2FpdCBlbnN1cmVTaGVsbENhY2hlZChwbGFuLmRvd25ncmFkZUluc3RhbGxlclZlcnNpb24pO1xuICB9XG5cbiAgY29uc3QgYXNhciA9IHBsYW4uYXNhclZlcnNpb25Ub1N3YXAgPT09IHVuZGVmaW5lZFxuICAgID8gcGxhbi5hc2FyXG4gICAgOiB7IHBhdGg6IGF3YWl0IGVuc3VyZUFzYXJDYWNoZWQocGxhbi5hc2FyVmVyc2lvblRvU3dhcCksIHZlcnNpb246IHBsYW4uYXNhclZlcnNpb25Ub1N3YXAgfTtcblxuICByZXR1cm4ge1xuICAgIC4uLihhc2FyICYmIHsgYXNhciB9KSxcbiAgICAuLi4oY29tcGF0aWJpbGl0eSAmJiB7IGNvbXBhdGliaWxpdHkgfSksXG4gICAgZXhlUGF0aDogZW5zdXJlTm9uTnVsbGFibGUoZXhlUGF0aCksXG4gICAgdXNlckRhdGFEaXI6IGNyZWF0ZU93bmVkVXNlckRhdGFEaXIoKVxuICB9O1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYENvbm5lY3Rpb25gIGFuZCBgQ29udGVudC1MZW5ndGhgIGZyb20gYSBXZWJEcml2ZXIgcmVxdWVzdCdzIGhlYWRlcnMuXG4gKlxuICogVGhlIGJ1bmRsZWQgYHdlYmRyaXZlcmAgcGFja2FnZSBzZXRzIGJvdGggaGVhZGVycyBleHBsaWNpdGx5LiBUaGV5IGFyZVxuICogZm9yYmlkZGVuIHJlcXVlc3QgaGVhZGVycyBwZXIgdGhlIEZldGNoIHNwZWM6IE5vZGUgdXAgdG8gMjUgYWNjZXB0ZWQgdGhlbVxuICogc2lsZW50bHksIGJ1dCBOb2RlIDI2IHJlamVjdHMgdGhlbSB3aXRoIGBVTkRfRVJSX0lOVkFMSURfQVJHYCwgYnJlYWtpbmcgdGhlXG4gKiBBcHBpdW0gYC9zZXNzaW9uYCByZXF1ZXN0LiBUaGUgdHJhbnNwb3J0IGxheWVyIG1hbmFnZXMgY29ubmVjdGlvbiByZXVzZSBhbmRcbiAqIHRoZSBGZXRjaCBBUEkgY29tcHV0ZXMgYENvbnRlbnQtTGVuZ3RoYCBmcm9tIHRoZSBib2R5LCBzbyBkcm9wcGluZyBib3RoIGlzXG4gKiBzYWZlIG9uIGV2ZXJ5IE5vZGUgdmVyc2lvbi4gU2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vd2ViZHJpdmVyaW8vd2ViZHJpdmVyaW8vaXNzdWVzLzE1MjY1fS5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdE9wdGlvbnMgLSBUaGUgcmVxdWVzdCBvcHRpb25zIGFib3V0IHRvIGJlIHNlbnQgYnkgV2ViRHJpdmVySU8uXG4gKiBAcmV0dXJucyBUaGUgc2FtZSByZXF1ZXN0IG9wdGlvbnMgd2l0aCB0aGUgZm9yYmlkZGVuIGhlYWRlcnMgcmVtb3ZlZC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBGb3JiaWRkZW5GZXRjaEhlYWRlcnMocmVxdWVzdE9wdGlvbnM6IFJlcXVlc3RJbml0KTogUmVxdWVzdEluaXQge1xuICBpZiAocmVxdWVzdE9wdGlvbnMuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICByZXF1ZXN0T3B0aW9ucy5oZWFkZXJzLmRlbGV0ZSgnQ29ubmVjdGlvbicpO1xuICAgIHJlcXVlc3RPcHRpb25zLmhlYWRlcnMuZGVsZXRlKCdDb250ZW50LUxlbmd0aCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlcXVlc3RPcHRpb25zO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7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QUNwRCxRQUFJLFdBQVcsaUJBQWlCLGNBQWEseUNBQWdCLE9BQU8sU0FBUyxZQUFZLEtBQUssSUFBSTtBQUNoRyxhQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sT0FBTyxNQUFNLFNBQVMsT0FBTyxRQUFRLEVBQUU7QUFBQSxJQUNoRTtBQUFBLEVBQ0Y7QUFFQSxTQUFPLENBQUM7QUFDVjtBQWFBLGVBQWUsOEJBQW1FO0FBQ2hGLE1BQUk7QUFDRixVQUFNLFVBQVUsVUFBTSxzREFBMEI7QUFDaEQsV0FBTyxFQUFFLFNBQVMsa0JBQWMsdURBQTRCLE9BQU8sRUFBRTtBQUFBLEVBQ3ZFLFFBQVE7QUFDTixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBeUJBLGVBQWUsMkJBQTJCLFNBQXFFO0FBSzdHLE1BQUk7QUFDSixNQUFJO0FBQ0osTUFBSTtBQUVKLE1BQUksU0FBUyw2QkFBNkIsUUFBVztBQUNuRCxjQUFVLFVBQU0sc0RBQTBCO0FBQzFDLHVCQUFlLHVEQUE0QixPQUFPO0FBQUEsRUFDcEQsT0FBTztBQUdMLDZCQUF5QixVQUFNLHVEQUF1QixRQUFRLHdCQUF3QjtBQUN0RixtQkFBZTtBQUFBLEVBQ2pCO0FBR0EsUUFBTSxPQUFPLE1BQU0sZ0JBQWdCLFNBQVMsWUFBWTtBQUt4RCxRQUFNLGlCQUFpQixLQUFLLHFCQUFxQixLQUFLLE1BQU07QUFDNUQsUUFBTSxnQkFBZ0IsNEJBQTRCLGdCQUFnQixZQUFZO0FBSzlFLE1BQUksMkJBQTJCLFFBQVc7QUFDeEMsVUFBTSxZQUFZLE1BQU0sNEJBQTRCO0FBQ3BELGNBQVUsV0FBVyxpQkFBaUIseUJBQXlCLFVBQVUsVUFBVSxVQUFNLDZDQUFrQixzQkFBc0I7QUFBQSxFQUNuSTtBQUNBLE1BQUksS0FBSyw4QkFBOEIsUUFBVztBQUNoRCxjQUFVLFVBQU0sNkNBQWtCLEtBQUsseUJBQXlCO0FBQUEsRUFDbEU7QUFFQSxRQUFNLE9BQU8sS0FBSyxzQkFBc0IsU0FDcEMsS0FBSyxPQUNMLEVBQUUsTUFBTSxVQUFNLGlEQUFpQixLQUFLLGlCQUFpQixHQUFHLFNBQVMsS0FBSyxrQkFBa0I7QUFFNUYsU0FBTztBQUFBLElBQ0wsR0FBSSxRQUFRLEVBQUUsS0FBSztBQUFBLElBQ25CLEdBQUksaUJBQWlCLEVBQUUsY0FBYztBQUFBLElBQ3JDLGFBQVMsc0NBQWtCLE9BQU87QUFBQSxJQUNsQyxhQUFhLHVCQUF1QjtBQUFBLEVBQ3RDO0FBQ0Y7QUFlQSxTQUFTLDJCQUEyQixnQkFBMEM7QUFDNUUsTUFBSSxlQUFlLG1CQUFtQixTQUFTO0FBQzdDLG1CQUFlLFFBQVEsT0FBTyxZQUFZO0FBQzFDLG1CQUFlLFFBQVEsT0FBTyxnQkFBZ0I7QUFBQSxFQUNoRDtBQUVBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFsiaHR0cCIsICJraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMiLCAicHJvY2VzcyJdCn0K
@@ -14,4 +14,4 @@ var __copyProps = (to, from, except, desc) => {
14
14
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
15
  var transport_options_exports = {};
16
16
  module.exports = __toCommonJS(transport_options_exports);
17
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1vcHRpb25zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiB0eXBlcyBmb3IgY29uZmlndXJpbmcgdGhlIE9ic2lkaWFuIHRyYW5zcG9ydFxuICogdmlhIHZpdGVzdCBgZW52aXJvbm1lbnRPcHRpb25zYC5cbiAqL1xuXG4vKipcbiAqIFRyYW5zcG9ydCBvcHRpb25zIGZvciBBbmRyb2lkIHRlc3RpbmcgdmlhIEFwcGl1bSBXZWJWaWV3IGluamVjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFwcCBwYWNrYWdlIChBbmRyb2lkKSBvciBidW5kbGUgSUQgKGlPUykuXG4gICAqIERlZmF1bHRzIHRvIGAnbWQub2JzaWRpYW4nYFxuICAgKi9cbiAgcmVhZG9ubHkgYXBwSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgdG8gYmVjb21lIHJlYWR5XG4gICAqIChpdHMgYC9zdGF0dXNgIGVuZHBvaW50IHRvIHJlc3BvbmQpLlxuICAgKlxuICAgKiBPbmx5IGFwcGxpZXMgd2hlbiB0aGUgaGFybmVzcyBhdXRvLXN0YXJ0cyB0aGUgQXBwaXVtIHNlcnZlclxuICAgKiAoe0BsaW5rIHNob3VsZEF1dG9TdGFydEFwcGl1bX0pOyBpZ25vcmVkIHdoZW4gYXR0YWNoaW5nIHRvIGFuXG4gICAqIGFscmVhZHktcnVubmluZyBzZXJ2ZXIuIE9uIGEgY29sZCBtYWNoaW5lIHRoZSBgbnB4IGFwcGl1bWAgc2VydmVyIGNhbiB0YWtlXG4gICAqIGEgd2hpbGUgdG8gZmluaXNoIGJvb3RpbmcsIHNvIHJhaXNlIHRoaXMgaWYgc3RhcnR1cCB0aW1lcyBvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxODAwMDBgXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMIChlLmcuIGAnaHR0cDovL2xvY2FsaG9zdDo0NzIzJ2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwaXVtVXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBbmRyb2lkIEFWRCAoQW5kcm9pZCBWaXJ0dWFsIERldmljZSkgbmFtZS5cbiAgICpcbiAgICogVGhlIHRyYW5zcG9ydCBmYWN0b3J5IGxhdW5jaGVzIGBlbXVsYXRvciAtYXZkIDxhdmROYW1lPmAgYXMgYSBiYWNrZ3JvdW5kXG4gICAqIHByb2Nlc3MgYW5kIHBvbGxzIHVudGlsIHRoZSBkZXZpY2UgYXBwZWFycy4gVGhlIGVtdWxhdG9yIGlzIGtpbGxlZFxuICAgKiBvbiB0cmFuc3BvcnQgZGlzcG9zYWwuXG4gICAqXG4gICAqIFJ1biBgZW11bGF0b3IgLWxpc3QtYXZkc2AgdG8gc2VlIGF2YWlsYWJsZSBBVkQgbmFtZXMuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgVURJRCB0byByZXVzZSAoZS5nLiBgJ2VtdWxhdG9yLTU1NTQnYCkuXG4gICAqXG4gICAqIFBvcHVsYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBnbG9iYWwgc2V0dXAgYWZ0ZXIgdGhlIEFwcGl1bSBzZXNzaW9uIGlzXG4gICAqIGVzdGFibGlzaGVkLiBXaGVuIHByZXNlbnQgYWxvbmdzaWRlIHtAbGluayBzZXNzaW9uSWR9LCB0aGUgdHJhbnNwb3J0XG4gICAqIGZhY3Rvcnkgc2tpcHMgZW11bGF0b3Igc3RhcnR1cCBhbmQgYXR0YWNoZXMgdG8gdGhlIGV4aXN0aW5nIHNlc3Npb24uXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHdhaXRpbmcsIGFmdGVyIGBzeXMuYm9vdF9jb21wbGV0ZWRgLCBmb3IgYVxuICAgKiBoYXJuZXNzLXN0YXJ0ZWQgZW11bGF0b3IgdG8gYmVjb21lIGlkbGUgYmVmb3JlIHRoZSBBcHBpdW0gc2Vzc2lvbiBpc1xuICAgKiBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogYHN5cy5ib290X2NvbXBsZXRlZGAgZmlyZXMgKmJlZm9yZSogdGhlIGd1ZXN0IGlzIGFjdHVhbGx5IGlkbGU6IHBhY2thZ2VcbiAgICogb3B0aW1pemF0aW9uIGFuZCBzeXN0ZW0gc2VydmljZXMga2VlcCBjaHVybmluZywgc28gZXN0YWJsaXNoaW5nIHRoZSBzZXNzaW9uXG4gICAqIGltbWVkaWF0ZWx5IG1ha2VzIGV2ZXJ5IG9uZSBvZiBVaUF1dG9tYXRvcjIncyBzZXJpYWxpemVkIGBhZGJgIHJvdW5kLXRyaXBzXG4gICAqIGNvbnRlbmQgd2l0aCB0aGF0IHdvcmsgYW5kIGluZmxhdGVzIHNlc3Npb24gZXN0YWJsaXNobWVudCB+M3guIFRoZSBmYWN0b3J5XG4gICAqIGluc3RlYWQgd2FpdHMgdW50aWwgdGhlIGJvb3QgYW5pbWF0aW9uIGhhcyBzdG9wcGVkIGFuZCB0aGUgcGFja2FnZSBtYW5hZ2VyXG4gICAqIGlzIHNlcnZpbmcsIHByb2NlZWRpbmcgZWFybHkgb25jZSBpZGxlIG9yIGFmdGVyIHRoaXMgYnVkZ2V0IChiZXN0LWVmZm9ydCBcdTIwMTQgYVxuICAgKiB0aW1lb3V0IGxvZ3MgYSB3YXJuaW5nIGFuZCBwcm9jZWVkcykuIFNldCBgMGAgdG8gc2tpcCB0aGUgd2FpdC4gT25seSBhcHBsaWVzXG4gICAqIHRvIGEgaGFybmVzcy1zdGFydGVkIGVtdWxhdG9yLCBub3QgYSByZXVzZWQgb25lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDBgXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBjb25zb2xlIHdpbmRvdyBpcyBzaG93bi5cbiAgICpcbiAgICogV2hlbiBgZmFsc2VgICh0aGUgZGVmYXVsdCksIHRoZSBgbnB4IGFwcGl1bWAgc2VydmVyIHByb2Nlc3MgaXMgc3Bhd25lZCB3aXRoXG4gICAqIGl0cyBjb25zb2xlIHdpbmRvdyBoaWRkZW4gKGB3aW5kb3dzSGlkZWApLCBzbyBpdCBuZXZlciBzdGVhbHMgZm9jdXMuIElnbm9yZWRcbiAgICogd2hlbiBhdHRhY2hpbmcgdG8gYW4gYWxyZWFkeS1ydW5uaW5nIEFwcGl1bSBzZXJ2ZXIgKHtAbGluayBzaG91bGRBdXRvU3RhcnRBcHBpdW19XG4gICAqIGBmYWxzZWAsIG9yIHRoZSBzZXJ2ZXIgYWxyZWFkeSByZWFjaGFibGUpLiBTZXQgYHRydWVgIHRvIHNlZSB0aGUgc2VydmVyIGxvZyB3aW5kb3cuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzQXBwaXVtQ29uc29sZVZpc2libGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgQW5kcm9pZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gb24gc2NyZWVuLlxuICAgKlxuICAgKiBXaGVuIGBmYWxzZWAgKHRoZSBkZWZhdWx0KSwgdGhlIGVtdWxhdG9yIGlzIHN0YXJ0ZWQgd2l0aCBgLW5vLXdpbmRvd2BcbiAgICogKGhlYWRsZXNzKSwgc28gaXQgbmV2ZXIgc3RlYWxzIGZvY3VzLiBJZ25vcmVkIHdoZW4gcmV1c2luZyBhbiBhbHJlYWR5LXJ1bm5pbmdcbiAgICogZGV2aWNlIChub3RoaW5nIGlzIGxhdW5jaGVkIHRvIGhpZGUpLiBTZXQgYHRydWVgIHRvIHdhdGNoIHRoZSBlbXVsYXRvciBVSS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbXVsYXRvclZpc2libGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgYGFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHlgIGFmdGVyXG4gICAqIHRoZSB2YXVsdCBpcyAocmUpb3BlbmVkLlxuICAgKlxuICAgKiBSZWdpc3RlcmluZyBhIHZhdWx0IHRyaWdnZXJzIGEgZnVsbCBPYnNpZGlhbiByZS1pbml0IChgbG9jYXRpb24ucmVsb2FkKClgXG4gICAqIHJlb3BlbnMgdGhlIHZhdWx0IGFuZCByZWxvYWRzIGV2ZXJ5IHBsdWdpbiBcdTIwMTQgdGhlIGhlYXZpZXN0IHN0YXJ0dXAgc3RlcCkuIE9uXG4gICAqIGEgY29sZC1ib290ZWQgb3IgdW5kZXItcHJvdmlzaW9uZWQgZW11bGF0b3IgdGhhdCBpbml0IGNhbiB0YWtlIGEgd2hpbGUsIHNvXG4gICAqIHRoaXMgYnVkZ2V0IGlzIHRoZSBsYXJnZXN0IG9mIHRoZSB0cmFuc3BvcnQgdGltZW91dHMuIFJhaXNlIGl0IGZ1cnRoZXIgaWZcbiAgICogcmVsZWFzZXMgc3RpbGwgZmxha2Ugb24gc2xvdyBDSSBlbXVsYXRvcnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA5MDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgZXN0YWJsaXNoaW5nIHRoZSBBcHBpdW0gc2Vzc2lvbiAoV2ViRHJpdmVySU9cbiAgICogYHJlbW90ZSgpYCBcdTIwMTQgVWlBdXRvbWF0b3IyIHNlcnZlciBpbnN0YWxsICsgYXBwIGxhdW5jaCkuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIGxhcmdlc3QgYW5kIG1vc3QgbG9hZC1zZW5zaXRpdmUgc3RlcCBvZiB0aGUgQW5kcm9pZCBzZXR1cDpcbiAgICogb24gYSBjb2xkIG9yIGNvbnRlbmRlZCBlbXVsYXRvciBpdCBkb21pbmF0ZXMgc3RhcnR1cCBhbmQgY2FuIHRha2UgYSBmZXdcbiAgICogbWludXRlcy4gUmFpc2UgaXQgaWYgc2Vzc2lvbiBlc3RhYmxpc2htZW50IHRpbWVzIG91dCB1bmRlciBsb2FkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTgwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQW4gZXhpc3RpbmcgQXBwaXVtIHNlc3Npb24gSUQgdG8gcmVhdHRhY2ggdG8uXG4gICAqXG4gICAqIFBvcHVsYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBnbG9iYWwgc2V0dXAgYW5kIHByb3ZpZGVkIHRvIHRlc3Qgd29ya2Vyc1xuICAgKiB2aWEgdGhlIGZyYW1ld29yaydzIGNvbnRleHQgbWVjaGFuaXNtIChlLmcuIFZpdGVzdCBgcHJvdmlkZWAvYGluamVjdGApLlxuICAgKiBXaGVuIHByZXNlbnQsIHRoZSB0cmFuc3BvcnQgZmFjdG9yeSB1c2VzIFdlYkRyaXZlcklPJ3MgYGF0dGFjaCgpYCBpbnN0ZWFkXG4gICAqIG9mIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24sIGF2b2lkaW5nIGR1cGxpY2F0ZSBBcHBpdW0vQURCIGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbklkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgc3RhcnQgdGhlIEFwcGl1bSBzZXJ2ZXIgaWYgaXQgaXMgbm90IHJlYWNoYWJsZS5cbiAgICpcbiAgICogV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgdGhlIHRyYW5zcG9ydCBmYWN0b3J5IHNwYXducyBgbnB4IGFwcGl1bWBcbiAgICogYXMgYSBiYWNrZ3JvdW5kIHByb2Nlc3Mgd2hlbiB0aGUgcHJlZmxpZ2h0IGNoZWNrIGZhaWxzLCBhbmQga2lsbHMgaXRcbiAgICogb24gdHJhbnNwb3J0IGRpc3Bvc2FsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEF1dG9TdGFydEFwcGl1bT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERpc2NyaW1pbmFudCBmb3IgdGhlIHRyYW5zcG9ydCB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJztcblxuICAvKipcbiAgICogQmFzZSBwYXRoIG9uIHRoZSBkZXZpY2Ugd2hlcmUgT2JzaWRpYW4gc3RvcmVzIHZhdWx0cy5cbiAgICpcbiAgICogRGVmYXVsdHM6XG4gICAqIC0gQW5kcm9pZDogYC9zZGNhcmQvRG9jdW1lbnRzL2BcbiAgICogLSBpT1M6IGBAbWQub2JzaWRpYW46ZG9jdW1lbnRzL2BcbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0QmFzZVBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB3YWl0aW5nIGZvciB0aGUgV2ViVmlldyBjb250ZXh0IHRvIGJlY29tZSBhdmFpbGFibGUuXG4gICAqXG4gICAqIE9uIHNsb3cgZW11bGF0b3JzLCB0aGUgQ2hyb21lRHJpdmVyIHByb3h5IHRoYXQgaGFuZGxlcyBXZWJWaWV3IGNvbW1hbmRzXG4gICAqIG1heSBub3QgYmUgcmVhZHkgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIEFwcGl1bSBzZXNzaW9uIHN0YXJ0cy4gVGhpcyB0aW1lb3V0XG4gICAqIGNvbnRyb2xzIGhvdyBsb25nIHRvIHBvbGwgYmVmb3JlIGdpdmluZyB1cC5cbiAgICpcbiAgICogQGRlZmF1bHQgYDYwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgd2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUcmFuc3BvcnQgb3B0aW9ucyBmb3IgZGVza3RvcCB0ZXN0aW5nIHZpYSBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2wuXG4gKlxuICogVGhpcyBpcyB0aGUgZGVmYXVsdCBkZXNrdG9wIHRyYW5zcG9ydC4gQnkgZGVmYXVsdCB0aGUgaGFybmVzcyAqKmxhdW5jaGVzIGFuZFxuICogb3ducyBhbiBpc29sYXRlZCBPYnNpZGlhbiBpbnN0YW5jZSoqIGluIGEgdGVtcG9yYXJ5IHVzZXItZGF0YSBkaXIgKG5ldmVyXG4gKiB0b3VjaGluZyB0aGUgdXNlcidzIE9ic2lkaWFuKSwgY29ubmVjdGVkIG92ZXIgYSBmcmVlIENEUCBwb3J0LiBQcm92aWRlXG4gKiB7QGxpbmsgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zLnBvcnR9IHRvIGluc3RlYWQgYXR0YWNoIHRvIGFuXG4gKiBhbHJlYWR5LXJ1bm5pbmcgT2JzaWRpYW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBpbmRpdmlkdWFsIENEUCBjb21tYW5kcy5cbiAgICogRGVmYXVsdHMgdG8gMzAwMDBcbiAgICovXG4gIHJlYWRvbmx5IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEdyYWNlIHdpbmRvdyBpbiBtaWxsaXNlY29uZHMgZm9yIGZhc3QtZmFpbGluZyBhICoqZGVhZCBib290Kiogb2YgdGhlIG93bmVkXG4gICAqIGluc3RhbmNlLlxuICAgKlxuICAgKiBXaGVuIGFuIGFzYXIgY2Fubm90IHJ1biBvbiB0aGUgbGF1bmNoZWQgRWxlY3Ryb24gc2hlbGwgKHRoZSBpbnN0YWxsZXJcbiAgICogdmVyc2lvbiBpcyB0b28gb2xkIGZvciB0aGUgYXBwIHZlcnNpb24pLCB0aGUgcmVuZGVyZXIgbG9hZHMgYnV0IG5ldmVyXG4gICAqIGJvb3RzdHJhcHM6IGBkb2N1bWVudC5ib2R5YCBzdGF5cyBlbXB0eSBhbmQgYHdpbmRvdy5hcHBgIHJlbWFpbnNcbiAgICogYHVuZGVmaW5lZGAgXHUyMDE0IGEgYmxhY2sgc2NyZWVuLiBSYXRoZXIgdGhhbiB3YWl0aW5nIG91dCB0aGUgZnVsbCByZWFkaW5lc3NcbiAgICogdGltZW91dCwgdGhlIG93bmVkLXZhdWx0IHJlYWRpbmVzcyBwb2xsIGNvbmNsdWRlcyB0aGUgYm9vdCBpcyBkZWFkIG9uY2UgdGhlXG4gICAqIHJlbmRlcmVyIGhhcyBiZWVuIGBkb2N1bWVudC5yZWFkeVN0YXRlYCBgJ2NvbXBsZXRlJ2AgZm9yIHRoaXMgbG9uZyB3aXRoIG5vXG4gICAqIGB3aW5kb3cuYXBwYCBhbmQgYW4gZW1wdHkgYDxib2R5PmAsIGFuZCB0aHJvd3MgYVxuICAgKiBgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvcmAuIE9ubHkgYXBwbGllcyB0byBhbiBvd25lZCBpbnN0YW5jZVxuICAgKiAoaWdub3JlZCBpbiBhdHRhY2ggbW9kZSwge0BsaW5rIHBvcnR9IHNldCkuIFNldCBgMGAgdG8gZGlzYWJsZSBmYXN0LWZhaWwgYW5kXG4gICAqIHJlc3RvcmUgdGhlIHBsYWluIHdhaXQtb3V0LXRoZS1yZWFkaW5lc3MtdGltZW91dCBiZWhhdmlvci5cbiAgICpcbiAgICogQGRlZmF1bHQgYDEwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDRFAgaG9zdC5cbiAgICogRGVmYXVsdHMgdG8gYCdsb2NhbGhvc3QnYFxuICAgKi9cbiAgcmVhZG9ubHkgaG9zdD86IHN0cmluZztcblxuICAvKipcbiAgICogTWFya3Mge0BsaW5rIHBvcnR9IGFzIHRoZSBDRFAgcG9ydCBvZiBhICoqaGFybmVzcy1vd25lZCwgaXNvbGF0ZWQgaW5zdGFuY2UqKlxuICAgKiB0aGF0IHRoZSBnbG9iYWwgc2V0dXAgYWxyZWFkeSBsYXVuY2hlZCBhbmQgcHJlcGFyZWQgKHZhdWx0IHJlZ2lzdGVyZWQsXG4gICAqIHBsdWdpbiBlbmFibGVkKS5cbiAgICpcbiAgICogUG9wdWxhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGdsb2JhbCBzZXR1cCBhbmQgcHJvdmlkZWQgdG8gdGVzdCB3b3JrZXJzIHZpYVxuICAgKiB0aGUgZnJhbWV3b3JrJ3MgY29udGV4dCBtZWNoYW5pc20gKGUuZy4gVml0ZXN0IGBwcm92aWRlYC9gaW5qZWN0YCkuIFdoZW4gc2V0LFxuICAgKiB0aGUgd29ya2VyICoqYXR0YWNoZXMqKiB0byB0aGUgb3duZWQgaW5zdGFuY2Ugb24ge0BsaW5rIHBvcnR9IGluc3RlYWQgb2ZcbiAgICogbGF1bmNoaW5nIGl0cyBvd24sIGFuZCBza2lwcyB0aGUgdXNlci1zY29wZSB2YXVsdC1yZWdpc3RyYXRpb24gcHJlZmxpZ2h0IFx1MjAxNFxuICAgKiB0aGUgb3duZWQgaW5zdGFuY2UncyB2YXVsdCBsaXZlcyBpbiBhbiBpc29sYXRlZCB1c2VyLWRhdGEgY29uZmlnLCBub3QgdGhlXG4gICAqIHVzZXItc2NvcGUgcmVnaXN0cnkuIERvIG5vdCBzZXQgdGhpcyBtYW51YWxseTsgZm9yIHBsYWluIGF0dGFjaCBtb2RlIHVzZVxuICAgKiB7QGxpbmsgcG9ydH0gYWxvbmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBpc0hhcm5lc3NPd25lZEluc3RhbmNlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgb3duZWQgZGVza3RvcCBPYnNpZGlhbiB3aW5kb3cgaXMgc2hvd24gb24gc2NyZWVuLlxuICAgKlxuICAgKiBXaGVuIGBmYWxzZWAsIHRoZSBoYXJuZXNzIGxhdW5jaGVzIHRoZSBvd25lZCBpbnN0YW5jZSB3aXRoXG4gICAqIGtlZXAtYWxpdmUgQ2hyb21pdW0gZmxhZ3MgYW5kIG1vdmVzIGl0cyB3aW5kb3cgKipvZmYtc2NyZWVuKiogb25jZSBFbGVjdHJvbidzXG4gICAqIHJlbW90ZSBicmlkZ2UgaXMgYXZhaWxhYmxlLCBzbyB0aGUgcnVuIG5ldmVyIHN0ZWFscyBmb2N1cyBvciBwb3BzIGEgd2luZG93IGluXG4gICAqIGZyb250IG9mIHlvdS4gT2ZmLXNjcmVlbiAobm90IG1pbmltaXplZCkga2VlcHMgdGhlIHJlbmRlcmVyIGxpdmUsIHNvXG4gICAqIGBzZXRUaW1lb3V0YCwgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAsIGA6aG92ZXJgLCBhbmQgdHJ1c3RlZCBpbnB1dCBiZWhhdmVcbiAgICogaWRlbnRpY2FsbHkgdG8gYSB2aXNpYmxlIHdpbmRvdy4gRGVmYXVsdHMgdG8gYHRydWVgOyBpbnRlZ3JhdGlvbiBzZXR1cFxuICAgKiBleHBsaWNpdGx5IHBhc3NlcyBgZmFsc2VgIHRvIGF2b2lkIHN0ZWFsaW5nIGZvY3VzLiBJZ25vcmVkIGluIGF0dGFjaCBtb2RlXG4gICAqICh7QGxpbmsgcG9ydH0gc2V0KSBcdTIwMTQgdGhlIGhhcm5lc3MgbmV2ZXJcbiAgICogbW92ZXMgdGhlIHVzZXIncyBvd24gcnVubmluZyB3aW5kb3cuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNPYnNpZGlhbkFwcFZpc2libGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQaW5zIHRoZSAqKkVsZWN0cm9uIHNoZWxsKiogKGluc3RhbGxlciBidWlsZCkgdGhlIG93bmVkIGluc3RhbmNlIHJ1bnMuXG4gICAqXG4gICAqIEFjY2VwdHMgYW4gZXhwbGljaXQgYCd4LnkueidgLCBgJ3B1YmxpYy1sYXRlc3QnYCwgb3IgYCdjYXRhbHlzdC1sYXRlc3QnYC5cbiAgICogVGhlIG1hdGNoaW5nIEdpdEh1YiByZWxlYXNlIGluc3RhbGxlciBpcyBkb3dubG9hZGVkIGFuZCBleHRyYWN0ZWQgdG8gYVxuICAgKiBwb3J0YWJsZSBzaGVsbCAoY2FjaGVkIGZvciByZXVzZSkuIFB1YmxpYyByZWxlYXNlcyBvbmx5IFx1MjAxNCBjYXRhbHlzdCBidWlsZHNcbiAgICogaGF2ZSBubyBwdWJsaWMgaW5zdGFsbGVyLiBJZ25vcmVkIHdoZW4ge0BsaW5rIHBvcnR9IChhdHRhY2ggbW9kZSkgaXMgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBQaW5zIHRoZSAqKk9ic2lkaWFuIGFwcCB2ZXJzaW9uKiogKGFzYXIpIHRoZSBvd25lZCBpbnN0YW5jZSBydW5zLlxuICAgKlxuICAgKiBBY2NlcHRzIGFuIGV4cGxpY2l0IGAneC55LnonYCwgYCdwdWJsaWMtbGF0ZXN0J2AsIG9yIGAnY2F0YWx5c3QtbGF0ZXN0J2AuXG4gICAqIFZlcnNpb25zIGF0IG9yIGFib3ZlIHRoZSBzaGVsbCB2ZXJzaW9uIGFyZSBhcHBsaWVkIGFzIGEgY2hlYXAgYXNhciBzd2FwO1xuICAgKiBvbGRlciB2ZXJzaW9ucyB0cmFuc3BhcmVudGx5IHVzZSB0aGUgbWF0Y2hpbmcgaW5zdGFsbGVyIHNoZWxsLiBXaGVuIG9taXR0ZWQsXG4gICAqIHRoZSB1c2VyJ3MgY3VycmVudGx5LWluc3RhbGxlZCB2ZXJzaW9uIGlzIHVzZWQuIElnbm9yZWQgd2hlbiB7QGxpbmsgcG9ydH1cbiAgICogKGF0dGFjaCBtb2RlKSBpcyBzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhblZlcnNpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIENEUCBwb3J0IG9mIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiB0byAqKmF0dGFjaCoqIHRvICh0aGVcbiAgICogYC0tcmVtb3RlLWRlYnVnZ2luZy1wb3J0YCBpdCB3YXMgbGF1bmNoZWQgd2l0aCkuIFdoZW4gc2V0LCB0aGUgaGFybmVzc1xuICAgKiBhdHRhY2hlcyBpbnN0ZWFkIG9mIG93bmluZyBhbiBpbnN0YW5jZSwgYW5kIHRoZSB2ZXJzaW9uIGtub2JzIGFyZSBpZ25vcmVkLlxuICAgKiBXaGVuIG9taXR0ZWQsIGFuIG93bmVkIGlzb2xhdGVkIGluc3RhbmNlIGlzIGxhdW5jaGVkIG9uIGFuIGF1dG9tYXRpY2FsbHlcbiAgICogY2hvc2VuIGZyZWUgcG9ydCAobm8gcG9ydCBpcyBoYXJkY29kZWQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBsYXVuY2ggdGhlIG93bmVkIGluc3RhbmNlIHdpdGggQ2hyb21pdW0ncyBzYW5kYm94IGRpc2FibGVkXG4gICAqIChgLS1uby1zYW5kYm94YCkuXG4gICAqXG4gICAqIE5lZWRlZCB0byBib290IGFuIG93bmVkIGluc3RhbmNlIG9uIExpbnV4IHdoZW4gdGhlcmUgaXMgbm9cbiAgICogY29ycmVjdGx5LWNvbmZpZ3VyZWQgc2V0dWlkIGBjaHJvbWUtc2FuZGJveGAgaGVscGVyIFx1MjAxNCBlLmcuIGEgcG9ydGFibGUgc2hlbGxcbiAgICogZXh0cmFjdGVkIGZyb20gYW4gaW5zdGFsbGVyLCBvciBhIENJIHJ1bm5lciBsYXVuY2hpbmcgYXMgYSBub24tcm9vdCB1c2VyLCBpblxuICAgKiB3aGljaCBjYXNlIHRoZSByZW5kZXJlciBvdGhlcndpc2UgcmVmdXNlcyB0byBzdGFydC4gSGFybWxlc3Mgb25cbiAgICogV2luZG93cy9tYWNPUy4gSWdub3JlZCBpbiBhdHRhY2ggbW9kZSAoe0BsaW5rIHBvcnR9IHNldCkgXHUyMDE0IHRoZSBoYXJuZXNzIG5ldmVyXG4gICAqIHJlbGF1bmNoZXMgdGhlIHVzZXIncyBydW5uaW5nIGluc3RhbmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGREaXNhYmxlU2FuZGJveD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERpc2NyaW1pbmFudCBmb3IgdGhlIHRyYW5zcG9ydCB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogJ29ic2lkaWFuLWNkcCc7XG59XG5cbi8qKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiBvZiBhbGwgc3VwcG9ydGVkIHRyYW5zcG9ydCBjb25maWd1cmF0aW9ucy5cbiAqXG4gKiBVc2VkIGluIHZpdGVzdCBgZW52aXJvbm1lbnRPcHRpb25zLm9ic2lkaWFuVHJhbnNwb3J0YCB0byBzZWxlY3QgYW5kXG4gKiBjb25maWd1cmUgdGhlIHRyYW5zcG9ydCBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKi9cbmV4cG9ydCB0eXBlIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyA9XG4gIHwgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9uc1xuICB8IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTsiLAogICJuYW1lcyI6IFtdCn0K
17
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1vcHRpb25zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiB0eXBlcyBmb3IgY29uZmlndXJpbmcgdGhlIE9ic2lkaWFuIHRyYW5zcG9ydFxuICogdmlhIHZpdGVzdCBgZW52aXJvbm1lbnRPcHRpb25zYC5cbiAqL1xuXG4vKipcbiAqIFRyYW5zcG9ydCBvcHRpb25zIGZvciBBbmRyb2lkIHRlc3RpbmcgdmlhIEFwcGl1bSBXZWJWaWV3IGluamVjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFwcCBwYWNrYWdlIChBbmRyb2lkKSBvciBidW5kbGUgSUQgKGlPUykuXG4gICAqIERlZmF1bHRzIHRvIGAnbWQub2JzaWRpYW4nYFxuICAgKi9cbiAgcmVhZG9ubHkgYXBwSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgdG8gYmVjb21lIHJlYWR5XG4gICAqIChpdHMgYC9zdGF0dXNgIGVuZHBvaW50IHRvIHJlc3BvbmQpLlxuICAgKlxuICAgKiBPbmx5IGFwcGxpZXMgd2hlbiB0aGUgaGFybmVzcyBhdXRvLXN0YXJ0cyB0aGUgQXBwaXVtIHNlcnZlclxuICAgKiAoe0BsaW5rIHNob3VsZEF1dG9TdGFydEFwcGl1bX0pOyBpZ25vcmVkIHdoZW4gYXR0YWNoaW5nIHRvIGFuXG4gICAqIGFscmVhZHktcnVubmluZyBzZXJ2ZXIuIE9uIGEgY29sZCBtYWNoaW5lIHRoZSBgbnB4IGFwcGl1bWAgc2VydmVyIGNhbiB0YWtlXG4gICAqIGEgd2hpbGUgdG8gZmluaXNoIGJvb3RpbmcsIHNvIHJhaXNlIHRoaXMgaWYgc3RhcnR1cCB0aW1lcyBvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxODAwMDBgXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMIChlLmcuIGAnaHR0cDovL2xvY2FsaG9zdDo0NzIzJ2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwaXVtVXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBbmRyb2lkIEFWRCAoQW5kcm9pZCBWaXJ0dWFsIERldmljZSkgbmFtZS5cbiAgICpcbiAgICogVGhlIHRyYW5zcG9ydCBmYWN0b3J5IGxhdW5jaGVzIGBlbXVsYXRvciAtYXZkIDxhdmROYW1lPmAgYXMgYSBiYWNrZ3JvdW5kXG4gICAqIHByb2Nlc3MgYW5kIHBvbGxzIHVudGlsIHRoZSBkZXZpY2UgYXBwZWFycy4gVGhlIGVtdWxhdG9yIGlzIGtpbGxlZFxuICAgKiBvbiB0cmFuc3BvcnQgZGlzcG9zYWwuXG4gICAqXG4gICAqIFJ1biBgZW11bGF0b3IgLWxpc3QtYXZkc2AgdG8gc2VlIGF2YWlsYWJsZSBBVkQgbmFtZXMuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgVURJRCB0byByZXVzZSAoZS5nLiBgJ2VtdWxhdG9yLTU1NTQnYCkuXG4gICAqXG4gICAqIFBvcHVsYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBnbG9iYWwgc2V0dXAgYWZ0ZXIgdGhlIEFwcGl1bSBzZXNzaW9uIGlzXG4gICAqIGVzdGFibGlzaGVkLiBXaGVuIHByZXNlbnQgYWxvbmdzaWRlIHtAbGluayBzZXNzaW9uSWR9LCB0aGUgdHJhbnNwb3J0XG4gICAqIGZhY3Rvcnkgc2tpcHMgZW11bGF0b3Igc3RhcnR1cCBhbmQgYXR0YWNoZXMgdG8gdGhlIGV4aXN0aW5nIHNlc3Npb24uXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHdhaXRpbmcsIGFmdGVyIGBzeXMuYm9vdF9jb21wbGV0ZWRgLCBmb3IgYVxuICAgKiBoYXJuZXNzLXN0YXJ0ZWQgZW11bGF0b3IgdG8gYmVjb21lIGlkbGUgYmVmb3JlIHRoZSBBcHBpdW0gc2Vzc2lvbiBpc1xuICAgKiBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogYHN5cy5ib290X2NvbXBsZXRlZGAgZmlyZXMgKmJlZm9yZSogdGhlIGd1ZXN0IGlzIGFjdHVhbGx5IGlkbGU6IHBhY2thZ2VcbiAgICogb3B0aW1pemF0aW9uIGFuZCBzeXN0ZW0gc2VydmljZXMga2VlcCBjaHVybmluZywgc28gZXN0YWJsaXNoaW5nIHRoZSBzZXNzaW9uXG4gICAqIGltbWVkaWF0ZWx5IG1ha2VzIGV2ZXJ5IG9uZSBvZiBVaUF1dG9tYXRvcjIncyBzZXJpYWxpemVkIGBhZGJgIHJvdW5kLXRyaXBzXG4gICAqIGNvbnRlbmQgd2l0aCB0aGF0IHdvcmsgYW5kIGluZmxhdGVzIHNlc3Npb24gZXN0YWJsaXNobWVudCB+M3guIFRoZSBmYWN0b3J5XG4gICAqIGluc3RlYWQgd2FpdHMgdW50aWwgdGhlIGJvb3QgYW5pbWF0aW9uIGhhcyBzdG9wcGVkIGFuZCB0aGUgcGFja2FnZSBtYW5hZ2VyXG4gICAqIGlzIHNlcnZpbmcsIHByb2NlZWRpbmcgZWFybHkgb25jZSBpZGxlIG9yIGFmdGVyIHRoaXMgYnVkZ2V0IChiZXN0LWVmZm9ydCBcdTIwMTQgYVxuICAgKiB0aW1lb3V0IGxvZ3MgYSB3YXJuaW5nIGFuZCBwcm9jZWVkcykuIFNldCBgMGAgdG8gc2tpcCB0aGUgd2FpdC4gT25seSBhcHBsaWVzXG4gICAqIHRvIGEgaGFybmVzcy1zdGFydGVkIGVtdWxhdG9yLCBub3QgYSByZXVzZWQgb25lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDBgXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBjb25zb2xlIHdpbmRvdyBpcyBzaG93bi5cbiAgICpcbiAgICogV2hlbiBgZmFsc2VgICh0aGUgZGVmYXVsdCksIHRoZSBgbnB4IGFwcGl1bWAgc2VydmVyIHByb2Nlc3MgaXMgc3Bhd25lZCB3aXRoXG4gICAqIGl0cyBjb25zb2xlIHdpbmRvdyBoaWRkZW4gKGB3aW5kb3dzSGlkZWApIGFuZCBpdHMgb3V0cHV0IGRpc2NhcmRlZCwgc28gaXRcbiAgICogbmVpdGhlciBzdGVhbHMgZm9jdXMgbm9yIHdyaXRlcyB0byB0aGUgaW52b2tpbmcgdGVybWluYWwuIElnbm9yZWQgd2hlblxuICAgKiBhdHRhY2hpbmcgdG8gYW4gYWxyZWFkeS1ydW5uaW5nIEFwcGl1bSBzZXJ2ZXIgKHtAbGluayBzaG91bGRBdXRvU3RhcnRBcHBpdW19XG4gICAqIGBmYWxzZWAsIG9yIHRoZSBzZXJ2ZXIgYWxyZWFkeSByZWFjaGFibGUpLiBTZXQgYHRydWVgIHRvIHNlZSB0aGUgc2VydmVyIGxvZyB3aW5kb3dcbiAgICogYW5kIGl0cyBsaXZlIG91dHB1dC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNBcHBpdW1Db25zb2xlVmlzaWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBBbmRyb2lkIGVtdWxhdG9yIHdpbmRvdyBpcyBzaG93biBvbiBzY3JlZW4uXG4gICAqXG4gICAqIFdoZW4gYGZhbHNlYCAodGhlIGRlZmF1bHQpLCB0aGUgZW11bGF0b3IgaXMgc3RhcnRlZCB3aXRoIGAtbm8td2luZG93YFxuICAgKiAoaGVhZGxlc3MpLCBzbyBpdCBuZXZlciBzdGVhbHMgZm9jdXMuIElnbm9yZWQgd2hlbiByZXVzaW5nIGFuIGFscmVhZHktcnVubmluZ1xuICAgKiBkZXZpY2UgKG5vdGhpbmcgaXMgbGF1bmNoZWQgdG8gaGlkZSkuIFNldCBgdHJ1ZWAgdG8gd2F0Y2ggdGhlIGVtdWxhdG9yIFVJLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc0VtdWxhdG9yVmlzaWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB3YWl0aW5nIGZvciBgYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeWAgYWZ0ZXJcbiAgICogdGhlIHZhdWx0IGlzIChyZSlvcGVuZWQuXG4gICAqXG4gICAqIFJlZ2lzdGVyaW5nIGEgdmF1bHQgdHJpZ2dlcnMgYSBmdWxsIE9ic2lkaWFuIHJlLWluaXQgKGBsb2NhdGlvbi5yZWxvYWQoKWBcbiAgICogcmVvcGVucyB0aGUgdmF1bHQgYW5kIHJlbG9hZHMgZXZlcnkgcGx1Z2luIFx1MjAxNCB0aGUgaGVhdmllc3Qgc3RhcnR1cCBzdGVwKS4gT25cbiAgICogYSBjb2xkLWJvb3RlZCBvciB1bmRlci1wcm92aXNpb25lZCBlbXVsYXRvciB0aGF0IGluaXQgY2FuIHRha2UgYSB3aGlsZSwgc29cbiAgICogdGhpcyBidWRnZXQgaXMgdGhlIGxhcmdlc3Qgb2YgdGhlIHRyYW5zcG9ydCB0aW1lb3V0cy4gUmFpc2UgaXQgZnVydGhlciBpZlxuICAgKiByZWxlYXNlcyBzdGlsbCBmbGFrZSBvbiBzbG93IENJIGVtdWxhdG9ycy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDkwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBlc3RhYmxpc2hpbmcgdGhlIEFwcGl1bSBzZXNzaW9uIChXZWJEcml2ZXJJT1xuICAgKiBgcmVtb3RlKClgIFx1MjAxNCBVaUF1dG9tYXRvcjIgc2VydmVyIGluc3RhbGwgKyBhcHAgbGF1bmNoKS5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgbGFyZ2VzdCBhbmQgbW9zdCBsb2FkLXNlbnNpdGl2ZSBzdGVwIG9mIHRoZSBBbmRyb2lkIHNldHVwOlxuICAgKiBvbiBhIGNvbGQgb3IgY29udGVuZGVkIGVtdWxhdG9yIGl0IGRvbWluYXRlcyBzdGFydHVwIGFuZCBjYW4gdGFrZSBhIGZld1xuICAgKiBtaW51dGVzLiBSYWlzZSBpdCBpZiBzZXNzaW9uIGVzdGFibGlzaG1lbnQgdGltZXMgb3V0IHVuZGVyIGxvYWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxODAwMDBgXG4gICAqL1xuICByZWFkb25seSBzZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbiBleGlzdGluZyBBcHBpdW0gc2Vzc2lvbiBJRCB0byByZWF0dGFjaCB0by5cbiAgICpcbiAgICogUG9wdWxhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGdsb2JhbCBzZXR1cCBhbmQgcHJvdmlkZWQgdG8gdGVzdCB3b3JrZXJzXG4gICAqIHZpYSB0aGUgZnJhbWV3b3JrJ3MgY29udGV4dCBtZWNoYW5pc20gKGUuZy4gVml0ZXN0IGBwcm92aWRlYC9gaW5qZWN0YCkuXG4gICAqIFdoZW4gcHJlc2VudCwgdGhlIHRyYW5zcG9ydCBmYWN0b3J5IHVzZXMgV2ViRHJpdmVySU8ncyBgYXR0YWNoKClgIGluc3RlYWRcbiAgICogb2YgY3JlYXRpbmcgYSBuZXcgc2Vzc2lvbiwgYXZvaWRpbmcgZHVwbGljYXRlIEFwcGl1bS9BREIgY29ubmVjdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBzZXNzaW9uSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBzdGFydCB0aGUgQXBwaXVtIHNlcnZlciBpZiBpdCBpcyBub3QgcmVhY2hhYmxlLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCB0aGUgdHJhbnNwb3J0IGZhY3Rvcnkgc3Bhd25zIGBucHggYXBwaXVtYFxuICAgKiBhcyBhIGJhY2tncm91bmQgcHJvY2VzcyB3aGVuIHRoZSBwcmVmbGlnaHQgY2hlY2sgZmFpbHMsIGFuZCBraWxscyBpdFxuICAgKiBvbiB0cmFuc3BvcnQgZGlzcG9zYWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGlzY3JpbWluYW50IGZvciB0aGUgdHJhbnNwb3J0IHR5cGUuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiAnb2JzaWRpYW4tYW5kcm9pZC1hcHBpdW0nO1xuXG4gIC8qKlxuICAgKiBCYXNlIHBhdGggb24gdGhlIGRldmljZSB3aGVyZSBPYnNpZGlhbiBzdG9yZXMgdmF1bHRzLlxuICAgKlxuICAgKiBEZWZhdWx0czpcbiAgICogLSBBbmRyb2lkOiBgL3NkY2FyZC9Eb2N1bWVudHMvYFxuICAgKiAtIGlPUzogYEBtZC5vYnNpZGlhbjpkb2N1bWVudHMvYFxuICAgKi9cbiAgcmVhZG9ubHkgdmF1bHRCYXNlUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHdhaXRpbmcgZm9yIHRoZSBXZWJWaWV3IGNvbnRleHQgdG8gYmVjb21lIGF2YWlsYWJsZS5cbiAgICpcbiAgICogT24gc2xvdyBlbXVsYXRvcnMsIHRoZSBDaHJvbWVEcml2ZXIgcHJveHkgdGhhdCBoYW5kbGVzIFdlYlZpZXcgY29tbWFuZHNcbiAgICogbWF5IG5vdCBiZSByZWFkeSBpbW1lZGlhdGVseSBhZnRlciB0aGUgQXBwaXVtIHNlc3Npb24gc3RhcnRzLiBUaGlzIHRpbWVvdXRcbiAgICogY29udHJvbHMgaG93IGxvbmcgdG8gcG9sbCBiZWZvcmUgZ2l2aW5nIHVwLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDBgXG4gICAqL1xuICByZWFkb25seSB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRyYW5zcG9ydCBvcHRpb25zIGZvciBkZXNrdG9wIHRlc3RpbmcgdmlhIENocm9tZSBEZXZUb29scyBQcm90b2NvbC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGRlc2t0b3AgdHJhbnNwb3J0LiBCeSBkZWZhdWx0IHRoZSBoYXJuZXNzICoqbGF1bmNoZXMgYW5kXG4gKiBvd25zIGFuIGlzb2xhdGVkIE9ic2lkaWFuIGluc3RhbmNlKiogaW4gYSB0ZW1wb3JhcnkgdXNlci1kYXRhIGRpciAobmV2ZXJcbiAqIHRvdWNoaW5nIHRoZSB1c2VyJ3MgT2JzaWRpYW4pLCBjb25uZWN0ZWQgb3ZlciBhIGZyZWUgQ0RQIHBvcnQuIFByb3ZpZGVcbiAqIHtAbGluayBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMucG9ydH0gdG8gaW5zdGVhZCBhdHRhY2ggdG8gYW5cbiAqIGFscmVhZHktcnVubmluZyBPYnNpZGlhbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMge1xuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIGluZGl2aWR1YWwgQ0RQIGNvbW1hbmRzLlxuICAgKiBEZWZhdWx0cyB0byAzMDAwMFxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogR3JhY2Ugd2luZG93IGluIG1pbGxpc2Vjb25kcyBmb3IgZmFzdC1mYWlsaW5nIGEgKipkZWFkIGJvb3QqKiBvZiB0aGUgb3duZWRcbiAgICogaW5zdGFuY2UuXG4gICAqXG4gICAqIFdoZW4gYW4gYXNhciBjYW5ub3QgcnVuIG9uIHRoZSBsYXVuY2hlZCBFbGVjdHJvbiBzaGVsbCAodGhlIGluc3RhbGxlclxuICAgKiB2ZXJzaW9uIGlzIHRvbyBvbGQgZm9yIHRoZSBhcHAgdmVyc2lvbiksIHRoZSByZW5kZXJlciBsb2FkcyBidXQgbmV2ZXJcbiAgICogYm9vdHN0cmFwczogYGRvY3VtZW50LmJvZHlgIHN0YXlzIGVtcHR5IGFuZCBgd2luZG93LmFwcGAgcmVtYWluc1xuICAgKiBgdW5kZWZpbmVkYCBcdTIwMTQgYSBibGFjayBzY3JlZW4uIFJhdGhlciB0aGFuIHdhaXRpbmcgb3V0IHRoZSBmdWxsIHJlYWRpbmVzc1xuICAgKiB0aW1lb3V0LCB0aGUgb3duZWQtdmF1bHQgcmVhZGluZXNzIHBvbGwgY29uY2x1ZGVzIHRoZSBib290IGlzIGRlYWQgb25jZSB0aGVcbiAgICogcmVuZGVyZXIgaGFzIGJlZW4gYGRvY3VtZW50LnJlYWR5U3RhdGVgIGAnY29tcGxldGUnYCBmb3IgdGhpcyBsb25nIHdpdGggbm9cbiAgICogYHdpbmRvdy5hcHBgIGFuZCBhbiBlbXB0eSBgPGJvZHk+YCwgYW5kIHRocm93cyBhXG4gICAqIGBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yYC4gT25seSBhcHBsaWVzIHRvIGFuIG93bmVkIGluc3RhbmNlXG4gICAqIChpZ25vcmVkIGluIGF0dGFjaCBtb2RlLCB7QGxpbmsgcG9ydH0gc2V0KS4gU2V0IGAwYCB0byBkaXNhYmxlIGZhc3QtZmFpbCBhbmRcbiAgICogcmVzdG9yZSB0aGUgcGxhaW4gd2FpdC1vdXQtdGhlLXJlYWRpbmVzcy10aW1lb3V0IGJlaGF2aW9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTAwMDBgXG4gICAqL1xuICByZWFkb25seSBkZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENEUCBob3N0LlxuICAgKiBEZWZhdWx0cyB0byBgJ2xvY2FsaG9zdCdgXG4gICAqL1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNYXJrcyB7QGxpbmsgcG9ydH0gYXMgdGhlIENEUCBwb3J0IG9mIGEgKipoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBpbnN0YW5jZSoqXG4gICAqIHRoYXQgdGhlIGdsb2JhbCBzZXR1cCBhbHJlYWR5IGxhdW5jaGVkIGFuZCBwcmVwYXJlZCAodmF1bHQgcmVnaXN0ZXJlZCxcbiAgICogcGx1Z2luIGVuYWJsZWQpLlxuICAgKlxuICAgKiBQb3B1bGF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgZ2xvYmFsIHNldHVwIGFuZCBwcm92aWRlZCB0byB0ZXN0IHdvcmtlcnMgdmlhXG4gICAqIHRoZSBmcmFtZXdvcmsncyBjb250ZXh0IG1lY2hhbmlzbSAoZS5nLiBWaXRlc3QgYHByb3ZpZGVgL2BpbmplY3RgKS4gV2hlbiBzZXQsXG4gICAqIHRoZSB3b3JrZXIgKiphdHRhY2hlcyoqIHRvIHRoZSBvd25lZCBpbnN0YW5jZSBvbiB7QGxpbmsgcG9ydH0gaW5zdGVhZCBvZlxuICAgKiBsYXVuY2hpbmcgaXRzIG93biwgYW5kIHNraXBzIHRoZSB1c2VyLXNjb3BlIHZhdWx0LXJlZ2lzdHJhdGlvbiBwcmVmbGlnaHQgXHUyMDE0XG4gICAqIHRoZSBvd25lZCBpbnN0YW5jZSdzIHZhdWx0IGxpdmVzIGluIGFuIGlzb2xhdGVkIHVzZXItZGF0YSBjb25maWcsIG5vdCB0aGVcbiAgICogdXNlci1zY29wZSByZWdpc3RyeS4gRG8gbm90IHNldCB0aGlzIG1hbnVhbGx5OyBmb3IgcGxhaW4gYXR0YWNoIG1vZGUgdXNlXG4gICAqIHtAbGluayBwb3J0fSBhbG9uZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IGlzSGFybmVzc093bmVkSW5zdGFuY2U/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvd25lZCBkZXNrdG9wIE9ic2lkaWFuIHdpbmRvdyBpcyBzaG93biBvbiBzY3JlZW4uXG4gICAqXG4gICAqIFdoZW4gYGZhbHNlYCwgdGhlIGhhcm5lc3MgbGF1bmNoZXMgdGhlIG93bmVkIGluc3RhbmNlIHdpdGhcbiAgICoga2VlcC1hbGl2ZSBDaHJvbWl1bSBmbGFncyBhbmQgbW92ZXMgaXRzIHdpbmRvdyAqKm9mZi1zY3JlZW4qKiBvbmNlIEVsZWN0cm9uJ3NcbiAgICogcmVtb3RlIGJyaWRnZSBpcyBhdmFpbGFibGUsIHNvIHRoZSBydW4gbmV2ZXIgc3RlYWxzIGZvY3VzIG9yIHBvcHMgYSB3aW5kb3cgaW5cbiAgICogZnJvbnQgb2YgeW91LiBPZmYtc2NyZWVuIChub3QgbWluaW1pemVkKSBrZWVwcyB0aGUgcmVuZGVyZXIgbGl2ZSwgc29cbiAgICogYHNldFRpbWVvdXRgLCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCwgYDpob3ZlcmAsIGFuZCB0cnVzdGVkIGlucHV0IGJlaGF2ZVxuICAgKiBpZGVudGljYWxseSB0byBhIHZpc2libGUgd2luZG93LiBEZWZhdWx0cyB0byBgdHJ1ZWA7IGludGVncmF0aW9uIHNldHVwXG4gICAqIGV4cGxpY2l0bHkgcGFzc2VzIGBmYWxzZWAgdG8gYXZvaWQgc3RlYWxpbmcgZm9jdXMuIElnbm9yZWQgaW4gYXR0YWNoIG1vZGVcbiAgICogKHtAbGluayBwb3J0fSBzZXQpIFx1MjAxNCB0aGUgaGFybmVzcyBuZXZlclxuICAgKiBtb3ZlcyB0aGUgdXNlcidzIG93biBydW5uaW5nIHdpbmRvdy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc09ic2lkaWFuQXBwVmlzaWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBpbnMgdGhlICoqRWxlY3Ryb24gc2hlbGwqKiAoaW5zdGFsbGVyIGJ1aWxkKSB0aGUgb3duZWQgaW5zdGFuY2UgcnVucy5cbiAgICpcbiAgICogQWNjZXB0cyBhbiBleHBsaWNpdCBgJ3gueS56J2AsIGAncHVibGljLWxhdGVzdCdgLCBvciBgJ2NhdGFseXN0LWxhdGVzdCdgLlxuICAgKiBUaGUgbWF0Y2hpbmcgR2l0SHViIHJlbGVhc2UgaW5zdGFsbGVyIGlzIGRvd25sb2FkZWQgYW5kIGV4dHJhY3RlZCB0byBhXG4gICAqIHBvcnRhYmxlIHNoZWxsIChjYWNoZWQgZm9yIHJldXNlKS4gUHVibGljIHJlbGVhc2VzIG9ubHkgXHUyMDE0IGNhdGFseXN0IGJ1aWxkc1xuICAgKiBoYXZlIG5vIHB1YmxpYyBpbnN0YWxsZXIuIElnbm9yZWQgd2hlbiB7QGxpbmsgcG9ydH0gKGF0dGFjaCBtb2RlKSBpcyBzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhbkluc3RhbGxlclZlcnNpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFBpbnMgdGhlICoqT2JzaWRpYW4gYXBwIHZlcnNpb24qKiAoYXNhcikgdGhlIG93bmVkIGluc3RhbmNlIHJ1bnMuXG4gICAqXG4gICAqIEFjY2VwdHMgYW4gZXhwbGljaXQgYCd4LnkueidgLCBgJ3B1YmxpYy1sYXRlc3QnYCwgb3IgYCdjYXRhbHlzdC1sYXRlc3QnYC5cbiAgICogVmVyc2lvbnMgYXQgb3IgYWJvdmUgdGhlIHNoZWxsIHZlcnNpb24gYXJlIGFwcGxpZWQgYXMgYSBjaGVhcCBhc2FyIHN3YXA7XG4gICAqIG9sZGVyIHZlcnNpb25zIHRyYW5zcGFyZW50bHkgdXNlIHRoZSBtYXRjaGluZyBpbnN0YWxsZXIgc2hlbGwuIFdoZW4gb21pdHRlZCxcbiAgICogdGhlIHVzZXIncyBjdXJyZW50bHktaW5zdGFsbGVkIHZlcnNpb24gaXMgdXNlZC4gSWdub3JlZCB3aGVuIHtAbGluayBwb3J0fVxuICAgKiAoYXR0YWNoIG1vZGUpIGlzIHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9ic2lkaWFuVmVyc2lvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQ0RQIHBvcnQgb2YgYW4gYWxyZWFkeS1ydW5uaW5nIE9ic2lkaWFuIHRvICoqYXR0YWNoKiogdG8gKHRoZVxuICAgKiBgLS1yZW1vdGUtZGVidWdnaW5nLXBvcnRgIGl0IHdhcyBsYXVuY2hlZCB3aXRoKS4gV2hlbiBzZXQsIHRoZSBoYXJuZXNzXG4gICAqIGF0dGFjaGVzIGluc3RlYWQgb2Ygb3duaW5nIGFuIGluc3RhbmNlLCBhbmQgdGhlIHZlcnNpb24ga25vYnMgYXJlIGlnbm9yZWQuXG4gICAqIFdoZW4gb21pdHRlZCwgYW4gb3duZWQgaXNvbGF0ZWQgaW5zdGFuY2UgaXMgbGF1bmNoZWQgb24gYW4gYXV0b21hdGljYWxseVxuICAgKiBjaG9zZW4gZnJlZSBwb3J0IChubyBwb3J0IGlzIGhhcmRjb2RlZCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBwb3J0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGxhdW5jaCB0aGUgb3duZWQgaW5zdGFuY2Ugd2l0aCBDaHJvbWl1bSdzIHNhbmRib3ggZGlzYWJsZWRcbiAgICogKGAtLW5vLXNhbmRib3hgKS5cbiAgICpcbiAgICogTmVlZGVkIHRvIGJvb3QgYW4gb3duZWQgaW5zdGFuY2Ugb24gTGludXggd2hlbiB0aGVyZSBpcyBub1xuICAgKiBjb3JyZWN0bHktY29uZmlndXJlZCBzZXR1aWQgYGNocm9tZS1zYW5kYm94YCBoZWxwZXIgXHUyMDE0IGUuZy4gYSBwb3J0YWJsZSBzaGVsbFxuICAgKiBleHRyYWN0ZWQgZnJvbSBhbiBpbnN0YWxsZXIsIG9yIGEgQ0kgcnVubmVyIGxhdW5jaGluZyBhcyBhIG5vbi1yb290IHVzZXIsIGluXG4gICAqIHdoaWNoIGNhc2UgdGhlIHJlbmRlcmVyIG90aGVyd2lzZSByZWZ1c2VzIHRvIHN0YXJ0LiBIYXJtbGVzcyBvblxuICAgKiBXaW5kb3dzL21hY09TLiBJZ25vcmVkIGluIGF0dGFjaCBtb2RlICh7QGxpbmsgcG9ydH0gc2V0KSBcdTIwMTQgdGhlIGhhcm5lc3MgbmV2ZXJcbiAgICogcmVsYXVuY2hlcyB0aGUgdXNlcidzIHJ1bm5pbmcgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZERpc2FibGVTYW5kYm94PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGlzY3JpbWluYW50IGZvciB0aGUgdHJhbnNwb3J0IHR5cGUuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiAnb2JzaWRpYW4tY2RwJztcbn1cblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIHVuaW9uIG9mIGFsbCBzdXBwb3J0ZWQgdHJhbnNwb3J0IGNvbmZpZ3VyYXRpb25zLlxuICpcbiAqIFVzZWQgaW4gdml0ZXN0IGBlbnZpcm9ubWVudE9wdGlvbnMub2JzaWRpYW5UcmFuc3BvcnRgIHRvIHNlbGVjdCBhbmRcbiAqIGNvbmZpZ3VyZSB0aGUgdHJhbnNwb3J0IGZvciBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqL1xuZXhwb3J0IHR5cGUgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zID1cbiAgfCBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zXG4gIHwgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -68,9 +68,11 @@ export interface ObsidianAndroidAppiumTransportOptions {
68
68
  * Whether the auto-started Appium server console window is shown.
69
69
  *
70
70
  * When `false` (the default), the `npx appium` server process is spawned with
71
- * its console window hidden (`windowsHide`), so it never steals focus. Ignored
72
- * when attaching to an already-running Appium server ({@link shouldAutoStartAppium}
73
- * `false`, or the server already reachable). Set `true` to see the server log window.
71
+ * its console window hidden (`windowsHide`) and its output discarded, so it
72
+ * neither steals focus nor writes to the invoking terminal. Ignored when
73
+ * attaching to an already-running Appium server ({@link shouldAutoStartAppium}
74
+ * `false`, or the server already reachable). Set `true` to see the server log window
75
+ * and its live output.
74
76
  *
75
77
  * @default `false`
76
78
  */
@@ -1,4 +1,4 @@
1
- const LIBRARY_VERSION = false ? "dev" : "8.1.0";
1
+ const LIBRARY_VERSION = false ? "dev" : "8.1.1";
2
2
  export {
3
3
  LIBRARY_VERSION
4
4
  };
@@ -383,11 +383,12 @@ class AppiumTransportFactory {
383
383
  }
384
384
  }
385
385
  startAppiumServer(port, isAppiumConsoleVisible) {
386
+ const isConsoleHidden = shouldHideAppiumConsole(isAppiumConsoleVisible);
386
387
  const child = spawn(`npx appium --log-timestamp --port ${String(port)} --allow-insecure=${CHROMEDRIVER_AUTODOWNLOAD_FEATURE}`, {
387
388
  detached: true,
388
389
  shell: true,
389
- stdio: ["ignore", "inherit", "inherit"],
390
- windowsHide: shouldHideAppiumConsole(isAppiumConsoleVisible)
390
+ stdio: isConsoleHidden ? "ignore" : ["ignore", "inherit", "inherit"],
391
+ windowsHide: isConsoleHidden
391
392
  });
392
393
  child.unref();
393
394
  return child;
@@ -735,4 +736,4 @@ export {
735
736
  createTransportFromOptions,
736
737
  getOrCreateTransport
737
738
  };
738
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHtcbiAgYXR0YWNoLFxuICByZW1vdGVcbn0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IE93bmVkSW5zdGFuY2VDb25maWcgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHtcbiAgcmVzb2x2ZUFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzLFxuICByZXNvbHZlU2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xufSBmcm9tICcuL2FwcGl1bS1zZXNzaW9uLWNvbmZpZy5tanMnO1xuaW1wb3J0IHtcbiAgY2hlY2tEZXZpY2VJZGxlLFxuICByZXNvbHZlRGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xufSBmcm9tICcuL2RldmljZS1yZWFkaW5lc3MubWpzJztcbmltcG9ydCB7IGJ1aWxkRW11bGF0b3JBcmdzIH0gZnJvbSAnLi9lbXVsYXRvci1hcmdzLm1qcyc7XG5pbXBvcnQgeyBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3IgfSBmcm9tICcuL2luY29tcGF0aWJsZS1pbnN0YWxsZXItdmVyc2lvbi1lcnJvci5tanMnO1xuaW1wb3J0IHsgY2hlY2tJbnN0YWxsZXJDb21wYXRpYmlsaXR5IH0gZnJvbSAnLi9pbnN0YWxsZXItY29tcGF0aWJpbGl0eS5tanMnO1xuaW1wb3J0IHsga2lsbFByb2Nlc3NUcmVlIH0gZnJvbSAnLi9raWxsLXByb2Nlc3MtdHJlZS5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuQ29uZmlnRGlyIH0gZnJvbSAnLi9vYnNpZGlhbi1jb25maWcubWpzJztcbmltcG9ydCB7IHJlc29sdmVPYnNpZGlhbkV4ZWN1dGFibGUgfSBmcm9tICcuL29ic2lkaWFuLWV4ZWN1dGFibGUubWpzJztcbmltcG9ydCB7XG4gIGRldGVjdEluc3RhbGxlZFNoZWxsVmVyc2lvbixcbiAgZW5zdXJlU2hlbGxDYWNoZWRcbn0gZnJvbSAnLi9vYnNpZGlhbi1pbnN0YWxsZXIubWpzJztcbmltcG9ydCB7IGdldFZlcnNpb25NZXRhZGF0YSB9IGZyb20gJy4vb2JzaWRpYW4tbWV0YWRhdGEubWpzJztcbmltcG9ydCB7XG4gIGVuc3VyZUFzYXJDYWNoZWQsXG4gIGZpbmROZXdlc3RBc2FyLFxuICByZXNvbHZlQ29uY3JldGVWZXJzaW9uXG59IGZyb20gJy4vb2JzaWRpYW4tdmVyc2lvbi1zd2l0Y2gubWpzJztcbmltcG9ydCB7IGNvbXBhcmVWZXJzaW9ucyB9IGZyb20gJy4vb2JzaWRpYW4tdmVyc2lvbi5tanMnO1xuaW1wb3J0IHsgcmVzb2x2ZURlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcyB9IGZyb20gJy4vcmVuZGVyZXItYm9vdC1kZXRlY3Rpb24ubWpzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4vdHlwZS1ndWFyZHMubWpzJztcbmltcG9ydCB7XG4gIHNob3VsZEhpZGVBcHBpdW1Db25zb2xlLFxuICBzaG91bGRIaWRlRW11bGF0b3JXaW5kb3dcbn0gZnJvbSAnLi92aXNpYmlsaXR5Lm1qcyc7XG5cbmNvbnN0IEFQUF9QQUNLQUdFID0gJ21kLm9ic2lkaWFuJztcbmNvbnN0IEFQUF9BQ1RJVklUWSA9IGAke0FQUF9QQUNLQUdFfS5NYWluQWN0aXZpdHlgO1xuY29uc3QgQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCA9IDM7XG5jb25zdCBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IE9XTkVEX1VTRVJfREFUQV9QUkVGSVggPSAndXNlcmRhdGEtJztcbi8vIEFwcGl1bSBpbnNlY3VyZSBmZWF0dXJlIGxldHRpbmcgdGhlIFVpQXV0b21hdG9yMiBkcml2ZXIgYXV0by1kb3dubG9hZCBhXG4vLyBDaHJvbWVkcml2ZXIgbWF0Y2hpbmcgT2JzaWRpYW4ncyBXZWJWaWV3IENocm9tZSB2ZXJzaW9uLiBFbmFibGluZyBpdCBvbiB0aGVcbi8vIEFwcGl1bSBzZXJ2ZXIgKGl0IGhhcyBubyBlZmZlY3QgYXMgYSBjYXBhYmlsaXR5KSBhdm9pZHMgdGhlIGZhaWx1cmVcbi8vIFwiTm8gQ2hyb21lZHJpdmVyIGZvdW5kIHRoYXQgY2FuIGF1dG9tYXRlIENocm9tZSAuLi5cIi5cbmNvbnN0IENIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRSA9ICd1aWF1dG9tYXRvcjI6Y2hyb21lZHJpdmVyX2F1dG9kb3dubG9hZCc7XG5jb25zdCBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuY29uc3QgREVGQVVMVF9UUkFOU1BPUlRfVFlQRSA9ICdvYnNpZGlhbi1jZHAnO1xuY29uc3QgREVWSUNFX0lETEVfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgRU1VTEFUT1JfT1VUUFVUX1RBSUxfTUFYX0xFTkdUSCA9IDgwMDA7XG5jb25zdCBLRVlDT0RFX01FTlUgPSA4MjtcbmNvbnN0IEtFWUNPREVfV0FLRVVQID0gMjI0O1xuY29uc3QgU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjAwMDA7XG5jb25zdCBTRVJWRVJfTEFVTkNIX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuXG4vKipcbiAqIEhvdyB0aGUgcmVxdWVzdGVkIGFwcCAoYXNhcikgdmVyc2lvbiB3aWxsIGJlIGFwcGxpZWQgdG8gYW4gb3duZWQgaW5zdGFuY2U7IGF0XG4gKiBtb3N0IG9uZSBmaWVsZCBpcyBzZXQgKHNlZSB7QGxpbmsgcmVzb2x2ZUFzYXJQbGFufSkuXG4gKi9cbmludGVyZmFjZSBBc2FyUGxhbiB7XG4gIC8qKiBUaGUgdXNlcidzIG5ld2VzdCBpbnN0YWxsZWQgYXNhciB0byBwcm92aXNpb24gYXMtaXMgKG5vIGRvd25sb2FkKS4gKi9cbiAgcmVhZG9ubHkgYXNhcj86IE93bmVkSW5zdGFuY2VDb25maWdbJ2FzYXInXTtcblxuICAvKiogVGhlIGFwcCB2ZXJzaW9uIHRvIGRvd25sb2FkIGFuZCBhc2FyLXN3YXAgb250byB0aGUgc2hlbGwuICovXG4gIHJlYWRvbmx5IGFzYXJWZXJzaW9uVG9Td2FwPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBUaGUgYXBwIHZlcnNpb24gd2hvc2Ugb3duIGluc3RhbGxlciBzaGVsbCB0byBkb3dubG9hZCAoYSBkb3duZ3JhZGUpLiAqL1xuICByZWFkb25seSBkb3duZ3JhZGVJbnN0YWxsZXJWZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIERldGFpbHMgb2YgYW4gZW11bGF0b3IgcHJvY2VzcyB0aGF0IGhhcyBleGl0ZWQuXG4gKi9cbmludGVyZmFjZSBFbXVsYXRvckV4aXRJbmZvIHtcbiAgLyoqIEV4aXQgY29kZSwgb3IgYG51bGxgIGlmIHRoZSBwcm9jZXNzIHdhcyB0ZXJtaW5hdGVkIGJ5IGEgc2lnbmFsLiAqL1xuICBjb2RlOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKiBUZXJtaW5hdGluZyBzaWduYWwsIG9yIGBudWxsYCBpZiB0aGUgcHJvY2VzcyBleGl0ZWQgbm9ybWFsbHkuICovXG4gIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsO1xufVxuXG4vKipcbiAqIEEgc3Bhd25lZCBlbXVsYXRvciBwcm9jZXNzIHRvZ2V0aGVyIHdpdGggaGVscGVycyB0byBpbnNwZWN0IGl0cyBjYXB0dXJlZFxuICogb3V0cHV0IGFuZCBleGl0IHN0YXR1cy5cbiAqL1xuaW50ZXJmYWNlIEVtdWxhdG9yTGF1bmNoIHtcbiAgLyoqIFRoZSBzcGF3bmVkIGVtdWxhdG9yIHByb2Nlc3MuICovXG4gIHByb2Nlc3M6IENoaWxkUHJvY2VzcztcblxuICAvKiogUmV0dXJucyB0aGUgZXhpdCBkZXRhaWxzIG9uY2UgdGhlIHByb2Nlc3MgaGFzIGV4aXRlZCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLiAqL1xuICByZWFkRXhpdEluZm86ICgpID0+IEVtdWxhdG9yRXhpdEluZm8gfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFJldHVybnMgdGhlIGNhcHR1cmVkIHN0ZG91dCtzdGRlcnIgKGJvdW5kZWQgdG8gdGhlIG1vc3QgcmVjZW50IG91dHB1dCkuICovXG4gIHJlYWRPdXRwdXQ6ICgpID0+IHN0cmluZztcblxuICAvKiogU3RvcHMgYWNjdW11bGF0aW5nIG91dHB1dC4gQ2FsbCBvbmNlIHN0YXJ0dXAgaGFzIHN1Y2NlZWRlZC4gKi9cbiAgc3RvcENhcHR1cmU6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkuZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyB7XG4gIC8qKiBBVkQgbmFtZSB0byBjb25uZWN0IHRvIChzdGFydGluZyBhIG5ldyBlbXVsYXRvciBpZiBub3QgYWxyZWFkeSBydW5uaW5nKS4gKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKiBSZXNvbHZlZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIHBvc3QtYm9vdCBkZXZpY2UtaWRsZSB3YWl0IChgMGAgc2tpcHMgaXQpLiAqL1xuICByZWFkb25seSBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuICovXG4gIHJlYWRvbmx5IGlzRW11bGF0b3JWaXNpYmxlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Yge0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkuZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdCB7XG4gIC8qKiBUaGUgYWN0dWFsIGRldmljZSBJRCB0aGF0IGlzIGNvbm5lY3RlZCAobWF5IGRpZmZlciBmcm9tIHRoZSByZXF1ZXN0ZWQgb25lKS4gKi9cbiAgcmVhZG9ubHkgYWN0dWFsRGV2aWNlSWQ6IHN0cmluZztcblxuICAvKiogVGhlIGVtdWxhdG9yIHByb2Nlc3MsIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLiAqL1xuICByZWFkb25seSBlbXVsYXRvclByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIGxvY2FsbHktaW5zdGFsbGVkIE9ic2lkaWFuIHNoZWxsIHJlc29sdmVkIGJ5IHtAbGluayByZXNvbHZlSW5zdGFsbGVkU2hlbGxPck51bGx9LlxuICovXG5pbnRlcmZhY2UgSW5zdGFsbGVkU2hlbGwge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgaW5zdGFsbGVkIHNoZWxsIGV4ZWN1dGFibGUuICovXG4gIHJlYWRvbmx5IGV4ZVBhdGg6IHN0cmluZztcblxuICAvKiogVGhlIGRldGVjdGVkIHNoZWxsIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgY2Fubm90IGJlIGRldGVybWluZWQuICovXG4gIHJlYWRvbmx5IHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LnN0YXJ0QXBwaXVtQW5kRW11bGF0b3J9LlxuICovXG5pbnRlcmZhY2UgU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyB7XG4gIC8qKiBSZXNvbHZlZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIHRvIGJlY29tZSByZWFkeS4gKi9cbiAgcmVhZG9ubHkgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLiAqL1xuICByZWFkb25seSBhcHBpdW1Vcmw6IFVSTDtcblxuICAvKiogQVZEIG5hbWUgdG8gc3RhcnQuICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKiogUmVzb2x2ZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBwb3N0LWJvb3QgZGV2aWNlLWlkbGUgd2FpdCAoYDBgIHNraXBzIGl0KS4gKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBjb25zb2xlIHdpbmRvdyBpcyBzaG93biAob21pdHRlZCBcdTIxOTIgaGlkZGVuKS4gKi9cbiAgcmVhZG9ubHkgaXNBcHBpdW1Db25zb2xlVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuICovXG4gIHJlYWRvbmx5IGlzRW11bGF0b3JWaXNpYmxlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgcG9ydC4gKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIEFwcGl1bSBhdXRvLXN0YXJ0IGlzIGFsbG93ZWQuICovXG4gIHJlYWRvbmx5IHNob3VsZEF1dG9TdGFydEFwcGl1bT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LnN0YXJ0QXBwaXVtQW5kRW11bGF0b3J9LlxuICovXG5pbnRlcmZhY2UgU3RhcnRBcHBpdW1BbmRFbXVsYXRvclJlc3VsdCB7XG4gIC8qKiBUaGUgYWN0dWFsIGRldmljZSBJRCB0aGF0IGlzIGNvbm5lY3RlZCAobWF5IGRpZmZlciBmcm9tIHRoZSByZXF1ZXN0ZWQgb25lKS4gKi9cbiAgcmVhZG9ubHkgYWN0dWFsRGV2aWNlSWQ6IHN0cmluZztcblxuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgcHJvY2VzcywgaWYgb25lIHdhcyBhdXRvLXN0YXJ0ZWQuICovXG4gIHJlYWRvbmx5IGFwcGl1bVByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRoZSBlbXVsYXRvciBwcm9jZXNzLCBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZC4gKi9cbiAgcmVhZG9ubHkgZW11bGF0b3JQcm9jZXNzPzogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xufVxuXG5sZXQgY2FjaGVkVHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFbmNhcHN1bGF0ZXMgYWxsIEFwcGl1bSB0cmFuc3BvcnQgY3JlYXRpb24gbG9naWMsIGluY2x1ZGluZyBBcHBpdW0gc2VydmVyXG4gKiBzdGFydHVwLCBlbXVsYXRvciBtYW5hZ2VtZW50LCBhbmQgV2ViRHJpdmVySU8gc2Vzc2lvbiBlc3RhYmxpc2htZW50LlxuICpcbiAqIFVzaW5nIGEgY2xhc3MgYXZvaWRzIHRocmVhZGluZyB0aGUgdHJhbnNwb3J0IGB0eXBlYCBsYWJlbCB0aHJvdWdoIGV2ZXJ5XG4gKiBoZWxwZXIgZnVuY3Rpb24gXHUyMDE0IGB0aGlzLmxvZygpYCBhdXRvbWF0aWNhbGx5IHByZWZpeGVzIGl0LlxuICovXG5jbGFzcyBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5IHtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZykge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBBcHBpdW0gdHJhbnNwb3J0IGJ5IGVzdGFibGlzaGluZyBhIFdlYkRyaXZlcklPIHNlc3Npb24uXG4gICAqXG4gICAqIElmIGBvcHRpb25zLnNlc3Npb25JZGAgaXMgcHJlc2VudCwgcmVhdHRhY2hlcyB0byB0aGUgZXhpc3Rpbmcgc2Vzc2lvblxuICAgKiBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS4gVGhpcyBhdm9pZHMgZHVwbGljYXRlIEFwcGl1bS9BREIgY29ubmVjdGlvbnNcbiAgICogd2hlbiB0ZXN0IHdvcmtlcnMgcmV1c2UgdGhlIGdsb2JhbCBzZXR1cCdzIHNlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQW5kcm9pZCBBcHBpdW0gdHJhbnNwb3J0IG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIEEgY29uZmlndXJlZCBBcHBpdW0gdHJhbnNwb3J0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZShvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICAgIGlmIChvcHRpb25zLnNlc3Npb25JZCAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuZGV2aWNlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0YWNoVG9FeGlzdGluZ1Nlc3Npb24ob3B0aW9ucy5zZXNzaW9uSWQsIG9wdGlvbnMuZGV2aWNlSWQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZU5ld1Nlc3Npb24ob3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGF0dGFjaFRvRXhpc3RpbmdTZXNzaW9uKFxuICAgIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIGRldmljZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9uc1xuICApOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRpb25zLmFwcGl1bVVybCk7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcih1cmwucG9ydCk7XG4gICAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkID8/IEFQUF9QQUNLQUdFO1xuXG4gICAgdGhpcy5sb2coYFJlYXR0YWNoaW5nIHRvIGV4aXN0aW5nIEFwcGl1bSBzZXNzaW9uICR7c2Vzc2lvbklkfSAoZGV2aWNlPSR7ZGV2aWNlSWR9KWApO1xuXG4gICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IGF0dGFjaCh7XG4gICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgcGxhdGZvcm1OYW1lOiAnQW5kcm9pZCdcbiAgICAgIH0sXG4gICAgICBob3N0bmFtZTogdXJsLmhvc3RuYW1lLFxuICAgICAgbG9nTGV2ZWw6ICd3YXJuJyxcbiAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgIHBvcnQsXG4gICAgICBzZXNzaW9uSWQsXG4gICAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBzdHJpcEZvcmJpZGRlbkZldGNoSGVhZGVyc1xuICAgIH0pO1xuXG4gICAgdGhpcy5sb2coJ1JlYXR0YWNoZWQgdG8gQXBwaXVtIHNlc3Npb24uJyk7XG5cbiAgICByZXR1cm4gbmV3IEFwcGl1bVRyYW5zcG9ydCh7XG4gICAgICBhcHBJZCxcbiAgICAgIGJyb3dzZXIsXG4gICAgICBkZXZpY2VJZCxcbiAgICAgIGlzU2Vzc2lvbk93bmVyOiBmYWxzZSxcbiAgICAgIHBsYXRmb3JtOiAnYW5kcm9pZCcsXG4gICAgICAuLi4ob3B0aW9ucy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSksXG4gICAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSksXG4gICAgICAuLi4ob3B0aW9ucy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSlcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsOiBVUkwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzVXJsID0gbmV3IFVSTCgnL3N0YXR1cycsIHVybCk7XG4gICAgICBjb25zdCByZXEgPSBodHRwLmdldChzdGF0dXNVcmwsIHsgdGltZW91dDogQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LCAocmVzKSA9PiB7XG4gICAgICAgIHJlcy5yZXN1bWUoKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgICByZXEub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICAgIHJlcS5kZXN0cm95KCk7XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59IGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmVxLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgcmVqZWN0KFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgcmVhY2ggQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59OiAke2Vyci5tZXNzYWdlfS4gSXMgdGhlIEFwcGl1bSBzZXJ2ZXIgcnVubmluZz9gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZU5ld1Nlc3Npb24ob3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgICB0aGlzLmxvZyhgQ3JlYXRpbmcgQXBwaXVtVHJhbnNwb3J0ICh1cmw9JHtvcHRpb25zLmFwcGl1bVVybH0sIGF2ZD0ke29wdGlvbnMuYXZkTmFtZX0pYCk7XG5cbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdGlvbnMuYXBwaXVtVXJsKTtcblxuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIodXJsLnBvcnQpO1xuICAgIGlmIChpc05hTihwb3J0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBvcnQgaW4gYXBwaXVtVXJsOiAke3VybC5wb3J0fWApO1xuICAgIH1cblxuICAgIGNvbnN0IGFwcElkID0gb3B0aW9ucy5hcHBJZCA/PyBBUFBfUEFDS0FHRTtcblxuICAgIGxldCBhcHBpdW1Qcm9jZXNzOiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGVtdWxhdG9yUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3RhcnRBcHBpdW1BbmRFbXVsYXRvcih7XG4gICAgICAgIGFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzOiByZXNvbHZlQXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMob3B0aW9ucyksXG4gICAgICAgIGFwcGl1bVVybDogdXJsLFxuICAgICAgICBhdmROYW1lOiBvcHRpb25zLmF2ZE5hbWUsXG4gICAgICAgIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHJlc29sdmVEZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgICAgICBpc0FwcGl1bUNvbnNvbGVWaXNpYmxlOiBvcHRpb25zLmlzQXBwaXVtQ29uc29sZVZpc2libGUsXG4gICAgICAgIGlzRW11bGF0b3JWaXNpYmxlOiBvcHRpb25zLmlzRW11bGF0b3JWaXNpYmxlLFxuICAgICAgICBwb3J0LFxuICAgICAgICBzaG91bGRBdXRvU3RhcnRBcHBpdW06IG9wdGlvbnMuc2hvdWxkQXV0b1N0YXJ0QXBwaXVtXG4gICAgICB9KTtcblxuICAgICAgYXBwaXVtUHJvY2VzcyA9IHJlc3VsdC5hcHBpdW1Qcm9jZXNzO1xuICAgICAgZW11bGF0b3JQcm9jZXNzID0gcmVzdWx0LmVtdWxhdG9yUHJvY2VzcztcbiAgICAgIGNvbnN0IGFjdHVhbERldmljZUlkID0gcmVzdWx0LmFjdHVhbERldmljZUlkO1xuXG4gICAgICBjb25zdCBzZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dCA9IHJlc29sdmVTZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpO1xuICAgICAgdGhpcy5sb2coXG4gICAgICAgIGBDb25uZWN0aW5nIHRvIEFwcGl1bSAoZGV2aWNlPSR7YWN0dWFsRGV2aWNlSWR9LCBhcHA9JHthcHBJZH0sIHJldHJ5VGltZW91dDogJHtTdHJpbmcoc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXQpfW1zLCByZXRyaWVzOiAke1N0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCl9KS4uLmBcbiAgICAgICk7XG4gICAgICBjb25zdCBicm93c2VyID0gYXdhaXQgcmVtb3RlKHtcbiAgICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgJ2FwcGl1bTphcHBBY3Rpdml0eSc6IEFQUF9BQ1RJVklUWSxcbiAgICAgICAgICAnYXBwaXVtOmFwcFBhY2thZ2UnOiBhcHBJZCxcbiAgICAgICAgICAnYXBwaXVtOmF1dG9HcmFudFBlcm1pc3Npb25zJzogdHJ1ZSxcbiAgICAgICAgICAnYXBwaXVtOmF1dG9tYXRpb25OYW1lJzogJ1VpQXV0b21hdG9yMicsXG4gICAgICAgICAgJ2FwcGl1bTpuZXdDb21tYW5kVGltZW91dCc6IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTpub1Jlc2V0JzogdHJ1ZSxcbiAgICAgICAgICAnYXBwaXVtOnVkaWQnOiBhY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgICAnYXBwaXVtOnVpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0JzogU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTp1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0JzogU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAncGxhdGZvcm1OYW1lJzogJ0FuZHJvaWQnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCxcbiAgICAgICAgY29ubmVjdGlvblJldHJ5VGltZW91dDogc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXQsXG4gICAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgdHJhbnNmb3JtUmVxdWVzdDogc3RyaXBGb3JiaWRkZW5GZXRjaEhlYWRlcnNcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmxvZygnQXBwaXVtIHNlc3Npb24gZXN0YWJsaXNoZWQuJyk7XG4gICAgICBjb25zdCBhcHBpdW1UcmFuc3BvcnQgPSBuZXcgQXBwaXVtVHJhbnNwb3J0KHtcbiAgICAgICAgYXBwSWQsXG4gICAgICAgIGJyb3dzZXIsXG4gICAgICAgIGRldmljZUlkOiBhY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgcGxhdGZvcm06ICdhbmRyb2lkJyxcbiAgICAgICAgLi4uKG9wdGlvbnMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzIH0pLFxuICAgICAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSksXG4gICAgICAgIC4uLihvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsRGlzcG9zZSA9IGFwcGl1bVRyYW5zcG9ydC5kaXNwb3NlLmJpbmQoYXBwaXVtVHJhbnNwb3J0KTtcbiAgICAgIGNvbnN0IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgPSBhcHBpdW1UcmFuc3BvcnQ7XG4gICAgICB0cmFuc3BvcnQuZGlzcG9zZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbERpc3Bvc2UoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdHJhbnNwb3J0LmRpc3Bvc2VTeW5jID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0cmFuc3BvcnQ7XG5cbiAgICAgIGZ1bmN0aW9uIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgICAgLy8gQ2Fubm90IHVzZSB0aGlzLmxvZyBpbnNpZGUgbmVzdGVkIGZ1bmN0aW9uIFx1MjAxNCBgdGhpc2AgaXMgbm90IGNhcHR1cmVkLlxuICAgICAgICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7b3B0aW9ucy50eXBlfV0gQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICAgICAga2lsbFByb2Nlc3NUcmVlKGVtdWxhdG9yUHJvY2Vzcyk7XG4gICAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHtvcHRpb25zLnR5cGV9XSBBdXRvLXN0YXJ0ZWQgZW11bGF0b3Igc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgIHRoaXMubG9nKCdLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgaWYgKGVtdWxhdG9yUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoZW11bGF0b3JQcm9jZXNzKTtcbiAgICAgICAgdGhpcy5sb2coJ0tpbGxlZCBhdXRvLXN0YXJ0ZWQgZW11bGF0b3IgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVEZXZpY2VDb25uZWN0ZWQocGFyYW1zOiBFbnN1cmVEZXZpY2VDb25uZWN0ZWRQYXJhbXMpOiBQcm9taXNlPEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdD4ge1xuICAgIGNvbnN0IHsgYXZkTmFtZSwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgaXNFbXVsYXRvclZpc2libGUgfSA9IHBhcmFtcztcbiAgICBjb25zdCBkZXZpY2VJZHNCZWZvcmUgPSBhd2FpdCB0aGlzLmdldENvbm5lY3RlZERldmljZUlkcygpO1xuICAgIHRoaXMubG9nKGBDaGVja2luZyBleGlzdGluZyBkZXZpY2VzIGZvciBBVkQgXCIke2F2ZE5hbWV9XCIuLi4gKGNvbm5lY3RlZDogWyR7ZGV2aWNlSWRzQmVmb3JlLmpvaW4oJywgJyl9XSlgKTtcblxuICAgIGNvbnN0IGV4aXN0aW5nRGV2aWNlSWQgPSBhd2FpdCB0aGlzLmZpbmREZXZpY2VCeUF2ZE5hbWUoYXZkTmFtZSwgZGV2aWNlSWRzQmVmb3JlKTtcblxuICAgIGlmIChleGlzdGluZ0RldmljZUlkKSB7XG4gICAgICB0aGlzLmxvZyhgQVZEIFwiJHthdmROYW1lfVwiIGlzIGFscmVhZHkgcnVubmluZyBvbiBkZXZpY2UgJHtleGlzdGluZ0RldmljZUlkfSwgcmV1c2luZy5gKTtcbiAgICAgIGF3YWl0IHRoaXMuc3VwcHJlc3NFcnJvckRpYWxvZ3MoZXhpc3RpbmdEZXZpY2VJZCk7XG4gICAgICByZXR1cm4geyBhY3R1YWxEZXZpY2VJZDogZXhpc3RpbmdEZXZpY2VJZCB9O1xuICAgIH1cblxuICAgIHRoaXMubG9nKGBBVkQgXCIke2F2ZE5hbWV9XCIgbm90IGZvdW5kIG9uIGFueSBleGlzdGluZyBkZXZpY2UsIHN0YXJ0aW5nIGEgbmV3IGVtdWxhdG9yLi4uYCk7XG4gICAgY29uc3QgZW11bGF0b3IgPSB0aGlzLnN0YXJ0RW11bGF0b3IoYXZkTmFtZSwgaXNFbXVsYXRvclZpc2libGUpO1xuXG4gICAgbGV0IGFjdHVhbERldmljZUlkOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGFjdHVhbERldmljZUlkID0gYXdhaXQgdGhpcy53YWl0Rm9yTmV3RGV2aWNlKGRldmljZUlkc0JlZm9yZSwgZW11bGF0b3IsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBlbXVsYXRvci5zdG9wQ2FwdHVyZSgpO1xuICAgIH1cblxuICAgIHRoaXMubG9nKGBFbXVsYXRvciBcIiR7YXZkTmFtZX1cIiBzdGFydGVkLCBkZXZpY2UgJHthY3R1YWxEZXZpY2VJZH0gaXMgY29ubmVjdGVkLmApO1xuICAgIGF3YWl0IHRoaXMuc3VwcHJlc3NFcnJvckRpYWxvZ3MoYWN0dWFsRGV2aWNlSWQpO1xuICAgIHJldHVybiB7IGFjdHVhbERldmljZUlkLCBlbXVsYXRvclByb2Nlc3M6IGVtdWxhdG9yLnByb2Nlc3MgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmluZERldmljZUJ5QXZkTmFtZShhdmROYW1lOiBzdHJpbmcsIGRldmljZUlkczogc3RyaW5nW10pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGZvciAoY29uc3QgZGV2aWNlSWQgb2YgZGV2aWNlSWRzKSB7XG4gICAgICBjb25zdCBydW5uaW5nQXZkID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBleGVjRmlsZShcbiAgICAgICAgICAnYWRiJyxcbiAgICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdlbXUnLCAnYXZkJywgJ25hbWUnXSxcbiAgICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgICAoX2Vycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoc3Rkb3V0LnNwbGl0KCdcXG4nKVswXT8udHJpbSgpID8/ICcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHJ1bm5pbmdBdmQgPT09IGF2ZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGRldmljZUlkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldENvbm5lY3RlZERldmljZUlkcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBleGVjRmlsZSgnYWRiJywgWydkZXZpY2VzJ10sIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LCAoZXJyb3IsIHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gJ2FkYiBkZXZpY2VzJzogJHtlcnJvci5tZXNzYWdlfS4gSXMgQURCIGluc3RhbGxlZCBhbmQgaW4gUEFUSD9gKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICB0aGlzLmxvZyhgQURCIHN0ZGVycjogJHtzdGRlcnIudHJpbSgpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoc3Rkb3V0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgbGluZXMgPSBvdXRwdXQuc3BsaXQoJ1xcbicpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgICByZXR1cm4gbGluZXNcbiAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUuaW5jbHVkZXMoJ1xcdGRldmljZScpKVxuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zcGxpdCgnXFx0JylbMF0gPz8gJycpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZXZpY2VQcm9wKGRldmljZUlkOiBzdHJpbmcsIHByb3A6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShcbiAgICAgICAgJ2FkYicsXG4gICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2dldHByb3AnLCBwcm9wXSxcbiAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgIChlcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgLy8gUmV0dXJuIG5vIG91dHB1dCBvbiB0aW1lb3V0L2Vycm9yIChub3QgcGFydGlhbCBzdGRvdXQpIHNvIGEgbm9uLXJlc3BvbnNpdmUgZ3Vlc3QgcmVhZHMgYXMgXCJub3QgaWRsZVwiLlxuICAgICAgICAgIHJlc29sdmUoZXJyb3IgPyAnJyA6IHN0ZG91dCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxpc3RJbnN0YWxsZWRQYWNrYWdlcyhkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAnYWRiJyxcbiAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnY21kJywgJ3BhY2thZ2UnLCAnbGlzdCcsICdwYWNrYWdlcyddLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAvLyBSZXR1cm4gbm8gb3V0cHV0IG9uIHRpbWVvdXQvZXJyb3Igc28gYSBjaHVybmluZyBndWVzdCdzIHNsb3cvcGFydGlhbCBwYWNrYWdlIGxpc3QgY2FuJ3QgZmFsc2VseSByZWFkIGFzIGlkbGUuXG4gICAgICAgICAgcmVzb2x2ZShlcnJvciA/ICcnIDogc3Rkb3V0KTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7dGhpcy50eXBlfV0gJHttZXNzYWdlfWApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRW11bGF0b3JCaW5hcnkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZGtSb290ID0gcHJvY2Vzcy5lbnZbJ0FORFJPSURfSE9NRSddID8/IHByb2Nlc3MuZW52WydBTkRST0lEX1NES19ST09UJ107XG4gICAgaWYgKCFzZGtSb290KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgZmluZCBBbmRyb2lkIGVtdWxhdG9yOiBuZWl0aGVyIEFORFJPSURfSE9NRSBub3IgQU5EUk9JRF9TREtfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGpvaW4oc2RrUm9vdCwgJ2VtdWxhdG9yJywgJ2VtdWxhdG9yJyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRLZXlFdmVudChkZXZpY2VJZDogc3RyaW5nLCBrZXlDb2RlOiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdpbnB1dCcsICdrZXlldmVudCcsIFN0cmluZyhrZXlDb2RlKV0sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgICBgV2FybmluZzogZmFpbGVkIHRvICR7ZGVzY3JpcHRpb259IChrZXlldmVudCAke1N0cmluZyhrZXlDb2RlKX0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydEFwcGl1bUFuZEVtdWxhdG9yKHBhcmFtczogU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyk6IFByb21pc2U8U3RhcnRBcHBpdW1BbmRFbXVsYXRvclJlc3VsdD4ge1xuICAgIGNvbnN0IHsgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMsIGFwcGl1bVVybCwgYXZkTmFtZSwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgaXNBcHBpdW1Db25zb2xlVmlzaWJsZSwgaXNFbXVsYXRvclZpc2libGUsIHBvcnQsIHNob3VsZEF1dG9TdGFydEFwcGl1bSB9ID0gcGFyYW1zO1xuXG4gICAgbGV0IG5lZWRzQXBwaXVtU3RhcnQgPSBmYWxzZTtcblxuICAgIHRoaXMubG9nKGBDaGVja2luZyBBcHBpdW0gc2VydmVyIGF0ICR7YXBwaXVtVXJsLmhyZWZ9Li4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBpdW1SZWFjaGFibGUoYXBwaXVtVXJsKTtcbiAgICAgIHRoaXMubG9nKCdBcHBpdW0gc2VydmVyIGlzIHJlYWNoYWJsZS4nKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKHNob3VsZEF1dG9TdGFydEFwcGl1bSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBuZWVkc0FwcGl1bVN0YXJ0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBsZXQgYXBwaXVtUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5lZWRzQXBwaXVtU3RhcnQpIHtcbiAgICAgIHRoaXMubG9nKGBBcHBpdW0gbm90IHJlYWNoYWJsZSwgYXV0by1zdGFydGluZyBvbiBwb3J0ICR7U3RyaW5nKHBvcnQpfS4uLmApO1xuICAgICAgYXBwaXVtUHJvY2VzcyA9IHRoaXMuc3RhcnRBcHBpdW1TZXJ2ZXIocG9ydCwgaXNBcHBpdW1Db25zb2xlVmlzaWJsZSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFssIGRldmljZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIG5lZWRzQXBwaXVtU3RhcnRcbiAgICAgICAgICA/IHRoaXMud2FpdEZvckFwcGl1bVJlYWR5KGFwcGl1bVVybCwgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2coJ0F1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGlzIHJlYWR5LicpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgICAgdGhpcy5lbnN1cmVEZXZpY2VDb25uZWN0ZWQoeyBhdmROYW1lLCBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzLCBpc0VtdWxhdG9yVmlzaWJsZSB9KVxuICAgICAgXSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFjdHVhbERldmljZUlkOiBkZXZpY2VSZXN1bHQuYWN0dWFsRGV2aWNlSWQsXG4gICAgICAgIGFwcGl1bVByb2Nlc3MsXG4gICAgICAgIGVtdWxhdG9yUHJvY2VzczogZGV2aWNlUmVzdWx0LmVtdWxhdG9yUHJvY2Vzc1xuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgICAga2lsbFByb2Nlc3NUcmVlKGFwcGl1bVByb2Nlc3MpO1xuICAgICAgICB0aGlzLmxvZygnS2lsbGVkIGF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGFmdGVyIHN0YXJ0dXAgZmFpbHVyZS4nKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRBcHBpdW1TZXJ2ZXIocG9ydDogbnVtYmVyLCBpc0FwcGl1bUNvbnNvbGVWaXNpYmxlPzogYm9vbGVhbik6IENoaWxkUHJvY2VzcyB7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihgbnB4IGFwcGl1bSAtLWxvZy10aW1lc3RhbXAgLS1wb3J0ICR7U3RyaW5nKHBvcnQpfSAtLWFsbG93LWluc2VjdXJlPSR7Q0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFfWAsIHtcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAnaW5oZXJpdCcsICdpbmhlcml0J10sXG4gICAgICB3aW5kb3dzSGlkZTogc2hvdWxkSGlkZUFwcGl1bUNvbnNvbGUoaXNBcHBpdW1Db25zb2xlVmlzaWJsZSlcbiAgICB9KTtcblxuICAgIGNoaWxkLnVucmVmKCk7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEVtdWxhdG9yKGF2ZE5hbWU6IHN0cmluZywgaXNFbXVsYXRvclZpc2libGU/OiBib29sZWFuKTogRW11bGF0b3JMYXVuY2gge1xuICAgIGNvbnN0IGVtdWxhdG9yQmluYXJ5ID0gdGhpcy5yZXNvbHZlRW11bGF0b3JCaW5hcnkoKTtcbiAgICBjb25zdCBhcmdzID0gYnVpbGRFbXVsYXRvckFyZ3MoeyBhdmROYW1lLCBpc0hpZGRlbjogc2hvdWxkSGlkZUVtdWxhdG9yV2luZG93KGlzRW11bGF0b3JWaXNpYmxlKSB9KTtcbiAgICB0aGlzLmxvZyhgUnVubmluZzogJHtlbXVsYXRvckJpbmFyeX0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAvKlxuICAgICAqIFBpcGUgKHJhdGhlciB0aGFuIGlnbm9yZSkgc3Rkb3V0L3N0ZGVyciBzbyBhbiBlYXJseSBmYWlsdXJlIHN1Y2ggYXNcbiAgICAgKiBcIng4Nl82NCBlbXVsYXRpb24gY3VycmVudGx5IHJlcXVpcmVzIGhhcmR3YXJlIGFjY2VsZXJhdGlvblwiIGNhbiBiZVxuICAgICAqIHN1cmZhY2VkIGltbWVkaWF0ZWx5IGluc3RlYWQgb2Ygd2FpdGluZyBvdXQgdGhlIGZ1bGwgYm9vdCB0aW1lb3V0LlxuICAgICAqL1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oZW11bGF0b3JCaW5hcnksIGFyZ3MsIHtcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddXG4gICAgfSk7XG5cbiAgICBsZXQgY2FwdHVyZWRPdXRwdXQgPSAnJztcbiAgICBsZXQgZXhpdEluZm86IEVtdWxhdG9yRXhpdEluZm8gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGlzQ2FwdHVyaW5nID0gdHJ1ZTtcblxuICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGFwcGVuZE91dHB1dCk7XG4gICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgYXBwZW5kT3V0cHV0KTtcbiAgICBjaGlsZC5vbmNlKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgZXhpdEluZm8gPSB7IGNvZGUsIHNpZ25hbCB9O1xuICAgIH0pO1xuXG4gICAgY2hpbGQudW5yZWYoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBwcm9jZXNzOiBjaGlsZCxcbiAgICAgIHJlYWRFeGl0SW5mbzogKCkgPT4gZXhpdEluZm8sXG4gICAgICByZWFkT3V0cHV0OiAoKSA9PiBjYXB0dXJlZE91dHB1dCxcbiAgICAgIHN0b3BDYXB0dXJlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIExlYXZlIHRoZSBgZGF0YWAgbGlzdGVuZXJzIGF0dGFjaGVkIHNvIHRoZSBwaXBlcyBrZWVwIGRyYWluaW5nIChhXG4gICAgICAgICAqIGZ1bGwgT1MgcGlwZSBidWZmZXIgd291bGQgYmxvY2sgdGhlIGxvbmctcnVubmluZyBlbXVsYXRvcik7IHRoZSBmbGFnXG4gICAgICAgICAqIGp1c3QgZnJlZXplcyB0aGUgY2FwdHVyZWQgdGFpbCBvbmNlIHN0YXJ0dXAgaGFzIHN1Y2NlZWRlZC5cbiAgICAgICAgICovXG4gICAgICAgIGlzQ2FwdHVyaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGFwcGVuZE91dHB1dChjaHVuazogQnVmZmVyKTogdm9pZCB7XG4gICAgICBpZiAoIWlzQ2FwdHVyaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhcHR1cmVkT3V0cHV0ID0gKGNhcHR1cmVkT3V0cHV0ICsgY2h1bmsudG9TdHJpbmcoKSkuc2xpY2UoLUVNVUxBVE9SX09VVFBVVF9UQUlMX01BWF9MRU5HVEgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyB0aGUgZ3Vlc3QncyBjcmFzaC9BTlIgZGlhbG9ncyBvbiB0aGUgZ2l2ZW4gZGV2aWNlLlxuICAgKlxuICAgKiBBIHJlc291cmNlLXN0YXJ2ZWQgZW11bGF0b3IgY2FuIHJhaXNlIGEgXCJQcm9jZXNzIHN5c3RlbSBpc24ndCByZXNwb25kaW5nXCJcbiAgICogQU5SIChhbiBgQWN0aXZpdHlNYW5hZ2VyU2VydmljZWAgdGltZW91dCkgd2hvc2UgZGlhbG9nIG92ZXJsYXlzIHRoZSBVSS4gSWZcbiAgICogaXQgYXBwZWFycyBiZWZvcmUgQXBwaXVtIGF0dGFjaGVzLCBub3RoaW5nIGNhbiBkaXNtaXNzIGl0IGFuZCB0aGUgcnVuIGhhbmdzXG4gICAqIG9yIGZhaWxzIGludGVybWl0dGVudGx5LiBTZXR0aW5nIHRoZSBgaGlkZV9lcnJvcl9kaWFsb2dzYCBnbG9iYWwgXHUyMDE0IHRoZSBzYW1lXG4gICAqIGZsYWcgQW5kcm9pZCdzIG93biB0ZXN0IGluZnJhIHVzZXMgXHUyMDE0IHRlbGxzIGBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlYCB0b1xuICAgKiBuZXZlciBkcmF3IGNyYXNoL0FOUiBkaWFsb2dzLCBzbyB0aGUgQU5SIGNhbiBubyBsb25nZXIgYmxvY2sgYXV0b21hdGlvbi5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgZWFybGllc3QgcG9pbnQgYXQgd2hpY2ggdGhlIGZsYWcgY2FuIGJlIHNldDogdGhlIGZyYW1ld29ya1xuICAgKiAoYHN5c3RlbV9zZXJ2ZXJgKSBtdXN0IGJlIHVwIGJlZm9yZSBgc2V0dGluZ3MgcHV0YCB3b3Jrcywgc28gY2FsbGVycyBpbnZva2VcbiAgICogaXQgb25seSBhZnRlciBgc3lzLmJvb3RfY29tcGxldGVkYC4gSXQgbmFycm93cyBcdTIwMTQgYnV0IGNhbm5vdCBmdWxseSBjbG9zZSBcdTIwMTRcbiAgICogdGhlIHJhY2Ugd2l0aCBhbiBBTlIgdGhhdCBmaXJlcyBiZXR3ZWVuIGJvb3QgY29tcGxldGluZyBhbmQgdGhpcyBjYWxsOyBhXG4gICAqIHByZS1iYWtlZCBzbmFwc2hvdCB3aXRoIHRoZSBmbGFnIGFscmVhZHkgc2V0IGlzIHRoZSBvbmx5IHdheSB0byBlbGltaW5hdGVcbiAgICogaXQgZW50aXJlbHkuIEJlc3QtZWZmb3J0OiBhIGZhaWx1cmUgaXMgbG9nZ2VkLCBub3QgdGhyb3duLCBzaW5jZSBpdCBvbmx5XG4gICAqIHN1cHByZXNzZXMgYSBzeW1wdG9tLlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gY29uZmlndXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzdXBwcmVzc0Vycm9yRGlhbG9ncyhkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coYERpc2FibGluZyBjcmFzaC9BTlIgZGlhbG9ncyBvbiBkZXZpY2UgJHtkZXZpY2VJZH0gKHNldHRpbmdzIHB1dCBnbG9iYWwgaGlkZV9lcnJvcl9kaWFsb2dzIDEpLi4uYCk7XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdzZXR0aW5ncycsICdwdXQnLCAnZ2xvYmFsJywgJ2hpZGVfZXJyb3JfZGlhbG9ncycsICcxJ10sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgICBgV2FybmluZzogZmFpbGVkIHRvIGRpc2FibGUgY3Jhc2gvQU5SIGRpYWxvZ3M6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcid9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JBcHBpdW1SZWFkeSh1cmw6IFVSTCwgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgQXBwaXVtIGF0ICR7dXJsLmhyZWZ9ICh0aW1lb3V0OiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLCBwb2xsOiAke1N0cmluZyhBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmBcbiAgICApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gc3RhcnQgKyB0aW1lb3V0SW5NaWxsaXNlY29uZHM7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybCk7XG4gICAgICAgIHRoaXMubG9nKGBBcHBpdW0gc2VydmVyIHJlYWR5IGFmdGVyICR7U3RyaW5nKERhdGUubm93KCkgLSBzdGFydCl9bXMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aGlzLmxvZyhgQXBwaXVtIHNlcnZlciBub3QgcmVhZHkgeWV0IChlbGFwc2VkOiAke1N0cmluZyhEYXRlLm5vdygpIC0gc3RhcnQpfW1zKS4gUmV0cnlpbmcuLi5gKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcodGltZW91dEluTWlsbGlzZWNvbmRzKX1tc2BcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQm9vdChkZXZpY2VJZDogc3RyaW5nLCBkZWFkbGluZTogbnVtYmVyLCBlbXVsYXRvcjogRW11bGF0b3JMYXVuY2gpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZW1haW5pbmdNcyA9IE1hdGgubWF4KDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSk7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGZpbmlzaCBib290aW5nIChyZW1haW5pbmc6ICR7U3RyaW5nKHJlbWFpbmluZ01zKX1tcywgcG9sbDogJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBpc0Jvb3RlZCA9IGF3YWl0IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAgICdhZGInLFxuICAgICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2dldHByb3AnLCAnc3lzLmJvb3RfY29tcGxldGVkJ10sXG4gICAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgICAgKF9lcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHN0ZG91dC50cmltKCkgPT09ICcxJyk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpc0Jvb3RlZCkge1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGJvb3QgY29tcGxldGVkLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXRJbmZvID0gZW11bGF0b3IucmVhZEV4aXRJbmZvKCk7XG4gICAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJ1aWxkRW11bGF0b3JFeGl0TWVzc2FnZShleGl0SW5mbywgZW11bGF0b3IucmVhZE91dHB1dCgpKSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBjb25uZWN0ZWQgYnV0IGRpZCBub3QgZmluaXNoIGJvb3Rpbmcgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciBhIGZyZXNobHktYm9vdGVkIGVtdWxhdG9yIHRvIGJlY29tZSBpZGxlIGJlZm9yZSB0aGUgc2Vzc2lvbiBpc1xuICAgKiBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogYHN5cy5ib290X2NvbXBsZXRlZGAgZmlyZXMgYmVmb3JlIHRoZSBndWVzdCBpcyBhY3R1YWxseSBpZGxlIFx1MjAxNCBwYWNrYWdlXG4gICAqIG9wdGltaXphdGlvbiBhbmQgc2VydmljZXMga2VlcCBjaHVybmluZyBcdTIwMTQgc28gZXN0YWJsaXNoaW5nIHRoZSBBcHBpdW1cbiAgICogc2Vzc2lvbiBpbW1lZGlhdGVseSBtYWtlcyBldmVyeSBzZXJpYWxpemVkIFVpQXV0b21hdG9yMiBgYWRiYCByb3VuZC10cmlwXG4gICAqIGNvbnRlbmQgd2l0aCB0aGF0IHdvcmsgYW5kIGluZmxhdGVzIHNlc3Npb24gZXN0YWJsaXNobWVudCB+M3guIFRoaXMgcG9sbHNcbiAgICogYSBsYXRlciwgcXVpZXRlciBzaWduYWwgKGJvb3QgYW5pbWF0aW9uIHN0b3BwZWQgKyBwYWNrYWdlIG1hbmFnZXIgc2VydmluZyxcbiAgICogdmlhIHtAbGluayBjaGVja0RldmljZUlkbGV9KSBhbmQgcmV0dXJucyBhcyBzb29uIGFzIGl0IGlzIHNhdGlzZmllZC5cbiAgICpcbiAgICogQmVzdC1lZmZvcnQ6IGlmIHRoZSBndWVzdCBkb2VzIG5vdCByZXBvcnQgaWRsZSB3aXRoaW4gdGhlIGJ1ZGdldCBpdCBsb2dzIGFcbiAgICogd2FybmluZyBhbmQgcHJvY2VlZHMgKGEgc2xvdyBzZXNzaW9uIGlzIGJldHRlciB0aGFuIGEgZmFpbGVkIHJ1biksIGFuZCBhXG4gICAqIGJ1ZGdldCBvZiBgMGAgc2tpcHMgdGhlIHdhaXQgZW50aXJlbHkuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRCB0byBwb2xsLlxuICAgKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gTWF4aW11bSB0aW1lIHRvIHdhaXQ7IGAwYCBza2lwcyB0aGUgd2FpdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckRldmljZUlkbGUoZGV2aWNlSWQ6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGltZW91dEluTWlsbGlzZWNvbmRzIDw9IDApIHtcbiAgICAgIHRoaXMubG9nKGBTa2lwcGluZyBwb3N0LWJvb3QgaWRsZSB3YWl0IGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gKHRpbWVvdXQgaXMgMCkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gc3RhcnQgKyB0aW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGJlY29tZSBpZGxlICh0aW1lb3V0OiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLCBwb2xsOiAke1N0cmluZyhERVZJQ0VfSURMRV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBbYm9vdEFuaW1hdGlvblByb3AsIHBhY2thZ2VMaXN0T3V0cHV0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdGhpcy5nZXREZXZpY2VQcm9wKGRldmljZUlkLCAnaW5pdC5zdmMuYm9vdGFuaW0nKSxcbiAgICAgICAgdGhpcy5saXN0SW5zdGFsbGVkUGFja2FnZXMoZGV2aWNlSWQpXG4gICAgICBdKTtcblxuICAgICAgaWYgKGNoZWNrRGV2aWNlSWRsZSh7IGJvb3RBbmltYXRpb25Qcm9wLCBwYWNrYWdlTGlzdE91dHB1dCB9KSkge1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGlzIGlkbGUgYWZ0ZXIgJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IG5vdCBpZGxlIHlldCAoZWxhcHNlZDogJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcykuIFJldHJ5aW5nLi4uYCk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIERFVklDRV9JRExFX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMubG9nKFxuICAgICAgYFdhcm5pbmc6IGRldmljZSAke2RldmljZUlkfSBkaWQgbm90IHJlcG9ydCBpZGxlIHdpdGhpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zOyBwcm9jZWVkaW5nIHdpdGggc2Vzc2lvbiBlc3RhYmxpc2htZW50IGFueXdheS5gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvck5ld0RldmljZShkZXZpY2VJZHNCZWZvcmU6IHN0cmluZ1tdLCBlbXVsYXRvcjogRW11bGF0b3JMYXVuY2gsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgYSBuZXcgZGV2aWNlIHRvIGFwcGVhciBpbiBBREIgKHRpbWVvdXQ6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1N0cmluZyhFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gXG4gICAgKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgY29uc3QgY3VycmVudElkcyA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGVkRGV2aWNlSWRzKCk7XG4gICAgICBjb25zdCBuZXdJZHMgPSBjdXJyZW50SWRzLmZpbHRlcigoaWQpID0+ICFkZXZpY2VJZHNCZWZvcmUuaW5jbHVkZXMoaWQpKTtcblxuICAgICAgaWYgKG5ld0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGFjdHVhbERldmljZUlkID0gbmV3SWRzWzBdID8/ICcnO1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7YWN0dWFsRGV2aWNlSWR9IGFwcGVhcmVkIGluIEFEQiwgd2FpdGluZyBmb3IgYm9vdCB0byBjb21wbGV0ZS4uLmApO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JCb290KGFjdHVhbERldmljZUlkLCBkZWFkbGluZSwgZW11bGF0b3IpO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JEZXZpY2VJZGxlKGFjdHVhbERldmljZUlkLCBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzKTtcbiAgICAgICAgYXdhaXQgdGhpcy53YWtlU2NyZWVuKGFjdHVhbERldmljZUlkKTtcbiAgICAgICAgcmV0dXJuIGFjdHVhbERldmljZUlkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleGl0SW5mbyA9IGVtdWxhdG9yLnJlYWRFeGl0SW5mbygpO1xuICAgICAgaWYgKGV4aXRJbmZvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihidWlsZEVtdWxhdG9yRXhpdE1lc3NhZ2UoZXhpdEluZm8sIGVtdWxhdG9yLnJlYWRPdXRwdXQoKSkpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE5vIG5ldyBlbXVsYXRvciBkZXZpY2UgYXBwZWFyZWQgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWtlU2NyZWVuKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZyhgV2FraW5nIHNjcmVlbiBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uLi5gKTtcblxuICAgIGF3YWl0IHRoaXMuc2VuZEtleUV2ZW50KGRldmljZUlkLCBLRVlDT0RFX1dBS0VVUCwgJ3dha2Ugc2NyZWVuJyk7XG4gICAgYXdhaXQgdGhpcy5zZW5kS2V5RXZlbnQoZGV2aWNlSWQsIEtFWUNPREVfTUVOVSwgJ2Rpc21pc3MgbG9jayBzY3JlZW4nKTtcblxuICAgIHRoaXMubG9nKGBTY3JlZW4gd2FrZSBjb21wbGV0ZSBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlbiBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIGFuIG93bmVkIGRlc2t0b3AgQ0RQIHRyYW5zcG9ydC5cbiAqIEByZXR1cm5zIEEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGNvbnN0IHR5cGUgPSBvcHRpb25zPy50eXBlID8/IERFRkFVTFRfVFJBTlNQT1JUX1RZUEU7XG5cbiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudHlwZSA9PT0gJ29ic2lkaWFuLWNkcCcpIHtcbiAgICByZXR1cm4gY3JlYXRlQ2RwVHJhbnNwb3J0KG9wdGlvbnMpO1xuICB9XG5cbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5KHR5cGUpO1xuICByZXR1cm4gZmFjdG9yeS5jcmVhdGUob3B0aW9ucyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhY2hlZCB0cmFuc3BvcnQgaW5zdGFuY2UsIGNyZWF0aW5nIG9uZSBmcm9tIHRoZSBnaXZlbiBvcHRpb25zXG4gKiBpZiBub3QgYWxyZWFkeSBjYWNoZWQuXG4gKlxuICogVGhlIHRyYW5zcG9ydCBpcyBjYWNoZWQgcGVyIHdvcmtlciBwcm9jZXNzIHNvIFdlYlNvY2tldC9BcHBpdW0gc2Vzc2lvbnNcbiAqIGFyZSByZXVzZWQgYWNyb3NzIGNhbGxzIHdpdGhpbiB0aGUgc2FtZSB0ZXN0IHdvcmtlci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBDTEkgdHJhbnNwb3J0LlxuICogQHJldHVybnMgVGhlIGNhY2hlZCBvciBuZXdseSBjcmVhdGVkIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlVHJhbnNwb3J0KG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGlmIChjYWNoZWRUcmFuc3BvcnQpIHtcbiAgICByZXR1cm4gY2FjaGVkVHJhbnNwb3J0O1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzIC0tIFNpbmdsZS10aHJlYWRlZCB3b3JrZXI7IG5vIGNvbmN1cnJlbnQgd3JpdGVzLlxuICBjYWNoZWRUcmFuc3BvcnQgPSByZXN1bHQ7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZSBmb3IgYW4gZW11bGF0b3IgcHJvY2VzcyB0aGF0IGV4aXRlZCBkdXJpbmdcbiAqIHN0YXJ0dXAsIGFwcGVuZGluZyB0aGUgY2FwdHVyZWQgb3V0cHV0IHRhaWwgd2hlbiBhdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIGV4aXRJbmZvIC0gVGhlIGVtdWxhdG9yJ3MgZXhpdCBkZXRhaWxzLlxuICogQHBhcmFtIG91dHB1dCAtIFRoZSBjYXB0dXJlZCBzdGRvdXQrc3RkZXJyIHRhaWwuXG4gKiBAcmV0dXJucyBBIGh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkRW11bGF0b3JFeGl0TWVzc2FnZShleGl0SW5mbzogRW11bGF0b3JFeGl0SW5mbywgb3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWFzb24gPSBleGl0SW5mby5zaWduYWwgPT09IG51bGxcbiAgICA/IGBleGl0ZWQgcHJlbWF0dXJlbHkgd2l0aCBjb2RlICR7U3RyaW5nKGV4aXRJbmZvLmNvZGUpfWBcbiAgICA6IGB3YXMgdGVybWluYXRlZCBieSBzaWduYWwgJHtleGl0SW5mby5zaWduYWx9YDtcbiAgY29uc3QgdHJpbW1lZE91dHB1dCA9IG91dHB1dC50cmltKCk7XG4gIGNvbnN0IGRldGFpbHMgPSB0cmltbWVkT3V0cHV0Lmxlbmd0aCA+IDBcbiAgICA/IGBcXG5cXG5FbXVsYXRvciBvdXRwdXQgKHRhaWwpOlxcbiR7dHJpbW1lZE91dHB1dH1gXG4gICAgOiAnJztcbiAgcmV0dXJuIGBBbmRyb2lkIGVtdWxhdG9yICR7cmVhc29ufSBkdXJpbmcgc3RhcnR1cC4ke2RldGFpbHN9YDtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBwcm9hY3RpdmUgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgY2hlY2sgZm9yIGFuIGFzYXItc3dhcCBhbmQgYWN0c1xuICogb24gdGhlIHZlcmRpY3Q6IHRocm93cyB7QGxpbmsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yfSBmb3IgYW5cbiAqIGluc3RhbGxlciBiZWxvdyB0aGUgYXBwJ3MgcnVuIGZsb29yLCBhbmQgbG9ncyBhIHdhcm5pbmcgZm9yIGFcbiAqIHJ1bm5hYmxlLWJ1dC1iZWxvdy1yZWNvbW1lbmRlZCBpbnN0YWxsZXIuXG4gKlxuICogQHBhcmFtIGFwcFZlcnNpb24gLSBUaGUgYXBwIChhc2FyKSB2ZXJzaW9uIHRoYXQgd2lsbCBiZSBzd2FwcGVkIG9udG8gdGhlIHNoZWxsLFxuICogICBvciBgdW5kZWZpbmVkYCB3aGVuIG5vIGFzYXItc3dhcCB3aWxsIGhhcHBlbiAobm90aGluZyBpcyBjaGVja2VkIHRoZW4pLlxuICogQHBhcmFtIGluc3RhbGxlclZlcnNpb24gLSBUaGUgcmVzb2x2ZWQgaW5zdGFsbGVyL3NoZWxsIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgLlxuICogQHJldHVybnMgVGhlIHZlcmRpY3QsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm8gYXNhci1zd2FwIHRvIGNoZWNrLlxuICovXG5mdW5jdGlvbiBjaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHkoXG4gIGFwcFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgaW5zdGFsbGVyVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkIHtcbiAgaWYgKGFwcFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBjb21wYXRpYmlsaXR5ID0gY2hlY2tJbnN0YWxsZXJDb21wYXRpYmlsaXR5KHtcbiAgICBhcHBWZXJzaW9uLFxuICAgIGluc3RhbGxlclZlcnNpb24sXG4gICAgbWV0YWRhdGE6IGdldFZlcnNpb25NZXRhZGF0YShhcHBWZXJzaW9uKVxuICB9KTtcblxuICBpZiAoY29tcGF0aWJpbGl0eS50aWVyID09PSAndW5ydW5uYWJsZScpIHtcbiAgICB0aHJvdyBuZXcgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yKHtcbiAgICAgIGFwcFZlcnNpb246IGNvbXBhdGliaWxpdHkuYXBwVmVyc2lvbixcbiAgICAgIGluc3RhbGxlclZlcnNpb246IGVuc3VyZU5vbk51bGxhYmxlKGNvbXBhdGliaWxpdHkuaW5zdGFsbGVyVmVyc2lvbiksXG4gICAgICBtaW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb246IGVuc3VyZU5vbk51bGxhYmxlKGNvbXBhdGliaWxpdHkubWluUnVubmFibGVJbnN0YWxsZXJWZXJzaW9uKVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGNvbXBhdGliaWxpdHkudGllciA9PT0gJ25hZ2dlZCcpIHtcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdICR7ZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5tZXNzYWdlKX1gKTtcbiAgfVxuXG4gIHJldHVybiBjb21wYXRpYmlsaXR5O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkZXNrdG9wIENEUCB0cmFuc3BvcnQuIFdoZW4gYW4gZXhwbGljaXQgYHBvcnRgIGlzIGdpdmVuIHRoZVxuICogdHJhbnNwb3J0IGF0dGFjaGVzIHRvIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiBvbiB0aGF0IHBvcnQ7IG90aGVyd2lzZSBpdFxuICogbGF1bmNoZXMgYW5kIG93bnMgYW4gaXNvbGF0ZWQgaW5zdGFuY2UgKHRoZSBkZWZhdWx0LCBoZXJtZXRpYyBtb2RlKS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENEUCB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgY29uZmlndXJlZCBDRFAgdHJhbnNwb3J0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVDZHBUcmFuc3BvcnQob3B0aW9ucz86IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKG9wdGlvbnM/LnBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG93bmVkU3VmZml4ID0gb3B0aW9ucy5pc0hhcm5lc3NPd25lZEluc3RhbmNlID8gJyAoaGFybmVzcy1vd25lZCknIDogJyc7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6b2JzaWRpYW4tY2RwXSBBdHRhY2hpbmcgdG8gcnVubmluZyBPYnNpZGlhbiR7b3duZWRTdWZmaXh9IChob3N0PSR7b3B0aW9ucy5ob3N0ID8/ICdsb2NhbGhvc3QnfSwgcG9ydD0ke1N0cmluZyhvcHRpb25zLnBvcnQpfSlgKTtcbiAgICByZXR1cm4gbmV3IERlc2t0b3BDZHBUcmFuc3BvcnQoe1xuICAgICAgLi4uKG9wdGlvbnMuaG9zdCAhPT0gdW5kZWZpbmVkICYmIHsgY2RwSG9zdDogb3B0aW9ucy5ob3N0IH0pLFxuICAgICAgY2RwUG9ydDogb3B0aW9ucy5wb3J0LFxuICAgICAgLi4uKG9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzIH0pLFxuICAgICAgLi4uKG9wdGlvbnMuaXNIYXJuZXNzT3duZWRJbnN0YW5jZSAhPT0gdW5kZWZpbmVkICYmIHsgaXNIYXJuZXNzT3duZWRJbnN0YW5jZTogb3B0aW9ucy5pc0hhcm5lc3NPd25lZEluc3RhbmNlIH0pXG4gICAgfSk7XG4gIH1cblxuICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdIENyZWF0aW5nIG93bmVkIGlzb2xhdGVkIE9ic2lkaWFuIGluc3RhbmNlJyk7XG4gIGNvbnN0IG93bmVkSW5zdGFuY2UgPSBhd2FpdCByZXNvbHZlT3duZWRJbnN0YW5jZUNvbmZpZyhvcHRpb25zKTtcbiAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KHtcbiAgICAuLi4ob3B0aW9ucz8uaG9zdCAhPT0gdW5kZWZpbmVkICYmIHsgY2RwSG9zdDogb3B0aW9ucy5ob3N0IH0pLFxuICAgIC4uLihvcHRpb25zPy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSksXG4gICAgZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzOiByZXNvbHZlRGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgIC4uLihvcHRpb25zPy5pc09ic2lkaWFuQXBwVmlzaWJsZSAhPT0gdW5kZWZpbmVkICYmIHsgaXNPYnNpZGlhbkFwcFZpc2libGU6IG9wdGlvbnMuaXNPYnNpZGlhbkFwcFZpc2libGUgfSksXG4gICAgb3duZWRJbnN0YW5jZSxcbiAgICAuLi4ob3B0aW9ucz8uc2hvdWxkRGlzYWJsZVNhbmRib3ggIT09IHVuZGVmaW5lZCAmJiB7IHNob3VsZERpc2FibGVTYW5kYm94OiBvcHRpb25zLnNob3VsZERpc2FibGVTYW5kYm94IH0pXG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmcmVzaCwgaXNvbGF0ZWQgdXNlci1kYXRhIGRpcmVjdG9yeSBmb3IgYW4gb3duZWQgaW5zdGFuY2UuXG4gKlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIG5ldyBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU93bmVkVXNlckRhdGFEaXIoKTogc3RyaW5nIHtcbiAgY29uc3Qgcm9vdCA9IGpvaW4odG1wZGlyKCksICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJyk7XG4gIG1rZGlyU3luYyhyb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgcmV0dXJuIG1rZHRlbXBTeW5jKGpvaW4ocm9vdCwgT1dORURfVVNFUl9EQVRBX1BSRUZJWCkpO1xufVxuXG4vKipcbiAqIERlY2lkZXMgaG93IHRoZSByZXF1ZXN0ZWQgYXBwIChhc2FyKSB2ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCB0byBhbiBvd25lZFxuICogaW5zdGFuY2UsIHdpdGhvdXQgZG93bmxvYWRpbmcgYW55dGhpbmcgeWV0OiBhbiB1cGdyYWRlLW9ubHkgYXNhci1zd2FwIG9udG8gdGhlXG4gKiBzaGVsbCwgYSBkb3duZ3JhZGUgdG8gdGhlIGFwcCdzIG93biBpbnN0YWxsZXIgc2hlbGwsIG9yIHRoZSB1c2VyJ3MgbmV3ZXN0XG4gKiBpbnN0YWxsZWQgYXNhciB3aGVuIG5laXRoZXIgdmVyc2lvbiBpcyBwaW5uZWQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDRFAgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcGFyYW0gc2hlbGxWZXJzaW9uIC0gVGhlIHJlc29sdmVkIGluc3RhbGxlci9zaGVsbCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYC5cbiAqIEByZXR1cm5zIFRoZSBhc2FyIHBsYW4gKGF0IG1vc3Qgb25lIG9mIGl0cyBmaWVsZHMgaXMgc2V0KS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUFzYXJQbGFuKFxuICBvcHRpb25zOiBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPEFzYXJQbGFuPiB7XG4gIGlmIChvcHRpb25zPy5vYnNpZGlhblZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGFzYXJWZXJzaW9uID0gYXdhaXQgcmVzb2x2ZUNvbmNyZXRlVmVyc2lvbihvcHRpb25zLm9ic2lkaWFuVmVyc2lvbik7XG4gICAgaWYgKHNoZWxsVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIGNvbXBhcmVWZXJzaW9ucyhhc2FyVmVyc2lvbiwgc2hlbGxWZXJzaW9uKSA+PSAwKSB7XG4gICAgICByZXR1cm4geyBhc2FyVmVyc2lvblRvU3dhcDogYXNhclZlcnNpb24gfTtcbiAgICB9XG5cbiAgICAvLyBBc2FyLXN3YXAgaXMgdXBncmFkZS1vbmx5LCBzbyBpdCBjYW5ub3QgYXBwbHkgYSB2ZXJzaW9uIG9sZGVyIHRoYW4gdGhlXG4gICAgLy8gU2hlbGwncyBidW5kbGVkIG9uZSBcdTIwMTQgYW5kIHdoZW4gdGhlIHNoZWxsIHZlcnNpb24gaXMgdW5rbm93biAoYSBMaW51eFxuICAgIC8vIFBhdGgtcGFyc2UgbWlzcykgd2UgY2Fubm90IHByb3ZlIHRoZSBzd2FwIHdvdWxkIGFwcGx5IGF0IGFsbC4gSW4gYm90aFxuICAgIC8vIENhc2VzIHVzZSB0aGUgcmVxdWVzdGVkIHZlcnNpb24ncyBvd24gaW5zdGFsbGVyIHNoZWxsLCB3aG9zZSBidW5kbGVkIGFzYXJcbiAgICAvLyBJcyBleGFjdGx5IHRoaXMgdmVyc2lvbiwgc28gdGhlIHBpbiBpcyBhbHdheXMgaG9ub3JlZC5cbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdIFVzaW5nIHRoZSAke2FzYXJWZXJzaW9ufSBpbnN0YWxsZXIgc2hlbGwgKHNoZWxsIHZlcnNpb24gJHtzaGVsbFZlcnNpb24gPz8gJ3Vua25vd24nfTsgYXNhci1zd2FwIGlzIHVwZ3JhZGUtb25seSkuYCk7XG4gICAgcmV0dXJuIHsgZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbjogYXNhclZlcnNpb24gfTtcbiAgfVxuXG4gIGlmIChvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG5ld2VzdCA9IGZpbmROZXdlc3RBc2FyKGdldE9ic2lkaWFuQ29uZmlnRGlyKCkpO1xuICAgIGlmIChuZXdlc3QgJiYgKHNoZWxsVmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8IGNvbXBhcmVWZXJzaW9ucyhuZXdlc3QudmVyc2lvbiwgc2hlbGxWZXJzaW9uKSA+PSAwKSkge1xuICAgICAgcmV0dXJuIHsgYXNhcjogeyBwYXRoOiBuZXdlc3QucGF0aCwgdmVyc2lvbjogbmV3ZXN0LnZlcnNpb24gfSB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7fTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgbG9jYWxseS1pbnN0YWxsZWQgT2JzaWRpYW4gc2hlbGwsIHRvbGVyYXRpbmcgaXRzIGFic2VuY2UuXG4gKlxuICogVW5saWtlIHtAbGluayByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlfSAod2hpY2ggdGhyb3dzIHdoZW4gT2JzaWRpYW4gaXMgbm90XG4gKiBpbnN0YWxsZWQpLCB0aGlzIHJldHVybnMgYHVuZGVmaW5lZGAgaW4gdGhhdCBjYXNlLCBzbyBhIGNhbGxlciBwaW5uaW5nIGFuXG4gKiBpbnN0YWxsZXIgdmVyc2lvbiBjYW4gZmFsbCBiYWNrIHRvIGRvd25sb2FkaW5nIHRoZSBwaW5uZWQgc2hlbGwgaW5zdGVhZCBvZlxuICogZmFpbGluZyBvbiBhIGhvc3Qgd2l0aCBubyBPYnNpZGlhbiBpbnN0YWxsZWQgKGUuZy4gQ0kpLlxuICpcbiAqIEByZXR1cm5zIFRoZSBpbnN0YWxsZWQgc2hlbGwncyBwYXRoIGFuZCBkZXRlY3RlZCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuXG4gKiAgIG5vIE9ic2lkaWFuIGlzIGluc3RhbGxlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUluc3RhbGxlZFNoZWxsT3JOdWxsKCk6IFByb21pc2U8SW5zdGFsbGVkU2hlbGwgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBleGVQYXRoID0gYXdhaXQgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZSgpO1xuICAgIHJldHVybiB7IGV4ZVBhdGgsIHNoZWxsVmVyc2lvbjogZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uKGV4ZVBhdGgpIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgc2hlbGwgZXhlY3V0YWJsZSwgYXNhciBwcm92aXNpb25pbmcsIGFuZCBpc29sYXRlZCB1c2VyLWRhdGEgZGlyXG4gKiBmb3IgYSBoYXJuZXNzLW93bmVkIGluc3RhbmNlIGZyb20gdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIGtub2JzLlxuICpcbiAqIC0gYG9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbmAgcGlucyB0aGUgRWxlY3Ryb24gc2hlbGwgKGRvd25sb2FkcyArIGV4dHJhY3RzIGFcbiAqICAgcG9ydGFibGUgYnVpbGQgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhlIGluc3RhbGxlZCBzaGVsbCkuXG4gKiAtIGBvYnNpZGlhblZlcnNpb25gIHBpbnMgdGhlIGFwcDogYW4gYXNhci1zd2FwIHdoZW4gaXQgaXMgPj0gdGhlIHNoZWxsIHZlcnNpb25cbiAqICAgKGNoZWFwKSwgb3RoZXJ3aXNlIHRoZSBtYXRjaGluZyBpbnN0YWxsZXIgc2hlbGwgaXMgdXNlZCAoZG93bmdyYWRlKS5cbiAqIC0gV2hlbiBuZWl0aGVyIGlzIHNldCwgdGhlIHVzZXIncyBuZXdlc3QgaW5zdGFsbGVkIGFzYXIgaXMgY29waWVkIGluIChzbyB0aGVcbiAqICAgb3duZWQgaW5zdGFuY2UgbWF0Y2hlcyB0aGUgdmVyc2lvbiB0aGUgdXNlciBjdXJyZW50bHkgcnVucykgd2l0aCB6ZXJvIG5ldHdvcmsuXG4gKlxuICogVGhlIGNvbmNyZXRlIChhcHAsIGluc3RhbGxlcikgdmVyc2lvbiBwYWlyIGlzIHJlc29sdmVkICpiZWZvcmUqIGFueSBzaGVsbC9hc2FyXG4gKiBkb3dubG9hZCwgc28gYSBwcm9hY3RpdmUgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgY2hlY2tcbiAqICh7QGxpbmsgY2hlY2tJbnN0YWxsZXJDb21wYXRpYmlsaXR5fSkgY2FuIGZhaWwgZmFzdDogYW4gaW5zdGFsbGVyIGJlbG93IHRoZVxuICogYXBwJ3MgcnVuIGZsb29yIHRocm93cyB7QGxpbmsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yfSBiZWZvcmVcbiAqIGFueXRoaW5nIGlzIGRvd25sb2FkZWQgb3IgbGF1bmNoZWQgKHN1cGVyc2VkaW5nIHRoZSByZWFjdGl2ZSBkZWFkLWJvb3RcbiAqIGZhc3QtZmFpbCBmb3IgdGFibGUta25vd24gY29tYm9zKSwgYW5kIGEgcnVubmFibGUtYnV0LWJlbG93LXJlY29tbWVuZGVkXG4gKiBpbnN0YWxsZXIgbG9ncyBhIHdhcm5pbmcuIFRoZSB2ZXJkaWN0IGlzIHRocmVhZGVkIG9udG8gdGhlIHJldHVybmVkIGNvbmZpZyBzb1xuICogdGhlIHRyYW5zcG9ydCBjYW4gc3VyZmFjZSBpdCBhcyBkYXRhLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ0RQIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIG93bmVkLWluc3RhbmNlIGNvbmZpZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU93bmVkSW5zdGFuY2VDb25maWcob3B0aW9ucz86IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T3duZWRJbnN0YW5jZUNvbmZpZz4ge1xuICAvLyBSZXNvbHZlIHRoZSBjb25jcmV0ZSBzaGVsbCAoaW5zdGFsbGVyKSB2ZXJzaW9uIGZpcnN0LCBidXQgZm9yIGEgcGlubmVkXG4gIC8vIEluc3RhbGxlciBERUZFUiByZXNvbHZpbmcvZG93bmxvYWRpbmcgdGhlIGFjdHVhbCBzaGVsbCB1bnRpbCBhZnRlciB0aGVcbiAgLy8gUHJvYWN0aXZlIGNvbXBhdGliaWxpdHkgY2hlY2ssIHNvIGFuIHVucnVubmFibGUgcGluIGZhaWxzIGZhc3QgXHUyMDE0IGJlZm9yZSB0aGVcbiAgLy8gKHBvc3NpYmx5IHNsb3cpIGluc3RhbGxlZC1zaGVsbCBkZXRlY3Rpb24gYW5kIGFueSBkb3dubG9hZC5cbiAgbGV0IGV4ZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgcGlubmVkSW5zdGFsbGVyVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZVBhdGggPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlKCk7XG4gICAgc2hlbGxWZXJzaW9uID0gZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uKGV4ZVBhdGgpO1xuICB9IGVsc2Uge1xuICAgIC8vIEEgcGlubmVkIGluc3RhbGxlciB2ZXJzaW9uIGZ1bGx5IGRldGVybWluZXMgdGhlIHNoZWxsIHZlcnNpb24gdXAgZnJvbnQsXG4gICAgLy8gV2l0aG91dCByZXF1aXJpbmcgYSBsb2NhbGx5LWluc3RhbGxlZCBPYnNpZGlhbiAoYSBDSSBydW5uZXIgaGFzIG5vbmUpLlxuICAgIHBpbm5lZEluc3RhbGxlclZlcnNpb24gPSBhd2FpdCByZXNvbHZlQ29uY3JldGVWZXJzaW9uKG9wdGlvbnMub2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uKTtcbiAgICBzaGVsbFZlcnNpb24gPSBwaW5uZWRJbnN0YWxsZXJWZXJzaW9uO1xuICB9XG5cbiAgLy8gRGVjaWRlIGhvdyB0aGUgYXBwIChhc2FyKSB2ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCwgc3RpbGwgV0lUSE9VVCBkb3dubG9hZGluZy5cbiAgY29uc3QgcGxhbiA9IGF3YWl0IHJlc29sdmVBc2FyUGxhbihvcHRpb25zLCBzaGVsbFZlcnNpb24pO1xuXG4gIC8vIFRoZSBhcHAgdmVyc2lvbiB0aGF0IHdpbGwgcnVuIGFzIGFuIGFzYXItc3dhcCBvbnRvIGBzaGVsbFZlcnNpb25gIFx1MjAxNCB0aGUgb25seVxuICAvLyBDb21iaW5hdGlvbiB0aGF0IGNhbiBkZWFkLWJvb3QuIFRoZSBkb3duZ3JhZGUgLyBvd24taW5zdGFsbGVyIHBhdGhzIHJ1biB0aGVcbiAgLy8gQXBwJ3Mgb3duIGluc3RhbGxlciBzaGVsbCwgc28gdGhleSBhbHdheXMgYm9vdCBhbmQgYXJlIG5vdCBjaGVja2VkLlxuICBjb25zdCBzd2FwQXBwVmVyc2lvbiA9IHBsYW4uYXNhclZlcnNpb25Ub1N3YXAgPz8gcGxhbi5hc2FyPy52ZXJzaW9uO1xuICBjb25zdCBjb21wYXRpYmlsaXR5ID0gY2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5KHN3YXBBcHBWZXJzaW9uLCBzaGVsbFZlcnNpb24pO1xuXG4gIC8vIFRoZSBwaW4gaXMga25vd24gcnVubmFibGUgXHUyMDE0IHJlc29sdmUvZG93bmxvYWQgdGhlIGRlZmVycmVkIHNoZWxsICsgYXNhciBub3cuXG4gIC8vIFJldXNlIHRoZSBpbnN0YWxsZWQgc2hlbGwgb25seSB3aGVuIGl0IGFscmVhZHkgbWF0Y2hlcyB0aGUgcGluIChzYXZlcyB0aGVcbiAgLy8gRG93bmxvYWQpOyBvdGhlcndpc2UgZG93bmxvYWQgYW5kIGV4dHJhY3QgdGhlIHBpbm5lZCBpbnN0YWxsZXIuXG4gIGlmIChwaW5uZWRJbnN0YWxsZXJWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBpbnN0YWxsZWQgPSBhd2FpdCByZXNvbHZlSW5zdGFsbGVkU2hlbGxPck51bGwoKTtcbiAgICBleGVQYXRoID0gaW5zdGFsbGVkPy5zaGVsbFZlcnNpb24gPT09IHBpbm5lZEluc3RhbGxlclZlcnNpb24gPyBpbnN0YWxsZWQuZXhlUGF0aCA6IGF3YWl0IGVuc3VyZVNoZWxsQ2FjaGVkKHBpbm5lZEluc3RhbGxlclZlcnNpb24pO1xuICB9XG4gIGlmIChwbGFuLmRvd25ncmFkZUluc3RhbGxlclZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZVBhdGggPSBhd2FpdCBlbnN1cmVTaGVsbENhY2hlZChwbGFuLmRvd25ncmFkZUluc3RhbGxlclZlcnNpb24pO1xuICB9XG5cbiAgY29uc3QgYXNhciA9IHBsYW4uYXNhclZlcnNpb25Ub1N3YXAgPT09IHVuZGVmaW5lZFxuICAgID8gcGxhbi5hc2FyXG4gICAgOiB7IHBhdGg6IGF3YWl0IGVuc3VyZUFzYXJDYWNoZWQocGxhbi5hc2FyVmVyc2lvblRvU3dhcCksIHZlcnNpb246IHBsYW4uYXNhclZlcnNpb25Ub1N3YXAgfTtcblxuICByZXR1cm4ge1xuICAgIC4uLihhc2FyICYmIHsgYXNhciB9KSxcbiAgICAuLi4oY29tcGF0aWJpbGl0eSAmJiB7IGNvbXBhdGliaWxpdHkgfSksXG4gICAgZXhlUGF0aDogZW5zdXJlTm9uTnVsbGFibGUoZXhlUGF0aCksXG4gICAgdXNlckRhdGFEaXI6IGNyZWF0ZU93bmVkVXNlckRhdGFEaXIoKVxuICB9O1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYENvbm5lY3Rpb25gIGFuZCBgQ29udGVudC1MZW5ndGhgIGZyb20gYSBXZWJEcml2ZXIgcmVxdWVzdCdzIGhlYWRlcnMuXG4gKlxuICogVGhlIGJ1bmRsZWQgYHdlYmRyaXZlcmAgcGFja2FnZSBzZXRzIGJvdGggaGVhZGVycyBleHBsaWNpdGx5LiBUaGV5IGFyZVxuICogZm9yYmlkZGVuIHJlcXVlc3QgaGVhZGVycyBwZXIgdGhlIEZldGNoIHNwZWM6IE5vZGUgdXAgdG8gMjUgYWNjZXB0ZWQgdGhlbVxuICogc2lsZW50bHksIGJ1dCBOb2RlIDI2IHJlamVjdHMgdGhlbSB3aXRoIGBVTkRfRVJSX0lOVkFMSURfQVJHYCwgYnJlYWtpbmcgdGhlXG4gKiBBcHBpdW0gYC9zZXNzaW9uYCByZXF1ZXN0LiBUaGUgdHJhbnNwb3J0IGxheWVyIG1hbmFnZXMgY29ubmVjdGlvbiByZXVzZSBhbmRcbiAqIHRoZSBGZXRjaCBBUEkgY29tcHV0ZXMgYENvbnRlbnQtTGVuZ3RoYCBmcm9tIHRoZSBib2R5LCBzbyBkcm9wcGluZyBib3RoIGlzXG4gKiBzYWZlIG9uIGV2ZXJ5IE5vZGUgdmVyc2lvbi4gU2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vd2ViZHJpdmVyaW8vd2ViZHJpdmVyaW8vaXNzdWVzLzE1MjY1fS5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdE9wdGlvbnMgLSBUaGUgcmVxdWVzdCBvcHRpb25zIGFib3V0IHRvIGJlIHNlbnQgYnkgV2ViRHJpdmVySU8uXG4gKiBAcmV0dXJucyBUaGUgc2FtZSByZXF1ZXN0IG9wdGlvbnMgd2l0aCB0aGUgZm9yYmlkZGVuIGhlYWRlcnMgcmVtb3ZlZC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBGb3JiaWRkZW5GZXRjaEhlYWRlcnMocmVxdWVzdE9wdGlvbnM6IFJlcXVlc3RJbml0KTogUmVxdWVzdEluaXQge1xuICBpZiAocmVxdWVzdE9wdGlvbnMuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICByZXF1ZXN0T3B0aW9ucy5oZWFkZXJzLmRlbGV0ZSgnQ29ubmVjdGlvbicpO1xuICAgIHJlcXVlc3RPcHRpb25zLmhlYWRlcnMuZGVsZXRlKCdDb250ZW50LUxlbmd0aCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlcXVlc3RPcHRpb25zO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBVUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLE9B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QVk7QUFBQSxFQUNsRDtBQUVBLE1BQUksU0FBUyw2QkFBNkIsUUFBVztBQUNuRCxVQUFNLFNBQVMsZUFBZSxxQkFBcUIsQ0FBQztBQUNwRCxRQUFJLFdBQVcsaUJBQWlCLFVBQWEsZ0JBQWdCLE9BQU8sU0FBUyxZQUFZLEtBQUssSUFBSTtBQUNoRyxhQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sT0FBTyxNQUFNLFNBQVMsT0FBTyxRQUFRLEVBQUU7QUFBQSxJQUNoRTtBQUFBLEVBQ0Y7QUFFQSxTQUFPLENBQUM7QUFDVjtBQWFBLGVBQWUsOEJBQW1FO0FBQ2hGLE1BQUk7QUFDRixVQUFNLFVBQVUsTUFBTSwwQkFBMEI7QUFDaEQsV0FBTyxFQUFFLFNBQVMsY0FBYyw0QkFBNEIsT0FBTyxFQUFFO0FBQUEsRUFDdkUsUUFBUTtBQUNOLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUF5QkEsZUFBZSwyQkFBMkIsU0FBcUU7QUFLN0csTUFBSTtBQUNKLE1BQUk7QUFDSixNQUFJO0FBRUosTUFBSSxTQUFTLDZCQUE2QixRQUFXO0FBQ25ELGNBQVUsTUFBTSwwQkFBMEI7QUFDMUMsbUJBQWUsNEJBQTRCLE9BQU87QUFBQSxFQUNwRCxPQUFPO0FBR0wsNkJBQXlCLE1BQU0sdUJBQXVCLFFBQVEsd0JBQXdCO0FBQ3RGLG1CQUFlO0FBQUEsRUFDakI7QUFHQSxRQUFNLE9BQU8sTUFBTSxnQkFBZ0IsU0FBUyxZQUFZO0FBS3hELFFBQU0saUJBQWlCLEtBQUsscUJBQXFCLEtBQUssTUFBTTtBQUM1RCxRQUFNLGdCQUFnQiw0QkFBNEIsZ0JBQWdCLFlBQVk7QUFLOUUsTUFBSSwyQkFBMkIsUUFBVztBQUN4QyxVQUFNLFlBQVksTUFBTSw0QkFBNEI7QUFDcEQsY0FBVSxXQUFXLGlCQUFpQix5QkFBeUIsVUFBVSxVQUFVLE1BQU0sa0JBQWtCLHNCQUFzQjtBQUFBLEVBQ25JO0FBQ0EsTUFBSSxLQUFLLDhCQUE4QixRQUFXO0FBQ2hELGNBQVUsTUFBTSxrQkFBa0IsS0FBSyx5QkFBeUI7QUFBQSxFQUNsRTtBQUVBLFFBQU0sT0FBTyxLQUFLLHNCQUFzQixTQUNwQyxLQUFLLE9BQ0wsRUFBRSxNQUFNLE1BQU0saUJBQWlCLEtBQUssaUJBQWlCLEdBQUcsU0FBUyxLQUFLLGtCQUFrQjtBQUU1RixTQUFPO0FBQUEsSUFDTCxHQUFJLFFBQVEsRUFBRSxLQUFLO0FBQUEsSUFDbkIsR0FBSSxpQkFBaUIsRUFBRSxjQUFjO0FBQUEsSUFDckMsU0FBUyxrQkFBa0IsT0FBTztBQUFBLElBQ2xDLGFBQWEsdUJBQXVCO0FBQUEsRUFDdEM7QUFDRjtBQWVBLFNBQVMsMkJBQTJCLGdCQUEwQztBQUM1RSxNQUFJLGVBQWUsbUJBQW1CLFNBQVM7QUFDN0MsbUJBQWUsUUFBUSxPQUFPLFlBQVk7QUFDMUMsbUJBQWUsUUFBUSxPQUFPLGdCQUFnQjtBQUFBLEVBQ2hEO0FBRUEsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogWyJraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMiXQp9Cg==
739
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHtcbiAgYXR0YWNoLFxuICByZW1vdGVcbn0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IE93bmVkSW5zdGFuY2VDb25maWcgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHtcbiAgcmVzb2x2ZUFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzLFxuICByZXNvbHZlU2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xufSBmcm9tICcuL2FwcGl1bS1zZXNzaW9uLWNvbmZpZy5tanMnO1xuaW1wb3J0IHtcbiAgY2hlY2tEZXZpY2VJZGxlLFxuICByZXNvbHZlRGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xufSBmcm9tICcuL2RldmljZS1yZWFkaW5lc3MubWpzJztcbmltcG9ydCB7IGJ1aWxkRW11bGF0b3JBcmdzIH0gZnJvbSAnLi9lbXVsYXRvci1hcmdzLm1qcyc7XG5pbXBvcnQgeyBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3IgfSBmcm9tICcuL2luY29tcGF0aWJsZS1pbnN0YWxsZXItdmVyc2lvbi1lcnJvci5tanMnO1xuaW1wb3J0IHsgY2hlY2tJbnN0YWxsZXJDb21wYXRpYmlsaXR5IH0gZnJvbSAnLi9pbnN0YWxsZXItY29tcGF0aWJpbGl0eS5tanMnO1xuaW1wb3J0IHsga2lsbFByb2Nlc3NUcmVlIH0gZnJvbSAnLi9raWxsLXByb2Nlc3MtdHJlZS5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuQ29uZmlnRGlyIH0gZnJvbSAnLi9vYnNpZGlhbi1jb25maWcubWpzJztcbmltcG9ydCB7IHJlc29sdmVPYnNpZGlhbkV4ZWN1dGFibGUgfSBmcm9tICcuL29ic2lkaWFuLWV4ZWN1dGFibGUubWpzJztcbmltcG9ydCB7XG4gIGRldGVjdEluc3RhbGxlZFNoZWxsVmVyc2lvbixcbiAgZW5zdXJlU2hlbGxDYWNoZWRcbn0gZnJvbSAnLi9vYnNpZGlhbi1pbnN0YWxsZXIubWpzJztcbmltcG9ydCB7IGdldFZlcnNpb25NZXRhZGF0YSB9IGZyb20gJy4vb2JzaWRpYW4tbWV0YWRhdGEubWpzJztcbmltcG9ydCB7XG4gIGVuc3VyZUFzYXJDYWNoZWQsXG4gIGZpbmROZXdlc3RBc2FyLFxuICByZXNvbHZlQ29uY3JldGVWZXJzaW9uXG59IGZyb20gJy4vb2JzaWRpYW4tdmVyc2lvbi1zd2l0Y2gubWpzJztcbmltcG9ydCB7IGNvbXBhcmVWZXJzaW9ucyB9IGZyb20gJy4vb2JzaWRpYW4tdmVyc2lvbi5tanMnO1xuaW1wb3J0IHsgcmVzb2x2ZURlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcyB9IGZyb20gJy4vcmVuZGVyZXItYm9vdC1kZXRlY3Rpb24ubWpzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4vdHlwZS1ndWFyZHMubWpzJztcbmltcG9ydCB7XG4gIHNob3VsZEhpZGVBcHBpdW1Db25zb2xlLFxuICBzaG91bGRIaWRlRW11bGF0b3JXaW5kb3dcbn0gZnJvbSAnLi92aXNpYmlsaXR5Lm1qcyc7XG5cbmNvbnN0IEFQUF9QQUNLQUdFID0gJ21kLm9ic2lkaWFuJztcbmNvbnN0IEFQUF9BQ1RJVklUWSA9IGAke0FQUF9QQUNLQUdFfS5NYWluQWN0aXZpdHlgO1xuY29uc3QgQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCA9IDM7XG5jb25zdCBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IE9XTkVEX1VTRVJfREFUQV9QUkVGSVggPSAndXNlcmRhdGEtJztcbi8vIEFwcGl1bSBpbnNlY3VyZSBmZWF0dXJlIGxldHRpbmcgdGhlIFVpQXV0b21hdG9yMiBkcml2ZXIgYXV0by1kb3dubG9hZCBhXG4vLyBDaHJvbWVkcml2ZXIgbWF0Y2hpbmcgT2JzaWRpYW4ncyBXZWJWaWV3IENocm9tZSB2ZXJzaW9uLiBFbmFibGluZyBpdCBvbiB0aGVcbi8vIEFwcGl1bSBzZXJ2ZXIgKGl0IGhhcyBubyBlZmZlY3QgYXMgYSBjYXBhYmlsaXR5KSBhdm9pZHMgdGhlIGZhaWx1cmVcbi8vIFwiTm8gQ2hyb21lZHJpdmVyIGZvdW5kIHRoYXQgY2FuIGF1dG9tYXRlIENocm9tZSAuLi5cIi5cbmNvbnN0IENIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRSA9ICd1aWF1dG9tYXRvcjI6Y2hyb21lZHJpdmVyX2F1dG9kb3dubG9hZCc7XG5jb25zdCBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuY29uc3QgREVGQVVMVF9UUkFOU1BPUlRfVFlQRSA9ICdvYnNpZGlhbi1jZHAnO1xuY29uc3QgREVWSUNFX0lETEVfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgRU1VTEFUT1JfT1VUUFVUX1RBSUxfTUFYX0xFTkdUSCA9IDgwMDA7XG5jb25zdCBLRVlDT0RFX01FTlUgPSA4MjtcbmNvbnN0IEtFWUNPREVfV0FLRVVQID0gMjI0O1xuY29uc3QgU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjAwMDA7XG5jb25zdCBTRVJWRVJfTEFVTkNIX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuXG4vKipcbiAqIEhvdyB0aGUgcmVxdWVzdGVkIGFwcCAoYXNhcikgdmVyc2lvbiB3aWxsIGJlIGFwcGxpZWQgdG8gYW4gb3duZWQgaW5zdGFuY2U7IGF0XG4gKiBtb3N0IG9uZSBmaWVsZCBpcyBzZXQgKHNlZSB7QGxpbmsgcmVzb2x2ZUFzYXJQbGFufSkuXG4gKi9cbmludGVyZmFjZSBBc2FyUGxhbiB7XG4gIC8qKiBUaGUgdXNlcidzIG5ld2VzdCBpbnN0YWxsZWQgYXNhciB0byBwcm92aXNpb24gYXMtaXMgKG5vIGRvd25sb2FkKS4gKi9cbiAgcmVhZG9ubHkgYXNhcj86IE93bmVkSW5zdGFuY2VDb25maWdbJ2FzYXInXTtcblxuICAvKiogVGhlIGFwcCB2ZXJzaW9uIHRvIGRvd25sb2FkIGFuZCBhc2FyLXN3YXAgb250byB0aGUgc2hlbGwuICovXG4gIHJlYWRvbmx5IGFzYXJWZXJzaW9uVG9Td2FwPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBUaGUgYXBwIHZlcnNpb24gd2hvc2Ugb3duIGluc3RhbGxlciBzaGVsbCB0byBkb3dubG9hZCAoYSBkb3duZ3JhZGUpLiAqL1xuICByZWFkb25seSBkb3duZ3JhZGVJbnN0YWxsZXJWZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIERldGFpbHMgb2YgYW4gZW11bGF0b3IgcHJvY2VzcyB0aGF0IGhhcyBleGl0ZWQuXG4gKi9cbmludGVyZmFjZSBFbXVsYXRvckV4aXRJbmZvIHtcbiAgLyoqIEV4aXQgY29kZSwgb3IgYG51bGxgIGlmIHRoZSBwcm9jZXNzIHdhcyB0ZXJtaW5hdGVkIGJ5IGEgc2lnbmFsLiAqL1xuICBjb2RlOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKiBUZXJtaW5hdGluZyBzaWduYWwsIG9yIGBudWxsYCBpZiB0aGUgcHJvY2VzcyBleGl0ZWQgbm9ybWFsbHkuICovXG4gIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsO1xufVxuXG4vKipcbiAqIEEgc3Bhd25lZCBlbXVsYXRvciBwcm9jZXNzIHRvZ2V0aGVyIHdpdGggaGVscGVycyB0byBpbnNwZWN0IGl0cyBjYXB0dXJlZFxuICogb3V0cHV0IGFuZCBleGl0IHN0YXR1cy5cbiAqL1xuaW50ZXJmYWNlIEVtdWxhdG9yTGF1bmNoIHtcbiAgLyoqIFRoZSBzcGF3bmVkIGVtdWxhdG9yIHByb2Nlc3MuICovXG4gIHByb2Nlc3M6IENoaWxkUHJvY2VzcztcblxuICAvKiogUmV0dXJucyB0aGUgZXhpdCBkZXRhaWxzIG9uY2UgdGhlIHByb2Nlc3MgaGFzIGV4aXRlZCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLiAqL1xuICByZWFkRXhpdEluZm86ICgpID0+IEVtdWxhdG9yRXhpdEluZm8gfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFJldHVybnMgdGhlIGNhcHR1cmVkIHN0ZG91dCtzdGRlcnIgKGJvdW5kZWQgdG8gdGhlIG1vc3QgcmVjZW50IG91dHB1dCkuICovXG4gIHJlYWRPdXRwdXQ6ICgpID0+IHN0cmluZztcblxuICAvKiogU3RvcHMgYWNjdW11bGF0aW5nIG91dHB1dC4gQ2FsbCBvbmNlIHN0YXJ0dXAgaGFzIHN1Y2NlZWRlZC4gKi9cbiAgc3RvcENhcHR1cmU6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkuZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyB7XG4gIC8qKiBBVkQgbmFtZSB0byBjb25uZWN0IHRvIChzdGFydGluZyBhIG5ldyBlbXVsYXRvciBpZiBub3QgYWxyZWFkeSBydW5uaW5nKS4gKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKiBSZXNvbHZlZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIHBvc3QtYm9vdCBkZXZpY2UtaWRsZSB3YWl0IChgMGAgc2tpcHMgaXQpLiAqL1xuICByZWFkb25seSBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuICovXG4gIHJlYWRvbmx5IGlzRW11bGF0b3JWaXNpYmxlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Yge0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkuZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdCB7XG4gIC8qKiBUaGUgYWN0dWFsIGRldmljZSBJRCB0aGF0IGlzIGNvbm5lY3RlZCAobWF5IGRpZmZlciBmcm9tIHRoZSByZXF1ZXN0ZWQgb25lKS4gKi9cbiAgcmVhZG9ubHkgYWN0dWFsRGV2aWNlSWQ6IHN0cmluZztcblxuICAvKiogVGhlIGVtdWxhdG9yIHByb2Nlc3MsIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLiAqL1xuICByZWFkb25seSBlbXVsYXRvclByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIGxvY2FsbHktaW5zdGFsbGVkIE9ic2lkaWFuIHNoZWxsIHJlc29sdmVkIGJ5IHtAbGluayByZXNvbHZlSW5zdGFsbGVkU2hlbGxPck51bGx9LlxuICovXG5pbnRlcmZhY2UgSW5zdGFsbGVkU2hlbGwge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgaW5zdGFsbGVkIHNoZWxsIGV4ZWN1dGFibGUuICovXG4gIHJlYWRvbmx5IGV4ZVBhdGg6IHN0cmluZztcblxuICAvKiogVGhlIGRldGVjdGVkIHNoZWxsIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgY2Fubm90IGJlIGRldGVybWluZWQuICovXG4gIHJlYWRvbmx5IHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LnN0YXJ0QXBwaXVtQW5kRW11bGF0b3J9LlxuICovXG5pbnRlcmZhY2UgU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyB7XG4gIC8qKiBSZXNvbHZlZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIHRvIGJlY29tZSByZWFkeS4gKi9cbiAgcmVhZG9ubHkgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLiAqL1xuICByZWFkb25seSBhcHBpdW1Vcmw6IFVSTDtcblxuICAvKiogQVZEIG5hbWUgdG8gc3RhcnQuICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKiogUmVzb2x2ZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBwb3N0LWJvb3QgZGV2aWNlLWlkbGUgd2FpdCAoYDBgIHNraXBzIGl0KS4gKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBjb25zb2xlIHdpbmRvdyBpcyBzaG93biAob21pdHRlZCBcdTIxOTIgaGlkZGVuKS4gKi9cbiAgcmVhZG9ubHkgaXNBcHBpdW1Db25zb2xlVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuICovXG4gIHJlYWRvbmx5IGlzRW11bGF0b3JWaXNpYmxlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgcG9ydC4gKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIEFwcGl1bSBhdXRvLXN0YXJ0IGlzIGFsbG93ZWQuICovXG4gIHJlYWRvbmx5IHNob3VsZEF1dG9TdGFydEFwcGl1bT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LnN0YXJ0QXBwaXVtQW5kRW11bGF0b3J9LlxuICovXG5pbnRlcmZhY2UgU3RhcnRBcHBpdW1BbmRFbXVsYXRvclJlc3VsdCB7XG4gIC8qKiBUaGUgYWN0dWFsIGRldmljZSBJRCB0aGF0IGlzIGNvbm5lY3RlZCAobWF5IGRpZmZlciBmcm9tIHRoZSByZXF1ZXN0ZWQgb25lKS4gKi9cbiAgcmVhZG9ubHkgYWN0dWFsRGV2aWNlSWQ6IHN0cmluZztcblxuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgcHJvY2VzcywgaWYgb25lIHdhcyBhdXRvLXN0YXJ0ZWQuICovXG4gIHJlYWRvbmx5IGFwcGl1bVByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRoZSBlbXVsYXRvciBwcm9jZXNzLCBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZC4gKi9cbiAgcmVhZG9ubHkgZW11bGF0b3JQcm9jZXNzPzogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xufVxuXG5sZXQgY2FjaGVkVHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFbmNhcHN1bGF0ZXMgYWxsIEFwcGl1bSB0cmFuc3BvcnQgY3JlYXRpb24gbG9naWMsIGluY2x1ZGluZyBBcHBpdW0gc2VydmVyXG4gKiBzdGFydHVwLCBlbXVsYXRvciBtYW5hZ2VtZW50LCBhbmQgV2ViRHJpdmVySU8gc2Vzc2lvbiBlc3RhYmxpc2htZW50LlxuICpcbiAqIFVzaW5nIGEgY2xhc3MgYXZvaWRzIHRocmVhZGluZyB0aGUgdHJhbnNwb3J0IGB0eXBlYCBsYWJlbCB0aHJvdWdoIGV2ZXJ5XG4gKiBoZWxwZXIgZnVuY3Rpb24gXHUyMDE0IGB0aGlzLmxvZygpYCBhdXRvbWF0aWNhbGx5IHByZWZpeGVzIGl0LlxuICovXG5jbGFzcyBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5IHtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZykge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBBcHBpdW0gdHJhbnNwb3J0IGJ5IGVzdGFibGlzaGluZyBhIFdlYkRyaXZlcklPIHNlc3Npb24uXG4gICAqXG4gICAqIElmIGBvcHRpb25zLnNlc3Npb25JZGAgaXMgcHJlc2VudCwgcmVhdHRhY2hlcyB0byB0aGUgZXhpc3Rpbmcgc2Vzc2lvblxuICAgKiBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS4gVGhpcyBhdm9pZHMgZHVwbGljYXRlIEFwcGl1bS9BREIgY29ubmVjdGlvbnNcbiAgICogd2hlbiB0ZXN0IHdvcmtlcnMgcmV1c2UgdGhlIGdsb2JhbCBzZXR1cCdzIHNlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQW5kcm9pZCBBcHBpdW0gdHJhbnNwb3J0IG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIEEgY29uZmlndXJlZCBBcHBpdW0gdHJhbnNwb3J0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZShvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICAgIGlmIChvcHRpb25zLnNlc3Npb25JZCAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuZGV2aWNlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0YWNoVG9FeGlzdGluZ1Nlc3Npb24ob3B0aW9ucy5zZXNzaW9uSWQsIG9wdGlvbnMuZGV2aWNlSWQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZU5ld1Nlc3Npb24ob3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGF0dGFjaFRvRXhpc3RpbmdTZXNzaW9uKFxuICAgIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIGRldmljZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9uc1xuICApOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRpb25zLmFwcGl1bVVybCk7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcih1cmwucG9ydCk7XG4gICAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkID8/IEFQUF9QQUNLQUdFO1xuXG4gICAgdGhpcy5sb2coYFJlYXR0YWNoaW5nIHRvIGV4aXN0aW5nIEFwcGl1bSBzZXNzaW9uICR7c2Vzc2lvbklkfSAoZGV2aWNlPSR7ZGV2aWNlSWR9KWApO1xuXG4gICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IGF0dGFjaCh7XG4gICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgcGxhdGZvcm1OYW1lOiAnQW5kcm9pZCdcbiAgICAgIH0sXG4gICAgICBob3N0bmFtZTogdXJsLmhvc3RuYW1lLFxuICAgICAgbG9nTGV2ZWw6ICd3YXJuJyxcbiAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgIHBvcnQsXG4gICAgICBzZXNzaW9uSWQsXG4gICAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBzdHJpcEZvcmJpZGRlbkZldGNoSGVhZGVyc1xuICAgIH0pO1xuXG4gICAgdGhpcy5sb2coJ1JlYXR0YWNoZWQgdG8gQXBwaXVtIHNlc3Npb24uJyk7XG5cbiAgICByZXR1cm4gbmV3IEFwcGl1bVRyYW5zcG9ydCh7XG4gICAgICBhcHBJZCxcbiAgICAgIGJyb3dzZXIsXG4gICAgICBkZXZpY2VJZCxcbiAgICAgIGlzU2Vzc2lvbk93bmVyOiBmYWxzZSxcbiAgICAgIHBsYXRmb3JtOiAnYW5kcm9pZCcsXG4gICAgICAuLi4ob3B0aW9ucy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSksXG4gICAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSksXG4gICAgICAuLi4ob3B0aW9ucy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSlcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsOiBVUkwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzVXJsID0gbmV3IFVSTCgnL3N0YXR1cycsIHVybCk7XG4gICAgICBjb25zdCByZXEgPSBodHRwLmdldChzdGF0dXNVcmwsIHsgdGltZW91dDogQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LCAocmVzKSA9PiB7XG4gICAgICAgIHJlcy5yZXN1bWUoKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgICByZXEub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICAgIHJlcS5kZXN0cm95KCk7XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59IGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmVxLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgcmVqZWN0KFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgcmVhY2ggQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59OiAke2Vyci5tZXNzYWdlfS4gSXMgdGhlIEFwcGl1bSBzZXJ2ZXIgcnVubmluZz9gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZU5ld1Nlc3Npb24ob3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgICB0aGlzLmxvZyhgQ3JlYXRpbmcgQXBwaXVtVHJhbnNwb3J0ICh1cmw9JHtvcHRpb25zLmFwcGl1bVVybH0sIGF2ZD0ke29wdGlvbnMuYXZkTmFtZX0pYCk7XG5cbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdGlvbnMuYXBwaXVtVXJsKTtcblxuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIodXJsLnBvcnQpO1xuICAgIGlmIChpc05hTihwb3J0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBvcnQgaW4gYXBwaXVtVXJsOiAke3VybC5wb3J0fWApO1xuICAgIH1cblxuICAgIGNvbnN0IGFwcElkID0gb3B0aW9ucy5hcHBJZCA/PyBBUFBfUEFDS0FHRTtcblxuICAgIGxldCBhcHBpdW1Qcm9jZXNzOiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGVtdWxhdG9yUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3RhcnRBcHBpdW1BbmRFbXVsYXRvcih7XG4gICAgICAgIGFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzOiByZXNvbHZlQXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMob3B0aW9ucyksXG4gICAgICAgIGFwcGl1bVVybDogdXJsLFxuICAgICAgICBhdmROYW1lOiBvcHRpb25zLmF2ZE5hbWUsXG4gICAgICAgIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHJlc29sdmVEZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgICAgICBpc0FwcGl1bUNvbnNvbGVWaXNpYmxlOiBvcHRpb25zLmlzQXBwaXVtQ29uc29sZVZpc2libGUsXG4gICAgICAgIGlzRW11bGF0b3JWaXNpYmxlOiBvcHRpb25zLmlzRW11bGF0b3JWaXNpYmxlLFxuICAgICAgICBwb3J0LFxuICAgICAgICBzaG91bGRBdXRvU3RhcnRBcHBpdW06IG9wdGlvbnMuc2hvdWxkQXV0b1N0YXJ0QXBwaXVtXG4gICAgICB9KTtcblxuICAgICAgYXBwaXVtUHJvY2VzcyA9IHJlc3VsdC5hcHBpdW1Qcm9jZXNzO1xuICAgICAgZW11bGF0b3JQcm9jZXNzID0gcmVzdWx0LmVtdWxhdG9yUHJvY2VzcztcbiAgICAgIGNvbnN0IGFjdHVhbERldmljZUlkID0gcmVzdWx0LmFjdHVhbERldmljZUlkO1xuXG4gICAgICBjb25zdCBzZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dCA9IHJlc29sdmVTZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpO1xuICAgICAgdGhpcy5sb2coXG4gICAgICAgIGBDb25uZWN0aW5nIHRvIEFwcGl1bSAoZGV2aWNlPSR7YWN0dWFsRGV2aWNlSWR9LCBhcHA9JHthcHBJZH0sIHJldHJ5VGltZW91dDogJHtTdHJpbmcoc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXQpfW1zLCByZXRyaWVzOiAke1N0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCl9KS4uLmBcbiAgICAgICk7XG4gICAgICBjb25zdCBicm93c2VyID0gYXdhaXQgcmVtb3RlKHtcbiAgICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgJ2FwcGl1bTphcHBBY3Rpdml0eSc6IEFQUF9BQ1RJVklUWSxcbiAgICAgICAgICAnYXBwaXVtOmFwcFBhY2thZ2UnOiBhcHBJZCxcbiAgICAgICAgICAnYXBwaXVtOmF1dG9HcmFudFBlcm1pc3Npb25zJzogdHJ1ZSxcbiAgICAgICAgICAnYXBwaXVtOmF1dG9tYXRpb25OYW1lJzogJ1VpQXV0b21hdG9yMicsXG4gICAgICAgICAgJ2FwcGl1bTpuZXdDb21tYW5kVGltZW91dCc6IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTpub1Jlc2V0JzogdHJ1ZSxcbiAgICAgICAgICAnYXBwaXVtOnVkaWQnOiBhY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgICAnYXBwaXVtOnVpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0JzogU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTp1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0JzogU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAncGxhdGZvcm1OYW1lJzogJ0FuZHJvaWQnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCxcbiAgICAgICAgY29ubmVjdGlvblJldHJ5VGltZW91dDogc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXQsXG4gICAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgdHJhbnNmb3JtUmVxdWVzdDogc3RyaXBGb3JiaWRkZW5GZXRjaEhlYWRlcnNcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmxvZygnQXBwaXVtIHNlc3Npb24gZXN0YWJsaXNoZWQuJyk7XG4gICAgICBjb25zdCBhcHBpdW1UcmFuc3BvcnQgPSBuZXcgQXBwaXVtVHJhbnNwb3J0KHtcbiAgICAgICAgYXBwSWQsXG4gICAgICAgIGJyb3dzZXIsXG4gICAgICAgIGRldmljZUlkOiBhY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgcGxhdGZvcm06ICdhbmRyb2lkJyxcbiAgICAgICAgLi4uKG9wdGlvbnMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzIH0pLFxuICAgICAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSksXG4gICAgICAgIC4uLihvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsRGlzcG9zZSA9IGFwcGl1bVRyYW5zcG9ydC5kaXNwb3NlLmJpbmQoYXBwaXVtVHJhbnNwb3J0KTtcbiAgICAgIGNvbnN0IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgPSBhcHBpdW1UcmFuc3BvcnQ7XG4gICAgICB0cmFuc3BvcnQuZGlzcG9zZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbERpc3Bvc2UoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdHJhbnNwb3J0LmRpc3Bvc2VTeW5jID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0cmFuc3BvcnQ7XG5cbiAgICAgIGZ1bmN0aW9uIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgICAgLy8gQ2Fubm90IHVzZSB0aGlzLmxvZyBpbnNpZGUgbmVzdGVkIGZ1bmN0aW9uIFx1MjAxNCBgdGhpc2AgaXMgbm90IGNhcHR1cmVkLlxuICAgICAgICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7b3B0aW9ucy50eXBlfV0gQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICAgICAga2lsbFByb2Nlc3NUcmVlKGVtdWxhdG9yUHJvY2Vzcyk7XG4gICAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHtvcHRpb25zLnR5cGV9XSBBdXRvLXN0YXJ0ZWQgZW11bGF0b3Igc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgIHRoaXMubG9nKCdLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgaWYgKGVtdWxhdG9yUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoZW11bGF0b3JQcm9jZXNzKTtcbiAgICAgICAgdGhpcy5sb2coJ0tpbGxlZCBhdXRvLXN0YXJ0ZWQgZW11bGF0b3IgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVEZXZpY2VDb25uZWN0ZWQocGFyYW1zOiBFbnN1cmVEZXZpY2VDb25uZWN0ZWRQYXJhbXMpOiBQcm9taXNlPEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdD4ge1xuICAgIGNvbnN0IHsgYXZkTmFtZSwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgaXNFbXVsYXRvclZpc2libGUgfSA9IHBhcmFtcztcbiAgICBjb25zdCBkZXZpY2VJZHNCZWZvcmUgPSBhd2FpdCB0aGlzLmdldENvbm5lY3RlZERldmljZUlkcygpO1xuICAgIHRoaXMubG9nKGBDaGVja2luZyBleGlzdGluZyBkZXZpY2VzIGZvciBBVkQgXCIke2F2ZE5hbWV9XCIuLi4gKGNvbm5lY3RlZDogWyR7ZGV2aWNlSWRzQmVmb3JlLmpvaW4oJywgJyl9XSlgKTtcblxuICAgIGNvbnN0IGV4aXN0aW5nRGV2aWNlSWQgPSBhd2FpdCB0aGlzLmZpbmREZXZpY2VCeUF2ZE5hbWUoYXZkTmFtZSwgZGV2aWNlSWRzQmVmb3JlKTtcblxuICAgIGlmIChleGlzdGluZ0RldmljZUlkKSB7XG4gICAgICB0aGlzLmxvZyhgQVZEIFwiJHthdmROYW1lfVwiIGlzIGFscmVhZHkgcnVubmluZyBvbiBkZXZpY2UgJHtleGlzdGluZ0RldmljZUlkfSwgcmV1c2luZy5gKTtcbiAgICAgIGF3YWl0IHRoaXMuc3VwcHJlc3NFcnJvckRpYWxvZ3MoZXhpc3RpbmdEZXZpY2VJZCk7XG4gICAgICByZXR1cm4geyBhY3R1YWxEZXZpY2VJZDogZXhpc3RpbmdEZXZpY2VJZCB9O1xuICAgIH1cblxuICAgIHRoaXMubG9nKGBBVkQgXCIke2F2ZE5hbWV9XCIgbm90IGZvdW5kIG9uIGFueSBleGlzdGluZyBkZXZpY2UsIHN0YXJ0aW5nIGEgbmV3IGVtdWxhdG9yLi4uYCk7XG4gICAgY29uc3QgZW11bGF0b3IgPSB0aGlzLnN0YXJ0RW11bGF0b3IoYXZkTmFtZSwgaXNFbXVsYXRvclZpc2libGUpO1xuXG4gICAgbGV0IGFjdHVhbERldmljZUlkOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGFjdHVhbERldmljZUlkID0gYXdhaXQgdGhpcy53YWl0Rm9yTmV3RGV2aWNlKGRldmljZUlkc0JlZm9yZSwgZW11bGF0b3IsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBlbXVsYXRvci5zdG9wQ2FwdHVyZSgpO1xuICAgIH1cblxuICAgIHRoaXMubG9nKGBFbXVsYXRvciBcIiR7YXZkTmFtZX1cIiBzdGFydGVkLCBkZXZpY2UgJHthY3R1YWxEZXZpY2VJZH0gaXMgY29ubmVjdGVkLmApO1xuICAgIGF3YWl0IHRoaXMuc3VwcHJlc3NFcnJvckRpYWxvZ3MoYWN0dWFsRGV2aWNlSWQpO1xuICAgIHJldHVybiB7IGFjdHVhbERldmljZUlkLCBlbXVsYXRvclByb2Nlc3M6IGVtdWxhdG9yLnByb2Nlc3MgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmluZERldmljZUJ5QXZkTmFtZShhdmROYW1lOiBzdHJpbmcsIGRldmljZUlkczogc3RyaW5nW10pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGZvciAoY29uc3QgZGV2aWNlSWQgb2YgZGV2aWNlSWRzKSB7XG4gICAgICBjb25zdCBydW5uaW5nQXZkID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBleGVjRmlsZShcbiAgICAgICAgICAnYWRiJyxcbiAgICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdlbXUnLCAnYXZkJywgJ25hbWUnXSxcbiAgICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgICAoX2Vycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoc3Rkb3V0LnNwbGl0KCdcXG4nKVswXT8udHJpbSgpID8/ICcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHJ1bm5pbmdBdmQgPT09IGF2ZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGRldmljZUlkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldENvbm5lY3RlZERldmljZUlkcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBleGVjRmlsZSgnYWRiJywgWydkZXZpY2VzJ10sIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LCAoZXJyb3IsIHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gJ2FkYiBkZXZpY2VzJzogJHtlcnJvci5tZXNzYWdlfS4gSXMgQURCIGluc3RhbGxlZCBhbmQgaW4gUEFUSD9gKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICB0aGlzLmxvZyhgQURCIHN0ZGVycjogJHtzdGRlcnIudHJpbSgpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoc3Rkb3V0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgbGluZXMgPSBvdXRwdXQuc3BsaXQoJ1xcbicpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgICByZXR1cm4gbGluZXNcbiAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUuaW5jbHVkZXMoJ1xcdGRldmljZScpKVxuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zcGxpdCgnXFx0JylbMF0gPz8gJycpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZXZpY2VQcm9wKGRldmljZUlkOiBzdHJpbmcsIHByb3A6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShcbiAgICAgICAgJ2FkYicsXG4gICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2dldHByb3AnLCBwcm9wXSxcbiAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgIChlcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgLy8gUmV0dXJuIG5vIG91dHB1dCBvbiB0aW1lb3V0L2Vycm9yIChub3QgcGFydGlhbCBzdGRvdXQpIHNvIGEgbm9uLXJlc3BvbnNpdmUgZ3Vlc3QgcmVhZHMgYXMgXCJub3QgaWRsZVwiLlxuICAgICAgICAgIHJlc29sdmUoZXJyb3IgPyAnJyA6IHN0ZG91dCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxpc3RJbnN0YWxsZWRQYWNrYWdlcyhkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAnYWRiJyxcbiAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnY21kJywgJ3BhY2thZ2UnLCAnbGlzdCcsICdwYWNrYWdlcyddLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAvLyBSZXR1cm4gbm8gb3V0cHV0IG9uIHRpbWVvdXQvZXJyb3Igc28gYSBjaHVybmluZyBndWVzdCdzIHNsb3cvcGFydGlhbCBwYWNrYWdlIGxpc3QgY2FuJ3QgZmFsc2VseSByZWFkIGFzIGlkbGUuXG4gICAgICAgICAgcmVzb2x2ZShlcnJvciA/ICcnIDogc3Rkb3V0KTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7dGhpcy50eXBlfV0gJHttZXNzYWdlfWApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRW11bGF0b3JCaW5hcnkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZGtSb290ID0gcHJvY2Vzcy5lbnZbJ0FORFJPSURfSE9NRSddID8/IHByb2Nlc3MuZW52WydBTkRST0lEX1NES19ST09UJ107XG4gICAgaWYgKCFzZGtSb290KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgZmluZCBBbmRyb2lkIGVtdWxhdG9yOiBuZWl0aGVyIEFORFJPSURfSE9NRSBub3IgQU5EUk9JRF9TREtfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGpvaW4oc2RrUm9vdCwgJ2VtdWxhdG9yJywgJ2VtdWxhdG9yJyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRLZXlFdmVudChkZXZpY2VJZDogc3RyaW5nLCBrZXlDb2RlOiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdpbnB1dCcsICdrZXlldmVudCcsIFN0cmluZyhrZXlDb2RlKV0sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgICBgV2FybmluZzogZmFpbGVkIHRvICR7ZGVzY3JpcHRpb259IChrZXlldmVudCAke1N0cmluZyhrZXlDb2RlKX0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydEFwcGl1bUFuZEVtdWxhdG9yKHBhcmFtczogU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyk6IFByb21pc2U8U3RhcnRBcHBpdW1BbmRFbXVsYXRvclJlc3VsdD4ge1xuICAgIGNvbnN0IHsgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMsIGFwcGl1bVVybCwgYXZkTmFtZSwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgaXNBcHBpdW1Db25zb2xlVmlzaWJsZSwgaXNFbXVsYXRvclZpc2libGUsIHBvcnQsIHNob3VsZEF1dG9TdGFydEFwcGl1bSB9ID0gcGFyYW1zO1xuXG4gICAgbGV0IG5lZWRzQXBwaXVtU3RhcnQgPSBmYWxzZTtcblxuICAgIHRoaXMubG9nKGBDaGVja2luZyBBcHBpdW0gc2VydmVyIGF0ICR7YXBwaXVtVXJsLmhyZWZ9Li4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBpdW1SZWFjaGFibGUoYXBwaXVtVXJsKTtcbiAgICAgIHRoaXMubG9nKCdBcHBpdW0gc2VydmVyIGlzIHJlYWNoYWJsZS4nKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKHNob3VsZEF1dG9TdGFydEFwcGl1bSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBuZWVkc0FwcGl1bVN0YXJ0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBsZXQgYXBwaXVtUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5lZWRzQXBwaXVtU3RhcnQpIHtcbiAgICAgIHRoaXMubG9nKGBBcHBpdW0gbm90IHJlYWNoYWJsZSwgYXV0by1zdGFydGluZyBvbiBwb3J0ICR7U3RyaW5nKHBvcnQpfS4uLmApO1xuICAgICAgYXBwaXVtUHJvY2VzcyA9IHRoaXMuc3RhcnRBcHBpdW1TZXJ2ZXIocG9ydCwgaXNBcHBpdW1Db25zb2xlVmlzaWJsZSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFssIGRldmljZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIG5lZWRzQXBwaXVtU3RhcnRcbiAgICAgICAgICA/IHRoaXMud2FpdEZvckFwcGl1bVJlYWR5KGFwcGl1bVVybCwgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2coJ0F1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGlzIHJlYWR5LicpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgICAgdGhpcy5lbnN1cmVEZXZpY2VDb25uZWN0ZWQoeyBhdmROYW1lLCBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzLCBpc0VtdWxhdG9yVmlzaWJsZSB9KVxuICAgICAgXSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFjdHVhbERldmljZUlkOiBkZXZpY2VSZXN1bHQuYWN0dWFsRGV2aWNlSWQsXG4gICAgICAgIGFwcGl1bVByb2Nlc3MsXG4gICAgICAgIGVtdWxhdG9yUHJvY2VzczogZGV2aWNlUmVzdWx0LmVtdWxhdG9yUHJvY2Vzc1xuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgICAga2lsbFByb2Nlc3NUcmVlKGFwcGl1bVByb2Nlc3MpO1xuICAgICAgICB0aGlzLmxvZygnS2lsbGVkIGF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGFmdGVyIHN0YXJ0dXAgZmFpbHVyZS4nKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRBcHBpdW1TZXJ2ZXIocG9ydDogbnVtYmVyLCBpc0FwcGl1bUNvbnNvbGVWaXNpYmxlPzogYm9vbGVhbik6IENoaWxkUHJvY2VzcyB7XG4gICAgY29uc3QgaXNDb25zb2xlSGlkZGVuID0gc2hvdWxkSGlkZUFwcGl1bUNvbnNvbGUoaXNBcHBpdW1Db25zb2xlVmlzaWJsZSk7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihgbnB4IGFwcGl1bSAtLWxvZy10aW1lc3RhbXAgLS1wb3J0ICR7U3RyaW5nKHBvcnQpfSAtLWFsbG93LWluc2VjdXJlPSR7Q0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFfWAsIHtcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogaXNDb25zb2xlSGlkZGVuID8gJ2lnbm9yZScgOiBbJ2lnbm9yZScsICdpbmhlcml0JywgJ2luaGVyaXQnXSxcbiAgICAgIHdpbmRvd3NIaWRlOiBpc0NvbnNvbGVIaWRkZW5cbiAgICB9KTtcblxuICAgIGNoaWxkLnVucmVmKCk7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEVtdWxhdG9yKGF2ZE5hbWU6IHN0cmluZywgaXNFbXVsYXRvclZpc2libGU/OiBib29sZWFuKTogRW11bGF0b3JMYXVuY2gge1xuICAgIGNvbnN0IGVtdWxhdG9yQmluYXJ5ID0gdGhpcy5yZXNvbHZlRW11bGF0b3JCaW5hcnkoKTtcbiAgICBjb25zdCBhcmdzID0gYnVpbGRFbXVsYXRvckFyZ3MoeyBhdmROYW1lLCBpc0hpZGRlbjogc2hvdWxkSGlkZUVtdWxhdG9yV2luZG93KGlzRW11bGF0b3JWaXNpYmxlKSB9KTtcbiAgICB0aGlzLmxvZyhgUnVubmluZzogJHtlbXVsYXRvckJpbmFyeX0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAvKlxuICAgICAqIFBpcGUgKHJhdGhlciB0aGFuIGlnbm9yZSkgc3Rkb3V0L3N0ZGVyciBzbyBhbiBlYXJseSBmYWlsdXJlIHN1Y2ggYXNcbiAgICAgKiBcIng4Nl82NCBlbXVsYXRpb24gY3VycmVudGx5IHJlcXVpcmVzIGhhcmR3YXJlIGFjY2VsZXJhdGlvblwiIGNhbiBiZVxuICAgICAqIHN1cmZhY2VkIGltbWVkaWF0ZWx5IGluc3RlYWQgb2Ygd2FpdGluZyBvdXQgdGhlIGZ1bGwgYm9vdCB0aW1lb3V0LlxuICAgICAqL1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oZW11bGF0b3JCaW5hcnksIGFyZ3MsIHtcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddXG4gICAgfSk7XG5cbiAgICBsZXQgY2FwdHVyZWRPdXRwdXQgPSAnJztcbiAgICBsZXQgZXhpdEluZm86IEVtdWxhdG9yRXhpdEluZm8gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGlzQ2FwdHVyaW5nID0gdHJ1ZTtcblxuICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGFwcGVuZE91dHB1dCk7XG4gICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgYXBwZW5kT3V0cHV0KTtcbiAgICBjaGlsZC5vbmNlKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgZXhpdEluZm8gPSB7IGNvZGUsIHNpZ25hbCB9O1xuICAgIH0pO1xuXG4gICAgY2hpbGQudW5yZWYoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBwcm9jZXNzOiBjaGlsZCxcbiAgICAgIHJlYWRFeGl0SW5mbzogKCkgPT4gZXhpdEluZm8sXG4gICAgICByZWFkT3V0cHV0OiAoKSA9PiBjYXB0dXJlZE91dHB1dCxcbiAgICAgIHN0b3BDYXB0dXJlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIExlYXZlIHRoZSBgZGF0YWAgbGlzdGVuZXJzIGF0dGFjaGVkIHNvIHRoZSBwaXBlcyBrZWVwIGRyYWluaW5nIChhXG4gICAgICAgICAqIGZ1bGwgT1MgcGlwZSBidWZmZXIgd291bGQgYmxvY2sgdGhlIGxvbmctcnVubmluZyBlbXVsYXRvcik7IHRoZSBmbGFnXG4gICAgICAgICAqIGp1c3QgZnJlZXplcyB0aGUgY2FwdHVyZWQgdGFpbCBvbmNlIHN0YXJ0dXAgaGFzIHN1Y2NlZWRlZC5cbiAgICAgICAgICovXG4gICAgICAgIGlzQ2FwdHVyaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGFwcGVuZE91dHB1dChjaHVuazogQnVmZmVyKTogdm9pZCB7XG4gICAgICBpZiAoIWlzQ2FwdHVyaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhcHR1cmVkT3V0cHV0ID0gKGNhcHR1cmVkT3V0cHV0ICsgY2h1bmsudG9TdHJpbmcoKSkuc2xpY2UoLUVNVUxBVE9SX09VVFBVVF9UQUlMX01BWF9MRU5HVEgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyB0aGUgZ3Vlc3QncyBjcmFzaC9BTlIgZGlhbG9ncyBvbiB0aGUgZ2l2ZW4gZGV2aWNlLlxuICAgKlxuICAgKiBBIHJlc291cmNlLXN0YXJ2ZWQgZW11bGF0b3IgY2FuIHJhaXNlIGEgXCJQcm9jZXNzIHN5c3RlbSBpc24ndCByZXNwb25kaW5nXCJcbiAgICogQU5SIChhbiBgQWN0aXZpdHlNYW5hZ2VyU2VydmljZWAgdGltZW91dCkgd2hvc2UgZGlhbG9nIG92ZXJsYXlzIHRoZSBVSS4gSWZcbiAgICogaXQgYXBwZWFycyBiZWZvcmUgQXBwaXVtIGF0dGFjaGVzLCBub3RoaW5nIGNhbiBkaXNtaXNzIGl0IGFuZCB0aGUgcnVuIGhhbmdzXG4gICAqIG9yIGZhaWxzIGludGVybWl0dGVudGx5LiBTZXR0aW5nIHRoZSBgaGlkZV9lcnJvcl9kaWFsb2dzYCBnbG9iYWwgXHUyMDE0IHRoZSBzYW1lXG4gICAqIGZsYWcgQW5kcm9pZCdzIG93biB0ZXN0IGluZnJhIHVzZXMgXHUyMDE0IHRlbGxzIGBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlYCB0b1xuICAgKiBuZXZlciBkcmF3IGNyYXNoL0FOUiBkaWFsb2dzLCBzbyB0aGUgQU5SIGNhbiBubyBsb25nZXIgYmxvY2sgYXV0b21hdGlvbi5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgZWFybGllc3QgcG9pbnQgYXQgd2hpY2ggdGhlIGZsYWcgY2FuIGJlIHNldDogdGhlIGZyYW1ld29ya1xuICAgKiAoYHN5c3RlbV9zZXJ2ZXJgKSBtdXN0IGJlIHVwIGJlZm9yZSBgc2V0dGluZ3MgcHV0YCB3b3Jrcywgc28gY2FsbGVycyBpbnZva2VcbiAgICogaXQgb25seSBhZnRlciBgc3lzLmJvb3RfY29tcGxldGVkYC4gSXQgbmFycm93cyBcdTIwMTQgYnV0IGNhbm5vdCBmdWxseSBjbG9zZSBcdTIwMTRcbiAgICogdGhlIHJhY2Ugd2l0aCBhbiBBTlIgdGhhdCBmaXJlcyBiZXR3ZWVuIGJvb3QgY29tcGxldGluZyBhbmQgdGhpcyBjYWxsOyBhXG4gICAqIHByZS1iYWtlZCBzbmFwc2hvdCB3aXRoIHRoZSBmbGFnIGFscmVhZHkgc2V0IGlzIHRoZSBvbmx5IHdheSB0byBlbGltaW5hdGVcbiAgICogaXQgZW50aXJlbHkuIEJlc3QtZWZmb3J0OiBhIGZhaWx1cmUgaXMgbG9nZ2VkLCBub3QgdGhyb3duLCBzaW5jZSBpdCBvbmx5XG4gICAqIHN1cHByZXNzZXMgYSBzeW1wdG9tLlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gY29uZmlndXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzdXBwcmVzc0Vycm9yRGlhbG9ncyhkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coYERpc2FibGluZyBjcmFzaC9BTlIgZGlhbG9ncyBvbiBkZXZpY2UgJHtkZXZpY2VJZH0gKHNldHRpbmdzIHB1dCBnbG9iYWwgaGlkZV9lcnJvcl9kaWFsb2dzIDEpLi4uYCk7XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdzZXR0aW5ncycsICdwdXQnLCAnZ2xvYmFsJywgJ2hpZGVfZXJyb3JfZGlhbG9ncycsICcxJ10sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgICBgV2FybmluZzogZmFpbGVkIHRvIGRpc2FibGUgY3Jhc2gvQU5SIGRpYWxvZ3M6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcid9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JBcHBpdW1SZWFkeSh1cmw6IFVSTCwgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgQXBwaXVtIGF0ICR7dXJsLmhyZWZ9ICh0aW1lb3V0OiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLCBwb2xsOiAke1N0cmluZyhBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmBcbiAgICApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gc3RhcnQgKyB0aW1lb3V0SW5NaWxsaXNlY29uZHM7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybCk7XG4gICAgICAgIHRoaXMubG9nKGBBcHBpdW0gc2VydmVyIHJlYWR5IGFmdGVyICR7U3RyaW5nKERhdGUubm93KCkgLSBzdGFydCl9bXMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aGlzLmxvZyhgQXBwaXVtIHNlcnZlciBub3QgcmVhZHkgeWV0IChlbGFwc2VkOiAke1N0cmluZyhEYXRlLm5vdygpIC0gc3RhcnQpfW1zKS4gUmV0cnlpbmcuLi5gKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcodGltZW91dEluTWlsbGlzZWNvbmRzKX1tc2BcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQm9vdChkZXZpY2VJZDogc3RyaW5nLCBkZWFkbGluZTogbnVtYmVyLCBlbXVsYXRvcjogRW11bGF0b3JMYXVuY2gpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZW1haW5pbmdNcyA9IE1hdGgubWF4KDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSk7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGZpbmlzaCBib290aW5nIChyZW1haW5pbmc6ICR7U3RyaW5nKHJlbWFpbmluZ01zKX1tcywgcG9sbDogJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBpc0Jvb3RlZCA9IGF3YWl0IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAgICdhZGInLFxuICAgICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2dldHByb3AnLCAnc3lzLmJvb3RfY29tcGxldGVkJ10sXG4gICAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgICAgKF9lcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHN0ZG91dC50cmltKCkgPT09ICcxJyk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpc0Jvb3RlZCkge1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGJvb3QgY29tcGxldGVkLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXRJbmZvID0gZW11bGF0b3IucmVhZEV4aXRJbmZvKCk7XG4gICAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJ1aWxkRW11bGF0b3JFeGl0TWVzc2FnZShleGl0SW5mbywgZW11bGF0b3IucmVhZE91dHB1dCgpKSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBjb25uZWN0ZWQgYnV0IGRpZCBub3QgZmluaXNoIGJvb3Rpbmcgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciBhIGZyZXNobHktYm9vdGVkIGVtdWxhdG9yIHRvIGJlY29tZSBpZGxlIGJlZm9yZSB0aGUgc2Vzc2lvbiBpc1xuICAgKiBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogYHN5cy5ib290X2NvbXBsZXRlZGAgZmlyZXMgYmVmb3JlIHRoZSBndWVzdCBpcyBhY3R1YWxseSBpZGxlIFx1MjAxNCBwYWNrYWdlXG4gICAqIG9wdGltaXphdGlvbiBhbmQgc2VydmljZXMga2VlcCBjaHVybmluZyBcdTIwMTQgc28gZXN0YWJsaXNoaW5nIHRoZSBBcHBpdW1cbiAgICogc2Vzc2lvbiBpbW1lZGlhdGVseSBtYWtlcyBldmVyeSBzZXJpYWxpemVkIFVpQXV0b21hdG9yMiBgYWRiYCByb3VuZC10cmlwXG4gICAqIGNvbnRlbmQgd2l0aCB0aGF0IHdvcmsgYW5kIGluZmxhdGVzIHNlc3Npb24gZXN0YWJsaXNobWVudCB+M3guIFRoaXMgcG9sbHNcbiAgICogYSBsYXRlciwgcXVpZXRlciBzaWduYWwgKGJvb3QgYW5pbWF0aW9uIHN0b3BwZWQgKyBwYWNrYWdlIG1hbmFnZXIgc2VydmluZyxcbiAgICogdmlhIHtAbGluayBjaGVja0RldmljZUlkbGV9KSBhbmQgcmV0dXJucyBhcyBzb29uIGFzIGl0IGlzIHNhdGlzZmllZC5cbiAgICpcbiAgICogQmVzdC1lZmZvcnQ6IGlmIHRoZSBndWVzdCBkb2VzIG5vdCByZXBvcnQgaWRsZSB3aXRoaW4gdGhlIGJ1ZGdldCBpdCBsb2dzIGFcbiAgICogd2FybmluZyBhbmQgcHJvY2VlZHMgKGEgc2xvdyBzZXNzaW9uIGlzIGJldHRlciB0aGFuIGEgZmFpbGVkIHJ1biksIGFuZCBhXG4gICAqIGJ1ZGdldCBvZiBgMGAgc2tpcHMgdGhlIHdhaXQgZW50aXJlbHkuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRCB0byBwb2xsLlxuICAgKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gTWF4aW11bSB0aW1lIHRvIHdhaXQ7IGAwYCBza2lwcyB0aGUgd2FpdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckRldmljZUlkbGUoZGV2aWNlSWQ6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGltZW91dEluTWlsbGlzZWNvbmRzIDw9IDApIHtcbiAgICAgIHRoaXMubG9nKGBTa2lwcGluZyBwb3N0LWJvb3QgaWRsZSB3YWl0IGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gKHRpbWVvdXQgaXMgMCkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gc3RhcnQgKyB0aW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGJlY29tZSBpZGxlICh0aW1lb3V0OiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLCBwb2xsOiAke1N0cmluZyhERVZJQ0VfSURMRV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBbYm9vdEFuaW1hdGlvblByb3AsIHBhY2thZ2VMaXN0T3V0cHV0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdGhpcy5nZXREZXZpY2VQcm9wKGRldmljZUlkLCAnaW5pdC5zdmMuYm9vdGFuaW0nKSxcbiAgICAgICAgdGhpcy5saXN0SW5zdGFsbGVkUGFja2FnZXMoZGV2aWNlSWQpXG4gICAgICBdKTtcblxuICAgICAgaWYgKGNoZWNrRGV2aWNlSWRsZSh7IGJvb3RBbmltYXRpb25Qcm9wLCBwYWNrYWdlTGlzdE91dHB1dCB9KSkge1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGlzIGlkbGUgYWZ0ZXIgJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IG5vdCBpZGxlIHlldCAoZWxhcHNlZDogJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcykuIFJldHJ5aW5nLi4uYCk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIERFVklDRV9JRExFX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMubG9nKFxuICAgICAgYFdhcm5pbmc6IGRldmljZSAke2RldmljZUlkfSBkaWQgbm90IHJlcG9ydCBpZGxlIHdpdGhpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zOyBwcm9jZWVkaW5nIHdpdGggc2Vzc2lvbiBlc3RhYmxpc2htZW50IGFueXdheS5gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvck5ld0RldmljZShkZXZpY2VJZHNCZWZvcmU6IHN0cmluZ1tdLCBlbXVsYXRvcjogRW11bGF0b3JMYXVuY2gsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgYSBuZXcgZGV2aWNlIHRvIGFwcGVhciBpbiBBREIgKHRpbWVvdXQ6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1N0cmluZyhFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gXG4gICAgKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgY29uc3QgY3VycmVudElkcyA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGVkRGV2aWNlSWRzKCk7XG4gICAgICBjb25zdCBuZXdJZHMgPSBjdXJyZW50SWRzLmZpbHRlcigoaWQpID0+ICFkZXZpY2VJZHNCZWZvcmUuaW5jbHVkZXMoaWQpKTtcblxuICAgICAgaWYgKG5ld0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGFjdHVhbERldmljZUlkID0gbmV3SWRzWzBdID8/ICcnO1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7YWN0dWFsRGV2aWNlSWR9IGFwcGVhcmVkIGluIEFEQiwgd2FpdGluZyBmb3IgYm9vdCB0byBjb21wbGV0ZS4uLmApO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JCb290KGFjdHVhbERldmljZUlkLCBkZWFkbGluZSwgZW11bGF0b3IpO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JEZXZpY2VJZGxlKGFjdHVhbERldmljZUlkLCBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzKTtcbiAgICAgICAgYXdhaXQgdGhpcy53YWtlU2NyZWVuKGFjdHVhbERldmljZUlkKTtcbiAgICAgICAgcmV0dXJuIGFjdHVhbERldmljZUlkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleGl0SW5mbyA9IGVtdWxhdG9yLnJlYWRFeGl0SW5mbygpO1xuICAgICAgaWYgKGV4aXRJbmZvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihidWlsZEVtdWxhdG9yRXhpdE1lc3NhZ2UoZXhpdEluZm8sIGVtdWxhdG9yLnJlYWRPdXRwdXQoKSkpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE5vIG5ldyBlbXVsYXRvciBkZXZpY2UgYXBwZWFyZWQgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWtlU2NyZWVuKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZyhgV2FraW5nIHNjcmVlbiBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uLi5gKTtcblxuICAgIGF3YWl0IHRoaXMuc2VuZEtleUV2ZW50KGRldmljZUlkLCBLRVlDT0RFX1dBS0VVUCwgJ3dha2Ugc2NyZWVuJyk7XG4gICAgYXdhaXQgdGhpcy5zZW5kS2V5RXZlbnQoZGV2aWNlSWQsIEtFWUNPREVfTUVOVSwgJ2Rpc21pc3MgbG9jayBzY3JlZW4nKTtcblxuICAgIHRoaXMubG9nKGBTY3JlZW4gd2FrZSBjb21wbGV0ZSBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlbiBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIGFuIG93bmVkIGRlc2t0b3AgQ0RQIHRyYW5zcG9ydC5cbiAqIEByZXR1cm5zIEEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGNvbnN0IHR5cGUgPSBvcHRpb25zPy50eXBlID8/IERFRkFVTFRfVFJBTlNQT1JUX1RZUEU7XG5cbiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudHlwZSA9PT0gJ29ic2lkaWFuLWNkcCcpIHtcbiAgICByZXR1cm4gY3JlYXRlQ2RwVHJhbnNwb3J0KG9wdGlvbnMpO1xuICB9XG5cbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5KHR5cGUpO1xuICByZXR1cm4gZmFjdG9yeS5jcmVhdGUob3B0aW9ucyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhY2hlZCB0cmFuc3BvcnQgaW5zdGFuY2UsIGNyZWF0aW5nIG9uZSBmcm9tIHRoZSBnaXZlbiBvcHRpb25zXG4gKiBpZiBub3QgYWxyZWFkeSBjYWNoZWQuXG4gKlxuICogVGhlIHRyYW5zcG9ydCBpcyBjYWNoZWQgcGVyIHdvcmtlciBwcm9jZXNzIHNvIFdlYlNvY2tldC9BcHBpdW0gc2Vzc2lvbnNcbiAqIGFyZSByZXVzZWQgYWNyb3NzIGNhbGxzIHdpdGhpbiB0aGUgc2FtZSB0ZXN0IHdvcmtlci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBDTEkgdHJhbnNwb3J0LlxuICogQHJldHVybnMgVGhlIGNhY2hlZCBvciBuZXdseSBjcmVhdGVkIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlVHJhbnNwb3J0KG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGlmIChjYWNoZWRUcmFuc3BvcnQpIHtcbiAgICByZXR1cm4gY2FjaGVkVHJhbnNwb3J0O1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzIC0tIFNpbmdsZS10aHJlYWRlZCB3b3JrZXI7IG5vIGNvbmN1cnJlbnQgd3JpdGVzLlxuICBjYWNoZWRUcmFuc3BvcnQgPSByZXN1bHQ7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZSBmb3IgYW4gZW11bGF0b3IgcHJvY2VzcyB0aGF0IGV4aXRlZCBkdXJpbmdcbiAqIHN0YXJ0dXAsIGFwcGVuZGluZyB0aGUgY2FwdHVyZWQgb3V0cHV0IHRhaWwgd2hlbiBhdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIGV4aXRJbmZvIC0gVGhlIGVtdWxhdG9yJ3MgZXhpdCBkZXRhaWxzLlxuICogQHBhcmFtIG91dHB1dCAtIFRoZSBjYXB0dXJlZCBzdGRvdXQrc3RkZXJyIHRhaWwuXG4gKiBAcmV0dXJucyBBIGh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkRW11bGF0b3JFeGl0TWVzc2FnZShleGl0SW5mbzogRW11bGF0b3JFeGl0SW5mbywgb3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWFzb24gPSBleGl0SW5mby5zaWduYWwgPT09IG51bGxcbiAgICA/IGBleGl0ZWQgcHJlbWF0dXJlbHkgd2l0aCBjb2RlICR7U3RyaW5nKGV4aXRJbmZvLmNvZGUpfWBcbiAgICA6IGB3YXMgdGVybWluYXRlZCBieSBzaWduYWwgJHtleGl0SW5mby5zaWduYWx9YDtcbiAgY29uc3QgdHJpbW1lZE91dHB1dCA9IG91dHB1dC50cmltKCk7XG4gIGNvbnN0IGRldGFpbHMgPSB0cmltbWVkT3V0cHV0Lmxlbmd0aCA+IDBcbiAgICA/IGBcXG5cXG5FbXVsYXRvciBvdXRwdXQgKHRhaWwpOlxcbiR7dHJpbW1lZE91dHB1dH1gXG4gICAgOiAnJztcbiAgcmV0dXJuIGBBbmRyb2lkIGVtdWxhdG9yICR7cmVhc29ufSBkdXJpbmcgc3RhcnR1cC4ke2RldGFpbHN9YDtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBwcm9hY3RpdmUgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgY2hlY2sgZm9yIGFuIGFzYXItc3dhcCBhbmQgYWN0c1xuICogb24gdGhlIHZlcmRpY3Q6IHRocm93cyB7QGxpbmsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yfSBmb3IgYW5cbiAqIGluc3RhbGxlciBiZWxvdyB0aGUgYXBwJ3MgcnVuIGZsb29yLCBhbmQgbG9ncyBhIHdhcm5pbmcgZm9yIGFcbiAqIHJ1bm5hYmxlLWJ1dC1iZWxvdy1yZWNvbW1lbmRlZCBpbnN0YWxsZXIuXG4gKlxuICogQHBhcmFtIGFwcFZlcnNpb24gLSBUaGUgYXBwIChhc2FyKSB2ZXJzaW9uIHRoYXQgd2lsbCBiZSBzd2FwcGVkIG9udG8gdGhlIHNoZWxsLFxuICogICBvciBgdW5kZWZpbmVkYCB3aGVuIG5vIGFzYXItc3dhcCB3aWxsIGhhcHBlbiAobm90aGluZyBpcyBjaGVja2VkIHRoZW4pLlxuICogQHBhcmFtIGluc3RhbGxlclZlcnNpb24gLSBUaGUgcmVzb2x2ZWQgaW5zdGFsbGVyL3NoZWxsIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgLlxuICogQHJldHVybnMgVGhlIHZlcmRpY3QsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm8gYXNhci1zd2FwIHRvIGNoZWNrLlxuICovXG5mdW5jdGlvbiBjaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHkoXG4gIGFwcFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgaW5zdGFsbGVyVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkIHtcbiAgaWYgKGFwcFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBjb21wYXRpYmlsaXR5ID0gY2hlY2tJbnN0YWxsZXJDb21wYXRpYmlsaXR5KHtcbiAgICBhcHBWZXJzaW9uLFxuICAgIGluc3RhbGxlclZlcnNpb24sXG4gICAgbWV0YWRhdGE6IGdldFZlcnNpb25NZXRhZGF0YShhcHBWZXJzaW9uKVxuICB9KTtcblxuICBpZiAoY29tcGF0aWJpbGl0eS50aWVyID09PSAndW5ydW5uYWJsZScpIHtcbiAgICB0aHJvdyBuZXcgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yKHtcbiAgICAgIGFwcFZlcnNpb246IGNvbXBhdGliaWxpdHkuYXBwVmVyc2lvbixcbiAgICAgIGluc3RhbGxlclZlcnNpb246IGVuc3VyZU5vbk51bGxhYmxlKGNvbXBhdGliaWxpdHkuaW5zdGFsbGVyVmVyc2lvbiksXG4gICAgICBtaW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb246IGVuc3VyZU5vbk51bGxhYmxlKGNvbXBhdGliaWxpdHkubWluUnVubmFibGVJbnN0YWxsZXJWZXJzaW9uKVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGNvbXBhdGliaWxpdHkudGllciA9PT0gJ25hZ2dlZCcpIHtcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdICR7ZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5tZXNzYWdlKX1gKTtcbiAgfVxuXG4gIHJldHVybiBjb21wYXRpYmlsaXR5O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkZXNrdG9wIENEUCB0cmFuc3BvcnQuIFdoZW4gYW4gZXhwbGljaXQgYHBvcnRgIGlzIGdpdmVuIHRoZVxuICogdHJhbnNwb3J0IGF0dGFjaGVzIHRvIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiBvbiB0aGF0IHBvcnQ7IG90aGVyd2lzZSBpdFxuICogbGF1bmNoZXMgYW5kIG93bnMgYW4gaXNvbGF0ZWQgaW5zdGFuY2UgKHRoZSBkZWZhdWx0LCBoZXJtZXRpYyBtb2RlKS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENEUCB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgY29uZmlndXJlZCBDRFAgdHJhbnNwb3J0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVDZHBUcmFuc3BvcnQob3B0aW9ucz86IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKG9wdGlvbnM/LnBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG93bmVkU3VmZml4ID0gb3B0aW9ucy5pc0hhcm5lc3NPd25lZEluc3RhbmNlID8gJyAoaGFybmVzcy1vd25lZCknIDogJyc7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6b2JzaWRpYW4tY2RwXSBBdHRhY2hpbmcgdG8gcnVubmluZyBPYnNpZGlhbiR7b3duZWRTdWZmaXh9IChob3N0PSR7b3B0aW9ucy5ob3N0ID8/ICdsb2NhbGhvc3QnfSwgcG9ydD0ke1N0cmluZyhvcHRpb25zLnBvcnQpfSlgKTtcbiAgICByZXR1cm4gbmV3IERlc2t0b3BDZHBUcmFuc3BvcnQoe1xuICAgICAgLi4uKG9wdGlvbnMuaG9zdCAhPT0gdW5kZWZpbmVkICYmIHsgY2RwSG9zdDogb3B0aW9ucy5ob3N0IH0pLFxuICAgICAgY2RwUG9ydDogb3B0aW9ucy5wb3J0LFxuICAgICAgLi4uKG9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzIH0pLFxuICAgICAgLi4uKG9wdGlvbnMuaXNIYXJuZXNzT3duZWRJbnN0YW5jZSAhPT0gdW5kZWZpbmVkICYmIHsgaXNIYXJuZXNzT3duZWRJbnN0YW5jZTogb3B0aW9ucy5pc0hhcm5lc3NPd25lZEluc3RhbmNlIH0pXG4gICAgfSk7XG4gIH1cblxuICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdIENyZWF0aW5nIG93bmVkIGlzb2xhdGVkIE9ic2lkaWFuIGluc3RhbmNlJyk7XG4gIGNvbnN0IG93bmVkSW5zdGFuY2UgPSBhd2FpdCByZXNvbHZlT3duZWRJbnN0YW5jZUNvbmZpZyhvcHRpb25zKTtcbiAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KHtcbiAgICAuLi4ob3B0aW9ucz8uaG9zdCAhPT0gdW5kZWZpbmVkICYmIHsgY2RwSG9zdDogb3B0aW9ucy5ob3N0IH0pLFxuICAgIC4uLihvcHRpb25zPy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSksXG4gICAgZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzOiByZXNvbHZlRGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgIC4uLihvcHRpb25zPy5pc09ic2lkaWFuQXBwVmlzaWJsZSAhPT0gdW5kZWZpbmVkICYmIHsgaXNPYnNpZGlhbkFwcFZpc2libGU6IG9wdGlvbnMuaXNPYnNpZGlhbkFwcFZpc2libGUgfSksXG4gICAgb3duZWRJbnN0YW5jZSxcbiAgICAuLi4ob3B0aW9ucz8uc2hvdWxkRGlzYWJsZVNhbmRib3ggIT09IHVuZGVmaW5lZCAmJiB7IHNob3VsZERpc2FibGVTYW5kYm94OiBvcHRpb25zLnNob3VsZERpc2FibGVTYW5kYm94IH0pXG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmcmVzaCwgaXNvbGF0ZWQgdXNlci1kYXRhIGRpcmVjdG9yeSBmb3IgYW4gb3duZWQgaW5zdGFuY2UuXG4gKlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIG5ldyBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU93bmVkVXNlckRhdGFEaXIoKTogc3RyaW5nIHtcbiAgY29uc3Qgcm9vdCA9IGpvaW4odG1wZGlyKCksICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJyk7XG4gIG1rZGlyU3luYyhyb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgcmV0dXJuIG1rZHRlbXBTeW5jKGpvaW4ocm9vdCwgT1dORURfVVNFUl9EQVRBX1BSRUZJWCkpO1xufVxuXG4vKipcbiAqIERlY2lkZXMgaG93IHRoZSByZXF1ZXN0ZWQgYXBwIChhc2FyKSB2ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCB0byBhbiBvd25lZFxuICogaW5zdGFuY2UsIHdpdGhvdXQgZG93bmxvYWRpbmcgYW55dGhpbmcgeWV0OiBhbiB1cGdyYWRlLW9ubHkgYXNhci1zd2FwIG9udG8gdGhlXG4gKiBzaGVsbCwgYSBkb3duZ3JhZGUgdG8gdGhlIGFwcCdzIG93biBpbnN0YWxsZXIgc2hlbGwsIG9yIHRoZSB1c2VyJ3MgbmV3ZXN0XG4gKiBpbnN0YWxsZWQgYXNhciB3aGVuIG5laXRoZXIgdmVyc2lvbiBpcyBwaW5uZWQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDRFAgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcGFyYW0gc2hlbGxWZXJzaW9uIC0gVGhlIHJlc29sdmVkIGluc3RhbGxlci9zaGVsbCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYC5cbiAqIEByZXR1cm5zIFRoZSBhc2FyIHBsYW4gKGF0IG1vc3Qgb25lIG9mIGl0cyBmaWVsZHMgaXMgc2V0KS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUFzYXJQbGFuKFxuICBvcHRpb25zOiBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPEFzYXJQbGFuPiB7XG4gIGlmIChvcHRpb25zPy5vYnNpZGlhblZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGFzYXJWZXJzaW9uID0gYXdhaXQgcmVzb2x2ZUNvbmNyZXRlVmVyc2lvbihvcHRpb25zLm9ic2lkaWFuVmVyc2lvbik7XG4gICAgaWYgKHNoZWxsVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIGNvbXBhcmVWZXJzaW9ucyhhc2FyVmVyc2lvbiwgc2hlbGxWZXJzaW9uKSA+PSAwKSB7XG4gICAgICByZXR1cm4geyBhc2FyVmVyc2lvblRvU3dhcDogYXNhclZlcnNpb24gfTtcbiAgICB9XG5cbiAgICAvLyBBc2FyLXN3YXAgaXMgdXBncmFkZS1vbmx5LCBzbyBpdCBjYW5ub3QgYXBwbHkgYSB2ZXJzaW9uIG9sZGVyIHRoYW4gdGhlXG4gICAgLy8gU2hlbGwncyBidW5kbGVkIG9uZSBcdTIwMTQgYW5kIHdoZW4gdGhlIHNoZWxsIHZlcnNpb24gaXMgdW5rbm93biAoYSBMaW51eFxuICAgIC8vIFBhdGgtcGFyc2UgbWlzcykgd2UgY2Fubm90IHByb3ZlIHRoZSBzd2FwIHdvdWxkIGFwcGx5IGF0IGFsbC4gSW4gYm90aFxuICAgIC8vIENhc2VzIHVzZSB0aGUgcmVxdWVzdGVkIHZlcnNpb24ncyBvd24gaW5zdGFsbGVyIHNoZWxsLCB3aG9zZSBidW5kbGVkIGFzYXJcbiAgICAvLyBJcyBleGFjdGx5IHRoaXMgdmVyc2lvbiwgc28gdGhlIHBpbiBpcyBhbHdheXMgaG9ub3JlZC5cbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdIFVzaW5nIHRoZSAke2FzYXJWZXJzaW9ufSBpbnN0YWxsZXIgc2hlbGwgKHNoZWxsIHZlcnNpb24gJHtzaGVsbFZlcnNpb24gPz8gJ3Vua25vd24nfTsgYXNhci1zd2FwIGlzIHVwZ3JhZGUtb25seSkuYCk7XG4gICAgcmV0dXJuIHsgZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbjogYXNhclZlcnNpb24gfTtcbiAgfVxuXG4gIGlmIChvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG5ld2VzdCA9IGZpbmROZXdlc3RBc2FyKGdldE9ic2lkaWFuQ29uZmlnRGlyKCkpO1xuICAgIGlmIChuZXdlc3QgJiYgKHNoZWxsVmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8IGNvbXBhcmVWZXJzaW9ucyhuZXdlc3QudmVyc2lvbiwgc2hlbGxWZXJzaW9uKSA+PSAwKSkge1xuICAgICAgcmV0dXJuIHsgYXNhcjogeyBwYXRoOiBuZXdlc3QucGF0aCwgdmVyc2lvbjogbmV3ZXN0LnZlcnNpb24gfSB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7fTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgbG9jYWxseS1pbnN0YWxsZWQgT2JzaWRpYW4gc2hlbGwsIHRvbGVyYXRpbmcgaXRzIGFic2VuY2UuXG4gKlxuICogVW5saWtlIHtAbGluayByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlfSAod2hpY2ggdGhyb3dzIHdoZW4gT2JzaWRpYW4gaXMgbm90XG4gKiBpbnN0YWxsZWQpLCB0aGlzIHJldHVybnMgYHVuZGVmaW5lZGAgaW4gdGhhdCBjYXNlLCBzbyBhIGNhbGxlciBwaW5uaW5nIGFuXG4gKiBpbnN0YWxsZXIgdmVyc2lvbiBjYW4gZmFsbCBiYWNrIHRvIGRvd25sb2FkaW5nIHRoZSBwaW5uZWQgc2hlbGwgaW5zdGVhZCBvZlxuICogZmFpbGluZyBvbiBhIGhvc3Qgd2l0aCBubyBPYnNpZGlhbiBpbnN0YWxsZWQgKGUuZy4gQ0kpLlxuICpcbiAqIEByZXR1cm5zIFRoZSBpbnN0YWxsZWQgc2hlbGwncyBwYXRoIGFuZCBkZXRlY3RlZCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuXG4gKiAgIG5vIE9ic2lkaWFuIGlzIGluc3RhbGxlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUluc3RhbGxlZFNoZWxsT3JOdWxsKCk6IFByb21pc2U8SW5zdGFsbGVkU2hlbGwgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBleGVQYXRoID0gYXdhaXQgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZSgpO1xuICAgIHJldHVybiB7IGV4ZVBhdGgsIHNoZWxsVmVyc2lvbjogZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uKGV4ZVBhdGgpIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgc2hlbGwgZXhlY3V0YWJsZSwgYXNhciBwcm92aXNpb25pbmcsIGFuZCBpc29sYXRlZCB1c2VyLWRhdGEgZGlyXG4gKiBmb3IgYSBoYXJuZXNzLW93bmVkIGluc3RhbmNlIGZyb20gdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIGtub2JzLlxuICpcbiAqIC0gYG9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbmAgcGlucyB0aGUgRWxlY3Ryb24gc2hlbGwgKGRvd25sb2FkcyArIGV4dHJhY3RzIGFcbiAqICAgcG9ydGFibGUgYnVpbGQgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhlIGluc3RhbGxlZCBzaGVsbCkuXG4gKiAtIGBvYnNpZGlhblZlcnNpb25gIHBpbnMgdGhlIGFwcDogYW4gYXNhci1zd2FwIHdoZW4gaXQgaXMgPj0gdGhlIHNoZWxsIHZlcnNpb25cbiAqICAgKGNoZWFwKSwgb3RoZXJ3aXNlIHRoZSBtYXRjaGluZyBpbnN0YWxsZXIgc2hlbGwgaXMgdXNlZCAoZG93bmdyYWRlKS5cbiAqIC0gV2hlbiBuZWl0aGVyIGlzIHNldCwgdGhlIHVzZXIncyBuZXdlc3QgaW5zdGFsbGVkIGFzYXIgaXMgY29waWVkIGluIChzbyB0aGVcbiAqICAgb3duZWQgaW5zdGFuY2UgbWF0Y2hlcyB0aGUgdmVyc2lvbiB0aGUgdXNlciBjdXJyZW50bHkgcnVucykgd2l0aCB6ZXJvIG5ldHdvcmsuXG4gKlxuICogVGhlIGNvbmNyZXRlIChhcHAsIGluc3RhbGxlcikgdmVyc2lvbiBwYWlyIGlzIHJlc29sdmVkICpiZWZvcmUqIGFueSBzaGVsbC9hc2FyXG4gKiBkb3dubG9hZCwgc28gYSBwcm9hY3RpdmUgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgY2hlY2tcbiAqICh7QGxpbmsgY2hlY2tJbnN0YWxsZXJDb21wYXRpYmlsaXR5fSkgY2FuIGZhaWwgZmFzdDogYW4gaW5zdGFsbGVyIGJlbG93IHRoZVxuICogYXBwJ3MgcnVuIGZsb29yIHRocm93cyB7QGxpbmsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yfSBiZWZvcmVcbiAqIGFueXRoaW5nIGlzIGRvd25sb2FkZWQgb3IgbGF1bmNoZWQgKHN1cGVyc2VkaW5nIHRoZSByZWFjdGl2ZSBkZWFkLWJvb3RcbiAqIGZhc3QtZmFpbCBmb3IgdGFibGUta25vd24gY29tYm9zKSwgYW5kIGEgcnVubmFibGUtYnV0LWJlbG93LXJlY29tbWVuZGVkXG4gKiBpbnN0YWxsZXIgbG9ncyBhIHdhcm5pbmcuIFRoZSB2ZXJkaWN0IGlzIHRocmVhZGVkIG9udG8gdGhlIHJldHVybmVkIGNvbmZpZyBzb1xuICogdGhlIHRyYW5zcG9ydCBjYW4gc3VyZmFjZSBpdCBhcyBkYXRhLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ0RQIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIG93bmVkLWluc3RhbmNlIGNvbmZpZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU93bmVkSW5zdGFuY2VDb25maWcob3B0aW9ucz86IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T3duZWRJbnN0YW5jZUNvbmZpZz4ge1xuICAvLyBSZXNvbHZlIHRoZSBjb25jcmV0ZSBzaGVsbCAoaW5zdGFsbGVyKSB2ZXJzaW9uIGZpcnN0LCBidXQgZm9yIGEgcGlubmVkXG4gIC8vIEluc3RhbGxlciBERUZFUiByZXNvbHZpbmcvZG93bmxvYWRpbmcgdGhlIGFjdHVhbCBzaGVsbCB1bnRpbCBhZnRlciB0aGVcbiAgLy8gUHJvYWN0aXZlIGNvbXBhdGliaWxpdHkgY2hlY2ssIHNvIGFuIHVucnVubmFibGUgcGluIGZhaWxzIGZhc3QgXHUyMDE0IGJlZm9yZSB0aGVcbiAgLy8gKHBvc3NpYmx5IHNsb3cpIGluc3RhbGxlZC1zaGVsbCBkZXRlY3Rpb24gYW5kIGFueSBkb3dubG9hZC5cbiAgbGV0IGV4ZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgcGlubmVkSW5zdGFsbGVyVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZVBhdGggPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlKCk7XG4gICAgc2hlbGxWZXJzaW9uID0gZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uKGV4ZVBhdGgpO1xuICB9IGVsc2Uge1xuICAgIC8vIEEgcGlubmVkIGluc3RhbGxlciB2ZXJzaW9uIGZ1bGx5IGRldGVybWluZXMgdGhlIHNoZWxsIHZlcnNpb24gdXAgZnJvbnQsXG4gICAgLy8gV2l0aG91dCByZXF1aXJpbmcgYSBsb2NhbGx5LWluc3RhbGxlZCBPYnNpZGlhbiAoYSBDSSBydW5uZXIgaGFzIG5vbmUpLlxuICAgIHBpbm5lZEluc3RhbGxlclZlcnNpb24gPSBhd2FpdCByZXNvbHZlQ29uY3JldGVWZXJzaW9uKG9wdGlvbnMub2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uKTtcbiAgICBzaGVsbFZlcnNpb24gPSBwaW5uZWRJbnN0YWxsZXJWZXJzaW9uO1xuICB9XG5cbiAgLy8gRGVjaWRlIGhvdyB0aGUgYXBwIChhc2FyKSB2ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCwgc3RpbGwgV0lUSE9VVCBkb3dubG9hZGluZy5cbiAgY29uc3QgcGxhbiA9IGF3YWl0IHJlc29sdmVBc2FyUGxhbihvcHRpb25zLCBzaGVsbFZlcnNpb24pO1xuXG4gIC8vIFRoZSBhcHAgdmVyc2lvbiB0aGF0IHdpbGwgcnVuIGFzIGFuIGFzYXItc3dhcCBvbnRvIGBzaGVsbFZlcnNpb25gIFx1MjAxNCB0aGUgb25seVxuICAvLyBDb21iaW5hdGlvbiB0aGF0IGNhbiBkZWFkLWJvb3QuIFRoZSBkb3duZ3JhZGUgLyBvd24taW5zdGFsbGVyIHBhdGhzIHJ1biB0aGVcbiAgLy8gQXBwJ3Mgb3duIGluc3RhbGxlciBzaGVsbCwgc28gdGhleSBhbHdheXMgYm9vdCBhbmQgYXJlIG5vdCBjaGVja2VkLlxuICBjb25zdCBzd2FwQXBwVmVyc2lvbiA9IHBsYW4uYXNhclZlcnNpb25Ub1N3YXAgPz8gcGxhbi5hc2FyPy52ZXJzaW9uO1xuICBjb25zdCBjb21wYXRpYmlsaXR5ID0gY2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5KHN3YXBBcHBWZXJzaW9uLCBzaGVsbFZlcnNpb24pO1xuXG4gIC8vIFRoZSBwaW4gaXMga25vd24gcnVubmFibGUgXHUyMDE0IHJlc29sdmUvZG93bmxvYWQgdGhlIGRlZmVycmVkIHNoZWxsICsgYXNhciBub3cuXG4gIC8vIFJldXNlIHRoZSBpbnN0YWxsZWQgc2hlbGwgb25seSB3aGVuIGl0IGFscmVhZHkgbWF0Y2hlcyB0aGUgcGluIChzYXZlcyB0aGVcbiAgLy8gRG93bmxvYWQpOyBvdGhlcndpc2UgZG93bmxvYWQgYW5kIGV4dHJhY3QgdGhlIHBpbm5lZCBpbnN0YWxsZXIuXG4gIGlmIChwaW5uZWRJbnN0YWxsZXJWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBpbnN0YWxsZWQgPSBhd2FpdCByZXNvbHZlSW5zdGFsbGVkU2hlbGxPck51bGwoKTtcbiAgICBleGVQYXRoID0gaW5zdGFsbGVkPy5zaGVsbFZlcnNpb24gPT09IHBpbm5lZEluc3RhbGxlclZlcnNpb24gPyBpbnN0YWxsZWQuZXhlUGF0aCA6IGF3YWl0IGVuc3VyZVNoZWxsQ2FjaGVkKHBpbm5lZEluc3RhbGxlclZlcnNpb24pO1xuICB9XG4gIGlmIChwbGFuLmRvd25ncmFkZUluc3RhbGxlclZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZVBhdGggPSBhd2FpdCBlbnN1cmVTaGVsbENhY2hlZChwbGFuLmRvd25ncmFkZUluc3RhbGxlclZlcnNpb24pO1xuICB9XG5cbiAgY29uc3QgYXNhciA9IHBsYW4uYXNhclZlcnNpb25Ub1N3YXAgPT09IHVuZGVmaW5lZFxuICAgID8gcGxhbi5hc2FyXG4gICAgOiB7IHBhdGg6IGF3YWl0IGVuc3VyZUFzYXJDYWNoZWQocGxhbi5hc2FyVmVyc2lvblRvU3dhcCksIHZlcnNpb246IHBsYW4uYXNhclZlcnNpb25Ub1N3YXAgfTtcblxuICByZXR1cm4ge1xuICAgIC4uLihhc2FyICYmIHsgYXNhciB9KSxcbiAgICAuLi4oY29tcGF0aWJpbGl0eSAmJiB7IGNvbXBhdGliaWxpdHkgfSksXG4gICAgZXhlUGF0aDogZW5zdXJlTm9uTnVsbGFibGUoZXhlUGF0aCksXG4gICAgdXNlckRhdGFEaXI6IGNyZWF0ZU93bmVkVXNlckRhdGFEaXIoKVxuICB9O1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYENvbm5lY3Rpb25gIGFuZCBgQ29udGVudC1MZW5ndGhgIGZyb20gYSBXZWJEcml2ZXIgcmVxdWVzdCdzIGhlYWRlcnMuXG4gKlxuICogVGhlIGJ1bmRsZWQgYHdlYmRyaXZlcmAgcGFja2FnZSBzZXRzIGJvdGggaGVhZGVycyBleHBsaWNpdGx5LiBUaGV5IGFyZVxuICogZm9yYmlkZGVuIHJlcXVlc3QgaGVhZGVycyBwZXIgdGhlIEZldGNoIHNwZWM6IE5vZGUgdXAgdG8gMjUgYWNjZXB0ZWQgdGhlbVxuICogc2lsZW50bHksIGJ1dCBOb2RlIDI2IHJlamVjdHMgdGhlbSB3aXRoIGBVTkRfRVJSX0lOVkFMSURfQVJHYCwgYnJlYWtpbmcgdGhlXG4gKiBBcHBpdW0gYC9zZXNzaW9uYCByZXF1ZXN0LiBUaGUgdHJhbnNwb3J0IGxheWVyIG1hbmFnZXMgY29ubmVjdGlvbiByZXVzZSBhbmRcbiAqIHRoZSBGZXRjaCBBUEkgY29tcHV0ZXMgYENvbnRlbnQtTGVuZ3RoYCBmcm9tIHRoZSBib2R5LCBzbyBkcm9wcGluZyBib3RoIGlzXG4gKiBzYWZlIG9uIGV2ZXJ5IE5vZGUgdmVyc2lvbi4gU2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vd2ViZHJpdmVyaW8vd2ViZHJpdmVyaW8vaXNzdWVzLzE1MjY1fS5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdE9wdGlvbnMgLSBUaGUgcmVxdWVzdCBvcHRpb25zIGFib3V0IHRvIGJlIHNlbnQgYnkgV2ViRHJpdmVySU8uXG4gKiBAcmV0dXJucyBUaGUgc2FtZSByZXF1ZXN0IG9wdGlvbnMgd2l0aCB0aGUgZm9yYmlkZGVuIGhlYWRlcnMgcmVtb3ZlZC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBGb3JiaWRkZW5GZXRjaEhlYWRlcnMocmVxdWVzdE9wdGlvbnM6IFJlcXVlc3RJbml0KTogUmVxdWVzdEluaXQge1xuICBpZiAocmVxdWVzdE9wdGlvbnMuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICByZXF1ZXN0T3B0aW9ucy5oZWFkZXJzLmRlbGV0ZSgnQ29ubmVjdGlvbicpO1xuICAgIHJlcXVlc3RPcHRpb25zLmhlYWRlcnMuZGVsZXRlKCdDb250ZW50LUxlbmd0aCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlcXVlc3RPcHRpb25zO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFB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c0JBQXNCO0FBQUEsRUFDbkk7QUFDQSxNQUFJLEtBQUssOEJBQThCLFFBQVc7QUFDaEQsY0FBVSxNQUFNLGtCQUFrQixLQUFLLHlCQUF5QjtBQUFBLEVBQ2xFO0FBRUEsUUFBTSxPQUFPLEtBQUssc0JBQXNCLFNBQ3BDLEtBQUssT0FDTCxFQUFFLE1BQU0sTUFBTSxpQkFBaUIsS0FBSyxpQkFBaUIsR0FBRyxTQUFTLEtBQUssa0JBQWtCO0FBRTVGLFNBQU87QUFBQSxJQUNMLEdBQUksUUFBUSxFQUFFLEtBQUs7QUFBQSxJQUNuQixHQUFJLGlCQUFpQixFQUFFLGNBQWM7QUFBQSxJQUNyQyxTQUFTLGtCQUFrQixPQUFPO0FBQUEsSUFDbEMsYUFBYSx1QkFBdUI7QUFBQSxFQUN0QztBQUNGO0FBZUEsU0FBUywyQkFBMkIsZ0JBQTBDO0FBQzVFLE1BQUksZUFBZSxtQkFBbUIsU0FBUztBQUM3QyxtQkFBZSxRQUFRLE9BQU8sWUFBWTtBQUMxQyxtQkFBZSxRQUFRLE9BQU8sZ0JBQWdCO0FBQUEsRUFDaEQ7QUFFQSxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbImtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcyJdCn0K
@@ -68,9 +68,11 @@ export interface ObsidianAndroidAppiumTransportOptions {
68
68
  * Whether the auto-started Appium server console window is shown.
69
69
  *
70
70
  * When `false` (the default), the `npx appium` server process is spawned with
71
- * its console window hidden (`windowsHide`), so it never steals focus. Ignored
72
- * when attaching to an already-running Appium server ({@link shouldAutoStartAppium}
73
- * `false`, or the server already reachable). Set `true` to see the server log window.
71
+ * its console window hidden (`windowsHide`) and its output discarded, so it
72
+ * neither steals focus nor writes to the invoking terminal. Ignored when
73
+ * attaching to an already-running Appium server ({@link shouldAutoStartAppium}
74
+ * `false`, or the server already reachable). Set `true` to see the server log window
75
+ * and its live output.
74
76
  *
75
77
  * @default `false`
76
78
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-integration-testing",
3
- "version": "8.1.1",
3
+ "version": "8.1.2",
4
4
  "description": "Simplifies integration testing of Obsidian plugins.",
5
5
  "keywords": [
6
6
  "obsidian",