obsidian-integration-testing 4.2.6 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +71 -0
- package/dist/lib/cjs/enable-plugin.cjs +1 -1
- package/dist/lib/cjs/enable-plugin.d.cts +4 -4
- package/dist/lib/cjs/eval-in-obsidian.cjs +3 -5
- package/dist/lib/cjs/eval-in-obsidian.d.cts +5 -5
- package/dist/lib/cjs/generate-function-call.cjs +1 -1
- package/dist/lib/cjs/generate-function-call.d.cts +4 -4
- package/dist/lib/cjs/global-setup-core.cjs +39 -11
- package/dist/lib/cjs/global-setup-core.d.cts +13 -5
- package/dist/lib/cjs/jest/global-setup.cjs +24 -14
- package/dist/lib/cjs/jest/global-setup.d.cts +37 -4
- package/dist/lib/cjs/jest/global-teardown.cjs +26 -0
- package/dist/lib/cjs/jest/global-teardown.d.cts +11 -0
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/namespace-bootstrap.cjs +1 -1
- package/dist/lib/cjs/obsidian-namespace.cjs +1 -1
- package/dist/lib/cjs/obsidian-namespace.d.cts +6 -6
- package/dist/lib/cjs/setup-lock.cjs +158 -0
- package/dist/lib/cjs/setup-lock.d.cts +55 -0
- package/dist/lib/cjs/strict-proxy.cjs +1 -1
- package/dist/lib/cjs/strict-proxy.d.cts +3 -2
- package/dist/lib/cjs/transport-desktop-cdp.cjs +1 -1
- package/dist/lib/cjs/transport-desktop-cli.cjs +1 -1
- package/dist/lib/cjs/transport-desktop-cli.d.cts +1 -1
- package/dist/lib/cjs/transport-factory.cjs +1 -1
- package/dist/lib/cjs/transport-options.cjs +1 -1
- package/dist/lib/cjs/transport-options.d.cts +14 -14
- package/dist/lib/cjs/vitest/global-setup.cjs +27 -19
- package/dist/lib/cjs/vitest/global-setup.d.cts +35 -3
- package/dist/lib/cjs/vitest/typings.d.cts +1 -1
- package/dist/lib/esm/enable-plugin.d.mts +4 -4
- package/dist/lib/esm/enable-plugin.mjs +1 -1
- package/dist/lib/esm/eval-in-obsidian.d.mts +5 -5
- package/dist/lib/esm/eval-in-obsidian.mjs +3 -5
- package/dist/lib/esm/generate-function-call.d.mts +4 -4
- package/dist/lib/esm/generate-function-call.mjs +1 -1
- package/dist/lib/esm/global-setup-core.d.mts +13 -5
- package/dist/lib/esm/global-setup-core.mjs +39 -11
- package/dist/lib/esm/jest/global-setup.d.mts +37 -4
- package/dist/lib/esm/jest/global-setup.mjs +23 -14
- package/dist/lib/esm/jest/global-teardown.d.mts +11 -0
- package/dist/lib/esm/jest/global-teardown.mjs +6 -0
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/namespace-bootstrap.mjs +1 -1
- package/dist/lib/esm/obsidian-namespace.d.mts +6 -6
- package/dist/lib/esm/setup-lock.d.mts +55 -0
- package/dist/lib/esm/setup-lock.mjs +132 -0
- package/dist/lib/esm/strict-proxy.d.mts +3 -2
- package/dist/lib/esm/strict-proxy.mjs +1 -1
- package/dist/lib/esm/transport-desktop-cdp.mjs +1 -1
- package/dist/lib/esm/transport-desktop-cli.d.mts +1 -1
- package/dist/lib/esm/transport-desktop-cli.mjs +1 -1
- package/dist/lib/esm/transport-factory.mjs +1 -1
- package/dist/lib/esm/transport-options.d.mts +14 -14
- package/dist/lib/esm/vitest/global-setup.d.mts +35 -3
- package/dist/lib/esm/vitest/global-setup.mjs +26 -19
- package/dist/lib/esm/vitest/typings.d.mts +1 -1
- package/dist/obsidian-integration-testing-4.4.0.tgz +0 -0
- package/package.json +34 -21
- package/dist/obsidian-integration-testing-4.2.6.tgz +0 -0
|
@@ -517,4 +517,4 @@ export {
|
|
|
517
517
|
DesktopCliTransport,
|
|
518
518
|
invokeAndWriteResult
|
|
519
519
|
};
|
|
520
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0xJIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBgb2JzaWRpYW4gZXZhbGAgYW5kIG1hbmFnZXNcbiAqIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgdW5saW5rLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBFeGVjUmVzdWx0IH0gZnJvbSAnLi9leGVjLm1qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQgeyBESVNNSVNTX1RSVVNUX0RJQUxPR19FWFBSIH0gZnJvbSAnLi9kaXNtaXNzLXRydXN0LWRpYWxvZy5tanMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5tanMnO1xuaW1wb3J0IHsgZ2V0RnVuY3Rpb25FeHByZXNzaW9uU3RyaW5nIH0gZnJvbSAnLi9mdW5jdGlvbi1leHByZXNzaW9uLm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuaW1wb3J0IHsgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkIH0gZnJvbSAnLi9uYW1lc3BhY2UtYm9vdHN0cmFwLm1qcyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi9ub29wLm1qcyc7XG5pbXBvcnQge1xuICBlbmFibGVDbGlJbkNvbmZpZyxcbiAgZ2V0QW55T3BlblZhdWx0UGF0aCxcbiAgZ2V0UmVnaXN0ZXJlZFZhdWx0cyxcbiAgZ2V0VmF1bHRJZCxcbiAgaXNDbGlFbmFibGVkLFxuICBpc1ZhdWx0T3BlbixcbiAgaXNWYXVsdFJlZ2lzdGVyZWQsXG4gIHJlZ2lzdGVyVmF1bHRJbkNvbmZpZyxcbiAgcmVtb3ZlVmF1bHRGcm9tQ29uZmlnXG59IGZyb20gJy4vb2JzaWRpYW4tY29uZmlnLm1qcyc7XG5pbXBvcnQgeyByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlIH0gZnJvbSAnLi9vYnNpZGlhbi1leGVjdXRhYmxlLm1qcyc7XG5pbXBvcnQgeyBzZXJpYWxpemVFcnJvciB9IGZyb20gJy4vc2VyaWFsaXplLWVycm9yLm1qcyc7XG5cbmludGVyZmFjZSBFeGVjdXRlU2NyaXB0RmlsZUZzUHJvbWlzZXMge1xuICBhY2Nlc3MocGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgcmVhZEZpbGUocGF0aDogc3RyaW5nLCBlbmNvZGluZzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xufVxuXG5pbnRlcmZhY2UgSW52b2tlQW5kV3JpdGVSZXN1bHRGc1Byb21pc2VzIHtcbiAgd3JpdGVGaWxlKHBhdGg6IHN0cmluZywgZGF0YTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuaW50ZXJmYWNlIEludm9rZUFuZFdyaXRlUmVzdWx0UGFyYW1zIHtcbiAgZXZhbHVhdGUoKTogUHJvbWlzZTx1bmtub3duPjtcbiAgcmVzdWx0UGF0aDogc3RyaW5nO1xuICBzZXJpYWxpemVFcnJvcihlcnJvcjogdW5rbm93bik6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIGVudmVsb3BlIHdyaXR0ZW4gYnkgdGhlIHRlbXBvcmFyeSBzY3JpcHQgZmlsZS5cbiAqXG4gKiAtIGB7IHZhbHVlOiBzdHJpbmcsIHR5cGU6ICdlcnJvcicgfWAgXHUyMDE0IHRoZSBleHByZXNzaW9uIHRocmV3OyBgdmFsdWVgIGlzIHRoZSBlcnJvciBtZXNzYWdlLlxuICogLSBgeyB2YWx1ZTogJycsIHR5cGU6ICdudWxsJyB9YCBcdTIwMTQgdGhlIGV4cHJlc3Npb24gcmV0dXJuZWQgYG51bGxgLlxuICogLSBgeyB2YWx1ZTogJycsIHR5cGU6ICd1bmRlZmluZWQnIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBgdW5kZWZpbmVkYC5cbiAqIC0gYHsgdmFsdWU6IHN0cmluZyB9YCBcdTIwMTQgdGhlIGV4cHJlc3Npb24gcmV0dXJuZWQgYSBzdHJpbmcgdmFsdWUgKG5vIGB0eXBlYCBmaWVsZCkuXG4gKi9cbnR5cGUgU2NyaXB0UmVzdWx0RW52ZWxvcGUgPVxuICB8IHsgdHlwZTogJ2Vycm9yJyB8ICdudWxsJyB8ICd1bmRlZmluZWQnOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IHZhbHVlOiBzdHJpbmcgfTtcblxuY29uc3QgVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4gPSAndW5hYmxlIHRvIGZpbmQgT2JzaWRpYW4nO1xuY29uc3QgQVVUT19TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwMDA7XG5jb25zdCBWQVVMVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IFZBVUxUX0NMT1NFX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDEwMDA7XG5jb25zdCBWQVVMVF9FVkFMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTAwMDA7XG5cbmludGVyZmFjZSBCdWlsZERpYWdub3N0aWNzUGFyYW1zIHtcbiAgY29tbWFuZDogc3RyaW5nW107XG4gIGN3ZDogc3RyaW5nO1xuICBleGVjUmVzdWx0OiBFeGVjUmVzdWx0IHwgdW5kZWZpbmVkO1xuICByZXN1bHRQYXRoOiBzdHJpbmc7XG4gIHNjcmlwdENvbnRlbnQ6IHN0cmluZztcbiAgc2NyaXB0UGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRyYW5zcG9ydCB0aGF0IGNvbW11bmljYXRlcyB3aXRoIERlc2t0b3AgT2JzaWRpYW4gdmlhIHRoZSBgb2JzaWRpYW4gZXZhbGAgQ0xJIGNvbW1hbmRcbiAqIGFuZCBtYW5hZ2VzIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICovXG5leHBvcnQgY2xhc3MgRGVza3RvcENsaVRyYW5zcG9ydCBpbXBsZW1lbnRzIE9ic2lkaWFuVHJhbnNwb3J0IHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIGZvciBhIG1vYmlsZSBwbGF0Zm9ybS4gQWx3YXlzIGBmYWxzZWAgZm9yIHRoaXMgdHJhbnNwb3J0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlzTW9iaWxlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIEphdmFTY3JpcHQgZXhwcmVzc2lvbiBpbnNpZGUgT2JzaWRpYW4gdmlhIGBvYnNpZGlhbiBldmFsYC5cbiAgICpcbiAgICogV3JpdGVzIHRoZSBleHByZXNzaW9uIHRvIGEgdGVtcG9yYXJ5IGAuY2pzYCBmaWxlIGFuZCBleGVjdXRlcyBhIHRpbnlcbiAgICogYHJlcXVpcmUoKS5pbnZva2UoKWAgY2FsbCB2aWEgdGhlIENMSS4gVGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvIGFcbiAgICogYC5yZXN1bHQuanNvbmAgZmlsZSBieSB0aGUgc2NyaXB0LCBhdm9pZGluZyBDTEkgc3Rkb3V0IHNpemUgbGltaXRzXG4gICAqIGFuZCBJUEMgYnVmZmVyIGlzc3Vlcy5cbiAgICpcbiAgICogSGFuZGxlcyBhdXRvLXN0YXJ0OiBpZiBPYnNpZGlhbiBpcyBub3QgcnVubmluZywgbGF1bmNoZXMgaXQgdmlhIFVSSSBwcm90b2NvbFxuICAgKiBhbmQgcmV0cmllcyB1bnRpbCBpdCBiZWNvbWVzIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHBhcmFtIGV4cHJlc3Npb24gLSBUaGUgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEV2YWx1YXRpb24gb3B0aW9ucy5cbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgcmVzdWx0IHN0cmluZyAodHJhbnNwb3J0LXNwZWNpZmljIHByZWZpeGVzIHN0cmlwcGVkKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBldmFsdWF0ZShleHByZXNzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IFRyYW5zcG9ydEV2YWxPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBTTElDRV9TVEFSVCA9IDI7XG4gICAgY29uc3Qgc2NyaXB0SWQgPSBTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoU0xJQ0VfU1RBUlQpO1xuICAgIGNvbnN0IHNjcmlwdERpciA9IGpvaW4odG1wZGlyKCksICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJyk7XG4gICAgY29uc3Qgc2NyaXB0UGF0aCA9IGpvaW4oc2NyaXB0RGlyLCBgJHtzY3JpcHRJZH0uanNgKTtcbiAgICBjb25zdCByZXN1bHRQYXRoID0gam9pbihzY3JpcHREaXIsIGAke3NjcmlwdElkfS5yZXN1bHQuanNvbmApO1xuXG4gICAgYXdhaXQgbWtkaXIoc2NyaXB0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHNjcmlwdENvbnRlbnQgPSBidWlsZFNjcmlwdEZpbGUoZXhwcmVzc2lvbiwgcmVzdWx0UGF0aCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHNjcmlwdFBhdGgsIHNjcmlwdENvbnRlbnQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhZmVTY3JpcHRQYXRoID0gc2NyaXB0UGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICBjb25zdCBjbGlFeHByID0gYCgke2dldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyhleGVjdXRlU2NyaXB0RmlsZSl9KSgke0pTT04uc3RyaW5naWZ5KHNhZmVTY3JpcHRQYXRoKX0pYDtcbiAgICAgIGNvbnN0IHZhdWx0SWQgPSBnZXRWYXVsdElkKG9wdGlvbnMuY3dkKTtcbiAgICAgIGNvbnN0IGNvbW1hbmQgPSBbJ29ic2lkaWFuJywgLi4uKHZhdWx0SWQgPyBbYHZhdWx0PSR7dmF1bHRJZH1gXSA6IFtdKSwgJ2V2YWwnLCAnLS1hbGxvdy1mb2N1cy1zdGVhbCcsIGBjb2RlPSR7Y2xpRXhwcn1gXTtcblxuICAgICAgbGV0IGV4ZWNSZXN1bHQ6IEV4ZWNSZXN1bHQgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBleGVjUmVzdWx0ID0gYXdhaXQgZXhlYyhjb21tYW5kLCB7XG4gICAgICAgICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICAgICAgICBpc1F1aWV0OiB0cnVlLFxuICAgICAgICAgIHNob3VsZEluY2x1ZGVEZXRhaWxzOiB0cnVlLFxuICAgICAgICAgIC4uLihvcHRpb25zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFVOQUJMRV9UT19GSU5EX09CU0lESUFOKSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlT2JzaWRpYW5SdW5uaW5nQW5kUmV0cnkoY29tbWFuZCwgb3B0aW9ucy5jd2QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghZXhpc3RzU3luYyhyZXN1bHRQYXRoKSkge1xuICAgICAgICBjb25zdCBkaWFnbm9zdGljcyA9IGF3YWl0IGJ1aWxkRGlhZ25vc3RpY3Moe1xuICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICAgICAgICBleGVjUmVzdWx0LFxuICAgICAgICAgIHJlc3VsdFBhdGgsXG4gICAgICAgICAgc2NyaXB0Q29udGVudCxcbiAgICAgICAgICBzY3JpcHRQYXRoXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNjcmlwdCBkaWQgbm90IGV4ZWN1dGUgZm9yIHBhdGg6ICR7b3B0aW9ucy5jd2R9XFxuJHtkaWFnbm9zdGljc31gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0U3RyID0gYXdhaXQgcmVhZEZpbGUocmVzdWx0UGF0aCwgJ3V0Zi04Jyk7XG4gICAgICBjb25zdCBlbnZlbG9wZSA9IEpTT04ucGFyc2UocmVzdWx0U3RyKSBhcyBTY3JpcHRSZXN1bHRFbnZlbG9wZTtcblxuICAgICAgaWYgKCd0eXBlJyBpbiBlbnZlbG9wZSkge1xuICAgICAgICBpZiAoZW52ZWxvcGUudHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2NyaXB0IGVycm9yIGluIE9ic2lkaWFuIGZvciBwYXRoOiAke29wdGlvbnMuY3dkfTogJHtlbnZlbG9wZS52YWx1ZX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbnZlbG9wZS52YWx1ZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdW5saW5rKHNjcmlwdFBhdGgpLmNhdGNoKG5vb3ApO1xuICAgICAgYXdhaXQgdW5saW5rKHJlc3VsdFBhdGgpLmNhdGNoKG5vb3ApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIENMSS1zcGVjaWZpYyBwcmVmbGlnaHQgY2hlY2tzLlxuICAgKlxuICAgKiBWZXJpZmllcyB0aGF0IHRoZSB2YXVsdCBpcyByZWdpc3RlcmVkLCBDTEkgaXMgZW5hYmxlZCBpbiBPYnNpZGlhbiBzZXR0aW5ncyxcbiAgICogYW5kIHRoZSBgb2JzaWRpYW5gIENMSSBiaW5hcnkgaXMgYXZhaWxhYmxlIGluIFBBVEguIElmIHRoZSB2YXVsdCBpcyByZWdpc3RlcmVkXG4gICAqIGJ1dCBub3Qgb3Blbiwgb3BlbnMgaXQgdmlhIFVSSSBwcm90b2NvbCBhbmQgcG9sbHMgdW50aWwgaXQgaXMgcmVhZHkuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZWZsaWdodENoZWNrKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUnVubmluZyBwcmVmbGlnaHQgY2hlY2sgZm9yIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICBpZiAoIWlzVmF1bHRSZWdpc3RlcmVkKHZhdWx0UGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFZhdWx0IGlzIG5vdCByZWdpc3RlcmVkIGluIE9ic2lkaWFuOiAke3ZhdWx0UGF0aH0uIFJlZ2lzdGVyIHRoZSB2YXVsdCBmaXJzdCB3aXRoIHJlZ2lzdGVyVmF1bHQoKSBvciBUZW1wVmF1bHQucmVnaXN0ZXIoKS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghaXNDbGlFbmFibGVkKCkpIHtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIENMSSBpcyBkaXNhYmxlZCBpbiBvYnNpZGlhbi5qc29uLiBFbmFibGluZyBhbmQgcmVzdGFydGluZyBPYnNpZGlhbi4uLicpO1xuICAgICAgZW5hYmxlQ2xpSW5Db25maWcoKTtcbiAgICAgIGF3YWl0IHRoaXMucmVzdGFydE9ic2lkaWFuKHZhdWx0UGF0aCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5hc3NlcnRDbGlBdmFpbGFibGUoKTtcblxuICAgIGlmICghaXNWYXVsdE9wZW4odmF1bHRQYXRoKSkge1xuICAgICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVmF1bHQgaXMgcmVnaXN0ZXJlZCBidXQgbm90IG9wZW46ICR7dmF1bHRQYXRofS4gT3BlbmluZyB2aWEgVVJJLi4uYCk7XG4gICAgICBhd2FpdCBvcGVuVmF1bHRWaWFVcmkodmF1bHRQYXRoKTtcbiAgICAgIGF3YWl0IHRoaXMucG9sbFZhdWx0UmVhZHkodmF1bHRQYXRoKTtcbiAgICB9XG5cbiAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBQcmVmbGlnaHQgY2hlY2sgcGFzc2VkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHZhdWx0IGluIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHZpYSBFbGVjdHJvbiBJUEMuXG4gICAqXG4gICAqIFVzZXMgYHZhdWx0LW9wZW5gIElQQyB0byByZWdpc3RlciBhbmQgb3BlbiB0aGUgdmF1bHQsIHRoZW4gcG9sbHMgdW50aWxcbiAgICogdGhlIHZhdWx0J3MgQ0xJIGlzIHJlYWR5IGFuZCBgZ2V0QmFzZVBhdGgoKWAgbWF0Y2hlcyBgdmF1bHRQYXRoYC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFJlZ2lzdGVyaW5nIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICBjb25zdCBvcGVuVmF1bHRQYXRoID0gYXdhaXQgdGhpcy5nZXRPcGVuRXZhbFRhcmdldFZhdWx0UGF0aCgpO1xuXG4gICAgaWYgKG9wZW5WYXVsdFBhdGgpIHtcbiAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCBvcGVuVmF1bHRQYXRoKTtcbiAgICAgIGNvbnN0IHJlZ2lzdGVyRXhwciA9IGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5pcGNTZW5kU3luYygke0pTT04uc3RyaW5naWZ5KHsgYXJnczogW3ZhdWx0UGF0aCwgZmFsc2VdLCBjaGFubmVsOiAndmF1bHQtb3BlbicgfSl9KWA7XG4gICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKHJlZ2lzdGVyRXhwciwgeyBjd2Q6IG9wZW5WYXVsdFBhdGggfSk7XG4gICAgICBhd2FpdCB0aGlzLmVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZSh2YXVsdFBhdGgsIG9wZW5WYXVsdFBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBObyBvcGVuIHZhdWx0IHRvIHRhcmdldC4gV3JpdGluZyB2YXVsdCBlbnRyeSBkaXJlY3RseSB0byBvYnNpZGlhbi5qc29uLi4uJyk7XG4gICAgICByZWdpc3RlclZhdWx0SW5Db25maWcodmF1bHRQYXRoKTtcbiAgICAgIC8qXG4gICAgICAgKiBBIHJ1bm5pbmcgT2JzaWRpYW4gd2l0aCBubyBvcGVuIHZhdWx0IChlLmcuIHNpdHRpbmcgb24gdGhlIHZhdWx0XG4gICAgICAgKiBzd2l0Y2hlcikgbG9hZGVkIGl0cyByZWdpc3RyeSBhdCBzdGFydHVwIGFuZCB3b24ndCBzZWUgdGhlIGVudHJ5IGp1c3RcbiAgICAgICAqIHdyaXR0ZW4sIHNvIGFuIGBvYnNpZGlhbjovL29wZW5gIFVSSSBmb3IgaXQgZmFpbHMgd2l0aCBcIlZhdWx0IG5vdFxuICAgICAgICogZm91bmRcIi4gS2lsbCBpdCBmaXJzdCBzbyB0aGUgVVJJIGJlbG93IHRyaWdnZXJzIGEgZnJlc2ggbGF1bmNoIHRoYXRcbiAgICAgICAqIHJlYWRzIHRoZSB1cGRhdGVkIG9ic2lkaWFuLmpzb24uIFdlIG9ubHkgcmVhY2ggdGhpcyBicmFuY2ggd2l0aCBub1xuICAgICAgICogdmF1bHQgb3Blbiwgc28gbm90aGluZyB0aGUgdXNlciBpcyB3b3JraW5nIGluIGlzIGxvc3QuXG4gICAgICAgKi9cbiAgICAgIGlmIChhd2FpdCBpc09ic2lkaWFuUnVubmluZygpKSB7XG4gICAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIE9ic2lkaWFuIGlzIHJ1bm5pbmcgd2l0aG91dCBhbiBvcGVuIHZhdWx0IFx1MjAxNCByZXN0YXJ0aW5nIHNvIGl0IHJlYWRzIHRoZSBuZXcgcmVnaXN0cnkgZW50cnkuLi4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5raWxsT2JzaWRpYW4oKTtcbiAgICAgIH1cbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFZhdWx0IGVudHJ5IHdyaXR0ZW4uIE9wZW5pbmcgdmF1bHQgdmlhIFVSSSBwcm90b2NvbC4uLicpO1xuICAgICAgYXdhaXQgb3BlblZhdWx0VmlhVXJpKHZhdWx0UGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLnBvbGxWYXVsdFJlYWR5KHZhdWx0UGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLmVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZSh2YXVsdFBhdGgsIHZhdWx0UGF0aCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5wb2xsVmF1bHRSZWFkeSh2YXVsdFBhdGgpO1xuICAgIGF3YWl0IHRoaXMuZGlzbWlzc1RydXN0RGlhbG9nKHZhdWx0UGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSB2YXVsdCBmcm9tIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlLlxuICAgKlxuICAgKiBTY2hlZHVsZXMgdGhlIHZhdWx0IHdpbmRvdyB0byBjbG9zZSwgd2FpdHMsIHRoZW4gcmVtb3ZlcyB0aGUgdmF1bHRcbiAgICogZnJvbSB0aGUgcmVnaXN0cnkgdmlhIGB2YXVsdC1yZW1vdmVgIElQQy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVW5yZWdpc3RlcmluZyB2YXVsdDogY2xvc2luZyB3aW5kb3cgZm9yICR7dmF1bHRQYXRofS4uLmApO1xuICAgIGlmIChpc1ZhdWx0T3Blbih2YXVsdFBhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgdmF1bHRQYXRoKTtcbiAgICAgICAgY29uc3QgZGVzdHJveUV4cHIgPSAnd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuZGVzdHJveUN1cnJlbnRXaW5kb3coKSc7XG4gICAgICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUoZGVzdHJveUV4cHIsIHsgY3dkOiB2YXVsdFBhdGgsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogVkFVTFRfRVZBTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9KTtcbiAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gV2luZG93IGRlc3Ryb3kgY29tbWFuZCBzZW50LicpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gV2luZG93IGRlc3Ryb3kgZmFpbGVkIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICAgIH1cblxuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gV2FpdGluZyBmb3Igd2luZG93IHRvIGNsb3NlLi4uJyk7XG4gICAgICBhd2FpdCBkZWxheShWQVVMVF9DTE9TRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBWYXVsdCBpcyBub3Qgb3BlbiBcdTIwMTQgc2tpcHBpbmcgZGVzdHJveSAod291bGQgb3RoZXJ3aXNlIHNwYXduIGEgc3RyYXkgd2luZG93IHZpYSB0aGUgQ0xJIGV2YWwpLicpO1xuICAgIH1cblxuICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFJlbW92aW5nIHZhdWx0IGZyb20gcmVnaXN0cnkuLi4nKTtcbiAgICBjb25zdCBldmFsVGFyZ2V0Rm9yUmVtb3ZhbCA9IGF3YWl0IHRoaXMuZ2V0T3BlbkV2YWxUYXJnZXRWYXVsdFBhdGgoKTtcbiAgICB0cnkge1xuICAgICAgaWYgKGV2YWxUYXJnZXRGb3JSZW1vdmFsKSB7XG4gICAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCBldmFsVGFyZ2V0Rm9yUmVtb3ZhbCk7XG4gICAgICAgIGNvbnN0IHJlbW92ZUV4cHIgPSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuaXBjU2VuZFN5bmMoJHtKU09OLnN0cmluZ2lmeSh7IGFyZ3M6IFt2YXVsdFBhdGhdLCBjaGFubmVsOiAndmF1bHQtcmVtb3ZlJyB9KX0pYDtcbiAgICAgICAgYXdhaXQgdGhpcy5ldmFsdWF0ZShyZW1vdmVFeHByLCB7IGN3ZDogZXZhbFRhcmdldEZvclJlbW92YWwsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogVkFVTFRfRVZBTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIE5vIG9wZW4gdmF1bHQgdG8gdGFyZ2V0IGZvciByZW1vdmFsIElQQyBcdTIwMTQgcmVtb3ZpbmcgZGlyZWN0bHkgZnJvbSBvYnNpZGlhbi5qc29uLicpO1xuICAgICAgICByZW1vdmVWYXVsdEZyb21Db25maWcodmF1bHRQYXRoKTtcbiAgICAgIH1cbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFZhdWx0IHJlbW92ZWQgZnJvbSByZWdpc3RyeS4nKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVmF1bHQgcmVnaXN0cnkgcmVtb3ZhbCBmYWlsZWQgKG5vbi1mYXRhbCk6ICR7c2VyaWFsaXplRXJyb3IoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgT2JzaWRpYW4gQ0xJIGJpbmFyeSBpcyBhdmFpbGFibGUgaW4gdGhlIHN5c3RlbSBQQVRILlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhc3NlcnRDbGlBdmFpbGFibGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29tbWFuZCA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyAnd2hlcmUuZXhlIG9ic2lkaWFuJyA6ICd3aGljaCBvYnNpZGlhbic7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWMoY29tbWFuZCwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPYnNpZGlhbiBDTEkgaXMgbm90IGF2YWlsYWJsZS4gRW5zdXJlIE9ic2lkaWFuIGlzIGluc3RhbGxlZCBhbmQgaXRzIENMSSBpcyBpbiB5b3VyIFBBVEguJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc21pc3NlcyB0aGUgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvciBvZiB0aGlzIHZhdWx0P1wiIGRpYWxvZyBpZiBwcmVzZW50LlxuICAgKlxuICAgKiBDbGlja3MgdGhlIFwiVHJ1c3QgYXV0aG9yIGFuZCBlbmFibGUgcGx1Z2luc1wiIGJ1dHRvbiAoYC5tb2QtY3RhYCkgaW5zaWRlIGFueVxuICAgKiBtb2RhbCB3aG9zZSB0ZXh0IGluY2x1ZGVzIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3JcIi4gQWN0cyBhcyBhIHNhZmV0eSBuZXRcbiAgICogZm9yIGJvdGggcmVnaXN0cmF0aW9uIHBhdGhzOlxuICAgKlxuICAgKiAtIEZpcnN0IHZhdWx0IHJlZ2lzdGVyZWQgdmlhIGNvbmZpZyBmaWxlIChubyBwcmlvciBgZW5hYmxlLXBsdWdpbi08aWQ+YCBlbnRyeSkuXG4gICAqIC0gU3Vic2VxdWVudCB2YXVsdCByZWdpc3RlcmVkIHdoaWxlIGFub3RoZXIgdmF1bHQgaXMgYWxyZWFkeSBvcGVuLiBUaGVcbiAgICogICBgZW5hYmxlLXBsdWdpbi08bmV3VmF1bHRJZD5gIHdyaXRlIGhhcHBlbnMgaW4gdGhlIGV4aXN0aW5nIHZhdWx0J3MgcmVuZGVyZXIsXG4gICAqICAgYnV0IHRoZSBuZXcgdmF1bHQncyByZW5kZXJlciBtYXkgcmVhZCBgbG9jYWxTdG9yYWdlYCBiZWZvcmUgdGhhdCBjcm9zcy1yZW5kZXJlclxuICAgKiAgIHdyaXRlIGJlY29tZXMgdmlzaWJsZSAocmFjZSBvYnNlcnZlZCBpbiBPYnNpZGlhbiAxLjEzLjApLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gZXZhbHVhdGUgaW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc21pc3NUcnVzdERpYWxvZyh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCB2YXVsdFBhdGgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoRElTTUlTU19UUlVTVF9ESUFMT0dfRVhQUiwgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgICBpZiAocmVzdWx0ID09PSAndHJ1ZScpIHtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIERpc21pc3NlZCBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yXCIgZGlhbG9nLicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGBlbmFibGUtcGx1Z2luLTx2YXVsdElkPmAgaW4gT2JzaWRpYW4ncyBsb2NhbFN0b3JhZ2UgdG8gcHJldmVudFxuICAgKiB0aGUgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvciBvZiB0aGlzIHZhdWx0P1wiIGRpYWxvZyBmcm9tIGFwcGVhcmluZ1xuICAgKiB3aGVuIGEgdmF1bHQgd2l0aCBjb21tdW5pdHkgcGx1Z2lucyBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgKlxuICAgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgYHZhdWx0LW9wZW5gIElQQyAoc28gdGhlIHZhdWx0IElEIGV4aXN0cyBpblxuICAgKiBgb2JzaWRpYW4uanNvbmApIGFuZCBiZWZvcmUgdGhlIG5ldyB2YXVsdCB3aW5kb3cgZmluaXNoZXMgbG9hZGluZy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqIEBwYXJhbSBldmFsVGFyZ2V0VmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gdXNlIGFzIGV2YWwgdGFyZ2V0IChhbiBleGlzdGluZywgbG9hZGVkIHZhdWx0KS5cbiAgICogICBsb2NhbFN0b3JhZ2UgaXMgc2hhcmVkIGFjcm9zcyBhbGwgT2JzaWRpYW4gd2luZG93cyAoc2FtZSBFbGVjdHJvbiBvcmlnaW4pLCBzbyB0aGVcbiAgICogICBgbG9jYWxTdG9yYWdlLnNldEl0ZW1gIGNhbGwgY2FuIHJ1biBpbiBhbnkgbG9hZGVkIHZhdWx0IHdpbmRvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5hYmxlUGx1Z2luc0luTG9jYWxTdG9yYWdlKHZhdWx0UGF0aDogc3RyaW5nLCBldmFsVGFyZ2V0VmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2YXVsdElkID0gZ2V0VmF1bHRJZCh2YXVsdFBhdGgpO1xuICAgIGlmICghdmF1bHRJZCkge1xuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gQ291bGQgbm90IGZpbmQgdmF1bHQgSUQgXHUyMDE0IHNraXBwaW5nIGxvY2FsU3RvcmFnZSB0cnVzdCBmbGFnLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCBldmFsVGFyZ2V0VmF1bHRQYXRoKTtcbiAgICBjb25zdCBlbmFibGVFeHByID0gYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLnNldExvY2FsU3RvcmFnZUl0ZW0oJHtKU09OLnN0cmluZ2lmeSh7IGtleTogYGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfWAsIHZhbHVlOiAndHJ1ZScgfSl9KWA7XG4gICAgYXdhaXQgdGhpcy5ldmFsdWF0ZShlbmFibGVFeHByLCB7IGN3ZDogZXZhbFRhcmdldFZhdWx0UGF0aCB9KTtcbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBTZXQgZW5hYmxlLXBsdWdpbi0ke3ZhdWx0SWR9IGluIGxvY2FsU3RvcmFnZS5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXVuY2hlcyBPYnNpZGlhbiBiaW5hcnkgYW5kIHJldHJpZXMgdGhlIGV2YWwgdW50aWwgaXQgcmVzcG9uZHMuXG4gICAqXG4gICAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIENMSSBjb21tYW5kIGFycmF5IHRvIHJldHJ5LlxuICAgKiBAcGFyYW0gY3dkIC0gVGhlIHdvcmtpbmcgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVPYnNpZGlhblJ1bm5pbmdBbmRSZXRyeShjb21tYW5kOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBPYnNpZGlhbiBpcyBub3QgcnVubmluZy4gU3RhcnRpbmcgT2JzaWRpYW4uLi4nKTtcblxuICAgIGNvbnN0IGxhdW5jaENvbW1hbmQgPSBhd2FpdCBnZXRPYnNpZGlhbkxhdW5jaENvbW1hbmQoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYyhsYXVuY2hDb21tYW5kLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBUaGUgbGF1bmNoIGNvbW1hbmQgbWF5IGZhaWwgb24gc29tZSBzeXN0ZW1zIFx1MjAxNCB3ZSdsbCBzdGlsbCB0cnkgcG9sbGluZy5cbiAgICB9XG5cbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBQb2xsaW5nIGZvciBPYnNpZGlhbiBDTEkgKHRpbWVvdXQ9JHtTdHJpbmcoQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBhd2FpdCBkZWxheShBVVRPX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGV4ZWMoY29tbWFuZCwgeyBjd2QsIGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIE9ic2lkaWFuIENMSSByZXNwb25kZWQuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIGlmICghbWVzc2FnZS5pbmNsdWRlcyhVTkFCTEVfVE9fRklORF9PQlNJRElBTikpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBPYnNpZGlhbiBub3QgcmVhZHkgeWV0LCByZXRyeWluZy4uLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgT2JzaWRpYW4gZGlkIG5vdCBzdGFydCB3aXRoaW4gJHtTdHJpbmcoQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcGF0aCBvZiBhbiBhbHJlYWR5LW9wZW4gdmF1bHQgdG8gdXNlIGFzIGFuIGBvYnNpZGlhbiBldmFsYFxuICAgKiB0YXJnZXQsIG9yIGB1bmRlZmluZWRgIGlmIHRoZXJlIGlzIG5vbmUuXG4gICAqXG4gICAqIFRoZSBgb3BlbmAgZmxhZyBpbiBgb2JzaWRpYW4uanNvbmAgaXMgb25seSB0cnVzdHdvcnRoeSB3aGlsZSBPYnNpZGlhbiBpc1xuICAgKiBydW5uaW5nIFx1MjAxNCBhIGtpbGxlZCBvciBjcmFzaGVkIHByb2Nlc3MgbmV2ZXIgcmVzZXRzIGl0LCBsZWF2aW5nIHRoZSB1c2VyJ3NcbiAgICogbGFzdC1zZXNzaW9uIHZhdWx0IG1hcmtlZCBvcGVuLiBBY3Rpbmcgb24gdGhhdCBzdGFsZSBmbGFnIHdvdWxkIHRhcmdldCB0aGVcbiAgICogKHBvc3NpYmx5IGhlYXZ5KSBsYXN0LXNlc3Npb24gdmF1bHQgYW5kIGNhdXNlIGF1dG8tc3RhcnQgdG8gcmVvcGVuIGl0LlxuICAgKiBXaGVuIE9ic2lkaWFuIGlzIG5vdCBydW5uaW5nIHdlIHRoZXJlZm9yZSByZXBvcnQgbm8gb3BlbiB2YXVsdCwgc28gY2FsbGVyc1xuICAgKiBmYWxsIGJhY2sgdG8gdGhlIGRpcmVjdC1jb25maWcgcGF0aCB0aGF0IG9wZW5zIG9ubHkgdGhlIHRlbXAgdmF1bHQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIGFuIG9wZW4gdmF1bHQsIG9yIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRPcGVuRXZhbFRhcmdldFZhdWx0UGF0aCgpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghYXdhaXQgaXNPYnNpZGlhblJ1bm5pbmcoKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0QW55T3BlblZhdWx0UGF0aCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEtpbGxzIHRoZSBydW5uaW5nIE9ic2lkaWFuIHByb2Nlc3MgKGlmIGFueSkgYW5kIHdhaXRzIGZvciBpdCB0byBleGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBraWxsT2JzaWRpYW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gS2lsbGluZyBPYnNpZGlhbiBwcm9jZXNzLi4uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWMoZ2V0S2lsbE9ic2lkaWFuQ29tbWFuZCgpLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBQcm9jZXNzIG1heSBub3QgYmUgcnVubmluZyBcdTIwMTQgdGhhdCdzIGZpbmUuXG4gICAgfVxuXG4gICAgYXdhaXQgZGVsYXkoVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xscyB1bnRpbCB0aGUgdmF1bHQgaXMgcmVhZHkgYW5kIHJlc3BvbmRpbmcgdG8gZXZhbCBjYWxscy5cbiAgICpcbiAgICogRWFjaCBgb2JzaWRpYW4gZXZhbGAgaW4gdGhlIGxvb3AgaXMgZ2l2ZW4gYSBwZXItY2FsbCB0aW1lb3V0LiBUaGUgb3ZlcmFsbFxuICAgKiBkZWFkbGluZSBpcyBvbmx5IHJlLWNoZWNrZWQgYmV0d2VlbiBhd2FpdHMsIHNvIHdpdGhvdXQgaXQgYSBzaW5nbGUgaHVuZ1xuICAgKiBldmFsIChlLmcuIGEgdmF1bHQgd2luZG93IHRoYXQgb3BlbmVkIGJ1dCBuZXZlciBmaW5pc2hlZCBsb2FkaW5nKSB3b3VsZFxuICAgKiBibG9jayBwYXN0IHRoZSBkZWFkbGluZSBmb3JldmVyIGluc3RlYWQgb2YgZmFpbGluZyBhbmQgcmV0cnlpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwb2xsVmF1bHRSZWFkeSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBvbGxFeHByID0gJ3dpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLnBvbGxWYXVsdEJhc2VQYXRoKCknO1xuXG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUG9sbGluZyBmb3IgdmF1bHQgcmVhZGluZXNzICh0aW1lb3V0PSR7U3RyaW5nKFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgbGV0IGlzQm9vdHN0cmFwcGVkID0gZmFsc2U7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFpc0Jvb3RzdHJhcHBlZCkge1xuICAgICAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCB2YXVsdFBhdGgsIFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgICAgIGlzQm9vdHN0cmFwcGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUocG9sbEV4cHIsIHsgY3dkOiB2YXVsdFBhdGgsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogVkFVTFRfRVZBTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9KTtcbiAgICAgICAgaWYgKEpTT04ucGFyc2UoYmFzZVBhdGgpID09PSB2YXVsdFBhdGgpIHtcbiAgICAgICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBWYXVsdCBpcyByZWFkeS4nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBWYXVsdCBub3QgcmVhZHkgeWV0IFx1MjAxNCBuYW1lc3BhY2UgbWF5IG5vdCBiZSBib290c3RyYXBwZWQgeWV0IGVpdGhlci5cbiAgICAgICAgaXNCb290c3RyYXBwZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGRlbGF5KFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBWYXVsdCBhdCAke3ZhdWx0UGF0aH0gZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zYCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdGFydHMgT2JzaWRpYW4gYnkga2lsbGluZyB0aGUgcnVubmluZyBwcm9jZXNzIGFuZCByZWxhdW5jaGluZyBpdC5cbiAgICpcbiAgICogVXNlZCB3aGVuIGEgY29uZmlnIGNoYW5nZSAobGlrZSBlbmFibGluZyBDTEkpIHJlcXVpcmVzIGEgcmVzdGFydCB0byB0YWtlIGVmZmVjdC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIHVzZSBmb3IgcG9sbGluZyBhZnRlciByZXN0YXJ0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXN0YXJ0T2JzaWRpYW4odmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmtpbGxPYnNpZGlhbigpO1xuXG4gICAgY29uc3QgcmVzdGFydFZhdWx0SWQgPSBnZXRWYXVsdElkKHZhdWx0UGF0aCk7XG4gICAgY29uc3QgY29tbWFuZCA9IFsnb2JzaWRpYW4nLCAuLi4ocmVzdGFydFZhdWx0SWQgPyBbYHZhdWx0PSR7cmVzdGFydFZhdWx0SWR9YF0gOiBbXSksICdldmFsJywgJ2NvZGU9XCIxXCInXTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZU9ic2lkaWFuUnVubmluZ0FuZFJldHJ5KGNvbW1hbmQsIHZhdWx0UGF0aCk7XG4gIH1cbn1cblxuLyoqXG4gKiBFdmFsdWF0ZXMgYW4gZXhwcmVzc2lvbiwgd3JpdGVzIHRoZSByZXN1bHQgdG8gYSBKU09OIGZpbGUuXG4gKlxuICogU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBleGVjdXRlZCBpbnNpZGUgdGhlIE9ic2lkaWFuIHByb2Nlc3MuXG4gKiBNdXN0IE5PVCByZWZlcmVuY2UgYW55IG91dGVyIHNjb3BlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgaW52b2NhdGlvbiBwYXJhbWV0ZXJzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW52b2tlQW5kV3JpdGVSZXN1bHQocGFyYW1zOiBJbnZva2VBbmRXcml0ZVJlc3VsdFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgLS0gd2luZG93LmFwcCBpcyBzZXQgYnkgT2JzaWRpYW4gYXQgcnVudGltZS5cbiAgY29uc3QgZnNQcm9taXNlcyA9IFJlZmxlY3QuZ2V0KHdpbmRvdy5hcHAudmF1bHQuYWRhcHRlciwgJ2ZzUHJvbWlzZXMnKSBhcyBJbnZva2VBbmRXcml0ZVJlc3VsdEZzUHJvbWlzZXM7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFyYW1zLmV2YWx1YXRlKCk7XG4gICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhd2FpdCBmc1Byb21pc2VzLndyaXRlRmlsZShwYXJhbXMucmVzdWx0UGF0aCwgSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAndW5kZWZpbmVkJywgdmFsdWU6ICcnIH0pKTtcbiAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgYXdhaXQgZnNQcm9taXNlcy53cml0ZUZpbGUocGFyYW1zLnJlc3VsdFBhdGgsIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ251bGwnLCB2YWx1ZTogJycgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWJhc2UtdG8tc3RyaW5nIC0tIEludGVudGlvbmFsOiByZXN1bHQgaXMgYW4gYXJiaXRyYXJ5IHZhbHVlIGZyb20gdGhlIGV2YWx1YXRlZCBleHByZXNzaW9uLlxuICAgICAgYXdhaXQgZnNQcm9taXNlcy53cml0ZUZpbGUocGFyYW1zLnJlc3VsdFBhdGgsIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IFN0cmluZyhyZXN1bHQpIH0pKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGF3YWl0IGZzUHJvbWlzZXMud3JpdGVGaWxlKHBhcmFtcy5yZXN1bHRQYXRoLCBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdlcnJvcicsIHZhbHVlOiBwYXJhbXMuc2VyaWFsaXplRXJyb3IoZXJyKSB9KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBkZXRhaWxlZCBkaWFnbm9zdGljIHN0cmluZyBmb3IgdGhlIFwiU2NyaXB0IGRpZCBub3QgZXhlY3V0ZVwiIGVycm9yLlxuICpcbiAqIFBlcmZvcm1zIGxpdmUgZW52aXJvbm1lbnQgY2hlY2tzIChwcm9jZXNzIGxpc3QsIHZhdWx0IHJlZ2lzdHJ5LCBDTEkgY29uZmlnKVxuICogYW5kIGluY2x1ZGVzIHRoZSBjb21tYW5kLCBleGVjIG91dHB1dCwgYW5kIHNjcmlwdCBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGlhZ25vc3RpYyBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgQSBmb3JtYXR0ZWQgZGlhZ25vc3RpYyBzdHJpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkRGlhZ25vc3RpY3MocGFyYW1zOiBCdWlsZERpYWdub3N0aWNzUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgbGluZXMucHVzaChgICBDb21tYW5kOiAke3BhcmFtcy5jb21tYW5kLmpvaW4oJyAnKX1gKTtcbiAgbGluZXMucHVzaChgICBXb3JraW5nIGRpcmVjdG9yeTogJHtwYXJhbXMuY3dkfWApO1xuICBsaW5lcy5wdXNoKGAgIFNjcmlwdCBwYXRoOiAke3BhcmFtcy5zY3JpcHRQYXRofWApO1xuICBsaW5lcy5wdXNoKGAgIEV4cGVjdGVkIHJlc3VsdCBmaWxlOiAke3BhcmFtcy5yZXN1bHRQYXRofWApO1xuXG4gIGlmIChwYXJhbXMuZXhlY1Jlc3VsdCkge1xuICAgIGxpbmVzLnB1c2goYCAgRXhpdCBjb2RlOiAke3BhcmFtcy5leGVjUmVzdWx0LmV4aXRDb2RlID09PSBudWxsID8gJyhudWxsIFx1MjAxNCBwcm9jZXNzIGRpZCBub3QgZXhpdCBub3JtYWxseSknIDogU3RyaW5nKHBhcmFtcy5leGVjUmVzdWx0LmV4aXRDb2RlKX1gKTtcbiAgICBpZiAocGFyYW1zLmV4ZWNSZXN1bHQuZXhpdFNpZ25hbCkge1xuICAgICAgbGluZXMucHVzaChgICBFeGl0IHNpZ25hbDogJHtwYXJhbXMuZXhlY1Jlc3VsdC5leGl0U2lnbmFsfWApO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmV4ZWNSZXN1bHQuc3Rkb3V0LnRyaW0oKSkge1xuICAgICAgbGluZXMucHVzaChgICBzdGRvdXQ6ICR7cGFyYW1zLmV4ZWNSZXN1bHQuc3Rkb3V0LnRyaW0oKX1gKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5leGVjUmVzdWx0LnN0ZGVyci50cmltKCkpIHtcbiAgICAgIGxpbmVzLnB1c2goYCAgc3RkZXJyOiAke3BhcmFtcy5leGVjUmVzdWx0LnN0ZGVyci50cmltKCl9YCk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLmV4ZWNSZXN1bHQuc3Rkb3V0LnRyaW0oKSAmJiAhcGFyYW1zLmV4ZWNSZXN1bHQuc3RkZXJyLnRyaW0oKSkge1xuICAgICAgbGluZXMucHVzaCgnICBzdGRvdXQvc3RkZXJyOiAoZW1wdHkpJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxpbmVzLnB1c2goJyAgZXhlYyByZXN1bHQ6IChub3QgYXZhaWxhYmxlIFx1MjAxNCBPYnNpZGlhbiB3YXMgYXV0by1zdGFydGVkIGFuZCByZXRyaWVkKScpO1xuICB9XG5cbiAgbGluZXMucHVzaCgnRW52aXJvbm1lbnQgY2hlY2tzOicpO1xuICBsaW5lcy5wdXNoKGAgIE9ic2lkaWFuIHJ1bm5pbmc6ICR7YXdhaXQgaXNPYnNpZGlhblJ1bm5pbmcoKSA/ICd5ZXMnIDogJ05PJ31gKTtcbiAgbGluZXMucHVzaChgICBDTEkgZW5hYmxlZCBpbiBvYnNpZGlhbi5qc29uOiAke2lzQ2xpRW5hYmxlZCgpID8gJ3llcycgOiAnTk8nfWApO1xuICBsaW5lcy5wdXNoKGAgIFZhdWx0IHJlZ2lzdGVyZWQ6ICR7aXNWYXVsdFJlZ2lzdGVyZWQocGFyYW1zLmN3ZCkgPyAneWVzJyA6ICdOTyd9YCk7XG4gIGxpbmVzLnB1c2goYCAgU2NyaXB0IGZpbGUgZXhpc3RzOiAke2V4aXN0c1N5bmMocGFyYW1zLnNjcmlwdFBhdGgpID8gJ3llcycgOiAnbm8gKGFscmVhZHkgY2xlYW5lZCB1cCknfWApO1xuICBsaW5lcy5wdXNoKGAgIFJlc3VsdCBmaWxlIGV4aXN0czogJHtleGlzdHNTeW5jKHBhcmFtcy5yZXN1bHRQYXRoKSA/ICd5ZXMnIDogJ25vJ31gKTtcblxuICBjb25zdCByZWdpc3RlcmVkVmF1bHRzID0gZ2V0UmVnaXN0ZXJlZFZhdWx0cygpO1xuICBpZiAocmVnaXN0ZXJlZFZhdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICBsaW5lcy5wdXNoKCcgIFJlZ2lzdGVyZWQgdmF1bHRzOiAobm9uZSknKTtcbiAgfSBlbHNlIHtcbiAgICBsaW5lcy5wdXNoKCcgIFJlZ2lzdGVyZWQgdmF1bHRzOicpO1xuICAgIGZvciAoY29uc3QgdmF1bHQgb2YgcmVnaXN0ZXJlZFZhdWx0cykge1xuICAgICAgbGluZXMucHVzaChgICAgIC0gJHt2YXVsdC5wYXRofSAob3BlbjogJHtTdHJpbmcodmF1bHQub3Blbil9KWApO1xuICAgIH1cbiAgfVxuXG4gIGxpbmVzLnB1c2goYCAgU2NyaXB0IGNvbnRlbnQ6XFxuJHtwYXJhbXMuc2NyaXB0Q29udGVudH1gKTtcblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjb250ZW50IG9mIGEgdGVtcG9yYXJ5IHNjcmlwdCBmaWxlLlxuICpcbiAqIFNlcmlhbGl6ZXMge0BsaW5rIGludm9rZUFuZFdyaXRlUmVzdWx0fSBpbnRvIGEgc2VsZi1jb250YWluZWQgSUlGRSB0aGF0XG4gKiBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24sIHdyaXRlcyB0aGUgcmVzdWx0IChvciBlcnJvcikgdG8gYHJlc3VsdFBhdGhgLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIC0gVGhlIEphdmFTY3JpcHQgZXhwcmVzc2lvbiB0byBldmFsdWF0ZS5cbiAqIEBwYXJhbSByZXN1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHJlc3VsdCBmaWxlLlxuICogQHJldHVybnMgVGhlIHNjcmlwdCBmaWxlIGNvbnRlbnQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkU2NyaXB0RmlsZShleHByZXNzaW9uOiBzdHJpbmcsIHJlc3VsdFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGZuU3RyID0gZ2V0RnVuY3Rpb25FeHByZXNzaW9uU3RyaW5nKGludm9rZUFuZFdyaXRlUmVzdWx0KTtcbiAgY29uc3Qgc2VyaWFsaXplRXJyb3JTdHIgPSBnZXRGdW5jdGlvbkV4cHJlc3Npb25TdHJpbmcoc2VyaWFsaXplRXJyb3IpO1xuICBjb25zdCByZXN1bHRQYXRoSnNvbiA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdFBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpKTtcbiAgcmV0dXJuIGAoJHtmblN0cn0pKHsgZXZhbHVhdGU6IGFzeW5jICgpID0+ICgke2V4cHJlc3Npb259KSwgcmVzdWx0UGF0aDogJHtyZXN1bHRQYXRoSnNvbn0sIHNlcmlhbGl6ZUVycm9yOiAke3NlcmlhbGl6ZUVycm9yU3RyfSB9KWA7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZ2l2ZW4gZGVsYXkuXG4gKlxuICogQHBhcmFtIG1zIC0gVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBkZWxheS5cbiAqL1xuZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVhZHMgYSBzY3JpcHQgZmlsZSBmcm9tIGRpc2ssIGxvZ3MgaXRzIGNvbnRlbnQsIGFuZCBleGVjdXRlcyBpdCB2aWEgYG5ldyBGdW5jdGlvbmAuXG4gKlxuICogU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBleGVjdXRlZCBpbnNpZGUgdGhlIE9ic2lkaWFuIHByb2Nlc3MuXG4gKiBNdXN0IE5PVCByZWZlcmVuY2UgYW55IG91dGVyIHNjb3BlLlxuICpcbiAqIEBwYXJhbSBzY3JpcHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHNjcmlwdCBmaWxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlU2NyaXB0RmlsZShzY3JpcHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkIC0tIHdpbmRvdy5hcHAgaXMgc2V0IGJ5IE9ic2lkaWFuIGF0IHJ1bnRpbWUuXG4gIGNvbnN0IGZzUHJvbWlzZXMgPSBSZWZsZWN0LmdldCh3aW5kb3cuYXBwLnZhdWx0LmFkYXB0ZXIsICdmc1Byb21pc2VzJykgYXMgRXhlY3V0ZVNjcmlwdEZpbGVGc1Byb21pc2VzO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgZnNQcm9taXNlcy5hY2Nlc3Moc2NyaXB0UGF0aCk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTY3JpcHQgZmlsZSBub3QgZm91bmQ6ICR7c2NyaXB0UGF0aH1gLCB7IGNhdXNlIH0pO1xuICB9XG5cbiAgY29uc3Qgc2NyaXB0ID0gYXdhaXQgZnNQcm9taXNlcy5yZWFkRmlsZShzY3JpcHRQYXRoLCAndXRmLTgnKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGUgLS0gRGlhZ25vc3RpYyBsb2dnaW5nIGluc2lkZSBPYnNpZGlhbiBwcm9jZXNzOyBubyBsb2dnZXIgYXZhaWxhYmxlLlxuICBjb25zb2xlLmRlYnVnKGBFeGVjdXRpbmcgJHtzY3JpcHRQYXRofTpcXG4ke3NjcmlwdH1gKTtcblxuICBsZXQgZm46ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbXBsaWVkLWV2YWwsIG5vLW5ldy1mdW5jIC0tIFRoZSBzY3JpcHQgaXMgYSB0cnVzdGVkLCBzZWxmLWdlbmVyYXRlZCBJSUZFIGV4cHJlc3Npb24uXG4gICAgZm4gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAke3NjcmlwdH1gKSBhcyAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB9IGNhdGNoIChjYXVzZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgcGFyc2luZyAke3NjcmlwdFBhdGh9YCwgeyBjYXVzZSB9KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGV4ZWN1dGluZyAke3NjcmlwdFBhdGh9YCwgeyBjYXVzZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGNvbW1hbmQgdG8ga2lsbCB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgc2hlbGwgY29tbWFuZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGdldEtpbGxPYnNpZGlhbkNvbW1hbmQoKTogc3RyaW5nIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICByZXR1cm4gJ3Rhc2traWxsIC9JTSBPYnNpZGlhbi5leGUgL0YnO1xuICB9XG5cbiAgcmV0dXJuICdwa2lsbCAtZiBPYnNpZGlhbic7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgY29tbWFuZCB0byBsYXVuY2ggdGhlIE9ic2lkaWFuIGJpbmFyeS5cbiAqXG4gKiBSZXNvbHZlcyB0aGUgYWN0dWFsIGluc3RhbGxlZCBPYnNpZGlhbiBleGVjdXRhYmxlIChjb3ZlcmluZyBpbnN0YWxsZXItYmFzZWRcbiAqIGFuZCBgUEFUSGAtYmFzZWQgaW5zdGFsbHMgc3VjaCBhcyBgc2Nvb3BgKSBhbmQgdmVyaWZpZXMgaXQgZXhpc3RzIGJlZm9yZVxuICogcmV0dXJuaW5nIGEgY29tbWFuZC4gVGhyb3dzIGlmIE9ic2lkaWFuIGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHJldHVybnMgVGhlIHNoZWxsIGNvbW1hbmQgc3RyaW5nLlxuICogQHRocm93cyBFcnJvciBpZiBPYnNpZGlhbiBjYW5ub3QgYmUgbG9jYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0T2JzaWRpYW5MYXVuY2hDb21tYW5kKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGV4ZVBhdGggPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlKCk7XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICByZXR1cm4gYHN0YXJ0IFwiXCIgXCIke2V4ZVBhdGh9XCJgO1xuICB9XG5cbiAgcmV0dXJuIGBcIiR7ZXhlUGF0aH1cIiAmYDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBjb21tYW5kIHRvIG9wZW4gYSBVUkkuXG4gKlxuICogQHBhcmFtIHVyaSAtIFRoZSBVUkkgdG8gb3Blbi5cbiAqIEByZXR1cm5zIFRoZSBzaGVsbCBjb21tYW5kIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZ2V0T3BlblVyaUNvbW1hbmQodXJpOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHJldHVybiBgc3RhcnQgXCJcIiBcIiR7dXJpfVwiYDtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgIHJldHVybiBgb3BlbiBcIiR7dXJpfVwiYDtcbiAgfVxuXG4gIHJldHVybiBgeGRnLW9wZW4gXCIke3VyaX1cImA7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIE9ic2lkaWFuIHByb2Nlc3MgaXMgY3VycmVudGx5IHJ1bm5pbmcuXG4gKlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBPYnNpZGlhbiBwcm9jZXNzIGlzIGZvdW5kLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNPYnNpZGlhblJ1bm5pbmcoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGNvbW1hbmQgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInXG4gICAgPyAndGFza2xpc3QgL0ZJIFwiSU1BR0VOQU1FIGVxIE9ic2lkaWFuLmV4ZVwiIC9OSCdcbiAgICA6ICdwZ3JlcCAtZiBPYnNpZGlhbic7XG4gIHRyeSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZXhlYyhjb21tYW5kLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgIHJldHVybiBvdXRwdXQuaW5jbHVkZXMoJ09ic2lkaWFuLmV4ZScpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0LnRyaW0oKS5sZW5ndGggPiAwO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBPcGVucyBhIHZhdWx0IGluIE9ic2lkaWFuIHVzaW5nIHRoZSBgb2JzaWRpYW46Ly9vcGVuYCBVUkkgcHJvdG9jb2wuXG4gKlxuICogVGhpcyB3b3JrcyB3aGV0aGVyIE9ic2lkaWFuIGlzIGFscmVhZHkgcnVubmluZyAoc2lnbmFscyBpdCB0byBvcGVuIHRoZSB2YXVsdClcbiAqIG9yIG5vdCAobGF1bmNoZXMgT2JzaWRpYW4gd2l0aCB0aGUgdmF1bHQpLiBUaGUgVVJJIHByb3RvY29sIGlzIGhhbmRsZWQgYnkgdGhlXG4gKiBPUywgd2hpY2ggcm91dGVzIGl0IHRvIHRoZSByZWdpc3RlcmVkIE9ic2lkaWFuIGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9wZW5WYXVsdFZpYVVyaSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB2YXVsdElkID0gZ2V0VmF1bHRJZCh2YXVsdFBhdGgpO1xuICBpZiAoIXZhdWx0SWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBvcGVuIHZhdWx0IHZpYSBVUkk6IHZhdWx0IGlzIG5vdCByZWdpc3RlcmVkIGluIG9ic2lkaWFuLmpzb246ICR7dmF1bHRQYXRofWApO1xuICB9XG4gIGNvbnN0IHVyaSA9IGBvYnNpZGlhbjovL29wZW4/dmF1bHQ9JHtlbmNvZGVVUklDb21wb25lbnQodmF1bHRJZCl9YDtcbiAgY29uc3QgY29tbWFuZCA9IGdldE9wZW5VcmlDb21tYW5kKHVyaSk7XG4gIGxvZyhgW2NsaS10cmFuc3BvcnRdIE9wZW5pbmcgdmF1bHQgdmlhIFVSSTogJHt1cml9YCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlYyhjb21tYW5kLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVVJJIG9wZW4gZmFpbGVkIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBU0EsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QixTQUFTLFlBQVk7QUFDckIsT0FBTyxhQUFhO0FBUXBCLFNBQVMsaUNBQWlDO0FBQzFDLFNBQVMsWUFBWTtBQUNyQixTQUFTLG1DQUFtQztBQUM1QyxTQUFTLFdBQVc7QUFDcEIsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyxZQUFZO0FBQ3JCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsaUNBQWlDO0FBQzFDLFNBQVMsc0JBQXNCO0FBNkIvQixNQUFNLDBCQUEwQjtBQUNoQyxNQUFNLDJDQUEyQztBQUNqRCxNQUFNLHFDQUFxQztBQUMzQyxNQUFNLHNDQUFzQztBQUM1QyxNQUFNLHFDQUFxQztBQUMzQyxNQUFNLG9DQUFvQztBQUMxQyxNQUFNLHFDQUFxQztBQWVwQyxNQUFNLG9CQUFpRDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSTVDLFdBQVc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWlCM0IsTUFBYSxTQUFTLFlBQW9CLFNBQWdEO0FBQ3hGLFVBQU0sY0FBYztBQUNwQixVQUFNLFdBQVcsT0FBTyxLQUFLLE9BQU8sQ0FBQyxFQUFFLE1BQU0sV0FBVztBQUN4RCxVQUFNLFlBQVksS0FBSyxPQUFPLEdBQUcsOEJBQThCO0FBQy9ELFVBQU0sYUFBYSxLQUFLLFdBQVcs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
|
|
520
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0xJIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBgb2JzaWRpYW4gZXZhbGAgYW5kIG1hbmFnZXNcbiAqIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgdW5saW5rLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBFeGVjUmVzdWx0IH0gZnJvbSAnLi9leGVjLm1qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQgeyBESVNNSVNTX1RSVVNUX0RJQUxPR19FWFBSIH0gZnJvbSAnLi9kaXNtaXNzLXRydXN0LWRpYWxvZy5tanMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5tanMnO1xuaW1wb3J0IHsgZ2V0RnVuY3Rpb25FeHByZXNzaW9uU3RyaW5nIH0gZnJvbSAnLi9mdW5jdGlvbi1leHByZXNzaW9uLm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuaW1wb3J0IHsgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkIH0gZnJvbSAnLi9uYW1lc3BhY2UtYm9vdHN0cmFwLm1qcyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi9ub29wLm1qcyc7XG5pbXBvcnQge1xuICBlbmFibGVDbGlJbkNvbmZpZyxcbiAgZ2V0QW55T3BlblZhdWx0UGF0aCxcbiAgZ2V0UmVnaXN0ZXJlZFZhdWx0cyxcbiAgZ2V0VmF1bHRJZCxcbiAgaXNDbGlFbmFibGVkLFxuICBpc1ZhdWx0T3BlbixcbiAgaXNWYXVsdFJlZ2lzdGVyZWQsXG4gIHJlZ2lzdGVyVmF1bHRJbkNvbmZpZyxcbiAgcmVtb3ZlVmF1bHRGcm9tQ29uZmlnXG59IGZyb20gJy4vb2JzaWRpYW4tY29uZmlnLm1qcyc7XG5pbXBvcnQgeyByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlIH0gZnJvbSAnLi9vYnNpZGlhbi1leGVjdXRhYmxlLm1qcyc7XG5pbXBvcnQgeyBzZXJpYWxpemVFcnJvciB9IGZyb20gJy4vc2VyaWFsaXplLWVycm9yLm1qcyc7XG5cbmludGVyZmFjZSBFeGVjdXRlU2NyaXB0RmlsZUZzUHJvbWlzZXMge1xuICBhY2Nlc3MocGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgcmVhZEZpbGUocGF0aDogc3RyaW5nLCBlbmNvZGluZzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xufVxuXG5pbnRlcmZhY2UgSW52b2tlQW5kV3JpdGVSZXN1bHRGc1Byb21pc2VzIHtcbiAgd3JpdGVGaWxlKHBhdGg6IHN0cmluZywgZGF0YTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuaW50ZXJmYWNlIEludm9rZUFuZFdyaXRlUmVzdWx0UGFyYW1zIHtcbiAgZXZhbHVhdGUoKTogUHJvbWlzZTx1bmtub3duPjtcbiAgcmVhZG9ubHkgcmVzdWx0UGF0aDogc3RyaW5nO1xuICBzZXJpYWxpemVFcnJvcihlcnJvcjogdW5rbm93bik6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFNjcmlwdEVycm9yRW52ZWxvcGUge1xuICB0eXBlOiAnZXJyb3InIHwgJ251bGwnIHwgJ3VuZGVmaW5lZCc7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGlzY3JpbWluYXRlZCBlbnZlbG9wZSB3cml0dGVuIGJ5IHRoZSB0ZW1wb3Jhcnkgc2NyaXB0IGZpbGUuXG4gKlxuICogLSBgU2NyaXB0RXJyb3JFbnZlbG9wZWAgd2l0aCBgdHlwZTogJ2Vycm9yJ2AgXHUyMDE0IHRoZSBleHByZXNzaW9uIHRocmV3OyBgdmFsdWVgIGlzIHRoZSBlcnJvciBtZXNzYWdlLlxuICogLSBgU2NyaXB0RXJyb3JFbnZlbG9wZWAgd2l0aCBgdHlwZTogJ251bGwnYCBcdTIwMTQgdGhlIGV4cHJlc3Npb24gcmV0dXJuZWQgYG51bGxgLlxuICogLSBgU2NyaXB0RXJyb3JFbnZlbG9wZWAgd2l0aCBgdHlwZTogJ3VuZGVmaW5lZCdgIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBgdW5kZWZpbmVkYC5cbiAqIC0gYFNjcmlwdFZhbHVlRW52ZWxvcGVgIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBhIHN0cmluZyB2YWx1ZSAobm8gYHR5cGVgIGZpZWxkKS5cbiAqL1xudHlwZSBTY3JpcHRSZXN1bHRFbnZlbG9wZSA9XG4gIHwgU2NyaXB0RXJyb3JFbnZlbG9wZVxuICB8IFNjcmlwdFZhbHVlRW52ZWxvcGU7XG5cbmludGVyZmFjZSBTY3JpcHRWYWx1ZUVudmVsb3BlIHtcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuY29uc3QgVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4gPSAndW5hYmxlIHRvIGZpbmQgT2JzaWRpYW4nO1xuY29uc3QgQVVUT19TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwMDA7XG5jb25zdCBWQVVMVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IFZBVUxUX0NMT1NFX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDEwMDA7XG5jb25zdCBWQVVMVF9FVkFMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTAwMDA7XG5cbmludGVyZmFjZSBCdWlsZERpYWdub3N0aWNzUGFyYW1zIHtcbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nW107XG4gIHJlYWRvbmx5IGN3ZDogc3RyaW5nO1xuICByZWFkb25seSBleGVjUmVzdWx0OiBFeGVjUmVzdWx0IHwgdW5kZWZpbmVkO1xuICByZWFkb25seSByZXN1bHRQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNjcmlwdENvbnRlbnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2NyaXB0UGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRyYW5zcG9ydCB0aGF0IGNvbW11bmljYXRlcyB3aXRoIERlc2t0b3AgT2JzaWRpYW4gdmlhIHRoZSBgb2JzaWRpYW4gZXZhbGAgQ0xJIGNvbW1hbmRcbiAqIGFuZCBtYW5hZ2VzIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICovXG5leHBvcnQgY2xhc3MgRGVza3RvcENsaVRyYW5zcG9ydCBpbXBsZW1lbnRzIE9ic2lkaWFuVHJhbnNwb3J0IHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIGZvciBhIG1vYmlsZSBwbGF0Zm9ybS4gQWx3YXlzIGBmYWxzZWAgZm9yIHRoaXMgdHJhbnNwb3J0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlzTW9iaWxlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIEphdmFTY3JpcHQgZXhwcmVzc2lvbiBpbnNpZGUgT2JzaWRpYW4gdmlhIGBvYnNpZGlhbiBldmFsYC5cbiAgICpcbiAgICogV3JpdGVzIHRoZSBleHByZXNzaW9uIHRvIGEgdGVtcG9yYXJ5IGAuY2pzYCBmaWxlIGFuZCBleGVjdXRlcyBhIHRpbnlcbiAgICogYHJlcXVpcmUoKS5pbnZva2UoKWAgY2FsbCB2aWEgdGhlIENMSS4gVGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvIGFcbiAgICogYC5yZXN1bHQuanNvbmAgZmlsZSBieSB0aGUgc2NyaXB0LCBhdm9pZGluZyBDTEkgc3Rkb3V0IHNpemUgbGltaXRzXG4gICAqIGFuZCBJUEMgYnVmZmVyIGlzc3Vlcy5cbiAgICpcbiAgICogSGFuZGxlcyBhdXRvLXN0YXJ0OiBpZiBPYnNpZGlhbiBpcyBub3QgcnVubmluZywgbGF1bmNoZXMgaXQgdmlhIFVSSSBwcm90b2NvbFxuICAgKiBhbmQgcmV0cmllcyB1bnRpbCBpdCBiZWNvbWVzIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHBhcmFtIGV4cHJlc3Npb24gLSBUaGUgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEV2YWx1YXRpb24gb3B0aW9ucy5cbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgcmVzdWx0IHN0cmluZyAodHJhbnNwb3J0LXNwZWNpZmljIHByZWZpeGVzIHN0cmlwcGVkKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBldmFsdWF0ZShleHByZXNzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IFRyYW5zcG9ydEV2YWxPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBTTElDRV9TVEFSVCA9IDI7XG4gICAgY29uc3Qgc2NyaXB0SWQgPSBTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoU0xJQ0VfU1RBUlQpO1xuICAgIGNvbnN0IHNjcmlwdERpciA9IGpvaW4odG1wZGlyKCksICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJyk7XG4gICAgY29uc3Qgc2NyaXB0UGF0aCA9IGpvaW4oc2NyaXB0RGlyLCBgJHtzY3JpcHRJZH0uanNgKTtcbiAgICBjb25zdCByZXN1bHRQYXRoID0gam9pbihzY3JpcHREaXIsIGAke3NjcmlwdElkfS5yZXN1bHQuanNvbmApO1xuXG4gICAgYXdhaXQgbWtkaXIoc2NyaXB0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHNjcmlwdENvbnRlbnQgPSBidWlsZFNjcmlwdEZpbGUoZXhwcmVzc2lvbiwgcmVzdWx0UGF0aCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHNjcmlwdFBhdGgsIHNjcmlwdENvbnRlbnQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhZmVTY3JpcHRQYXRoID0gc2NyaXB0UGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICBjb25zdCBjbGlFeHByID0gYCgke2dldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyhleGVjdXRlU2NyaXB0RmlsZSl9KSgke0pTT04uc3RyaW5naWZ5KHNhZmVTY3JpcHRQYXRoKX0pYDtcbiAgICAgIGNvbnN0IHZhdWx0SWQgPSBnZXRWYXVsdElkKG9wdGlvbnMuY3dkKTtcbiAgICAgIGNvbnN0IGNvbW1hbmQgPSBbJ29ic2lkaWFuJywgLi4uKHZhdWx0SWQgPyBbYHZhdWx0PSR7dmF1bHRJZH1gXSA6IFtdKSwgJ2V2YWwnLCAnLS1hbGxvdy1mb2N1cy1zdGVhbCcsIGBjb2RlPSR7Y2xpRXhwcn1gXTtcblxuICAgICAgbGV0IGV4ZWNSZXN1bHQ6IEV4ZWNSZXN1bHQgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBleGVjUmVzdWx0ID0gYXdhaXQgZXhlYyhjb21tYW5kLCB7XG4gICAgICAgICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICAgICAgICBpc1F1aWV0OiB0cnVlLFxuICAgICAgICAgIHNob3VsZEluY2x1ZGVEZXRhaWxzOiB0cnVlLFxuICAgICAgICAgIC4uLihvcHRpb25zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFVOQUJMRV9UT19GSU5EX09CU0lESUFOKSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlT2JzaWRpYW5SdW5uaW5nQW5kUmV0cnkoY29tbWFuZCwgb3B0aW9ucy5jd2QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghZXhpc3RzU3luYyhyZXN1bHRQYXRoKSkge1xuICAgICAgICBjb25zdCBkaWFnbm9zdGljcyA9IGF3YWl0IGJ1aWxkRGlhZ25vc3RpY3Moe1xuICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICAgICAgICBleGVjUmVzdWx0LFxuICAgICAgICAgIHJlc3VsdFBhdGgsXG4gICAgICAgICAgc2NyaXB0Q29udGVudCxcbiAgICAgICAgICBzY3JpcHRQYXRoXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNjcmlwdCBkaWQgbm90IGV4ZWN1dGUgZm9yIHBhdGg6ICR7b3B0aW9ucy5jd2R9XFxuJHtkaWFnbm9zdGljc31gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0U3RyID0gYXdhaXQgcmVhZEZpbGUocmVzdWx0UGF0aCwgJ3V0Zi04Jyk7XG4gICAgICBjb25zdCBlbnZlbG9wZSA9IEpTT04ucGFyc2UocmVzdWx0U3RyKSBhcyBTY3JpcHRSZXN1bHRFbnZlbG9wZTtcblxuICAgICAgaWYgKCd0eXBlJyBpbiBlbnZlbG9wZSkge1xuICAgICAgICBpZiAoZW52ZWxvcGUudHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2NyaXB0IGVycm9yIGluIE9ic2lkaWFuIGZvciBwYXRoOiAke29wdGlvbnMuY3dkfTogJHtlbnZlbG9wZS52YWx1ZX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbnZlbG9wZS52YWx1ZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdW5saW5rKHNjcmlwdFBhdGgpLmNhdGNoKG5vb3ApO1xuICAgICAgYXdhaXQgdW5saW5rKHJlc3VsdFBhdGgpLmNhdGNoKG5vb3ApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIENMSS1zcGVjaWZpYyBwcmVmbGlnaHQgY2hlY2tzLlxuICAgKlxuICAgKiBWZXJpZmllcyB0aGF0IHRoZSB2YXVsdCBpcyByZWdpc3RlcmVkLCBDTEkgaXMgZW5hYmxlZCBpbiBPYnNpZGlhbiBzZXR0aW5ncyxcbiAgICogYW5kIHRoZSBgb2JzaWRpYW5gIENMSSBiaW5hcnkgaXMgYXZhaWxhYmxlIGluIFBBVEguIElmIHRoZSB2YXVsdCBpcyByZWdpc3RlcmVkXG4gICAqIGJ1dCBub3Qgb3Blbiwgb3BlbnMgaXQgdmlhIFVSSSBwcm90b2NvbCBhbmQgcG9sbHMgdW50aWwgaXQgaXMgcmVhZHkuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZWZsaWdodENoZWNrKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUnVubmluZyBwcmVmbGlnaHQgY2hlY2sgZm9yIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICBpZiAoIWlzVmF1bHRSZWdpc3RlcmVkKHZhdWx0UGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFZhdWx0IGlzIG5vdCByZWdpc3RlcmVkIGluIE9ic2lkaWFuOiAke3ZhdWx0UGF0aH0uIFJlZ2lzdGVyIHRoZSB2YXVsdCBmaXJzdCB3aXRoIHJlZ2lzdGVyVmF1bHQoKSBvciBUZW1wVmF1bHQucmVnaXN0ZXIoKS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghaXNDbGlFbmFibGVkKCkpIHtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIENMSSBpcyBkaXNhYmxlZCBpbiBvYnNpZGlhbi5qc29uLiBFbmFibGluZyBhbmQgcmVzdGFydGluZyBPYnNpZGlhbi4uLicpO1xuICAgICAgZW5hYmxlQ2xpSW5Db25maWcoKTtcbiAgICAgIGF3YWl0IHRoaXMucmVzdGFydE9ic2lkaWFuKHZhdWx0UGF0aCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5hc3NlcnRDbGlBdmFpbGFibGUoKTtcblxuICAgIGlmICghaXNWYXVsdE9wZW4odmF1bHRQYXRoKSkge1xuICAgICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVmF1bHQgaXMgcmVnaXN0ZXJlZCBidXQgbm90IG9wZW46ICR7dmF1bHRQYXRofS4gT3BlbmluZyB2aWEgVVJJLi4uYCk7XG4gICAgICBhd2FpdCBvcGVuVmF1bHRWaWFVcmkodmF1bHRQYXRoKTtcbiAgICAgIGF3YWl0IHRoaXMucG9sbFZhdWx0UmVhZHkodmF1bHRQYXRoKTtcbiAgICB9XG5cbiAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBQcmVmbGlnaHQgY2hlY2sgcGFzc2VkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHZhdWx0IGluIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHZpYSBFbGVjdHJvbiBJUEMuXG4gICAqXG4gICAqIFVzZXMgYHZhdWx0LW9wZW5gIElQQyB0byByZWdpc3RlciBhbmQgb3BlbiB0aGUgdmF1bHQsIHRoZW4gcG9sbHMgdW50aWxcbiAgICogdGhlIHZhdWx0J3MgQ0xJIGlzIHJlYWR5IGFuZCBgZ2V0QmFzZVBhdGgoKWAgbWF0Y2hlcyBgdmF1bHRQYXRoYC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFJlZ2lzdGVyaW5nIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICBjb25zdCBvcGVuVmF1bHRQYXRoID0gYXdhaXQgdGhpcy5nZXRPcGVuRXZhbFRhcmdldFZhdWx0UGF0aCgpO1xuXG4gICAgaWYgKG9wZW5WYXVsdFBhdGgpIHtcbiAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCBvcGVuVmF1bHRQYXRoKTtcbiAgICAgIGNvbnN0IHJlZ2lzdGVyRXhwciA9IGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5pcGNTZW5kU3luYygke0pTT04uc3RyaW5naWZ5KHsgYXJnczogW3ZhdWx0UGF0aCwgZmFsc2VdLCBjaGFubmVsOiAndmF1bHQtb3BlbicgfSl9KWA7XG4gICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKHJlZ2lzdGVyRXhwciwgeyBjd2Q6IG9wZW5WYXVsdFBhdGggfSk7XG4gICAgICBhd2FpdCB0aGlzLmVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZSh2YXVsdFBhdGgsIG9wZW5WYXVsdFBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBObyBvcGVuIHZhdWx0IHRvIHRhcmdldC4gV3JpdGluZyB2YXVsdCBlbnRyeSBkaXJlY3RseSB0byBvYnNpZGlhbi5qc29uLi4uJyk7XG4gICAgICByZWdpc3RlclZhdWx0SW5Db25maWcodmF1bHRQYXRoKTtcbiAgICAgIC8qXG4gICAgICAgKiBBIHJ1bm5pbmcgT2JzaWRpYW4gd2l0aCBubyBvcGVuIHZhdWx0IChlLmcuIHNpdHRpbmcgb24gdGhlIHZhdWx0XG4gICAgICAgKiBzd2l0Y2hlcikgbG9hZGVkIGl0cyByZWdpc3RyeSBhdCBzdGFydHVwIGFuZCB3b24ndCBzZWUgdGhlIGVudHJ5IGp1c3RcbiAgICAgICAqIHdyaXR0ZW4sIHNvIGFuIGBvYnNpZGlhbjovL29wZW5gIFVSSSBmb3IgaXQgZmFpbHMgd2l0aCBcIlZhdWx0IG5vdFxuICAgICAgICogZm91bmRcIi4gS2lsbCBpdCBmaXJzdCBzbyB0aGUgVVJJIGJlbG93IHRyaWdnZXJzIGEgZnJlc2ggbGF1bmNoIHRoYXRcbiAgICAgICAqIHJlYWRzIHRoZSB1cGRhdGVkIG9ic2lkaWFuLmpzb24uIFdlIG9ubHkgcmVhY2ggdGhpcyBicmFuY2ggd2l0aCBub1xuICAgICAgICogdmF1bHQgb3Blbiwgc28gbm90aGluZyB0aGUgdXNlciBpcyB3b3JraW5nIGluIGlzIGxvc3QuXG4gICAgICAgKi9cbiAgICAgIGlmIChhd2FpdCBpc09ic2lkaWFuUnVubmluZygpKSB7XG4gICAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIE9ic2lkaWFuIGlzIHJ1bm5pbmcgd2l0aG91dCBhbiBvcGVuIHZhdWx0IFx1MjAxNCByZXN0YXJ0aW5nIHNvIGl0IHJlYWRzIHRoZSBuZXcgcmVnaXN0cnkgZW50cnkuLi4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5raWxsT2JzaWRpYW4oKTtcbiAgICAgIH1cbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFZhdWx0IGVudHJ5IHdyaXR0ZW4uIE9wZW5pbmcgdmF1bHQgdmlhIFVSSSBwcm90b2NvbC4uLicpO1xuICAgICAgYXdhaXQgb3BlblZhdWx0VmlhVXJpKHZhdWx0UGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLnBvbGxWYXVsdFJlYWR5KHZhdWx0UGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLmVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZSh2YXVsdFBhdGgsIHZhdWx0UGF0aCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5wb2xsVmF1bHRSZWFkeSh2YXVsdFBhdGgpO1xuICAgIGF3YWl0IHRoaXMuZGlzbWlzc1RydXN0RGlhbG9nKHZhdWx0UGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSB2YXVsdCBmcm9tIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlLlxuICAgKlxuICAgKiBTY2hlZHVsZXMgdGhlIHZhdWx0IHdpbmRvdyB0byBjbG9zZSwgd2FpdHMsIHRoZW4gcmVtb3ZlcyB0aGUgdmF1bHRcbiAgICogZnJvbSB0aGUgcmVnaXN0cnkgdmlhIGB2YXVsdC1yZW1vdmVgIElQQy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVW5yZWdpc3RlcmluZyB2YXVsdDogY2xvc2luZyB3aW5kb3cgZm9yICR7dmF1bHRQYXRofS4uLmApO1xuICAgIGlmIChpc1ZhdWx0T3Blbih2YXVsdFBhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgdmF1bHRQYXRoKTtcbiAgICAgICAgY29uc3QgZGVzdHJveUV4cHIgPSAnd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuZGVzdHJveUN1cnJlbnRXaW5kb3coKSc7XG4gICAgICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUoZGVzdHJveUV4cHIsIHsgY3dkOiB2YXVsdFBhdGgsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogVkFVTFRfRVZBTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9KTtcbiAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gV2luZG93IGRlc3Ryb3kgY29tbWFuZCBzZW50LicpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gV2luZG93IGRlc3Ryb3kgZmFpbGVkIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICAgIH1cblxuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gV2FpdGluZyBmb3Igd2luZG93IHRvIGNsb3NlLi4uJyk7XG4gICAgICBhd2FpdCBkZWxheShWQVVMVF9DTE9TRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBWYXVsdCBpcyBub3Qgb3BlbiBcdTIwMTQgc2tpcHBpbmcgZGVzdHJveSAod291bGQgb3RoZXJ3aXNlIHNwYXduIGEgc3RyYXkgd2luZG93IHZpYSB0aGUgQ0xJIGV2YWwpLicpO1xuICAgIH1cblxuICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFJlbW92aW5nIHZhdWx0IGZyb20gcmVnaXN0cnkuLi4nKTtcbiAgICBjb25zdCBldmFsVGFyZ2V0Rm9yUmVtb3ZhbCA9IGF3YWl0IHRoaXMuZ2V0T3BlbkV2YWxUYXJnZXRWYXVsdFBhdGgoKTtcbiAgICB0cnkge1xuICAgICAgaWYgKGV2YWxUYXJnZXRGb3JSZW1vdmFsKSB7XG4gICAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCBldmFsVGFyZ2V0Rm9yUmVtb3ZhbCk7XG4gICAgICAgIGNvbnN0IHJlbW92ZUV4cHIgPSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuaXBjU2VuZFN5bmMoJHtKU09OLnN0cmluZ2lmeSh7IGFyZ3M6IFt2YXVsdFBhdGhdLCBjaGFubmVsOiAndmF1bHQtcmVtb3ZlJyB9KX0pYDtcbiAgICAgICAgYXdhaXQgdGhpcy5ldmFsdWF0ZShyZW1vdmVFeHByLCB7IGN3ZDogZXZhbFRhcmdldEZvclJlbW92YWwsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogVkFVTFRfRVZBTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIE5vIG9wZW4gdmF1bHQgdG8gdGFyZ2V0IGZvciByZW1vdmFsIElQQyBcdTIwMTQgcmVtb3ZpbmcgZGlyZWN0bHkgZnJvbSBvYnNpZGlhbi5qc29uLicpO1xuICAgICAgICByZW1vdmVWYXVsdEZyb21Db25maWcodmF1bHRQYXRoKTtcbiAgICAgIH1cbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFZhdWx0IHJlbW92ZWQgZnJvbSByZWdpc3RyeS4nKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVmF1bHQgcmVnaXN0cnkgcmVtb3ZhbCBmYWlsZWQgKG5vbi1mYXRhbCk6ICR7c2VyaWFsaXplRXJyb3IoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgT2JzaWRpYW4gQ0xJIGJpbmFyeSBpcyBhdmFpbGFibGUgaW4gdGhlIHN5c3RlbSBQQVRILlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhc3NlcnRDbGlBdmFpbGFibGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29tbWFuZCA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyAnd2hlcmUuZXhlIG9ic2lkaWFuJyA6ICd3aGljaCBvYnNpZGlhbic7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWMoY29tbWFuZCwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPYnNpZGlhbiBDTEkgaXMgbm90IGF2YWlsYWJsZS4gRW5zdXJlIE9ic2lkaWFuIGlzIGluc3RhbGxlZCBhbmQgaXRzIENMSSBpcyBpbiB5b3VyIFBBVEguJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc21pc3NlcyB0aGUgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvciBvZiB0aGlzIHZhdWx0P1wiIGRpYWxvZyBpZiBwcmVzZW50LlxuICAgKlxuICAgKiBDbGlja3MgdGhlIFwiVHJ1c3QgYXV0aG9yIGFuZCBlbmFibGUgcGx1Z2luc1wiIGJ1dHRvbiAoYC5tb2QtY3RhYCkgaW5zaWRlIGFueVxuICAgKiBtb2RhbCB3aG9zZSB0ZXh0IGluY2x1ZGVzIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3JcIi4gQWN0cyBhcyBhIHNhZmV0eSBuZXRcbiAgICogZm9yIGJvdGggcmVnaXN0cmF0aW9uIHBhdGhzOlxuICAgKlxuICAgKiAtIEZpcnN0IHZhdWx0IHJlZ2lzdGVyZWQgdmlhIGNvbmZpZyBmaWxlIChubyBwcmlvciBgZW5hYmxlLXBsdWdpbi08aWQ+YCBlbnRyeSkuXG4gICAqIC0gU3Vic2VxdWVudCB2YXVsdCByZWdpc3RlcmVkIHdoaWxlIGFub3RoZXIgdmF1bHQgaXMgYWxyZWFkeSBvcGVuLiBUaGVcbiAgICogICBgZW5hYmxlLXBsdWdpbi08bmV3VmF1bHRJZD5gIHdyaXRlIGhhcHBlbnMgaW4gdGhlIGV4aXN0aW5nIHZhdWx0J3MgcmVuZGVyZXIsXG4gICAqICAgYnV0IHRoZSBuZXcgdmF1bHQncyByZW5kZXJlciBtYXkgcmVhZCBgbG9jYWxTdG9yYWdlYCBiZWZvcmUgdGhhdCBjcm9zcy1yZW5kZXJlclxuICAgKiAgIHdyaXRlIGJlY29tZXMgdmlzaWJsZSAocmFjZSBvYnNlcnZlZCBpbiBPYnNpZGlhbiAxLjEzLjApLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gZXZhbHVhdGUgaW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc21pc3NUcnVzdERpYWxvZyh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCB2YXVsdFBhdGgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoRElTTUlTU19UUlVTVF9ESUFMT0dfRVhQUiwgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgICBpZiAocmVzdWx0ID09PSAndHJ1ZScpIHtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIERpc21pc3NlZCBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yXCIgZGlhbG9nLicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGBlbmFibGUtcGx1Z2luLTx2YXVsdElkPmAgaW4gT2JzaWRpYW4ncyBsb2NhbFN0b3JhZ2UgdG8gcHJldmVudFxuICAgKiB0aGUgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvciBvZiB0aGlzIHZhdWx0P1wiIGRpYWxvZyBmcm9tIGFwcGVhcmluZ1xuICAgKiB3aGVuIGEgdmF1bHQgd2l0aCBjb21tdW5pdHkgcGx1Z2lucyBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgKlxuICAgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgYHZhdWx0LW9wZW5gIElQQyAoc28gdGhlIHZhdWx0IElEIGV4aXN0cyBpblxuICAgKiBgb2JzaWRpYW4uanNvbmApIGFuZCBiZWZvcmUgdGhlIG5ldyB2YXVsdCB3aW5kb3cgZmluaXNoZXMgbG9hZGluZy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqIEBwYXJhbSBldmFsVGFyZ2V0VmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gdXNlIGFzIGV2YWwgdGFyZ2V0IChhbiBleGlzdGluZywgbG9hZGVkIHZhdWx0KS5cbiAgICogICBsb2NhbFN0b3JhZ2UgaXMgc2hhcmVkIGFjcm9zcyBhbGwgT2JzaWRpYW4gd2luZG93cyAoc2FtZSBFbGVjdHJvbiBvcmlnaW4pLCBzbyB0aGVcbiAgICogICBgbG9jYWxTdG9yYWdlLnNldEl0ZW1gIGNhbGwgY2FuIHJ1biBpbiBhbnkgbG9hZGVkIHZhdWx0IHdpbmRvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5hYmxlUGx1Z2luc0luTG9jYWxTdG9yYWdlKHZhdWx0UGF0aDogc3RyaW5nLCBldmFsVGFyZ2V0VmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2YXVsdElkID0gZ2V0VmF1bHRJZCh2YXVsdFBhdGgpO1xuICAgIGlmICghdmF1bHRJZCkge1xuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gQ291bGQgbm90IGZpbmQgdmF1bHQgSUQgXHUyMDE0IHNraXBwaW5nIGxvY2FsU3RvcmFnZSB0cnVzdCBmbGFnLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCBldmFsVGFyZ2V0VmF1bHRQYXRoKTtcbiAgICBjb25zdCBlbmFibGVFeHByID0gYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLnNldExvY2FsU3RvcmFnZUl0ZW0oJHtKU09OLnN0cmluZ2lmeSh7IGtleTogYGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfWAsIHZhbHVlOiAndHJ1ZScgfSl9KWA7XG4gICAgYXdhaXQgdGhpcy5ldmFsdWF0ZShlbmFibGVFeHByLCB7IGN3ZDogZXZhbFRhcmdldFZhdWx0UGF0aCB9KTtcbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBTZXQgZW5hYmxlLXBsdWdpbi0ke3ZhdWx0SWR9IGluIGxvY2FsU3RvcmFnZS5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXVuY2hlcyBPYnNpZGlhbiBiaW5hcnkgYW5kIHJldHJpZXMgdGhlIGV2YWwgdW50aWwgaXQgcmVzcG9uZHMuXG4gICAqXG4gICAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIENMSSBjb21tYW5kIGFycmF5IHRvIHJldHJ5LlxuICAgKiBAcGFyYW0gY3dkIC0gVGhlIHdvcmtpbmcgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVPYnNpZGlhblJ1bm5pbmdBbmRSZXRyeShjb21tYW5kOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBPYnNpZGlhbiBpcyBub3QgcnVubmluZy4gU3RhcnRpbmcgT2JzaWRpYW4uLi4nKTtcblxuICAgIGNvbnN0IGxhdW5jaENvbW1hbmQgPSBhd2FpdCBnZXRPYnNpZGlhbkxhdW5jaENvbW1hbmQoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYyhsYXVuY2hDb21tYW5kLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBUaGUgbGF1bmNoIGNvbW1hbmQgbWF5IGZhaWwgb24gc29tZSBzeXN0ZW1zIFx1MjAxNCB3ZSdsbCBzdGlsbCB0cnkgcG9sbGluZy5cbiAgICB9XG5cbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBQb2xsaW5nIGZvciBPYnNpZGlhbiBDTEkgKHRpbWVvdXQ9JHtTdHJpbmcoQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBhd2FpdCBkZWxheShBVVRPX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGV4ZWMoY29tbWFuZCwgeyBjd2QsIGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIE9ic2lkaWFuIENMSSByZXNwb25kZWQuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIGlmICghbWVzc2FnZS5pbmNsdWRlcyhVTkFCTEVfVE9fRklORF9PQlNJRElBTikpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBPYnNpZGlhbiBub3QgcmVhZHkgeWV0LCByZXRyeWluZy4uLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgT2JzaWRpYW4gZGlkIG5vdCBzdGFydCB3aXRoaW4gJHtTdHJpbmcoQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcGF0aCBvZiBhbiBhbHJlYWR5LW9wZW4gdmF1bHQgdG8gdXNlIGFzIGFuIGBvYnNpZGlhbiBldmFsYFxuICAgKiB0YXJnZXQsIG9yIGB1bmRlZmluZWRgIGlmIHRoZXJlIGlzIG5vbmUuXG4gICAqXG4gICAqIFRoZSBgb3BlbmAgZmxhZyBpbiBgb2JzaWRpYW4uanNvbmAgaXMgb25seSB0cnVzdHdvcnRoeSB3aGlsZSBPYnNpZGlhbiBpc1xuICAgKiBydW5uaW5nIFx1MjAxNCBhIGtpbGxlZCBvciBjcmFzaGVkIHByb2Nlc3MgbmV2ZXIgcmVzZXRzIGl0LCBsZWF2aW5nIHRoZSB1c2VyJ3NcbiAgICogbGFzdC1zZXNzaW9uIHZhdWx0IG1hcmtlZCBvcGVuLiBBY3Rpbmcgb24gdGhhdCBzdGFsZSBmbGFnIHdvdWxkIHRhcmdldCB0aGVcbiAgICogKHBvc3NpYmx5IGhlYXZ5KSBsYXN0LXNlc3Npb24gdmF1bHQgYW5kIGNhdXNlIGF1dG8tc3RhcnQgdG8gcmVvcGVuIGl0LlxuICAgKiBXaGVuIE9ic2lkaWFuIGlzIG5vdCBydW5uaW5nIHdlIHRoZXJlZm9yZSByZXBvcnQgbm8gb3BlbiB2YXVsdCwgc28gY2FsbGVyc1xuICAgKiBmYWxsIGJhY2sgdG8gdGhlIGRpcmVjdC1jb25maWcgcGF0aCB0aGF0IG9wZW5zIG9ubHkgdGhlIHRlbXAgdmF1bHQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIGFuIG9wZW4gdmF1bHQsIG9yIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRPcGVuRXZhbFRhcmdldFZhdWx0UGF0aCgpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghYXdhaXQgaXNPYnNpZGlhblJ1bm5pbmcoKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0QW55T3BlblZhdWx0UGF0aCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEtpbGxzIHRoZSBydW5uaW5nIE9ic2lkaWFuIHByb2Nlc3MgKGlmIGFueSkgYW5kIHdhaXRzIGZvciBpdCB0byBleGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBraWxsT2JzaWRpYW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gS2lsbGluZyBPYnNpZGlhbiBwcm9jZXNzLi4uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWMoZ2V0S2lsbE9ic2lkaWFuQ29tbWFuZCgpLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBQcm9jZXNzIG1heSBub3QgYmUgcnVubmluZyBcdTIwMTQgdGhhdCdzIGZpbmUuXG4gICAgfVxuXG4gICAgYXdhaXQgZGVsYXkoVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xscyB1bnRpbCB0aGUgdmF1bHQgaXMgcmVhZHkgYW5kIHJlc3BvbmRpbmcgdG8gZXZhbCBjYWxscy5cbiAgICpcbiAgICogRWFjaCBgb2JzaWRpYW4gZXZhbGAgaW4gdGhlIGxvb3AgaXMgZ2l2ZW4gYSBwZXItY2FsbCB0aW1lb3V0LiBUaGUgb3ZlcmFsbFxuICAgKiBkZWFkbGluZSBpcyBvbmx5IHJlLWNoZWNrZWQgYmV0d2VlbiBhd2FpdHMsIHNvIHdpdGhvdXQgaXQgYSBzaW5nbGUgaHVuZ1xuICAgKiBldmFsIChlLmcuIGEgdmF1bHQgd2luZG93IHRoYXQgb3BlbmVkIGJ1dCBuZXZlciBmaW5pc2hlZCBsb2FkaW5nKSB3b3VsZFxuICAgKiBibG9jayBwYXN0IHRoZSBkZWFkbGluZSBmb3JldmVyIGluc3RlYWQgb2YgZmFpbGluZyBhbmQgcmV0cnlpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwb2xsVmF1bHRSZWFkeSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBvbGxFeHByID0gJ3dpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLnBvbGxWYXVsdEJhc2VQYXRoKCknO1xuXG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUG9sbGluZyBmb3IgdmF1bHQgcmVhZGluZXNzICh0aW1lb3V0PSR7U3RyaW5nKFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgbGV0IGlzQm9vdHN0cmFwcGVkID0gZmFsc2U7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFpc0Jvb3RzdHJhcHBlZCkge1xuICAgICAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCB2YXVsdFBhdGgsIFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgICAgIGlzQm9vdHN0cmFwcGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUocG9sbEV4cHIsIHsgY3dkOiB2YXVsdFBhdGgsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogVkFVTFRfRVZBTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9KTtcbiAgICAgICAgaWYgKEpTT04ucGFyc2UoYmFzZVBhdGgpID09PSB2YXVsdFBhdGgpIHtcbiAgICAgICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBWYXVsdCBpcyByZWFkeS4nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBWYXVsdCBub3QgcmVhZHkgeWV0IFx1MjAxNCBuYW1lc3BhY2UgbWF5IG5vdCBiZSBib290c3RyYXBwZWQgeWV0IGVpdGhlci5cbiAgICAgICAgaXNCb290c3RyYXBwZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGRlbGF5KFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBWYXVsdCBhdCAke3ZhdWx0UGF0aH0gZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zYCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdGFydHMgT2JzaWRpYW4gYnkga2lsbGluZyB0aGUgcnVubmluZyBwcm9jZXNzIGFuZCByZWxhdW5jaGluZyBpdC5cbiAgICpcbiAgICogVXNlZCB3aGVuIGEgY29uZmlnIGNoYW5nZSAobGlrZSBlbmFibGluZyBDTEkpIHJlcXVpcmVzIGEgcmVzdGFydCB0byB0YWtlIGVmZmVjdC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIHVzZSBmb3IgcG9sbGluZyBhZnRlciByZXN0YXJ0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXN0YXJ0T2JzaWRpYW4odmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmtpbGxPYnNpZGlhbigpO1xuXG4gICAgY29uc3QgcmVzdGFydFZhdWx0SWQgPSBnZXRWYXVsdElkKHZhdWx0UGF0aCk7XG4gICAgY29uc3QgY29tbWFuZCA9IFsnb2JzaWRpYW4nLCAuLi4ocmVzdGFydFZhdWx0SWQgPyBbYHZhdWx0PSR7cmVzdGFydFZhdWx0SWR9YF0gOiBbXSksICdldmFsJywgJ2NvZGU9XCIxXCInXTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZU9ic2lkaWFuUnVubmluZ0FuZFJldHJ5KGNvbW1hbmQsIHZhdWx0UGF0aCk7XG4gIH1cbn1cblxuLyoqXG4gKiBFdmFsdWF0ZXMgYW4gZXhwcmVzc2lvbiwgd3JpdGVzIHRoZSByZXN1bHQgdG8gYSBKU09OIGZpbGUuXG4gKlxuICogU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBleGVjdXRlZCBpbnNpZGUgdGhlIE9ic2lkaWFuIHByb2Nlc3MuXG4gKiBNdXN0IE5PVCByZWZlcmVuY2UgYW55IG91dGVyIHNjb3BlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgaW52b2NhdGlvbiBwYXJhbWV0ZXJzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW52b2tlQW5kV3JpdGVSZXN1bHQocGFyYW1zOiBJbnZva2VBbmRXcml0ZVJlc3VsdFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgLS0gd2luZG93LmFwcCBpcyBzZXQgYnkgT2JzaWRpYW4gYXQgcnVudGltZS5cbiAgY29uc3QgZnNQcm9taXNlcyA9IFJlZmxlY3QuZ2V0KHdpbmRvdy5hcHAudmF1bHQuYWRhcHRlciwgJ2ZzUHJvbWlzZXMnKSBhcyBJbnZva2VBbmRXcml0ZVJlc3VsdEZzUHJvbWlzZXM7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFyYW1zLmV2YWx1YXRlKCk7XG4gICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhd2FpdCBmc1Byb21pc2VzLndyaXRlRmlsZShwYXJhbXMucmVzdWx0UGF0aCwgSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAndW5kZWZpbmVkJywgdmFsdWU6ICcnIH0pKTtcbiAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgYXdhaXQgZnNQcm9taXNlcy53cml0ZUZpbGUocGFyYW1zLnJlc3VsdFBhdGgsIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ251bGwnLCB2YWx1ZTogJycgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWJhc2UtdG8tc3RyaW5nIC0tIEludGVudGlvbmFsOiByZXN1bHQgaXMgYW4gYXJiaXRyYXJ5IHZhbHVlIGZyb20gdGhlIGV2YWx1YXRlZCBleHByZXNzaW9uLlxuICAgICAgYXdhaXQgZnNQcm9taXNlcy53cml0ZUZpbGUocGFyYW1zLnJlc3VsdFBhdGgsIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IFN0cmluZyhyZXN1bHQpIH0pKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGF3YWl0IGZzUHJvbWlzZXMud3JpdGVGaWxlKHBhcmFtcy5yZXN1bHRQYXRoLCBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdlcnJvcicsIHZhbHVlOiBwYXJhbXMuc2VyaWFsaXplRXJyb3IoZXJyKSB9KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBkZXRhaWxlZCBkaWFnbm9zdGljIHN0cmluZyBmb3IgdGhlIFwiU2NyaXB0IGRpZCBub3QgZXhlY3V0ZVwiIGVycm9yLlxuICpcbiAqIFBlcmZvcm1zIGxpdmUgZW52aXJvbm1lbnQgY2hlY2tzIChwcm9jZXNzIGxpc3QsIHZhdWx0IHJlZ2lzdHJ5LCBDTEkgY29uZmlnKVxuICogYW5kIGluY2x1ZGVzIHRoZSBjb21tYW5kLCBleGVjIG91dHB1dCwgYW5kIHNjcmlwdCBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGlhZ25vc3RpYyBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgQSBmb3JtYXR0ZWQgZGlhZ25vc3RpYyBzdHJpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkRGlhZ25vc3RpY3MocGFyYW1zOiBCdWlsZERpYWdub3N0aWNzUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgbGluZXMucHVzaChgICBDb21tYW5kOiAke3BhcmFtcy5jb21tYW5kLmpvaW4oJyAnKX1gKTtcbiAgbGluZXMucHVzaChgICBXb3JraW5nIGRpcmVjdG9yeTogJHtwYXJhbXMuY3dkfWApO1xuICBsaW5lcy5wdXNoKGAgIFNjcmlwdCBwYXRoOiAke3BhcmFtcy5zY3JpcHRQYXRofWApO1xuICBsaW5lcy5wdXNoKGAgIEV4cGVjdGVkIHJlc3VsdCBmaWxlOiAke3BhcmFtcy5yZXN1bHRQYXRofWApO1xuXG4gIGlmIChwYXJhbXMuZXhlY1Jlc3VsdCkge1xuICAgIGxpbmVzLnB1c2goYCAgRXhpdCBjb2RlOiAke3BhcmFtcy5leGVjUmVzdWx0LmV4aXRDb2RlID09PSBudWxsID8gJyhudWxsIFx1MjAxNCBwcm9jZXNzIGRpZCBub3QgZXhpdCBub3JtYWxseSknIDogU3RyaW5nKHBhcmFtcy5leGVjUmVzdWx0LmV4aXRDb2RlKX1gKTtcbiAgICBpZiAocGFyYW1zLmV4ZWNSZXN1bHQuZXhpdFNpZ25hbCkge1xuICAgICAgbGluZXMucHVzaChgICBFeGl0IHNpZ25hbDogJHtwYXJhbXMuZXhlY1Jlc3VsdC5leGl0U2lnbmFsfWApO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmV4ZWNSZXN1bHQuc3Rkb3V0LnRyaW0oKSkge1xuICAgICAgbGluZXMucHVzaChgICBzdGRvdXQ6ICR7cGFyYW1zLmV4ZWNSZXN1bHQuc3Rkb3V0LnRyaW0oKX1gKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5leGVjUmVzdWx0LnN0ZGVyci50cmltKCkpIHtcbiAgICAgIGxpbmVzLnB1c2goYCAgc3RkZXJyOiAke3BhcmFtcy5leGVjUmVzdWx0LnN0ZGVyci50cmltKCl9YCk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLmV4ZWNSZXN1bHQuc3Rkb3V0LnRyaW0oKSAmJiAhcGFyYW1zLmV4ZWNSZXN1bHQuc3RkZXJyLnRyaW0oKSkge1xuICAgICAgbGluZXMucHVzaCgnICBzdGRvdXQvc3RkZXJyOiAoZW1wdHkpJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxpbmVzLnB1c2goJyAgZXhlYyByZXN1bHQ6IChub3QgYXZhaWxhYmxlIFx1MjAxNCBPYnNpZGlhbiB3YXMgYXV0by1zdGFydGVkIGFuZCByZXRyaWVkKScpO1xuICB9XG5cbiAgbGluZXMucHVzaCgnRW52aXJvbm1lbnQgY2hlY2tzOicpO1xuICBsaW5lcy5wdXNoKGAgIE9ic2lkaWFuIHJ1bm5pbmc6ICR7YXdhaXQgaXNPYnNpZGlhblJ1bm5pbmcoKSA/ICd5ZXMnIDogJ05PJ31gKTtcbiAgbGluZXMucHVzaChgICBDTEkgZW5hYmxlZCBpbiBvYnNpZGlhbi5qc29uOiAke2lzQ2xpRW5hYmxlZCgpID8gJ3llcycgOiAnTk8nfWApO1xuICBsaW5lcy5wdXNoKGAgIFZhdWx0IHJlZ2lzdGVyZWQ6ICR7aXNWYXVsdFJlZ2lzdGVyZWQocGFyYW1zLmN3ZCkgPyAneWVzJyA6ICdOTyd9YCk7XG4gIGxpbmVzLnB1c2goYCAgU2NyaXB0IGZpbGUgZXhpc3RzOiAke2V4aXN0c1N5bmMocGFyYW1zLnNjcmlwdFBhdGgpID8gJ3llcycgOiAnbm8gKGFscmVhZHkgY2xlYW5lZCB1cCknfWApO1xuICBsaW5lcy5wdXNoKGAgIFJlc3VsdCBmaWxlIGV4aXN0czogJHtleGlzdHNTeW5jKHBhcmFtcy5yZXN1bHRQYXRoKSA/ICd5ZXMnIDogJ25vJ31gKTtcblxuICBjb25zdCByZWdpc3RlcmVkVmF1bHRzID0gZ2V0UmVnaXN0ZXJlZFZhdWx0cygpO1xuICBpZiAocmVnaXN0ZXJlZFZhdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICBsaW5lcy5wdXNoKCcgIFJlZ2lzdGVyZWQgdmF1bHRzOiAobm9uZSknKTtcbiAgfSBlbHNlIHtcbiAgICBsaW5lcy5wdXNoKCcgIFJlZ2lzdGVyZWQgdmF1bHRzOicpO1xuICAgIGZvciAoY29uc3QgdmF1bHQgb2YgcmVnaXN0ZXJlZFZhdWx0cykge1xuICAgICAgbGluZXMucHVzaChgICAgIC0gJHt2YXVsdC5wYXRofSAob3BlbjogJHtTdHJpbmcodmF1bHQub3Blbil9KWApO1xuICAgIH1cbiAgfVxuXG4gIGxpbmVzLnB1c2goYCAgU2NyaXB0IGNvbnRlbnQ6XFxuJHtwYXJhbXMuc2NyaXB0Q29udGVudH1gKTtcblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjb250ZW50IG9mIGEgdGVtcG9yYXJ5IHNjcmlwdCBmaWxlLlxuICpcbiAqIFNlcmlhbGl6ZXMge0BsaW5rIGludm9rZUFuZFdyaXRlUmVzdWx0fSBpbnRvIGEgc2VsZi1jb250YWluZWQgSUlGRSB0aGF0XG4gKiBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24sIHdyaXRlcyB0aGUgcmVzdWx0IChvciBlcnJvcikgdG8gYHJlc3VsdFBhdGhgLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIC0gVGhlIEphdmFTY3JpcHQgZXhwcmVzc2lvbiB0byBldmFsdWF0ZS5cbiAqIEBwYXJhbSByZXN1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHJlc3VsdCBmaWxlLlxuICogQHJldHVybnMgVGhlIHNjcmlwdCBmaWxlIGNvbnRlbnQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkU2NyaXB0RmlsZShleHByZXNzaW9uOiBzdHJpbmcsIHJlc3VsdFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGZuU3RyID0gZ2V0RnVuY3Rpb25FeHByZXNzaW9uU3RyaW5nKGludm9rZUFuZFdyaXRlUmVzdWx0KTtcbiAgY29uc3Qgc2VyaWFsaXplRXJyb3JTdHIgPSBnZXRGdW5jdGlvbkV4cHJlc3Npb25TdHJpbmcoc2VyaWFsaXplRXJyb3IpO1xuICBjb25zdCByZXN1bHRQYXRoSnNvbiA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdFBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpKTtcbiAgcmV0dXJuIGAoJHtmblN0cn0pKHsgZXZhbHVhdGU6IGFzeW5jICgpID0+ICgke2V4cHJlc3Npb259KSwgcmVzdWx0UGF0aDogJHtyZXN1bHRQYXRoSnNvbn0sIHNlcmlhbGl6ZUVycm9yOiAke3NlcmlhbGl6ZUVycm9yU3RyfSB9KWA7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZ2l2ZW4gZGVsYXkuXG4gKlxuICogQHBhcmFtIG1zIC0gVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBkZWxheS5cbiAqL1xuZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVhZHMgYSBzY3JpcHQgZmlsZSBmcm9tIGRpc2ssIGxvZ3MgaXRzIGNvbnRlbnQsIGFuZCBleGVjdXRlcyBpdCB2aWEgYG5ldyBGdW5jdGlvbmAuXG4gKlxuICogU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBleGVjdXRlZCBpbnNpZGUgdGhlIE9ic2lkaWFuIHByb2Nlc3MuXG4gKiBNdXN0IE5PVCByZWZlcmVuY2UgYW55IG91dGVyIHNjb3BlLlxuICpcbiAqIEBwYXJhbSBzY3JpcHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHNjcmlwdCBmaWxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlU2NyaXB0RmlsZShzY3JpcHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkIC0tIHdpbmRvdy5hcHAgaXMgc2V0IGJ5IE9ic2lkaWFuIGF0IHJ1bnRpbWUuXG4gIGNvbnN0IGZzUHJvbWlzZXMgPSBSZWZsZWN0LmdldCh3aW5kb3cuYXBwLnZhdWx0LmFkYXB0ZXIsICdmc1Byb21pc2VzJykgYXMgRXhlY3V0ZVNjcmlwdEZpbGVGc1Byb21pc2VzO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgZnNQcm9taXNlcy5hY2Nlc3Moc2NyaXB0UGF0aCk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTY3JpcHQgZmlsZSBub3QgZm91bmQ6ICR7c2NyaXB0UGF0aH1gLCB7IGNhdXNlIH0pO1xuICB9XG5cbiAgY29uc3Qgc2NyaXB0ID0gYXdhaXQgZnNQcm9taXNlcy5yZWFkRmlsZShzY3JpcHRQYXRoLCAndXRmLTgnKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGUgLS0gRGlhZ25vc3RpYyBsb2dnaW5nIGluc2lkZSBPYnNpZGlhbiBwcm9jZXNzOyBubyBsb2dnZXIgYXZhaWxhYmxlLlxuICBjb25zb2xlLmRlYnVnKGBFeGVjdXRpbmcgJHtzY3JpcHRQYXRofTpcXG4ke3NjcmlwdH1gKTtcblxuICBsZXQgZm46ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbXBsaWVkLWV2YWwsIG5vLW5ldy1mdW5jIC0tIFRoZSBzY3JpcHQgaXMgYSB0cnVzdGVkLCBzZWxmLWdlbmVyYXRlZCBJSUZFIGV4cHJlc3Npb24uXG4gICAgZm4gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAke3NjcmlwdH1gKSBhcyAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB9IGNhdGNoIChjYXVzZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgcGFyc2luZyAke3NjcmlwdFBhdGh9YCwgeyBjYXVzZSB9KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGV4ZWN1dGluZyAke3NjcmlwdFBhdGh9YCwgeyBjYXVzZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGNvbW1hbmQgdG8ga2lsbCB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgc2hlbGwgY29tbWFuZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGdldEtpbGxPYnNpZGlhbkNvbW1hbmQoKTogc3RyaW5nIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICByZXR1cm4gJ3Rhc2traWxsIC9JTSBPYnNpZGlhbi5leGUgL0YnO1xuICB9XG5cbiAgcmV0dXJuICdwa2lsbCAtZiBPYnNpZGlhbic7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgY29tbWFuZCB0byBsYXVuY2ggdGhlIE9ic2lkaWFuIGJpbmFyeS5cbiAqXG4gKiBSZXNvbHZlcyB0aGUgYWN0dWFsIGluc3RhbGxlZCBPYnNpZGlhbiBleGVjdXRhYmxlIChjb3ZlcmluZyBpbnN0YWxsZXItYmFzZWRcbiAqIGFuZCBgUEFUSGAtYmFzZWQgaW5zdGFsbHMgc3VjaCBhcyBgc2Nvb3BgKSBhbmQgdmVyaWZpZXMgaXQgZXhpc3RzIGJlZm9yZVxuICogcmV0dXJuaW5nIGEgY29tbWFuZC4gVGhyb3dzIGlmIE9ic2lkaWFuIGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHJldHVybnMgVGhlIHNoZWxsIGNvbW1hbmQgc3RyaW5nLlxuICogQHRocm93cyBFcnJvciBpZiBPYnNpZGlhbiBjYW5ub3QgYmUgbG9jYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0T2JzaWRpYW5MYXVuY2hDb21tYW5kKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGV4ZVBhdGggPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlKCk7XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICByZXR1cm4gYHN0YXJ0IFwiXCIgXCIke2V4ZVBhdGh9XCJgO1xuICB9XG5cbiAgcmV0dXJuIGBcIiR7ZXhlUGF0aH1cIiAmYDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBjb21tYW5kIHRvIG9wZW4gYSBVUkkuXG4gKlxuICogQHBhcmFtIHVyaSAtIFRoZSBVUkkgdG8gb3Blbi5cbiAqIEByZXR1cm5zIFRoZSBzaGVsbCBjb21tYW5kIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZ2V0T3BlblVyaUNvbW1hbmQodXJpOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHJldHVybiBgc3RhcnQgXCJcIiBcIiR7dXJpfVwiYDtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgIHJldHVybiBgb3BlbiBcIiR7dXJpfVwiYDtcbiAgfVxuXG4gIHJldHVybiBgeGRnLW9wZW4gXCIke3VyaX1cImA7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIE9ic2lkaWFuIHByb2Nlc3MgaXMgY3VycmVudGx5IHJ1bm5pbmcuXG4gKlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBPYnNpZGlhbiBwcm9jZXNzIGlzIGZvdW5kLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNPYnNpZGlhblJ1bm5pbmcoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGNvbW1hbmQgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInXG4gICAgPyAndGFza2xpc3QgL0ZJIFwiSU1BR0VOQU1FIGVxIE9ic2lkaWFuLmV4ZVwiIC9OSCdcbiAgICA6ICdwZ3JlcCAtZiBPYnNpZGlhbic7XG4gIHRyeSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZXhlYyhjb21tYW5kLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgIHJldHVybiBvdXRwdXQuaW5jbHVkZXMoJ09ic2lkaWFuLmV4ZScpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0LnRyaW0oKS5sZW5ndGggPiAwO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBPcGVucyBhIHZhdWx0IGluIE9ic2lkaWFuIHVzaW5nIHRoZSBgb2JzaWRpYW46Ly9vcGVuYCBVUkkgcHJvdG9jb2wuXG4gKlxuICogVGhpcyB3b3JrcyB3aGV0aGVyIE9ic2lkaWFuIGlzIGFscmVhZHkgcnVubmluZyAoc2lnbmFscyBpdCB0byBvcGVuIHRoZSB2YXVsdClcbiAqIG9yIG5vdCAobGF1bmNoZXMgT2JzaWRpYW4gd2l0aCB0aGUgdmF1bHQpLiBUaGUgVVJJIHByb3RvY29sIGlzIGhhbmRsZWQgYnkgdGhlXG4gKiBPUywgd2hpY2ggcm91dGVzIGl0IHRvIHRoZSByZWdpc3RlcmVkIE9ic2lkaWFuIGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9wZW5WYXVsdFZpYVVyaSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB2YXVsdElkID0gZ2V0VmF1bHRJZCh2YXVsdFBhdGgpO1xuICBpZiAoIXZhdWx0SWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBvcGVuIHZhdWx0IHZpYSBVUkk6IHZhdWx0IGlzIG5vdCByZWdpc3RlcmVkIGluIG9ic2lkaWFuLmpzb246ICR7dmF1bHRQYXRofWApO1xuICB9XG4gIGNvbnN0IHVyaSA9IGBvYnNpZGlhbjovL29wZW4/dmF1bHQ9JHtlbmNvZGVVUklDb21wb25lbnQodmF1bHRJZCl9YDtcbiAgY29uc3QgY29tbWFuZCA9IGdldE9wZW5VcmlDb21tYW5kKHVyaSk7XG4gIGxvZyhgW2NsaS10cmFuc3BvcnRdIE9wZW5pbmcgdmF1bHQgdmlhIFVSSTogJHt1cml9YCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlYyhjb21tYW5kLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVVJJIG9wZW4gZmFpbGVkIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBU0EsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QixTQUFTLFlBQVk7QUFDckIsT0FBTyxhQUFhO0FBUXBCLFNBQVMsaUNBQWlDO0FBQzFDLFNBQVMsWUFBWTtBQUNyQixTQUFTLG1DQUFtQztBQUM1QyxTQUFTLFdBQVc7QUFDcEIsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyxZQUFZO0FBQ3JCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsaUNBQWlDO0FBQzFDLFNBQVMsc0JBQXNCO0FBc0MvQixNQUFNLDBCQUEwQjtBQUNoQyxNQUFNLDJDQUEyQztBQUNqRCxNQUFNLHFDQUFxQztBQUMzQyxNQUFNLHNDQUFzQztBQUM1QyxNQUFNLHFDQUFxQztBQUMzQyxNQUFNLG9DQUFvQztBQUMxQyxNQUFNLHFDQUFxQztBQWVwQyxNQUFNLG9CQUFpRDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSTVDLFdBQVc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFB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
|
|
@@ -503,4 +503,4 @@ export {
|
|
|
503
503
|
createTransportFromOptions,
|
|
504
504
|
getOrCreateTransport
|
|
505
505
|
};
|
|
506
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIGV4ZWNGaWxlU3luYyxcbiAgc3Bhd25cbn0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBodHRwIGZyb20gJ25vZGU6aHR0cCc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQge1xuICBhdHRhY2gsXG4gIHJlbW90ZVxufSBmcm9tICd3ZWJkcml2ZXJpbyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyxcbiAgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQgeyBidWlsZEVtdWxhdG9yQXJncyB9IGZyb20gJy4vZW11bGF0b3ItYXJncy5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5pbXBvcnQgeyBEZXNrdG9wQ2xpVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jbGkubWpzJztcblxuY29uc3QgQVBQX1BBQ0tBR0UgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQVBQX0FDVElWSVRZID0gYCR7QVBQX1BBQ0tBR0V9Lk1haW5BY3Rpdml0eWA7XG5jb25zdCBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UID0gMztcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTgwMDAwO1xuY29uc3QgQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBBUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA2MDAwMDtcbmNvbnN0IENEUF9ERUZBVUxUX1BPUlQgPSA4MzE1O1xuLy8gQXBwaXVtIGluc2VjdXJlIGZlYXR1cmUgbGV0dGluZyB0aGUgVWlBdXRvbWF0b3IyIGRyaXZlciBhdXRvLWRvd25sb2FkIGFcbi8vIENocm9tZWRyaXZlciBtYXRjaGluZyBPYnNpZGlhbidzIFdlYlZpZXcgQ2hyb21lIHZlcnNpb24uIEVuYWJsaW5nIGl0IG9uIHRoZVxuLy8gQXBwaXVtIHNlcnZlciAoaXQgaGFzIG5vIGVmZmVjdCBhcyBhIGNhcGFiaWxpdHkpIGF2b2lkcyB0aGUgZmFpbHVyZVxuLy8gXCJObyBDaHJvbWVkcml2ZXIgZm91bmQgdGhhdCBjYW4gYXV0b21hdGUgQ2hyb21lIC4uLlwiLlxuY29uc3QgQ0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFID0gJ3VpYXV0b21hdG9yMjpjaHJvbWVkcml2ZXJfYXV0b2Rvd25sb2FkJztcbmNvbnN0IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDA7XG5jb25zdCBERUZBVUxUX1RSQU5TUE9SVF9UWVBFID0gJ29ic2lkaWFuLWNsaSc7XG5jb25zdCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjAwMDA7XG5jb25zdCBFTVVMQVRPUl9PVVRQVVRfVEFJTF9NQVhfTEVOR1RIID0gODAwMDtcbmNvbnN0IEtFWUNPREVfTUVOVSA9IDgyO1xuY29uc3QgS0VZQ09ERV9XQUtFVVAgPSAyMjQ7XG5jb25zdCBTRVJWRVJfSU5TVEFMTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEyMDAwMDtcbmNvbnN0IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjAwMDA7XG5cbi8qKlxuICogRGV0YWlscyBvZiBhbiBlbXVsYXRvciBwcm9jZXNzIHRoYXQgaGFzIGV4aXRlZC5cbiAqL1xuaW50ZXJmYWNlIEVtdWxhdG9yRXhpdEluZm8ge1xuICAvKiogRXhpdCBjb2RlLCBvciBgbnVsbGAgaWYgdGhlIHByb2Nlc3Mgd2FzIHRlcm1pbmF0ZWQgYnkgYSBzaWduYWwuICovXG4gIGNvZGU6IG51bGwgfCBudW1iZXI7XG5cbiAgLyoqIFRlcm1pbmF0aW5nIHNpZ25hbCwgb3IgYG51bGxgIGlmIHRoZSBwcm9jZXNzIGV4aXRlZCBub3JtYWxseS4gKi9cbiAgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGw7XG59XG5cbi8qKlxuICogQSBzcGF3bmVkIGVtdWxhdG9yIHByb2Nlc3MgdG9nZXRoZXIgd2l0aCBoZWxwZXJzIHRvIGluc3BlY3QgaXRzIGNhcHR1cmVkXG4gKiBvdXRwdXQgYW5kIGV4aXQgc3RhdHVzLlxuICovXG5pbnRlcmZhY2UgRW11bGF0b3JMYXVuY2gge1xuICAvKiogVGhlIHNwYXduZWQgZW11bGF0b3IgcHJvY2Vzcy4gKi9cbiAgcHJvY2VzczogQ2hpbGRQcm9jZXNzO1xuXG4gIC8qKiBSZXR1cm5zIHRoZSBleGl0IGRldGFpbHMgb25jZSB0aGUgcHJvY2VzcyBoYXMgZXhpdGVkLCBvdGhlcndpc2UgYHVuZGVmaW5lZGAuICovXG4gIHJlYWRFeGl0SW5mbzogKCkgPT4gRW11bGF0b3JFeGl0SW5mbyB8IHVuZGVmaW5lZDtcblxuICAvKiogUmV0dXJucyB0aGUgY2FwdHVyZWQgc3Rkb3V0K3N0ZGVyciAoYm91bmRlZCB0byB0aGUgbW9zdCByZWNlbnQgb3V0cHV0KS4gKi9cbiAgcmVhZE91dHB1dDogKCkgPT4gc3RyaW5nO1xuXG4gIC8qKiBTdG9wcyBhY2N1bXVsYXRpbmcgb3V0cHV0LiBDYWxsIG9uY2Ugc3RhcnR1cCBoYXMgc3VjY2VlZGVkLiAqL1xuICBzdG9wQ2FwdHVyZTogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Yge0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkuZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdCB7XG4gIC8qKiBUaGUgYWN0dWFsIGRldmljZSBJRCB0aGF0IGlzIGNvbm5lY3RlZCAobWF5IGRpZmZlciBmcm9tIHRoZSByZXF1ZXN0ZWQgb25lKS4gKi9cbiAgYWN0dWFsRGV2aWNlSWQ6IHN0cmluZztcblxuICAvKiogVGhlIGVtdWxhdG9yIHByb2Nlc3MsIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLiAqL1xuICBlbXVsYXRvclByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkuc3RhcnRBcHBpdW1BbmRFbXVsYXRvcn0uXG4gKi9cbmludGVyZmFjZSBTdGFydEFwcGl1bUFuZEVtdWxhdG9yUGFyYW1zIHtcbiAgLyoqIFRoZSBBcHBpdW0gc2VydmVyIFVSTC4gKi9cbiAgYXBwaXVtVXJsOiBVUkw7XG5cbiAgLyoqIEFWRCBuYW1lIHRvIHN0YXJ0LiAqL1xuICBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBBcHBpdW0gc2VydmVyIHBvcnQuICovXG4gIHBvcnQ6IG51bWJlcjtcblxuICAvKiogV2hldGhlciBBcHBpdW0gYXV0by1zdGFydCBpcyBhbGxvd2VkLiAqL1xuICBzaG91bGRBdXRvU3RhcnRBcHBpdW0/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeS5zdGFydEFwcGl1bUFuZEVtdWxhdG9yfS5cbiAqL1xuaW50ZXJmYWNlIFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JSZXN1bHQge1xuICAvKiogVGhlIGFjdHVhbCBkZXZpY2UgSUQgdGhhdCBpcyBjb25uZWN0ZWQgKG1heSBkaWZmZXIgZnJvbSB0aGUgcmVxdWVzdGVkIG9uZSkuICovXG4gIGFjdHVhbERldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBBcHBpdW0gc2VydmVyIHByb2Nlc3MsIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLiAqL1xuICBhcHBpdW1Qcm9jZXNzPzogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBUaGUgZW11bGF0b3IgcHJvY2VzcywgaWYgb25lIHdhcyBhdXRvLXN0YXJ0ZWQuICovXG4gIGVtdWxhdG9yUHJvY2Vzcz86IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcbn1cblxubGV0IGNhY2hlZFRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRW5jYXBzdWxhdGVzIGFsbCBBcHBpdW0gdHJhbnNwb3J0IGNyZWF0aW9uIGxvZ2ljLCBpbmNsdWRpbmcgQXBwaXVtIHNlcnZlclxuICogc3RhcnR1cCwgZW11bGF0b3IgbWFuYWdlbWVudCwgYW5kIFdlYkRyaXZlcklPIHNlc3Npb24gZXN0YWJsaXNobWVudC5cbiAqXG4gKiBVc2luZyBhIGNsYXNzIGF2b2lkcyB0aHJlYWRpbmcgdGhlIHRyYW5zcG9ydCBgdHlwZWAgbGFiZWwgdGhyb3VnaCBldmVyeVxuICogaGVscGVyIGZ1bmN0aW9uIFx1MjAxNCBgdGhpcy5sb2coKWAgYXV0b21hdGljYWxseSBwcmVmaXhlcyBpdC5cbiAqL1xuY2xhc3MgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0eXBlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gQXBwaXVtIHRyYW5zcG9ydCBieSBlc3RhYmxpc2hpbmcgYSBXZWJEcml2ZXJJTyBzZXNzaW9uLlxuICAgKlxuICAgKiBJZiBgb3B0aW9ucy5zZXNzaW9uSWRgIGlzIHByZXNlbnQsIHJlYXR0YWNoZXMgdG8gdGhlIGV4aXN0aW5nIHNlc3Npb25cbiAgICogaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUuIFRoaXMgYXZvaWRzIGR1cGxpY2F0ZSBBcHBpdW0vQURCIGNvbm5lY3Rpb25zXG4gICAqIHdoZW4gdGVzdCB3b3JrZXJzIHJldXNlIHRoZSBnbG9iYWwgc2V0dXAncyBzZXNzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEFuZHJvaWQgQXBwaXVtIHRyYW5zcG9ydCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBBIGNvbmZpZ3VyZWQgQXBwaXVtIHRyYW5zcG9ydC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGUob3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgICBpZiAob3B0aW9ucy5zZXNzaW9uSWQgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmRldmljZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmF0dGFjaFRvRXhpc3RpbmdTZXNzaW9uKG9wdGlvbnMuc2Vzc2lvbklkLCBvcHRpb25zLmRldmljZUlkLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVOZXdTZXNzaW9uKG9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhdHRhY2hUb0V4aXN0aW5nU2Vzc2lvbihcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICBkZXZpY2VJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnNcbiAgKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwob3B0aW9ucy5hcHBpdW1VcmwpO1xuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIodXJsLnBvcnQpO1xuICAgIGNvbnN0IGFwcElkID0gb3B0aW9ucy5hcHBJZCA/PyBBUFBfUEFDS0FHRTtcblxuICAgIHRoaXMubG9nKGBSZWF0dGFjaGluZyB0byBleGlzdGluZyBBcHBpdW0gc2Vzc2lvbiAke3Nlc3Npb25JZH0gKGRldmljZT0ke2RldmljZUlkfSlgKTtcblxuICAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCBhdHRhY2goe1xuICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgIHBsYXRmb3JtTmFtZTogJ0FuZHJvaWQnXG4gICAgICB9LFxuICAgICAgaG9zdG5hbWU6IHVybC5ob3N0bmFtZSxcbiAgICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgICBwYXRoOiB1cmwucGF0aG5hbWUsXG4gICAgICBwb3J0LFxuICAgICAgc2Vzc2lvbklkLFxuICAgICAgdHJhbnNmb3JtUmVxdWVzdDogc3RyaXBGb3JiaWRkZW5GZXRjaEhlYWRlcnNcbiAgICB9KTtcblxuICAgIHRoaXMubG9nKCdSZWF0dGFjaGVkIHRvIEFwcGl1bSBzZXNzaW9uLicpO1xuXG4gICAgcmV0dXJuIG5ldyBBcHBpdW1UcmFuc3BvcnQoe1xuICAgICAgYXBwSWQsXG4gICAgICBicm93c2VyLFxuICAgICAgZGV2aWNlSWQsXG4gICAgICBpc1Nlc3Npb25Pd25lcjogZmFsc2UsXG4gICAgICBwbGF0Zm9ybTogJ2FuZHJvaWQnLFxuICAgICAgLi4uKG9wdGlvbnMudmF1bHRCYXNlUGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRCYXNlUGF0aDogb3B0aW9ucy52YXVsdEJhc2VQYXRoIH0pLFxuICAgICAgLi4uKG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgd2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybDogVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHN0YXR1c1VybCA9IG5ldyBVUkwoJy9zdGF0dXMnLCB1cmwpO1xuICAgICAgY29uc3QgcmVxID0gaHR0cC5nZXQoc3RhdHVzVXJsLCB7IHRpbWVvdXQ6IEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKHJlcykgPT4ge1xuICAgICAgICByZXMucmVzdW1lKCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgICAgcmVxLm9uKCd0aW1lb3V0JywgKCkgPT4ge1xuICAgICAgICByZXEuZGVzdHJveSgpO1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufSBkaWQgbm90IHJlc3BvbmQgd2l0aGluICR7U3RyaW5nKEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLiBJcyB0aGUgQXBwaXVtIHNlcnZlciBydW5uaW5nP2BcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJlcS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IHJlYWNoIEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufTogJHtlcnIubWVzc2FnZX0uIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVOZXdTZXNzaW9uKG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gICAgdGhpcy5sb2coYENyZWF0aW5nIEFwcGl1bVRyYW5zcG9ydCAodXJsPSR7b3B0aW9ucy5hcHBpdW1Vcmx9LCBhdmQ9JHtvcHRpb25zLmF2ZE5hbWV9KWApO1xuXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRpb25zLmFwcGl1bVVybCk7XG5cbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHVybC5wb3J0KTtcbiAgICBpZiAoaXNOYU4ocG9ydCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwb3J0IGluIGFwcGl1bVVybDogJHt1cmwucG9ydH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcHBJZCA9IG9wdGlvbnMuYXBwSWQgPz8gQVBQX1BBQ0tBR0U7XG5cbiAgICBsZXQgYXBwaXVtUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuICAgIGxldCBlbXVsYXRvclByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN0YXJ0QXBwaXVtQW5kRW11bGF0b3Ioe1xuICAgICAgICBhcHBpdW1Vcmw6IHVybCxcbiAgICAgICAgYXZkTmFtZTogb3B0aW9ucy5hdmROYW1lLFxuICAgICAgICBwb3J0LFxuICAgICAgICBzaG91bGRBdXRvU3RhcnRBcHBpdW06IG9wdGlvbnMuc2hvdWxkQXV0b1N0YXJ0QXBwaXVtXG4gICAgICB9KTtcblxuICAgICAgYXBwaXVtUHJvY2VzcyA9IHJlc3VsdC5hcHBpdW1Qcm9jZXNzO1xuICAgICAgZW11bGF0b3JQcm9jZXNzID0gcmVzdWx0LmVtdWxhdG9yUHJvY2VzcztcbiAgICAgIGNvbnN0IGFjdHVhbERldmljZUlkID0gcmVzdWx0LmFjdHVhbERldmljZUlkO1xuXG4gICAgICB0aGlzLmxvZyhcbiAgICAgICAgYENvbm5lY3RpbmcgdG8gQXBwaXVtIChkZXZpY2U9JHthY3R1YWxEZXZpY2VJZH0sIGFwcD0ke2FwcElkfSwgcmV0cnlUaW1lb3V0OiAke1N0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMsIHJldHJpZXM6ICR7U3RyaW5nKEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UKX0pLi4uYFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCByZW1vdGUoe1xuICAgICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICAnYXBwaXVtOmFwcEFjdGl2aXR5JzogQVBQX0FDVElWSVRZLFxuICAgICAgICAgICdhcHBpdW06YXBwUGFja2FnZSc6IGFwcElkLFxuICAgICAgICAgICdhcHBpdW06YXV0b0dyYW50UGVybWlzc2lvbnMnOiB0cnVlLFxuICAgICAgICAgICdhcHBpdW06YXV0b21hdGlvbk5hbWUnOiAnVWlBdXRvbWF0b3IyJyxcbiAgICAgICAgICAnYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0JzogQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAnYXBwaXVtOm5vUmVzZXQnOiB0cnVlLFxuICAgICAgICAgICdhcHBpdW06dWRpZCc6IGFjdHVhbERldmljZUlkLFxuICAgICAgICAgICdhcHBpdW06dWlhdXRvbWF0b3IyU2VydmVySW5zdGFsbFRpbWVvdXQnOiBTRVJWRVJfSU5TVEFMTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAnYXBwaXVtOnVpYXV0b21hdG9yMlNlcnZlckxhdW5jaFRpbWVvdXQnOiBTRVJWRVJfTEFVTkNIX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgICAgICdwbGF0Zm9ybU5hbWUnOiAnQW5kcm9pZCdcbiAgICAgICAgfSxcbiAgICAgICAgY29ubmVjdGlvblJldHJ5Q291bnQ6IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5ULFxuICAgICAgICBjb25uZWN0aW9uUmV0cnlUaW1lb3V0OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgaG9zdG5hbWU6IHVybC5ob3N0bmFtZSxcbiAgICAgICAgbG9nTGV2ZWw6ICd3YXJuJyxcbiAgICAgICAgcGF0aDogdXJsLnBhdGhuYW1lLFxuICAgICAgICBwb3J0LFxuICAgICAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBzdHJpcEZvcmJpZGRlbkZldGNoSGVhZGVyc1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubG9nKCdBcHBpdW0gc2Vzc2lvbiBlc3RhYmxpc2hlZC4nKTtcbiAgICAgIGNvbnN0IGFwcGl1bVRyYW5zcG9ydCA9IG5ldyBBcHBpdW1UcmFuc3BvcnQoe1xuICAgICAgICBhcHBJZCxcbiAgICAgICAgYnJvd3NlcixcbiAgICAgICAgZGV2aWNlSWQ6IGFjdHVhbERldmljZUlkLFxuICAgICAgICBwbGF0Zm9ybTogJ2FuZHJvaWQnLFxuICAgICAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSksXG4gICAgICAgIC4uLihvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsRGlzcG9zZSA9IGFwcGl1bVRyYW5zcG9ydC5kaXNwb3NlLmJpbmQoYXBwaXVtVHJhbnNwb3J0KTtcbiAgICAgIGNvbnN0IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgPSBhcHBpdW1UcmFuc3BvcnQ7XG4gICAgICB0cmFuc3BvcnQuZGlzcG9zZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbERpc3Bvc2UoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdHJhbnNwb3J0LmRpc3Bvc2VTeW5jID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0cmFuc3BvcnQ7XG5cbiAgICAgIGZ1bmN0aW9uIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgICAgLy8gQ2Fubm90IHVzZSB0aGlzLmxvZyBpbnNpZGUgbmVzdGVkIGZ1bmN0aW9uIFx1MjAxNCBgdGhpc2AgaXMgbm90IGNhcHR1cmVkLlxuICAgICAgICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7b3B0aW9ucy50eXBlfV0gQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICAgICAga2lsbFByb2Nlc3NUcmVlKGVtdWxhdG9yUHJvY2Vzcyk7XG4gICAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHtvcHRpb25zLnR5cGV9XSBBdXRvLXN0YXJ0ZWQgZW11bGF0b3Igc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgIHRoaXMubG9nKCdLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgaWYgKGVtdWxhdG9yUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoZW11bGF0b3JQcm9jZXNzKTtcbiAgICAgICAgdGhpcy5sb2coJ0tpbGxlZCBhdXRvLXN0YXJ0ZWQgZW11bGF0b3IgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVEZXZpY2VDb25uZWN0ZWQoYXZkTmFtZTogc3RyaW5nKTogUHJvbWlzZTxFbnN1cmVEZXZpY2VDb25uZWN0ZWRSZXN1bHQ+IHtcbiAgICBjb25zdCBkZXZpY2VJZHNCZWZvcmUgPSBhd2FpdCB0aGlzLmdldENvbm5lY3RlZERldmljZUlkcygpO1xuICAgIHRoaXMubG9nKGBDaGVja2luZyBleGlzdGluZyBkZXZpY2VzIGZvciBBVkQgXCIke2F2ZE5hbWV9XCIuLi4gKGNvbm5lY3RlZDogWyR7ZGV2aWNlSWRzQmVmb3JlLmpvaW4oJywgJyl9XSlgKTtcblxuICAgIGNvbnN0IGV4aXN0aW5nRGV2aWNlSWQgPSBhd2FpdCB0aGlzLmZpbmREZXZpY2VCeUF2ZE5hbWUoYXZkTmFtZSwgZGV2aWNlSWRzQmVmb3JlKTtcblxuICAgIGlmIChleGlzdGluZ0RldmljZUlkKSB7XG4gICAgICB0aGlzLmxvZyhgQVZEIFwiJHthdmROYW1lfVwiIGlzIGFscmVhZHkgcnVubmluZyBvbiBkZXZpY2UgJHtleGlzdGluZ0RldmljZUlkfSwgcmV1c2luZy5gKTtcbiAgICAgIHJldHVybiB7IGFjdHVhbERldmljZUlkOiBleGlzdGluZ0RldmljZUlkIH07XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYEFWRCBcIiR7YXZkTmFtZX1cIiBub3QgZm91bmQgb24gYW55IGV4aXN0aW5nIGRldmljZSwgc3RhcnRpbmcgYSBuZXcgZW11bGF0b3IuLi5gKTtcbiAgICBjb25zdCBlbXVsYXRvciA9IHRoaXMuc3RhcnRFbXVsYXRvcihhdmROYW1lKTtcblxuICAgIGxldCBhY3R1YWxEZXZpY2VJZDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBhY3R1YWxEZXZpY2VJZCA9IGF3YWl0IHRoaXMud2FpdEZvck5ld0RldmljZShkZXZpY2VJZHNCZWZvcmUsIGVtdWxhdG9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZW11bGF0b3Iuc3RvcENhcHR1cmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZyhgRW11bGF0b3IgXCIke2F2ZE5hbWV9XCIgc3RhcnRlZCwgZGV2aWNlICR7YWN0dWFsRGV2aWNlSWR9IGlzIGNvbm5lY3RlZC5gKTtcbiAgICByZXR1cm4geyBhY3R1YWxEZXZpY2VJZCwgZW11bGF0b3JQcm9jZXNzOiBlbXVsYXRvci5wcm9jZXNzIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmREZXZpY2VCeUF2ZE5hbWUoYXZkTmFtZTogc3RyaW5nLCBkZXZpY2VJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBmb3IgKGNvbnN0IGRldmljZUlkIG9mIGRldmljZUlkcykge1xuICAgICAgY29uc3QgcnVubmluZ0F2ZCA9IGF3YWl0IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICAgJ2FkYicsXG4gICAgICAgICAgWyctcycsIGRldmljZUlkLCAnZW11JywgJ2F2ZCcsICduYW1lJ10sXG4gICAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgICAgKF9lcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHN0ZG91dC5zcGxpdCgnXFxuJylbMF0/LnRyaW0oKSA/PyAnJyk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChydW5uaW5nQXZkID09PSBhdmROYW1lKSB7XG4gICAgICAgIHJldHVybiBkZXZpY2VJZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRDb25uZWN0ZWREZXZpY2VJZHMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZXhlY0ZpbGUoJ2FkYicsIFsnZGV2aWNlcyddLCB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKGVycm9yLCBzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuICdhZGIgZGV2aWNlcyc6ICR7ZXJyb3IubWVzc2FnZX0uIElzIEFEQiBpbnN0YWxsZWQgYW5kIGluIFBBVEg/YCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RkZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2coYEFEQiBzdGRlcnI6ICR7c3RkZXJyLnRyaW0oKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHN0ZG91dCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGxpbmVzID0gb3V0cHV0LnNwbGl0KCdcXG4nKS5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKS5maWx0ZXIoKGxpbmUpID0+IGxpbmUubGVuZ3RoID4gMCk7XG4gICAgcmV0dXJuIGxpbmVzXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmluY2x1ZGVzKCdcXHRkZXZpY2UnKSlcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUuc3BsaXQoJ1xcdCcpWzBdID8/ICcnKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7dGhpcy50eXBlfV0gJHttZXNzYWdlfWApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRW11bGF0b3JCaW5hcnkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZGtSb290ID0gcHJvY2Vzcy5lbnZbJ0FORFJPSURfSE9NRSddID8/IHByb2Nlc3MuZW52WydBTkRST0lEX1NES19ST09UJ107XG4gICAgaWYgKCFzZGtSb290KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgZmluZCBBbmRyb2lkIGVtdWxhdG9yOiBuZWl0aGVyIEFORFJPSURfSE9NRSBub3IgQU5EUk9JRF9TREtfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGpvaW4oc2RrUm9vdCwgJ2VtdWxhdG9yJywgJ2VtdWxhdG9yJyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRLZXlFdmVudChkZXZpY2VJZDogc3RyaW5nLCBrZXlDb2RlOiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdpbnB1dCcsICdrZXlldmVudCcsIFN0cmluZyhrZXlDb2RlKV0sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgICBgV2FybmluZzogZmFpbGVkIHRvICR7ZGVzY3JpcHRpb259IChrZXlldmVudCAke1N0cmluZyhrZXlDb2RlKX0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydEFwcGl1bUFuZEVtdWxhdG9yKHBhcmFtczogU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyk6IFByb21pc2U8U3RhcnRBcHBpdW1BbmRFbXVsYXRvclJlc3VsdD4ge1xuICAgIGNvbnN0IHsgYXBwaXVtVXJsLCBhdmROYW1lLCBwb3J0LCBzaG91bGRBdXRvU3RhcnRBcHBpdW0gfSA9IHBhcmFtcztcblxuICAgIGxldCBuZWVkc0FwcGl1bVN0YXJ0ID0gZmFsc2U7XG5cbiAgICB0aGlzLmxvZyhgQ2hlY2tpbmcgQXBwaXVtIHNlcnZlciBhdCAke2FwcGl1bVVybC5ocmVmfS4uLmApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNoZWNrQXBwaXVtUmVhY2hhYmxlKGFwcGl1bVVybCk7XG4gICAgICB0aGlzLmxvZygnQXBwaXVtIHNlcnZlciBpcyByZWFjaGFibGUuJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChzaG91bGRBdXRvU3RhcnRBcHBpdW0gPT09IGZhbHNlKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgbmVlZHNBcHBpdW1TdGFydCA9IHRydWU7XG4gICAgfVxuXG4gICAgbGV0IGFwcGl1bVByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChuZWVkc0FwcGl1bVN0YXJ0KSB7XG4gICAgICB0aGlzLmxvZyhgQXBwaXVtIG5vdCByZWFjaGFibGUsIGF1dG8tc3RhcnRpbmcgb24gcG9ydCAke1N0cmluZyhwb3J0KX0uLi5gKTtcbiAgICAgIGFwcGl1bVByb2Nlc3MgPSB0aGlzLnN0YXJ0QXBwaXVtU2VydmVyKHBvcnQpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBbLCBkZXZpY2VSZXN1bHRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBuZWVkc0FwcGl1bVN0YXJ0XG4gICAgICAgICAgPyB0aGlzLndhaXRGb3JBcHBpdW1SZWFkeShhcHBpdW1VcmwpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2coJ0F1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGlzIHJlYWR5LicpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgICAgdGhpcy5lbnN1cmVEZXZpY2VDb25uZWN0ZWQoYXZkTmFtZSlcbiAgICAgIF0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY3R1YWxEZXZpY2VJZDogZGV2aWNlUmVzdWx0LmFjdHVhbERldmljZUlkLFxuICAgICAgICBhcHBpdW1Qcm9jZXNzLFxuICAgICAgICBlbXVsYXRvclByb2Nlc3M6IGRldmljZVJlc3VsdC5lbXVsYXRvclByb2Nlc3NcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChhcHBpdW1Qcm9jZXNzKSB7XG4gICAgICAgIGtpbGxQcm9jZXNzVHJlZShhcHBpdW1Qcm9jZXNzKTtcbiAgICAgICAgdGhpcy5sb2coJ0tpbGxlZCBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBhZnRlciBzdGFydHVwIGZhaWx1cmUuJyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0QXBwaXVtU2VydmVyKHBvcnQ6IG51bWJlcik6IENoaWxkUHJvY2VzcyB7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihgbnB4IGFwcGl1bSAtLWxvZy10aW1lc3RhbXAgLS1wb3J0ICR7U3RyaW5nKHBvcnQpfSAtLWFsbG93LWluc2VjdXJlPSR7Q0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFfWAsIHtcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAnaW5oZXJpdCcsICdpbmhlcml0J11cbiAgICB9KTtcblxuICAgIGNoaWxkLnVucmVmKCk7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEVtdWxhdG9yKGF2ZE5hbWU6IHN0cmluZyk6IEVtdWxhdG9yTGF1bmNoIHtcbiAgICBjb25zdCBlbXVsYXRvckJpbmFyeSA9IHRoaXMucmVzb2x2ZUVtdWxhdG9yQmluYXJ5KCk7XG4gICAgY29uc3QgYXJncyA9IGJ1aWxkRW11bGF0b3JBcmdzKGF2ZE5hbWUpO1xuICAgIHRoaXMubG9nKGBSdW5uaW5nOiAke2VtdWxhdG9yQmluYXJ5fSAke2FyZ3Muam9pbignICcpfWApO1xuICAgIC8qXG4gICAgICogUGlwZSAocmF0aGVyIHRoYW4gaWdub3JlKSBzdGRvdXQvc3RkZXJyIHNvIGFuIGVhcmx5IGZhaWx1cmUgc3VjaCBhc1xuICAgICAqIFwieDg2XzY0IGVtdWxhdGlvbiBjdXJyZW50bHkgcmVxdWlyZXMgaGFyZHdhcmUgYWNjZWxlcmF0aW9uXCIgY2FuIGJlXG4gICAgICogc3VyZmFjZWQgaW1tZWRpYXRlbHkgaW5zdGVhZCBvZiB3YWl0aW5nIG91dCB0aGUgZnVsbCBib290IHRpbWVvdXQuXG4gICAgICovXG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihlbXVsYXRvckJpbmFyeSwgYXJncywge1xuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ11cbiAgICB9KTtcblxuICAgIGxldCBjYXB0dXJlZE91dHB1dCA9ICcnO1xuICAgIGxldCBleGl0SW5mbzogRW11bGF0b3JFeGl0SW5mbyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaXNDYXB0dXJpbmcgPSB0cnVlO1xuXG4gICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgYXBwZW5kT3V0cHV0KTtcbiAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBhcHBlbmRPdXRwdXQpO1xuICAgIGNoaWxkLm9uY2UoJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICBleGl0SW5mbyA9IHsgY29kZSwgc2lnbmFsIH07XG4gICAgfSk7XG5cbiAgICBjaGlsZC51bnJlZigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb2Nlc3M6IGNoaWxkLFxuICAgICAgcmVhZEV4aXRJbmZvOiAoKSA9PiBleGl0SW5mbyxcbiAgICAgIHJlYWRPdXRwdXQ6ICgpID0+IGNhcHR1cmVkT3V0cHV0LFxuICAgICAgc3RvcENhcHR1cmU6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgLypcbiAgICAgICAgICogTGVhdmUgdGhlIGBkYXRhYCBsaXN0ZW5lcnMgYXR0YWNoZWQgc28gdGhlIHBpcGVzIGtlZXAgZHJhaW5pbmcgKGFcbiAgICAgICAgICogZnVsbCBPUyBwaXBlIGJ1ZmZlciB3b3VsZCBibG9jayB0aGUgbG9uZy1ydW5uaW5nIGVtdWxhdG9yKTsgdGhlIGZsYWdcbiAgICAgICAgICoganVzdCBmcmVlemVzIHRoZSBjYXB0dXJlZCB0YWlsIG9uY2Ugc3RhcnR1cCBoYXMgc3VjY2VlZGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgaXNDYXB0dXJpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gYXBwZW5kT3V0cHV0KGNodW5rOiBCdWZmZXIpOiB2b2lkIHtcbiAgICAgIGlmICghaXNDYXB0dXJpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FwdHVyZWRPdXRwdXQgPSAoY2FwdHVyZWRPdXRwdXQgKyBjaHVuay50b1N0cmluZygpKS5zbGljZSgtRU1VTEFUT1JfT1VUUFVUX1RBSUxfTUFYX0xFTkdUSCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQXBwaXVtUmVhZHkodXJsOiBVUkwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBBcHBpdW0gYXQgJHt1cmwuaHJlZn0gKHRpbWVvdXQ6ICR7U3RyaW5nKEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMsIHBvbGw6ICR7U3RyaW5nKEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQVBQSVVNX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcGl1bVJlYWNoYWJsZSh1cmwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tc2BcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQm9vdChkZXZpY2VJZDogc3RyaW5nLCBkZWFkbGluZTogbnVtYmVyLCBlbXVsYXRvcjogRW11bGF0b3JMYXVuY2gpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZW1haW5pbmdNcyA9IE1hdGgubWF4KDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSk7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGZpbmlzaCBib290aW5nIChyZW1haW5pbmc6ICR7U3RyaW5nKHJlbWFpbmluZ01zKX1tcywgcG9sbDogJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBpc0Jvb3RlZCA9IGF3YWl0IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAgICdhZGInLFxuICAgICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2dldHByb3AnLCAnc3lzLmJvb3RfY29tcGxldGVkJ10sXG4gICAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgICAgKF9lcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHN0ZG91dC50cmltKCkgPT09ICcxJyk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpc0Jvb3RlZCkge1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGJvb3QgY29tcGxldGVkLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXRJbmZvID0gZW11bGF0b3IucmVhZEV4aXRJbmZvKCk7XG4gICAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJ1aWxkRW11bGF0b3JFeGl0TWVzc2FnZShleGl0SW5mbywgZW11bGF0b3IucmVhZE91dHB1dCgpKSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBjb25uZWN0ZWQgYnV0IGRpZCBub3QgZmluaXNoIGJvb3Rpbmcgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yTmV3RGV2aWNlKGRldmljZUlkc0JlZm9yZTogc3RyaW5nW10sIGVtdWxhdG9yOiBFbXVsYXRvckxhdW5jaCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgYSBuZXcgZGV2aWNlIHRvIGFwcGVhciBpbiBBREIgKHRpbWVvdXQ6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1N0cmluZyhFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gXG4gICAgKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgY29uc3QgY3VycmVudElkcyA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGVkRGV2aWNlSWRzKCk7XG4gICAgICBjb25zdCBuZXdJZHMgPSBjdXJyZW50SWRzLmZpbHRlcigoaWQpID0+ICFkZXZpY2VJZHNCZWZvcmUuaW5jbHVkZXMoaWQpKTtcblxuICAgICAgaWYgKG5ld0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGFjdHVhbERldmljZUlkID0gbmV3SWRzWzBdID8/ICcnO1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7YWN0dWFsRGV2aWNlSWR9IGFwcGVhcmVkIGluIEFEQiwgd2FpdGluZyBmb3IgYm9vdCB0byBjb21wbGV0ZS4uLmApO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JCb290KGFjdHVhbERldmljZUlkLCBkZWFkbGluZSwgZW11bGF0b3IpO1xuICAgICAgICBhd2FpdCB0aGlzLndha2VTY3JlZW4oYWN0dWFsRGV2aWNlSWQpO1xuICAgICAgICByZXR1cm4gYWN0dWFsRGV2aWNlSWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXRJbmZvID0gZW11bGF0b3IucmVhZEV4aXRJbmZvKCk7XG4gICAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJ1aWxkRW11bGF0b3JFeGl0TWVzc2FnZShleGl0SW5mbywgZW11bGF0b3IucmVhZE91dHB1dCgpKSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTm8gbmV3IGVtdWxhdG9yIGRldmljZSBhcHBlYXJlZCB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdha2VTY3JlZW4oZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9nKGBXYWtpbmcgc2NyZWVuIG9uIGRldmljZSAke2RldmljZUlkfS4uLmApO1xuXG4gICAgYXdhaXQgdGhpcy5zZW5kS2V5RXZlbnQoZGV2aWNlSWQsIEtFWUNPREVfV0FLRVVQLCAnd2FrZSBzY3JlZW4nKTtcbiAgICBhd2FpdCB0aGlzLnNlbmRLZXlFdmVudChkZXZpY2VJZCwgS0VZQ09ERV9NRU5VLCAnZGlzbWlzcyBsb2NrIHNjcmVlbicpO1xuXG4gICAgdGhpcy5sb2coYFNjcmVlbiB3YWtlIGNvbXBsZXRlIG9uIGRldmljZSAke2RldmljZUlkfS5gKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUcmFuc3BvcnQgY29uZmlndXJhdGlvbi4gRGVmYXVsdHMgdG8gQ0xJIHRyYW5zcG9ydC5cbiAqIEByZXR1cm5zIEEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGNvbnN0IHR5cGUgPSBvcHRpb25zPy50eXBlID8/IERFRkFVTFRfVFJBTlNQT1JUX1RZUEU7XG5cbiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudHlwZSA9PT0gJ29ic2lkaWFuLWNsaScpIHtcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeToke3R5cGV9XSBDcmVhdGluZyBEZXNrdG9wQ2xpVHJhbnNwb3J0YCk7XG4gICAgcmV0dXJuIG5ldyBEZXNrdG9wQ2xpVHJhbnNwb3J0KCk7XG4gIH1cblxuICBpZiAob3B0aW9ucy50eXBlID09PSAnb2JzaWRpYW4tY2RwJykge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7dHlwZX1dIENyZWF0aW5nIERlc2t0b3BDZHBUcmFuc3BvcnQgKGhvc3Q9JHtvcHRpb25zLmhvc3QgPz8gJ2xvY2FsaG9zdCd9LCBwb3J0PSR7U3RyaW5nKG9wdGlvbnMucG9ydCA/PyBDRFBfREVGQVVMVF9QT1JUKX0pYCk7XG4gICAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KHtcbiAgICAgIC4uLihvcHRpb25zLmhvc3QgIT09IHVuZGVmaW5lZCAmJiB7IGNkcEhvc3Q6IG9wdGlvbnMuaG9zdCB9KSxcbiAgICAgIC4uLihvcHRpb25zLnBvcnQgIT09IHVuZGVmaW5lZCAmJiB7IGNkcFBvcnQ6IG9wdGlvbnMucG9ydCB9KSxcbiAgICAgIC4uLihvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5KHR5cGUpO1xuICByZXR1cm4gZmFjdG9yeS5jcmVhdGUob3B0aW9ucyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhY2hlZCB0cmFuc3BvcnQgaW5zdGFuY2UsIGNyZWF0aW5nIG9uZSBmcm9tIHRoZSBnaXZlbiBvcHRpb25zXG4gKiBpZiBub3QgYWxyZWFkeSBjYWNoZWQuXG4gKlxuICogVGhlIHRyYW5zcG9ydCBpcyBjYWNoZWQgcGVyIHdvcmtlciBwcm9jZXNzIHNvIFdlYlNvY2tldC9BcHBpdW0gc2Vzc2lvbnNcbiAqIGFyZSByZXVzZWQgYWNyb3NzIGNhbGxzIHdpdGhpbiB0aGUgc2FtZSB0ZXN0IHdvcmtlci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBDTEkgdHJhbnNwb3J0LlxuICogQHJldHVybnMgVGhlIGNhY2hlZCBvciBuZXdseSBjcmVhdGVkIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlVHJhbnNwb3J0KG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGlmIChjYWNoZWRUcmFuc3BvcnQpIHtcbiAgICByZXR1cm4gY2FjaGVkVHJhbnNwb3J0O1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzIC0tIFNpbmdsZS10aHJlYWRlZCB3b3JrZXI7IG5vIGNvbmN1cnJlbnQgd3JpdGVzLlxuICBjYWNoZWRUcmFuc3BvcnQgPSByZXN1bHQ7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZSBmb3IgYW4gZW11bGF0b3IgcHJvY2VzcyB0aGF0IGV4aXRlZCBkdXJpbmdcbiAqIHN0YXJ0dXAsIGFwcGVuZGluZyB0aGUgY2FwdHVyZWQgb3V0cHV0IHRhaWwgd2hlbiBhdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIGV4aXRJbmZvIC0gVGhlIGVtdWxhdG9yJ3MgZXhpdCBkZXRhaWxzLlxuICogQHBhcmFtIG91dHB1dCAtIFRoZSBjYXB0dXJlZCBzdGRvdXQrc3RkZXJyIHRhaWwuXG4gKiBAcmV0dXJucyBBIGh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkRW11bGF0b3JFeGl0TWVzc2FnZShleGl0SW5mbzogRW11bGF0b3JFeGl0SW5mbywgb3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWFzb24gPSBleGl0SW5mby5zaWduYWwgPT09IG51bGxcbiAgICA/IGBleGl0ZWQgcHJlbWF0dXJlbHkgd2l0aCBjb2RlICR7U3RyaW5nKGV4aXRJbmZvLmNvZGUpfWBcbiAgICA6IGB3YXMgdGVybWluYXRlZCBieSBzaWduYWwgJHtleGl0SW5mby5zaWduYWx9YDtcbiAgY29uc3QgdHJpbW1lZE91dHB1dCA9IG91dHB1dC50cmltKCk7XG4gIGNvbnN0IGRldGFpbHMgPSB0cmltbWVkT3V0cHV0Lmxlbmd0aCA+IDBcbiAgICA/IGBcXG5cXG5FbXVsYXRvciBvdXRwdXQgKHRhaWwpOlxcbiR7dHJpbW1lZE91dHB1dH1gXG4gICAgOiAnJztcbiAgcmV0dXJuIGBBbmRyb2lkIGVtdWxhdG9yICR7cmVhc29ufSBkdXJpbmcgc3RhcnR1cC4ke2RldGFpbHN9YDtcbn1cblxuLyoqXG4gKiBLaWxscyBhIGNoaWxkIHByb2Nlc3MgYW5kIGl0cyBlbnRpcmUgcHJvY2VzcyB0cmVlLlxuICpcbiAqIE9uIFdpbmRvd3MsIGBjaGlsZC5raWxsKClgIG9ubHkgc2VuZHMgU0lHVEVSTSB0byB0aGUgZGlyZWN0IHByb2Nlc3MsXG4gKiBsZWF2aW5nIHNwYXduZWQgZ3JhbmRjaGlsZHJlbiAoZS5nLiBRRU1VLCBVaUF1dG9tYXRvcikgYWxpdmUuXG4gKiBgdGFza2tpbGwgL0YgL1QgL1BJRGAgZm9yY2VmdWxseSB0ZXJtaW5hdGVzIHRoZSBlbnRpcmUgdHJlZS5cbiAqXG4gKiBAcGFyYW0gY2hpbGQgLSBUaGUgY2hpbGQgcHJvY2VzcyB0byBraWxsLlxuICovXG5mdW5jdGlvbiBraWxsUHJvY2Vzc1RyZWUoY2hpbGQ6IENoaWxkUHJvY2Vzcyk6IHZvaWQge1xuICBpZiAoY2hpbGQucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHRyeSB7XG4gICAgICBleGVjRmlsZVN5bmMoJ3Rhc2traWxsJywgWycvRicsICcvVCcsICcvUElEJywgU3RyaW5nKGNoaWxkLnBpZCldLCB7IHN0ZGlvOiAnaWdub3JlJyB9KTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKFxuICAgICAgICBgW3RyYW5zcG9ydC1mYWN0b3J5XSB0YXNra2lsbCBmb3IgUElEICR7U3RyaW5nKGNoaWxkLnBpZCl9IGZhaWxlZCAobWF5IGhhdmUgYWxyZWFkeSBleGl0ZWQpOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNoaWxkLmtpbGwoJ1NJR0tJTEwnKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZXMgYENvbm5lY3Rpb25gIGFuZCBgQ29udGVudC1MZW5ndGhgIGZyb20gYSBXZWJEcml2ZXIgcmVxdWVzdCdzIGhlYWRlcnMuXG4gKlxuICogVGhlIGJ1bmRsZWQgYHdlYmRyaXZlcmAgcGFja2FnZSBzZXRzIGJvdGggaGVhZGVycyBleHBsaWNpdGx5LiBUaGV5IGFyZVxuICogZm9yYmlkZGVuIHJlcXVlc3QgaGVhZGVycyBwZXIgdGhlIEZldGNoIHNwZWM6IE5vZGUgdXAgdG8gMjUgYWNjZXB0ZWQgdGhlbVxuICogc2lsZW50bHksIGJ1dCBOb2RlIDI2IHJlamVjdHMgdGhlbSB3aXRoIGBVTkRfRVJSX0lOVkFMSURfQVJHYCwgYnJlYWtpbmcgdGhlXG4gKiBBcHBpdW0gYC9zZXNzaW9uYCByZXF1ZXN0LiBUaGUgdHJhbnNwb3J0IGxheWVyIG1hbmFnZXMgY29ubmVjdGlvbiByZXVzZSBhbmRcbiAqIHRoZSBGZXRjaCBBUEkgY29tcHV0ZXMgYENvbnRlbnQtTGVuZ3RoYCBmcm9tIHRoZSBib2R5LCBzbyBkcm9wcGluZyBib3RoIGlzXG4gKiBzYWZlIG9uIGV2ZXJ5IE5vZGUgdmVyc2lvbi4gU2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vd2ViZHJpdmVyaW8vd2ViZHJpdmVyaW8vaXNzdWVzLzE1MjY1fS5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdE9wdGlvbnMgLSBUaGUgcmVxdWVzdCBvcHRpb25zIGFib3V0IHRvIGJlIHNlbnQgYnkgV2ViRHJpdmVySU8uXG4gKiBAcmV0dXJucyBUaGUgc2FtZSByZXF1ZXN0IG9wdGlvbnMgd2l0aCB0aGUgZm9yYmlkZGVuIGhlYWRlcnMgcmVtb3ZlZC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBGb3JiaWRkZW5GZXRjaEhlYWRlcnMocmVxdWVzdE9wdGlvbnM6IFJlcXVlc3RJbml0KTogUmVxdWVzdEluaXQge1xuICBpZiAocmVxdWVzdE9wdGlvbnMuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICByZXF1ZXN0T3B0aW9ucy5oZWFkZXJzLmRlbGV0ZSgnQ29ubmVjdGlvbicpO1xuICAgIHJlcXVlc3RPcHRpb25zLmhlYWRlcnMuZGVsZXRlKCdDb250ZW50LUxlbmd0aCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlcXVlc3RPcHRpb25zO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBVUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsT0FBTyxVQUFVO0FBQ2pCLFNBQVMsWUFBWTtBQUNyQixPQUFPLGFBQWE7QUFDcEI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFRUCxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLFdBQVc7QUFDcEIsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUywyQkFBMkI7QUFDcEMsU0FBUywyQkFBMkI7QUFFcEMsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sZUFBZSxHQUFH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
|
|
506
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIGV4ZWNGaWxlU3luYyxcbiAgc3Bhd25cbn0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBodHRwIGZyb20gJ25vZGU6aHR0cCc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQge1xuICBhdHRhY2gsXG4gIHJlbW90ZVxufSBmcm9tICd3ZWJkcml2ZXJpbyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyxcbiAgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQgeyBidWlsZEVtdWxhdG9yQXJncyB9IGZyb20gJy4vZW11bGF0b3ItYXJncy5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5pbXBvcnQgeyBEZXNrdG9wQ2xpVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jbGkubWpzJztcblxuY29uc3QgQVBQX1BBQ0tBR0UgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQVBQX0FDVElWSVRZID0gYCR7QVBQX1BBQ0tBR0V9Lk1haW5BY3Rpdml0eWA7XG5jb25zdCBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UID0gMztcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTgwMDAwO1xuY29uc3QgQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBBUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA2MDAwMDtcbmNvbnN0IENEUF9ERUZBVUxUX1BPUlQgPSA4MzE1O1xuLy8gQXBwaXVtIGluc2VjdXJlIGZlYXR1cmUgbGV0dGluZyB0aGUgVWlBdXRvbWF0b3IyIGRyaXZlciBhdXRvLWRvd25sb2FkIGFcbi8vIENocm9tZWRyaXZlciBtYXRjaGluZyBPYnNpZGlhbidzIFdlYlZpZXcgQ2hyb21lIHZlcnNpb24uIEVuYWJsaW5nIGl0IG9uIHRoZVxuLy8gQXBwaXVtIHNlcnZlciAoaXQgaGFzIG5vIGVmZmVjdCBhcyBhIGNhcGFiaWxpdHkpIGF2b2lkcyB0aGUgZmFpbHVyZVxuLy8gXCJObyBDaHJvbWVkcml2ZXIgZm91bmQgdGhhdCBjYW4gYXV0b21hdGUgQ2hyb21lIC4uLlwiLlxuY29uc3QgQ0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFID0gJ3VpYXV0b21hdG9yMjpjaHJvbWVkcml2ZXJfYXV0b2Rvd25sb2FkJztcbmNvbnN0IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDA7XG5jb25zdCBERUZBVUxUX1RSQU5TUE9SVF9UWVBFID0gJ29ic2lkaWFuLWNsaSc7XG5jb25zdCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjAwMDA7XG5jb25zdCBFTVVMQVRPUl9PVVRQVVRfVEFJTF9NQVhfTEVOR1RIID0gODAwMDtcbmNvbnN0IEtFWUNPREVfTUVOVSA9IDgyO1xuY29uc3QgS0VZQ09ERV9XQUtFVVAgPSAyMjQ7XG5jb25zdCBTRVJWRVJfSU5TVEFMTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEyMDAwMDtcbmNvbnN0IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjAwMDA7XG5cbi8qKlxuICogRGV0YWlscyBvZiBhbiBlbXVsYXRvciBwcm9jZXNzIHRoYXQgaGFzIGV4aXRlZC5cbiAqL1xuaW50ZXJmYWNlIEVtdWxhdG9yRXhpdEluZm8ge1xuICAvKiogRXhpdCBjb2RlLCBvciBgbnVsbGAgaWYgdGhlIHByb2Nlc3Mgd2FzIHRlcm1pbmF0ZWQgYnkgYSBzaWduYWwuICovXG4gIGNvZGU6IG51bGwgfCBudW1iZXI7XG5cbiAgLyoqIFRlcm1pbmF0aW5nIHNpZ25hbCwgb3IgYG51bGxgIGlmIHRoZSBwcm9jZXNzIGV4aXRlZCBub3JtYWxseS4gKi9cbiAgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGw7XG59XG5cbi8qKlxuICogQSBzcGF3bmVkIGVtdWxhdG9yIHByb2Nlc3MgdG9nZXRoZXIgd2l0aCBoZWxwZXJzIHRvIGluc3BlY3QgaXRzIGNhcHR1cmVkXG4gKiBvdXRwdXQgYW5kIGV4aXQgc3RhdHVzLlxuICovXG5pbnRlcmZhY2UgRW11bGF0b3JMYXVuY2gge1xuICAvKiogVGhlIHNwYXduZWQgZW11bGF0b3IgcHJvY2Vzcy4gKi9cbiAgcHJvY2VzczogQ2hpbGRQcm9jZXNzO1xuXG4gIC8qKiBSZXR1cm5zIHRoZSBleGl0IGRldGFpbHMgb25jZSB0aGUgcHJvY2VzcyBoYXMgZXhpdGVkLCBvdGhlcndpc2UgYHVuZGVmaW5lZGAuICovXG4gIHJlYWRFeGl0SW5mbzogKCkgPT4gRW11bGF0b3JFeGl0SW5mbyB8IHVuZGVmaW5lZDtcblxuICAvKiogUmV0dXJucyB0aGUgY2FwdHVyZWQgc3Rkb3V0K3N0ZGVyciAoYm91bmRlZCB0byB0aGUgbW9zdCByZWNlbnQgb3V0cHV0KS4gKi9cbiAgcmVhZE91dHB1dDogKCkgPT4gc3RyaW5nO1xuXG4gIC8qKiBTdG9wcyBhY2N1bXVsYXRpbmcgb3V0cHV0LiBDYWxsIG9uY2Ugc3RhcnR1cCBoYXMgc3VjY2VlZGVkLiAqL1xuICBzdG9wQ2FwdHVyZTogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Yge0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkuZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdCB7XG4gIC8qKiBUaGUgYWN0dWFsIGRldmljZSBJRCB0aGF0IGlzIGNvbm5lY3RlZCAobWF5IGRpZmZlciBmcm9tIHRoZSByZXF1ZXN0ZWQgb25lKS4gKi9cbiAgcmVhZG9ubHkgYWN0dWFsRGV2aWNlSWQ6IHN0cmluZztcblxuICAvKiogVGhlIGVtdWxhdG9yIHByb2Nlc3MsIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLiAqL1xuICByZWFkb25seSBlbXVsYXRvclByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkuc3RhcnRBcHBpdW1BbmRFbXVsYXRvcn0uXG4gKi9cbmludGVyZmFjZSBTdGFydEFwcGl1bUFuZEVtdWxhdG9yUGFyYW1zIHtcbiAgLyoqIFRoZSBBcHBpdW0gc2VydmVyIFVSTC4gKi9cbiAgcmVhZG9ubHkgYXBwaXVtVXJsOiBVUkw7XG5cbiAgLyoqIEFWRCBuYW1lIHRvIHN0YXJ0LiAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBBcHBpdW0gc2VydmVyIHBvcnQuICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcblxuICAvKiogV2hldGhlciBBcHBpdW0gYXV0by1zdGFydCBpcyBhbGxvd2VkLiAqL1xuICByZWFkb25seSBzaG91bGRBdXRvU3RhcnRBcHBpdW0/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeS5zdGFydEFwcGl1bUFuZEVtdWxhdG9yfS5cbiAqL1xuaW50ZXJmYWNlIFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JSZXN1bHQge1xuICAvKiogVGhlIGFjdHVhbCBkZXZpY2UgSUQgdGhhdCBpcyBjb25uZWN0ZWQgKG1heSBkaWZmZXIgZnJvbSB0aGUgcmVxdWVzdGVkIG9uZSkuICovXG4gIHJlYWRvbmx5IGFjdHVhbERldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBBcHBpdW0gc2VydmVyIHByb2Nlc3MsIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLiAqL1xuICByZWFkb25seSBhcHBpdW1Qcm9jZXNzPzogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBUaGUgZW11bGF0b3IgcHJvY2VzcywgaWYgb25lIHdhcyBhdXRvLXN0YXJ0ZWQuICovXG4gIHJlYWRvbmx5IGVtdWxhdG9yUHJvY2Vzcz86IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcbn1cblxubGV0IGNhY2hlZFRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRW5jYXBzdWxhdGVzIGFsbCBBcHBpdW0gdHJhbnNwb3J0IGNyZWF0aW9uIGxvZ2ljLCBpbmNsdWRpbmcgQXBwaXVtIHNlcnZlclxuICogc3RhcnR1cCwgZW11bGF0b3IgbWFuYWdlbWVudCwgYW5kIFdlYkRyaXZlcklPIHNlc3Npb24gZXN0YWJsaXNobWVudC5cbiAqXG4gKiBVc2luZyBhIGNsYXNzIGF2b2lkcyB0aHJlYWRpbmcgdGhlIHRyYW5zcG9ydCBgdHlwZWAgbGFiZWwgdGhyb3VnaCBldmVyeVxuICogaGVscGVyIGZ1bmN0aW9uIFx1MjAxNCBgdGhpcy5sb2coKWAgYXV0b21hdGljYWxseSBwcmVmaXhlcyBpdC5cbiAqL1xuY2xhc3MgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0eXBlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gQXBwaXVtIHRyYW5zcG9ydCBieSBlc3RhYmxpc2hpbmcgYSBXZWJEcml2ZXJJTyBzZXNzaW9uLlxuICAgKlxuICAgKiBJZiBgb3B0aW9ucy5zZXNzaW9uSWRgIGlzIHByZXNlbnQsIHJlYXR0YWNoZXMgdG8gdGhlIGV4aXN0aW5nIHNlc3Npb25cbiAgICogaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUuIFRoaXMgYXZvaWRzIGR1cGxpY2F0ZSBBcHBpdW0vQURCIGNvbm5lY3Rpb25zXG4gICAqIHdoZW4gdGVzdCB3b3JrZXJzIHJldXNlIHRoZSBnbG9iYWwgc2V0dXAncyBzZXNzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEFuZHJvaWQgQXBwaXVtIHRyYW5zcG9ydCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBBIGNvbmZpZ3VyZWQgQXBwaXVtIHRyYW5zcG9ydC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGUob3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgICBpZiAob3B0aW9ucy5zZXNzaW9uSWQgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmRldmljZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmF0dGFjaFRvRXhpc3RpbmdTZXNzaW9uKG9wdGlvbnMuc2Vzc2lvbklkLCBvcHRpb25zLmRldmljZUlkLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVOZXdTZXNzaW9uKG9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhdHRhY2hUb0V4aXN0aW5nU2Vzc2lvbihcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICBkZXZpY2VJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnNcbiAgKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwob3B0aW9ucy5hcHBpdW1VcmwpO1xuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIodXJsLnBvcnQpO1xuICAgIGNvbnN0IGFwcElkID0gb3B0aW9ucy5hcHBJZCA/PyBBUFBfUEFDS0FHRTtcblxuICAgIHRoaXMubG9nKGBSZWF0dGFjaGluZyB0byBleGlzdGluZyBBcHBpdW0gc2Vzc2lvbiAke3Nlc3Npb25JZH0gKGRldmljZT0ke2RldmljZUlkfSlgKTtcblxuICAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCBhdHRhY2goe1xuICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgIHBsYXRmb3JtTmFtZTogJ0FuZHJvaWQnXG4gICAgICB9LFxuICAgICAgaG9zdG5hbWU6IHVybC5ob3N0bmFtZSxcbiAgICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgICBwYXRoOiB1cmwucGF0aG5hbWUsXG4gICAgICBwb3J0LFxuICAgICAgc2Vzc2lvbklkLFxuICAgICAgdHJhbnNmb3JtUmVxdWVzdDogc3RyaXBGb3JiaWRkZW5GZXRjaEhlYWRlcnNcbiAgICB9KTtcblxuICAgIHRoaXMubG9nKCdSZWF0dGFjaGVkIHRvIEFwcGl1bSBzZXNzaW9uLicpO1xuXG4gICAgcmV0dXJuIG5ldyBBcHBpdW1UcmFuc3BvcnQoe1xuICAgICAgYXBwSWQsXG4gICAgICBicm93c2VyLFxuICAgICAgZGV2aWNlSWQsXG4gICAgICBpc1Nlc3Npb25Pd25lcjogZmFsc2UsXG4gICAgICBwbGF0Zm9ybTogJ2FuZHJvaWQnLFxuICAgICAgLi4uKG9wdGlvbnMudmF1bHRCYXNlUGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRCYXNlUGF0aDogb3B0aW9ucy52YXVsdEJhc2VQYXRoIH0pLFxuICAgICAgLi4uKG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgd2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybDogVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHN0YXR1c1VybCA9IG5ldyBVUkwoJy9zdGF0dXMnLCB1cmwpO1xuICAgICAgY29uc3QgcmVxID0gaHR0cC5nZXQoc3RhdHVzVXJsLCB7IHRpbWVvdXQ6IEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKHJlcykgPT4ge1xuICAgICAgICByZXMucmVzdW1lKCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgICAgcmVxLm9uKCd0aW1lb3V0JywgKCkgPT4ge1xuICAgICAgICByZXEuZGVzdHJveSgpO1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufSBkaWQgbm90IHJlc3BvbmQgd2l0aGluICR7U3RyaW5nKEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLiBJcyB0aGUgQXBwaXVtIHNlcnZlciBydW5uaW5nP2BcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJlcS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IHJlYWNoIEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufTogJHtlcnIubWVzc2FnZX0uIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVOZXdTZXNzaW9uKG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gICAgdGhpcy5sb2coYENyZWF0aW5nIEFwcGl1bVRyYW5zcG9ydCAodXJsPSR7b3B0aW9ucy5hcHBpdW1Vcmx9LCBhdmQ9JHtvcHRpb25zLmF2ZE5hbWV9KWApO1xuXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRpb25zLmFwcGl1bVVybCk7XG5cbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHVybC5wb3J0KTtcbiAgICBpZiAoaXNOYU4ocG9ydCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwb3J0IGluIGFwcGl1bVVybDogJHt1cmwucG9ydH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcHBJZCA9IG9wdGlvbnMuYXBwSWQgPz8gQVBQX1BBQ0tBR0U7XG5cbiAgICBsZXQgYXBwaXVtUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuICAgIGxldCBlbXVsYXRvclByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN0YXJ0QXBwaXVtQW5kRW11bGF0b3Ioe1xuICAgICAgICBhcHBpdW1Vcmw6IHVybCxcbiAgICAgICAgYXZkTmFtZTogb3B0aW9ucy5hdmROYW1lLFxuICAgICAgICBwb3J0LFxuICAgICAgICBzaG91bGRBdXRvU3RhcnRBcHBpdW06IG9wdGlvbnMuc2hvdWxkQXV0b1N0YXJ0QXBwaXVtXG4gICAgICB9KTtcblxuICAgICAgYXBwaXVtUHJvY2VzcyA9IHJlc3VsdC5hcHBpdW1Qcm9jZXNzO1xuICAgICAgZW11bGF0b3JQcm9jZXNzID0gcmVzdWx0LmVtdWxhdG9yUHJvY2VzcztcbiAgICAgIGNvbnN0IGFjdHVhbERldmljZUlkID0gcmVzdWx0LmFjdHVhbERldmljZUlkO1xuXG4gICAgICB0aGlzLmxvZyhcbiAgICAgICAgYENvbm5lY3RpbmcgdG8gQXBwaXVtIChkZXZpY2U9JHthY3R1YWxEZXZpY2VJZH0sIGFwcD0ke2FwcElkfSwgcmV0cnlUaW1lb3V0OiAke1N0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMsIHJldHJpZXM6ICR7U3RyaW5nKEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UKX0pLi4uYFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCByZW1vdGUoe1xuICAgICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICAnYXBwaXVtOmFwcEFjdGl2aXR5JzogQVBQX0FDVElWSVRZLFxuICAgICAgICAgICdhcHBpdW06YXBwUGFja2FnZSc6IGFwcElkLFxuICAgICAgICAgICdhcHBpdW06YXV0b0dyYW50UGVybWlzc2lvbnMnOiB0cnVlLFxuICAgICAgICAgICdhcHBpdW06YXV0b21hdGlvbk5hbWUnOiAnVWlBdXRvbWF0b3IyJyxcbiAgICAgICAgICAnYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0JzogQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAnYXBwaXVtOm5vUmVzZXQnOiB0cnVlLFxuICAgICAgICAgICdhcHBpdW06dWRpZCc6IGFjdHVhbERldmljZUlkLFxuICAgICAgICAgICdhcHBpdW06dWlhdXRvbWF0b3IyU2VydmVySW5zdGFsbFRpbWVvdXQnOiBTRVJWRVJfSU5TVEFMTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAnYXBwaXVtOnVpYXV0b21hdG9yMlNlcnZlckxhdW5jaFRpbWVvdXQnOiBTRVJWRVJfTEFVTkNIX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgICAgICdwbGF0Zm9ybU5hbWUnOiAnQW5kcm9pZCdcbiAgICAgICAgfSxcbiAgICAgICAgY29ubmVjdGlvblJldHJ5Q291bnQ6IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5ULFxuICAgICAgICBjb25uZWN0aW9uUmV0cnlUaW1lb3V0OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgaG9zdG5hbWU6IHVybC5ob3N0bmFtZSxcbiAgICAgICAgbG9nTGV2ZWw6ICd3YXJuJyxcbiAgICAgICAgcGF0aDogdXJsLnBhdGhuYW1lLFxuICAgICAgICBwb3J0LFxuICAgICAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBzdHJpcEZvcmJpZGRlbkZldGNoSGVhZGVyc1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubG9nKCdBcHBpdW0gc2Vzc2lvbiBlc3RhYmxpc2hlZC4nKTtcbiAgICAgIGNvbnN0IGFwcGl1bVRyYW5zcG9ydCA9IG5ldyBBcHBpdW1UcmFuc3BvcnQoe1xuICAgICAgICBhcHBJZCxcbiAgICAgICAgYnJvd3NlcixcbiAgICAgICAgZGV2aWNlSWQ6IGFjdHVhbERldmljZUlkLFxuICAgICAgICBwbGF0Zm9ybTogJ2FuZHJvaWQnLFxuICAgICAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSksXG4gICAgICAgIC4uLihvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsRGlzcG9zZSA9IGFwcGl1bVRyYW5zcG9ydC5kaXNwb3NlLmJpbmQoYXBwaXVtVHJhbnNwb3J0KTtcbiAgICAgIGNvbnN0IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgPSBhcHBpdW1UcmFuc3BvcnQ7XG4gICAgICB0cmFuc3BvcnQuZGlzcG9zZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbERpc3Bvc2UoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdHJhbnNwb3J0LmRpc3Bvc2VTeW5jID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0cmFuc3BvcnQ7XG5cbiAgICAgIGZ1bmN0aW9uIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgICAgLy8gQ2Fubm90IHVzZSB0aGlzLmxvZyBpbnNpZGUgbmVzdGVkIGZ1bmN0aW9uIFx1MjAxNCBgdGhpc2AgaXMgbm90IGNhcHR1cmVkLlxuICAgICAgICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7b3B0aW9ucy50eXBlfV0gQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICAgICAga2lsbFByb2Nlc3NUcmVlKGVtdWxhdG9yUHJvY2Vzcyk7XG4gICAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHtvcHRpb25zLnR5cGV9XSBBdXRvLXN0YXJ0ZWQgZW11bGF0b3Igc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgIHRoaXMubG9nKCdLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgaWYgKGVtdWxhdG9yUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoZW11bGF0b3JQcm9jZXNzKTtcbiAgICAgICAgdGhpcy5sb2coJ0tpbGxlZCBhdXRvLXN0YXJ0ZWQgZW11bGF0b3IgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVEZXZpY2VDb25uZWN0ZWQoYXZkTmFtZTogc3RyaW5nKTogUHJvbWlzZTxFbnN1cmVEZXZpY2VDb25uZWN0ZWRSZXN1bHQ+IHtcbiAgICBjb25zdCBkZXZpY2VJZHNCZWZvcmUgPSBhd2FpdCB0aGlzLmdldENvbm5lY3RlZERldmljZUlkcygpO1xuICAgIHRoaXMubG9nKGBDaGVja2luZyBleGlzdGluZyBkZXZpY2VzIGZvciBBVkQgXCIke2F2ZE5hbWV9XCIuLi4gKGNvbm5lY3RlZDogWyR7ZGV2aWNlSWRzQmVmb3JlLmpvaW4oJywgJyl9XSlgKTtcblxuICAgIGNvbnN0IGV4aXN0aW5nRGV2aWNlSWQgPSBhd2FpdCB0aGlzLmZpbmREZXZpY2VCeUF2ZE5hbWUoYXZkTmFtZSwgZGV2aWNlSWRzQmVmb3JlKTtcblxuICAgIGlmIChleGlzdGluZ0RldmljZUlkKSB7XG4gICAgICB0aGlzLmxvZyhgQVZEIFwiJHthdmROYW1lfVwiIGlzIGFscmVhZHkgcnVubmluZyBvbiBkZXZpY2UgJHtleGlzdGluZ0RldmljZUlkfSwgcmV1c2luZy5gKTtcbiAgICAgIHJldHVybiB7IGFjdHVhbERldmljZUlkOiBleGlzdGluZ0RldmljZUlkIH07XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYEFWRCBcIiR7YXZkTmFtZX1cIiBub3QgZm91bmQgb24gYW55IGV4aXN0aW5nIGRldmljZSwgc3RhcnRpbmcgYSBuZXcgZW11bGF0b3IuLi5gKTtcbiAgICBjb25zdCBlbXVsYXRvciA9IHRoaXMuc3RhcnRFbXVsYXRvcihhdmROYW1lKTtcblxuICAgIGxldCBhY3R1YWxEZXZpY2VJZDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBhY3R1YWxEZXZpY2VJZCA9IGF3YWl0IHRoaXMud2FpdEZvck5ld0RldmljZShkZXZpY2VJZHNCZWZvcmUsIGVtdWxhdG9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZW11bGF0b3Iuc3RvcENhcHR1cmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZyhgRW11bGF0b3IgXCIke2F2ZE5hbWV9XCIgc3RhcnRlZCwgZGV2aWNlICR7YWN0dWFsRGV2aWNlSWR9IGlzIGNvbm5lY3RlZC5gKTtcbiAgICByZXR1cm4geyBhY3R1YWxEZXZpY2VJZCwgZW11bGF0b3JQcm9jZXNzOiBlbXVsYXRvci5wcm9jZXNzIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmREZXZpY2VCeUF2ZE5hbWUoYXZkTmFtZTogc3RyaW5nLCBkZXZpY2VJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBmb3IgKGNvbnN0IGRldmljZUlkIG9mIGRldmljZUlkcykge1xuICAgICAgY29uc3QgcnVubmluZ0F2ZCA9IGF3YWl0IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICAgJ2FkYicsXG4gICAgICAgICAgWyctcycsIGRldmljZUlkLCAnZW11JywgJ2F2ZCcsICduYW1lJ10sXG4gICAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgICAgKF9lcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHN0ZG91dC5zcGxpdCgnXFxuJylbMF0/LnRyaW0oKSA/PyAnJyk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChydW5uaW5nQXZkID09PSBhdmROYW1lKSB7XG4gICAgICAgIHJldHVybiBkZXZpY2VJZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRDb25uZWN0ZWREZXZpY2VJZHMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZXhlY0ZpbGUoJ2FkYicsIFsnZGV2aWNlcyddLCB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKGVycm9yLCBzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuICdhZGIgZGV2aWNlcyc6ICR7ZXJyb3IubWVzc2FnZX0uIElzIEFEQiBpbnN0YWxsZWQgYW5kIGluIFBBVEg/YCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RkZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2coYEFEQiBzdGRlcnI6ICR7c3RkZXJyLnRyaW0oKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHN0ZG91dCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGxpbmVzID0gb3V0cHV0LnNwbGl0KCdcXG4nKS5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKS5maWx0ZXIoKGxpbmUpID0+IGxpbmUubGVuZ3RoID4gMCk7XG4gICAgcmV0dXJuIGxpbmVzXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmluY2x1ZGVzKCdcXHRkZXZpY2UnKSlcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUuc3BsaXQoJ1xcdCcpWzBdID8/ICcnKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7dGhpcy50eXBlfV0gJHttZXNzYWdlfWApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRW11bGF0b3JCaW5hcnkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZGtSb290ID0gcHJvY2Vzcy5lbnZbJ0FORFJPSURfSE9NRSddID8/IHByb2Nlc3MuZW52WydBTkRST0lEX1NES19ST09UJ107XG4gICAgaWYgKCFzZGtSb290KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgZmluZCBBbmRyb2lkIGVtdWxhdG9yOiBuZWl0aGVyIEFORFJPSURfSE9NRSBub3IgQU5EUk9JRF9TREtfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGpvaW4oc2RrUm9vdCwgJ2VtdWxhdG9yJywgJ2VtdWxhdG9yJyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRLZXlFdmVudChkZXZpY2VJZDogc3RyaW5nLCBrZXlDb2RlOiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdpbnB1dCcsICdrZXlldmVudCcsIFN0cmluZyhrZXlDb2RlKV0sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgICBgV2FybmluZzogZmFpbGVkIHRvICR7ZGVzY3JpcHRpb259IChrZXlldmVudCAke1N0cmluZyhrZXlDb2RlKX0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydEFwcGl1bUFuZEVtdWxhdG9yKHBhcmFtczogU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyk6IFByb21pc2U8U3RhcnRBcHBpdW1BbmRFbXVsYXRvclJlc3VsdD4ge1xuICAgIGNvbnN0IHsgYXBwaXVtVXJsLCBhdmROYW1lLCBwb3J0LCBzaG91bGRBdXRvU3RhcnRBcHBpdW0gfSA9IHBhcmFtcztcblxuICAgIGxldCBuZWVkc0FwcGl1bVN0YXJ0ID0gZmFsc2U7XG5cbiAgICB0aGlzLmxvZyhgQ2hlY2tpbmcgQXBwaXVtIHNlcnZlciBhdCAke2FwcGl1bVVybC5ocmVmfS4uLmApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNoZWNrQXBwaXVtUmVhY2hhYmxlKGFwcGl1bVVybCk7XG4gICAgICB0aGlzLmxvZygnQXBwaXVtIHNlcnZlciBpcyByZWFjaGFibGUuJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChzaG91bGRBdXRvU3RhcnRBcHBpdW0gPT09IGZhbHNlKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgbmVlZHNBcHBpdW1TdGFydCA9IHRydWU7XG4gICAgfVxuXG4gICAgbGV0IGFwcGl1bVByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChuZWVkc0FwcGl1bVN0YXJ0KSB7XG4gICAgICB0aGlzLmxvZyhgQXBwaXVtIG5vdCByZWFjaGFibGUsIGF1dG8tc3RhcnRpbmcgb24gcG9ydCAke1N0cmluZyhwb3J0KX0uLi5gKTtcbiAgICAgIGFwcGl1bVByb2Nlc3MgPSB0aGlzLnN0YXJ0QXBwaXVtU2VydmVyKHBvcnQpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBbLCBkZXZpY2VSZXN1bHRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBuZWVkc0FwcGl1bVN0YXJ0XG4gICAgICAgICAgPyB0aGlzLndhaXRGb3JBcHBpdW1SZWFkeShhcHBpdW1VcmwpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2coJ0F1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGlzIHJlYWR5LicpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgICAgdGhpcy5lbnN1cmVEZXZpY2VDb25uZWN0ZWQoYXZkTmFtZSlcbiAgICAgIF0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY3R1YWxEZXZpY2VJZDogZGV2aWNlUmVzdWx0LmFjdHVhbERldmljZUlkLFxuICAgICAgICBhcHBpdW1Qcm9jZXNzLFxuICAgICAgICBlbXVsYXRvclByb2Nlc3M6IGRldmljZVJlc3VsdC5lbXVsYXRvclByb2Nlc3NcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChhcHBpdW1Qcm9jZXNzKSB7XG4gICAgICAgIGtpbGxQcm9jZXNzVHJlZShhcHBpdW1Qcm9jZXNzKTtcbiAgICAgICAgdGhpcy5sb2coJ0tpbGxlZCBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBhZnRlciBzdGFydHVwIGZhaWx1cmUuJyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0QXBwaXVtU2VydmVyKHBvcnQ6IG51bWJlcik6IENoaWxkUHJvY2VzcyB7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihgbnB4IGFwcGl1bSAtLWxvZy10aW1lc3RhbXAgLS1wb3J0ICR7U3RyaW5nKHBvcnQpfSAtLWFsbG93LWluc2VjdXJlPSR7Q0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFfWAsIHtcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAnaW5oZXJpdCcsICdpbmhlcml0J11cbiAgICB9KTtcblxuICAgIGNoaWxkLnVucmVmKCk7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEVtdWxhdG9yKGF2ZE5hbWU6IHN0cmluZyk6IEVtdWxhdG9yTGF1bmNoIHtcbiAgICBjb25zdCBlbXVsYXRvckJpbmFyeSA9IHRoaXMucmVzb2x2ZUVtdWxhdG9yQmluYXJ5KCk7XG4gICAgY29uc3QgYXJncyA9IGJ1aWxkRW11bGF0b3JBcmdzKGF2ZE5hbWUpO1xuICAgIHRoaXMubG9nKGBSdW5uaW5nOiAke2VtdWxhdG9yQmluYXJ5fSAke2FyZ3Muam9pbignICcpfWApO1xuICAgIC8qXG4gICAgICogUGlwZSAocmF0aGVyIHRoYW4gaWdub3JlKSBzdGRvdXQvc3RkZXJyIHNvIGFuIGVhcmx5IGZhaWx1cmUgc3VjaCBhc1xuICAgICAqIFwieDg2XzY0IGVtdWxhdGlvbiBjdXJyZW50bHkgcmVxdWlyZXMgaGFyZHdhcmUgYWNjZWxlcmF0aW9uXCIgY2FuIGJlXG4gICAgICogc3VyZmFjZWQgaW1tZWRpYXRlbHkgaW5zdGVhZCBvZiB3YWl0aW5nIG91dCB0aGUgZnVsbCBib290IHRpbWVvdXQuXG4gICAgICovXG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihlbXVsYXRvckJpbmFyeSwgYXJncywge1xuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ11cbiAgICB9KTtcblxuICAgIGxldCBjYXB0dXJlZE91dHB1dCA9ICcnO1xuICAgIGxldCBleGl0SW5mbzogRW11bGF0b3JFeGl0SW5mbyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaXNDYXB0dXJpbmcgPSB0cnVlO1xuXG4gICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgYXBwZW5kT3V0cHV0KTtcbiAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBhcHBlbmRPdXRwdXQpO1xuICAgIGNoaWxkLm9uY2UoJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICBleGl0SW5mbyA9IHsgY29kZSwgc2lnbmFsIH07XG4gICAgfSk7XG5cbiAgICBjaGlsZC51bnJlZigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb2Nlc3M6IGNoaWxkLFxuICAgICAgcmVhZEV4aXRJbmZvOiAoKSA9PiBleGl0SW5mbyxcbiAgICAgIHJlYWRPdXRwdXQ6ICgpID0+IGNhcHR1cmVkT3V0cHV0LFxuICAgICAgc3RvcENhcHR1cmU6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgLypcbiAgICAgICAgICogTGVhdmUgdGhlIGBkYXRhYCBsaXN0ZW5lcnMgYXR0YWNoZWQgc28gdGhlIHBpcGVzIGtlZXAgZHJhaW5pbmcgKGFcbiAgICAgICAgICogZnVsbCBPUyBwaXBlIGJ1ZmZlciB3b3VsZCBibG9jayB0aGUgbG9uZy1ydW5uaW5nIGVtdWxhdG9yKTsgdGhlIGZsYWdcbiAgICAgICAgICoganVzdCBmcmVlemVzIHRoZSBjYXB0dXJlZCB0YWlsIG9uY2Ugc3RhcnR1cCBoYXMgc3VjY2VlZGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgaXNDYXB0dXJpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gYXBwZW5kT3V0cHV0KGNodW5rOiBCdWZmZXIpOiB2b2lkIHtcbiAgICAgIGlmICghaXNDYXB0dXJpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FwdHVyZWRPdXRwdXQgPSAoY2FwdHVyZWRPdXRwdXQgKyBjaHVuay50b1N0cmluZygpKS5zbGljZSgtRU1VTEFUT1JfT1VUUFVUX1RBSUxfTUFYX0xFTkdUSCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQXBwaXVtUmVhZHkodXJsOiBVUkwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBBcHBpdW0gYXQgJHt1cmwuaHJlZn0gKHRpbWVvdXQ6ICR7U3RyaW5nKEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMsIHBvbGw6ICR7U3RyaW5nKEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQVBQSVVNX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcGl1bVJlYWNoYWJsZSh1cmwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tc2BcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQm9vdChkZXZpY2VJZDogc3RyaW5nLCBkZWFkbGluZTogbnVtYmVyLCBlbXVsYXRvcjogRW11bGF0b3JMYXVuY2gpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZW1haW5pbmdNcyA9IE1hdGgubWF4KDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSk7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGZpbmlzaCBib290aW5nIChyZW1haW5pbmc6ICR7U3RyaW5nKHJlbWFpbmluZ01zKX1tcywgcG9sbDogJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBpc0Jvb3RlZCA9IGF3YWl0IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAgICdhZGInLFxuICAgICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2dldHByb3AnLCAnc3lzLmJvb3RfY29tcGxldGVkJ10sXG4gICAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgICAgKF9lcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHN0ZG91dC50cmltKCkgPT09ICcxJyk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpc0Jvb3RlZCkge1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGJvb3QgY29tcGxldGVkLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXRJbmZvID0gZW11bGF0b3IucmVhZEV4aXRJbmZvKCk7XG4gICAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJ1aWxkRW11bGF0b3JFeGl0TWVzc2FnZShleGl0SW5mbywgZW11bGF0b3IucmVhZE91dHB1dCgpKSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBjb25uZWN0ZWQgYnV0IGRpZCBub3QgZmluaXNoIGJvb3Rpbmcgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yTmV3RGV2aWNlKGRldmljZUlkc0JlZm9yZTogc3RyaW5nW10sIGVtdWxhdG9yOiBFbXVsYXRvckxhdW5jaCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgYSBuZXcgZGV2aWNlIHRvIGFwcGVhciBpbiBBREIgKHRpbWVvdXQ6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1N0cmluZyhFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gXG4gICAgKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgY29uc3QgY3VycmVudElkcyA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGVkRGV2aWNlSWRzKCk7XG4gICAgICBjb25zdCBuZXdJZHMgPSBjdXJyZW50SWRzLmZpbHRlcigoaWQpID0+ICFkZXZpY2VJZHNCZWZvcmUuaW5jbHVkZXMoaWQpKTtcblxuICAgICAgaWYgKG5ld0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGFjdHVhbERldmljZUlkID0gbmV3SWRzWzBdID8/ICcnO1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7YWN0dWFsRGV2aWNlSWR9IGFwcGVhcmVkIGluIEFEQiwgd2FpdGluZyBmb3IgYm9vdCB0byBjb21wbGV0ZS4uLmApO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JCb290KGFjdHVhbERldmljZUlkLCBkZWFkbGluZSwgZW11bGF0b3IpO1xuICAgICAgICBhd2FpdCB0aGlzLndha2VTY3JlZW4oYWN0dWFsRGV2aWNlSWQpO1xuICAgICAgICByZXR1cm4gYWN0dWFsRGV2aWNlSWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXRJbmZvID0gZW11bGF0b3IucmVhZEV4aXRJbmZvKCk7XG4gICAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJ1aWxkRW11bGF0b3JFeGl0TWVzc2FnZShleGl0SW5mbywgZW11bGF0b3IucmVhZE91dHB1dCgpKSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTm8gbmV3IGVtdWxhdG9yIGRldmljZSBhcHBlYXJlZCB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdha2VTY3JlZW4oZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9nKGBXYWtpbmcgc2NyZWVuIG9uIGRldmljZSAke2RldmljZUlkfS4uLmApO1xuXG4gICAgYXdhaXQgdGhpcy5zZW5kS2V5RXZlbnQoZGV2aWNlSWQsIEtFWUNPREVfV0FLRVVQLCAnd2FrZSBzY3JlZW4nKTtcbiAgICBhd2FpdCB0aGlzLnNlbmRLZXlFdmVudChkZXZpY2VJZCwgS0VZQ09ERV9NRU5VLCAnZGlzbWlzcyBsb2NrIHNjcmVlbicpO1xuXG4gICAgdGhpcy5sb2coYFNjcmVlbiB3YWtlIGNvbXBsZXRlIG9uIGRldmljZSAke2RldmljZUlkfS5gKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUcmFuc3BvcnQgY29uZmlndXJhdGlvbi4gRGVmYXVsdHMgdG8gQ0xJIHRyYW5zcG9ydC5cbiAqIEByZXR1cm5zIEEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGNvbnN0IHR5cGUgPSBvcHRpb25zPy50eXBlID8/IERFRkFVTFRfVFJBTlNQT1JUX1RZUEU7XG5cbiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudHlwZSA9PT0gJ29ic2lkaWFuLWNsaScpIHtcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeToke3R5cGV9XSBDcmVhdGluZyBEZXNrdG9wQ2xpVHJhbnNwb3J0YCk7XG4gICAgcmV0dXJuIG5ldyBEZXNrdG9wQ2xpVHJhbnNwb3J0KCk7XG4gIH1cblxuICBpZiAob3B0aW9ucy50eXBlID09PSAnb2JzaWRpYW4tY2RwJykge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7dHlwZX1dIENyZWF0aW5nIERlc2t0b3BDZHBUcmFuc3BvcnQgKGhvc3Q9JHtvcHRpb25zLmhvc3QgPz8gJ2xvY2FsaG9zdCd9LCBwb3J0PSR7U3RyaW5nKG9wdGlvbnMucG9ydCA/PyBDRFBfREVGQVVMVF9QT1JUKX0pYCk7XG4gICAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KHtcbiAgICAgIC4uLihvcHRpb25zLmhvc3QgIT09IHVuZGVmaW5lZCAmJiB7IGNkcEhvc3Q6IG9wdGlvbnMuaG9zdCB9KSxcbiAgICAgIC4uLihvcHRpb25zLnBvcnQgIT09IHVuZGVmaW5lZCAmJiB7IGNkcFBvcnQ6IG9wdGlvbnMucG9ydCB9KSxcbiAgICAgIC4uLihvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5KHR5cGUpO1xuICByZXR1cm4gZmFjdG9yeS5jcmVhdGUob3B0aW9ucyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhY2hlZCB0cmFuc3BvcnQgaW5zdGFuY2UsIGNyZWF0aW5nIG9uZSBmcm9tIHRoZSBnaXZlbiBvcHRpb25zXG4gKiBpZiBub3QgYWxyZWFkeSBjYWNoZWQuXG4gKlxuICogVGhlIHRyYW5zcG9ydCBpcyBjYWNoZWQgcGVyIHdvcmtlciBwcm9jZXNzIHNvIFdlYlNvY2tldC9BcHBpdW0gc2Vzc2lvbnNcbiAqIGFyZSByZXVzZWQgYWNyb3NzIGNhbGxzIHdpdGhpbiB0aGUgc2FtZSB0ZXN0IHdvcmtlci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBDTEkgdHJhbnNwb3J0LlxuICogQHJldHVybnMgVGhlIGNhY2hlZCBvciBuZXdseSBjcmVhdGVkIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlVHJhbnNwb3J0KG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGlmIChjYWNoZWRUcmFuc3BvcnQpIHtcbiAgICByZXR1cm4gY2FjaGVkVHJhbnNwb3J0O1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzIC0tIFNpbmdsZS10aHJlYWRlZCB3b3JrZXI7IG5vIGNvbmN1cnJlbnQgd3JpdGVzLlxuICBjYWNoZWRUcmFuc3BvcnQgPSByZXN1bHQ7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZSBmb3IgYW4gZW11bGF0b3IgcHJvY2VzcyB0aGF0IGV4aXRlZCBkdXJpbmdcbiAqIHN0YXJ0dXAsIGFwcGVuZGluZyB0aGUgY2FwdHVyZWQgb3V0cHV0IHRhaWwgd2hlbiBhdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIGV4aXRJbmZvIC0gVGhlIGVtdWxhdG9yJ3MgZXhpdCBkZXRhaWxzLlxuICogQHBhcmFtIG91dHB1dCAtIFRoZSBjYXB0dXJlZCBzdGRvdXQrc3RkZXJyIHRhaWwuXG4gKiBAcmV0dXJucyBBIGh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkRW11bGF0b3JFeGl0TWVzc2FnZShleGl0SW5mbzogRW11bGF0b3JFeGl0SW5mbywgb3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWFzb24gPSBleGl0SW5mby5zaWduYWwgPT09IG51bGxcbiAgICA/IGBleGl0ZWQgcHJlbWF0dXJlbHkgd2l0aCBjb2RlICR7U3RyaW5nKGV4aXRJbmZvLmNvZGUpfWBcbiAgICA6IGB3YXMgdGVybWluYXRlZCBieSBzaWduYWwgJHtleGl0SW5mby5zaWduYWx9YDtcbiAgY29uc3QgdHJpbW1lZE91dHB1dCA9IG91dHB1dC50cmltKCk7XG4gIGNvbnN0IGRldGFpbHMgPSB0cmltbWVkT3V0cHV0Lmxlbmd0aCA+IDBcbiAgICA/IGBcXG5cXG5FbXVsYXRvciBvdXRwdXQgKHRhaWwpOlxcbiR7dHJpbW1lZE91dHB1dH1gXG4gICAgOiAnJztcbiAgcmV0dXJuIGBBbmRyb2lkIGVtdWxhdG9yICR7cmVhc29ufSBkdXJpbmcgc3RhcnR1cC4ke2RldGFpbHN9YDtcbn1cblxuLyoqXG4gKiBLaWxscyBhIGNoaWxkIHByb2Nlc3MgYW5kIGl0cyBlbnRpcmUgcHJvY2VzcyB0cmVlLlxuICpcbiAqIE9uIFdpbmRvd3MsIGBjaGlsZC5raWxsKClgIG9ubHkgc2VuZHMgU0lHVEVSTSB0byB0aGUgZGlyZWN0IHByb2Nlc3MsXG4gKiBsZWF2aW5nIHNwYXduZWQgZ3JhbmRjaGlsZHJlbiAoZS5nLiBRRU1VLCBVaUF1dG9tYXRvcikgYWxpdmUuXG4gKiBgdGFza2tpbGwgL0YgL1QgL1BJRGAgZm9yY2VmdWxseSB0ZXJtaW5hdGVzIHRoZSBlbnRpcmUgdHJlZS5cbiAqXG4gKiBAcGFyYW0gY2hpbGQgLSBUaGUgY2hpbGQgcHJvY2VzcyB0byBraWxsLlxuICovXG5mdW5jdGlvbiBraWxsUHJvY2Vzc1RyZWUoY2hpbGQ6IENoaWxkUHJvY2Vzcyk6IHZvaWQge1xuICBpZiAoY2hpbGQucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHRyeSB7XG4gICAgICBleGVjRmlsZVN5bmMoJ3Rhc2traWxsJywgWycvRicsICcvVCcsICcvUElEJywgU3RyaW5nKGNoaWxkLnBpZCldLCB7IHN0ZGlvOiAnaWdub3JlJyB9KTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKFxuICAgICAgICBgW3RyYW5zcG9ydC1mYWN0b3J5XSB0YXNra2lsbCBmb3IgUElEICR7U3RyaW5nKGNoaWxkLnBpZCl9IGZhaWxlZCAobWF5IGhhdmUgYWxyZWFkeSBleGl0ZWQpOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNoaWxkLmtpbGwoJ1NJR0tJTEwnKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZXMgYENvbm5lY3Rpb25gIGFuZCBgQ29udGVudC1MZW5ndGhgIGZyb20gYSBXZWJEcml2ZXIgcmVxdWVzdCdzIGhlYWRlcnMuXG4gKlxuICogVGhlIGJ1bmRsZWQgYHdlYmRyaXZlcmAgcGFja2FnZSBzZXRzIGJvdGggaGVhZGVycyBleHBsaWNpdGx5LiBUaGV5IGFyZVxuICogZm9yYmlkZGVuIHJlcXVlc3QgaGVhZGVycyBwZXIgdGhlIEZldGNoIHNwZWM6IE5vZGUgdXAgdG8gMjUgYWNjZXB0ZWQgdGhlbVxuICogc2lsZW50bHksIGJ1dCBOb2RlIDI2IHJlamVjdHMgdGhlbSB3aXRoIGBVTkRfRVJSX0lOVkFMSURfQVJHYCwgYnJlYWtpbmcgdGhlXG4gKiBBcHBpdW0gYC9zZXNzaW9uYCByZXF1ZXN0LiBUaGUgdHJhbnNwb3J0IGxheWVyIG1hbmFnZXMgY29ubmVjdGlvbiByZXVzZSBhbmRcbiAqIHRoZSBGZXRjaCBBUEkgY29tcHV0ZXMgYENvbnRlbnQtTGVuZ3RoYCBmcm9tIHRoZSBib2R5LCBzbyBkcm9wcGluZyBib3RoIGlzXG4gKiBzYWZlIG9uIGV2ZXJ5IE5vZGUgdmVyc2lvbi4gU2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vd2ViZHJpdmVyaW8vd2ViZHJpdmVyaW8vaXNzdWVzLzE1MjY1fS5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdE9wdGlvbnMgLSBUaGUgcmVxdWVzdCBvcHRpb25zIGFib3V0IHRvIGJlIHNlbnQgYnkgV2ViRHJpdmVySU8uXG4gKiBAcmV0dXJucyBUaGUgc2FtZSByZXF1ZXN0IG9wdGlvbnMgd2l0aCB0aGUgZm9yYmlkZGVuIGhlYWRlcnMgcmVtb3ZlZC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBGb3JiaWRkZW5GZXRjaEhlYWRlcnMocmVxdWVzdE9wdGlvbnM6IFJlcXVlc3RJbml0KTogUmVxdWVzdEluaXQge1xuICBpZiAocmVxdWVzdE9wdGlvbnMuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICByZXF1ZXN0T3B0aW9ucy5oZWFkZXJzLmRlbGV0ZSgnQ29ubmVjdGlvbicpO1xuICAgIHJlcXVlc3RPcHRpb25zLmhlYWRlcnMuZGVsZXRlKCdDb250ZW50LUxlbmd0aCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlcXVlc3RPcHRpb25zO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBVUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsT0FBTyxVQUFVO0FBQ2pCLFNBQVMsWUFBWTtBQUNyQixPQUFPLGFBQWE7QUFDcEI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFRUCxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLFdBQVc7QUFDcEIsU0FB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
|
|
@@ -12,11 +12,11 @@ export interface ObsidianAndroidAppiumTransportOptions {
|
|
|
12
12
|
* App package (Android) or bundle ID (iOS).
|
|
13
13
|
* Defaults to `'md.obsidian'`
|
|
14
14
|
*/
|
|
15
|
-
appId?: string;
|
|
15
|
+
readonly appId?: string;
|
|
16
16
|
/**
|
|
17
17
|
* The Appium server URL (e.g. `'http://localhost:4723'`).
|
|
18
18
|
*/
|
|
19
|
-
appiumUrl: string;
|
|
19
|
+
readonly appiumUrl: string;
|
|
20
20
|
/**
|
|
21
21
|
* The Android AVD (Android Virtual Device) name.
|
|
22
22
|
*
|
|
@@ -26,7 +26,7 @@ export interface ObsidianAndroidAppiumTransportOptions {
|
|
|
26
26
|
*
|
|
27
27
|
* Run `emulator -list-avds` to see available AVD names.
|
|
28
28
|
*/
|
|
29
|
-
avdName: string;
|
|
29
|
+
readonly avdName: string;
|
|
30
30
|
/**
|
|
31
31
|
* The device UDID to reuse (e.g. `'emulator-5554'`).
|
|
32
32
|
*
|
|
@@ -34,7 +34,7 @@ export interface ObsidianAndroidAppiumTransportOptions {
|
|
|
34
34
|
* established. When present alongside {@link sessionId}, the transport
|
|
35
35
|
* factory skips emulator startup and attaches to the existing session.
|
|
36
36
|
*/
|
|
37
|
-
deviceId?: string;
|
|
37
|
+
readonly deviceId?: string;
|
|
38
38
|
/**
|
|
39
39
|
* An existing Appium session ID to reattach to.
|
|
40
40
|
*
|
|
@@ -43,7 +43,7 @@ export interface ObsidianAndroidAppiumTransportOptions {
|
|
|
43
43
|
* When present, the transport factory uses WebDriverIO's `attach()` instead
|
|
44
44
|
* of creating a new session, avoiding duplicate Appium/ADB connections.
|
|
45
45
|
*/
|
|
46
|
-
sessionId?: string;
|
|
46
|
+
readonly sessionId?: string;
|
|
47
47
|
/**
|
|
48
48
|
* Whether to automatically start the Appium server if it is not reachable.
|
|
49
49
|
*
|
|
@@ -53,11 +53,11 @@ export interface ObsidianAndroidAppiumTransportOptions {
|
|
|
53
53
|
*
|
|
54
54
|
* @default `true`
|
|
55
55
|
*/
|
|
56
|
-
shouldAutoStartAppium?: boolean;
|
|
56
|
+
readonly shouldAutoStartAppium?: boolean;
|
|
57
57
|
/**
|
|
58
58
|
* Discriminant for the transport type.
|
|
59
59
|
*/
|
|
60
|
-
type: 'obsidian-android-appium';
|
|
60
|
+
readonly type: 'obsidian-android-appium';
|
|
61
61
|
/**
|
|
62
62
|
* Base path on the device where Obsidian stores vaults.
|
|
63
63
|
*
|
|
@@ -65,7 +65,7 @@ export interface ObsidianAndroidAppiumTransportOptions {
|
|
|
65
65
|
* - Android: `/sdcard/Documents/`
|
|
66
66
|
* - iOS: `@md.obsidian:documents/`
|
|
67
67
|
*/
|
|
68
|
-
vaultBasePath?: string;
|
|
68
|
+
readonly vaultBasePath?: string;
|
|
69
69
|
/**
|
|
70
70
|
* Timeout in milliseconds for waiting for the WebView context to become available.
|
|
71
71
|
*
|
|
@@ -75,7 +75,7 @@ export interface ObsidianAndroidAppiumTransportOptions {
|
|
|
75
75
|
*
|
|
76
76
|
* @default `60000`
|
|
77
77
|
*/
|
|
78
|
-
webviewTimeoutInMilliseconds?: number;
|
|
78
|
+
readonly webviewTimeoutInMilliseconds?: number;
|
|
79
79
|
}
|
|
80
80
|
/**
|
|
81
81
|
* Transport options for desktop testing via Chrome DevTools Protocol.
|
|
@@ -85,21 +85,21 @@ export interface ObsidianCdpTransportOptions {
|
|
|
85
85
|
* Timeout in milliseconds for individual CDP commands.
|
|
86
86
|
* Defaults to 30000
|
|
87
87
|
*/
|
|
88
|
-
commandTimeoutInMilliseconds?: number;
|
|
88
|
+
readonly commandTimeoutInMilliseconds?: number;
|
|
89
89
|
/**
|
|
90
90
|
* CDP host.
|
|
91
91
|
* Defaults to `'localhost'`
|
|
92
92
|
*/
|
|
93
|
-
host?: string;
|
|
93
|
+
readonly host?: string;
|
|
94
94
|
/**
|
|
95
95
|
* CDP port.
|
|
96
96
|
* Defaults to 8315
|
|
97
97
|
*/
|
|
98
|
-
port?: number;
|
|
98
|
+
readonly port?: number;
|
|
99
99
|
/**
|
|
100
100
|
* Discriminant for the transport type.
|
|
101
101
|
*/
|
|
102
|
-
type: 'obsidian-cdp';
|
|
102
|
+
readonly type: 'obsidian-cdp';
|
|
103
103
|
}
|
|
104
104
|
/**
|
|
105
105
|
* Transport options for desktop testing via the Obsidian CLI.
|
|
@@ -110,7 +110,7 @@ export interface ObsidianCliTransportOptions {
|
|
|
110
110
|
/**
|
|
111
111
|
* Discriminant for the transport type.
|
|
112
112
|
*/
|
|
113
|
-
type: 'obsidian-cli';
|
|
113
|
+
readonly type: 'obsidian-cli';
|
|
114
114
|
}
|
|
115
115
|
/**
|
|
116
116
|
* Discriminated union of all supported transport configurations.
|