oxygen-cli 1.40.2-beta.1 → 1.41.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1755 -1742
- package/LICENSE +672 -672
- package/README.md +37 -37
- package/build/core/OxygenCore.js +1 -1
- package/build/core/OxygenEvents.js +1 -1
- package/build/core/OxygenModule.js +1 -1
- package/build/core/OxygenService.js +1 -1
- package/build/core/OxygenSubModule.js +1 -1
- package/build/core/WebDriverModule.js +1 -1
- package/build/core/utils.js +1 -1
- package/build/errors/HookError.js +1 -1
- package/build/errors/ModuleError.js +1 -1
- package/build/errors/ModuleUnavailableError.js +1 -1
- package/build/errors/OxygenError.js +1 -1
- package/build/errors/ScriptNotFound.js +1 -1
- package/build/errors/helper.js +1 -1
- package/build/index.js +1 -1
- package/build/lib/cli-util.js +1 -1
- package/build/lib/cli.js +1 -1
- package/build/lib/debugger.js +1 -1
- package/build/lib/img-merge.js +1 -1
- package/build/lib/launcher.js +1 -1
- package/build/lib/logger.js +43 -43
- package/build/lib/moduleRequire.js +1 -1
- package/build/lib/parallel-launcher.js +1 -1
- package/build/lib/param-manager.js +1 -1
- package/build/lib/param-reader-csv.js +1 -1
- package/build/lib/param-reader-excel.js +1 -1
- package/build/lib/param-reader-json.js +1 -1
- package/build/lib/text-to-image.js +1 -1
- package/build/lib/util.js +1 -1
- package/build/model/case-result.js +1 -1
- package/build/model/failure.js +1 -1
- package/build/model/status.js +1 -1
- package/build/model/step-result.js +1 -1
- package/build/model/suite-result.js +1 -1
- package/build/model/test-result.js +1 -1
- package/build/model/testcase.js +1 -1
- package/build/model/testsuite.js +1 -1
- package/build/ox_modules/index.js +1 -1
- package/build/ox_modules/module-assert.js +37 -37
- package/build/ox_modules/module-date.js +24 -24
- package/build/ox_modules/module-db.js +52 -52
- package/build/ox_modules/module-email.js +59 -59
- package/build/ox_modules/module-eyes.js +34 -34
- package/build/ox_modules/module-http/ntlm-util.js +10 -10
- package/build/ox_modules/module-http/ntlm.js +15 -15
- package/build/ox_modules/module-http.js +132 -132
- package/build/ox_modules/module-log.js +27 -27
- package/build/ox_modules/module-mailinator.js +87 -87
- package/build/ox_modules/module-mob/commands/alertAccept.js +17 -17
- package/build/ox_modules/module-mob/commands/alertDismiss.js +17 -17
- package/build/ox_modules/module-mob/commands/assertAlert.js +20 -20
- package/build/ox_modules/module-mob/commands/assertText.js +21 -21
- package/build/ox_modules/module-mob/commands/assertTitle.js +19 -19
- package/build/ox_modules/module-mob/commands/assertValue.js +18 -18
- package/build/ox_modules/module-mob/commands/back.js +16 -16
- package/build/ox_modules/module-mob/commands/clear.js +19 -19
- package/build/ox_modules/module-mob/commands/click.js +17 -17
- package/build/ox_modules/module-mob/commands/clickHidden.js +17 -17
- package/build/ox_modules/module-mob/commands/clickLong.js +18 -18
- package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +18 -18
- package/build/ox_modules/module-mob/commands/closeApp.js +16 -16
- package/build/ox_modules/module-mob/commands/debug.js +16 -16
- package/build/ox_modules/module-mob/commands/dragAndDrop.js +19 -19
- package/build/ox_modules/module-mob/commands/enableNetwork.js +27 -27
- package/build/ox_modules/module-mob/commands/execute.js +21 -21
- package/build/ox_modules/module-mob/commands/findElement.js +20 -20
- package/build/ox_modules/module-mob/commands/findElements.js +23 -23
- package/build/ox_modules/module-mob/commands/getAlertText.js +17 -17
- package/build/ox_modules/module-mob/commands/getAppiumLogs.js +16 -16
- package/build/ox_modules/module-mob/commands/getBrowserLogs.js +16 -16
- package/build/ox_modules/module-mob/commands/getCurrentActivity.js +15 -15
- package/build/ox_modules/module-mob/commands/getCurrentPackage.js +15 -15
- package/build/ox_modules/module-mob/commands/getDeviceLogs.js +16 -16
- package/build/ox_modules/module-mob/commands/getDeviceTime.js +16 -16
- package/build/ox_modules/module-mob/commands/getLocation.js +20 -20
- package/build/ox_modules/module-mob/commands/getSource.js +16 -16
- package/build/ox_modules/module-mob/commands/getText.js +18 -18
- package/build/ox_modules/module-mob/commands/getTitle.js +13 -13
- package/build/ox_modules/module-mob/commands/getUrl.js +17 -17
- package/build/ox_modules/module-mob/commands/getValue.js +18 -18
- package/build/ox_modules/module-mob/commands/getWindowHandles.js +17 -17
- package/build/ox_modules/module-mob/commands/hideKeyboard.js +21 -21
- package/build/ox_modules/module-mob/commands/index.js +1 -1
- package/build/ox_modules/module-mob/commands/installApp.js +16 -16
- package/build/ox_modules/module-mob/commands/isAppInstalled.js +16 -16
- package/build/ox_modules/module-mob/commands/isCheckable.js +18 -18
- package/build/ox_modules/module-mob/commands/isChecked.js +18 -18
- package/build/ox_modules/module-mob/commands/isClickable.js +18 -18
- package/build/ox_modules/module-mob/commands/isExist.js +19 -19
- package/build/ox_modules/module-mob/commands/isSelected.js +23 -23
- package/build/ox_modules/module-mob/commands/isVisible.js +19 -19
- package/build/ox_modules/module-mob/commands/isWebViewContext.js +16 -16
- package/build/ox_modules/module-mob/commands/launchApp.js +15 -15
- package/build/ox_modules/module-mob/commands/longPressKeyCode.js +18 -18
- package/build/ox_modules/module-mob/commands/open.js +17 -17
- package/build/ox_modules/module-mob/commands/pause.js +16 -16
- package/build/ox_modules/module-mob/commands/removeApp.js +16 -16
- package/build/ox_modules/module-mob/commands/resetApp.js +15 -15
- package/build/ox_modules/module-mob/commands/scrollIntoElement.js +22 -22
- package/build/ox_modules/module-mob/commands/scrollIntoView.js +27 -27
- package/build/ox_modules/module-mob/commands/select.js +24 -24
- package/build/ox_modules/module-mob/commands/selectFrame.js +23 -23
- package/build/ox_modules/module-mob/commands/selectWindow.js +28 -28
- package/build/ox_modules/module-mob/commands/sendKeys.js +29 -29
- package/build/ox_modules/module-mob/commands/setContext.js +16 -16
- package/build/ox_modules/module-mob/commands/setNativeContext.js +15 -15
- package/build/ox_modules/module-mob/commands/setTimeout.js +21 -21
- package/build/ox_modules/module-mob/commands/setWebViewContext.js +16 -16
- package/build/ox_modules/module-mob/commands/shake.js +16 -16
- package/build/ox_modules/module-mob/commands/smsClickLink.js +19 -19
- package/build/ox_modules/module-mob/commands/smsGetText.js +20 -20
- package/build/ox_modules/module-mob/commands/swipe.js +20 -20
- package/build/ox_modules/module-mob/commands/swipeElement.js +20 -20
- package/build/ox_modules/module-mob/commands/swipeScreen.js +20 -20
- package/build/ox_modules/module-mob/commands/takeScreenshot.js +17 -17
- package/build/ox_modules/module-mob/commands/tap.js +17 -17
- package/build/ox_modules/module-mob/commands/type.js +20 -20
- package/build/ox_modules/module-mob/commands/unlockPattern.js +22 -22
- package/build/ox_modules/module-mob/commands/waitForExist.js +18 -18
- package/build/ox_modules/module-mob/commands/waitForInteractable.js +17 -17
- package/build/ox_modules/module-mob/commands/waitForVisible.js +17 -17
- package/build/ox_modules/module-mob.js +74 -74
- package/build/ox_modules/module-mongo.js +82 -82
- package/build/ox_modules/module-pdf.js +35 -35
- package/build/ox_modules/module-proxy.js +77 -77
- package/build/ox_modules/module-serial.js +55 -55
- package/build/ox_modules/module-shell.js +52 -33
- package/build/ox_modules/module-soap.js +72 -72
- package/build/ox_modules/module-twilio.js +41 -41
- package/build/ox_modules/module-utils.js +91 -91
- package/build/ox_modules/module-web/commands/alertAccept.js +17 -17
- package/build/ox_modules/module-web/commands/alertDismiss.js +17 -17
- package/build/ox_modules/module-web/commands/assertAlert.js +20 -20
- package/build/ox_modules/module-web/commands/assertExist.js +17 -17
- package/build/ox_modules/module-web/commands/assertSelectedLabel.js +21 -21
- package/build/ox_modules/module-web/commands/assertSelectedValue.js +21 -21
- package/build/ox_modules/module-web/commands/assertText.js +21 -21
- package/build/ox_modules/module-web/commands/assertTextNotPresent.js +18 -18
- package/build/ox_modules/module-web/commands/assertTextPresent.js +18 -18
- package/build/ox_modules/module-web/commands/assertTitle.js +19 -19
- package/build/ox_modules/module-web/commands/assertValue.js +20 -20
- package/build/ox_modules/module-web/commands/back.js +16 -16
- package/build/ox_modules/module-web/commands/clear.js +18 -18
- package/build/ox_modules/module-web/commands/click.js +25 -25
- package/build/ox_modules/module-web/commands/clickHidden.js +23 -23
- package/build/ox_modules/module-web/commands/closeWindow.js +15 -15
- package/build/ox_modules/module-web/commands/debug.js +15 -15
- package/build/ox_modules/module-web/commands/deleteCookies.js +12 -12
- package/build/ox_modules/module-web/commands/deselect.js +22 -22
- package/build/ox_modules/module-web/commands/doubleClick.js +17 -17
- package/build/ox_modules/module-web/commands/dragAndDrop.js +20 -20
- package/build/ox_modules/module-web/commands/execute.js +24 -24
- package/build/ox_modules/module-web/commands/fileBrowse.js +18 -18
- package/build/ox_modules/module-web/commands/findElement.js +19 -19
- package/build/ox_modules/module-web/commands/findElements.js +22 -22
- package/build/ox_modules/module-web/commands/fullscreenWindow.js +14 -14
- package/build/ox_modules/module-web/commands/getAlertText.js +16 -16
- package/build/ox_modules/module-web/commands/getAttribute.js +19 -19
- package/build/ox_modules/module-web/commands/getBrowserLogs.js +17 -17
- package/build/ox_modules/module-web/commands/getCookies.js +13 -13
- package/build/ox_modules/module-web/commands/getCssValue.js +19 -19
- package/build/ox_modules/module-web/commands/getElementCount.js +17 -17
- package/build/ox_modules/module-web/commands/getHTML.js +17 -17
- package/build/ox_modules/module-web/commands/getSource.js +16 -16
- package/build/ox_modules/module-web/commands/getText.js +18 -18
- package/build/ox_modules/module-web/commands/getTitle.js +12 -12
- package/build/ox_modules/module-web/commands/getUrl.js +16 -16
- package/build/ox_modules/module-web/commands/getValue.js +18 -18
- package/build/ox_modules/module-web/commands/getWindowHandles.js +16 -16
- package/build/ox_modules/module-web/commands/getWindowSize.js +16 -16
- package/build/ox_modules/module-web/commands/getXMLPageSource.js +16 -16
- package/build/ox_modules/module-web/commands/index.js +1 -1
- package/build/ox_modules/module-web/commands/isAlertPresent.js +16 -16
- package/build/ox_modules/module-web/commands/isChecked.js +18 -18
- package/build/ox_modules/module-web/commands/isExist.js +19 -19
- package/build/ox_modules/module-web/commands/isInteractable.js +22 -22
- package/build/ox_modules/module-web/commands/isSelected.js +23 -23
- package/build/ox_modules/module-web/commands/isVisible.js +19 -19
- package/build/ox_modules/module-web/commands/makeVisible.js +25 -25
- package/build/ox_modules/module-web/commands/maximizeWindow.js +14 -14
- package/build/ox_modules/module-web/commands/minimizeWindow.js +14 -14
- package/build/ox_modules/module-web/commands/mock.js +20 -20
- package/build/ox_modules/module-web/commands/mockClearAll.js +12 -12
- package/build/ox_modules/module-web/commands/mockRestoreAll.js +12 -12
- package/build/ox_modules/module-web/commands/newWindow.js +16 -16
- package/build/ox_modules/module-web/commands/open.js +16 -16
- package/build/ox_modules/module-web/commands/pause.js +15 -15
- package/build/ox_modules/module-web/commands/point.js +21 -21
- package/build/ox_modules/module-web/commands/pointJS.js +15 -15
- package/build/ox_modules/module-web/commands/refresh.js +15 -15
- package/build/ox_modules/module-web/commands/rightClick.js +17 -17
- package/build/ox_modules/module-web/commands/rightClickActions.js +19 -19
- package/build/ox_modules/module-web/commands/scrollToElement.js +21 -21
- package/build/ox_modules/module-web/commands/select.js +23 -23
- package/build/ox_modules/module-web/commands/selectFrame.js +24 -24
- package/build/ox_modules/module-web/commands/selectWindow.js +27 -27
- package/build/ox_modules/module-web/commands/sendKeys.js +22 -22
- package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +20 -20
- package/build/ox_modules/module-web/commands/setTimeout.js +21 -21
- package/build/ox_modules/module-web/commands/setWindowSize.js +17 -17
- package/build/ox_modules/module-web/commands/takeScreenshot.js +17 -17
- package/build/ox_modules/module-web/commands/type.js +20 -20
- package/build/ox_modules/module-web/commands/verifyAlert.js +20 -20
- package/build/ox_modules/module-web/commands/verifyExist.js +17 -17
- package/build/ox_modules/module-web/commands/verifySelectedLabel.js +21 -21
- package/build/ox_modules/module-web/commands/verifySelectedValue.js +21 -21
- package/build/ox_modules/module-web/commands/verifyText.js +21 -21
- package/build/ox_modules/module-web/commands/verifyTextNotPresent.js +18 -18
- package/build/ox_modules/module-web/commands/verifyTextPresent.js +18 -18
- package/build/ox_modules/module-web/commands/verifyTitle.js +19 -19
- package/build/ox_modules/module-web/commands/verifyValue.js +20 -20
- package/build/ox_modules/module-web/commands/waitForAngular.js +19 -19
- package/build/ox_modules/module-web/commands/waitForExist.js +17 -17
- package/build/ox_modules/module-web/commands/waitForInteractable.js +17 -17
- package/build/ox_modules/module-web/commands/waitForNotExist.js +17 -17
- package/build/ox_modules/module-web/commands/waitForNotText.js +20 -20
- package/build/ox_modules/module-web/commands/waitForNotValue.js +20 -20
- package/build/ox_modules/module-web/commands/waitForText.js +20 -20
- package/build/ox_modules/module-web/commands/waitForValue.js +20 -20
- package/build/ox_modules/module-web/commands/waitForVisible.js +17 -17
- package/build/ox_modules/module-web/commands/waitForWindow.js +22 -22
- package/build/ox_modules/module-web.js +94 -94
- package/build/ox_modules/module-win/commands/assertText.js +17 -17
- package/build/ox_modules/module-win/commands/assertTitle.js +15 -15
- package/build/ox_modules/module-win/commands/assertValue.js +14 -14
- package/build/ox_modules/module-win/commands/back.js +11 -11
- package/build/ox_modules/module-win/commands/clear.js +13 -13
- package/build/ox_modules/module-win/commands/click.js +13 -13
- package/build/ox_modules/module-win/commands/clickLong.js +14 -14
- package/build/ox_modules/module-win/commands/clickMultipleTimes.js +14 -14
- package/build/ox_modules/module-win/commands/findElement.js +15 -15
- package/build/ox_modules/module-win/commands/findElements.js +15 -15
- package/build/ox_modules/module-win/commands/getAppiumLogs.js +12 -12
- package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +15 -15
- package/build/ox_modules/module-win/commands/getLocation.js +14 -14
- package/build/ox_modules/module-win/commands/getSource.js +12 -12
- package/build/ox_modules/module-win/commands/getText.js +14 -14
- package/build/ox_modules/module-win/commands/getValue.js +14 -14
- package/build/ox_modules/module-win/commands/getWindowHandles.js +15 -15
- package/build/ox_modules/module-win/commands/index.js +1 -1
- package/build/ox_modules/module-win/commands/isCheckable.js +14 -14
- package/build/ox_modules/module-win/commands/isChecked.js +14 -14
- package/build/ox_modules/module-win/commands/isClickable.js +14 -14
- package/build/ox_modules/module-win/commands/isExist.js +15 -15
- package/build/ox_modules/module-win/commands/isSelected.js +14 -14
- package/build/ox_modules/module-win/commands/isVisible.js +15 -15
- package/build/ox_modules/module-win/commands/open.js +13 -13
- package/build/ox_modules/module-win/commands/pause.js +12 -12
- package/build/ox_modules/module-win/commands/rightClick.js +13 -13
- package/build/ox_modules/module-win/commands/selectWindow.js +23 -23
- package/build/ox_modules/module-win/commands/sendKeys.js +22 -22
- package/build/ox_modules/module-win/commands/setTimeout.js +17 -17
- package/build/ox_modules/module-win/commands/takeScreenshot.js +16 -16
- package/build/ox_modules/module-win/commands/tap.js +13 -13
- package/build/ox_modules/module-win/commands/type.js +16 -16
- package/build/ox_modules/module-win/commands/waitForExist.js +14 -14
- package/build/ox_modules/module-win/commands/waitForInteractable.js +16 -16
- package/build/ox_modules/module-win/commands/waitForVisible.js +13 -13
- package/build/ox_modules/module-win.js +47 -47
- package/build/ox_modules/utils.js +8 -8
- package/build/ox_reporters/excel/template.json +48 -48
- package/build/ox_reporters/html/index.ejs +163 -163
- package/build/ox_reporters/html/summary.ejs +77 -77
- package/build/ox_reporters/html/tests-details.ejs +134 -134
- package/build/ox_reporters/html/tests-devices-browsers.ejs +83 -83
- package/build/ox_reporters/reporter-excel.js +1 -1
- package/build/ox_reporters/reporter-html.js +1 -1
- package/build/ox_reporters/reporter-json.js +1 -1
- package/build/ox_reporters/reporter-junit.js +1 -1
- package/build/ox_reporters/reporter-pdf.js +1 -1
- package/build/ox_reporters/reporter-rp.js +73 -42
- package/build/ox_reporters/reporter-xml.js +1 -1
- package/build/ox_services/service-devtools/submodule-network.js +1 -1
- package/build/ox_services/service-devtools.js +1 -1
- package/build/reporter/FileReporterBase.js +1 -1
- package/build/reporter/ReportAggregator.js +1 -1
- package/build/reporter/ReporterBase.js +1 -1
- package/build/reporter/WebSocketReporter.js +1 -1
- package/build/runners/WorkerProcess.js +1 -1
- package/build/runners/cucumber/CucumberEventListener.js +1 -1
- package/build/runners/cucumber/CucumberReporter.js +1 -1
- package/build/runners/cucumber/CucumberWorker.js +1 -1
- package/build/runners/cucumber/index.js +1 -1
- package/build/runners/cucumber/worker.js +1 -1
- package/build/runners/index.js +1 -1
- package/build/runners/oxygen/OxygenWorker.js +1 -1
- package/build/runners/oxygen/index.js +1 -1
- package/build/runners/oxygen/worker.js +1 -1
- package/config/default.json +6 -6
- package/package.json +139 -139
- package/types/index.d.ts +70 -70
- package/types/module-eyes.d.ts +39 -39
- package/types/module-http.d.ts +163 -163
- package/types/module-log.d.ts +34 -34
- package/types/module-mob.d.ts +966 -966
- package/types/module-pdf.d.ts +40 -40
- package/types/module-proxy.d.ts +100 -100
- package/types/module-shell.d.ts +24 -24
- package/types/module-utils.d.ts +99 -99
- package/types/module-web.d.ts +1053 -1053
- package/types/module-win.d.ts +352 -352
- package/types/oxygen.d.ts +53 -53
- package/log.txt +0 -1614
- package/reports/2025-06-08_231627/report.html +0 -440
- package/reports/2025-06-09_223615/report.html +0 -440
- package/transpiled/mongodb/etc/prepare.js +0 -18
- package/transpiled/mongodb/lib/admin.js +0 -182
- package/transpiled/mongodb/lib/beta.js +0 -26
- package/transpiled/mongodb/lib/bson.js +0 -220
- package/transpiled/mongodb/lib/bulk/common.js +0 -1041
- package/transpiled/mongodb/lib/bulk/ordered.js +0 -76
- package/transpiled/mongodb/lib/bulk/unordered.js +0 -102
- package/transpiled/mongodb/lib/change_stream.js +0 -517
- package/transpiled/mongodb/lib/client-side-encryption/auto_encrypter.js +0 -329
- package/transpiled/mongodb/lib/client-side-encryption/client_encryption.js +0 -779
- package/transpiled/mongodb/lib/client-side-encryption/crypto_callbacks.js +0 -95
- package/transpiled/mongodb/lib/client-side-encryption/errors.js +0 -171
- package/transpiled/mongodb/lib/client-side-encryption/mongocryptd_manager.js +0 -98
- package/transpiled/mongodb/lib/client-side-encryption/providers/aws.js +0 -34
- package/transpiled/mongodb/lib/client-side-encryption/providers/azure.js +0 -186
- package/transpiled/mongodb/lib/client-side-encryption/providers/gcp.js +0 -29
- package/transpiled/mongodb/lib/client-side-encryption/providers/index.js +0 -58
- package/transpiled/mongodb/lib/client-side-encryption/state_machine.js +0 -505
- package/transpiled/mongodb/lib/cmap/auth/auth_provider.js +0 -63
- package/transpiled/mongodb/lib/cmap/auth/aws_temporary_credentials.js +0 -167
- package/transpiled/mongodb/lib/cmap/auth/gssapi.js +0 -207
- package/transpiled/mongodb/lib/cmap/auth/mongo_credentials.js +0 -193
- package/transpiled/mongodb/lib/cmap/auth/mongodb_aws.js +0 -181
- package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/automated_callback_workflow.js +0 -101
- package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/azure_machine_workflow.js +0 -81
- package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/callback_workflow.js +0 -174
- package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/command_builders.js +0 -59
- package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/gcp_machine_workflow.js +0 -58
- package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/human_callback_workflow.js +0 -138
- package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/k8s_machine_workflow.js +0 -42
- package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/token_cache.js +0 -71
- package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc/token_machine_workflow.js +0 -34
- package/transpiled/mongodb/lib/cmap/auth/mongodb_oidc.js +0 -111
- package/transpiled/mongodb/lib/cmap/auth/plain.js +0 -43
- package/transpiled/mongodb/lib/cmap/auth/providers.js +0 -22
- package/transpiled/mongodb/lib/cmap/auth/scram.js +0 -318
- package/transpiled/mongodb/lib/cmap/auth/x509.js +0 -61
- package/transpiled/mongodb/lib/cmap/command_monitoring_events.js +0 -266
- package/transpiled/mongodb/lib/cmap/commands.js +0 -605
- package/transpiled/mongodb/lib/cmap/connect.js +0 -418
- package/transpiled/mongodb/lib/cmap/connection.js +0 -673
- package/transpiled/mongodb/lib/cmap/connection_pool.js +0 -688
- package/transpiled/mongodb/lib/cmap/connection_pool_events.js +0 -254
- package/transpiled/mongodb/lib/cmap/errors.js +0 -128
- package/transpiled/mongodb/lib/cmap/handshake/client_metadata.js +0 -278
- package/transpiled/mongodb/lib/cmap/metrics.js +0 -67
- package/transpiled/mongodb/lib/cmap/stream_description.js +0 -74
- package/transpiled/mongodb/lib/cmap/wire_protocol/compression.js +0 -196
- package/transpiled/mongodb/lib/cmap/wire_protocol/constants.js +0 -19
- package/transpiled/mongodb/lib/cmap/wire_protocol/on_data.js +0 -144
- package/transpiled/mongodb/lib/cmap/wire_protocol/on_demand/document.js +0 -278
- package/transpiled/mongodb/lib/cmap/wire_protocol/responses.js +0 -376
- package/transpiled/mongodb/lib/cmap/wire_protocol/shared.js +0 -49
- package/transpiled/mongodb/lib/collection.js +0 -852
- package/transpiled/mongodb/lib/connection_string.js +0 -1452
- package/transpiled/mongodb/lib/constants.js +0 -162
- package/transpiled/mongodb/lib/cursor/abstract_cursor.js +0 -1082
- package/transpiled/mongodb/lib/cursor/aggregation_cursor.js +0 -227
- package/transpiled/mongodb/lib/cursor/change_stream_cursor.js +0 -136
- package/transpiled/mongodb/lib/cursor/client_bulk_write_cursor.js +0 -69
- package/transpiled/mongodb/lib/cursor/find_cursor.js +0 -476
- package/transpiled/mongodb/lib/cursor/list_collections_cursor.js +0 -48
- package/transpiled/mongodb/lib/cursor/list_indexes_cursor.js +0 -46
- package/transpiled/mongodb/lib/cursor/list_search_indexes_cursor.js +0 -30
- package/transpiled/mongodb/lib/cursor/run_command_cursor.js +0 -125
- package/transpiled/mongodb/lib/db.js +0 -467
- package/transpiled/mongodb/lib/deps.js +0 -174
- package/transpiled/mongodb/lib/encrypter.js +0 -129
- package/transpiled/mongodb/lib/error.js +0 -1550
- package/transpiled/mongodb/lib/explain.js +0 -122
- package/transpiled/mongodb/lib/gridfs/download.js +0 -369
- package/transpiled/mongodb/lib/gridfs/index.js +0 -240
- package/transpiled/mongodb/lib/gridfs/upload.js +0 -446
- package/transpiled/mongodb/lib/index.js +0 -975
- package/transpiled/mongodb/lib/mongo_client.js +0 -626
- package/transpiled/mongodb/lib/mongo_client_auth_providers.js +0 -98
- package/transpiled/mongodb/lib/mongo_logger.js +0 -812
- package/transpiled/mongodb/lib/mongo_types.js +0 -71
- package/transpiled/mongodb/lib/operations/aggregate.js +0 -129
- package/transpiled/mongodb/lib/operations/bulk_write.js +0 -48
- package/transpiled/mongodb/lib/operations/client_bulk_write/client_bulk_write.js +0 -96
- package/transpiled/mongodb/lib/operations/client_bulk_write/command_builder.js +0 -409
- package/transpiled/mongodb/lib/operations/client_bulk_write/common.js +0 -5
- package/transpiled/mongodb/lib/operations/client_bulk_write/executor.js +0 -144
- package/transpiled/mongodb/lib/operations/client_bulk_write/results_merger.js +0 -228
- package/transpiled/mongodb/lib/operations/collections.js +0 -49
- package/transpiled/mongodb/lib/operations/command.js +0 -102
- package/transpiled/mongodb/lib/operations/count.js +0 -60
- package/transpiled/mongodb/lib/operations/create_collection.js +0 -109
- package/transpiled/mongodb/lib/operations/delete.js +0 -134
- package/transpiled/mongodb/lib/operations/distinct.js +0 -77
- package/transpiled/mongodb/lib/operations/drop.js +0 -102
- package/transpiled/mongodb/lib/operations/estimated_document_count.js +0 -47
- package/transpiled/mongodb/lib/operations/execute_operation.js +0 -251
- package/transpiled/mongodb/lib/operations/find.js +0 -197
- package/transpiled/mongodb/lib/operations/find_and_modify.js +0 -191
- package/transpiled/mongodb/lib/operations/get_more.js +0 -84
- package/transpiled/mongodb/lib/operations/indexes.js +0 -197
- package/transpiled/mongodb/lib/operations/insert.js +0 -138
- package/transpiled/mongodb/lib/operations/is_capped.js +0 -44
- package/transpiled/mongodb/lib/operations/kill_cursors.js +0 -58
- package/transpiled/mongodb/lib/operations/list_collections.js +0 -66
- package/transpiled/mongodb/lib/operations/list_databases.js +0 -56
- package/transpiled/mongodb/lib/operations/operation.js +0 -88
- package/transpiled/mongodb/lib/operations/options_operation.js +0 -44
- package/transpiled/mongodb/lib/operations/profiling_level.js +0 -42
- package/transpiled/mongodb/lib/operations/remove_user.js +0 -35
- package/transpiled/mongodb/lib/operations/rename.js +0 -48
- package/transpiled/mongodb/lib/operations/run_command.js +0 -64
- package/transpiled/mongodb/lib/operations/search_indexes/create.js +0 -41
- package/transpiled/mongodb/lib/operations/search_indexes/drop.js +0 -51
- package/transpiled/mongodb/lib/operations/search_indexes/update.js +0 -40
- package/transpiled/mongodb/lib/operations/set_profiling_level.js +0 -70
- package/transpiled/mongodb/lib/operations/stats.js +0 -39
- package/transpiled/mongodb/lib/operations/update.js +0 -218
- package/transpiled/mongodb/lib/operations/validate_collection.js +0 -49
- package/transpiled/mongodb/lib/read_concern.js +0 -92
- package/transpiled/mongodb/lib/read_preference.js +0 -215
- package/transpiled/mongodb/lib/resource_management.js +0 -74
- package/transpiled/mongodb/lib/sdam/common.js +0 -53
- package/transpiled/mongodb/lib/sdam/events.js +0 -177
- package/transpiled/mongodb/lib/sdam/monitor.js +0 -656
- package/transpiled/mongodb/lib/sdam/server.js +0 -463
- package/transpiled/mongodb/lib/sdam/server_description.js +0 -196
- package/transpiled/mongodb/lib/sdam/server_selection.js +0 -283
- package/transpiled/mongodb/lib/sdam/server_selection_events.js +0 -112
- package/transpiled/mongodb/lib/sdam/srv_polling.js +0 -139
- package/transpiled/mongodb/lib/sdam/topology.js +0 -833
- package/transpiled/mongodb/lib/sdam/topology_description.js +0 -447
- package/transpiled/mongodb/lib/sessions.js +0 -988
- package/transpiled/mongodb/lib/sort.js +0 -123
- package/transpiled/mongodb/lib/timeout.js +0 -349
- package/transpiled/mongodb/lib/transactions.js +0 -149
- package/transpiled/mongodb/lib/utils.js +0 -1502
- package/transpiled/mongodb/lib/write_concern.js +0 -115
package/README.md
CHANGED
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
Oxygen
|
|
2
|
-
=======
|
|
3
|
-
|
|
4
|
-
Oxygen is an open source framework and tool-set built on top of Appium, WebdriverIO, and Selenium that significantly simplifies writing and running automation tests. It implements many commonly recurring patterns out-of-the-box and hides complexities of the aforementioned backends behind a concise API.
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
## Supported Platforms
|
|
8
|
-
|
|
9
|
-
* Android - Native, Hybrid, and Web
|
|
10
|
-
* iOS - Native, Hybrid, and Web
|
|
11
|
-
* Windows - Chrome, Internet Explorer
|
|
12
|
-
* Linux - Chrome
|
|
13
|
-
* OS X - Chrome
|
|
14
|
-
|
|
15
|
-
## Installation
|
|
16
|
-
```shell
|
|
17
|
-
npm install -g oxygen-cli
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
## OS Specific requirements for building:
|
|
21
|
-
|
|
22
|
-
#### Windows:
|
|
23
|
-
* ```npm --add-python-to-path='true' --debug install --global windows-build-tools``` from ```cmd``` with admin rights.
|
|
24
|
-
* [Optional. Required for DB support] Windows SDK
|
|
25
|
-
|
|
26
|
-
#### Linux
|
|
27
|
-
* [Optional. Required for DB support] unixodbc binaries and development libraries:
|
|
28
|
-
Debian/Ubuntu - `sudo apt-get install unixodbc unixodbc-dev`
|
|
29
|
-
RedHat/CentOS - `sudo dnf install unixODBC unixODBC-devel`
|
|
30
|
-
|
|
31
|
-
#### OS X
|
|
32
|
-
* [Optional. Required for DB support] unixodbc binaries and development libraries: `brew install unixodbc`
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
## Getting Started
|
|
36
|
-
|
|
37
|
-
See the documentation at [docs.oxygenhq.org](http://docs.oxygenhq.org)
|
|
1
|
+
Oxygen
|
|
2
|
+
=======
|
|
3
|
+
|
|
4
|
+
Oxygen is an open source framework and tool-set built on top of Appium, WebdriverIO, and Selenium that significantly simplifies writing and running automation tests. It implements many commonly recurring patterns out-of-the-box and hides complexities of the aforementioned backends behind a concise API.
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
## Supported Platforms
|
|
8
|
+
|
|
9
|
+
* Android - Native, Hybrid, and Web
|
|
10
|
+
* iOS - Native, Hybrid, and Web
|
|
11
|
+
* Windows - Chrome, Internet Explorer
|
|
12
|
+
* Linux - Chrome
|
|
13
|
+
* OS X - Chrome
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
```shell
|
|
17
|
+
npm install -g oxygen-cli
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## OS Specific requirements for building:
|
|
21
|
+
|
|
22
|
+
#### Windows:
|
|
23
|
+
* ```npm --add-python-to-path='true' --debug install --global windows-build-tools``` from ```cmd``` with admin rights.
|
|
24
|
+
* [Optional. Required for DB support] Windows SDK
|
|
25
|
+
|
|
26
|
+
#### Linux
|
|
27
|
+
* [Optional. Required for DB support] unixodbc binaries and development libraries:
|
|
28
|
+
Debian/Ubuntu - `sudo apt-get install unixodbc unixodbc-dev`
|
|
29
|
+
RedHat/CentOS - `sudo dnf install unixODBC unixODBC-devel`
|
|
30
|
+
|
|
31
|
+
#### OS X
|
|
32
|
+
* [Optional. Required for DB support] unixodbc binaries and development libraries: `brew install unixodbc`
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
## Getting Started
|
|
36
|
+
|
|
37
|
+
See the documentation at [docs.oxygenhq.org](http://docs.oxygenhq.org)
|
package/build/core/OxygenCore.js
CHANGED
|
@@ -1075,4 +1075,4 @@ class Oxygen extends _OxygenEvents.default {
|
|
|
1075
1075
|
}
|
|
1076
1076
|
|
|
1077
1077
|
exports.default = Oxygen;
|
|
1078
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL094eWdlbkNvcmUuanMiXSwibmFtZXMiOlsidjEiLCJyZXF1aXJlIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnbG9iYWwiLCJnZXQiLCJvcmlnIiwiRXJyb3IiLCJwcmVwYXJlU3RhY2tUcmFjZSIsIl8iLCJzdGFjayIsImVyciIsImNhcHR1cmVTdGFja1RyYWNlIiwiREVGQVVMVF9USU1FT1VUIiwiREVGQVVMVF9PUFRTIiwiYmFja3RyYWNlIiwiY29tcGlsZXIiLCJmYWlsQW1iaWd1b3VzRGVmaW5pdGlvbnMiLCJmYWlsRmFzdCIsImlnbm9yZVVuZGVmaW5lZERlZmluaXRpb25zIiwibmFtZSIsInByb2ZpbGUiLCJvcmRlciIsInNuaXBwZXRTeW50YXgiLCJ1bmRlZmluZWQiLCJzbmlwcGV0cyIsInNvdXJjZSIsInN0cmljdCIsInRhZ0V4cHJlc3Npb24iLCJ0YWdzSW5UaXRsZSIsInRpbWVvdXQiLCJNT0RVTEVfTkFNRV9NQVRDSF9SRUdFWCIsIlNFUlZJQ0VfTkFNRV9NQVRDSF9SRUdFWCIsIkRPX05PVF9XUkFQX01FVEhPRFMiLCJERUZBVUxUX0NUWCIsInBhcmFtcyIsInZhcnMiLCJlbnYiLCJjYXBzIiwiYXR0cmlidXRlcyIsIkRFRkFVTFRfUkVTVUxUX1NUT1JFIiwic3RlcHMiLCJsb2dzIiwiYXR0YWNobWVudHMiLCJoYXIiLCJPeHlnZW4iLCJPeHlnZW5FdmVudHMiLCJjb25zdHJ1Y3RvciIsImlzSW5pdGlhbGl6ZWQiLCJyZXN1bHRTdG9yZSIsImN0eCIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsInJlcG8iLCJjYXBhYmlsaXRpZXMiLCJvcHRzIiwib3hCYXNlRGlyIiwicGF0aCIsImpvaW4iLCJfX2Rpcm5hbWUiLCJsb2dnZXIiLCJfd3JhcExvZ2dlciIsIl93YWl0U3RlcFJlc3VsdExpc3QiLCJpbml0Iiwib3B0aW9ucyIsInJlc3VsdHMiLCJhc3NpZ24iLCJjd2QiLCJwcm9jZXNzIiwia2V5cyIsImxlbmd0aCIsIm1ha2VPeEdsb2JhbCIsIl9sb2FkU2VydmljZXMiLCJfbG9hZE1vZHVsZXMiLCJnbG9iYWxTY29wZSIsIm1ha2VDb250ZXh0QW5kTW9kdWxlc0dsb2JhbCIsImRpc3Bvc2VNb2R1bGVzIiwic3RhdHVzIiwiX2Rpc3Bvc2VNb2R1bGVzIiwiZSIsImNvbnNvbGUiLCJlcnJvciIsImRpc3Bvc2UiLCJfZGlzcG9zZVNlcnZpY2VzIiwiYWRqdXN0U2NyaXB0TGluZSIsImlzSW5EZWJ1Z01vZGUiLCJveHV0aWwiLCJyZXN1bHQiLCJjb250ZXh0Iiwib3giLCJyZXBvc2l0b3J5IiwidHJhbnNTdGVwIiwiaW5jbHVkZXMiLCJ0cmFuc05hbWUiLCJ0cmFuc2FjdGlvbiIsImR1cmF0aW9uIiwic3RlcCIsImVuZFRpbWUiLCJTVEFUVVMiLCJXQVJOSU5HIiwiZ2V0TW9kdWxlc0NhcGFiaWxpdGllcyIsIm1vZENhcHMiLCJtb2R1bGVOYW1lIiwibW9kdWxlIiwiX2dldENhcGFiaWxpdGllcyIsInJlc2V0UmVzdWx0cyIsIm9uQmVmb3JlQ2FzZSIsIl9pdGVyYXRpb25TdGFydCIsIm9uQWZ0ZXJDYXNlIiwiX2l0ZXJhdGlvbkVuZCIsImFkZEF0dHJpYnV0ZSIsImJpbmQiLCJhZGRBdHRhY2htZW50IiwidmFsdWUiLCJPeEVycm9yIiwiZXJyb3JIZWxwZXIiLCJlcnJvckNvZGUiLCJTQ1JJUFRfRVJST1IiLCJmaWxlUGF0aCIsImZzIiwiZXhpc3RzU3luYyIsInB1c2giLCJjb3JlVXRpbHMiLCJuZXdGaWxlQXR0YWNobWVudCIsImxvYWRQYWdlT2JqZWN0RmlsZSIsInBvUGF0aCIsInBvIiwiX2xvZ2dlciIsImxvZ2dlcldyYXAiLCJpbmZvIiwiYXJncyIsIl9sb2ciLCJkZWJ1ZyIsIndhcm4iLCJ1c2VySW5mbyIsIklTU1VFUlMiLCJVU0VSIiwidXNlckRlYnVnIiwidXNlckVycm9yIiwidXNlcldhcm4iLCJsZXZlbCIsInNyYyIsIkRFRkFVTFRfTE9HR0VSX0lTU1VFUiIsImFwcGx5IiwibWVzc2FnZSIsInN0cmluZ2lmeSIsInRpbWUiLCJnZXRUaW1lU3RhbXAiLCJ0b1VwcGVyQ2FzZSIsIm1zZyIsInNoaWZ0IiwiZW1pdExvZyIsIm94U2VydmljZXNEaXJQYXRoIiwicmVzb2x2ZSIsInNlcnZpY2VGaWxlcyIsImdsb2IiLCJzeW5jIiwiaSIsInNlcnZpY2VGaWxlTmFtZSIsInNlcnZpY2VGaWxlUGF0aCIsIm1hdGNoIiwic2VydmljZU5hbWUiLCJBcnJheSIsImlzQXJyYXkiLCJzZXJ2aWNlIiwiX2xvYWRTZXJ2aWNlIiwiRU9MIiwic3RhY2t0cmFjZSIsInNlcnZpY2VQYXRoIiwiU2VydmljZUNsYXNzIiwiZGVmYXVsdCIsInNlcnZpY2VMb2dnZXIiLCJfbG9hZEludGVybmFsTW9kdWxlcyIsIl9sb2FkRXh0ZXJuYWxNb2R1bGVzIiwibW9kdWxlc0ZvbGRlclBhdGgiLCJtb2R1bGVzX2V4dCIsIm94TW9kdWxlc0RpclBhdGgiLCJtb2R1bGVGaWxlcyIsImZvckVhY2giLCJtb2R1bGVGaWxlTmFtZSIsInN0YXJ0VGltZSIsIkRhdGUiLCJtb2R1bGVMb2dnZXIiLCJtb2QiLCJsb2FkTW9kdWxlRnJvbUZpbGUiLCJfY2FsbFNlcnZpY2VzT25Nb2R1bGVMb2FkZWQiLCJfd3JhcE1vZHVsZSIsImV4Y2x1ZGVVbmRlZmluZWRNb2RzIiwiTW9kdWxlcyIsIk1vZHVsZUNsYXNzIiwiZ2V0T3hNb2R1bGVzRGlyIiwibG9hZE1vZHVsZUZyb21DbGFzcyIsIndyYXBwZXIiLCJfdGhpcyIsIm1vZHVsZU1ldGhvZHMiLCJzb21lIiwieCIsIl9nZXRBbGxQcm9wZXJ0eU5hbWVzIiwibWV0aG9kTmFtZSIsIm1ldGhvZCIsIkZ1bmN0aW9uIiwiT3h5Z2VuU3ViTW9kdWxlIiwiaW5kZXhPZiIsInByb3RvdHlwZSIsInNsaWNlIiwiY2FsbCIsImFyZ3VtZW50cyIsImdldE1ldGhvZFNpZ25hdHVyZSIsImdldE94eWdlbkVycm9yIiwiX2NvbW1hbmRXcmFwcGVyIiwiY21kTmFtZSIsImNtZEFyZ3MiLCJyZXR2YWwiLCJjbWRGbiIsInB1YmxpY01ldGhvZCIsInN0YXJ0c1dpdGgiLCJkZWxheSIsImRlYXN5bmMiLCJzbGVlcCIsIk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IiLCJkZWNyeXB0ZWRBcmdzIiwiX2dldERlY3J5cHRlZEFyZ3NGb3JBcHBseSIsIl9wb3B1bGF0ZVBhcmFtZXRlcnNWYWx1ZSIsImNtZExvY2F0aW9uIiwic3RlcFJlc3VsdElkIiwiX2dldENvbW1hbmRMb2NhdGlvbiIsImVtaXRCZWZvcmVDb21tYW5kIiwiX3dyYXBBc3luYyIsIl9jYWxsU2VydmljZXNPbk1vZHVsZVdpbGxEaXNwb3NlIiwicmV0dmFsUHJvbWlzZSIsInRoZW4iLCJwcm9taXNlRG9uZSIsImxvb3BXaGlsZSIsIl9jYWxsU2VydmljZXNPbk1vZHVsZUluaXRpYWxpemVkIiwic3RlcFJlc3VsdCIsImRvbmUiLCJ3YWl0SWQiLCJfZ2V0U3RlcFJlc3VsdCIsImlkIiwiaW5kZXgiLCJzcGxpY2UiLCJlbWl0QWZ0ZXJDb21tYW5kIiwiaXNGYXRhbCIsImNvbnRpbnVlT25FcnJvciIsImxvY2F0aW9uIiwiZmFpbHVyZSIsImZuIiwic2VsZiIsIkZpYmVyIiwiY3VycmVudCIsImZpbmFsVmFsIiwiUHJvbWlzZSIsInZhbCIsImNhdGNoIiwiZnV0dXJlIiwiRnV0dXJlIiwicmV0dXJuIiwidGhyb3ciLCJ3YWl0IiwiX19zdGFjayIsImNhbGxlciIsIl9fZmlsZW5hbWUiLCJnZXRGaWxlTmFtZSIsImdldExpbmVOdW1iZXIiLCJnZXRDb2x1bW5OdW1iZXIiLCJTdGVwUmVzdWx0IiwiZGlzcGxheU5hbWUiLCJnZXRTdGVwRGlzcGxheU5hbWUiLCJfbGFzdFRyYW5zYWN0aW9uTmFtZSIsImV4dHJhIiwiaHR0cCIsInR5cGUiLCJBU1NFUlRfUEFTU0VEIiwiUEFTU0VEIiwiRkFJTEVEIiwiYWN0aW9uIiwiX2lzQWN0aW9uIiwiX2dldFN0YXRzIiwic3RhdHMiLCJnZXRGYWlsdXJlRnJvbUVycm9yIiwiX3Rha2VTY3JlZW5zaG90U2lsZW50IiwiZGlzYWJsZVNjcmVlbnNob3QiLCJzY3JlZW5zaG90Iiwia2V5IiwiZGlzcG9zZVJlc3VsdCIsIm9uTW9kdWxlTG9hZGVkIiwib25Nb2R1bGVJbml0aWFsaXplZCIsIm9uTW9kdWxlV2lsbERpc3Bvc2UiLCJfbmV3QXJncyIsImFyZyIsIl9yZXBsYWNlUGFyYW1ldGVySW5Bcmd1bWVudCIsImdldERlY3J5cHRSZXN1bHQiLCJwYXJhbU5hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsInBhcmFtVmFsdWUiLCJyZXBsYWNlIiwiUmVnRXhwIiwiZW52TmFtZSIsImVudlZhbHVlIiwib2JqIiwicHJvcHMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwicHJvcCIsImdldFByb3RvdHlwZU9mIiwiX2NoZWNrU3RlcFJlc3VsdCIsInJlamVjdCIsIl93YWl0U3RlcFJlc3VsdCIsIl9kZWNyeXB0UGFyYW1ldGVyRm9yQXBwbHlJbkFyZ3VtZW50Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7Ozs7Ozs7QUFaQSxNQUFNO0FBQUVBLEVBQUFBO0FBQUYsSUFBU0MsT0FBTyxDQUFDLE1BQUQsQ0FBdEI7O0FBZUFDLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQkMsTUFBdEIsRUFBOEIsU0FBOUIsRUFBeUM7QUFDckNDLEVBQUFBLEdBQUcsRUFBRSxZQUFZO0FBQ2IsUUFBSUMsSUFBSSxHQUFHQyxLQUFLLENBQUNDLGlCQUFqQjs7QUFDQUQsSUFBQUEsS0FBSyxDQUFDQyxpQkFBTixHQUEwQixVQUFVQyxDQUFWLEVBQWFDLEtBQWIsRUFBb0I7QUFBRSxhQUFPQSxLQUFQO0FBQWUsS0FBL0Q7O0FBQ0EsUUFBSUMsR0FBRyxHQUFHLElBQUlKLEtBQUosRUFBVjtBQUNBQSxJQUFBQSxLQUFLLENBQUNLLGlCQUFOLENBQXdCRCxHQUF4QjtBQUNBLFFBQUlELEtBQUssR0FB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QS9CO0FBQ0g7QUFDSjs7QUFFREMsRUFBQUEsZUFBZSxHQUFHO0FBQ2QsV0FBTyxJQUFJdkQsT0FBSixDQUFZLENBQUNsRyxPQUFELEVBQVV3SixNQUFWLEtBQXFCO0FBQ3BDLFdBQUtELGdCQUFMLENBQXNCdkosT0FBdEIsRUFBK0J3SixNQUEvQjtBQUNILEtBRk0sQ0FBUDtBQUdIOztBQUVEcEYsRUFBQUEseUJBQXlCLENBQUMzRixJQUFELEVBQU81QixVQUFQLEVBQW1CO0FBQ3hDLFFBQUksQ0FBQzRCLElBQUQsSUFBUyxDQUFDZ0MsS0FBSyxDQUFDQyxPQUFOLENBQWNqQyxJQUFkLENBQVYsSUFBaUNBLElBQUksQ0FBQzVELE1BQUwsSUFBZSxDQUFwRCxFQUF1RDtBQUNuRCxhQUFPNEQsSUFBUDtBQUNIOztBQUNELFVBQU04SixRQUFRLEdBQUcsRUFBakI7O0FBQ0EsU0FBSyxJQUFJQyxHQUFULElBQWdCL0osSUFBaEIsRUFBc0I7QUFDbEI4SixNQUFBQSxRQUFRLENBQUN2SyxJQUFULENBQWMsS0FBSzBMLG1DQUFMLENBQXlDbEIsR0FBekMsRUFBOEMzTCxVQUE5QyxDQUFkO0FBQ0g7O0FBQ0QsV0FBTzBMLFFBQVA7QUFDSDs7QUFFRG1CLEVBQUFBLG1DQUFtQyxDQUFDbEIsR0FBRCxFQUFNM0wsVUFBTixFQUFrQjtBQUNqRCxRQUFJMkwsR0FBRyxJQUFJLE9BQU9BLEdBQUcsQ0FBQ0UsZ0JBQVgsS0FBZ0MsVUFBM0MsRUFBdUQ7QUFDbkQsVUFBSTdMLFVBQVUsS0FBSyxLQUFuQixFQUEwQjtBQUN0QixlQUFPLFdBQVA7QUFDSCxPQUZELE1BRU87QUFDSCxlQUFPMkwsR0FBRyxDQUFDRSxnQkFBSixFQUFQO0FBQ0g7QUFDSjs7QUFFRCxXQUFPRixHQUFQO0FBQ0g7O0FBbjlCNEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90b3R5cGUtYnVpbHRpbnMgKi9cbmltcG9ydCBnbG9iIGZyb20gJ2dsb2InO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IGRlYXN5bmMgZnJvbSAnZGVhc3luYyc7XG5pbXBvcnQgRnV0dXJlIGZyb20gJ2ZpYmVycy9mdXR1cmUnO1xuaW1wb3J0IEZpYmVyIGZyb20gJ2ZpYmVycyc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5jb25zdCB7IHYxIH0gPSByZXF1aXJlKCd1dWlkJyk7XG5pbXBvcnQgU3RlcFJlc3VsdCBmcm9tICcuLi9tb2RlbC9zdGVwLXJlc3VsdCc7XG5pbXBvcnQgT3h5Z2VuRXZlbnRzIGZyb20gJy4vT3h5Z2VuRXZlbnRzJztcbmltcG9ydCBveHV0aWwgZnJvbSAnLi4vbGliL3V0aWwnO1xuaW1wb3J0ICogYXMgY29yZVV0aWxzIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vZXJyb3JzL094eWdlbkVycm9yJztcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcbmltcG9ydCBTVEFUVVMgZnJvbSAnLi4vbW9kZWwvc3RhdHVzLmpzJztcbmltcG9ydCAqIGFzIE1vZHVsZXMgZnJvbSAnLi4vb3hfbW9kdWxlcy9pbmRleCc7XG5cbi8vIHNldHVwIGxvZ2dlclxuaW1wb3J0IGxvZ2dlciwgeyBERUZBVUxUX0xPR0dFUl9JU1NVRVIsIElTU1VFUlMgfSBmcm9tICcuLi9saWIvbG9nZ2VyJztcbmltcG9ydCB7IE94eWdlblN1Yk1vZHVsZSB9IGZyb20gJy4vT3h5Z2VuU3ViTW9kdWxlJztcblxuLypnbG9iYWwgX19zdGFjayovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsLCAnX19zdGFjaycsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9yaWcgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTtcbiAgICAgICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBmdW5jdGlvbiAoXywgc3RhY2spIHsgcmV0dXJuIHN0YWNrOyB9O1xuICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCk7XG4gICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVycik7XG4gICAgICAgIHZhciBzdGFjayA9IGVyci5zdGFjaztcbiAgICAgICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBvcmlnO1xuICAgICAgICByZXR1cm4gc3RhY2s7XG4gICAgfVxufSk7XG5cbmNvbnN0IERFRkFVTFRfVElNRU9VVCA9IDMwMDAwO1xuY29uc3QgREVGQVVMVF9PUFRTID0ge1xuICAgIGJhY2t0cmFjZTogZmFsc2UsIC8vIDxib29sZWFuPiBzaG93IGZ1bGwgYmFja3RyYWNlIGZvciBlcnJvcnNcbiAgICBjb21waWxlcjogW10sIC8vIDxzdHJpbmdbXT4gKFwiZXh0ZW5zaW9uOm1vZHVsZVwiKSByZXF1aXJlIGZpbGVzIHdpdGggdGhlIGdpdmVuIEVYVEVOU0lPTiBhZnRlciByZXF1aXJpbmcgTU9EVUxFIChyZXBlYXRhYmxlKVxuICAgIGZhaWxBbWJpZ3VvdXNEZWZpbml0aW9uczogZmFsc2UsIC8vIDxib29sZWFuPiB0cmVhdCBhbWJpZ3VvdXMgZGVmaW5pdGlvbnMgYXMgZXJyb3JzXG4gICAgZmFpbEZhc3Q6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gYWJvcnQgdGhlIHJ1biBvbiBmaXJzdCBmYWlsdXJlXG4gICAgaWdub3JlVW5kZWZpbmVkRGVmaW5pdGlvbnM6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gdHJlYXQgdW5kZWZpbmVkIGRlZmluaXRpb25zIGFzIHdhcm5pbmdzXG4gICAgbmFtZTogW10sIC8vIDxSRUdFWFBbXT4gb25seSBleGVjdXRlIHRoZSBzY2VuYXJpb3Mgd2l0aCBuYW1lIG1hdGNoaW5nIHRoZSBleHByZXNzaW9uIChyZXBlYXRhYmxlKVxuICAgIHByb2ZpbGU6IFtdLCAvLyA8c3RyaW5nPiAobmFtZSkgc3BlY2lmeSB0aGUgcHJvZmlsZSB0byB1c2VcbiAgICByZXF1aXJlOiBbXSwgLy8gPHN0cmluZz4gKGZpbGUvZGlyL2dsb2IpIHJlcXVpcmUgZmlsZXMgYmVmb3JlIGV4ZWN1dGluZyBmZWF0dXJlc1xuICAgIG9yZGVyOiAnZGVmaW5lZCcsIC8vIDxzdHJpbmc+IHN3aXRjaCBiZXR3ZWVuIGRldGVybWluaXN0aWMgIGFuZCByYW5kb20gZmVhdHVyZSBleGVjdXRpb24uIEVpdGhlciBcImRlZmluZWRcIiwgXCJyYW5kb21cIiBvciBcInJhbmRvbTo0MlwiIHdoZXJlYXMgNDIgaXMgdGhlIHNlZWQgZm9yIHJhbmRvbWl6YXRpb25cbiAgICBzbmlwcGV0U3ludGF4OiB1bmRlZmluZWQsIC8vIDxzdHJpbmc+IHNwZWNpZnkgYSBjdXN0b20gc25pcHBldCBzeW50YXhcbiAgICBzbmlwcGV0czogdHJ1ZSwgLy8gPGJvb2xlYW4+IGhpZGUgc3RlcCBkZWZpbml0aW9uIHNuaXBwZXRzIGZvciBwZW5kaW5nIHN0ZXBzXG4gICAgc291cmNlOiB0cnVlLCAvLyA8Ym9vbGVhbj4gaGlkZSBzb3VyY2UgdXJpc1xuICAgIHN0cmljdDogZmFsc2UsIC8vIDxib29sZWFuPiBmYWlsIGlmIHRoZXJlIGFyZSBhbnkgdW5kZWZpbmVkIG9yIHBlbmRpbmcgc3RlcHNcbiAgICB0YWdFeHByZXNzaW9uOiAnJywgLy8gPHN0cmluZz4gKGV4cHJlc3Npb24pIG9ubHkgZXhlY3V0ZSB0aGUgZmVhdHVyZXMgb3Igc2NlbmFyaW9zIHdpdGggdGFncyBtYXRjaGluZyB0aGUgZXhwcmVzc2lvblxuICAgIHRhZ3NJblRpdGxlOiBmYWxzZSwgLy8gPGJvb2xlYW4+IGFkZCBjdWN1bWJlciB0YWdzIHRvIGZlYXR1cmUgb3Igc2NlbmFyaW8gbmFtZVxuICAgIHRpbWVvdXQ6IERFRkFVTFRfVElNRU9VVCAvLyA8bnVtYmVyPiB0aW1lb3V0IGZvciBzdGVwIGRlZmluaXRpb25zIGluIG1pbGxpc2Vjb25kc1xufTtcbmNvbnN0IE1PRFVMRV9OQU1FX01BVENIX1JFR0VYID0gL15tb2R1bGUtKC4rPylcXC5qcyQvO1xuY29uc3QgU0VSVklDRV9OQU1FX01BVENIX1JFR0VYID0gL15zZXJ2aWNlLSguKz8pXFwuanMkLztcbmNvbnN0IERPX05PVF9XUkFQX01FVEhPRFMgPSBbJ2RyaXZlcicsICdnZXREcml2ZXInXTtcblxuY29uc3QgREVGQVVMVF9DVFggPSB7XG4gICAgcGFyYW1zOiB7fSxcbiAgICB2YXJzOiB7fSxcbiAgICBlbnY6IHt9LFxuICAgIGNhcHM6IHt9LFxuICAgIGF0dHJpYnV0ZXM6IHt9LFxufTtcbmNvbnN0IERFRkFVTFRfUkVTVUxUX1NUT1JFID0ge1xuICAgIHN0ZXBzOiBbXSxcbiAgICBsb2dzOiBbXSxcbiAgICBhdHRhY2htZW50czogW10sXG4gICAgaGFyOiBudWxsLFxuICAgIGF0dHJpYnV0ZXM6IHt9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPeHlnZW4gZXh0ZW5kcyBPeHlnZW5FdmVudHMge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVzdWx0U3RvcmUgPSB7IC4uLkRFRkFVTFRfUkVTVUxUX1NUT1JFIH07XG4gICAgICAgIHRoaXMuY3R4ID0geyAuLi5ERUZBVUxUX0NUWCB9O1xuICAgICAgICB0aGlzLm1vZHVsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlcyA9IHt9O1xuICAgICAgICB0aGlzLnJlcG8gPSB7fTtcbiAgICAgICAgdGhpcy5jYXBhYmlsaXRpZXMgPSBudWxsO1xuICAgICAgICB0aGlzLm9wdHMgPSBudWxsO1xuICAgICAgICB0aGlzLm94QmFzZURpciA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8nKTtcbiAgICAgICAgdGhpcy5sb2dnZXIgPSB0aGlzLl93cmFwTG9nZ2VyKGxvZ2dlcignT3h5Z2VuJykpO1xuICAgICAgICB0aGlzLl93YWl0U3RlcFJlc3VsdExpc3QgPSBbXTtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0KG9wdGlvbnMsIGNhcHMsIGN0eCA9IHt9LCByZXN1bHRzID0ge30pIHtcbiAgICAgICAgdGhpcy5vcHRzID0gT2JqZWN0LmFzc2lnbihERUZBVUxUX09QVFMsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmN3ZCA9IHRoaXMub3B0cy5jd2QgfHwgcHJvY2Vzcy5jd2QoKTtcbiAgICAgICAgdGhpcy5jdHggPSBPYmplY3QuYXNzaWduKERFRkFVTFRfQ1RYLCBjdHggfHwge30pO1xuICAgICAgICB0aGlzLmN0eC5jYXBzID0geyAuLi5jdHguY2FwcyB8fCB7fSwgLi4uY2FwcywgfTtcbiAgICAgICAgdGhpcy5yZXN1bHRTdG9yZSA9IE9iamVjdC5hc3NpZ24oREVGQVVMVF9SRVNVTFRfU1RPUkUsIHJlc3VsdHMgfHwge30pO1xuICAgICAgICB0aGlzLmNhcGFiaWxpdGllcyA9IHRoaXMuY3R4LmNhcHMgPSBjYXBzO1xuXG4gICAgICAgIGlmIChjdHguYXR0cmlidXRlcyAmJiAoIXJlc3VsdHMuYXR0cmlidXRlcyB8fCAhT2JqZWN0LmtleXMocmVzdWx0cy5hdHRyaWJ1dGVzKS5sZW5ndGgpKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3VsdFN0b3JlLmF0dHJpYnV0ZXMgPSB7IC4uLmN0eC5hdHRyaWJ1dGVzIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkZWZpbmUgJ294JyBvYmplY3QgaW4gZ2xvYmFsIEpTIHNjb3BlXG4gICAgICAgIC8vIHdlIHdpbGwgdXNlIHRoaXMgb2JqZWN0IHRvIGFjY2VzcyBPeHlnZW4gbW9kdWxlcyBhbmQgdGVzdCBjb250ZXh0IGZyb20gbW9kdWxlcyB1c2VkIGluIHRoZSB0ZXN0IChpZiBhbnkpICAgICAgICBcbiAgICAgICAgdGhpcy5tYWtlT3hHbG9iYWwoKTtcbiAgICAgICAgLy8gbG9hZCBzZXJ2aWNlc1xuICAgICAgICB0aGlzLl9sb2FkU2VydmljZXMoKTtcbiAgICAgICAgLy8gbG9hZCBtb2R1bGVzXG4gICAgICAgIHRoaXMuX2xvYWRNb2R1bGVzKCk7XG4gICAgICAgIC8vIGlmIG9wdGlvbnMubWFrZU1vZHVsZXNHbG9iYWwgaXMgdHJ1ZSBvciB1bmRlZmluZWQgdGhhbiBkZWZpbmUgJ2N0eCcgY29udGVudCBhbmQgZWFjaCBtb2R1bGUgaW4gZ2xvYmFsIHNjb3BlXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5nbG9iYWxTY29wZSA9PT0gJ3VuZGVmaW5lZCcgfHwgb3B0aW9ucy5nbG9iYWxTY29wZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5tYWtlQ29udGV4dEFuZE1vZHVsZXNHbG9iYWwoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGFzeW5jIGRpc3Bvc2VNb2R1bGVzKHN0YXR1cyA9IG51bGwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2Rpc3Bvc2VNb2R1bGVzKHN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkaXNwb3NlIG1vZHVsZXM6ICcsIGUpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGRpc3Bvc2Uoc3RhdHVzID0gbnVsbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGlzcG9zZU1vZHVsZXMoc3RhdHVzKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2Rpc3Bvc2VTZXJ2aWNlcygpO1xuICAgICAgICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGRpc3Bvc2U6ICcsIGUpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBhZGp1c3RTY3JpcHRMaW5lKCkge1xuICAgICAgICBjb25zdCBpc0luRGVidWdNb2RlID0gb3h1dGlsLmlzSW5EZWJ1Z01vZGUoKTtcbiAgICAgICAgLy8gYWRkIGV4dHJhIGxpbmUgaWYgd2UgYXJlIHJ1bm5pbmcgaW4gZGVidWdnZXIgbW9kZSAoVjggZGVidWdnZXIgYWRkcyBhbiBleHRyYSBsaW5lIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGlzSW5EZWJ1Z01vZGUgPyAtMSA6IDA7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZ2V0IGNvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN0eDtcbiAgICB9XG5cbiAgICBzZXQgY29udGV4dChjdHgpIHtcbiAgICAgICAgdGhpcy5jdHggPSBjdHg7XG4gICAgICAgIGlmIChnbG9iYWwub3gpIHtcbiAgICAgICAgICAgIGdsb2JhbC5veC5jdHggPSBjdHg7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0cy5nbG9iYWxTY29wZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5vcHRzLmdsb2JhbFNjb3BlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIFwicGFyYW1zXCIgYW5kIFwiZW52XCIgaW4gXCJveFwiIGdsb2JhbCB2YXJpYWJsZVxuICAgICAgICAgICAgICAgIGdsb2JhbC5wYXJhbXMgPSBjdHgucGFyYW1zIHx8IHt9O1xuICAgICAgICAgICAgICAgIGdsb2JhbC5lbnYgPSBjdHguZW52IHx8IHt9O1xuICAgICAgICAgICAgICAgIGdsb2JhbC5hdHRyaWJ1dGVzID0gY3R4LmF0dHJpYnV0ZXMgfHwge307XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgcmVwb3NpdG9yeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbztcbiAgICB9XG5cbiAgICBzZXQgcmVwb3NpdG9yeShyZXBvKSB7XG4gICAgICAgIHRoaXMucmVwbyA9IHJlcG87XG4gICAgICAgIGlmIChnbG9iYWwub3gpIHtcbiAgICAgICAgICAgIGdsb2JhbC5veC5yZXBvID0gcmVwbztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCByZXN1bHRzKCkge1xuICAgICAgICAvLyBjYWxjdWxhdGUgdGltZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGl0c2VsZiAtIHN1bW1hcnkgb2YgZHVyYXRpb25zIGZvciBhbGwgdGhlIHN0ZXBzIGluIHRoaXMgdHJhbnNhY3Rpb25cbiAgICAgICAgLy8gYWxzbyBhZGp1c3QgdHJhbnNhY3Rpb24gZW5kIHRpbWUgdG8gbXVjaCBlbmQgdGltZSBmb3IgdGhlIGxhc3QgZXhlY3V0ZWQgc3RlcCB3aXRoaW4gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAgICAgZm9yIChjb25zdCB0cmFuc1N0ZXAgb2YgdGhpcy5yZXN1bHRTdG9yZS5zdGVwcykge1xuICAgICAgICAgICAgaWYgKHRyYW5zU3RlcC5uYW1lLmluY2x1ZGVzKCcudHJhbnNhY3Rpb24nKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zTmFtZSA9IHRyYW5zU3RlcC50cmFuc2FjdGlvbjtcbiAgICAgICAgICAgICAgICB0cmFuc1N0ZXAuZHVyYXRpb24gPSAwO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiB0aGlzLnJlc3VsdFN0b3JlLnN0ZXBzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgYmVsb25ncyB0byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiAmIGlzIG5vdCB0aGUgdHJhbnNhY3Rpb24gc3RlcFxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcC50cmFuc2FjdGlvbiA9PT0gdHJhbnNOYW1lICYmIHN0ZXAgIT09IHRyYW5zU3RlcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNTdGVwLmR1cmF0aW9uICs9IHN0ZXAuZHVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcC5lbmRUaW1lID4gdHJhbnNTdGVwLmVuZFRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1N0ZXAuZW5kVGltZSA9IHN0ZXAuZW5kVGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRyYW5zYWN0aW9uIHN0YXR1cyB0byB3YXJuaW5nIGlmIGF0IGxlYXN0IG9uZSBvZiBzdGVwcyBoYXMgd2FybmluZyBzdGF0dXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwLnN0YXR1cyA9PT0gU1RBVFVTLldBUk5JTkcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1N0ZXAuc3RhdHVzID0gU1RBVFVTLldBUk5JTkc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0U3RvcmU7XG4gICAgfVxuXG4gICAgZ2V0TW9kdWxlc0NhcGFiaWxpdGllcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLm1vZHVsZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1vZENhcHMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiB0aGlzLm1vZHVsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IHRoaXMubW9kdWxlc1ttb2R1bGVOYW1lXTtcbiAgICAgICAgICAgIGlmIChtb2R1bGUubmFtZSAmJiBtb2R1bGUuX2dldENhcGFiaWxpdGllcyAmJiB0eXBlb2YgbW9kdWxlLl9nZXRDYXBhYmlsaXRpZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYXBzID0gbW9kdWxlLl9nZXRDYXBhYmlsaXRpZXMoKTtcbiAgICAgICAgICAgICAgICAvLyBzdG9yZSBvbmx5IG5vbi1lbXB0eSBjYXBzIHBlciBtb2R1bGUgdGhhdCBoYXMgdGhpcy5jYXBzIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgaWYgKGNhcHMgJiYgdHlwZW9mIGNhcHMgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKGNhcHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kQ2Fwc1ttb2R1bGUubmFtZV0gPSBjYXBzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kQ2FwcztcbiAgICB9XG5cbiAgICByZXNldFJlc3VsdHMoKSB7XG4gICAgICAgIHRoaXMucmVzdWx0U3RvcmUuc3RlcHMgPSBbXTtcbiAgICAgICAgdGhpcy5yZXN1bHRTdG9yZS5sb2dzID0gW107XG4gICAgICAgIHRoaXMucmVzdWx0U3RvcmUuYXR0YWNobWVudHMgPSBbXTtcbiAgICAgICAgdGhpcy5oYXIgPSBudWxsO1xuICAgIH1cblxuICAgIGFzeW5jIG9uQmVmb3JlQ2FzZShjb250ZXh0KSB7XG4gICAgICAgIGZvciAobGV0IG1vZHVsZU5hbWUgaW4gdGhpcy5tb2R1bGVzKSB7XG4gICAgICAgICAgICBjb25zdCBtb2R1bGUgPSB0aGlzLm1vZHVsZXNbbW9kdWxlTmFtZV07XG4gICAgICAgICAgICBpZiAoIW1vZHVsZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBtb2R1bGUub25CZWZvcmVDYXNlICYmIGF3YWl0IG1vZHVsZS5vbkJlZm9yZUNhc2UoY29udGV4dCk7XG4gICAgICAgICAgICAgICAgbW9kdWxlLl9pdGVyYXRpb25TdGFydCAmJiBhd2FpdCBtb2R1bGUuX2l0ZXJhdGlvblN0YXJ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gY2FsbCBcIm9uQmVmb3JlQ2FzZVwiIG1ldGhvZCBvZiAke21vZHVsZU5hbWV9IG1vZHVsZS5gLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIG9uQWZ0ZXJDYXNlKGVycm9yID0gbnVsbCkge1xuICAgICAgICBmb3IgKGxldCBtb2R1bGVOYW1lIGluIHRoaXMubW9kdWxlcykge1xuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdO1xuICAgICAgICAgICAgaWYgKCFtb2R1bGUpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gYXdhaXQgZm9yIGF2b2lkIHN0dWNrIG9uICouZGlzcG9zZSBjYWxsXG4gICAgICAgICAgICAgICAgbW9kdWxlLm9uQWZ0ZXJDYXNlICYmIGF3YWl0IG1vZHVsZS5vbkFmdGVyQ2FzZShlcnJvcik7XG4gICAgICAgICAgICAgICAgbW9kdWxlLl9pdGVyYXRpb25FbmQgJiYgYXdhaXQgbW9kdWxlLl9pdGVyYXRpb25FbmQoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNhbGwgXCJvbkFmdGVyQ2FzZVwiIG1ldGhvZCBvZiAke21vZHVsZU5hbWV9IG1vZHVsZS5gLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG1ha2VPeEdsb2JhbCgpIHtcbiAgICAgICAgaWYgKCFnbG9iYWwub3gpIHtcbiAgICAgICAgICAgIGdsb2JhbC5veCA9IHtcbiAgICAgICAgICAgICAgICBtb2R1bGVzOiB0aGlzLm1vZHVsZXMsXG4gICAgICAgICAgICAgICAgY3R4OiB0aGlzLmN0eCxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdHMsXG4gICAgICAgICAgICAgICAgY2FwczogdGhpcy5jYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICAgICAgcmVzdWx0U3RvcmU6IHRoaXMucmVzdWx0U3RvcmUsXG4gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlOiB0aGlzLmFkZEF0dHJpYnV0ZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICAgIGFkZEF0dGFjaG1lbnQ6IHRoaXMuYWRkQXR0YWNobWVudC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZ2xvYmFsLnZhcnMgPSB0aGlzLmN0eC52YXJzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbWFrZUNvbnRleHRBbmRNb2R1bGVzR2xvYmFsKCkge1xuICAgICAgICAvLyBtYWtlIHN1cmUgJ294JyBpcyBhbHJlYWR5IGdsb2JhbFxuICAgICAgICBpZiAoZ2xvYmFsLm94KSB7XG4gICAgICAgICAgICAvLyBleHBvc2UgbW9kdWxlcyBhcyBnbG9iYWwgdmFyaWFibGVzXG4gICAgICAgICAgICBmb3IgKGxldCBtb2R1bGVOYW1lIGluIHRoaXMubW9kdWxlcykge1xuICAgICAgICAgICAgICAgIGlmICghZ2xvYmFsW21vZHVsZU5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbFttb2R1bGVOYW1lXSA9IHRoaXMubW9kdWxlc1ttb2R1bGVOYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBleHBvc2UgXCJjdHhcIiwgXCJwYXJhbXNcIiBhbmQgXCJlbnZcIiBhcyBnbG9iYWwgdmFyaWFibGVzXG4gICAgICAgICAgICBnbG9iYWwucGFyYW1zID0gZ2xvYmFsLm94LmN0eC5wYXJhbXM7XG4gICAgICAgICAgICBnbG9iYWwuZW52ID0gZ2xvYmFsLm94LmN0eC5lbnY7XG4gICAgICAgICAgICBnbG9iYWwuY3R4ID0gZ2xvYmFsLm94LmN0eDtcbiAgICAgICAgICAgIGdsb2JhbC5hdHRyaWJ1dGVzID0gZ2xvYmFsLm94LmN0eC5hdHRyaWJ1dGVzIHx8IHt9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkQXR0cmlidXRlKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICghbmFtZSB8fCAhdmFsdWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVycm9ySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsIFwiJ25hbWUnIGFuZCAndmFsdWUnIGFyZ3VtZW50cyBhcmUgcmVxdWlyZWQgZm9yIG94LmFkZEF0dHJpYnV0ZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJlc3VsdFN0b3JlICYmIHRoaXMucmVzdWx0U3RvcmUuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgdGhpcy5yZXN1bHRTdG9yZS5hdHRyaWJ1dGVzW25hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRBdHRhY2htZW50KGZpbGVQYXRoKSB7XG4gICAgICAgIGlmICghdGhpcy5yZXN1bHRTdG9yZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnIoYEZpbGUgJHtmaWxlUGF0aH0gZG9lc24ndCBleGlzdGApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnJlc3VsdFN0b3JlLmF0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3VsdFN0b3JlLmF0dGFjaG1lbnRzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXN1bHRTdG9yZS5hdHRhY2htZW50cy5wdXNoKFxuICAgICAgICAgICAgY29yZVV0aWxzLm5ld0ZpbGVBdHRhY2htZW50KGZpbGVQYXRoKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGxvYWRQYWdlT2JqZWN0RmlsZShwb1BhdGgpIHtcbiAgICAgICAgaWYgKCFwb1BhdGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcG8gPSByZXF1aXJlKHBvUGF0aCk7XG4gICAgICAgICAgICAvLyBzZXQgcGFnZSBvYmplY3QgcmVwb3NpdG9yeSBhcyB0aGUgbWFpbiBvbmVcbiAgICAgICAgICAgIHRoaXMucmVwb3NpdG9yeSA9IHBvO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdHMuZ2xvYmFsU2NvcGUgPT09ICd1bmRlZmluZWQnIHx8IHRoaXMub3B0cy5nbG9iYWxTY29wZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGdsb2JhbC5wbyA9IHBvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRzLmdsb2JhbFNjb3BlID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLm9wdHMuZ2xvYmFsU2NvcGUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBnbG9iYWwucG8gPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qXG4gICAgICogUHJpdmF0ZSBNZXRob2RzXG4gICAgICovXG4gICAgX3dyYXBMb2dnZXIoX2xvZ2dlcikge1xuICAgICAgICBjb25zdCBsb2dnZXJXcmFwID0ge1xuICAgICAgICAgICAgaW5mbzogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnaW5mbycsIGFyZ3MpLFxuICAgICAgICAgICAgZGVidWc6ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ2RlYnVnJywgYXJncyksXG4gICAgICAgICAgICBlcnJvcjogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnZXJyb3InLCBhcmdzKSxcbiAgICAgICAgICAgIHdhcm46ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ3dhcm4nLCBhcmdzKSxcbiAgICAgICAgICAgIHVzZXJJbmZvOiAoLi4uYXJncykgPT4gdGhpcy5fbG9nKF9sb2dnZXIsICdpbmZvJywgYXJncywgSVNTVUVSUy5VU0VSKSxcbiAgICAgICAgICAgIHVzZXJEZWJ1ZzogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnZGVidWcnLCBhcmdzLCBJU1NVRVJTLlVTRVIpLFxuICAgICAgICAgICAgdXNlckVycm9yOiAoLi4uYXJncykgPT4gdGhpcy5fbG9nKF9sb2dnZXIsICdlcnJvcicsIGFyZ3MsIElTU1VFUlMuVVNFUiksXG4gICAgICAgICAgICB1c2VyV2FybjogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnd2FybicsIGFyZ3MsIElTU1VFUlMuVVNFUiksXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBsb2dnZXJXcmFwO1xuICAgIH1cblxuICAgIF9sb2coX2xvZ2dlciwgbGV2ZWwsIGFyZ3MsIHNyYyA9IERFRkFVTFRfTE9HR0VSX0lTU1VFUikge1xuICAgICAgICBpZiAoIV9sb2dnZXJbbGV2ZWxdKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgX2xvZ2dlcltsZXZlbF0uYXBwbHkoX2xvZ2dlciwgYXJncyk7XG5cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IG94dXRpbC5zdHJpbmdpZnkoYXJncywgMik7XG4gICAgICAgIGNvbnN0IHRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XG4gICAgICAgIC8vIGFkZCB0aGUgbG9nIGVudHJ5IHRvIHRoZSByZXN1bHQgc3RvcmVcbiAgICAgICAgaWYgKHRoaXMucmVzdWx0U3RvcmUgJiYgdGhpcy5yZXN1bHRTdG9yZS5sb2dzKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3VsdFN0b3JlLmxvZ3MucHVzaCh7XG4gICAgICAgICAgICAgICAgdGltZTogdGltZSxcbiAgICAgICAgICAgICAgICBsZXZlbDogbGV2ZWwudG9VcHBlckNhc2UoKSxcbiAgICAgICAgICAgICAgICBtc2c6IG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgc3JjOiBzcmNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlbW92ZSBmaXJzdCBhcmd1bWVudCwgaWYgaXQncyBhIG1lc3NhZ2VcbiAgICAgICAgYXJncyA9IG1lc3NhZ2UgPyBhcmdzLnNoaWZ0KCkgOiBhcmdzO1xuICAgICAgICB0aGlzLmVtaXRMb2codGltZSwgbGV2ZWwsIG1lc3NhZ2UsIGFyZ3MsIHNyYyk7XG4gICAgfVxuXG4gICAgX2xvYWRTZXJ2aWNlcygpIHtcbiAgICAgICAgY29uc3Qgb3hTZXJ2aWNlc0RpclBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5veEJhc2VEaXIsICcuL294X3NlcnZpY2VzJyk7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VGaWxlcyA9IGdsb2Iuc3luYygnc2VydmljZS0qLmpzJywgeyBjd2Q6IG94U2VydmljZXNEaXJQYXRoIH0pO1xuICAgICAgICAvLyBpbml0aWFsaXplIGFsbCBzZXJ2aWNlc1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9hZGluZyBzZXJ2aWNlcy4uLicpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VydmljZUZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlRmlsZU5hbWUgPSBzZXJ2aWNlRmlsZXNbaV07XG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlRmlsZVBhdGggPSBwYXRoLmpvaW4ob3hTZXJ2aWNlc0RpclBhdGgsIHNlcnZpY2VGaWxlTmFtZSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBzZXJ2aWNlRmlsZU5hbWUubWF0Y2goU0VSVklDRV9OQU1FX01BVENIX1JFR0VYKTtcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gcmVzdWx0WzFdO1xuXG4gICAgICAgICAgICAvLyB0aGlzLm9wdHMuc2VydmljZXMgPSB1bmRlZmluZWQgaW4gc2luZ2xlIGZpbGUgbW9kZVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRzLnNlcnZpY2VzKSAmJiAhdGhpcy5vcHRzLnNlcnZpY2VzLmluY2x1ZGVzKHNlcnZpY2VOYW1lKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMb2FkaW5nIHNlcnZpY2U6ICcgKyBzZXJ2aWNlTmFtZSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuX2xvYWRTZXJ2aWNlKHNlcnZpY2VOYW1lLCBzZXJ2aWNlRmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgIHNlcnZpY2UuaW5pdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZXNbc2VydmljZU5hbWVdID0gc2VydmljZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgaW5pdGlhbGl6aW5nIHNlcnZpY2UgXCInICsgc2VydmljZU5hbWUgKyAnXCI6ICcgKyBlLm1lc3NhZ2UgKyBFT0wgKyAoZS5zdGFja3RyYWNlID8gZS5zdGFja3RyYWNlIDogJycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBfbG9hZFNlcnZpY2Uoc2VydmljZU5hbWUsIHNlcnZpY2VQYXRoKSB7XG4gICAgICAgIGxldCBTZXJ2aWNlQ2xhc3MgPSByZXF1aXJlKHNlcnZpY2VQYXRoKTtcbiAgICAgICAgLy8gRVM2IGNsYXNzIHdpbGwgYmUgdW5kZXIgJ2RlZmF1bHQnIHByb3BlcnR5XG4gICAgICAgIGlmIChTZXJ2aWNlQ2xhc3MuZGVmYXVsdCkge1xuICAgICAgICAgICAgU2VydmljZUNsYXNzID0gU2VydmljZUNsYXNzLmRlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VydmljZUxvZ2dlciA9IHRoaXMuX3dyYXBMb2dnZXIobG9nZ2VyKGBTZXJ2aWNlOiR7c2VydmljZU5hbWV9YCkpO1xuICAgICAgICByZXR1cm4gbmV3IFNlcnZpY2VDbGFzcyh0aGlzLm9wdHMsIHRoaXMuY3R4LCB0aGlzLnJlc3VsdFN0b3JlLCBzZXJ2aWNlTG9nZ2VyKTtcbiAgICB9XG5cbiAgICBfbG9hZE1vZHVsZXMoKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMb2FkaW5nIGludGVybmFsIG1vZHVsZXMuLi4nKTtcbiAgICAgICAgdGhpcy5fbG9hZEludGVybmFsTW9kdWxlcygpO1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9hZGluZyBleHRlcm5hbCBtb2R1bGVzLi4uJyk7XG4gICAgICAgIHRoaXMuX2xvYWRFeHRlcm5hbE1vZHVsZXMoKTtcbiAgICB9XG5cbiAgICBfbG9hZEV4dGVybmFsTW9kdWxlcygpIHtcbiAgICAgICAgbGV0IG1vZHVsZXNGb2xkZXJQYXRoID0gJy4vbW9kdWxlcyc7XG4gICAgICAgIGlmICh0aGlzLm9wdHMubW9kdWxlc19leHQgJiYgdHlwZW9mIHRoaXMub3B0cy5tb2R1bGVzX2V4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIG1vZHVsZXNGb2xkZXJQYXRoID0gdGhpcy5vcHRzLm1vZHVsZXNfZXh0O1xuICAgICAgICB9XG4gICAgICAgIC8vY29uc3Qgb3hNb2R1bGVzRGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLm94QmFzZURpciwgJy4vb3hfbW9kdWxlcycpO1xuICAgICAgICBjb25zdCBveE1vZHVsZXNEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuY3dkLCBtb2R1bGVzRm9sZGVyUGF0aCk7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhveE1vZHVsZXNEaXJQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtb2R1bGVGaWxlcyA9IFtdO1xuICAgICAgICAvLyBpZiBwYXJ0aWN1bGFyIG1vZHVsZSBuYW1lcyBhcmUgZGVmaW5lZCBpbiB0aGUgY29uZmlnLCB0aGVuIGxvYWQgb25seSB0aGVzZSBtb2R1bGVzXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0cy5tb2R1bGVzKSAmJiB0aGlzLm9wdHMubW9kdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLm9wdHMubW9kdWxlcy5mb3JFYWNoKG1vZHVsZU5hbWUgPT4gbW9kdWxlRmlsZXMucHVzaChgbW9kdWxlLSR7bW9kdWxlTmFtZX0uanNgKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBsb2FkIGFsbCBhdmFpbGFibGUgbW9kdWxlcyAobWlnaHQgYmUgbW9yZSB0aW1lIGNvbnN1bWluZylcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBtb2R1bGVGaWxlcyA9IGdsb2Iuc3luYygnbW9kdWxlLSouanMnLCB7IGN3ZDogb3hNb2R1bGVzRGlyUGF0aCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbml0aWFsaXplIGFsbCBtb2R1bGVzICAgICAgICBcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlRmlsZU5hbWUgb2YgbW9kdWxlRmlsZXMpIHtcbiAgICAgICAgICAgIC8vIGV4dHJhY3QgbmFtZSBmcm9tIHRoZSBtb2R1bGUgZmlsZSBuYW1lIGJhc2VkIG9uIG1vZHVsZSBuYW1lIHBhdHRlcm5cbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZU5hbWUgPSBtb2R1bGVGaWxlTmFtZS5tYXRjaChNT0RVTEVfTkFNRV9NQVRDSF9SRUdFWClbMV07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBuZXcgbG9nZ2VyIGZvciB0aGUgbW9kdWxlXG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlTG9nZ2VyID0gdGhpcy5fd3JhcExvZ2dlcihsb2dnZXIoYE1vZHVsZToke21vZHVsZU5hbWV9YCkpO1xuICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgbmV3IG1vZHVsZSBpbnN0YW5jZVxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZCA9IGNvcmVVdGlscy5sb2FkTW9kdWxlRnJvbUZpbGUobW9kdWxlTmFtZSwgbW9kdWxlRmlsZU5hbWUsIG1vZHVsZUxvZ2dlciwgb3hNb2R1bGVzRGlyUGF0aCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgLy8gY2FsbCBvbk1vZHVsZUxvYWRlZCBob29rXG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsbFNlcnZpY2VzT25Nb2R1bGVMb2FkZWQobW9kKTtcbiAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG1vZHVsZSB0byB0aGUgbW9kdWxlIGxpc3RcbiAgICAgICAgICAgICAgICB0aGlzLm1vZHVsZXNbbW9kdWxlTmFtZV0gPSBnbG9iYWwub3gubW9kdWxlc1ttb2R1bGVOYW1lXSA9IHRoaXMuX3dyYXBNb2R1bGUobW9kdWxlTmFtZSwgbW9kKTtcbiAgICAgICAgICAgICAgICAvLyB3cmFwIHVwXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSAoZW5kVGltZSAtIHN0YXJ0VGltZSkgLyAxMDAwO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMb2FkaW5nIG1vZHVsZTogJyArIG1vZHVsZU5hbWUgKyAnIFsgJyArIGR1cmF0aW9uICsgJyBzZWMgXScpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBpbml0aWFsaXppbmcgbW9kdWxlIFwiJyArIG1vZHVsZU5hbWUgKyAnXCI6ICcgKyBlLm1lc3NhZ2UgKyBFT0wgKyAoZS5zdGFja3RyYWNlID8gZS5zdGFja3RyYWNlIDogJycpKTtcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgYW55IG1vZHVsZSB0aGF0IGZhaWxlZCB0byBsb2FkLCBleGNlcHQgV2ViIGFuZCBNb2IgbW9kdWxlc1xuICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgTW9iIGFuZCBXZWIgbW9kdWxlcyBsb2FkZWQsIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHNoYWxsIGZhaWxcbiAgICAgICAgICAgICAgICBpZiAobW9kdWxlTmFtZSA9PT0gJ3dlYicgfHwgbW9kdWxlTmFtZSA9PT0gJ21vYicpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2xvYWRJbnRlcm5hbE1vZHVsZXMoKSB7XG4gICAgICAgIC8vIGlmIGBtb2R1bGVzYCBpcyBlbXB0eSBvciB1bmRlZmluZWQgaW4gb3h5Z2VuLmNvbmYgdGhlbiBsb2FkIGFsbCBtb2R1bGVzXG4gICAgICAgIC8vIG90aGVyd2lzZSwgbG9hZCBvbmx5IHRob3NlIGltcGxpY2l0bHkgZGVmaW5lZFxuICAgICAgICBjb25zdCBleGNsdWRlVW5kZWZpbmVkTW9kcyA9IHRoaXMub3B0cy5tb2R1bGVzICYmIHRoaXMub3B0cy5tb2R1bGVzLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBvZiBPYmplY3Qua2V5cyhNb2R1bGVzKSkge1xuICAgICAgICAgICAgaWYgKGV4Y2x1ZGVVbmRlZmluZWRNb2RzICYmICF0aGlzLm9wdHMubW9kdWxlcy5pbmNsdWRlcyhtb2R1bGVOYW1lKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgTW9kdWxlQ2xhc3MgPSBNb2R1bGVzW21vZHVsZU5hbWVdO1xuICAgICAgICAgICAgY29uc3Qgb3hNb2R1bGVzRGlyUGF0aCA9IG94dXRpbC5nZXRPeE1vZHVsZXNEaXIoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIG5ldyBsb2dnZXIgZm9yIHRoZSBtb2R1bGVcbiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVMb2dnZXIgPSB0aGlzLl93cmFwTG9nZ2VyKGxvZ2dlcihgTW9kdWxlOiR7bW9kdWxlTmFtZX1gKSk7XG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBuZXcgbW9kdWxlIGluc3RhbmNlXG4gICAgICAgICAgICAgICAgY29uc3QgbW9kID0gY29yZVV0aWxzLmxvYWRNb2R1bGVGcm9tQ2xhc3MobW9kdWxlTmFtZSwgTW9kdWxlQ2xhc3MsIG1vZHVsZUxvZ2dlciwgb3hNb2R1bGVzRGlyUGF0aCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgLy8gY2FsbCBvbk1vZHVsZUxvYWRlZCBob29rXG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsbFNlcnZpY2VzT25Nb2R1bGVMb2FkZWQobW9kKTtcbiAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG1vZHVsZSB0byB0aGUgbW9kdWxlIGxpc3RcbiAgICAgICAgICAgICAgICB0aGlzLm1vZHVsZXNbbW9kdWxlTmFtZV0gPSBnbG9iYWwub3gubW9kdWxlc1ttb2R1bGVOYW1lXSA9IHRoaXMuX3dyYXBNb2R1bGUobW9kdWxlTmFtZSwgbW9kKTtcbiAgICAgICAgICAgICAgICAvLyB3cmFwIHVwXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSAoZW5kVGltZSAtIHN0YXJ0VGltZSkgLyAxMDAwO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMb2FkaW5nIG1vZHVsZTogJyArIG1vZHVsZU5hbWUgKyAnIFsgJyArIGR1cmF0aW9uICsgJyBzZWMgXScpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBpbml0aWFsaXppbmcgbW9kdWxlIFwiJyArIG1vZHVsZU5hbWUgKyAnXCI6ICcgKyBlLm1lc3NhZ2UgKyBFT0wgKyAoZS5zdGFja3RyYWNlID8gZS5zdGFja3RyYWNlIDogJycpKTtcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgYW55IG1vZHVsZSB0aGF0IGZhaWxlZCB0byBsb2FkLCBleGNlcHQgV2ViIGFuZCBNb2IgbW9kdWxlc1xuICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgTW9iIGFuZCBXZWIgbW9kdWxlcyBsb2FkZWQsIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHNoYWxsIGZhaWxcbiAgICAgICAgICAgICAgICBpZiAobW9kdWxlTmFtZSA9PT0gJ3dlYicgfHwgbW9kdWxlTmFtZSA9PT0gJ21vYicpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3dyYXBNb2R1bGUobmFtZSwgbW9kdWxlKSB7XG4gICAgICAgIGlmICghbW9kdWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSB7XG4gICAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcbiAgICAgICAgbGV0IG1vZHVsZU1ldGhvZHMgPSBPYmplY3Qua2V5cyhtb2R1bGUpO1xuICAgICAgICBpZiAoIW1vZHVsZU1ldGhvZHMuc29tZSh4ID0+IHg9PT0gJ2V4cG9ydHMnKSkge1xuICAgICAgICAgICAgbW9kdWxlTWV0aG9kcyA9IHRoaXMuX2dldEFsbFByb3BlcnR5TmFtZXMobW9kdWxlKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBtZXRob2ROYW1lIG9mIG1vZHVsZU1ldGhvZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IG1vZHVsZVttZXRob2ROYW1lXTtcbiAgICAgICAgICAgIC8vIGlnbm9yZSBhbnkgbW9kdWxlIHByb3BlcnR5IHRoYXQgaXMgbm90IGEgZnVuY3Rpb24gb3IgYSBPeHlnZW5TdWJNb2R1bGVcbiAgICAgICAgICAgIGlmICgoIShtZXRob2QgaW5zdGFuY2VvZiBGdW5jdGlvbikgJiYgIShtZXRob2QgaW5zdGFuY2VvZiBPeHlnZW5TdWJNb2R1bGUpICYmIHR5cGVvZiBtZXRob2QgIT09ICdmdW5jdGlvbicpIHx8IG1ldGhvZE5hbWUgPT09ICdleHBvcnRzJyB8fCBtZXRob2ROYW1lID09PSAnX2NvbXBpbGUnKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBtYXAgYW5kIHdyYXAgc3ViLW1vZHVsZSBtZXRob2RzIChyZWN1cnNpdmUgY2FsbCB0byBfd3JhcE1vZHVsZSlcbiAgICAgICAgICAgIGlmIChtZXRob2QgaW5zdGFuY2VvZiBPeHlnZW5TdWJNb2R1bGUpIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVyW21ldGhvZE5hbWVdID0gdGhpcy5fd3JhcE1vZHVsZShgJHtuYW1lfS4ke21ldGhvZE5hbWV9YCwgbWV0aG9kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGRvIG5vdCB3cmFwIG1ldGhvZHNcbiAgICAgICAgICAgIGVsc2UgaWYgKERPX05PVF9XUkFQX01FVEhPRFMuaW5jbHVkZXMobWV0aG9kTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAvLyA9PT0gJ2RyaXZlcicgfHwgbWV0aG9kTmFtZSA9PT0gJ2dldERyaXZlcidcbiAgICAgICAgICAgICAgICB3cmFwcGVyW21ldGhvZE5hbWVdID0gbW9kdWxlW21ldGhvZE5hbWVdLmJpbmQobW9kdWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHByaXZhdGUgbWV0aG9kcyBhbmQgZXZlbnQgaGFuZGxlcnNcbiAgICAgICAgICAgIGVsc2UgaWYgKG1ldGhvZE5hbWUuaW5kZXhPZignXycpID09PSAwIHx8IG1ldGhvZE5hbWUuaW5kZXhPZignb24nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHdyYXBwZXJbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmxvZ2dlci5kZWJ1ZygnRXhlY3V0aW5nOiAnICsgb3h1dGlsLmdldE1ldGhvZFNpZ25hdHVyZShuYW1lLCBtZXRob2ROYW1lLCBhcmdzKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGVbbWV0aG9kTmFtZV0uYXBwbHkobW9kdWxlLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3JIZWxwZXIuZ2V0T3h5Z2VuRXJyb3IoZSwgbmFtZSwgbWV0aG9kTmFtZSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGFuIGludGVybmFsIF9nZXRDYXBhYmlsaXRpZXMgbWV0aG9kIGZvciBpbnRlcm5hbCBPeHlnZW4gQ29yZSB1c2VcbiAgICAgICAgICAgICAgICAvLyBjYWxsaW5nIF9nZXRDYXBhYmlsaXRpZXMgbWV0aG9kIHdvbid0IGJlIHZpc2libGUgaW4gdGhlIHRlc3QgcmVzdWx0c1xuICAgICAgICAgICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnZ2V0Q2FwYWJpbGl0aWVzJykge1xuICAgICAgICAgICAgICAgICAgICB3cmFwcGVyWydfZ2V0Q2FwYWJpbGl0aWVzJ10gPSBtZXRob2QuYmluZChtb2R1bGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3cmFwcGVyW21ldGhvZE5hbWVdID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fY29tbWFuZFdyYXBwZXIobWV0aG9kTmFtZSwgYXJncywgbW9kdWxlLCBuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBPeEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnVGhyb3dpbmcgYWdhaW46JywgZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3JIZWxwZXIuZ2V0T3h5Z2VuRXJyb3IoZSwgbmFtZSwgbWV0aG9kTmFtZSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIF9jb21tYW5kV3JhcHBlcihjbWROYW1lLCBjbWRBcmdzLCBtb2R1bGUsIG1vZHVsZU5hbWUpIHtcbiAgICAgICAgaWYgKCFtb2R1bGUgfHwgIW1vZHVsZVtjbWROYW1lXSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXR2YWwgPSBudWxsO1xuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xuICAgICAgICBjb25zdCBjbWRGbiA9IG1vZHVsZVtjbWROYW1lXTtcbiAgICAgICAgY29uc3QgcHVibGljTWV0aG9kID0gIWNtZE5hbWUuc3RhcnRzV2l0aCgnXycpICYmIGNtZE5hbWUgIT09ICdkaXNwb3NlJztcblxuICAgICAgICAvLyBkZWxheSB0aGUgY29tbWFuZCBleGVjdXRpb24gaWYgcmVxdWlyZWRcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5vcHRzLmRlbGF5ICYmXG4gICAgICAgICAgICBwdWJsaWNNZXRob2QgJiZcbiAgICAgICAgICAgIGNtZE5hbWUgIT09ICdpbml0JyAmJlxuICAgICAgICAgICAgY21kTmFtZSAhPT0gJ3RyYW5zYWN0aW9uJ1xuICAgICAgICApIHtcbiAgICAgICAgICAgIGRlYXN5bmMuc2xlZXAodGhpcy5vcHRzLmRlbGF5ICogMTAwMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aHJvdyBpZiBhIGNvbW1hbmQgZXhlY3V0ZWQgb24gdW5pdGlhbGl6ZWQgbW9kdWxlIChleGNlcHQgaW50ZXJuYWwgbWV0aG9kcyBhbmQgYSBmZXcgb3RoZXIpXG4gICAgICAgIGlmICghbW9kdWxlLmlzSW5pdGlhbGl6ZWQgJiYgcHVibGljTWV0aG9kICYmIGNtZE5hbWUgIT09ICdpbml0JyAmJiBjbWROYW1lICE9PSAndHJhbnNhY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJvckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ01pc3NpbmcgJyArIG1vZHVsZU5hbWUgKyAnLmluaXQoKScpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZGVjdHlwdCBhcmd1bWVudHNcbiAgICAgICAgbGV0IGRlY3J5cHRlZEFyZ3MgPSB0aGlzLl9nZXREZWNyeXB0ZWRBcmdzRm9yQXBwbHkoY21kQXJncywgbW9kdWxlTmFtZSk7XG4gICAgICAgIGRlY3J5cHRlZEFyZ3MgPSB0aGlzLl9wb3B1bGF0ZVBhcmFtZXRlcnNWYWx1ZShkZWNyeXB0ZWRBcmdzKTtcblxuICAgICAgICAvLyByZXBsYWNlIHBhcmFtZXRlcnMgaW4gbWV0aG9kIGFyZ3VtZW50cyB3aXRoIGNvcnJlc3BvbmRpbmcgdmFsdWVzXG4gICAgICAgIGNtZEFyZ3MgPSB0aGlzLl9wb3B1bGF0ZVBhcmFtZXRlcnNWYWx1ZShjbWRBcmdzKTtcbiAgICAgICAgLy8gc3RhcnQgbWVhc3VyaW5nIG1ldGhvZCBleGVjdXRpb24gdGltZVxuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XG5cbiAgICAgICAgLy8gYWRkIGNvbW1hbmQgbG9jYXRpb24gaW5mb3JtYXRpb24gKGUuZy4gZmlsZSBuYW1lIGFuZCBjb21tYW5kIGxpbmUpXG4gICAgICAgIGxldCBjbWRMb2NhdGlvbiA9IG51bGw7XG4gICAgICAgIC8vIGdlbmVyYXRlIHN0ZXAgcmVzdWx0IGlkXG4gICAgICAgIGNvbnN0IHN0ZXBSZXN1bHRJZCA9IHYxKCk7XG4gICAgICAgIC8vIGRvIG5vdCByZXBvcnQgcmVzdWx0cyBvciBsaW5lIHVwZGF0ZXMgb24gaW50ZXJuYWwgbWV0aG9kcyAoc3RhcnRlZCB3aXRoICdfJylcbiAgICAgICAgaWYgKHB1YmxpY01ldGhvZCkge1xuICAgICAgICAgICAgY21kTG9jYXRpb24gPSB0aGlzLl9nZXRDb21tYW5kTG9jYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdEJlZm9yZUNvbW1hbmQoc3RlcFJlc3VsdElkLCBjbWROYW1lLCBtb2R1bGVOYW1lLCBjbWRGbiwgY21kQXJncywgdGhpcy5jdHgsIGNtZExvY2F0aW9uLCBzdGFydFRpbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0V4ZWN1dGluZzogJyArIG94dXRpbC5nZXRNZXRob2RTaWduYXR1cmUobW9kdWxlTmFtZSwgY21kTmFtZSwgY21kQXJncykpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBlbWl0IGJlZm9yZSBldmVudHNcbiAgICAgICAgICAgIGlmIChjbWROYW1lID09PSAnZGlzcG9zZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93cmFwQXN5bmModGhpcy5fY2FsbFNlcnZpY2VzT25Nb2R1bGVXaWxsRGlzcG9zZSkuYXBwbHkodGhpcywgW21vZHVsZV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZXR2YWxQcm9taXNlID0gdGhpcy5fd3JhcEFzeW5jKG1vZHVsZVtjbWROYW1lXSkuYXBwbHkobW9kdWxlLCBkZWNyeXB0ZWRBcmdzKTtcblxuICAgICAgICAgICAgaWYgKHJldHZhbFByb21pc2UgJiYgcmV0dmFsUHJvbWlzZS50aGVuKSB7XG4gICAgICAgICAgICAgICAgbGV0IHByb21pc2VEb25lID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICByZXR2YWxQcm9taXNlLnRoZW4oKHZhbHVlKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHByb21pc2VEb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9LCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGU7XG4gICAgICAgICAgICAgICAgICAgIHByb21pc2VEb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGRlYXN5bmMubG9vcFdoaWxlKCgpID0+ICFwcm9taXNlRG9uZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHZhbCA9IHJldHZhbFByb21pc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjbWROYW1lID09PSAnaW5pdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93cmFwQXN5bmModGhpcy5fY2FsbFNlcnZpY2VzT25Nb2R1bGVJbml0aWFsaXplZCkuYXBwbHkodGhpcywgW21vZHVsZV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlICYmIGUubWVzc2FnZSAmJiB0eXBlb2YgZS5tZXNzYWdlID09PSAnc3RyaW5nJyAmJiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ2ludmFsaWQgc2Vzc2lvbiBpZCcpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nIGlmIGVycm9yIG9jdXJyZWQgYWZ0ZXIgdGhlIG1vZHVsZSB3YXMgZGlzcG9zZWQgKG9yIGluIGEgcHJvY2VzcyBvZiBiZWluZyBkaXNwb3NlZClcbiAgICAgICAgICAgICAgICAvLyBleGNlcHQgZm9yIGluaXQgbWV0aG9kcyBvZiBjb3Vyc2VcbiAgICAgICAgICAgICAgICBpZiAobW9kdWxlICYmXG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgbW9kdWxlLmlzSW5pdGlhbGl6ZWQgPT09ICdib29sZWFuJyAmJiAhbW9kdWxlLmlzSW5pdGlhbGl6ZWQpXG4gICAgICAgICAgICAgICAgICAgICYmIGNtZE5hbWUgIT09ICdpbml0Jykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJz09PT0gZXJyb3IgPT09PScsIGUpXG4gICAgICAgICAgICAgICAgZXJyb3IgPSBlcnJvckhlbHBlci5nZXRPeHlnZW5FcnJvcihlLCBtb2R1bGVOYW1lLCBjbWROYW1lLCBjbWRBcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVuZFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XG5cbiAgICAgICAgbGV0IHN0ZXBSZXN1bHQ7XG4gICAgICAgIGxldCBkb25lID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHB1YmxpY01ldGhvZCkge1xuICAgICAgICAgICAgY29uc3Qgd2FpdElkID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICB0aGlzLl93YWl0U3RlcFJlc3VsdExpc3QucHVzaCh3YWl0SWQpO1xuXG4gICAgICAgICAgICBzdGVwUmVzdWx0ID0gdGhpcy5fZ2V0U3RlcFJlc3VsdChtb2R1bGUsIG1vZHVsZU5hbWUsIGNtZE5hbWUsIGNtZEFyZ3MsIGNtZExvY2F0aW9uLCBzdGFydFRpbWUsIGVuZFRpbWUsIHJldHZhbCwgZXJyb3IpO1xuICAgICAgICAgICAgc3RlcFJlc3VsdC5pZCA9IHN0ZXBSZXN1bHRJZDtcblxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl93YWl0U3RlcFJlc3VsdExpc3QuaW5kZXhPZih3YWl0SWQpO1xuICAgICAgICAgICAgdGhpcy5fd2FpdFN0ZXBSZXN1bHRMaXN0LnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgICAgIC8vc3RlcFJlc3VsdC5sb2NhdGlvbiA9IGNtZExvY2F0aW9uO1xuXG4gICAgICAgICAgICB0aGlzLnJlc3VsdFN0b3JlLnN0ZXBzLnB1c2goc3RlcFJlc3VsdCk7XG4gICAgICAgICAgICB0aGlzLmVtaXRBZnRlckNvbW1hbmQoY21kTmFtZSwgbW9kdWxlTmFtZSwgY21kRm4sIGNtZEFyZ3MsIHRoaXMuY3R4LCBjbWRMb2NhdGlvbiwgZW5kVGltZSwgc3RlcFJlc3VsdCk7XG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5pc0ZhdGFsICYmICF0aGlzLm9wdHMuY29udGludWVPbkVycm9yKSB7XG4gICAgICAgICAgICBpZiAoIWVycm9yLmxvY2F0aW9uICYmIGNtZExvY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IubG9jYXRpb24gPSBjbWRMb2NhdGlvbjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bHQgJiYgc3RlcFJlc3VsdC5mYWlsdXJlICYmIHN0ZXBSZXN1bHQuZmFpbHVyZS5sb2NhdGlvbikge1xuICAgICAgICAgICAgICAgIGVycm9yLmxvY2F0aW9uID0gc3RlcFJlc3VsdC5mYWlsdXJlLmxvY2F0aW9uO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcHVibGljTWV0aG9kKSB7XG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlYXN5bmMubG9vcFdoaWxlKCgpID0+ICFkb25lICYmICFlcnJvcik7XG5cbiAgICAgICAgcmV0dXJuIHJldHZhbDtcbiAgICB9XG5cbiAgICBfd3JhcEFzeW5jIChmbiwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHZhciBzZWxmID0gY29udGV4dCB8fCB0aGlzO1xuICAgICAgICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgY29kZSBpcyBub3QgcnVubmluZyBpbnNpZGUgdGhlIEZpYmVyIGNvbnRleHQsIHRoZW4gcnVuIGFzeW5jIGNvZGUgYXMgc3luYyB1c2luZyBkZWFzeW5jIG1vZHVsZVxuICAgICAgICAgICAgaWYgKCFGaWJlci5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0dmFsID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cbiAgICAgICAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsVmFsID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgJiYgcmV0dmFsLnRoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHJldHZhbClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHZhbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxWYWwgPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmluYWxWYWwgPSByZXR2YWw7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYXN5bmMubG9vcFdoaWxlKCgpID0+ICFkb25lICYmICFlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5tZXNzYWdlICYmIHR5cGVvZiBlLm1lc3NhZ2UgPT09ICdzdHJpbmcnICYmIGUubWVzc2FnZS5pbmNsdWRlcygncmVhZHlTdGF0ZScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoaXMgZXJyb3IgYXMgaXQgdXN1YWxseSBoYXBwZW5zIFxuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIE94eWdlbiBpcyBkaXNwb3NlZCBhbmQgcHJvY2VzcyBpcyBiZWluZyBraWxsZWRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ2RlYXN5bmMubG9vcFdoaWxlKCkgZmFpbGVkOicsIGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbmFsVmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGVycm9yID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcmV0dmFsID0gbnVsbDtcblxuICAgICAgICAgICAgdHJ5IHtcblxuICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaWYgd2UgYXJlIGluc2lkZSB0aGUgRmliZXIgY29udGV4dCwgdGhlbiB1c2UgRmliZXIncyBGdXR1cmVcbiAgICAgICAgICAgICAgICBjb25zdCBmdXR1cmUgPSBuZXcgRnV0dXJlKCk7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdC50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWwpID0+IGZ1dHVyZS5yZXR1cm4odmFsKSwgKGVycikgPT4gZnV0dXJlLnRocm93KGVycikpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnV0dXJlLndhaXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGVycm9yID0gZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVhc3luYy5sb29wV2hpbGUoKCkgPT4gIWRvbmUgJiYgIWVycm9yKTtcblxuICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyByZXRyaWV2ZSBjdXJyZW50IGxpbmUgYW5kIGZ1bmN0aW9uIG5hbWUgZnJvbSB0aGUgY2FsbCBzdGFja1xuICAgIF9nZXRDb21tYW5kTG9jYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IHN0YWNrID0gX19zdGFjaztcbiAgICAgICAgbGV0IGNhbGxlciA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGNhbGwgb2Ygc3RhY2spIHtcbiAgICAgICAgICAgIGlmIChfX2ZpbGVuYW1lID09PSBjYWxsLmdldEZpbGVOYW1lKCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJldHVybiB0aGUgZmlyc3QgY2FsbGVyLCB3aGljaCBpcyBub3QgdGhlIGN1cnJlbnQgZmlsZVxuICAgICAgICAgICAgY2FsbGVyID0gY2FsbDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYWxsZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtjYWxsZXIuZ2V0RmlsZU5hbWUoKX06JHtjYWxsZXIuZ2V0TGluZU51bWJlcigpICsgdGhpcy5hZGp1c3RTY3JpcHRMaW5lfToke2NhbGxlci5nZXRDb2x1bW5OdW1iZXIoKX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIF9nZXRTdGVwUmVzdWx0KG1vZHVsZSwgbW9kdWxlTmFtZSwgbWV0aG9kTmFtZSwgYXJncywgbG9jYXRpb24sIHN0YXJ0VGltZSwgZW5kVGltZSwgcmV0dmFsLCBlcnIpIHtcbiAgICAgICAgdmFyIHN0ZXAgPSBuZXcgU3RlcFJlc3VsdCgpO1xuXG4gICAgICAgIGNvbnN0IGRpc3BsYXlOYW1lID1cbiAgICAgICAgICAgIChtb2R1bGUuZ2V0U3RlcERpc3BsYXlOYW1lICYmIG1vZHVsZS5nZXRTdGVwRGlzcGxheU5hbWUobWV0aG9kTmFtZSwgYXJncywgcmV0dmFsLCBlcnIpKSB8fFxuICAgICAgICAgICAgb3h1dGlsLmdldE1ldGhvZFNpZ25hdHVyZShtb2R1bGVOYW1lLCBtZXRob2ROYW1lLCBhcmdzKTtcblxuICAgICAgICBzdGVwLm5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgICAgICAgc3RlcC50cmFuc2FjdGlvbiA9IGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSB8fCBudWxsOyAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogd2h5IGlzIHRoaXMgaGVyZSBpZiBpdCdzIGFscmVhZHkgcG9wdWxhdGVkIGluIHJzP1xuICAgICAgICBzdGVwLmxvY2F0aW9uID0gbG9jYXRpb247XG4gICAgICAgIC8vIG1vZHVsZS5leHRyYSBpcyByZXNldGVkIGZvciBlYWNoIHN0ZXAsIHNvIHdlIG11c3QgY2xvbmUgaXRcbiAgICAgICAgc3RlcC5leHRyYSA9IHsgLi4ubW9kdWxlLmV4dHJhIH07XG4gICAgICAgIGlmIChtb2R1bGUuZXh0cmEgJiYgbW9kdWxlLmV4dHJhLmh0dHApIHtcbiAgICAgICAgICAgIHN0ZXAudHlwZSA9ICdodHRwJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnIgJiYgZXJyLnR5cGUgJiYgZXJyLnR5cGUgPT09IGVycm9ySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfUEFTU0VEKSB7XG4gICAgICAgICAgICBzdGVwLnN0YXR1cyA9IFNUQVRVUy5QQVNTRUQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBkZXRlcm1pbmUgc3RlcCBzdGF0dXNcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyLmlzRmF0YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RlcC5zdGF0dXMgPSBTVEFUVVMuRkFJTEVEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RlcC5zdGF0dXMgPSBTVEFUVVMuV0FSTklORztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtb2R1bGVOYW1lID09PSAnbG9nJyAmJiBtZXRob2ROYW1lID09PSAnd2FybicpIHtcbiAgICAgICAgICAgICAgICBzdGVwLnN0YXR1cyA9IFNUQVRVUy5XQVJOSU5HO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RlcC5zdGF0dXMgPSBTVEFUVVMuUEFTU0VEO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3RlcC5hY3Rpb24gPSAodHlwZW9mIG1vZHVsZS5faXNBY3Rpb24gPT09ICdmdW5jdGlvbicgPyBtb2R1bGUuX2lzQWN0aW9uKG1ldGhvZE5hbWUpIDogZmFsc2UpO1xuICAgICAgICBzdGVwLnN0YXJ0VGltZSA9IHN0YXJ0VGltZTtcbiAgICAgICAgc3RlcC5lbmRUaW1lID0gZW5kVGltZTtcbiAgICAgICAgc3RlcC5kdXJhdGlvbiA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGUuX2dldFN0YXRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzdGVwLnN0YXRzID0gbW9kdWxlLl9nZXRTdGF0cyhtZXRob2ROYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0ZXAuc3RhdHMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChlcnIudHlwZSA9PT0gZXJyb3JIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9QQVNTRUQpIHtcbiAgICAgICAgICAgICAgICAvL2lnbm9yZWRcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RlcC5mYWlsdXJlID0gZXJyb3JIZWxwZXIuZ2V0RmFpbHVyZUZyb21FcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHN0ZXAuZmFpbHVyZS5sb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgICAgICAgICAgICAgIC8vIGxldCB0aGUgbW9kdWxlIGRlY2lkZSB3aGV0aGVyIGEgc2NyZWVuc2hvdCBzaG91bGQgYmUgdGFrZW4gb24gZXJyb3Igb3Igbm90XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGUuX3Rha2VTY3JlZW5zaG90U2lsZW50ID09PSAnZnVuY3Rpb24nICYmICF0aGlzLm9wdHMuZGlzYWJsZVNjcmVlbnNob3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAuc2NyZWVuc2hvdCA9IG1vZHVsZS5fdGFrZVNjcmVlbnNob3RTaWxlbnQobWV0aG9kTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBoZXJlLCB3ZSB3ZXJlIHVuYWJsZSB0byBnZXQgYSBzY3JlZW5zaG90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gd2FpdCBmb3IgYSBtb21lbnQgKGluIFBlcmZlY3RvIENsb3VkLCB0aGUgc2NyZWVuc2hvdCBtaWdodCBub3QgYmUgaW1taWRpYXRlbHkgYXZhaWxhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGVhc3luYy5zbGVlcCgxMDAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5zY3JlZW5zaG90ID0gbW9kdWxlLl90YWtlU2NyZWVuc2hvdFNpbGVudChtZXRob2ROYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IGluZGljYXRlIHRvIHVzZXIgdGhhdCBhbiBhdHRlbXB0IHRvIHRha2UgYSBzY3JlZW5zaG90IGhhcyBmYWlsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RlcDtcbiAgICB9XG5cbiAgICBhc3luYyBfZGlzcG9zZVNlcnZpY2VzKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2VydmljZXMgfHwgdHlwZW9mIHRoaXMuc2VydmljZXMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMuc2VydmljZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnNlcnZpY2VzW2tleV07XG4gICAgICAgICAgICBpZiAoc2VydmljZS5kaXNwb3NlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2VydmljZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBzZXJ2aWNlIGRpc3Bvc2FsIGVycm9yXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZGlzcG9zZSBzZXJ2aWNlICcke2tleX0nOmAsIGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBhc3luYyBfZGlzcG9zZU1vZHVsZXMoc3RhdHVzID0gbnVsbCkge1xuICAgICAgICBpZiAoIXRoaXMubW9kdWxlcyB8fCB0eXBlb2YgdGhpcy5tb2R1bGVzICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLm1vZHVsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vZCA9IHRoaXMubW9kdWxlc1trZXldO1xuXG4gICAgICAgICAgICBpZiAobW9kLmRpc3Bvc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNwb3NlUmVzdWx0ID0gbW9kLmRpc3Bvc2Uoc3RhdHVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2VSZXN1bHQgJiYgdHlwZW9mIGRpc3Bvc2VSZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvYmFibHkgYSBwcm9taXNlXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBkaXNwb3NlUmVzdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIG1vZHVsZSBkaXNwb3NhbCBlcnJvciBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBkaXNwb3NlIG1vZHVsZSAnJHtrZXl9JzogYCwgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKlxuICAgICAqIFNlcnZpY2VzIEV2ZW50IEVtaXR0ZXJzXG4gICAgICovXG4gICAgX2NhbGxTZXJ2aWNlc09uTW9kdWxlTG9hZGVkKG1vZHVsZSkge1xuICAgICAgICBmb3IgKGxldCBzZXJ2aWNlTmFtZSBpbiB0aGlzLnNlcnZpY2VzKSB7XG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV07XG4gICAgICAgICAgICBpZiAoIXNlcnZpY2UpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc2VydmljZS5vbk1vZHVsZUxvYWRlZChtb2R1bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNhbGwgXCJvbk1vZHVsZUxvYWRlZFwiIG1ldGhvZCBvZiAke3NlcnZpY2VOYW1lfSBzZXJ2aWNlLmAsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIF9jYWxsU2VydmljZXNPbk1vZHVsZUluaXRpYWxpemVkKG1vZHVsZSkge1xuICAgICAgICBmb3IgKGxldCBzZXJ2aWNlTmFtZSBpbiB0aGlzLnNlcnZpY2VzKSB7XG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV07XG4gICAgICAgICAgICBpZiAoIXNlcnZpY2UpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgc2VydmljZS5vbk1vZHVsZUluaXRpYWxpemVkKG1vZHVsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gY2FsbCBcIm9uTW9kdWxlSW5pdGlhbGl6ZWRcIiBtZXRob2Qgb2YgJHtzZXJ2aWNlTmFtZX0gc2VydmljZS5gLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBfY2FsbFNlcnZpY2VzT25Nb2R1bGVXaWxsRGlzcG9zZShtb2R1bGUpIHtcbiAgICAgICAgaWYgKCF0aGlzIHx8ICF0aGlzLnNlcnZpY2VzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgc2VydmljZU5hbWUgaW4gdGhpcy5zZXJ2aWNlcykge1xuICAgICAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuc2VydmljZXNbc2VydmljZU5hbWVdO1xuICAgICAgICAgICAgaWYgKCFzZXJ2aWNlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlLm9uTW9kdWxlV2lsbERpc3Bvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbk1vZHVsZVdpbGxEaXNwb3NlKG1vZHVsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNhbGwgXCJvbk1vZHVsZVdpbGxEaXNwb3NlXCIgbWV0aG9kIG9mICR7c2VydmljZU5hbWV9IHNlcnZpY2UuYCwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgX3BvcHVsYXRlUGFyYW1ldGVyc1ZhbHVlKGFyZ3MpIHtcbiAgICAgICAgaWYgKCFhcmdzIHx8ICFBcnJheS5pc0FycmF5KGFyZ3MpIHx8IGFyZ3MubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBhcmdzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IF9uZXdBcmdzID0gW107XG4gICAgICAgIGZvciAobGV0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICBfbmV3QXJncy5wdXNoKHRoaXMuX3JlcGxhY2VQYXJhbWV0ZXJJbkFyZ3VtZW50KGFyZykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfbmV3QXJncztcbiAgICB9XG4gICAgX3JlcGxhY2VQYXJhbWV0ZXJJbkFyZ3VtZW50KGFyZykge1xuICAgICAgICBpZiAoYXJnICYmIHR5cGVvZiBhcmcuZ2V0RGVjcnlwdFJlc3VsdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuICdFTkNSWVBURUQnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFhcmcgfHwgdHlwZW9mIGFyZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBhcmc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVwbGFjZSB1c2VyIHBhcmFtZXRlcnMgd2l0aCB2YWx1ZXNcbiAgICAgICAgLy8gbm90ZTogdXNlciBwYXJhbWV0ZXIgd2l0aCB0aGUgc2FtZSBuYW1lIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBlbnZpcm9ubWVudCB2YXJpYWJsZVxuICAgICAgICBmb3IgKGxldCBwYXJhbU5hbWUgaW4gdGhpcy5jdHgucGFyYW1zKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdHgucGFyYW1zLmhhc093blByb3BlcnR5KHBhcmFtTmFtZSkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1WYWx1ZSA9IHRoaXMuY3R4LnBhcmFtc1twYXJhbU5hbWVdO1xuICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFwkeycgKyBwYXJhbU5hbWUgKyAnfScsICdnJyksIHBhcmFtVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHJlcGxhY2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpdGggdmFsdWVzXG4gICAgICAgIGZvciAobGV0IGVudk5hbWUgaW4gdGhpcy5jdHguZW52KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdHguZW52Lmhhc093blByb3BlcnR5KGVudk5hbWUpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudlZhbHVlID0gdGhpcy5jdHguZW52W2Vudk5hbWVdO1xuICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFwkeycgKyBlbnZOYW1lICsgJ30nLCAnZycpLCBlbnZWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyZztcbiAgICB9XG4gICAgX2dldEFsbFByb3BlcnR5TmFtZXMoIG9iaiApIHtcbiAgICAgICAgY29uc3QgcHJvcHMgPSBbXTtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyggb2JqICkuZm9yRWFjaChmdW5jdGlvbiAoIHByb3AgKSB7XG4gICAgICAgICAgICAgICAgaWYgKCBwcm9wcy5pbmRleE9mKCBwcm9wICkgPT09IC0xICkge1xuICAgICAgICAgICAgICAgICAgICBwcm9wcy5wdXNoKCBwcm9wICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uZC1hc3NpZ25cbiAgICAgICAgfSB3aGlsZSAoIG9iaiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiggb2JqICkgKTtcblxuICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgfVxuXG4gICAgX2NoZWNrU3RlcFJlc3VsdChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRTdGVwUmVzdWx0TGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrU3RlcFJlc3VsdChyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3dhaXRTdGVwUmVzdWx0KCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fY2hlY2tTdGVwUmVzdWx0KHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9nZXREZWNyeXB0ZWRBcmdzRm9yQXBwbHkoYXJncywgbW9kdWxlTmFtZSkge1xuICAgICAgICBpZiAoIWFyZ3MgfHwgIUFycmF5LmlzQXJyYXkoYXJncykgfHwgYXJncy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3M7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgX25ld0FyZ3MgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgYXJnIG9mIGFyZ3MpIHtcbiAgICAgICAgICAgIF9uZXdBcmdzLnB1c2godGhpcy5fZGVjcnlwdFBhcmFtZXRlckZvckFwcGx5SW5Bcmd1bWVudChhcmcsIG1vZHVsZU5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX25ld0FyZ3M7XG4gICAgfVxuXG4gICAgX2RlY3J5cHRQYXJhbWV0ZXJGb3JBcHBseUluQXJndW1lbnQoYXJnLCBtb2R1bGVOYW1lKSB7XG4gICAgICAgIGlmIChhcmcgJiYgdHlwZW9mIGFyZy5nZXREZWNyeXB0UmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAobW9kdWxlTmFtZSA9PT0gJ2xvZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0VOQ1JZUFRFRCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcmcuZ2V0RGVjcnlwdFJlc3VsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFyZztcbiAgICB9XG59XG4iXX0=
|
|
1078
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL094eWdlbkNvcmUuanMiXSwibmFtZXMiOlsidjEiLCJyZXF1aXJlIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnbG9iYWwiLCJnZXQiLCJvcmlnIiwiRXJyb3IiLCJwcmVwYXJlU3RhY2tUcmFjZSIsIl8iLCJzdGFjayIsImVyciIsImNhcHR1cmVTdGFja1RyYWNlIiwiREVGQVVMVF9USU1FT1VUIiwiREVGQVVMVF9PUFRTIiwiYmFja3RyYWNlIiwiY29tcGlsZXIiLCJmYWlsQW1iaWd1b3VzRGVmaW5pdGlvbnMiLCJmYWlsRmFzdCIsImlnbm9yZVVuZGVmaW5lZERlZmluaXRpb25zIiwibmFtZSIsInByb2ZpbGUiLCJvcmRlciIsInNuaXBwZXRTeW50YXgiLCJ1bmRlZmluZWQiLCJzbmlwcGV0cyIsInNvdXJjZSIsInN0cmljdCIsInRhZ0V4cHJlc3Npb24iLCJ0YWdzSW5UaXRsZSIsInRpbWVvdXQiLCJNT0RVTEVfTkFNRV9NQVRDSF9SRUdFWCIsIlNFUlZJQ0VfTkFNRV9NQVRDSF9SRUdFWCIsIkRPX05PVF9XUkFQX01FVEhPRFMiLCJERUZBVUxUX0NUWCIsInBhcmFtcyIsInZhcnMiLCJlbnYiLCJjYXBzIiwiYXR0cmlidXRlcyIsIkRFRkFVTFRfUkVTVUxUX1NUT1JFIiwic3RlcHMiLCJsb2dzIiwiYXR0YWNobWVudHMiLCJoYXIiLCJPeHlnZW4iLCJPeHlnZW5FdmVudHMiLCJjb25zdHJ1Y3RvciIsImlzSW5pdGlhbGl6ZWQiLCJyZXN1bHRTdG9yZSIsImN0eCIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsInJlcG8iLCJjYXBhYmlsaXRpZXMiLCJvcHRzIiwib3hCYXNlRGlyIiwicGF0aCIsImpvaW4iLCJfX2Rpcm5hbWUiLCJsb2dnZXIiLCJfd3JhcExvZ2dlciIsIl93YWl0U3RlcFJlc3VsdExpc3QiLCJpbml0Iiwib3B0aW9ucyIsInJlc3VsdHMiLCJhc3NpZ24iLCJjd2QiLCJwcm9jZXNzIiwia2V5cyIsImxlbmd0aCIsIm1ha2VPeEdsb2JhbCIsIl9sb2FkU2VydmljZXMiLCJfbG9hZE1vZHVsZXMiLCJnbG9iYWxTY29wZSIsIm1ha2VDb250ZXh0QW5kTW9kdWxlc0dsb2JhbCIsImRpc3Bvc2VNb2R1bGVzIiwic3RhdHVzIiwiX2Rpc3Bvc2VNb2R1bGVzIiwiZSIsImNvbnNvbGUiLCJlcnJvciIsImRpc3Bvc2UiLCJfZGlzcG9zZVNlcnZpY2VzIiwiYWRqdXN0U2NyaXB0TGluZSIsImlzSW5EZWJ1Z01vZGUiLCJveHV0aWwiLCJyZXN1bHQiLCJjb250ZXh0Iiwib3giLCJyZXBvc2l0b3J5IiwidHJhbnNTdGVwIiwiaW5jbHVkZXMiLCJ0cmFuc05hbWUiLCJ0cmFuc2FjdGlvbiIsImR1cmF0aW9uIiwic3RlcCIsImVuZFRpbWUiLCJTVEFUVVMiLCJXQVJOSU5HIiwiZ2V0TW9kdWxlc0NhcGFiaWxpdGllcyIsIm1vZENhcHMiLCJtb2R1bGVOYW1lIiwibW9kdWxlIiwiX2dldENhcGFiaWxpdGllcyIsInJlc2V0UmVzdWx0cyIsIm9uQmVmb3JlQ2FzZSIsIl9pdGVyYXRpb25TdGFydCIsIm9uQWZ0ZXJDYXNlIiwiX2l0ZXJhdGlvbkVuZCIsImFkZEF0dHJpYnV0ZSIsImJpbmQiLCJhZGRBdHRhY2htZW50IiwidmFsdWUiLCJPeEVycm9yIiwiZXJyb3JIZWxwZXIiLCJlcnJvckNvZGUiLCJTQ1JJUFRfRVJST1IiLCJmaWxlUGF0aCIsImZzIiwiZXhpc3RzU3luYyIsInB1c2giLCJjb3JlVXRpbHMiLCJuZXdGaWxlQXR0YWNobWVudCIsImxvYWRQYWdlT2JqZWN0RmlsZSIsInBvUGF0aCIsInBvIiwiX2xvZ2dlciIsImxvZ2dlcldyYXAiLCJpbmZvIiwiYXJncyIsIl9sb2ciLCJkZWJ1ZyIsIndhcm4iLCJ1c2VySW5mbyIsIklTU1VFUlMiLCJVU0VSIiwidXNlckRlYnVnIiwidXNlckVycm9yIiwidXNlcldhcm4iLCJsZXZlbCIsInNyYyIsIkRFRkFVTFRfTE9HR0VSX0lTU1VFUiIsImFwcGx5IiwibWVzc2FnZSIsInN0cmluZ2lmeSIsInRpbWUiLCJnZXRUaW1lU3RhbXAiLCJ0b1VwcGVyQ2FzZSIsIm1zZyIsInNoaWZ0IiwiZW1pdExvZyIsIm94U2VydmljZXNEaXJQYXRoIiwicmVzb2x2ZSIsInNlcnZpY2VGaWxlcyIsImdsb2IiLCJzeW5jIiwiaSIsInNlcnZpY2VGaWxlTmFtZSIsInNlcnZpY2VGaWxlUGF0aCIsIm1hdGNoIiwic2VydmljZU5hbWUiLCJBcnJheSIsImlzQXJyYXkiLCJzZXJ2aWNlIiwiX2xvYWRTZXJ2aWNlIiwiRU9MIiwic3RhY2t0cmFjZSIsInNlcnZpY2VQYXRoIiwiU2VydmljZUNsYXNzIiwiZGVmYXVsdCIsInNlcnZpY2VMb2dnZXIiLCJfbG9hZEludGVybmFsTW9kdWxlcyIsIl9sb2FkRXh0ZXJuYWxNb2R1bGVzIiwibW9kdWxlc0ZvbGRlclBhdGgiLCJtb2R1bGVzX2V4dCIsIm94TW9kdWxlc0RpclBhdGgiLCJtb2R1bGVGaWxlcyIsImZvckVhY2giLCJtb2R1bGVGaWxlTmFtZSIsInN0YXJ0VGltZSIsIkRhdGUiLCJtb2R1bGVMb2dnZXIiLCJtb2QiLCJsb2FkTW9kdWxlRnJvbUZpbGUiLCJfY2FsbFNlcnZpY2VzT25Nb2R1bGVMb2FkZWQiLCJfd3JhcE1vZHVsZSIsImV4Y2x1ZGVVbmRlZmluZWRNb2RzIiwiTW9kdWxlcyIsIk1vZHVsZUNsYXNzIiwiZ2V0T3hNb2R1bGVzRGlyIiwibG9hZE1vZHVsZUZyb21DbGFzcyIsIndyYXBwZXIiLCJfdGhpcyIsIm1vZHVsZU1ldGhvZHMiLCJzb21lIiwieCIsIl9nZXRBbGxQcm9wZXJ0eU5hbWVzIiwibWV0aG9kTmFtZSIsIm1ldGhvZCIsIkZ1bmN0aW9uIiwiT3h5Z2VuU3ViTW9kdWxlIiwiaW5kZXhPZiIsInByb3RvdHlwZSIsInNsaWNlIiwiY2FsbCIsImFyZ3VtZW50cyIsImdldE1ldGhvZFNpZ25hdHVyZSIsImdldE94eWdlbkVycm9yIiwiX2NvbW1hbmRXcmFwcGVyIiwiY21kTmFtZSIsImNtZEFyZ3MiLCJyZXR2YWwiLCJjbWRGbiIsInB1YmxpY01ldGhvZCIsInN0YXJ0c1dpdGgiLCJkZWxheSIsImRlYXN5bmMiLCJzbGVlcCIsIk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IiLCJkZWNyeXB0ZWRBcmdzIiwiX2dldERlY3J5cHRlZEFyZ3NGb3JBcHBseSIsIl9wb3B1bGF0ZVBhcmFtZXRlcnNWYWx1ZSIsImNtZExvY2F0aW9uIiwic3RlcFJlc3VsdElkIiwiX2dldENvbW1hbmRMb2NhdGlvbiIsImVtaXRCZWZvcmVDb21tYW5kIiwiX3dyYXBBc3luYyIsIl9jYWxsU2VydmljZXNPbk1vZHVsZVdpbGxEaXNwb3NlIiwicmV0dmFsUHJvbWlzZSIsInRoZW4iLCJwcm9taXNlRG9uZSIsImxvb3BXaGlsZSIsIl9jYWxsU2VydmljZXNPbk1vZHVsZUluaXRpYWxpemVkIiwic3RlcFJlc3VsdCIsImRvbmUiLCJ3YWl0SWQiLCJfZ2V0U3RlcFJlc3VsdCIsImlkIiwiaW5kZXgiLCJzcGxpY2UiLCJlbWl0QWZ0ZXJDb21tYW5kIiwiaXNGYXRhbCIsImNvbnRpbnVlT25FcnJvciIsImxvY2F0aW9uIiwiZmFpbHVyZSIsImZuIiwic2VsZiIsIkZpYmVyIiwiY3VycmVudCIsImZpbmFsVmFsIiwiUHJvbWlzZSIsInZhbCIsImNhdGNoIiwiZnV0dXJlIiwiRnV0dXJlIiwicmV0dXJuIiwidGhyb3ciLCJ3YWl0IiwiX19zdGFjayIsImNhbGxlciIsIl9fZmlsZW5hbWUiLCJnZXRGaWxlTmFtZSIsImdldExpbmVOdW1iZXIiLCJnZXRDb2x1bW5OdW1iZXIiLCJTdGVwUmVzdWx0IiwiZGlzcGxheU5hbWUiLCJnZXRTdGVwRGlzcGxheU5hbWUiLCJfbGFzdFRyYW5zYWN0aW9uTmFtZSIsImV4dHJhIiwiaHR0cCIsInR5cGUiLCJBU1NFUlRfUEFTU0VEIiwiUEFTU0VEIiwiRkFJTEVEIiwiYWN0aW9uIiwiX2lzQWN0aW9uIiwiX2dldFN0YXRzIiwic3RhdHMiLCJnZXRGYWlsdXJlRnJvbUVycm9yIiwiX3Rha2VTY3JlZW5zaG90U2lsZW50IiwiZGlzYWJsZVNjcmVlbnNob3QiLCJzY3JlZW5zaG90Iiwia2V5IiwiZGlzcG9zZVJlc3VsdCIsIm9uTW9kdWxlTG9hZGVkIiwib25Nb2R1bGVJbml0aWFsaXplZCIsIm9uTW9kdWxlV2lsbERpc3Bvc2UiLCJfbmV3QXJncyIsImFyZyIsIl9yZXBsYWNlUGFyYW1ldGVySW5Bcmd1bWVudCIsImdldERlY3J5cHRSZXN1bHQiLCJwYXJhbU5hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsInBhcmFtVmFsdWUiLCJyZXBsYWNlIiwiUmVnRXhwIiwiZW52TmFtZSIsImVudlZhbHVlIiwib2JqIiwicHJvcHMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwicHJvcCIsImdldFByb3RvdHlwZU9mIiwiX2NoZWNrU3RlcFJlc3VsdCIsInJlamVjdCIsIl93YWl0U3RlcFJlc3VsdCIsIl9kZWNyeXB0UGFyYW1ldGVyRm9yQXBwbHlJbkFyZ3VtZW50Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7Ozs7Ozs7QUFaQSxNQUFNO0FBQUVBLEVBQUFBO0FBQUYsSUFBU0MsT0FBTyxDQUFDLE1BQUQsQ0FBdEI7O0FBZUFDLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQkMsTUFBdEIsRUFBOEIsU0FBOUIsRUFBeUM7QUFDckNDLEVBQUFBLEdBQUcsRUFBRSxZQUFZO0FBQ2IsUUFBSUMsSUFBSSxHQUFHQyxLQUFLLENBQUNDLGlCQUFqQjs7QUFDQUQsSUFBQUEsS0FBSyxDQUFDQyxpQkFBTixHQUEwQixVQUFVQyxDQUFWLEVBQWFDLEtBQWIsRUFBb0I7QUFBRSxhQUFPQSxLQUFQO0FBQWUsS0FBL0Q7O0FBQ0EsUUFBSUMsR0FBRyxHQUFHLElBQUlKLEtBQUosRUFBVjtBQUNBQSxJQUFBQSxLQUFLLENBQUNLLGlCQUFOLENBQXdCRCxHQUF4QjtBQUNBLFFBQUlELEtBQUssR0FB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QS9CO0FBQ0g7QUFDSjs7QUFFREMsRUFBQUEsZUFBZSxHQUFHO0FBQ2QsV0FBTyxJQUFJdkQsT0FBSixDQUFZLENBQUNsRyxPQUFELEVBQVV3SixNQUFWLEtBQXFCO0FBQ3BDLFdBQUtELGdCQUFMLENBQXNCdkosT0FBdEIsRUFBK0J3SixNQUEvQjtBQUNILEtBRk0sQ0FBUDtBQUdIOztBQUVEcEYsRUFBQUEseUJBQXlCLENBQUMzRixJQUFELEVBQU81QixVQUFQLEVBQW1CO0FBQ3hDLFFBQUksQ0FBQzRCLElBQUQsSUFBUyxDQUFDZ0MsS0FBSyxDQUFDQyxPQUFOLENBQWNqQyxJQUFkLENBQVYsSUFBaUNBLElBQUksQ0FBQzVELE1BQUwsSUFBZSxDQUFwRCxFQUF1RDtBQUNuRCxhQUFPNEQsSUFBUDtBQUNIOztBQUNELFVBQU04SixRQUFRLEdBQUcsRUFBakI7O0FBQ0EsU0FBSyxJQUFJQyxHQUFULElBQWdCL0osSUFBaEIsRUFBc0I7QUFDbEI4SixNQUFBQSxRQUFRLENBQUN2SyxJQUFULENBQWMsS0FBSzBMLG1DQUFMLENBQXlDbEIsR0FBekMsRUFBOEMzTCxVQUE5QyxDQUFkO0FBQ0g7O0FBQ0QsV0FBTzBMLFFBQVA7QUFDSDs7QUFFRG1CLEVBQUFBLG1DQUFtQyxDQUFDbEIsR0FBRCxFQUFNM0wsVUFBTixFQUFrQjtBQUNqRCxRQUFJMkwsR0FBRyxJQUFJLE9BQU9BLEdBQUcsQ0FBQ0UsZ0JBQVgsS0FBZ0MsVUFBM0MsRUFBdUQ7QUFDbkQsVUFBSTdMLFVBQVUsS0FBSyxLQUFuQixFQUEwQjtBQUN0QixlQUFPLFdBQVA7QUFDSCxPQUZELE1BRU87QUFDSCxlQUFPMkwsR0FBRyxDQUFDRSxnQkFBSixFQUFQO0FBQ0g7QUFDSjs7QUFFRCxXQUFPRixHQUFQO0FBQ0g7O0FBbjlCNEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90b3R5cGUtYnVpbHRpbnMgKi9cclxuaW1wb3J0IGdsb2IgZnJvbSAnZ2xvYic7XHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xyXG5pbXBvcnQgZGVhc3luYyBmcm9tICdkZWFzeW5jJztcclxuaW1wb3J0IEZ1dHVyZSBmcm9tICdmaWJlcnMvZnV0dXJlJztcclxuaW1wb3J0IEZpYmVyIGZyb20gJ2ZpYmVycyc7XHJcbmltcG9ydCB7IEVPTCB9IGZyb20gJ29zJztcclxuY29uc3QgeyB2MSB9ID0gcmVxdWlyZSgndXVpZCcpO1xyXG5pbXBvcnQgU3RlcFJlc3VsdCBmcm9tICcuLi9tb2RlbC9zdGVwLXJlc3VsdCc7XHJcbmltcG9ydCBPeHlnZW5FdmVudHMgZnJvbSAnLi9PeHlnZW5FdmVudHMnO1xyXG5pbXBvcnQgb3h1dGlsIGZyb20gJy4uL2xpYi91dGlsJztcclxuaW1wb3J0ICogYXMgY29yZVV0aWxzIGZyb20gJy4vdXRpbHMnO1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5pbXBvcnQgZXJyb3JIZWxwZXIgZnJvbSAnLi4vZXJyb3JzL2hlbHBlcic7XHJcbmltcG9ydCBTVEFUVVMgZnJvbSAnLi4vbW9kZWwvc3RhdHVzLmpzJztcclxuaW1wb3J0ICogYXMgTW9kdWxlcyBmcm9tICcuLi9veF9tb2R1bGVzL2luZGV4JztcclxuXHJcbi8vIHNldHVwIGxvZ2dlclxyXG5pbXBvcnQgbG9nZ2VyLCB7IERFRkFVTFRfTE9HR0VSX0lTU1VFUiwgSVNTVUVSUyB9IGZyb20gJy4uL2xpYi9sb2dnZXInO1xyXG5pbXBvcnQgeyBPeHlnZW5TdWJNb2R1bGUgfSBmcm9tICcuL094eWdlblN1Yk1vZHVsZSc7XHJcblxyXG4vKmdsb2JhbCBfX3N0YWNrKi9cclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbCwgJ19fc3RhY2snLCB7XHJcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgb3JpZyA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlO1xyXG4gICAgICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gZnVuY3Rpb24gKF8sIHN0YWNrKSB7IHJldHVybiBzdGFjazsgfTtcclxuICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCk7XHJcbiAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoZXJyKTtcclxuICAgICAgICB2YXIgc3RhY2sgPSBlcnIuc3RhY2s7XHJcbiAgICAgICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBvcmlnO1xyXG4gICAgICAgIHJldHVybiBzdGFjaztcclxuICAgIH1cclxufSk7XHJcblxyXG5jb25zdCBERUZBVUxUX1RJTUVPVVQgPSAzMDAwMDtcclxuY29uc3QgREVGQVVMVF9PUFRTID0ge1xyXG4gICAgYmFja3RyYWNlOiBmYWxzZSwgLy8gPGJvb2xlYW4+IHNob3cgZnVsbCBiYWNrdHJhY2UgZm9yIGVycm9yc1xyXG4gICAgY29tcGlsZXI6IFtdLCAvLyA8c3RyaW5nW10+IChcImV4dGVuc2lvbjptb2R1bGVcIikgcmVxdWlyZSBmaWxlcyB3aXRoIHRoZSBnaXZlbiBFWFRFTlNJT04gYWZ0ZXIgcmVxdWlyaW5nIE1PRFVMRSAocmVwZWF0YWJsZSlcclxuICAgIGZhaWxBbWJpZ3VvdXNEZWZpbml0aW9uczogZmFsc2UsIC8vIDxib29sZWFuPiB0cmVhdCBhbWJpZ3VvdXMgZGVmaW5pdGlvbnMgYXMgZXJyb3JzXHJcbiAgICBmYWlsRmFzdDogZmFsc2UsIC8vIDxib29sZWFuPiBhYm9ydCB0aGUgcnVuIG9uIGZpcnN0IGZhaWx1cmVcclxuICAgIGlnbm9yZVVuZGVmaW5lZERlZmluaXRpb25zOiBmYWxzZSwgLy8gPGJvb2xlYW4+IHRyZWF0IHVuZGVmaW5lZCBkZWZpbml0aW9ucyBhcyB3YXJuaW5nc1xyXG4gICAgbmFtZTogW10sIC8vIDxSRUdFWFBbXT4gb25seSBleGVjdXRlIHRoZSBzY2VuYXJpb3Mgd2l0aCBuYW1lIG1hdGNoaW5nIHRoZSBleHByZXNzaW9uIChyZXBlYXRhYmxlKVxyXG4gICAgcHJvZmlsZTogW10sIC8vIDxzdHJpbmc+IChuYW1lKSBzcGVjaWZ5IHRoZSBwcm9maWxlIHRvIHVzZVxyXG4gICAgcmVxdWlyZTogW10sIC8vIDxzdHJpbmc+IChmaWxlL2Rpci9nbG9iKSByZXF1aXJlIGZpbGVzIGJlZm9yZSBleGVjdXRpbmcgZmVhdHVyZXNcclxuICAgIG9yZGVyOiAnZGVmaW5lZCcsIC8vIDxzdHJpbmc+IHN3aXRjaCBiZXR3ZWVuIGRldGVybWluaXN0aWMgIGFuZCByYW5kb20gZmVhdHVyZSBleGVjdXRpb24uIEVpdGhlciBcImRlZmluZWRcIiwgXCJyYW5kb21cIiBvciBcInJhbmRvbTo0MlwiIHdoZXJlYXMgNDIgaXMgdGhlIHNlZWQgZm9yIHJhbmRvbWl6YXRpb25cclxuICAgIHNuaXBwZXRTeW50YXg6IHVuZGVmaW5lZCwgLy8gPHN0cmluZz4gc3BlY2lmeSBhIGN1c3RvbSBzbmlwcGV0IHN5bnRheFxyXG4gICAgc25pcHBldHM6IHRydWUsIC8vIDxib29sZWFuPiBoaWRlIHN0ZXAgZGVmaW5pdGlvbiBzbmlwcGV0cyBmb3IgcGVuZGluZyBzdGVwc1xyXG4gICAgc291cmNlOiB0cnVlLCAvLyA8Ym9vbGVhbj4gaGlkZSBzb3VyY2UgdXJpc1xyXG4gICAgc3RyaWN0OiBmYWxzZSwgLy8gPGJvb2xlYW4+IGZhaWwgaWYgdGhlcmUgYXJlIGFueSB1bmRlZmluZWQgb3IgcGVuZGluZyBzdGVwc1xyXG4gICAgdGFnRXhwcmVzc2lvbjogJycsIC8vIDxzdHJpbmc+IChleHByZXNzaW9uKSBvbmx5IGV4ZWN1dGUgdGhlIGZlYXR1cmVzIG9yIHNjZW5hcmlvcyB3aXRoIHRhZ3MgbWF0Y2hpbmcgdGhlIGV4cHJlc3Npb25cclxuICAgIHRhZ3NJblRpdGxlOiBmYWxzZSwgLy8gPGJvb2xlYW4+IGFkZCBjdWN1bWJlciB0YWdzIHRvIGZlYXR1cmUgb3Igc2NlbmFyaW8gbmFtZVxyXG4gICAgdGltZW91dDogREVGQVVMVF9USU1FT1VUIC8vIDxudW1iZXI+IHRpbWVvdXQgZm9yIHN0ZXAgZGVmaW5pdGlvbnMgaW4gbWlsbGlzZWNvbmRzXHJcbn07XHJcbmNvbnN0IE1PRFVMRV9OQU1FX01BVENIX1JFR0VYID0gL15tb2R1bGUtKC4rPylcXC5qcyQvO1xyXG5jb25zdCBTRVJWSUNFX05BTUVfTUFUQ0hfUkVHRVggPSAvXnNlcnZpY2UtKC4rPylcXC5qcyQvO1xyXG5jb25zdCBET19OT1RfV1JBUF9NRVRIT0RTID0gWydkcml2ZXInLCAnZ2V0RHJpdmVyJ107XHJcblxyXG5jb25zdCBERUZBVUxUX0NUWCA9IHtcclxuICAgIHBhcmFtczoge30sXHJcbiAgICB2YXJzOiB7fSxcclxuICAgIGVudjoge30sXHJcbiAgICBjYXBzOiB7fSxcclxuICAgIGF0dHJpYnV0ZXM6IHt9LFxyXG59O1xyXG5jb25zdCBERUZBVUxUX1JFU1VMVF9TVE9SRSA9IHtcclxuICAgIHN0ZXBzOiBbXSxcclxuICAgIGxvZ3M6IFtdLFxyXG4gICAgYXR0YWNobWVudHM6IFtdLFxyXG4gICAgaGFyOiBudWxsLFxyXG4gICAgYXR0cmlidXRlczoge31cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE94eWdlbiBleHRlbmRzIE94eWdlbkV2ZW50cyB7XHJcbiAgICBjb25zdHJ1Y3RvciAoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnJlc3VsdFN0b3JlID0geyAuLi5ERUZBVUxUX1JFU1VMVF9TVE9SRSB9O1xyXG4gICAgICAgIHRoaXMuY3R4ID0geyAuLi5ERUZBVUxUX0NUWCB9O1xyXG4gICAgICAgIHRoaXMubW9kdWxlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuc2VydmljZXMgPSB7fTtcclxuICAgICAgICB0aGlzLnJlcG8gPSB7fTtcclxuICAgICAgICB0aGlzLmNhcGFiaWxpdGllcyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5vcHRzID0gbnVsbDtcclxuICAgICAgICB0aGlzLm94QmFzZURpciA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8nKTtcclxuICAgICAgICB0aGlzLmxvZ2dlciA9IHRoaXMuX3dyYXBMb2dnZXIobG9nZ2VyKCdPeHlnZW4nKSk7XHJcbiAgICAgICAgdGhpcy5fd2FpdFN0ZXBSZXN1bHRMaXN0ID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdChvcHRpb25zLCBjYXBzLCBjdHggPSB7fSwgcmVzdWx0cyA9IHt9KSB7XHJcbiAgICAgICAgdGhpcy5vcHRzID0gT2JqZWN0LmFzc2lnbihERUZBVUxUX09QVFMsIG9wdGlvbnMpO1xyXG4gICAgICAgIHRoaXMuY3dkID0gdGhpcy5vcHRzLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpO1xyXG4gICAgICAgIHRoaXMuY3R4ID0gT2JqZWN0LmFzc2lnbihERUZBVUxUX0NUWCwgY3R4IHx8IHt9KTtcclxuICAgICAgICB0aGlzLmN0eC5jYXBzID0geyAuLi5jdHguY2FwcyB8fCB7fSwgLi4uY2FwcywgfTtcclxuICAgICAgICB0aGlzLnJlc3VsdFN0b3JlID0gT2JqZWN0LmFzc2lnbihERUZBVUxUX1JFU1VMVF9TVE9SRSwgcmVzdWx0cyB8fCB7fSk7XHJcbiAgICAgICAgdGhpcy5jYXBhYmlsaXRpZXMgPSB0aGlzLmN0eC5jYXBzID0gY2FwcztcclxuXHJcbiAgICAgICAgaWYgKGN0eC5hdHRyaWJ1dGVzICYmICghcmVzdWx0cy5hdHRyaWJ1dGVzIHx8ICFPYmplY3Qua2V5cyhyZXN1bHRzLmF0dHJpYnV0ZXMpLmxlbmd0aCkpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXN1bHRTdG9yZS5hdHRyaWJ1dGVzID0geyAuLi5jdHguYXR0cmlidXRlcyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZGVmaW5lICdveCcgb2JqZWN0IGluIGdsb2JhbCBKUyBzY29wZVxyXG4gICAgICAgIC8vIHdlIHdpbGwgdXNlIHRoaXMgb2JqZWN0IHRvIGFjY2VzcyBPeHlnZW4gbW9kdWxlcyBhbmQgdGVzdCBjb250ZXh0IGZyb20gbW9kdWxlcyB1c2VkIGluIHRoZSB0ZXN0IChpZiBhbnkpICAgICAgICBcclxuICAgICAgICB0aGlzLm1ha2VPeEdsb2JhbCgpO1xyXG4gICAgICAgIC8vIGxvYWQgc2VydmljZXNcclxuICAgICAgICB0aGlzLl9sb2FkU2VydmljZXMoKTtcclxuICAgICAgICAvLyBsb2FkIG1vZHVsZXNcclxuICAgICAgICB0aGlzLl9sb2FkTW9kdWxlcygpO1xyXG4gICAgICAgIC8vIGlmIG9wdGlvbnMubWFrZU1vZHVsZXNHbG9iYWwgaXMgdHJ1ZSBvciB1bmRlZmluZWQgdGhhbiBkZWZpbmUgJ2N0eCcgY29udGVudCBhbmQgZWFjaCBtb2R1bGUgaW4gZ2xvYmFsIHNjb3BlXHJcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmdsb2JhbFNjb3BlID09PSAndW5kZWZpbmVkJyB8fCBvcHRpb25zLmdsb2JhbFNjb3BlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWFrZUNvbnRleHRBbmRNb2R1bGVzR2xvYmFsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGlzcG9zZU1vZHVsZXMoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2Rpc3Bvc2VNb2R1bGVzKHN0YXR1cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkaXNwb3NlIG1vZHVsZXM6ICcsIGUpO1xyXG4gICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kaXNwb3NlTW9kdWxlcyhzdGF0dXMpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kaXNwb3NlU2VydmljZXMoKTtcclxuICAgICAgICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGlzcG9zZTogJywgZSk7XHJcbiAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBhZGp1c3RTY3JpcHRMaW5lKCkge1xyXG4gICAgICAgIGNvbnN0IGlzSW5EZWJ1Z01vZGUgPSBveHV0aWwuaXNJbkRlYnVnTW9kZSgpO1xyXG4gICAgICAgIC8vIGFkZCBleHRyYSBsaW5lIGlmIHdlIGFyZSBydW5uaW5nIGluIGRlYnVnZ2VyIG1vZGUgKFY4IGRlYnVnZ2VyIGFkZHMgYW4gZXh0cmEgbGluZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlKVxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGlzSW5EZWJ1Z01vZGUgPyAtMSA6IDA7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29udGV4dCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jdHg7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGNvbnRleHQoY3R4KSB7XHJcbiAgICAgICAgdGhpcy5jdHggPSBjdHg7XHJcbiAgICAgICAgaWYgKGdsb2JhbC5veCkge1xyXG4gICAgICAgICAgICBnbG9iYWwub3guY3R4ID0gY3R4O1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0cy5nbG9iYWxTY29wZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5vcHRzLmdsb2JhbFNjb3BlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgXCJwYXJhbXNcIiBhbmQgXCJlbnZcIiBpbiBcIm94XCIgZ2xvYmFsIHZhcmlhYmxlXHJcbiAgICAgICAgICAgICAgICBnbG9iYWwucGFyYW1zID0gY3R4LnBhcmFtcyB8fCB7fTtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5lbnYgPSBjdHguZW52IHx8IHt9O1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLmF0dHJpYnV0ZXMgPSBjdHguYXR0cmlidXRlcyB8fCB7fTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgcmVwb3NpdG9yeSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZXBvO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCByZXBvc2l0b3J5KHJlcG8pIHtcclxuICAgICAgICB0aGlzLnJlcG8gPSByZXBvO1xyXG4gICAgICAgIGlmIChnbG9iYWwub3gpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLm94LnJlcG8gPSByZXBvO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgcmVzdWx0cygpIHtcclxuICAgICAgICAvLyBjYWxjdWxhdGUgdGltZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGl0c2VsZiAtIHN1bW1hcnkgb2YgZHVyYXRpb25zIGZvciBhbGwgdGhlIHN0ZXBzIGluIHRoaXMgdHJhbnNhY3Rpb25cclxuICAgICAgICAvLyBhbHNvIGFkanVzdCB0cmFuc2FjdGlvbiBlbmQgdGltZSB0byBtdWNoIGVuZCB0aW1lIGZvciB0aGUgbGFzdCBleGVjdXRlZCBzdGVwIHdpdGhpbiB0aGlzIHRyYW5zYWN0aW9uLlxyXG4gICAgICAgIGZvciAoY29uc3QgdHJhbnNTdGVwIG9mIHRoaXMucmVzdWx0U3RvcmUuc3RlcHMpIHtcclxuICAgICAgICAgICAgaWYgKHRyYW5zU3RlcC5uYW1lLmluY2x1ZGVzKCcudHJhbnNhY3Rpb24nKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNOYW1lID0gdHJhbnNTdGVwLnRyYW5zYWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgdHJhbnNTdGVwLmR1cmF0aW9uID0gMDtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiB0aGlzLnJlc3VsdFN0b3JlLnN0ZXBzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uICYgaXMgbm90IHRoZSB0cmFuc2FjdGlvbiBzdGVwXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXAudHJhbnNhY3Rpb24gPT09IHRyYW5zTmFtZSAmJiBzdGVwICE9PSB0cmFuc1N0ZXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNTdGVwLmR1cmF0aW9uICs9IHN0ZXAuZHVyYXRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwLmVuZFRpbWUgPiB0cmFuc1N0ZXAuZW5kVGltZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNTdGVwLmVuZFRpbWUgPSBzdGVwLmVuZFRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0cmFuc2FjdGlvbiBzdGF0dXMgdG8gd2FybmluZyBpZiBhdCBsZWFzdCBvbmUgb2Ygc3RlcHMgaGFzIHdhcm5pbmcgc3RhdHVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwLnN0YXR1cyA9PT0gU1RBVFVTLldBUk5JTkcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zU3RlcC5zdGF0dXMgPSBTVEFUVVMuV0FSTklORztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRTdG9yZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNb2R1bGVzQ2FwYWJpbGl0aWVzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5tb2R1bGVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBtb2RDYXBzID0ge307XHJcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdO1xyXG4gICAgICAgICAgICBpZiAobW9kdWxlLm5hbWUgJiYgbW9kdWxlLl9nZXRDYXBhYmlsaXRpZXMgJiYgdHlwZW9mIG1vZHVsZS5fZ2V0Q2FwYWJpbGl0aWVzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjYXBzID0gbW9kdWxlLl9nZXRDYXBhYmlsaXRpZXMoKTtcclxuICAgICAgICAgICAgICAgIC8vIHN0b3JlIG9ubHkgbm9uLWVtcHR5IGNhcHMgcGVyIG1vZHVsZSB0aGF0IGhhcyB0aGlzLmNhcHMgcHJvcGVydHlcclxuICAgICAgICAgICAgICAgIGlmIChjYXBzICYmIHR5cGVvZiBjYXBzID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhjYXBzKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kQ2Fwc1ttb2R1bGUubmFtZV0gPSBjYXBzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtb2RDYXBzO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0UmVzdWx0cygpIHtcclxuICAgICAgICB0aGlzLnJlc3VsdFN0b3JlLnN0ZXBzID0gW107XHJcbiAgICAgICAgdGhpcy5yZXN1bHRTdG9yZS5sb2dzID0gW107XHJcbiAgICAgICAgdGhpcy5yZXN1bHRTdG9yZS5hdHRhY2htZW50cyA9IFtdO1xyXG4gICAgICAgIHRoaXMuaGFyID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkJlZm9yZUNhc2UoY29udGV4dCkge1xyXG4gICAgICAgIGZvciAobGV0IG1vZHVsZU5hbWUgaW4gdGhpcy5tb2R1bGVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IHRoaXMubW9kdWxlc1ttb2R1bGVOYW1lXTtcclxuICAgICAgICAgICAgaWYgKCFtb2R1bGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBtb2R1bGUub25CZWZvcmVDYXNlICYmIGF3YWl0IG1vZHVsZS5vbkJlZm9yZUNhc2UoY29udGV4dCk7XHJcbiAgICAgICAgICAgICAgICBtb2R1bGUuX2l0ZXJhdGlvblN0YXJ0ICYmIGF3YWl0IG1vZHVsZS5faXRlcmF0aW9uU3RhcnQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBjYWxsIFwib25CZWZvcmVDYXNlXCIgbWV0aG9kIG9mICR7bW9kdWxlTmFtZX0gbW9kdWxlLmAsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQWZ0ZXJDYXNlKGVycm9yID0gbnVsbCkge1xyXG4gICAgICAgIGZvciAobGV0IG1vZHVsZU5hbWUgaW4gdGhpcy5tb2R1bGVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IHRoaXMubW9kdWxlc1ttb2R1bGVOYW1lXTtcclxuICAgICAgICAgICAgaWYgKCFtb2R1bGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAvLyBhd2FpdCBmb3IgYXZvaWQgc3R1Y2sgb24gKi5kaXNwb3NlIGNhbGxcclxuICAgICAgICAgICAgICAgIG1vZHVsZS5vbkFmdGVyQ2FzZSAmJiBhd2FpdCBtb2R1bGUub25BZnRlckNhc2UoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgbW9kdWxlLl9pdGVyYXRpb25FbmQgJiYgYXdhaXQgbW9kdWxlLl9pdGVyYXRpb25FbmQoZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNhbGwgXCJvbkFmdGVyQ2FzZVwiIG1ldGhvZCBvZiAke21vZHVsZU5hbWV9IG1vZHVsZS5gLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBtYWtlT3hHbG9iYWwoKSB7XHJcbiAgICAgICAgaWYgKCFnbG9iYWwub3gpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLm94ID0ge1xyXG4gICAgICAgICAgICAgICAgbW9kdWxlczogdGhpcy5tb2R1bGVzLFxyXG4gICAgICAgICAgICAgICAgY3R4OiB0aGlzLmN0eCxcclxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0cyxcclxuICAgICAgICAgICAgICAgIGNhcHM6IHRoaXMuY2FwYWJpbGl0aWVzLFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0U3RvcmU6IHRoaXMucmVzdWx0U3RvcmUsXHJcbiAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGU6IHRoaXMuYWRkQXR0cmlidXRlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgICAgICBhZGRBdHRhY2htZW50OiB0aGlzLmFkZEF0dGFjaG1lbnQuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGdsb2JhbC52YXJzID0gdGhpcy5jdHgudmFycztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbWFrZUNvbnRleHRBbmRNb2R1bGVzR2xvYmFsKCkge1xyXG4gICAgICAgIC8vIG1ha2Ugc3VyZSAnb3gnIGlzIGFscmVhZHkgZ2xvYmFsXHJcbiAgICAgICAgaWYgKGdsb2JhbC5veCkge1xyXG4gICAgICAgICAgICAvLyBleHBvc2UgbW9kdWxlcyBhcyBnbG9iYWwgdmFyaWFibGVzXHJcbiAgICAgICAgICAgIGZvciAobGV0IG1vZHVsZU5hbWUgaW4gdGhpcy5tb2R1bGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWdsb2JhbFttb2R1bGVOYW1lXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbFttb2R1bGVOYW1lXSA9IHRoaXMubW9kdWxlc1ttb2R1bGVOYW1lXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBleHBvc2UgXCJjdHhcIiwgXCJwYXJhbXNcIiBhbmQgXCJlbnZcIiBhcyBnbG9iYWwgdmFyaWFibGVzXHJcbiAgICAgICAgICAgIGdsb2JhbC5wYXJhbXMgPSBnbG9iYWwub3guY3R4LnBhcmFtcztcclxuICAgICAgICAgICAgZ2xvYmFsLmVudiA9IGdsb2JhbC5veC5jdHguZW52O1xyXG4gICAgICAgICAgICBnbG9iYWwuY3R4ID0gZ2xvYmFsLm94LmN0eDtcclxuICAgICAgICAgICAgZ2xvYmFsLmF0dHJpYnV0ZXMgPSBnbG9iYWwub3guY3R4LmF0dHJpYnV0ZXMgfHwge307XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFkZEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkge1xyXG4gICAgICAgIGlmICghbmFtZSB8fCAhdmFsdWUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJyb3JIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgXCInbmFtZScgYW5kICd2YWx1ZScgYXJndW1lbnRzIGFyZSByZXF1aXJlZCBmb3Igb3guYWRkQXR0cmlidXRlXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucmVzdWx0U3RvcmUgJiYgdGhpcy5yZXN1bHRTdG9yZS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0U3RvcmUuYXR0cmlidXRlc1tuYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZGRBdHRhY2htZW50KGZpbGVQYXRoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlc3VsdFN0b3JlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnIoYEZpbGUgJHtmaWxlUGF0aH0gZG9lc24ndCBleGlzdGApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMucmVzdWx0U3RvcmUuYXR0YWNobWVudHMpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXN1bHRTdG9yZS5hdHRhY2htZW50cyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlc3VsdFN0b3JlLmF0dGFjaG1lbnRzLnB1c2goXHJcbiAgICAgICAgICAgIGNvcmVVdGlscy5uZXdGaWxlQXR0YWNobWVudChmaWxlUGF0aClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRQYWdlT2JqZWN0RmlsZShwb1BhdGgpIHtcclxuICAgICAgICBpZiAoIXBvUGF0aCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvID0gcmVxdWlyZShwb1BhdGgpO1xyXG4gICAgICAgICAgICAvLyBzZXQgcGFnZSBvYmplY3QgcmVwb3NpdG9yeSBhcyB0aGUgbWFpbiBvbmVcclxuICAgICAgICAgICAgdGhpcy5yZXBvc2l0b3J5ID0gcG87XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRzLmdsb2JhbFNjb3BlID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLm9wdHMuZ2xvYmFsU2NvcGUgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5wbyA9IHBvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvclxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0cy5nbG9iYWxTY29wZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5vcHRzLmdsb2JhbFNjb3BlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwucG8gPSB7fTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICogUHJpdmF0ZSBNZXRob2RzXHJcbiAgICAgKi9cclxuICAgIF93cmFwTG9nZ2VyKF9sb2dnZXIpIHtcclxuICAgICAgICBjb25zdCBsb2dnZXJXcmFwID0ge1xyXG4gICAgICAgICAgICBpbmZvOiAoLi4uYXJncykgPT4gdGhpcy5fbG9nKF9sb2dnZXIsICdpbmZvJywgYXJncyksXHJcbiAgICAgICAgICAgIGRlYnVnOiAoLi4uYXJncykgPT4gdGhpcy5fbG9nKF9sb2dnZXIsICdkZWJ1ZycsIGFyZ3MpLFxyXG4gICAgICAgICAgICBlcnJvcjogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnZXJyb3InLCBhcmdzKSxcclxuICAgICAgICAgICAgd2FybjogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnd2FybicsIGFyZ3MpLFxyXG4gICAgICAgICAgICB1c2VySW5mbzogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnaW5mbycsIGFyZ3MsIElTU1VFUlMuVVNFUiksXHJcbiAgICAgICAgICAgIHVzZXJEZWJ1ZzogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnZGVidWcnLCBhcmdzLCBJU1NVRVJTLlVTRVIpLFxyXG4gICAgICAgICAgICB1c2VyRXJyb3I6ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ2Vycm9yJywgYXJncywgSVNTVUVSUy5VU0VSKSxcclxuICAgICAgICAgICAgdXNlcldhcm46ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ3dhcm4nLCBhcmdzLCBJU1NVRVJTLlVTRVIpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGxvZ2dlcldyYXA7XHJcbiAgICB9XHJcblxyXG4gICAgX2xvZyhfbG9nZ2VyLCBsZXZlbCwgYXJncywgc3JjID0gREVGQVVMVF9MT0dHRVJfSVNTVUVSKSB7XHJcbiAgICAgICAgaWYgKCFfbG9nZ2VyW2xldmVsXSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIF9sb2dnZXJbbGV2ZWxdLmFwcGx5KF9sb2dnZXIsIGFyZ3MpO1xyXG5cclxuICAgICAgICBjb25zdCBtZXNzYWdlID0gb3h1dGlsLnN0cmluZ2lmeShhcmdzLCAyKTtcclxuICAgICAgICBjb25zdCB0aW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIC8vIGFkZCB0aGUgbG9nIGVudHJ5IHRvIHRoZSByZXN1bHQgc3RvcmVcclxuICAgICAgICBpZiAodGhpcy5yZXN1bHRTdG9yZSAmJiB0aGlzLnJlc3VsdFN0b3JlLmxvZ3MpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXN1bHRTdG9yZS5sb2dzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgdGltZTogdGltZSxcclxuICAgICAgICAgICAgICAgIGxldmVsOiBsZXZlbC50b1VwcGVyQ2FzZSgpLFxyXG4gICAgICAgICAgICAgICAgbXNnOiBtZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgc3JjOiBzcmNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHJlbW92ZSBmaXJzdCBhcmd1bWVudCwgaWYgaXQncyBhIG1lc3NhZ2VcclxuICAgICAgICBhcmdzID0gbWVzc2FnZSA/IGFyZ3Muc2hpZnQoKSA6IGFyZ3M7XHJcbiAgICAgICAgdGhpcy5lbWl0TG9nKHRpbWUsIGxldmVsLCBtZXNzYWdlLCBhcmdzLCBzcmMpO1xyXG4gICAgfVxyXG5cclxuICAgIF9sb2FkU2VydmljZXMoKSB7XHJcbiAgICAgICAgY29uc3Qgb3hTZXJ2aWNlc0RpclBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5veEJhc2VEaXIsICcuL294X3NlcnZpY2VzJyk7XHJcbiAgICAgICAgY29uc3Qgc2VydmljZUZpbGVzID0gZ2xvYi5zeW5jKCdzZXJ2aWNlLSouanMnLCB7IGN3ZDogb3hTZXJ2aWNlc0RpclBhdGggfSk7XHJcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSBhbGwgc2VydmljZXNcclxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9hZGluZyBzZXJ2aWNlcy4uLicpO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlcnZpY2VGaWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlRmlsZU5hbWUgPSBzZXJ2aWNlRmlsZXNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VGaWxlUGF0aCA9IHBhdGguam9pbihveFNlcnZpY2VzRGlyUGF0aCwgc2VydmljZUZpbGVOYW1lKTtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gc2VydmljZUZpbGVOYW1lLm1hdGNoKFNFUlZJQ0VfTkFNRV9NQVRDSF9SRUdFWCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gcmVzdWx0WzFdO1xyXG5cclxuICAgICAgICAgICAgLy8gdGhpcy5vcHRzLnNlcnZpY2VzID0gdW5kZWZpbmVkIGluIHNpbmdsZSBmaWxlIG1vZGVcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRzLnNlcnZpY2VzKSAmJiAhdGhpcy5vcHRzLnNlcnZpY2VzLmluY2x1ZGVzKHNlcnZpY2VOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9hZGluZyBzZXJ2aWNlOiAnICsgc2VydmljZU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuX2xvYWRTZXJ2aWNlKHNlcnZpY2VOYW1lLCBzZXJ2aWNlRmlsZVBhdGgpO1xyXG4gICAgICAgICAgICAgICAgc2VydmljZS5pbml0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VzW3NlcnZpY2VOYW1lXSA9IHNlcnZpY2U7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBpbml0aWFsaXppbmcgc2VydmljZSBcIicgKyBzZXJ2aWNlTmFtZSArICdcIjogJyArIGUubWVzc2FnZSArIEVPTCArIChlLnN0YWNrdHJhY2UgPyBlLnN0YWNrdHJhY2UgOiAnJykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgX2xvYWRTZXJ2aWNlKHNlcnZpY2VOYW1lLCBzZXJ2aWNlUGF0aCkge1xyXG4gICAgICAgIGxldCBTZXJ2aWNlQ2xhc3MgPSByZXF1aXJlKHNlcnZpY2VQYXRoKTtcclxuICAgICAgICAvLyBFUzYgY2xhc3Mgd2lsbCBiZSB1bmRlciAnZGVmYXVsdCcgcHJvcGVydHlcclxuICAgICAgICBpZiAoU2VydmljZUNsYXNzLmRlZmF1bHQpIHtcclxuICAgICAgICAgICAgU2VydmljZUNsYXNzID0gU2VydmljZUNsYXNzLmRlZmF1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNlcnZpY2VMb2dnZXIgPSB0aGlzLl93cmFwTG9nZ2VyKGxvZ2dlcihgU2VydmljZToke3NlcnZpY2VOYW1lfWApKTtcclxuICAgICAgICByZXR1cm4gbmV3IFNlcnZpY2VDbGFzcyh0aGlzLm9wdHMsIHRoaXMuY3R4LCB0aGlzLnJlc3VsdFN0b3JlLCBzZXJ2aWNlTG9nZ2VyKTtcclxuICAgIH1cclxuXHJcbiAgICBfbG9hZE1vZHVsZXMoKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgaW50ZXJuYWwgbW9kdWxlcy4uLicpO1xyXG4gICAgICAgIHRoaXMuX2xvYWRJbnRlcm5hbE1vZHVsZXMoKTtcclxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9hZGluZyBleHRlcm5hbCBtb2R1bGVzLi4uJyk7XHJcbiAgICAgICAgdGhpcy5fbG9hZEV4dGVybmFsTW9kdWxlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIF9sb2FkRXh0ZXJuYWxNb2R1bGVzKCkge1xyXG4gICAgICAgIGxldCBtb2R1bGVzRm9sZGVyUGF0aCA9ICcuL21vZHVsZXMnO1xyXG4gICAgICAgIGlmICh0aGlzLm9wdHMubW9kdWxlc19leHQgJiYgdHlwZW9mIHRoaXMub3B0cy5tb2R1bGVzX2V4dCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgbW9kdWxlc0ZvbGRlclBhdGggPSB0aGlzLm9wdHMubW9kdWxlc19leHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vY29uc3Qgb3hNb2R1bGVzRGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLm94QmFzZURpciwgJy4vb3hfbW9kdWxlcycpO1xyXG4gICAgICAgIGNvbnN0IG94TW9kdWxlc0RpclBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5jd2QsIG1vZHVsZXNGb2xkZXJQYXRoKTtcclxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMob3hNb2R1bGVzRGlyUGF0aCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgbW9kdWxlRmlsZXMgPSBbXTtcclxuICAgICAgICAvLyBpZiBwYXJ0aWN1bGFyIG1vZHVsZSBuYW1lcyBhcmUgZGVmaW5lZCBpbiB0aGUgY29uZmlnLCB0aGVuIGxvYWQgb25seSB0aGVzZSBtb2R1bGVzXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRzLm1vZHVsZXMpICYmIHRoaXMub3B0cy5tb2R1bGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5vcHRzLm1vZHVsZXMuZm9yRWFjaChtb2R1bGVOYW1lID0+IG1vZHVsZUZpbGVzLnB1c2goYG1vZHVsZS0ke21vZHVsZU5hbWV9LmpzYCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBvdGhlcndpc2UsIGxvYWQgYWxsIGF2YWlsYWJsZSBtb2R1bGVzIChtaWdodCBiZSBtb3JlIHRpbWUgY29uc3VtaW5nKVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBtb2R1bGVGaWxlcyA9IGdsb2Iuc3luYygnbW9kdWxlLSouanMnLCB7IGN3ZDogb3hNb2R1bGVzRGlyUGF0aCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSBhbGwgbW9kdWxlcyAgICAgICAgXHJcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlRmlsZU5hbWUgb2YgbW9kdWxlRmlsZXMpIHtcclxuICAgICAgICAgICAgLy8gZXh0cmFjdCBuYW1lIGZyb20gdGhlIG1vZHVsZSBmaWxlIG5hbWUgYmFzZWQgb24gbW9kdWxlIG5hbWUgcGF0dGVyblxyXG4gICAgICAgICAgICBjb25zdCBtb2R1bGVOYW1lID0gbW9kdWxlRmlsZU5hbWUubWF0Y2goTU9EVUxFX05BTUVfTUFUQ0hfUkVHRVgpWzFdO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgbmV3IGxvZ2dlciBmb3IgdGhlIG1vZHVsZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlTG9nZ2VyID0gdGhpcy5fd3JhcExvZ2dlcihsb2dnZXIoYE1vZHVsZToke21vZHVsZU5hbWV9YCkpO1xyXG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBuZXcgbW9kdWxlIGluc3RhbmNlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb2QgPSBjb3JlVXRpbHMubG9hZE1vZHVsZUZyb21GaWxlKG1vZHVsZU5hbWUsIG1vZHVsZUZpbGVOYW1lLCBtb2R1bGVMb2dnZXIsIG94TW9kdWxlc0RpclBhdGgsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgLy8gY2FsbCBvbk1vZHVsZUxvYWRlZCBob29rXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxsU2VydmljZXNPbk1vZHVsZUxvYWRlZChtb2QpO1xyXG4gICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBtb2R1bGUgdG8gdGhlIG1vZHVsZSBsaXN0XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZHVsZXNbbW9kdWxlTmFtZV0gPSBnbG9iYWwub3gubW9kdWxlc1ttb2R1bGVOYW1lXSA9IHRoaXMuX3dyYXBNb2R1bGUobW9kdWxlTmFtZSwgbW9kKTtcclxuICAgICAgICAgICAgICAgIC8vIHdyYXAgdXBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVuZFRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSAoZW5kVGltZSAtIHN0YXJ0VGltZSkgLyAxMDAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgbW9kdWxlOiAnICsgbW9kdWxlTmFtZSArICcgWyAnICsgZHVyYXRpb24gKyAnIHNlYyBdJyk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBpbml0aWFsaXppbmcgbW9kdWxlIFwiJyArIG1vZHVsZU5hbWUgKyAnXCI6ICcgKyBlLm1lc3NhZ2UgKyBFT0wgKyAoZS5zdGFja3RyYWNlID8gZS5zdGFja3RyYWNlIDogJycpKTtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhbnkgbW9kdWxlIHRoYXQgZmFpbGVkIHRvIGxvYWQsIGV4Y2VwdCBXZWIgYW5kIE1vYiBtb2R1bGVzXHJcbiAgICAgICAgICAgICAgICAvLyB3aXRob3V0IE1vYiBhbmQgV2ViIG1vZHVsZXMgbG9hZGVkLCB0aGUgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyBzaGFsbCBmYWlsXHJcbiAgICAgICAgICAgICAgICBpZiAobW9kdWxlTmFtZSA9PT0gJ3dlYicgfHwgbW9kdWxlTmFtZSA9PT0gJ21vYicpIHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfbG9hZEludGVybmFsTW9kdWxlcygpIHtcclxuICAgICAgICAvLyBpZiBgbW9kdWxlc2AgaXMgZW1wdHkgb3IgdW5kZWZpbmVkIGluIG94eWdlbi5jb25mIHRoZW4gbG9hZCBhbGwgbW9kdWxlc1xyXG4gICAgICAgIC8vIG90aGVyd2lzZSwgbG9hZCBvbmx5IHRob3NlIGltcGxpY2l0bHkgZGVmaW5lZFxyXG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVVbmRlZmluZWRNb2RzID0gdGhpcy5vcHRzLm1vZHVsZXMgJiYgdGhpcy5vcHRzLm1vZHVsZXMubGVuZ3RoID4gMDtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBvZiBPYmplY3Qua2V5cyhNb2R1bGVzKSkge1xyXG4gICAgICAgICAgICBpZiAoZXhjbHVkZVVuZGVmaW5lZE1vZHMgJiYgIXRoaXMub3B0cy5tb2R1bGVzLmluY2x1ZGVzKG1vZHVsZU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBNb2R1bGVDbGFzcyA9IE1vZHVsZXNbbW9kdWxlTmFtZV07XHJcbiAgICAgICAgICAgIGNvbnN0IG94TW9kdWxlc0RpclBhdGggPSBveHV0aWwuZ2V0T3hNb2R1bGVzRGlyKCk7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBuZXcgbG9nZ2VyIGZvciB0aGUgbW9kdWxlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVMb2dnZXIgPSB0aGlzLl93cmFwTG9nZ2VyKGxvZ2dlcihgTW9kdWxlOiR7bW9kdWxlTmFtZX1gKSk7XHJcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIG5ldyBtb2R1bGUgaW5zdGFuY2VcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZCA9IGNvcmVVdGlscy5sb2FkTW9kdWxlRnJvbUNsYXNzKG1vZHVsZU5hbWUsIE1vZHVsZUNsYXNzLCBtb2R1bGVMb2dnZXIsIG94TW9kdWxlc0RpclBhdGgsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgLy8gY2FsbCBvbk1vZHVsZUxvYWRlZCBob29rXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxsU2VydmljZXNPbk1vZHVsZUxvYWRlZChtb2QpO1xyXG4gICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBtb2R1bGUgdG8gdGhlIG1vZHVsZSBsaXN0XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZHVsZXNbbW9kdWxlTmFtZV0gPSBnbG9iYWwub3gubW9kdWxlc1ttb2R1bGVOYW1lXSA9IHRoaXMuX3dyYXBNb2R1bGUobW9kdWxlTmFtZSwgbW9kKTtcclxuICAgICAgICAgICAgICAgIC8vIHdyYXAgdXBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVuZFRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSAoZW5kVGltZSAtIHN0YXJ0VGltZSkgLyAxMDAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgbW9kdWxlOiAnICsgbW9kdWxlTmFtZSArICcgWyAnICsgZHVyYXRpb24gKyAnIHNlYyBdJyk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBpbml0aWFsaXppbmcgbW9kdWxlIFwiJyArIG1vZHVsZU5hbWUgKyAnXCI6ICcgKyBlLm1lc3NhZ2UgKyBFT0wgKyAoZS5zdGFja3RyYWNlID8gZS5zdGFja3RyYWNlIDogJycpKTtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhbnkgbW9kdWxlIHRoYXQgZmFpbGVkIHRvIGxvYWQsIGV4Y2VwdCBXZWIgYW5kIE1vYiBtb2R1bGVzXHJcbiAgICAgICAgICAgICAgICAvLyB3aXRob3V0IE1vYiBhbmQgV2ViIG1vZHVsZXMgbG9hZGVkLCB0aGUgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyBzaGFsbCBmYWlsXHJcbiAgICAgICAgICAgICAgICBpZiAobW9kdWxlTmFtZSA9PT0gJ3dlYicgfHwgbW9kdWxlTmFtZSA9PT0gJ21vYicpIHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfd3JhcE1vZHVsZShuYW1lLCBtb2R1bGUpIHtcclxuICAgICAgICBpZiAoIW1vZHVsZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB3cmFwcGVyID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBuYW1lXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgbGV0IG1vZHVsZU1ldGhvZHMgPSBPYmplY3Qua2V5cyhtb2R1bGUpO1xyXG4gICAgICAgIGlmICghbW9kdWxlTWV0aG9kcy5zb21lKHggPT4geD09PSAnZXhwb3J0cycpKSB7XHJcbiAgICAgICAgICAgIG1vZHVsZU1ldGhvZHMgPSB0aGlzLl9nZXRBbGxQcm9wZXJ0eU5hbWVzKG1vZHVsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IG1ldGhvZE5hbWUgb2YgbW9kdWxlTWV0aG9kcykge1xyXG4gICAgICAgICAgICBjb25zdCBtZXRob2QgPSBtb2R1bGVbbWV0aG9kTmFtZV07XHJcbiAgICAgICAgICAgIC8vIGlnbm9yZSBhbnkgbW9kdWxlIHByb3BlcnR5IHRoYXQgaXMgbm90IGEgZnVuY3Rpb24gb3IgYSBPeHlnZW5TdWJNb2R1bGVcclxuICAgICAgICAgICAgaWYgKCghKG1ldGhvZCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSAmJiAhKG1ldGhvZCBpbnN0YW5jZW9mIE94eWdlblN1Yk1vZHVsZSkgJiYgdHlwZW9mIG1ldGhvZCAhPT0gJ2Z1bmN0aW9uJykgfHwgbWV0aG9kTmFtZSA9PT0gJ2V4cG9ydHMnIHx8IG1ldGhvZE5hbWUgPT09ICdfY29tcGlsZScpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIG1hcCBhbmQgd3JhcCBzdWItbW9kdWxlIG1ldGhvZHMgKHJlY3Vyc2l2ZSBjYWxsIHRvIF93cmFwTW9kdWxlKVxyXG4gICAgICAgICAgICBpZiAobWV0aG9kIGluc3RhbmNlb2YgT3h5Z2VuU3ViTW9kdWxlKSB7XHJcbiAgICAgICAgICAgICAgICB3cmFwcGVyW21ldGhvZE5hbWVdID0gdGhpcy5fd3JhcE1vZHVsZShgJHtuYW1lfS4ke21ldGhvZE5hbWV9YCwgbWV0aG9kKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBkbyBub3Qgd3JhcCBtZXRob2RzXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKERPX05PVF9XUkFQX01FVEhPRFMuaW5jbHVkZXMobWV0aG9kTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIC8vID09PSAnZHJpdmVyJyB8fCBtZXRob2ROYW1lID09PSAnZ2V0RHJpdmVyJ1xyXG4gICAgICAgICAgICAgICAgd3JhcHBlclttZXRob2ROYW1lXSA9IG1vZHVsZVttZXRob2ROYW1lXS5iaW5kKG1vZHVsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gcHJpdmF0ZSBtZXRob2RzIGFuZCBldmVudCBoYW5kbGVyc1xyXG4gICAgICAgICAgICBlbHNlIGlmIChtZXRob2ROYW1lLmluZGV4T2YoJ18nKSA9PT0gMCB8fCBtZXRob2ROYW1lLmluZGV4T2YoJ29uJykgPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHdyYXBwZXJbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmxvZ2dlci5kZWJ1ZygnRXhlY3V0aW5nOiAnICsgb3h1dGlsLmdldE1ldGhvZFNpZ25hdHVyZShuYW1lLCBtZXRob2ROYW1lLCBhcmdzKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGVbbWV0aG9kTmFtZV0uYXBwbHkobW9kdWxlLCBhcmdzKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9ySGVscGVyLmdldE94eWdlbkVycm9yKGUsIG5hbWUsIG1ldGhvZE5hbWUsIGFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYW4gaW50ZXJuYWwgX2dldENhcGFiaWxpdGllcyBtZXRob2QgZm9yIGludGVybmFsIE94eWdlbiBDb3JlIHVzZVxyXG4gICAgICAgICAgICAgICAgLy8gY2FsbGluZyBfZ2V0Q2FwYWJpbGl0aWVzIG1ldGhvZCB3b24ndCBiZSB2aXNpYmxlIGluIHRoZSB0ZXN0IHJlc3VsdHNcclxuICAgICAgICAgICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnZ2V0Q2FwYWJpbGl0aWVzJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHdyYXBwZXJbJ19nZXRDYXBhYmlsaXRpZXMnXSA9IG1ldGhvZC5iaW5kKG1vZHVsZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB3cmFwcGVyW21ldGhvZE5hbWVdID0gKC4uLmFyZ3MpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuX2NvbW1hbmRXcmFwcGVyKG1ldGhvZE5hbWUsIGFyZ3MsIG1vZHVsZSwgbmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgT3hFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnVGhyb3dpbmcgYWdhaW46JywgZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3JIZWxwZXIuZ2V0T3h5Z2VuRXJyb3IoZSwgbmFtZSwgbWV0aG9kTmFtZSwgYXJncyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gd3JhcHBlcjtcclxuICAgIH1cclxuXHJcbiAgICBfY29tbWFuZFdyYXBwZXIoY21kTmFtZSwgY21kQXJncywgbW9kdWxlLCBtb2R1bGVOYW1lKSB7XHJcbiAgICAgICAgaWYgKCFtb2R1bGUgfHwgIW1vZHVsZVtjbWROYW1lXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHJldHZhbCA9IG51bGw7XHJcbiAgICAgICAgbGV0IGVycm9yID0gbnVsbDtcclxuICAgICAgICBjb25zdCBjbWRGbiA9IG1vZHVsZVtjbWROYW1lXTtcclxuICAgICAgICBjb25zdCBwdWJsaWNNZXRob2QgPSAhY21kTmFtZS5zdGFydHNXaXRoKCdfJykgJiYgY21kTmFtZSAhPT0gJ2Rpc3Bvc2UnO1xyXG5cclxuICAgICAgICAvLyBkZWxheSB0aGUgY29tbWFuZCBleGVjdXRpb24gaWYgcmVxdWlyZWRcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5kZWxheSAmJlxyXG4gICAgICAgICAgICBwdWJsaWNNZXRob2QgJiZcclxuICAgICAgICAgICAgY21kTmFtZSAhPT0gJ2luaXQnICYmXHJcbiAgICAgICAgICAgIGNtZE5hbWUgIT09ICd0cmFuc2FjdGlvbidcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgZGVhc3luYy5zbGVlcCh0aGlzLm9wdHMuZGVsYXkgKiAxMDAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHRocm93IGlmIGEgY29tbWFuZCBleGVjdXRlZCBvbiB1bml0aWFsaXplZCBtb2R1bGUgKGV4Y2VwdCBpbnRlcm5hbCBtZXRob2RzIGFuZCBhIGZldyBvdGhlcilcclxuICAgICAgICBpZiAoIW1vZHVsZS5pc0luaXRpYWxpemVkICYmIHB1YmxpY01ldGhvZCAmJiBjbWROYW1lICE9PSAnaW5pdCcgJiYgY21kTmFtZSAhPT0gJ3RyYW5zYWN0aW9uJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJvckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ01pc3NpbmcgJyArIG1vZHVsZU5hbWUgKyAnLmluaXQoKScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZGVjdHlwdCBhcmd1bWVudHNcclxuICAgICAgICBsZXQgZGVjcnlwdGVkQXJncyA9IHRoaXMuX2dldERlY3J5cHRlZEFyZ3NGb3JBcHBseShjbWRBcmdzLCBtb2R1bGVOYW1lKTtcclxuICAgICAgICBkZWNyeXB0ZWRBcmdzID0gdGhpcy5fcG9wdWxhdGVQYXJhbWV0ZXJzVmFsdWUoZGVjcnlwdGVkQXJncyk7XHJcblxyXG4gICAgICAgIC8vIHJlcGxhY2UgcGFyYW1ldGVycyBpbiBtZXRob2QgYXJndW1lbnRzIHdpdGggY29ycmVzcG9uZGluZyB2YWx1ZXNcclxuICAgICAgICBjbWRBcmdzID0gdGhpcy5fcG9wdWxhdGVQYXJhbWV0ZXJzVmFsdWUoY21kQXJncyk7XHJcbiAgICAgICAgLy8gc3RhcnQgbWVhc3VyaW5nIG1ldGhvZCBleGVjdXRpb24gdGltZVxyXG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuXHJcbiAgICAgICAgLy8gYWRkIGNvbW1hbmQgbG9jYXRpb24gaW5mb3JtYXRpb24gKGUuZy4gZmlsZSBuYW1lIGFuZCBjb21tYW5kIGxpbmUpXHJcbiAgICAgICAgbGV0IGNtZExvY2F0aW9uID0gbnVsbDtcclxuICAgICAgICAvLyBnZW5lcmF0ZSBzdGVwIHJlc3VsdCBpZFxyXG4gICAgICAgIGNvbnN0IHN0ZXBSZXN1bHRJZCA9IHYxKCk7XHJcbiAgICAgICAgLy8gZG8gbm90IHJlcG9ydCByZXN1bHRzIG9yIGxpbmUgdXBkYXRlcyBvbiBpbnRlcm5hbCBtZXRob2RzIChzdGFydGVkIHdpdGggJ18nKVxyXG4gICAgICAgIGlmIChwdWJsaWNNZXRob2QpIHtcclxuICAgICAgICAgICAgY21kTG9jYXRpb24gPSB0aGlzLl9nZXRDb21tYW5kTG9jYXRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0QmVmb3JlQ29tbWFuZChzdGVwUmVzdWx0SWQsIGNtZE5hbWUsIG1vZHVsZU5hbWUsIGNtZEZuLCBjbWRBcmdzLCB0aGlzLmN0eCwgY21kTG9jYXRpb24sIHN0YXJ0VGltZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnRXhlY3V0aW5nOiAnICsgb3h1dGlsLmdldE1ldGhvZFNpZ25hdHVyZShtb2R1bGVOYW1lLCBjbWROYW1lLCBjbWRBcmdzKSk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIGVtaXQgYmVmb3JlIGV2ZW50c1xyXG4gICAgICAgICAgICBpZiAoY21kTmFtZSA9PT0gJ2Rpc3Bvc2UnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl93cmFwQXN5bmModGhpcy5fY2FsbFNlcnZpY2VzT25Nb2R1bGVXaWxsRGlzcG9zZSkuYXBwbHkodGhpcywgW21vZHVsZV0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCByZXR2YWxQcm9taXNlID0gdGhpcy5fd3JhcEFzeW5jKG1vZHVsZVtjbWROYW1lXSkuYXBwbHkobW9kdWxlLCBkZWNyeXB0ZWRBcmdzKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXR2YWxQcm9taXNlICYmIHJldHZhbFByb21pc2UudGhlbikge1xyXG4gICAgICAgICAgICAgICAgbGV0IHByb21pc2VEb25lID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dmFsUHJvbWlzZS50aGVuKCh2YWx1ZSkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlRG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9LCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gZTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlRG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBkZWFzeW5jLmxvb3BXaGlsZSgoKSA9PiAhcHJvbWlzZURvbmUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dmFsID0gcmV0dmFsUHJvbWlzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNtZE5hbWUgPT09ICdpbml0Jykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fd3JhcEFzeW5jKHRoaXMuX2NhbGxTZXJ2aWNlc09uTW9kdWxlSW5pdGlhbGl6ZWQpLmFwcGx5KHRoaXMsIFttb2R1bGVdKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGlmIChlICYmIGUubWVzc2FnZSAmJiB0eXBlb2YgZS5tZXNzYWdlID09PSAnc3RyaW5nJyAmJiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ2ludmFsaWQgc2Vzc2lvbiBpZCcpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcgaWYgZXJyb3Igb2N1cnJlZCBhZnRlciB0aGUgbW9kdWxlIHdhcyBkaXNwb3NlZCAob3IgaW4gYSBwcm9jZXNzIG9mIGJlaW5nIGRpc3Bvc2VkKVxyXG4gICAgICAgICAgICAgICAgLy8gZXhjZXB0IGZvciBpbml0IG1ldGhvZHMgb2YgY291cnNlXHJcbiAgICAgICAgICAgICAgICBpZiAobW9kdWxlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBtb2R1bGUuaXNJbml0aWFsaXplZCA9PT0gJ2Jvb2xlYW4nICYmICFtb2R1bGUuaXNJbml0aWFsaXplZClcclxuICAgICAgICAgICAgICAgICAgICAmJiBjbWROYW1lICE9PSAnaW5pdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCc9PT09IGVycm9yID09PT0nLCBlKVxyXG4gICAgICAgICAgICAgICAgZXJyb3IgPSBlcnJvckhlbHBlci5nZXRPeHlnZW5FcnJvcihlLCBtb2R1bGVOYW1lLCBjbWROYW1lLCBjbWRBcmdzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuXHJcbiAgICAgICAgbGV0IHN0ZXBSZXN1bHQ7XHJcbiAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHB1YmxpY01ldGhvZCkge1xyXG4gICAgICAgICAgICBjb25zdCB3YWl0SWQgPSArbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgdGhpcy5fd2FpdFN0ZXBSZXN1bHRMaXN0LnB1c2god2FpdElkKTtcclxuXHJcbiAgICAgICAgICAgIHN0ZXBSZXN1bHQgPSB0aGlzLl9nZXRTdGVwUmVzdWx0KG1vZHVsZSwgbW9kdWxlTmFtZSwgY21kTmFtZSwgY21kQXJncywgY21kTG9jYXRpb24sIHN0YXJ0VGltZSwgZW5kVGltZSwgcmV0dmFsLCBlcnJvcik7XHJcbiAgICAgICAgICAgIHN0ZXBSZXN1bHQuaWQgPSBzdGVwUmVzdWx0SWQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX3dhaXRTdGVwUmVzdWx0TGlzdC5pbmRleE9mKHdhaXRJZCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3dhaXRTdGVwUmVzdWx0TGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgICAgICAgICAgLy9zdGVwUmVzdWx0LmxvY2F0aW9uID0gY21kTG9jYXRpb247XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlc3VsdFN0b3JlLnN0ZXBzLnB1c2goc3RlcFJlc3VsdCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdEFmdGVyQ29tbWFuZChjbWROYW1lLCBtb2R1bGVOYW1lLCBjbWRGbiwgY21kQXJncywgdGhpcy5jdHgsIGNtZExvY2F0aW9uLCBlbmRUaW1lLCBzdGVwUmVzdWx0KTtcclxuICAgICAgICAgICAgZG9uZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IuaXNGYXRhbCAmJiAhdGhpcy5vcHRzLmNvbnRpbnVlT25FcnJvcikge1xyXG4gICAgICAgICAgICBpZiAoIWVycm9yLmxvY2F0aW9uICYmIGNtZExvY2F0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBlcnJvci5sb2NhdGlvbiA9IGNtZExvY2F0aW9uO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc3RlcFJlc3VsdCAmJiBzdGVwUmVzdWx0LmZhaWx1cmUgJiYgc3RlcFJlc3VsdC5mYWlsdXJlLmxvY2F0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBlcnJvci5sb2NhdGlvbiA9IHN0ZXBSZXN1bHQuZmFpbHVyZS5sb2NhdGlvbjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXB1YmxpY01ldGhvZCkge1xyXG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRlYXN5bmMubG9vcFdoaWxlKCgpID0+ICFkb25lICYmICFlcnJvcik7XHJcblxyXG4gICAgICAgIHJldHVybiByZXR2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgX3dyYXBBc3luYyAoZm4sIGNvbnRleHQpIHtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcclxuICAgICAgICAgICAgdmFyIHNlbGYgPSBjb250ZXh0IHx8IHRoaXM7XHJcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjdXJyZW50IGNvZGUgaXMgbm90IHJ1bm5pbmcgaW5zaWRlIHRoZSBGaWJlciBjb250ZXh0LCB0aGVuIHJ1biBhc3luYyBjb2RlIGFzIHN5bmMgdXNpbmcgZGVhc3luYyBtb2R1bGVcclxuICAgICAgICAgICAgaWYgKCFGaWJlci5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXR2YWwgPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGxldCBmaW5hbFZhbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJldHZhbCAmJiByZXR2YWwudGhlbikge1xyXG4gICAgICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShyZXR2YWwpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbFZhbCA9IHZhbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluYWxWYWwgPSByZXR2YWw7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBkZWFzeW5jLmxvb3BXaGlsZSgoKSA9PiAhZG9uZSAmJiAhZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5tZXNzYWdlICYmIHR5cGVvZiBlLm1lc3NhZ2UgPT09ICdzdHJpbmcnICYmIGUubWVzc2FnZS5pbmNsdWRlcygncmVhZHlTdGF0ZScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhpcyBlcnJvciBhcyBpdCB1c3VhbGx5IGhhcHBlbnMgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBPeHlnZW4gaXMgZGlzcG9zZWQgYW5kIHByb2Nlc3MgaXMgYmVpbmcga2lsbGVkXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ2RlYXN5bmMubG9vcFdoaWxlKCkgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaW5hbFZhbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xyXG4gICAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgcmV0dmFsID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBpZiB3ZSBhcmUgaW5zaWRlIHRoZSBGaWJlciBjb250ZXh0LCB0aGVuIHVzZSBGaWJlcidzIEZ1dHVyZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgZnV0dXJlID0gbmV3IEZ1dHVyZSgpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQudGhlbigodmFsKSA9PiBmdXR1cmUucmV0dXJuKHZhbCksIChlcnIpID0+IGZ1dHVyZS50aHJvdyhlcnIpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnV0dXJlLndhaXQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcblxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGRlYXN5bmMubG9vcFdoaWxlKCgpID0+ICFkb25lICYmICFlcnJvcik7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcmV0cmlldmUgY3VycmVudCBsaW5lIGFuZCBmdW5jdGlvbiBuYW1lIGZyb20gdGhlIGNhbGwgc3RhY2tcclxuICAgIF9nZXRDb21tYW5kTG9jYXRpb24oKSB7XHJcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBfX3N0YWNrO1xyXG4gICAgICAgIGxldCBjYWxsZXIgPSBudWxsO1xyXG4gICAgICAgIGZvciAobGV0IGNhbGwgb2Ygc3RhY2spIHtcclxuICAgICAgICAgICAgaWYgKF9fZmlsZW5hbWUgPT09IGNhbGwuZ2V0RmlsZU5hbWUoKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBmaXJzdCBjYWxsZXIsIHdoaWNoIGlzIG5vdCB0aGUgY3VycmVudCBmaWxlXHJcbiAgICAgICAgICAgIGNhbGxlciA9IGNhbGw7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2FsbGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBgJHtjYWxsZXIuZ2V0RmlsZU5hbWUoKX06JHtjYWxsZXIuZ2V0TGluZU51bWJlcigpICsgdGhpcy5hZGp1c3RTY3JpcHRMaW5lfToke2NhbGxlci5nZXRDb2x1bW5OdW1iZXIoKX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBfZ2V0U3RlcFJlc3VsdChtb2R1bGUsIG1vZHVsZU5hbWUsIG1ldGhvZE5hbWUsIGFyZ3MsIGxvY2F0aW9uLCBzdGFydFRpbWUsIGVuZFRpbWUsIHJldHZhbCwgZXJyKSB7XHJcbiAgICAgICAgdmFyIHN0ZXAgPSBuZXcgU3RlcFJlc3VsdCgpO1xyXG5cclxuICAgICAgICBjb25zdCBkaXNwbGF5TmFtZSA9XHJcbiAgICAgICAgICAgIChtb2R1bGUuZ2V0U3RlcERpc3BsYXlOYW1lICYmIG1vZHVsZS5nZXRTdGVwRGlzcGxheU5hbWUobWV0aG9kTmFtZSwgYXJncywgcmV0dmFsLCBlcnIpKSB8fFxyXG4gICAgICAgICAgICBveHV0aWwuZ2V0TWV0aG9kU2lnbmF0dXJlKG1vZHVsZU5hbWUsIG1ldGhvZE5hbWUsIGFyZ3MpO1xyXG5cclxuICAgICAgICBzdGVwLm5hbWUgPSBkaXNwbGF5TmFtZTtcclxuICAgICAgICBzdGVwLnRyYW5zYWN0aW9uID0gZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lIHx8IG51bGw7ICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB3aHkgaXMgdGhpcyBoZXJlIGlmIGl0J3MgYWxyZWFkeSBwb3B1bGF0ZWQgaW4gcnM/XHJcbiAgICAgICAgc3RlcC5sb2NhdGlvbiA9IGxvY2F0aW9uO1xyXG4gICAgICAgIC8vIG1vZHVsZS5leHRyYSBpcyByZXNldGVkIGZvciBlYWNoIHN0ZXAsIHNvIHdlIG11c3QgY2xvbmUgaXRcclxuICAgICAgICBzdGVwLmV4dHJhID0geyAuLi5tb2R1bGUuZXh0cmEgfTtcclxuICAgICAgICBpZiAobW9kdWxlLmV4dHJhICYmIG1vZHVsZS5leHRyYS5odHRwKSB7XHJcbiAgICAgICAgICAgIHN0ZXAudHlwZSA9ICdodHRwJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlcnIgJiYgZXJyLnR5cGUgJiYgZXJyLnR5cGUgPT09IGVycm9ySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfUEFTU0VEKSB7XHJcbiAgICAgICAgICAgIHN0ZXAuc3RhdHVzID0gU1RBVFVTLlBBU1NFRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGRldGVybWluZSBzdGVwIHN0YXR1c1xyXG4gICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyLmlzRmF0YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGVwLnN0YXR1cyA9IFNUQVRVUy5GQUlMRUQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGVwLnN0YXR1cyA9IFNUQVRVUy5XQVJOSU5HO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG1vZHVsZU5hbWUgPT09ICdsb2cnICYmIG1ldGhvZE5hbWUgPT09ICd3YXJuJykge1xyXG4gICAgICAgICAgICAgICAgc3RlcC5zdGF0dXMgPSBTVEFUVVMuV0FSTklORztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN0ZXAuc3RhdHVzID0gU1RBVFVTLlBBU1NFRDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3RlcC5hY3Rpb24gPSAodHlwZW9mIG1vZHVsZS5faXNBY3Rpb24gPT09ICdmdW5jdGlvbicgPyBtb2R1bGUuX2lzQWN0aW9uKG1ldGhvZE5hbWUpIDogZmFsc2UpO1xyXG4gICAgICAgIHN0ZXAuc3RhcnRUaW1lID0gc3RhcnRUaW1lO1xyXG4gICAgICAgIHN0ZXAuZW5kVGltZSA9IGVuZFRpbWU7XHJcbiAgICAgICAgc3RlcC5kdXJhdGlvbiA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgbW9kdWxlLl9nZXRTdGF0cyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBzdGVwLnN0YXRzID0gbW9kdWxlLl9nZXRTdGF0cyhtZXRob2ROYW1lKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzdGVwLnN0YXRzID0ge307XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGlmIChlcnIudHlwZSA9PT0gZXJyb3JIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9QQVNTRUQpIHtcclxuICAgICAgICAgICAgICAgIC8vaWdub3JlZFxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3RlcC5mYWlsdXJlID0gZXJyb3JIZWxwZXIuZ2V0RmFpbHVyZUZyb21FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICAgICAgc3RlcC5mYWlsdXJlLmxvY2F0aW9uID0gbG9jYXRpb247XHJcbiAgICAgICAgICAgICAgICAvLyBsZXQgdGhlIG1vZHVsZSBkZWNpZGUgd2hldGhlciBhIHNjcmVlbnNob3Qgc2hvdWxkIGJlIHRha2VuIG9uIGVycm9yIG9yIG5vdFxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGUuX3Rha2VTY3JlZW5zaG90U2lsZW50ID09PSAnZnVuY3Rpb24nICYmICF0aGlzLm9wdHMuZGlzYWJsZVNjcmVlbnNob3QpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwLnNjcmVlbnNob3QgPSBtb2R1bGUuX3Rha2VTY3JlZW5zaG90U2lsZW50KG1ldGhvZE5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgaGVyZSwgd2Ugd2VyZSB1bmFibGUgdG8gZ2V0IGEgc2NyZWVuc2hvdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gd2FpdCBmb3IgYSBtb21lbnQgKGluIFBlcmZlY3RvIENsb3VkLCB0aGUgc2NyZWVuc2hvdCBtaWdodCBub3QgYmUgaW1taWRpYXRlbHkgYXZhaWxhYmxlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWFzeW5jLnNsZWVwKDEwMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5zY3JlZW5zaG90ID0gbW9kdWxlLl90YWtlU2NyZWVuc2hvdFNpbGVudChtZXRob2ROYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IGluZGljYXRlIHRvIHVzZXIgdGhhdCBhbiBhdHRlbXB0IHRvIHRha2UgYSBzY3JlZW5zaG90IGhhcyBmYWlsZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3RlcDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfZGlzcG9zZVNlcnZpY2VzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zZXJ2aWNlcyB8fCB0eXBlb2YgdGhpcy5zZXJ2aWNlcyAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5zZXJ2aWNlcykge1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5zZXJ2aWNlc1trZXldO1xyXG4gICAgICAgICAgICBpZiAoc2VydmljZS5kaXNwb3NlKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHNlcnZpY2UuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgc2VydmljZSBkaXNwb3NhbCBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZGlzcG9zZSBzZXJ2aWNlICcke2tleX0nOmAsIGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9kaXNwb3NlTW9kdWxlcyhzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1vZHVsZXMgfHwgdHlwZW9mIHRoaXMubW9kdWxlcyAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5tb2R1bGVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1vZCA9IHRoaXMubW9kdWxlc1trZXldO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1vZC5kaXNwb3NlKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc3Bvc2VSZXN1bHQgPSBtb2QuZGlzcG9zZShzdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXNwb3NlUmVzdWx0ICYmIHR5cGVvZiBkaXNwb3NlUmVzdWx0LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvYmFibHkgYSBwcm9taXNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGRpc3Bvc2VSZXN1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBtb2R1bGUgZGlzcG9zYWwgZXJyb3IgXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBkaXNwb3NlIG1vZHVsZSAnJHtrZXl9JzogYCwgZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICAvKlxyXG4gICAgICogU2VydmljZXMgRXZlbnQgRW1pdHRlcnNcclxuICAgICAqL1xyXG4gICAgX2NhbGxTZXJ2aWNlc09uTW9kdWxlTG9hZGVkKG1vZHVsZSkge1xyXG4gICAgICAgIGZvciAobGV0IHNlcnZpY2VOYW1lIGluIHRoaXMuc2VydmljZXMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuc2VydmljZXNbc2VydmljZU5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIXNlcnZpY2UpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uTW9kdWxlTG9hZGVkKG1vZHVsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gY2FsbCBcIm9uTW9kdWxlTG9hZGVkXCIgbWV0aG9kIG9mICR7c2VydmljZU5hbWV9IHNlcnZpY2UuYCwgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBfY2FsbFNlcnZpY2VzT25Nb2R1bGVJbml0aWFsaXplZChtb2R1bGUpIHtcclxuICAgICAgICBmb3IgKGxldCBzZXJ2aWNlTmFtZSBpbiB0aGlzLnNlcnZpY2VzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnNlcnZpY2VzW3NlcnZpY2VOYW1lXTtcclxuICAgICAgICAgICAgaWYgKCFzZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgc2VydmljZS5vbk1vZHVsZUluaXRpYWxpemVkKG1vZHVsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gY2FsbCBcIm9uTW9kdWxlSW5pdGlhbGl6ZWRcIiBtZXRob2Qgb2YgJHtzZXJ2aWNlTmFtZX0gc2VydmljZS5gLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIF9jYWxsU2VydmljZXNPbk1vZHVsZVdpbGxEaXNwb3NlKG1vZHVsZSkge1xyXG4gICAgICAgIGlmICghdGhpcyB8fCAhdGhpcy5zZXJ2aWNlcykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IHNlcnZpY2VOYW1lIGluIHRoaXMuc2VydmljZXMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuc2VydmljZXNbc2VydmljZU5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIXNlcnZpY2UpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VydmljZS5vbk1vZHVsZVdpbGxEaXNwb3NlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VydmljZS5vbk1vZHVsZVdpbGxEaXNwb3NlKG1vZHVsZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gY2FsbCBcIm9uTW9kdWxlV2lsbERpc3Bvc2VcIiBtZXRob2Qgb2YgJHtzZXJ2aWNlTmFtZX0gc2VydmljZS5gLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIF9wb3B1bGF0ZVBhcmFtZXRlcnNWYWx1ZShhcmdzKSB7XHJcbiAgICAgICAgaWYgKCFhcmdzIHx8ICFBcnJheS5pc0FycmF5KGFyZ3MpIHx8IGFyZ3MubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFyZ3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IF9uZXdBcmdzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgYXJnIG9mIGFyZ3MpIHtcclxuICAgICAgICAgICAgX25ld0FyZ3MucHVzaCh0aGlzLl9yZXBsYWNlUGFyYW1ldGVySW5Bcmd1bWVudChhcmcpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9uZXdBcmdzO1xyXG4gICAgfVxyXG4gICAgX3JlcGxhY2VQYXJhbWV0ZXJJbkFyZ3VtZW50KGFyZykge1xyXG4gICAgICAgIGlmIChhcmcgJiYgdHlwZW9mIGFyZy5nZXREZWNyeXB0UmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnRU5DUllQVEVEJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghYXJnIHx8IHR5cGVvZiBhcmcgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhcmc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHJlcGxhY2UgdXNlciBwYXJhbWV0ZXJzIHdpdGggdmFsdWVzXHJcbiAgICAgICAgLy8gbm90ZTogdXNlciBwYXJhbWV0ZXIgd2l0aCB0aGUgc2FtZSBuYW1lIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBlbnZpcm9ubWVudCB2YXJpYWJsZVxyXG4gICAgICAgIGZvciAobGV0IHBhcmFtTmFtZSBpbiB0aGlzLmN0eC5wYXJhbXMpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3R4LnBhcmFtcy5oYXNPd25Qcm9wZXJ0eShwYXJhbU5hbWUpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbVZhbHVlID0gdGhpcy5jdHgucGFyYW1zW3BhcmFtTmFtZV07XHJcbiAgICAgICAgICAgICAgICBhcmcgPSBhcmcucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcJHsnICsgcGFyYW1OYW1lICsgJ30nLCAnZycpLCBwYXJhbVZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyByZXBsYWNlIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aXRoIHZhbHVlc1xyXG4gICAgICAgIGZvciAobGV0IGVudk5hbWUgaW4gdGhpcy5jdHguZW52KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN0eC5lbnYuaGFzT3duUHJvcGVydHkoZW52TmFtZSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVudlZhbHVlID0gdGhpcy5jdHguZW52W2Vudk5hbWVdO1xyXG4gICAgICAgICAgICAgICAgYXJnID0gYXJnLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFxcXCR7JyArIGVudk5hbWUgKyAnfScsICdnJyksIGVudlZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXJnO1xyXG4gICAgfVxyXG4gICAgX2dldEFsbFByb3BlcnR5TmFtZXMoIG9iaiApIHtcclxuICAgICAgICBjb25zdCBwcm9wcyA9IFtdO1xyXG5cclxuICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKCBvYmogKS5mb3JFYWNoKGZ1bmN0aW9uICggcHJvcCApIHtcclxuICAgICAgICAgICAgICAgIGlmICggcHJvcHMuaW5kZXhPZiggcHJvcCApID09PSAtMSApIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5wdXNoKCBwcm9wICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uZC1hc3NpZ25cclxuICAgICAgICB9IHdoaWxlICggb2JqID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKCBvYmogKSApO1xyXG5cclxuICAgICAgICByZXR1cm4gcHJvcHM7XHJcbiAgICB9XHJcblxyXG4gICAgX2NoZWNrU3RlcFJlc3VsdChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBpZiAodGhpcy5fd2FpdFN0ZXBSZXN1bHRMaXN0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY2hlY2tTdGVwUmVzdWx0KHJlc29sdmUsIHJlamVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF93YWl0U3RlcFJlc3VsdCgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGVja1N0ZXBSZXN1bHQocmVzb2x2ZSwgcmVqZWN0KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBfZ2V0RGVjcnlwdGVkQXJnc0ZvckFwcGx5KGFyZ3MsIG1vZHVsZU5hbWUpIHtcclxuICAgICAgICBpZiAoIWFyZ3MgfHwgIUFycmF5LmlzQXJyYXkoYXJncykgfHwgYXJncy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYXJncztcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgX25ld0FyZ3MgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBhcmcgb2YgYXJncykge1xyXG4gICAgICAgICAgICBfbmV3QXJncy5wdXNoKHRoaXMuX2RlY3J5cHRQYXJhbWV0ZXJGb3JBcHBseUluQXJndW1lbnQoYXJnLCBtb2R1bGVOYW1lKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfbmV3QXJncztcclxuICAgIH1cclxuXHJcbiAgICBfZGVjcnlwdFBhcmFtZXRlckZvckFwcGx5SW5Bcmd1bWVudChhcmcsIG1vZHVsZU5hbWUpIHtcclxuICAgICAgICBpZiAoYXJnICYmIHR5cGVvZiBhcmcuZ2V0RGVjcnlwdFJlc3VsdCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBpZiAobW9kdWxlTmFtZSA9PT0gJ2xvZycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnRU5DUllQVEVEJztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhcmcuZ2V0RGVjcnlwdFJlc3VsdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYXJnO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -58,4 +58,4 @@ class OxygenEvents extends _events.EventEmitter {
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
exports.default = OxygenEvents;
|
|
61
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
61
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL094eWdlbkV2ZW50cy5qcyJdLCJuYW1lcyI6WyJPeHlnZW5FdmVudHMiLCJFdmVudEVtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsImVtaXRCZWZvcmVDb21tYW5kIiwic3RlcFJlc3VsdElkIiwiY21kTmFtZSIsIm1vZHVsZU5hbWUiLCJjbWRGbiIsImNtZEFyZ3MiLCJjdHgiLCJsb2NhdGlvbiIsInN0YXJ0VGltZSIsImVtaXQiLCJpZCIsIm5hbWUiLCJtb2R1bGUiLCJhcmdzIiwic2lnbmF0dXJlIiwib3h1dGlsIiwiZ2V0TWV0aG9kU2lnbmF0dXJlIiwidGltZSIsImVtaXRBZnRlckNvbW1hbmQiLCJlbmRUaW1lIiwicmVzdWx0IiwiZW1pdExvZyIsImxldmVsIiwibXNnIiwic3JjIiwibWVzc2FnZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBQ0E7Ozs7QUFFZSxNQUFNQSxZQUFOLFNBQTJCQyxvQkFBM0IsQ0FBd0M7QUFDbkRDLEVBQUFBLFdBQVcsR0FBSTtBQUNYO0FBQ0g7O0FBRURDLEVBQUFBLGlCQUFpQixDQUFDQyxZQUFELEVBQWVDLE9BQWYsRUFBd0JDLFVBQXhCLEVBQW9DQyxLQUFwQyxFQUEyQ0MsT0FBM0MsRUFBb0RDLEdBQXBELEVBQXlEQyxRQUF6RCxFQUFtRUMsU0FBbkUsRUFBOEU7QUFDM0YsU0FBS0MsSUFBTCxDQUFVLGdCQUFWLEVBQTRCO0FBQ3hCQyxNQUFBQSxFQUFFLEVBQUVULFlBRG9CO0FBRXhCVSxNQUFBQSxJQUFJLEVBQUVULE9BRmtCO0FBR3hCVSxNQUFBQSxNQUFNLEVBQUVULFVBSGdCO0FBSXhCVSxNQUFBQSxJQUFJLEVBQUVSLE9BSmtCO0FBS3hCUyxNQUFBQSxTQUFTLEVBQUVDLGNBQU9DLGtCQUFQLENBQTBCYixVQUExQixFQUFzQ0QsT0FBdEMsRUFBK0NHLE9BQS9DLENBTGE7QUFNeEJDLE1BQUFBLEdBQUcsRUFBRUEsR0FObUI7QUFPeEJXLE1BQUFBLElBQUksRUFBRVQsU0FQa0I7QUFReEJELE1BQUFBLFFBQVEsRUFBRUE7QUFSYyxLQUE1QjtBQVVIOztBQUVEVyxFQUFBQSxnQkFBZ0IsQ0FBQ2hCLE9BQUQsRUFBVUMsVUFBVixFQUFzQkMsS0FBdEIsRUFBNkJDLE9BQTdCLEVBQXNDQyxHQUF0QyxFQUEyQ0MsUUFBM0MsRUFBcURZLE9BQXJELEVBQThEQyxNQUE5RCxFQUFzRTtBQUNsRixTQUFLWCxJQUFMLENBQVUsZUFBVixFQUEyQjtBQUN2QkMsTUFBQUEsRUFBRSxFQUFFVSxNQUFNLENBQUNWLEVBRFk7QUFFdkJDLE1BQUFBLElBQUksRUFBRVQsT0FGaUI7QUFHdkJVLE1BQUFBLE1BQU0sRUFBRVQsVUFIZTtBQUl2QlUsTUFBQUEsSUFBSSxFQUFFUixPQUppQjtBQUt2QlMsTUFBQUEsU0FBUyxFQUFFQyxjQUFPQyxrQkFBUCxDQUEwQmIsVUFBMUIsRUFBc0NELE9BQXRDLEVBQStDRyxPQUEvQyxDQUxZO0FBTXZCQyxNQUFBQSxHQUFHLEVBQUVBLEdBTmtCO0FBT3ZCVyxNQUFBQSxJQUFJLEVBQUVFLE9BUGlCO0FBUXZCWixNQUFBQSxRQUFRLEVBQUVBLFFBUmE7QUFTdkJhLE1BQUFBLE1BQU0sRUFBRUE7QUFUZSxLQUEzQjtBQVdIOztBQUVEQyxFQUFBQSxPQUFPLENBQUNKLElBQUQsRUFBT0ssS0FBUCxFQUFjQyxHQUFkLEVBQW1CVixJQUFuQixFQUF5QlcsR0FBekIsRUFBOEI7QUFDakMsU0FBS2YsSUFBTCxDQUFVLEtBQVYsRUFBaUI7QUFDYlEsTUFBQUEsSUFBSSxFQUFFQSxJQURPO0FBRWJLLE1BQUFBLEtBQUssRUFBRUEsS0FGTTtBQUdiRyxNQUFBQSxPQUFPLEVBQUVGLEdBSEk7QUFJYlYsTUFBQUEsSUFBSSxFQUFFQSxJQUpPO0FBS2JXLE1BQUFBLEdBQUcsRUFBRUE7QUFMUSxLQUFqQjtBQU9IOztBQXhDa0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xyXG5pbXBvcnQgb3h1dGlsIGZyb20gJy4uL2xpYi91dGlsJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE94eWdlbkV2ZW50cyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvciAoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBlbWl0QmVmb3JlQ29tbWFuZChzdGVwUmVzdWx0SWQsIGNtZE5hbWUsIG1vZHVsZU5hbWUsIGNtZEZuLCBjbWRBcmdzLCBjdHgsIGxvY2F0aW9uLCBzdGFydFRpbWUpIHtcclxuICAgICAgICB0aGlzLmVtaXQoJ2NvbW1hbmQ6YmVmb3JlJywge1xyXG4gICAgICAgICAgICBpZDogc3RlcFJlc3VsdElkLFxyXG4gICAgICAgICAgICBuYW1lOiBjbWROYW1lLFxyXG4gICAgICAgICAgICBtb2R1bGU6IG1vZHVsZU5hbWUsXHJcbiAgICAgICAgICAgIGFyZ3M6IGNtZEFyZ3MsXHJcbiAgICAgICAgICAgIHNpZ25hdHVyZTogb3h1dGlsLmdldE1ldGhvZFNpZ25hdHVyZShtb2R1bGVOYW1lLCBjbWROYW1lLCBjbWRBcmdzKSxcclxuICAgICAgICAgICAgY3R4OiBjdHgsXHJcbiAgICAgICAgICAgIHRpbWU6IHN0YXJ0VGltZSxcclxuICAgICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGVtaXRBZnRlckNvbW1hbmQoY21kTmFtZSwgbW9kdWxlTmFtZSwgY21kRm4sIGNtZEFyZ3MsIGN0eCwgbG9jYXRpb24sIGVuZFRpbWUsIHJlc3VsdCkge1xyXG4gICAgICAgIHRoaXMuZW1pdCgnY29tbWFuZDphZnRlcicsIHtcclxuICAgICAgICAgICAgaWQ6IHJlc3VsdC5pZCxcclxuICAgICAgICAgICAgbmFtZTogY21kTmFtZSxcclxuICAgICAgICAgICAgbW9kdWxlOiBtb2R1bGVOYW1lLFxyXG4gICAgICAgICAgICBhcmdzOiBjbWRBcmdzLFxyXG4gICAgICAgICAgICBzaWduYXR1cmU6IG94dXRpbC5nZXRNZXRob2RTaWduYXR1cmUobW9kdWxlTmFtZSwgY21kTmFtZSwgY21kQXJncyksXHJcbiAgICAgICAgICAgIGN0eDogY3R4LFxyXG4gICAgICAgICAgICB0aW1lOiBlbmRUaW1lLFxyXG4gICAgICAgICAgICBsb2NhdGlvbjogbG9jYXRpb24sXHJcbiAgICAgICAgICAgIHJlc3VsdDogcmVzdWx0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGVtaXRMb2codGltZSwgbGV2ZWwsIG1zZywgYXJncywgc3JjKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdsb2cnLCB7XHJcbiAgICAgICAgICAgIHRpbWU6IHRpbWUsXHJcbiAgICAgICAgICAgIGxldmVsOiBsZXZlbCxcclxuICAgICAgICAgICAgbWVzc2FnZTogbXNnLFxyXG4gICAgICAgICAgICBhcmdzOiBhcmdzLFxyXG4gICAgICAgICAgICBzcmM6IHNyYyxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
@@ -72,4 +72,4 @@ class OxygenModule {
|
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
exports.default = OxygenModule;
|
|
75
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
75
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL094eWdlbk1vZHVsZS5qcyJdLCJuYW1lcyI6WyJPeHlnZW5Nb2R1bGUiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJjb250ZXh0IiwicnMiLCJsb2dnZXIiLCJtb2R1bGVzIiwic2VydmljZXMiLCJfdGhpcyIsImN0eCIsIl9pc0luaXRpYWxpemVkIiwiX2Fsd2F5c0luaXRpYWxpemVkIiwiX2V4dHJhIiwibmFtZSIsIkVycm9yIiwiaXNJbml0aWFsaXplZCIsImV4dHJhIiwiaW5pdCIsImRpc3Bvc2UiLCJnZXRTdGVwRGlzcGxheU5hbWUiLCJtZXRob2QiLCJyZXR2YWwiLCJlcnJvciIsInVuZGVmaW5lZCIsIm9uQmVmb3JlQ2FzZSIsIm9uQWZ0ZXJDYXNlIiwiYWRkQ29tbWFuZCIsImZ1bmMiLCJ0aGlzQXJnIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRQcm90b3R5cGVPZiIsInZhbHVlIiwiYmluZCIsImFkZFN1Yk1vZHVsZSIsInN1Ym1vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQWUsTUFBTUEsWUFBTixDQUFtQjtBQUM5QkMsRUFBQUEsV0FBVyxDQUFDQyxPQUFELEVBQVVDLE9BQVYsRUFBbUJDLEVBQW5CLEVBQXVCQyxNQUF2QixFQUErQkMsT0FBL0IsRUFBd0NDLFFBQXhDLEVBQWtEO0FBQ3pELFNBQUtDLEtBQUwsR0FBYSxJQUFiO0FBQ0EsU0FBS04sT0FBTCxHQUFlQSxPQUFmO0FBQ0EsU0FBS08sR0FBTCxHQUFXTixPQUFYO0FBQ0EsU0FBS0MsRUFBTCxHQUFVQSxFQUFWO0FBQ0EsU0FBS0MsTUFBTCxHQUFjQSxNQUFkO0FBQ0EsU0FBS0MsT0FBTCxHQUFlQSxPQUFmO0FBQ0EsU0FBS0MsUUFBTCxHQUFnQkEsUUFBaEI7QUFDQSxTQUFLRyxjQUFMLEdBQXNCLEtBQXRCO0FBQ0EsU0FBS0Msa0JBQUwsR0FBMEIsS0FBMUI7QUFDQSxTQUFLQyxNQUFMLEdBQWMsRUFBZDtBQUNIOztBQUNPLE1BQUpDLElBQUksR0FBRztBQUNQLFVBQU1DLEtBQUssQ0FBQywyREFBRCxDQUFYO0FBQ0g7O0FBQ2dCLE1BQWJDLGFBQWEsR0FBRztBQUNoQixXQUFPLEtBQUtMLGNBQVo7QUFDSDs7QUFDUSxNQUFMTSxLQUFLLEdBQUc7QUFDUixXQUFPLEtBQUtKLE1BQVo7QUFDSDs7QUFDREssRUFBQUEsSUFBSSxHQUFHO0FBQ0gsU0FBS1AsY0FBTCxHQUFzQixJQUF0QjtBQUNIOztBQUNEUSxFQUFBQSxPQUFPLEdBQUc7QUFDTixRQUFJLEtBQUtQLGtCQUFMLElBQTJCLEtBQS9CLEVBQXNDO0FBQ2xDLFdBQUtELGNBQUwsR0FBc0IsS0FBdEI7QUFDSDtBQUNKOztBQUNEUyxFQUFBQSxrQkFBa0IsQ0FBQ0MsTUFBRCxFQUFTQyxNQUFULEVBQWlCQyxLQUFqQixFQUF3Qk4sS0FBeEIsRUFBK0I7QUFDN0MsV0FBT08sU0FBUDtBQUNIOztBQUNEQyxFQUFBQSxZQUFZLENBQUNyQixPQUFELEVBQVU7QUFDbEIsU0FBS1MsTUFBTCxHQUFjLEVBQWQ7QUFDSDs7QUFDRGEsRUFBQUEsV0FBVyxDQUFDSCxLQUFELEVBQVEsQ0FFbEI7O0FBQ0RJLEVBQUFBLFVBQVUsQ0FBQ2IsSUFBRCxFQUFPYyxJQUFQLEVBQWFDLE9BQWIsRUFBc0I7QUFDNUIsUUFBSSxDQUFDQSxPQUFMLEVBQWM7QUFDVkEsTUFBQUEsT0FBTyxHQUFHLElBQVY7QUFDSDs7QUFDREMsSUFBQUEsTUFBTSxDQUFDQyxjQUFQLENBQXNCRCxNQUFNLENBQUNFLGNBQVAsQ0FBc0IsSUFBdEIsQ0FBdEIsRUFBbURsQixJQUFuRCxFQUF5RDtBQUNyRG1CLE1BQUFBLEtBQUssRUFBRUwsSUFBSSxDQUFDTSxJQUFMLENBQVVMLE9BQVY7QUFEOEMsS0FBekQ7QUFHSDs7QUFDRE0sRUFBQUEsWUFBWSxDQUFDckIsSUFBRCxFQUFPc0IsU0FBUCxFQUFrQjtBQUMxQk4sSUFBQUEsTUFBTSxDQUFDQyxjQUFQLENBQXNCRCxNQUFNLENBQUNFLGNBQVAsQ0FBc0IsSUFBdEIsQ0FBdEIsRUFBbURsQixJQUFuRCxFQUF5RDtBQUNyRG1CLE1BQUFBLEtBQUssRUFBRUc7QUFEOEMsS0FBekQ7QUFHSDs7QUFuRDZCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgY2xhc3MgT3h5Z2VuTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKSB7XHJcbiAgICAgICAgdGhpcy5fdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICB0aGlzLmN0eCA9IGNvbnRleHQ7XHJcbiAgICAgICAgdGhpcy5ycyA9IHJzO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xyXG4gICAgICAgIHRoaXMubW9kdWxlcyA9IG1vZHVsZXM7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWNlcyA9IHNlcnZpY2VzO1xyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9hbHdheXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2V4dHJhID0ge307XHJcbiAgICB9XHJcbiAgICBnZXQgbmFtZSgpIHtcclxuICAgICAgICB0aHJvdyBFcnJvcignXCJuYW1lXCIgcHJvcGVydHkgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVyaXZpbmcgY2xhc3MnKTtcclxuICAgIH1cclxuICAgIGdldCBpc0luaXRpYWxpemVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0luaXRpYWxpemVkO1xyXG4gICAgfVxyXG4gICAgZ2V0IGV4dHJhKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9leHRyYTtcclxuICAgIH1cclxuICAgIGluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBkaXNwb3NlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9hbHdheXNJbml0aWFsaXplZCA9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0U3RlcERpc3BsYXlOYW1lKG1ldGhvZCwgcmV0dmFsLCBlcnJvciwgZXh0cmEpIHtcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgb25CZWZvcmVDYXNlKGNvbnRleHQpIHtcclxuICAgICAgICB0aGlzLl9leHRyYSA9IHt9O1xyXG4gICAgfVxyXG4gICAgb25BZnRlckNhc2UoZXJyb3IpIHtcclxuXHJcbiAgICB9XHJcbiAgICBhZGRDb21tYW5kKG5hbWUsIGZ1bmMsIHRoaXNBcmcpIHtcclxuICAgICAgICBpZiAoIXRoaXNBcmcpIHtcclxuICAgICAgICAgICAgdGhpc0FyZyA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyksIG5hbWUsIHtcclxuICAgICAgICAgICAgdmFsdWU6IGZ1bmMuYmluZCh0aGlzQXJnKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgYWRkU3ViTW9kdWxlKG5hbWUsIHN1Ym1vZHVsZSkge1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyksIG5hbWUsIHtcclxuICAgICAgICAgICAgdmFsdWU6IHN1Ym1vZHVsZVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59Il19
|