obsidian-integration-testing 13.0.0 → 14.0.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/dist/lib/cjs/app-config.cjs +1 -1
- package/dist/lib/cjs/app-config.d.cts +25 -25
- package/dist/lib/cjs/connect-to-cdp.cjs +1 -1
- package/dist/lib/cjs/connect-to-cdp.d.cts +4 -4
- package/dist/lib/cjs/demo-vault-bootstrap.cjs +1 -1
- package/dist/lib/cjs/demo-vault-bootstrap.d.cts +10 -2
- package/dist/lib/cjs/device-settings.cjs +1 -1
- package/dist/lib/cjs/device-settings.d.cts +1 -1
- package/dist/lib/cjs/emulator-reaper.cjs +1 -1
- package/dist/lib/cjs/emulator-reaper.d.cts +2 -2
- package/dist/lib/cjs/enable-plugin.cjs +1 -1
- package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/eval-in-obsidian.d.cts +12 -12
- package/dist/lib/cjs/generate-function-call.cjs +1 -1
- package/dist/lib/cjs/generate-function-call.d.cts +2 -2
- package/dist/lib/cjs/index.cjs +1 -1
- package/dist/lib/cjs/index.d.cts +4 -4
- package/dist/lib/cjs/jest/global-setup.cjs +1 -1
- package/dist/lib/cjs/jest/global-setup.d.cts +3 -3
- package/dist/lib/cjs/leftover-cleanup.cjs +1 -1
- package/dist/lib/cjs/leftover-cleanup.d.cts +2 -2
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/namespace-bootstrap.cjs +1 -1
- package/dist/lib/cjs/obsidian-instance.cjs +1 -1
- package/dist/lib/cjs/obsidian-instance.d.cts +3 -3
- package/dist/lib/cjs/open-obsidian-settings-tab.cjs +3 -3
- package/dist/lib/cjs/open-obsidian-settings-tab.d.cts +4 -4
- package/dist/lib/cjs/parent-liveness.cjs +1 -1
- package/dist/lib/cjs/parent-liveness.d.cts +1 -1
- package/dist/lib/cjs/poll-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/poll-in-obsidian.d.cts +3 -3
- package/dist/lib/cjs/poll-until.cjs +1 -1
- package/dist/lib/cjs/poll-until.d.cts +4 -4
- package/dist/lib/cjs/process-capture.cjs +1 -1
- package/dist/lib/cjs/process-capture.d.cts +3 -3
- package/dist/lib/cjs/run-version-matrix.cjs +1 -1
- package/dist/lib/cjs/run-version-matrix.d.cts +1 -1
- package/dist/lib/cjs/setup-lock.cjs +1 -1
- package/dist/lib/cjs/setup-lock.d.cts +1 -1
- package/dist/lib/cjs/sharp-loader.cjs +1 -1
- package/dist/lib/cjs/sharp-loader.d.cts +6 -6
- package/dist/lib/cjs/temporary-vault.cjs +2 -3
- package/dist/lib/cjs/temporary-vault.d.cts +4 -4
- package/dist/lib/cjs/transport-appium.cjs +1 -1
- package/dist/lib/cjs/transport-factory.cjs +1 -1
- package/dist/lib/cjs/transport.cjs +1 -1
- package/dist/lib/cjs/transport.d.cts +10 -10
- package/dist/lib/cjs/version-matrix.cjs +1 -1
- package/dist/lib/cjs/version-matrix.d.cts +2 -2
- package/dist/lib/cjs/vitest/global-setup.cjs +1 -1
- package/dist/lib/cjs/vitest/global-setup.d.cts +3 -3
- package/dist/lib/esm/app-config.d.mts +25 -25
- package/dist/lib/esm/app-config.mjs +1 -1
- package/dist/lib/esm/connect-to-cdp.d.mts +4 -4
- package/dist/lib/esm/connect-to-cdp.mjs +1 -1
- package/dist/lib/esm/demo-vault-bootstrap.d.mts +10 -2
- package/dist/lib/esm/demo-vault-bootstrap.mjs +1 -1
- package/dist/lib/esm/device-settings.d.mts +1 -1
- package/dist/lib/esm/device-settings.mjs +1 -1
- package/dist/lib/esm/emulator-reaper.d.mts +2 -2
- package/dist/lib/esm/emulator-reaper.mjs +1 -1
- package/dist/lib/esm/enable-plugin.mjs +1 -1
- package/dist/lib/esm/eval-in-obsidian.d.mts +12 -12
- package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
- package/dist/lib/esm/generate-function-call.d.mts +2 -2
- package/dist/lib/esm/generate-function-call.mjs +1 -1
- package/dist/lib/esm/index.d.mts +4 -4
- package/dist/lib/esm/index.mjs +1 -1
- package/dist/lib/esm/jest/global-setup.d.mts +3 -3
- package/dist/lib/esm/jest/global-setup.mjs +1 -1
- package/dist/lib/esm/leftover-cleanup.d.mts +2 -2
- package/dist/lib/esm/leftover-cleanup.mjs +1 -1
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/namespace-bootstrap.mjs +1 -1
- package/dist/lib/esm/obsidian-instance.d.mts +3 -3
- package/dist/lib/esm/obsidian-instance.mjs +1 -1
- package/dist/lib/esm/open-obsidian-settings-tab.d.mts +4 -4
- package/dist/lib/esm/open-obsidian-settings-tab.mjs +3 -3
- package/dist/lib/esm/parent-liveness.d.mts +1 -1
- package/dist/lib/esm/parent-liveness.mjs +1 -1
- package/dist/lib/esm/poll-in-obsidian.d.mts +3 -3
- package/dist/lib/esm/poll-in-obsidian.mjs +1 -1
- package/dist/lib/esm/poll-until.d.mts +4 -4
- package/dist/lib/esm/poll-until.mjs +1 -1
- package/dist/lib/esm/process-capture.d.mts +3 -3
- package/dist/lib/esm/process-capture.mjs +1 -1
- package/dist/lib/esm/run-version-matrix.d.mts +1 -1
- package/dist/lib/esm/run-version-matrix.mjs +1 -1
- package/dist/lib/esm/setup-lock.d.mts +1 -1
- package/dist/lib/esm/setup-lock.mjs +1 -1
- package/dist/lib/esm/sharp-loader.d.mts +6 -6
- package/dist/lib/esm/sharp-loader.mjs +1 -1
- package/dist/lib/esm/temporary-vault.d.mts +4 -4
- package/dist/lib/esm/temporary-vault.mjs +2 -3
- package/dist/lib/esm/transport-appium.mjs +1 -1
- package/dist/lib/esm/transport-factory.mjs +1 -1
- package/dist/lib/esm/transport.d.mts +10 -10
- package/dist/lib/esm/version-matrix.d.mts +2 -2
- package/dist/lib/esm/version-matrix.mjs +1 -1
- package/dist/lib/esm/vitest/global-setup.d.mts +3 -3
- package/dist/lib/esm/vitest/global-setup.mjs +1 -1
- package/package.json +1 -1
|
@@ -102,4 +102,4 @@ export {
|
|
|
102
102
|
sweepHostLeftovers,
|
|
103
103
|
willSweepLeftovers
|
|
104
104
|
};
|
|
105
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2xlZnRvdmVyLWNsZWFudXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTd2VlcHMgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcmllcyBhIHByZXZpb3VzIGludGVncmF0aW9uIHJ1biBsZWFrZWQgXHUyMDE0IHRoZVxuICogYHRlbXAtdmF1bHQtKmAgc3RhZ2luZy92YXVsdCBkaXJlY3RvcmllcyBhbmQgdGhlIG93bmVkIGluc3RhbmNlJ3NcbiAqIGB1c2VyZGF0YS0qYCBDaHJvbWl1bSBwcm9maWxlcy5cbiAqXG4gKiBBIHJ1biB0aGF0IGRpZXMgbWlkLWZsaWdodCBjYW5ub3QgY2xlYW4gdXAgYWZ0ZXIgaXRzZWxmOiBvbiBBbmRyb2lkIHRoZVxuICogdGVhcmRvd24gdGFsa3MgdG8gdGhlIFdlYlZpZXcsIGFuZCBhIGRlYWQgV2ViVmlldyBpcyBleGFjdGx5IHdoYXQgbW9zdFxuICogZmFpbHVyZXMgYXJlIChgVmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogbm8gc3VjaCB3aW5kb3dgKS4gRXZlcnlcbiAqIGZhaWx1cmUgdGhlcmVmb3JlIGxlYWtzIGEgdmF1bHQsIGV2ZXJ5IGxlYWtlZCB2YXVsdCBzdGF5cyByZWdpc3RlcmVkIGZvclxuICogT2JzaWRpYW4gdG8gZW51bWVyYXRlIGF0IHN0YXJ0dXAsIGFuZCB0aGF0IGVudW1lcmF0aW9uIGhhcyB0byBmaW5pc2ggaW5zaWRlXG4gKiB0aGUgV2ViVmlldy1yZWFkaW5lc3MgYnVkZ2V0IFx1MjAxNCBzbyBlYWNoIGZhaWx1cmUgbWFrZXMgdGhlIG5leHQgb25lIGxpa2VsaWVyLlxuICogU3dlZXBpbmcgZm9yZWlnbiByZXNpZHVlIGF0IHRoZSBTVEFSVCBvZiBhIHJ1biBicmVha3MgdGhhdCBsb29wLCBiZWNhdXNlIGl0XG4gKiBydW5zIGJlZm9yZSBhbnl0aGluZyB0aGF0IGNhbiBkaWUuXG4gKlxuICogVGhlIHR3byBzaWRlcyB1c2UgZGVsaWJlcmF0ZWx5IGRpZmZlcmVudCBzYWZldHkgZ2F0ZXMgKHNlZSB0aGUgcmVwbydzIEwzMSk6XG4gKlxuICogLSAqKkRldmljZSAoQW5kcm9pZCkqKiBcdTIwMTQgdW5jb25kaXRpb25hbC4gQW5kcm9pZCBydW5zIGhvbGQgdGhlIGV4Y2x1c2l2ZVxuICogICBgYW5kcm9pZGAgc2V0dXAgbG9jaywgc28gbm8gY29uY3VycmVudCBydW4gY2FuIG93biBhIGRldmljZSB2YXVsdCwgYW5kIGFuXG4gKiAgIGFnZSBnYXRlIHdvdWxkIGxldCBhIHZhdWx0IGxlYWtlZCB0ZW4gbWludXRlcyBhZ28gc3Vydml2ZSBpbnRvIHRoZSBuZXh0IHJ1bi5cbiAqIC0gKipIb3N0KiogXHUyMDE0IGFnZS1nYXRlZC4gRGVza3RvcCBydW5zIGFyZSBkZWxpYmVyYXRlbHkgKm5vdCogc2VyaWFsaXplZCAoZWFjaFxuICogICBvd25zIGFuIGlzb2xhdGVkIGluc3RhbmNlKSBhbmQgZXZlcnkgcHJvamVjdCBvbiB0aGUgbWFjaGluZSBzaGFyZXMgb25lXG4gKiAgIGB0bXBkaXIoKWAsIHNvIGEgZGlyZWN0b3J5IHlvdW5nIGVub3VnaCB0byBiZWxvbmcgdG8gYSBsaXZlIHJ1biBpcyBsZWZ0XG4gKiAgIGFsb25lLlxuICovXG5cbmltcG9ydCB7XG4gIHJlYWRkaXIsXG4gIHJtLFxuICBzdGF0XG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5cbi8qKlxuICogRGVmYXVsdCBmb3IgdGhlIGBsZWZ0b3Zlck1heEFnZUluTWlsbGlzZWNvbmRzYCB0cmFuc3BvcnQgb3B0aW9uIFx1MjAxNCB0d28gaG91cnMuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0xFRlRPVkVSX01BWF9BR0VfSU5fTUlMTElTRUNPTkRTID0gN18yMDBfMDAwO1xuXG4vKipcbiAqIE5hbWUgb2YgdGhlIGhhcm5lc3MncyBvd24gZGlyZWN0b3J5IGluc2lkZSB7QGxpbmsgdG1wZGlyfSwgd2hpY2ggaG9sZHMgdGhlXG4gKiBvd25lZCBpbnN0YW5jZXMnIHVzZXItZGF0YSBkaXJlY3RvcmllcyBhbG9uZ3NpZGUgdGhlIHZlcnNpb24vaW5zdGFsbGVyIGNhY2hlc1xuICogYW5kIHRoZSBzZXR1cCBsb2Nrcy5cbiAqL1xuZXhwb3J0IGNvbnN0IEhBUk5FU1NfVEVNUF9ESVJfTkFNRSA9ICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJztcblxuLyoqXG4gKiBQcmVmaXggb2YgYW4gb3duZWQgZGVza3RvcCBpbnN0YW5jZSdzIGlzb2xhdGVkIHVzZXItZGF0YSBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBjb25zdCBPV05FRF9VU0VSX0RBVEFfRElSX1BSRUZJWCA9ICd1c2VyZGF0YS0nO1xuXG4vKipcbiAqIFByZWZpeCBvZiBhIHRlbXBvcmFyeSB2YXVsdCBkaXJlY3RvcnksIGJvdGggb24gdGhlIGhvc3QgKHdoZXJlIGl0IGlzIGNyZWF0ZWQpXG4gKiBhbmQgb24gYW4gQW5kcm9pZCBkZXZpY2UgKHdoZXJlIGl0IGtlZXBzIGl0cyBob3N0IGJhc2VuYW1lKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFRFTVBfVkFVTFRfRElSX1BSRUZJWCA9ICd0ZW1wLXZhdWx0LSc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNoZWNrSXNMZWZ0b3ZlclN0YWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGVja0lzTGVmdG92ZXJTdGFsZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBIb3cgb2xkIGFuIGVudHJ5IG11c3QgYmUgdG8gY291bnQgYXMgc3RhbGUuIGAwYCBkaXNhYmxlcyB0aGUgZ2F0ZSwgbWFraW5nXG4gICAqIGV2ZXJ5IGVudHJ5IHN0YWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4QWdlSW5NaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKipcbiAgVGhlIGVudHJ5J3MgbW9kaWZpY2F0aW9uIHRpbWUsIGluIGVwb2NoIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIHJlYWRvbmx5IG1vZGlmaWVkQXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgY3VycmVudCB0aW1lLCBpbiBlcG9jaCBtaWxsaXNlY29uZHMuXG4gICAqL1xuICByZWFkb25seSBub3dJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBmaWx0ZXJMZWZ0b3Zlck5hbWVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJMZWZ0b3Zlck5hbWVzUGFyYW1zIHtcbiAgLyoqXG4gIE5hbWVzIHRvIGtlZXAgZXZlbiB3aGVuIHRoZXkgbWF0Y2ggYSBwcmVmaXggKGUuZy4gdGhlIGN1cnJlbnQgcnVuJ3Mgb3duIHZhdWx0KS5cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkTmFtZXM/OiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmF3IGVudHJ5IG5hbWVzLiBBY2NlcHRzIGBhZGIgc2hlbGwgbHNgIG91dHB1dCBzcGxpdCBpbnRvIGxpbmVzLCBzbyBlYWNoXG4gICAqIG5hbWUgaXMgdHJpbW1lZCAoZHJvcHBpbmcgdGhlIHRyYWlsaW5nIGBcXHJgIGFuIGBhZGJgIHNoZWxsIGFkZHMgb24gV2luZG93cylcbiAgICogYW5kIGJsYW5rIGxpbmVzIGFyZSBkcm9wcGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICBEaXJlY3RvcnktbmFtZSBwcmVmaXhlcyB0aGF0IG1hcmsgYW4gZW50cnkgYXMgdGhlIGhhcm5lc3MncyBvd24gcmVzaWR1ZS5cbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeGVzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIGRpcmVjdG9yeSB0aGUgaG9zdCBzd2VlcCBzY2FucywgdG9nZXRoZXIgd2l0aCB0aGUgcHJlZml4ZXMgdGhhdCBtYXJrXG4gKiByZXNpZHVlIGluc2lkZSBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMZWZ0b3ZlclJvb3Qge1xuICAvKipcbiAgVGhlIGFic29sdXRlIHBhdGggdG8gc2Nhbi5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgRGlyZWN0b3J5LW5hbWUgcHJlZml4ZXMgdGhhdCBtYXJrIGFuIGVudHJ5IGFzIHJlbW92YWJsZSByZXNpZHVlLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4ZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzd2VlcERldmljZUxlZnRvdmVyc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3dlZXBEZXZpY2VMZWZ0b3ZlcnNQYXJhbXMge1xuICAvKipcbiAgICogTGlzdHMgdGhlIGVudHJ5IG5hbWVzIGRpcmVjdGx5IHVuZGVyIHRoZSB2YXVsdCBiYXNlIHBhdGguIEEgbGlzdGluZyBmYWlsdXJlXG4gICAqIG11c3QgcmVzb2x2ZSB0byBhbiBlbXB0eSBsaXN0IHJhdGhlciB0aGFuIHJlamVjdCBcdTIwMTQgYSBkZXZpY2Ugd2l0aCBubyB2YXVsdFxuICAgKiBkaXJlY3RvcnkgeWV0IGlzIHRoZSBub3JtYWwgZmlyc3QtcnVuIHN0YXRlLCBub3QgYW4gZXJyb3IuXG4gICAqL1xuICBsaXN0TmFtZXModGhpczogdm9pZCk6IFByb21pc2U8cmVhZG9ubHkgc3RyaW5nW10+O1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIE9ORSBkaXJlY3RvcnksIGJ5IGFic29sdXRlIGRldmljZSBwYXRoLiBNYXkgcmVqZWN0OyB0aGUgY2FsbGVyXG4gICAqIHRyZWF0cyBhIHJlamVjdGlvbiBhcyB0aGlzIGRpcmVjdG9yeSBmYWlsaW5nIGFuZCBtb3ZlcyBvbiB0byB0aGUgbmV4dC5cbiAgICovXG4gIHJlbW92ZURpcmVjdG9yeSh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICBUaGUgYWJzb2x1dGUgZGV2aWNlIHBhdGggdGhlIHZhdWx0cyBzaXQgdW5kZXIsIGluY2x1ZGluZyBpdHMgdHJhaWxpbmcgc2VwYXJhdG9yLlxuICAgKi9cbiAgcmVhZG9ubHkgdmF1bHRCYXNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiB7QGxpbmsgc3dlZXBEZXZpY2VMZWZ0b3ZlcnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN3ZWVwRGV2aWNlTGVmdG92ZXJzUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lcyB0aGF0IHdlcmUgc3RpbGwgcHJlc2VudCBhZnRlciB0aGUgc3dlZXAuIE5hbWVkIHJhdGhlciB0aGFuXG4gICAqIGNvdW50ZWQsIGJlY2F1c2UgdGhlIGludGVyZXN0aW5nIGNhc2UgaXMgYSBkaXJlY3RvcnkgdGhhdCBmYWlscyBFVkVSWSBydW5cbiAgICogYW5kIGEgY2FsbGVyIGNhbiBvbmx5IHNheSBzbyBpZiBpdCBrbm93cyB3aGljaCBvbmUuXG4gICAqL1xuICByZWFkb25seSBmYWlsZWROYW1lczogc3RyaW5nW107XG5cbiAgLyoqXG4gIEhvdyBtYW55IGRpcmVjdG9yaWVzIGFyZSB2ZXJpZmlhYmx5IGdvbmUuXG4gICAqL1xuICByZWFkb25seSByZW1vdmVkQ291bnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgc3dlZXBIb3N0TGVmdG92ZXJzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTd2VlcEhvc3RMZWZ0b3ZlcnNPcHRpb25zIHtcbiAgLyoqXG4gIE5hbWVzIHRvIGtlZXAgcmVnYXJkbGVzcyBvZiBhZ2UgKGUuZy4gdGhlIGN1cnJlbnQgcnVuJ3Mgb3duIGRpcmVjdG9yaWVzKS5cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkTmFtZXM/OiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSG93IG9sZCBhIGRpcmVjdG9yeSBtdXN0IGJlIGJlZm9yZSBpdCBpcyByZW1vdmVkLiBgMGAgcmVtb3ZlcyBldmVyeSBtYXRjaC5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIERFRkFVTFRfTEVGVE9WRVJfTUFYX0FHRV9JTl9NSUxMSVNFQ09ORFN9XG4gICAqL1xuICByZWFkb25seSBtYXhBZ2VJbk1pbGxpc2Vjb25kcz86IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIHJvb3RzIHRvIHN3ZWVwLiBEZWZhdWx0cyB0byB0aGUgdGVtcC12YXVsdCByb290ICh7QGxpbmsgdG1wZGlyfSkgYW5kIHRoZVxuICAgKiBvd25lZCB1c2VyLWRhdGEgcm9vdCAoYDx0bXBkaXI+L3tAbGluayBIQVJORVNTX1RFTVBfRElSX05BTUV9YCkuXG4gICAqL1xuICByZWFkb25seSByb290cz86IHJlYWRvbmx5IExlZnRvdmVyUm9vdFtdIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiB7QGxpbmsgc3dlZXBIb3N0TGVmdG92ZXJzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTd2VlcEhvc3RMZWZ0b3ZlcnNSZXN1bHQge1xuICAvKipcbiAgSG93IG1hbnkgZGlyZWN0b3JpZXMgd2VyZSBzZWxlY3RlZCBmb3IgcmVtb3ZhbCBidXQgY291bGQgbm90IGJlIHJlbW92ZWQuXG4gICAqL1xuICByZWFkb25seSBmYWlsZWRDb3VudDogbnVtYmVyO1xuXG4gIC8qKlxuICBIb3cgbWFueSBkaXJlY3RvcmllcyB3ZXJlIHJlbW92ZWQuXG4gICAqL1xuICByZWFkb25seSByZW1vdmVkQ291bnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY2hlY2tJc1JlbW92YWJsZURpcn0uXG4gKi9cbmludGVyZmFjZSBDaGVja0lzUmVtb3ZhYmxlRGlyZWN0b3J5UGFyYW1zIHtcbiAgLyoqXG4gIEhvdyBvbGQgdGhlIGVudHJ5IG11c3QgYmUgdG8gYmUgcmVtb3ZlZCAoYDBgIGRpc2FibGVzIHRoZSBnYXRlKS5cbiAgICovXG4gIHJlYWRvbmx5IG1heEFnZUluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSBzd2VlcCdzIHJlZmVyZW5jZSB0aW1lLCBpbiBlcG9jaCBtaWxsaXNlY29uZHMuXG4gICAqL1xuICByZWFkb25seSBub3dJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgZW50cnkuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIGEgbGVmdG92ZXIgZW50cnkgaXMgb2xkIGVub3VnaCB0byBiZSByZW1vdmVkLlxuICpcbiAqIFRoZSBnYXRlIGV4aXN0cyBiZWNhdXNlIGV2ZXJ5IHByb2plY3Qgb24gdGhlIG1hY2hpbmUgc2hhcmVzIG9uZSBgdG1wZGlyKClgXG4gKiBhbmQgZGVza3RvcCBydW5zIGFyZSBub3Qgc2VyaWFsaXplZCwgc28gYSB5b3VuZyBkaXJlY3RvcnkgbWF5IHdlbGwgYmVsb25nIHRvXG4gKiBhIHJ1biB0aGF0IGlzIHN0aWxsIGluIGZsaWdodC4gQW4gZW50cnkgd2hvc2UgbW9kaWZpY2F0aW9uIHRpbWUgaXMgaW4gdGhlXG4gKiBmdXR1cmUgKGEgY2xvY2sgc2tldykgaXMgdHJlYXRlZCBhcyBsaXZlIGZvciB0aGUgc2FtZSByZWFzb24uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBhZ2UgY29tcGFyaXNvbiBpbnB1dHMuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgZW50cnkgbWF5IGJlIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0lzTGVmdG92ZXJTdGFsZShwYXJhbXM6IENoZWNrSXNMZWZ0b3ZlclN0YWxlUGFyYW1zKTogYm9vbGVhbiB7XG4gIGlmIChwYXJhbXMubWF4QWdlSW5NaWxsaXNlY29uZHMgPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbXMubm93SW5NaWxsaXNlY29uZHMgLSBwYXJhbXMubW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzID49IHBhcmFtcy5tYXhBZ2VJbk1pbGxpc2Vjb25kcztcbn1cblxuLyoqXG4gKiBTZWxlY3RzIHRoZSBlbnRyeSBuYW1lcyB0aGF0IGFyZSB0aGUgaGFybmVzcydzIG93biByZXNpZHVlLlxuICpcbiAqIE5hbWUtb25seSwgc28gdGhlIGNhbGxlciBjYW4gZmlsdGVyIGEgbGFyZ2UgZGlyZWN0b3J5IGxpc3RpbmcgYmVmb3JlIHBheWluZ1xuICogZm9yIGEgYHN0YXRgIHBlciBlbnRyeSwgYW5kIHNvIHRoZSBBbmRyb2lkIHN3ZWVwIGNhbiBmZWVkIGl0IHJhd1xuICogYGFkYiBzaGVsbCBsc2Agb3V0cHV0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgbmFtZXMsIHByZWZpeGVzLCBhbmQgZXhjbHVzaW9ucy5cbiAqIEByZXR1cm5zIFRoZSBtYXRjaGluZyBuYW1lcywgdHJpbW1lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlckxlZnRvdmVyTmFtZXMocGFyYW1zOiBGaWx0ZXJMZWZ0b3Zlck5hbWVzUGFyYW1zKTogc3RyaW5nW10ge1xuICBjb25zdCBleGNsdWRlZE5hbWVzID0gcGFyYW1zLmV4Y2x1ZGVkTmFtZXMgPz8gW107XG4gIHJldHVybiBwYXJhbXMubmFtZXNcbiAgICAubWFwKChuYW1lKSA9PiBuYW1lLnRyaW0oKSlcbiAgICAuZmlsdGVyKChuYW1lKSA9PiBwYXJhbXMucHJlZml4ZXMuc29tZSgocHJlZml4KSA9PiBuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkpXG4gICAgLmZpbHRlcigobmFtZSkgPT4gIWV4Y2x1ZGVkTmFtZXMuaW5jbHVkZXMobmFtZSkpO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBsZWZ0b3ZlciBhZ2UgZ2F0ZSwgYXBwbHlpbmcgdGhlIGRlZmF1bHQgd2hlbiB0aGUgb3B0aW9uIGlzXG4gKiBvbWl0dGVkLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIG1heCBhZ2UgaW4gbWlsbGlzZWNvbmRzIChgMGAgZGlzYWJsZXMgdGhlIGdhdGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUxlZnRvdmVyTWF4QWdlSW5NaWxsaXNlY29uZHMob3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgcmV0dXJuIG9wdGlvbnM/LmxlZnRvdmVyTWF4QWdlSW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9MRUZUT1ZFUl9NQVhfQUdFX0lOX01JTExJU0VDT05EUztcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBsZWZ0b3ZlciB2YXVsdCBkaXJlY3RvcmllcyBhIGRldmljZSBpcyBjYXJyeWluZywgb25lIGRpcmVjdG9yeSBhdFxuICogYSB0aW1lLCBhbmQgcmVwb3J0cyB3aGF0IGlzIHZlcmlmaWFibHkgZ29uZS5cbiAqXG4gKiAqKk9uZSBkaXJlY3RvcnkgcGVyIHJlbW92YWwsIGFuZCBhIGZhaWx1cmUgaXMgbm9uLWZhdGFsLioqIFJlbW92aW5nIHRoZSB3aG9sZVxuICogc2V0IGluIGEgc2luZ2xlIGBybSAtcmZgIGxldHMgb25lIHVuLXJlbW92YWJsZSBlbnRyeSBkZWNpZGUgdGhlIGZhdGUgb2YgZXZlcnlcbiAqIG90aGVyOiBhIG5hbWUgdGhhdCB0aGUgRlVTRSBsYXllciBjYW5ub3QgZXhwcmVzcyAoYW4gQW5kcm9pZCBlbXVsYXRvciBjYW5cbiAqIHByb2R1Y2Ugb25lIFx1MjAxNCBgcm0gLXJmYCwgYGZpbmQgLWRlbGV0ZWAgYW5kIGZvcmNlLXN0b3BwaW5nIE9ic2lkaWFuIGZpcnN0IGFsbFxuICogYW5zd2VyIGBPcGVyYXRpb24gbm90IHBlcm1pdHRlZGApIGlzIHBlcm1hbmVudCwgc28gYSBzd2VlcCB0aGF0IGdpdmVzIHVwIG9uIGl0XG4gKiBnaXZlcyB1cCBmb3JldmVyLCBhbmQgdGhlIHJlc2lkdWUgb25seSBncm93cy4gUGVyLWRpcmVjdG9yeSwgdGhhdCBlbnRyeSBjb3N0c1xuICogb25lIHdhcm5pbmcgcGVyIHJ1biBpbnN0ZWFkIG9mIHRoZSB3aG9sZSBzd2VlcC5cbiAqXG4gKiAqKlRoZSByZXN1bHQgaXMgbWVhc3VyZWQsIG5vdCBhc3N1bWVkLioqIFRoZSBkaXJlY3RvcmllcyBhcmUgcmUtbGlzdGVkXG4gKiBhZnRlcndhcmRzIGFuZCBvbmx5IHRoZSBvbmVzIHRoYXQgYWN0dWFsbHkgZGlzYXBwZWFyZWQgYXJlIGNvdW50ZWQsIGJlY2F1c2VcbiAqIHRoZSBmYWlsdXJlIHRoaXMgd2FzIHdyaXR0ZW4gZm9yIHdhcyBhIHN3ZWVwIHRoYXQgcmVwb3J0ZWQgc3VjY2VzcyB3aGlsZVxuICogY2xlYXJpbmcgbm90aGluZyBcdTIwMTQgYSByZW1vdmFsIGNvbW1hbmQgY2FuIGV4aXQgbm9uLXplcm8sIG9yIHBhcnRpYWxseSBzdWNjZWVkLFxuICogYW5kIG5laXRoZXIgaXMgdmlzaWJsZSBmcm9tIGl0cyBleGl0IGNvZGUgYWxvbmUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIEhvdyB0byBsaXN0IGFuZCByZW1vdmUsIGFuZCB0aGUgYmFzZSBwYXRoIHRvIHN3ZWVwLlxuICogQHJldHVybnMgVGhlIHZlcmlmaWVkIHJlbW92YWwgY291bnQgYW5kIHRoZSBuYW1lcyB0aGF0IHN1cnZpdmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3dlZXBEZXZpY2VMZWZ0b3ZlcnMoXG4gIHBhcmFtczogU3dlZXBEZXZpY2VMZWZ0b3ZlcnNQYXJhbXNcbik6IFByb21pc2U8U3dlZXBEZXZpY2VMZWZ0b3ZlcnNSZXN1bHQ+IHtcbiAgY29uc3QgeyBsaXN0TmFtZXMsIHJlbW92ZURpcmVjdG9yeSwgdmF1bHRCYXNlUGF0aCB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IG5hbWVzID0gZmlsdGVyTGVmdG92ZXJOYW1lcyh7IG5hbWVzOiBhd2FpdCBsaXN0TmFtZXMoKSwgcHJlZml4ZXM6IFtURU1QX1ZBVUxUX0RJUl9QUkVGSVhdIH0pO1xuICBpZiAobmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHsgZmFpbGVkTmFtZXM6IFtdLCByZW1vdmVkQ291bnQ6IDAgfTtcbiAgfVxuXG4gIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCByZW1vdmVEaXJlY3RvcnkoYCR7dmF1bHRCYXNlUGF0aH0ke25hbWV9YCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBOb24tZmF0YWwgYnkgZGVzaWduOiB0aGUgbmV4dCBkaXJlY3Rvcnkgc3RpbGwgZ2V0cyBpdHMgY2hhbmNlLlxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN1cnZpdmluZ05hbWVzID0gZmlsdGVyTGVmdG92ZXJOYW1lcyh7IG5hbWVzOiBhd2FpdCBsaXN0TmFtZXMoKSwgcHJlZml4ZXM6IFtURU1QX1ZBVUxUX0RJUl9QUkVGSVhdIH0pO1xuICBjb25zdCBmYWlsZWROYW1lcyA9IG5hbWVzLmZpbHRlcigobmFtZSkgPT4gc3Vydml2aW5nTmFtZXMuaW5jbHVkZXMobmFtZSkpO1xuXG4gIHJldHVybiB7IGZhaWxlZE5hbWVzLCByZW1vdmVkQ291bnQ6IG5hbWVzLmxlbmd0aCAtIGZhaWxlZE5hbWVzLmxlbmd0aCB9O1xufVxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIGhvc3Qtc2lkZSBkaXJlY3RvcmllcyBsZWZ0IGJlaGluZCBieSBlYXJsaWVyIHJ1bnMuXG4gKlxuICogQmVzdC1lZmZvcnQgdGhyb3VnaG91dDogYW4gdW5yZWFkYWJsZSByb290LCBhbiBlbnRyeSB0aGF0IGNhbm5vdCBiZSBgc3RhdGBlZCxcbiAqIGFuZCBhIGRpcmVjdG9yeSB0aGF0IHJlZnVzZXMgdG8gYmUgcmVtb3ZlZCAoYSBsaXZlIHByb2Nlc3Mgc3RpbGwgaG9sZGluZyBhXG4gKiBoYW5kbGUgYW5zd2VycyBgRVBFUk1gIG9uIFdpbmRvd3MpIGFyZSBhbGwgc2tpcHBlZCByYXRoZXIgdGhhbiB0aHJvd24sIHNvIGFcbiAqIHN3ZWVwIGNhbiBuZXZlciBmYWlsIHRoZSBydW4gaXQgaXMgY2xlYW5pbmcgdXAgZm9yLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHN3ZWVwIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBIb3cgbWFueSBkaXJlY3RvcmllcyB3ZXJlIHJlbW92ZWQsIGFuZCBob3cgbWFueSByZXNpc3RlZCByZW1vdmFsLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3dlZXBIb3N0TGVmdG92ZXJzKG9wdGlvbnM/OiBTd2VlcEhvc3RMZWZ0b3ZlcnNPcHRpb25zKTogUHJvbWlzZTxTd2VlcEhvc3RMZWZ0b3ZlcnNSZXN1bHQ+IHtcbiAgY29uc3QgbWF4QWdlSW5NaWxsaXNlY29uZHMgPSBvcHRpb25zPy5tYXhBZ2VJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0xFRlRPVkVSX01BWF9BR0VfSU5fTUlMTElTRUNPTkRTO1xuICBjb25zdCBub3dJbk1pbGxpc2Vjb25kcyA9IERhdGUubm93KCk7XG4gIGNvbnN0IHJvb3RzID0gb3B0aW9ucz8ucm9vdHMgPz8gZ2V0RGVmYXVsdExlZnRvdmVyUm9vdHMoKTtcblxuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBsZXQgcmVtb3ZlZENvdW50ID0gMDtcblxuICBmb3IgKGNvbnN0IHJvb3Qgb2Ygcm9vdHMpIHtcbiAgICBjb25zdCBuYW1lcyA9IGZpbHRlckxlZnRvdmVyTmFtZXMoe1xuICAgICAgZXhjbHVkZWROYW1lczogb3B0aW9ucz8uZXhjbHVkZWROYW1lcyxcbiAgICAgIG5hbWVzOiBhd2FpdCByZWFkRGlyZWN0b3J5TmFtZXMocm9vdC5wYXRoKSxcbiAgICAgIHByZWZpeGVzOiByb290LnByZWZpeGVzXG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgIGNvbnN0IHBhdGggPSBqb2luKHJvb3QucGF0aCwgbmFtZSk7XG4gICAgICBpZiAoIWF3YWl0IGNoZWNrSXNSZW1vdmFibGVEaXJlY3RvcnkoeyBtYXhBZ2VJbk1pbGxpc2Vjb25kcywgbm93SW5NaWxsaXNlY29uZHMsIHBhdGggfSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHJtKHBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBmYWlsZWRDb3VudCwgcmVtb3ZlZENvdW50IH07XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgd2hldGhlciBsZWZ0b3ZlciBkaXJlY3RvcmllcyBhcmUgc3dlcHQsIGFwcGx5aW5nIHRoZSBkZWZhdWx0IHdoZW5cbiAqIHRoZSBvcHRpb24gaXMgb21pdHRlZC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBzd2VlcHMgc2hvdWxkIHJ1bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpbGxTd2VlcExlZnRvdmVycyhvcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9wdGlvbnM/LnNob3VsZFN3ZWVwTGVmdG92ZXJzID8/IHRydWU7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBtYXRjaGVkIGVudHJ5IGlzIGEgZGlyZWN0b3J5IG9sZCBlbm91Z2ggdG8gcmVtb3ZlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZW50cnkgcGF0aCBhbmQgYWdlLWdhdGUgaW5wdXRzLlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGVudHJ5IG1heSBiZSByZW1vdmVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja0lzUmVtb3ZhYmxlRGlyZWN0b3J5KHBhcmFtczogQ2hlY2tJc1JlbW92YWJsZURpcmVjdG9yeVBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB7IG1heEFnZUluTWlsbGlzZWNvbmRzLCBub3dJbk1pbGxpc2Vjb25kcyB9ID0gcGFyYW1zO1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgc3RhdChwYXJhbXMucGF0aCk7XG4gICAgcmV0dXJuIHN0YXRzLmlzRGlyZWN0b3J5KClcbiAgICAgICYmIGNoZWNrSXNMZWZ0b3ZlclN0YWxlKHsgbWF4QWdlSW5NaWxsaXNlY29uZHMsIG1vZGlmaWVkQXRJbk1pbGxpc2Vjb25kczogc3RhdHMubXRpbWVNcywgbm93SW5NaWxsaXNlY29uZHMgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIFZhbmlzaGVkLCBvciB1bnJlYWRhYmxlIFx1MjAxNCBlaXRoZXIgd2F5IGl0IGlzIG5vdCBvdXJzIHRvIHJlbW92ZS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByb290cyBzd2VwdCB3aGVuIHRoZSBjYWxsZXIgZG9lcyBub3QgbmFtZSBpdHMgb3duLlxuICpcbiAqIEByZXR1cm5zIFRoZSB0ZW1wLXZhdWx0IHJvb3QgYW5kIHRoZSBvd25lZCB1c2VyLWRhdGEgcm9vdC5cbiAqL1xuZnVuY3Rpb24gZ2V0RGVmYXVsdExlZnRvdmVyUm9vdHMoKTogTGVmdG92ZXJSb290W10ge1xuICByZXR1cm4gW1xuICAgIHsgcGF0aDogdG1wZGlyKCksIHByZWZpeGVzOiBbVEVNUF9WQVVMVF9ESVJfUFJFRklYXSB9LFxuICAgIHsgcGF0aDogam9pbih0bXBkaXIoKSwgSEFSTkVTU19URU1QX0RJUl9OQU1FKSwgcHJlZml4ZXM6IFtPV05FRF9VU0VSX0RBVEFfRElSX1BSRUZJWF0gfVxuICBdO1xufVxuXG4vKipcbiAqIExpc3RzIGEgZGlyZWN0b3J5J3MgZW50cnkgbmFtZXMsIHRyZWF0aW5nIGFuIHVucmVhZGFibGUgZGlyZWN0b3J5IGFzIGVtcHR5LlxuICpcbiAqIEBwYXJhbSBwYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gbGlzdC5cbiAqIEByZXR1cm5zIFRoZSBlbnRyeSBuYW1lcywgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZERpcmVjdG9yeU5hbWVzKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcmVhZGRpcihwYXRoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUEyQkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsWUFBWTtBQU9kLE1BQU0sMkNBQTJDO0FBT2pELE1BQU0sd0JBQXdCO0FBSzlCLE1BQU0sNkJBQTZCO0FBTW5DLE1BQU0sd0JBQXdCO0FBMEs5QixTQUFTLHFCQUFxQixRQUE2QztBQUNoRixNQUFJLE9BQU8seUJBQXlCLEdBQUc7QUFDckMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLE9BQU8sb0JBQW9CLE9BQU8sNEJBQTRCLE9BQU87QUFDOUU7QUFZTyxTQUFTLG9CQUFvQixRQUE2QztBQUMvRSxRQUFNLGdCQUFnQixPQUFPLGlCQUFpQixDQUFDO0FBQy9DLFNBQU8sT0FBTyxNQUNYLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLEVBQ3pCLE9BQU8sQ0FBQyxTQUFTLE9BQU8sU0FBUyxLQUFLLENBQUMsV0FBVyxLQUFLLFdBQVcsTUFBTSxDQUFDLENBQUMsRUFDMUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjLFNBQVMsSUFBSSxDQUFDO0FBQ25EO0FBU08sU0FBUyxvQ0FBb0MsU0FBdUQ7QUFDekcsU0FBTyxTQUFTLGdDQUFnQztBQUNsRDtBQXVCQSxlQUFzQixxQkFD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
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2xlZnRvdmVyLWNsZWFudXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTd2VlcHMgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcmllcyBhIHByZXZpb3VzIGludGVncmF0aW9uIHJ1biBsZWFrZWQgXHUyMDE0IHRoZVxuICogYHRlbXAtdmF1bHQtKmAgc3RhZ2luZy92YXVsdCBkaXJlY3RvcmllcyBhbmQgdGhlIG93bmVkIGluc3RhbmNlJ3NcbiAqIGB1c2VyZGF0YS0qYCBDaHJvbWl1bSBwcm9maWxlcy5cbiAqXG4gKiBBIHJ1biB0aGF0IGRpZXMgbWlkLWZsaWdodCBjYW5ub3QgY2xlYW4gdXAgYWZ0ZXIgaXRzZWxmOiBvbiBBbmRyb2lkIHRoZVxuICogdGVhcmRvd24gdGFsa3MgdG8gdGhlIFdlYlZpZXcsIGFuZCBhIGRlYWQgV2ViVmlldyBpcyBleGFjdGx5IHdoYXQgbW9zdFxuICogZmFpbHVyZXMgYXJlIChgVmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogbm8gc3VjaCB3aW5kb3dgKS4gRXZlcnlcbiAqIGZhaWx1cmUgdGhlcmVmb3JlIGxlYWtzIGEgdmF1bHQsIGV2ZXJ5IGxlYWtlZCB2YXVsdCBzdGF5cyByZWdpc3RlcmVkIGZvclxuICogT2JzaWRpYW4gdG8gZW51bWVyYXRlIGF0IHN0YXJ0dXAsIGFuZCB0aGF0IGVudW1lcmF0aW9uIGhhcyB0byBmaW5pc2ggaW5zaWRlXG4gKiB0aGUgV2ViVmlldy1yZWFkaW5lc3MgYnVkZ2V0IFx1MjAxNCBzbyBlYWNoIGZhaWx1cmUgbWFrZXMgdGhlIG5leHQgb25lIGxpa2VsaWVyLlxuICogU3dlZXBpbmcgZm9yZWlnbiByZXNpZHVlIGF0IHRoZSBTVEFSVCBvZiBhIHJ1biBicmVha3MgdGhhdCBsb29wLCBiZWNhdXNlIGl0XG4gKiBydW5zIGJlZm9yZSBhbnl0aGluZyB0aGF0IGNhbiBkaWUuXG4gKlxuICogVGhlIHR3byBzaWRlcyB1c2UgZGVsaWJlcmF0ZWx5IGRpZmZlcmVudCBzYWZldHkgZ2F0ZXMgKHNlZSB0aGUgcmVwbydzIEwzMSk6XG4gKlxuICogLSAqKkRldmljZSAoQW5kcm9pZCkqKiBcdTIwMTQgdW5jb25kaXRpb25hbC4gQW5kcm9pZCBydW5zIGhvbGQgdGhlIGV4Y2x1c2l2ZVxuICogICBgYW5kcm9pZGAgc2V0dXAgbG9jaywgc28gbm8gY29uY3VycmVudCBydW4gY2FuIG93biBhIGRldmljZSB2YXVsdCwgYW5kIGFuXG4gKiAgIGFnZSBnYXRlIHdvdWxkIGxldCBhIHZhdWx0IGxlYWtlZCB0ZW4gbWludXRlcyBhZ28gc3Vydml2ZSBpbnRvIHRoZSBuZXh0IHJ1bi5cbiAqIC0gKipIb3N0KiogXHUyMDE0IGFnZS1nYXRlZC4gRGVza3RvcCBydW5zIGFyZSBkZWxpYmVyYXRlbHkgKm5vdCogc2VyaWFsaXplZCAoZWFjaFxuICogICBvd25zIGFuIGlzb2xhdGVkIGluc3RhbmNlKSBhbmQgZXZlcnkgcHJvamVjdCBvbiB0aGUgbWFjaGluZSBzaGFyZXMgb25lXG4gKiAgIGB0bXBkaXIoKWAsIHNvIGEgZGlyZWN0b3J5IHlvdW5nIGVub3VnaCB0byBiZWxvbmcgdG8gYSBsaXZlIHJ1biBpcyBsZWZ0XG4gKiAgIGFsb25lLlxuICovXG5cbmltcG9ydCB7XG4gIHJlYWRkaXIsXG4gIHJtLFxuICBzdGF0XG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5cbi8qKlxuICogRGVmYXVsdCBmb3IgdGhlIGBsZWZ0b3Zlck1heEFnZUluTWlsbGlzZWNvbmRzYCB0cmFuc3BvcnQgb3B0aW9uIFx1MjAxNCB0d28gaG91cnMuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0xFRlRPVkVSX01BWF9BR0VfSU5fTUlMTElTRUNPTkRTID0gN18yMDBfMDAwO1xuXG4vKipcbiAqIE5hbWUgb2YgdGhlIGhhcm5lc3MncyBvd24gZGlyZWN0b3J5IGluc2lkZSB7QGxpbmsgdG1wZGlyfSwgd2hpY2ggaG9sZHMgdGhlXG4gKiBvd25lZCBpbnN0YW5jZXMnIHVzZXItZGF0YSBkaXJlY3RvcmllcyBhbG9uZ3NpZGUgdGhlIHZlcnNpb24vaW5zdGFsbGVyIGNhY2hlc1xuICogYW5kIHRoZSBzZXR1cCBsb2Nrcy5cbiAqL1xuZXhwb3J0IGNvbnN0IEhBUk5FU1NfVEVNUF9ESVJfTkFNRSA9ICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJztcblxuLyoqXG4gKiBQcmVmaXggb2YgYW4gb3duZWQgZGVza3RvcCBpbnN0YW5jZSdzIGlzb2xhdGVkIHVzZXItZGF0YSBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBjb25zdCBPV05FRF9VU0VSX0RBVEFfRElSX1BSRUZJWCA9ICd1c2VyZGF0YS0nO1xuXG4vKipcbiAqIFByZWZpeCBvZiBhIHRlbXBvcmFyeSB2YXVsdCBkaXJlY3RvcnksIGJvdGggb24gdGhlIGhvc3QgKHdoZXJlIGl0IGlzIGNyZWF0ZWQpXG4gKiBhbmQgb24gYW4gQW5kcm9pZCBkZXZpY2UgKHdoZXJlIGl0IGtlZXBzIGl0cyBob3N0IGJhc2VuYW1lKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFRFTVBfVkFVTFRfRElSX1BSRUZJWCA9ICd0ZW1wLXZhdWx0LSc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNoZWNrSXNMZWZ0b3ZlclN0YWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGVja0lzTGVmdG92ZXJTdGFsZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBIb3cgb2xkIGFuIGVudHJ5IG11c3QgYmUgdG8gY291bnQgYXMgc3RhbGUuIGAwYCBkaXNhYmxlcyB0aGUgZ2F0ZSwgbWFraW5nXG4gICAqIGV2ZXJ5IGVudHJ5IHN0YWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4QWdlSW5NaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKipcbiAgVGhlIGVudHJ5J3MgbW9kaWZpY2F0aW9uIHRpbWUsIGluIGVwb2NoIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIHJlYWRvbmx5IG1vZGlmaWVkQXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgY3VycmVudCB0aW1lLCBpbiBlcG9jaCBtaWxsaXNlY29uZHMuXG4gICAqL1xuICByZWFkb25seSBub3dJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBmaWx0ZXJMZWZ0b3Zlck5hbWVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJMZWZ0b3Zlck5hbWVzUGFyYW1zIHtcbiAgLyoqXG4gIE5hbWVzIHRvIGtlZXAgZXZlbiB3aGVuIHRoZXkgbWF0Y2ggYSBwcmVmaXggKGUuZy4gdGhlIGN1cnJlbnQgcnVuJ3Mgb3duIHZhdWx0KS5cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkTmFtZXM/OiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmF3IGVudHJ5IG5hbWVzLiBBY2NlcHRzIGBhZGIgc2hlbGwgbHNgIG91dHB1dCBzcGxpdCBpbnRvIGxpbmVzLCBzbyBlYWNoXG4gICAqIG5hbWUgaXMgdHJpbW1lZCAoZHJvcHBpbmcgdGhlIHRyYWlsaW5nIGBcXHJgIGFuIGBhZGJgIHNoZWxsIGFkZHMgb24gV2luZG93cylcbiAgICogYW5kIGJsYW5rIGxpbmVzIGFyZSBkcm9wcGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICBEaXJlY3RvcnktbmFtZSBwcmVmaXhlcyB0aGF0IG1hcmsgYW4gZW50cnkgYXMgdGhlIGhhcm5lc3MncyBvd24gcmVzaWR1ZS5cbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeGVzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIGRpcmVjdG9yeSB0aGUgaG9zdCBzd2VlcCBzY2FucywgdG9nZXRoZXIgd2l0aCB0aGUgcHJlZml4ZXMgdGhhdCBtYXJrXG4gKiByZXNpZHVlIGluc2lkZSBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMZWZ0b3ZlclJvb3Qge1xuICAvKipcbiAgVGhlIGFic29sdXRlIHBhdGggdG8gc2Nhbi5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgRGlyZWN0b3J5LW5hbWUgcHJlZml4ZXMgdGhhdCBtYXJrIGFuIGVudHJ5IGFzIHJlbW92YWJsZSByZXNpZHVlLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4ZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzd2VlcERldmljZUxlZnRvdmVyc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3dlZXBEZXZpY2VMZWZ0b3ZlcnNQYXJhbXMge1xuICAvKipcbiAgICogTGlzdHMgdGhlIGVudHJ5IG5hbWVzIGRpcmVjdGx5IHVuZGVyIHRoZSB2YXVsdCBiYXNlIHBhdGguIEEgbGlzdGluZyBmYWlsdXJlXG4gICAqIG11c3QgcmVzb2x2ZSB0byBhbiBlbXB0eSBsaXN0IHJhdGhlciB0aGFuIHJlamVjdCBcdTIwMTQgYSBkZXZpY2Ugd2l0aCBubyB2YXVsdFxuICAgKiBkaXJlY3RvcnkgeWV0IGlzIHRoZSBub3JtYWwgZmlyc3QtcnVuIHN0YXRlLCBub3QgYW4gZXJyb3IuXG4gICAqL1xuICByZWFkb25seSBsaXN0TmFtZXM6ICgpID0+IFByb21pc2U8cmVhZG9ubHkgc3RyaW5nW10+O1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIE9ORSBkaXJlY3RvcnksIGJ5IGFic29sdXRlIGRldmljZSBwYXRoLiBNYXkgcmVqZWN0OyB0aGUgY2FsbGVyXG4gICAqIHRyZWF0cyBhIHJlamVjdGlvbiBhcyB0aGlzIGRpcmVjdG9yeSBmYWlsaW5nIGFuZCBtb3ZlcyBvbiB0byB0aGUgbmV4dC5cbiAgICovXG4gIHJlYWRvbmx5IHJlbW92ZURpcmVjdG9yeTogKHBhdGg6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgVGhlIGFic29sdXRlIGRldmljZSBwYXRoIHRoZSB2YXVsdHMgc2l0IHVuZGVyLCBpbmNsdWRpbmcgaXRzIHRyYWlsaW5nIHNlcGFyYXRvci5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0QmFzZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Yge0BsaW5rIHN3ZWVwRGV2aWNlTGVmdG92ZXJzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTd2VlcERldmljZUxlZnRvdmVyc1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZXMgdGhhdCB3ZXJlIHN0aWxsIHByZXNlbnQgYWZ0ZXIgdGhlIHN3ZWVwLiBOYW1lZCByYXRoZXIgdGhhblxuICAgKiBjb3VudGVkLCBiZWNhdXNlIHRoZSBpbnRlcmVzdGluZyBjYXNlIGlzIGEgZGlyZWN0b3J5IHRoYXQgZmFpbHMgRVZFUlkgcnVuXG4gICAqIGFuZCBhIGNhbGxlciBjYW4gb25seSBzYXkgc28gaWYgaXQga25vd3Mgd2hpY2ggb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZmFpbGVkTmFtZXM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICBIb3cgbWFueSBkaXJlY3RvcmllcyBhcmUgdmVyaWZpYWJseSBnb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZlZENvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHN3ZWVwSG9zdExlZnRvdmVyc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3dlZXBIb3N0TGVmdG92ZXJzT3B0aW9ucyB7XG4gIC8qKlxuICBOYW1lcyB0byBrZWVwIHJlZ2FyZGxlc3Mgb2YgYWdlIChlLmcuIHRoZSBjdXJyZW50IHJ1bidzIG93biBkaXJlY3RvcmllcykuXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlZE5hbWVzPzogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEhvdyBvbGQgYSBkaXJlY3RvcnkgbXVzdCBiZSBiZWZvcmUgaXQgaXMgcmVtb3ZlZC4gYDBgIHJlbW92ZXMgZXZlcnkgbWF0Y2guXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBERUZBVUxUX0xFRlRPVkVSX01BWF9BR0VfSU5fTUlMTElTRUNPTkRTfVxuICAgKi9cbiAgcmVhZG9ubHkgbWF4QWdlSW5NaWxsaXNlY29uZHM/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSByb290cyB0byBzd2VlcC4gRGVmYXVsdHMgdG8gdGhlIHRlbXAtdmF1bHQgcm9vdCAoe0BsaW5rIHRtcGRpcn0pIGFuZCB0aGVcbiAgICogb3duZWQgdXNlci1kYXRhIHJvb3QgKGA8dG1wZGlyPi97QGxpbmsgSEFSTkVTU19URU1QX0RJUl9OQU1FfWApLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdHM/OiByZWFkb25seSBMZWZ0b3ZlclJvb3RbXSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Yge0BsaW5rIHN3ZWVwSG9zdExlZnRvdmVyc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3dlZXBIb3N0TGVmdG92ZXJzUmVzdWx0IHtcbiAgLyoqXG4gIEhvdyBtYW55IGRpcmVjdG9yaWVzIHdlcmUgc2VsZWN0ZWQgZm9yIHJlbW92YWwgYnV0IGNvdWxkIG5vdCBiZSByZW1vdmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZmFpbGVkQ291bnQ6IG51bWJlcjtcblxuICAvKipcbiAgSG93IG1hbnkgZGlyZWN0b3JpZXMgd2VyZSByZW1vdmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZlZENvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNoZWNrSXNSZW1vdmFibGVEaXJ9LlxuICovXG5pbnRlcmZhY2UgQ2hlY2tJc1JlbW92YWJsZURpcmVjdG9yeVBhcmFtcyB7XG4gIC8qKlxuICBIb3cgb2xkIHRoZSBlbnRyeSBtdXN0IGJlIHRvIGJlIHJlbW92ZWQgKGAwYCBkaXNhYmxlcyB0aGUgZ2F0ZSkuXG4gICAqL1xuICByZWFkb25seSBtYXhBZ2VJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgc3dlZXAncyByZWZlcmVuY2UgdGltZSwgaW4gZXBvY2ggbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgbm93SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKipcbiAgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGVudHJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIERlY2lkZXMgd2hldGhlciBhIGxlZnRvdmVyIGVudHJ5IGlzIG9sZCBlbm91Z2ggdG8gYmUgcmVtb3ZlZC5cbiAqXG4gKiBUaGUgZ2F0ZSBleGlzdHMgYmVjYXVzZSBldmVyeSBwcm9qZWN0IG9uIHRoZSBtYWNoaW5lIHNoYXJlcyBvbmUgYHRtcGRpcigpYFxuICogYW5kIGRlc2t0b3AgcnVucyBhcmUgbm90IHNlcmlhbGl6ZWQsIHNvIGEgeW91bmcgZGlyZWN0b3J5IG1heSB3ZWxsIGJlbG9uZyB0b1xuICogYSBydW4gdGhhdCBpcyBzdGlsbCBpbiBmbGlnaHQuIEFuIGVudHJ5IHdob3NlIG1vZGlmaWNhdGlvbiB0aW1lIGlzIGluIHRoZVxuICogZnV0dXJlIChhIGNsb2NrIHNrZXcpIGlzIHRyZWF0ZWQgYXMgbGl2ZSBmb3IgdGhlIHNhbWUgcmVhc29uLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgYWdlIGNvbXBhcmlzb24gaW5wdXRzLlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGVudHJ5IG1heSBiZSByZW1vdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJc0xlZnRvdmVyU3RhbGUocGFyYW1zOiBDaGVja0lzTGVmdG92ZXJTdGFsZVBhcmFtcyk6IGJvb2xlYW4ge1xuICBpZiAocGFyYW1zLm1heEFnZUluTWlsbGlzZWNvbmRzID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gcGFyYW1zLm5vd0luTWlsbGlzZWNvbmRzIC0gcGFyYW1zLm1vZGlmaWVkQXRJbk1pbGxpc2Vjb25kcyA+PSBwYXJhbXMubWF4QWdlSW5NaWxsaXNlY29uZHM7XG59XG5cbi8qKlxuICogU2VsZWN0cyB0aGUgZW50cnkgbmFtZXMgdGhhdCBhcmUgdGhlIGhhcm5lc3MncyBvd24gcmVzaWR1ZS5cbiAqXG4gKiBOYW1lLW9ubHksIHNvIHRoZSBjYWxsZXIgY2FuIGZpbHRlciBhIGxhcmdlIGRpcmVjdG9yeSBsaXN0aW5nIGJlZm9yZSBwYXlpbmdcbiAqIGZvciBhIGBzdGF0YCBwZXIgZW50cnksIGFuZCBzbyB0aGUgQW5kcm9pZCBzd2VlcCBjYW4gZmVlZCBpdCByYXdcbiAqIGBhZGIgc2hlbGwgbHNgIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIG5hbWVzLCBwcmVmaXhlcywgYW5kIGV4Y2x1c2lvbnMuXG4gKiBAcmV0dXJucyBUaGUgbWF0Y2hpbmcgbmFtZXMsIHRyaW1tZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJMZWZ0b3Zlck5hbWVzKHBhcmFtczogRmlsdGVyTGVmdG92ZXJOYW1lc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZXhjbHVkZWROYW1lcyA9IHBhcmFtcy5leGNsdWRlZE5hbWVzID8/IFtdO1xuICByZXR1cm4gcGFyYW1zLm5hbWVzXG4gICAgLm1hcCgobmFtZSkgPT4gbmFtZS50cmltKCkpXG4gICAgLmZpbHRlcigobmFtZSkgPT4gcGFyYW1zLnByZWZpeGVzLnNvbWUoKHByZWZpeCkgPT4gbmFtZS5zdGFydHNXaXRoKHByZWZpeCkpKVxuICAgIC5maWx0ZXIoKG5hbWUpID0+ICFleGNsdWRlZE5hbWVzLmluY2x1ZGVzKG5hbWUpKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgbGVmdG92ZXIgYWdlIGdhdGUsIGFwcGx5aW5nIHRoZSBkZWZhdWx0IHdoZW4gdGhlIG9wdGlvbiBpc1xuICogb21pdHRlZC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBtYXggYWdlIGluIG1pbGxpc2Vjb25kcyAoYDBgIGRpc2FibGVzIHRoZSBnYXRlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVMZWZ0b3Zlck1heEFnZUluTWlsbGlzZWNvbmRzKG9wdGlvbnM6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIHJldHVybiBvcHRpb25zPy5sZWZ0b3Zlck1heEFnZUluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfTEVGVE9WRVJfTUFYX0FHRV9JTl9NSUxMSVNFQ09ORFM7XG59XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgbGVmdG92ZXIgdmF1bHQgZGlyZWN0b3JpZXMgYSBkZXZpY2UgaXMgY2FycnlpbmcsIG9uZSBkaXJlY3RvcnkgYXRcbiAqIGEgdGltZSwgYW5kIHJlcG9ydHMgd2hhdCBpcyB2ZXJpZmlhYmx5IGdvbmUuXG4gKlxuICogKipPbmUgZGlyZWN0b3J5IHBlciByZW1vdmFsLCBhbmQgYSBmYWlsdXJlIGlzIG5vbi1mYXRhbC4qKiBSZW1vdmluZyB0aGUgd2hvbGVcbiAqIHNldCBpbiBhIHNpbmdsZSBgcm0gLXJmYCBsZXRzIG9uZSB1bi1yZW1vdmFibGUgZW50cnkgZGVjaWRlIHRoZSBmYXRlIG9mIGV2ZXJ5XG4gKiBvdGhlcjogYSBuYW1lIHRoYXQgdGhlIEZVU0UgbGF5ZXIgY2Fubm90IGV4cHJlc3MgKGFuIEFuZHJvaWQgZW11bGF0b3IgY2FuXG4gKiBwcm9kdWNlIG9uZSBcdTIwMTQgYHJtIC1yZmAsIGBmaW5kIC1kZWxldGVgIGFuZCBmb3JjZS1zdG9wcGluZyBPYnNpZGlhbiBmaXJzdCBhbGxcbiAqIGFuc3dlciBgT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWRgKSBpcyBwZXJtYW5lbnQsIHNvIGEgc3dlZXAgdGhhdCBnaXZlcyB1cCBvbiBpdFxuICogZ2l2ZXMgdXAgZm9yZXZlciwgYW5kIHRoZSByZXNpZHVlIG9ubHkgZ3Jvd3MuIFBlci1kaXJlY3RvcnksIHRoYXQgZW50cnkgY29zdHNcbiAqIG9uZSB3YXJuaW5nIHBlciBydW4gaW5zdGVhZCBvZiB0aGUgd2hvbGUgc3dlZXAuXG4gKlxuICogKipUaGUgcmVzdWx0IGlzIG1lYXN1cmVkLCBub3QgYXNzdW1lZC4qKiBUaGUgZGlyZWN0b3JpZXMgYXJlIHJlLWxpc3RlZFxuICogYWZ0ZXJ3YXJkcyBhbmQgb25seSB0aGUgb25lcyB0aGF0IGFjdHVhbGx5IGRpc2FwcGVhcmVkIGFyZSBjb3VudGVkLCBiZWNhdXNlXG4gKiB0aGUgZmFpbHVyZSB0aGlzIHdhcyB3cml0dGVuIGZvciB3YXMgYSBzd2VlcCB0aGF0IHJlcG9ydGVkIHN1Y2Nlc3Mgd2hpbGVcbiAqIGNsZWFyaW5nIG5vdGhpbmcgXHUyMDE0IGEgcmVtb3ZhbCBjb21tYW5kIGNhbiBleGl0IG5vbi16ZXJvLCBvciBwYXJ0aWFsbHkgc3VjY2VlZCxcbiAqIGFuZCBuZWl0aGVyIGlzIHZpc2libGUgZnJvbSBpdHMgZXhpdCBjb2RlIGFsb25lLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBIb3cgdG8gbGlzdCBhbmQgcmVtb3ZlLCBhbmQgdGhlIGJhc2UgcGF0aCB0byBzd2VlcC5cbiAqIEByZXR1cm5zIFRoZSB2ZXJpZmllZCByZW1vdmFsIGNvdW50IGFuZCB0aGUgbmFtZXMgdGhhdCBzdXJ2aXZlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN3ZWVwRGV2aWNlTGVmdG92ZXJzKFxuICBwYXJhbXM6IFN3ZWVwRGV2aWNlTGVmdG92ZXJzUGFyYW1zXG4pOiBQcm9taXNlPFN3ZWVwRGV2aWNlTGVmdG92ZXJzUmVzdWx0PiB7XG4gIGNvbnN0IHsgbGlzdE5hbWVzLCByZW1vdmVEaXJlY3RvcnksIHZhdWx0QmFzZVBhdGggfSA9IHBhcmFtcztcblxuICBjb25zdCBuYW1lcyA9IGZpbHRlckxlZnRvdmVyTmFtZXMoeyBuYW1lczogYXdhaXQgbGlzdE5hbWVzKCksIHByZWZpeGVzOiBbVEVNUF9WQVVMVF9ESVJfUFJFRklYXSB9KTtcbiAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7IGZhaWxlZE5hbWVzOiBbXSwgcmVtb3ZlZENvdW50OiAwIH07XG4gIH1cblxuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcmVtb3ZlRGlyZWN0b3J5KGAke3ZhdWx0QmFzZVBhdGh9JHtuYW1lfWApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTm9uLWZhdGFsIGJ5IGRlc2lnbjogdGhlIG5leHQgZGlyZWN0b3J5IHN0aWxsIGdldHMgaXRzIGNoYW5jZS5cbiAgICB9XG4gIH1cblxuICBjb25zdCBzdXJ2aXZpbmdOYW1lcyA9IGZpbHRlckxlZnRvdmVyTmFtZXMoeyBuYW1lczogYXdhaXQgbGlzdE5hbWVzKCksIHByZWZpeGVzOiBbVEVNUF9WQVVMVF9ESVJfUFJFRklYXSB9KTtcbiAgY29uc3QgZmFpbGVkTmFtZXMgPSBuYW1lcy5maWx0ZXIoKG5hbWUpID0+IHN1cnZpdmluZ05hbWVzLmluY2x1ZGVzKG5hbWUpKTtcblxuICByZXR1cm4geyBmYWlsZWROYW1lcywgcmVtb3ZlZENvdW50OiBuYW1lcy5sZW5ndGggLSBmYWlsZWROYW1lcy5sZW5ndGggfTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBob3N0LXNpZGUgZGlyZWN0b3JpZXMgbGVmdCBiZWhpbmQgYnkgZWFybGllciBydW5zLlxuICpcbiAqIEJlc3QtZWZmb3J0IHRocm91Z2hvdXQ6IGFuIHVucmVhZGFibGUgcm9vdCwgYW4gZW50cnkgdGhhdCBjYW5ub3QgYmUgYHN0YXRgZWQsXG4gKiBhbmQgYSBkaXJlY3RvcnkgdGhhdCByZWZ1c2VzIHRvIGJlIHJlbW92ZWQgKGEgbGl2ZSBwcm9jZXNzIHN0aWxsIGhvbGRpbmcgYVxuICogaGFuZGxlIGFuc3dlcnMgYEVQRVJNYCBvbiBXaW5kb3dzKSBhcmUgYWxsIHNraXBwZWQgcmF0aGVyIHRoYW4gdGhyb3duLCBzbyBhXG4gKiBzd2VlcCBjYW4gbmV2ZXIgZmFpbCB0aGUgcnVuIGl0IGlzIGNsZWFuaW5nIHVwIGZvci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBzd2VlcCBvcHRpb25zLlxuICogQHJldHVybnMgSG93IG1hbnkgZGlyZWN0b3JpZXMgd2VyZSByZW1vdmVkLCBhbmQgaG93IG1hbnkgcmVzaXN0ZWQgcmVtb3ZhbC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN3ZWVwSG9zdExlZnRvdmVycyhvcHRpb25zPzogU3dlZXBIb3N0TGVmdG92ZXJzT3B0aW9ucyk6IFByb21pc2U8U3dlZXBIb3N0TGVmdG92ZXJzUmVzdWx0PiB7XG4gIGNvbnN0IG1heEFnZUluTWlsbGlzZWNvbmRzID0gb3B0aW9ucz8ubWF4QWdlSW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9MRUZUT1ZFUl9NQVhfQUdFX0lOX01JTExJU0VDT05EUztcbiAgY29uc3Qgbm93SW5NaWxsaXNlY29uZHMgPSBEYXRlLm5vdygpO1xuICBjb25zdCByb290cyA9IG9wdGlvbnM/LnJvb3RzID8/IGdldERlZmF1bHRMZWZ0b3ZlclJvb3RzKCk7XG5cbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgbGV0IHJlbW92ZWRDb3VudCA9IDA7XG5cbiAgZm9yIChjb25zdCByb290IG9mIHJvb3RzKSB7XG4gICAgY29uc3QgbmFtZXMgPSBmaWx0ZXJMZWZ0b3Zlck5hbWVzKHtcbiAgICAgIGV4Y2x1ZGVkTmFtZXM6IG9wdGlvbnM/LmV4Y2x1ZGVkTmFtZXMsXG4gICAgICBuYW1lczogYXdhaXQgcmVhZERpcmVjdG9yeU5hbWVzKHJvb3QucGF0aCksXG4gICAgICBwcmVmaXhlczogcm9vdC5wcmVmaXhlc1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICBjb25zdCBwYXRoID0gam9pbihyb290LnBhdGgsIG5hbWUpO1xuICAgICAgaWYgKCFhd2FpdCBjaGVja0lzUmVtb3ZhYmxlRGlyZWN0b3J5KHsgbWF4QWdlSW5NaWxsaXNlY29uZHMsIG5vd0luTWlsbGlzZWNvbmRzLCBwYXRoIH0pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBybShwYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgZmFpbGVkQ291bnQsIHJlbW92ZWRDb3VudCB9O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHdoZXRoZXIgbGVmdG92ZXIgZGlyZWN0b3JpZXMgYXJlIHN3ZXB0LCBhcHBseWluZyB0aGUgZGVmYXVsdCB3aGVuXG4gKiB0aGUgb3B0aW9uIGlzIG9taXR0ZWQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgc3dlZXBzIHNob3VsZCBydW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aWxsU3dlZXBMZWZ0b3ZlcnMob3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBvcHRpb25zPy5zaG91bGRTd2VlcExlZnRvdmVycyA/PyB0cnVlO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbWF0Y2hlZCBlbnRyeSBpcyBhIGRpcmVjdG9yeSBvbGQgZW5vdWdoIHRvIHJlbW92ZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGVudHJ5IHBhdGggYW5kIGFnZS1nYXRlIGlucHV0cy5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBlbnRyeSBtYXkgYmUgcmVtb3ZlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tJc1JlbW92YWJsZURpcmVjdG9yeShwYXJhbXM6IENoZWNrSXNSZW1vdmFibGVEaXJlY3RvcnlQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgeyBtYXhBZ2VJbk1pbGxpc2Vjb25kcywgbm93SW5NaWxsaXNlY29uZHMgfSA9IHBhcmFtcztcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHN0YXQocGFyYW1zLnBhdGgpO1xuICAgIHJldHVybiBzdGF0cy5pc0RpcmVjdG9yeSgpXG4gICAgICAmJiBjaGVja0lzTGVmdG92ZXJTdGFsZSh7IG1heEFnZUluTWlsbGlzZWNvbmRzLCBtb2RpZmllZEF0SW5NaWxsaXNlY29uZHM6IHN0YXRzLm10aW1lTXMsIG5vd0luTWlsbGlzZWNvbmRzIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBWYW5pc2hlZCwgb3IgdW5yZWFkYWJsZSBcdTIwMTQgZWl0aGVyIHdheSBpdCBpcyBub3Qgb3VycyB0byByZW1vdmUuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcm9vdHMgc3dlcHQgd2hlbiB0aGUgY2FsbGVyIGRvZXMgbm90IG5hbWUgaXRzIG93bi5cbiAqXG4gKiBAcmV0dXJucyBUaGUgdGVtcC12YXVsdCByb290IGFuZCB0aGUgb3duZWQgdXNlci1kYXRhIHJvb3QuXG4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRMZWZ0b3ZlclJvb3RzKCk6IExlZnRvdmVyUm9vdFtdIHtcbiAgcmV0dXJuIFtcbiAgICB7IHBhdGg6IHRtcGRpcigpLCBwcmVmaXhlczogW1RFTVBfVkFVTFRfRElSX1BSRUZJWF0gfSxcbiAgICB7IHBhdGg6IGpvaW4odG1wZGlyKCksIEhBUk5FU1NfVEVNUF9ESVJfTkFNRSksIHByZWZpeGVzOiBbT1dORURfVVNFUl9EQVRBX0RJUl9QUkVGSVhdIH1cbiAgXTtcbn1cblxuLyoqXG4gKiBMaXN0cyBhIGRpcmVjdG9yeSdzIGVudHJ5IG5hbWVzLCB0cmVhdGluZyBhbiB1bnJlYWRhYmxlIGRpcmVjdG9yeSBhcyBlbXB0eS5cbiAqXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIGxpc3QuXG4gKiBAcmV0dXJucyBUaGUgZW50cnkgbmFtZXMsIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWREaXJlY3RvcnlOYW1lcyhwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlYWRkaXIocGF0aCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBMkJBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QixTQUFTLFlBQVk7QUFPZCxNQUFNLDJDQUEyQztBQU9qRCxNQUFNLHdCQUF3QjtBQUs5QixNQUFNLDZCQUE2QjtBQU1uQyxNQUFNLHdCQUF3QjtBQTBLOUIsU0FBUyxxQkFBcUIsUUFBNkM7QUFDaEYsTUFBSSxPQUFPLHlCQUF5QixHQUFHO0FBQ3JDLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxPQUFPLG9CQUFvQixPQUFPLDRCQUE0QixPQUFPO0FBQzlFO0FBWU8sU0FBUyxvQkFBb0IsUUFBNkM7QUFDL0UsUUFBTSxnQkFBZ0IsT0FBTyxpQkFBaUIsQ0FBQztBQUMvQyxTQUFPLE9BQU8sTUFDWCxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUN6QixPQUFPLENBQUMsU0FBUyxPQUFPLFNBQVMsS0FBSyxDQUFDLFdBQVcsS0FBSyxXQUFXLE1BQU0sQ0FBQyxDQUFDLEVBQzFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsY0FBYyxTQUFTLElBQUksQ0FBQztBQUNuRDtBQVNPLFNBQVMsb0NBQW9DLFNBQXVEO0FBQ3pHLFNBQU8sU0FBUyxnQ0FBZ0M7QUFDbEQ7QUF1QkEsZUFBc0Is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
|
package/dist/lib/esm/library.mjs
CHANGED
|
@@ -488,4 +488,4 @@ ${generateStackTraceLine(line)}`;
|
|
|
488
488
|
export {
|
|
489
489
|
ensureNamespaceBootstrapped
|
|
490
490
|
};
|
|
491
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbWVzcGFjZS1ib290c3RyYXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpbiB0aGVcbiAqIE9ic2lkaWFuIHByb2Nlc3MuIEV4dHJhY3RlZCB0byBpdHMgb3duIG1vZHVsZSB0byBhdm9pZCBkZXBlbmRlbmN5IGN5Y2xlc1xuICogYmV0d2VlbiBgZXZhbC1pbi1vYnNpZGlhbi50c2AgYW5kIHRoZSB0cmFuc3BvcnQgbW9kdWxlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgTW9kaWZpZXIsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBDbGlja0VsZW1lbnRQYXJhbXMsXG4gIENsaWNrTW91c2VQYXJhbXMsXG4gIENyZWF0ZU5vdGVQYXJhbXMsXG4gIEhvdmVyRWxlbWVudFBhcmFtcyxcbiAgTW92ZU1vdXNlUGFyYW1zLFxuICBPcGVuU2V0dGluZ3NUYWJQYXJhbXMsXG4gIFByZXNzS2V5UGFyYW1zLFxuICBUeXBlSW50b0VkaXRvclBhcmFtcyxcbiAgVW5ob3ZlckVsZW1lbnRQYXJhbXMsXG4gIFdhaXRVbnRpbFBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVGdW5jdGlvbkNhbGxQYXJhbXMgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwubWpzJztcbmltcG9ydCB0eXBlIHsgTGliUmVzb2x2ZXIgfSBmcm9tICcuL2xpYi1yZWdpc3RyeS5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVGdW5jdGlvbkNhbGwgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwubWpzJztcbmltcG9ydCB7XG4gIGdldEJvb3RzdHJhcFZlcnNpb24sXG4gIGdldFJlZ2lzdGVyZWRMaWJSZXNvbHZlcnNcbn0gZnJvbSAnLi9saWItcmVnaXN0cnkubWpzJztcbmltcG9ydCB7XG4gIE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUUsXG4gIE1PQklMRV9JTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EU1xufSBmcm9tICcuL21vYmlsZS1pbnB1dC5tanMnO1xuXG5pbnRlcmZhY2UgQm9vdHN0cmFwTmFtZXNwYWNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBob3N0LWluc3RhbGxlZCBgUnVudGltZS5hZGRCaW5kaW5nYCBmdW5jdGlvbiB0aGUgbW9iaWxlIHRydXN0ZWQtaW5wdXQgcGF0aCBjYWxscy5cbiAgICpcbiAgICogUGFzc2VkIGluIGFzIGRhdGEgYmVjYXVzZSB0aGUgYm9vdHN0cmFwIGNsb3N1cmUgbWF5IG5vdCByZWFkIG91dGVyIHNjb3BlICgqKkwxNSoqKSwgc28gaXQgY2Fubm90XG4gICAqIGltcG9ydCB7QGxpbmsgTU9CSUxFX0lOUFVUX0JJTkRJTkdfTkFNRX0gZGlyZWN0bHkuXG4gICAqL1xuICByZWFkb25seSBpbnB1dEJpbmRpbmdOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoZSBtb2JpbGUgdHJ1c3RlZC1pbnB1dCBwYXRoIHdhaXRzIGZvciB0aGUgaG9zdCB0byBhbnN3ZXIgb25lIHJlcXVlc3QuXG4gICAqL1xuICByZWFkb25seSBpbnB1dFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIHJlYWRvbmx5IGxpYlJlc29sdmVyczogTGliUmVzb2x2ZXJbXTtcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhlIGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgbmFtZXNwYWNlIGlzIGJvb3RzdHJhcHBlZFxuICogaW4gdGhlIE9ic2lkaWFuIHByb2Nlc3Mgd2l0aCB0aGUgY3VycmVudCBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUGVyZm9ybXMgYSBsaWdodHdlaWdodCB2ZXJzaW9uIGNoZWNrIHZpYSB0aGUgdHJhbnNwb3J0LiBJZiB0aGUgbmFtZXNwYWNlXG4gKiBkb2Vzbid0IGV4aXN0IG9yIGhhcyBhIGRpZmZlcmVudCB2ZXJzaW9uLCBzZW5kcyB0aGUgZnVsbCBib290c3RyYXAgZXhwcmVzc2lvblxuICogdG8gcmVnaXN0ZXIgYWxsIGhlbHBlciBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSB0cmFuc3BvcnQgdG8gdXNlIGZvciBldmFsdWF0aW9uLlxuICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeSAodmF1bHQgcGF0aCkuXG4gKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gT3B0aW9uYWwgcGVyLWV2YWwgdGltZW91dC4gRm9yd2FyZGVkIHRvIGJvdGhcbiAqICAgdGhlIHZlcnNpb24gY2hlY2sgYW5kIHRoZSBib290c3RyYXAgZXZhbCBzbyBhIGh1bmcgYG9ic2lkaWFuIGV2YWxgIHJlamVjdHNcbiAqICAgaW5zdGVhZCBvZiBibG9ja2luZyB0aGUgY2FsbGVyIGluZGVmaW5pdGVseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0LCBjd2Q6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGV2YWxPcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyA9IHtcbiAgICBjd2QsXG4gICAgLi4uKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gIH07XG4gIGNvbnN0IGJvb3RzdHJhcFZlcnNpb24gPSBnZXRCb290c3RyYXBWZXJzaW9uKCk7XG4gIGNvbnN0IHZlcnNpb25Kc29uID0gSlNPTi5zdHJpbmdpZnkoYm9vdHN0cmFwVmVyc2lvbik7XG4gIGNvbnN0IHZlcnNpb25NYXRjaEpzb24gPSBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoXG4gICAgYEpTT04uc3RyaW5naWZ5KHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy52ZXJzaW9uID09PSAke3ZlcnNpb25Kc29ufSlgLFxuICAgIGV2YWxPcHRpb25zXG4gICk7XG5cbiAgaWYgKHZlcnNpb25NYXRjaEpzb24gPT09ICd0cnVlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJvb3RzdHJhcEV4cHJlc3Npb24gPSBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbChib290c3RyYXBOYW1lc3BhY2UsIHtcbiAgICBpbnB1dEJpbmRpbmdOYW1lOiBNT0JJTEVfSU5QVVRfQklORElOR19OQU1FLFxuICAgIGlucHV0VGltZW91dEluTWlsbGlzZWNvbmRzOiBNT0JJTEVfSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgbGliUmVzb2x2ZXJzOiBbLi4uZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVycygpXSxcbiAgICB2ZXJzaW9uOiBib290c3RyYXBWZXJzaW9uXG4gIH0pO1xuICBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoYm9vdHN0cmFwRXhwcmVzc2lvbiwgZXZhbE9wdGlvbnMpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gU2VyaWFsaXplZCB2aWEgdG9TdHJpbmcoKSBhbmQgZXhlY3V0ZWQgaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLCBub3QgaW4gTm9kZS4gQ292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cy4gKi9cblxuLyoqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSB3aXRoIGFsbFxuICogaGVscGVyIGZ1bmN0aW9ucy4gU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBzZW50IHRvIE9ic2lkaWFuIG9uY2VcbiAqIHBlciBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUHJlc2VydmVzIGBjb250ZXh0c2AgYWNyb3NzIHZlcnNpb24gdXBncmFkZXMgc28gbGl2ZSB7QGxpbmsgQ29udGV4dElkfVxuICogcmVmZXJlbmNlcyBzdXJ2aXZlLlxuICpcbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUgXHUyMDE0IGl0IGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYC5cbiAqXG4gKiBAcGFyYW0gYm9vdHN0cmFwUGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHRoZSBsaWJyYXJ5IHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGJvb3RzdHJhcE5hbWVzcGFjZShib290c3RyYXBQYXJhbXM6IEdlbmVyYXRlRnVuY3Rpb25DYWxsUGFyYW1zPEJvb3RzdHJhcE5hbWVzcGFjZVBhcmFtcz4pOiB2b2lkIHtcbiAgaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gICAgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZzogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGU7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIGNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICAgIG9ic2lkaWFuTW9kdWxlPzogdW5rbm93bjtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlIGV4dGVuZHMgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cml2aWFsIFx1MjAxNCByZWFkc1xuICAgICAqIGB3aW5kb3cuYXBwYCwgd2hpY2ggZXZlcnkgY2xvc3VyZSBhbHJlYWR5IHJlY2VpdmVzIGRpcmVjdGx5IGFzIGl0cyBgYXBwYFxuICAgICAqIGFyZywgc28gdGhlcmUgaXMgbm90aGluZyBnZW5lcmFsLXB1cnBvc2UgdG8gc2hhcmUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0IGlzIHRoZSByZW5kZXJlciBoYWxmIG9mXG4gICAgICogdGhlIG1vYmlsZSB0cnVzdGVkLWlucHV0IGNoYW5uZWwncyAqKmV4YWN0bHktb25jZSoqIGd1YXJhbnRlZSAoKipMMzkqKikuXG4gICAgICpcbiAgICAgKiBDRFAgYnJvYWRjYXN0cyBgUnVudGltZS5iaW5kaW5nQ2FsbGVkYCB0byAqKmV2ZXJ5KiogYXR0YWNoZWQgc2Vzc2lvbiwgc28gZXZlcnkgTm9kZSBwcm9jZXNzXG4gICAgICogaG9sZGluZyBhbiBpbnB1dCBjaGFubmVsIHRvIHRoaXMgV2ViVmlldyBzZXJ2aWNlcyB0aGUgc2FtZSByZXF1ZXN0IFx1MjAxNCBhbmQgZWFjaCBvbmUgaW5qZWN0cyB0aGVcbiAgICAgKiBmdWxsIGdlc3R1cmUuIFdpdGggdHdvIHByb2Nlc3NlcyBhdHRhY2hlZCAoYSBWaXRlc3QgbWFpbiBwcm9jZXNzIGFuZCBpdHMgd29ya2VyLCB3aGljaCBpcyB0aGVcbiAgICAgKiBvcmRpbmFyeSBjb25zdW1lciBzaGFwZSkgb25lIGBjbGlja0VsZW1lbnRgIHRoZXJlZm9yZSBhcnJpdmVkIGFzIFRXTyB0YXBzLCBhbmQgb25lIGBwcmVzc0tleWAgYXNcbiAgICAgKiB0d28ga2V5IHByZXNzZXMuIE1lYXN1cmVkIDIwMjYtMDktMTA6IHR3byBwaWRzIHNlcnZpY2luZyByZXF1ZXN0IGBpZD0xYCBpbiB0aGUgc2FtZSBtaWxsaXNlY29uZC5cbiAgICAgKlxuICAgICAqIFRoZSBjbGFpbSBpcyBtYWRlIGluIHRoZSBQQUdFIHJhdGhlciB0aGFuIGluIGFueSBob3N0IGJlY2F1c2UgdGhlIHBhZ2UgaXMgdGhlIG9ubHkgdGhpbmcgYWxsIHRoZVxuICAgICAqIGhvc3RzIHNoYXJlLiBKYXZhU2NyaXB0IGlzIHNpbmdsZS10aHJlYWRlZCwgc28gdHdvIGBSdW50aW1lLmV2YWx1YXRlYCBjYWxscyByYWNpbmcgZm9yIHRoZSBzYW1lXG4gICAgICogaWQgYXJlIHNlcmlhbGl6ZWQgYW5kIGV4YWN0bHkgb25lIHNlZXMgYHRydWVgLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIHJlcXVlc3QgaWQgdG8gY2xhaW0uXG4gICAgICogQHJldHVybnMgYHRydWVgIGZvciB0aGUgZmlyc3QgY2FsbGVyIHRvIGNsYWltIHRoaXMgaWQsIGBmYWxzZWAgZm9yIGV2ZXJ5IGxhdGVyIG9uZS5cbiAgICAgKi9cbiAgICBjbGFpbUlucHV0KGlkOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBJdFxuICAgICAqIG93bnMgdGhlIGhhcm5lc3MgdGVzdCB3aW5kb3cncyBsaWZlY3ljbGUgdmlhIEVsZWN0cm9uIChgd2luZG93LmVsZWN0cm9uV2luZG93YCksXG4gICAgICogd2hpY2ggaXMgdGhlIGhhcm5lc3MncyBjb25jZXJuLCBub3QgYSBnZW5lcmFsIHV0aWxpdHkuXG4gICAgICovXG4gICAgZGVzdHJveUN1cnJlbnRXaW5kb3coKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIFN5bmNlZCB3aXRoIGBvYnNpZGlhbi1kZXYtdXRpbHNgIChtaXJyb3IgYHdvcmtzcGFjZS50c2ApIFx1MjAxNCBzZWUgTDE3LlxuICAgICAqL1xuICAgIGVuc3VyZUxheW91dFJlYWR5KCk6IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBTeW5jZWQgd2l0aCBgb2JzaWRpYW4tZGV2LXV0aWxzYCAobWlycm9yIGBlcnJvci50c2ApIFx1MjAxNCBzZWUgTDE3LlxuICAgICAqL1xuICAgIGVycm9yVG9TdHJpbmcoZXJyb3I6IHVua25vd24pOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIFRoaXNcbiAgICAgKiBpcyB0aGUgaGFybmVzcydzIG93biBldmFsIHBsdW1iaW5nIChidWlsZHMgdGhlIGBsaWJgIGJhZywgcmVzb2x2ZXMgdGhlXG4gICAgICogbW9kdWxlLCBpbnZva2VzIHRoZSBjbG9zdXJlLCBlbnZlbG9wZXMgdGhlIHJlc3VsdCkgXHUyMDE0IG1lYW5pbmdsZXNzIG91dHNpZGVcbiAgICAgKiB0aGUgaGFybmVzcy5cbiAgICAgKi9cbiAgICBldmFsV3JhcHBlcihuc1BhcmFtczogRXZhbFdyYXBwZXJQYXJhbXMpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0IGlzXG4gICAgICogdGhlIGhhcm5lc3MncyBvbmUtdGltZSBib290c3RyYXAgdGhhdCByZXNvbHZlcyB0aGUgYG9ic2lkaWFuYCBtb2R1bGUgZm9yXG4gICAgICogdGhlIHByb2Nlc3M7IGNsb3N1cmVzIG9idGFpbiBpdCBkaXJlY3RseSB2aWEgdGhlaXIgYG9ic2lkaWFuTW9kdWxlYCBhcmcuXG4gICAgICovXG4gICAgZ2V0T2JzaWRpYW5Nb2R1bGUoKTogUHJvbWlzZTx1bmtub3duPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gUmF3XG4gICAgICogRWxlY3Ryb24gSVBDIChgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jYCkgaXMgYSBoYXJuZXNzL3RyYW5zcG9ydFxuICAgICAqIHByaW1pdGl2ZSwgbm90IGEgZ2VuZXJhbC1wdXJwb3NlIGhlbHBlci5cbiAgICAgKi9cbiAgICBpcGNTZW5kU3luYyhuc1BhcmFtczogSXBjU2VuZFN5bmNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBJdCBpc1xuICAgICAqIHBhcnQgb2YgdGhlIGhhcm5lc3MncyB2YXVsdC1wYXRoIGhhbmRzaGFrZSB3aXRoIHRoZSBOb2RlIHNpZGUsIG5vdCBhXG4gICAgICogZ2VuZXJhbCB1dGlsaXR5LlxuICAgICAqL1xuICAgIHBvbGxWYXVsdEJhc2VQYXRoKCk6IFByb21pc2U8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXMgdGhlIHJlbmRlcmVyIGVuZCBvZiB0aGVcbiAgICAgKiBtb2JpbGUgdHJ1c3RlZC1pbnB1dCBjaGFubmVsICgqKkwzOSoqKSBcdTIwMTQgdGhlIGhvc3QgY2FsbHMgaXQgb3ZlciBDRFAgdG8gYW5zd2VyIGEgcmVxdWVzdCB0aGlzXG4gICAgICogY2xvc3VyZSBpcyBhd2FpdGluZywgc28gaXQgaXMgbWVhbmluZ2xlc3Mgb3V0c2lkZSB0aGUgaGFybmVzcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZCAtIFRoZSByZXF1ZXN0IGlkIGJlaW5nIGFuc3dlcmVkLlxuICAgICAqIEBwYXJhbSBlcnJvck1lc3NhZ2UgLSBXaHkgdGhlIGluamVjdGlvbiBmYWlsZWQsIG9yIGBudWxsYCBvbiBzdWNjZXNzLlxuICAgICAqL1xuICAgIHJlc29sdmVJbnB1dChpZDogc3RyaW5nLCBlcnJvck1lc3NhZ2U6IG51bGwgfCBzdHJpbmcpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IG5pY2hlL3RyaXZpYWwgXHUyMDE0IGFcbiAgICAgKiBvbmUtbGluZSBgbG9jYWxTdG9yYWdlLnNldEl0ZW1gIHdyYXBwZXIgdXNlZCBvbmx5IGJ5IHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIHNldExvY2FsU3RvcmFnZUl0ZW0obnNQYXJhbXM6IFNldExvY2FsU3RvcmFnZUl0ZW1QYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRlbGliZXJhdGUgc2VhbSBgb2JzaWRpYW4tZGV2LXV0aWxzYCByZWFkcyBvbiBtb2JpbGUgXHUyMDE0IHRoZSBvbmUgbmFtZXNwYWNlIG1lbWJlciB0aGF0IGV4aXN0cyBmb3JcbiAgICAgKiBhbm90aGVyIHBhY2thZ2UgcmF0aGVyIHRoYW4gZm9yIHRoZSBoYXJuZXNzLiBJdHMgKipMMTcqKiBtaXJyb3IgKGBkZXNrdG9wLXRydXN0ZWQtaW5wdXQudHNgKSBjYW5cbiAgICAgKiByZWFjaCBhIHRydXN0ZWQgZXZlbnQgb24gZGVza3RvcCBieSBpdHNlbGYsIGJ1dCBvbiBtb2JpbGUgdGhlIGluamVjdGlvbiBoYXMgdG8gY29tZSBmcm9tIHRoZSBOb2RlXG4gICAgICogc2lkZSBvdmVyIHRoZSBoYXJuZXNzJ3MgQ0RQIGNoYW5uZWwgKCoqTDM5KiopLCBhbmQgYG9ic2lkaWFuLWRldi11dGlsc2AgbXVzdCBuZXZlciBpbXBvcnQgdGhpc1xuICAgICAqIHBhY2thZ2UgYXQgcnVudGltZSAoaXRzIG93biBwZWVyLWRlcGVuZGVuY3kgcnVsZSkuIFNvIGl0IHJlYWRzIHRoZXNlIG9mZlxuICAgICAqIGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgaW5zdGVhZCwgZGVjbGFyaW5nIHRoZSBzaGFwZSBsb2NhbGx5LlxuICAgICAqXG4gICAgICogVGhlc2UgYXJlIHRoZSAqKnNhbWUgZnVuY3Rpb24gb2JqZWN0cyoqIGBldmFsV3JhcHBlcmAgcHV0cyBpbiBhIGNsb3N1cmUncyBgbGliYCBiYWcsIG5vdCB3cmFwcGVyczpcbiAgICAgKiBlYWNoIGFscmVhZHkgYnJhbmNoZXMgb24gYFBsYXRmb3JtLmlzTW9iaWxlYCBpbnRlcm5hbGx5LCBzbyB0aGUgbW9iaWxlIHNlbWFudGljcyBsaXZlIGluIGV4YWN0bHkgb25lXG4gICAgICogcGxhY2UgYW5kIG9uZSBzZWFtIHNlcnZlcyBib3RoIHBsYXRmb3Jtcy5cbiAgICAgKi9cbiAgICByZWFkb25seSB0cnVzdGVkSW5wdXQ6IFRydXN0ZWRJbnB1dEhlbHBlcnM7XG4gIH1cblxuICBpbnRlcmZhY2UgRXZhbFdyYXBwZXJQYXJhbXMge1xuICAgIGNhbGxiYWNrKGZ1bmN0aW9uQXJndW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHVua25vd247XG4gICAgcmVhZG9ubHkgY29udGV4dElkPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGlucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIGludGVyZmFjZSBGaWxlU3lzdGVtQWRhcHRlckxpa2Uge1xuICAgIGJhc2VQYXRoPzogc3RyaW5nO1xuICAgIGdldEJhc2VQYXRoPygpOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSXBjU2VuZFN5bmNQYXJhbXMge1xuICAgIHJlYWRvbmx5IGNoYW5uZWw6IHN0cmluZztcbiAgICByZWFkb25seSBjaGFubmVsQXJndW1lbnRzOiB1bmtub3duW107XG4gIH1cblxuICAvLyBDb21tdW5pdHktcGx1Z2luIEFQSSBtZW1iZXJzIHRoYXQgb2xkIE9ic2lkaWFuIHZlcnNpb25zIChlLmcuIDAuNi54KSBsYWNrLlxuICAvLyBgb2JzaWRpYW4tdHlwaW5nc2AgZGVjbGFyZXMgdGhlbSBhcyBhbHdheXMtcHJlc2VudCwgc28gcHJvYmUgdGhyb3VnaCB0aGlzXG4gIC8vIG9wdGlvbmFsLW1lbWJlciB2aWV3IHRvIGRldGVjdCB0aGVpciBydW50aW1lIGFic2VuY2Ugd2l0aG91dCBhIGZhbHNlXG4gIC8vIGBuby11bm5lY2Vzc2FyeS1jb25kaXRpb25gLlxuICBpbnRlcmZhY2UgUGx1Z2luc0xpa2Uge1xuICAgIGlzRW5hYmxlZD8oKTogYm9vbGVhbjtcbiAgICBsb2FkUGx1Z2luPyhpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgICBtYW5pZmVzdHM/OiB1bmtub3duO1xuICAgIHVuaW5zdGFsbFBsdWdpbj8oaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gIH1cblxuICBpbnRlcmZhY2UgU2V0TG9jYWxTdG9yYWdlSXRlbVBhcmFtcyB7XG4gICAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbiAgfVxuXG4gIC8vIFRoZSBzaGFwZSBvZiB0aGUgYHRydXN0ZWRJbnB1dGAgc2VhbS4gRXZlcnkgbWVtYmVyIGlzIG9uZSBvZiB0aGUgTDE3LXN5bmNlZCBoZWxwZXJzLCBleHBvc2VkIGFzIHRoZVxuICAvLyBzYW1lIGZ1bmN0aW9uIG9iamVjdCBgZXZhbFdyYXBwZXJgIHB1dHMgaW4gYSBjbG9zdXJlJ3MgYGxpYmAgYmFnLlxuICBpbnRlcmZhY2UgVHJ1c3RlZElucHV0SGVscGVycyB7XG4gICAgY2xpY2tFbGVtZW50KGNsaWNrUGFyYW1zOiBDbGlja0VsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGNsaWNrTW91c2UoY2xpY2tQYXJhbXM6IENsaWNrTW91c2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGhvdmVyRWxlbWVudChob3ZlclBhcmFtczogSG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgICBtb3ZlTW91c2UobW92ZVBhcmFtczogTW92ZU1vdXNlUGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgICBwcmVzc0tleShwcmVzc1BhcmFtczogUHJlc3NLZXlQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHR5cGVJbnRvRWRpdG9yKHR5cGVQYXJhbXM6IFR5cGVJbnRvRWRpdG9yUGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgICB1bmhvdmVyRWxlbWVudCh1bmhvdmVyUGFyYW1zOiBVbmhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD47XG4gIH1cblxuICAvLyBgVmF1bHQuY29uZmlnRGlyYCBpcyBkZWNsYXJlZCBhbHdheXMtcHJlc2VudCBieSBgb2JzaWRpYW4tdHlwaW5nc2AsIGJ1dCBvbGRcbiAgLy8gT2JzaWRpYW4gdmVyc2lvbnMgKGUuZy4gMC45LjEwKSBsZWF2ZSBpdCB1bmRlZmluZWQgYXQgcnVudGltZS4gUHJvYmUgdGhyb3VnaFxuICAvLyB0aGlzIG9wdGlvbmFsLW1lbWJlciB2aWV3IHNvIGEgYD8/ICcub2JzaWRpYW4nYCBkZWZhdWx0IGlzIG5vdCBmbGFnZ2VkIGFzIGFuXG4gIC8vIHVubmVjZXNzYXJ5IGNvbmRpdGlvbi5cbiAgaW50ZXJmYWNlIFZhdWx0TGlrZSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gU3RydWN0dXJhbCBtaXJyb3Igb2YgT2JzaWRpYW4ncyBvd24gYFZhdWx0LmNvbmZpZ0RpcmA7IHRoZSBuYW1lIGhhcyB0byBtYXRjaCBmb3IgdGhlIHByb2JlIHRvIHJlYWQgaXQuXG4gICAgY29uZmlnRGlyPzogc3RyaW5nO1xuICB9XG5cbiAgLy8gYHdpbmRvdy5hcHBgIC8gYGFwcC53b3Jrc3BhY2VgIGFyZSBkZWNsYXJlZCBhbHdheXMtcHJlc2VudCwgYnV0IGFyZSB0cmFuc2llbnRseVxuICAvLyB1bmRlZmluZWQgZHVyaW5nIGJvb3QgYW5kIGFmdGVyIGFuIG93bmVkLXdpbmRvdyByZWxvYWQuIFByb2JlIHRocm91Z2ggdGhlc2VcbiAgLy8gb3B0aW9uYWwtbWVtYmVyIHZpZXdzIHNvIHRoZSByZWFkaW5lc3MgY2hlY2sgY2FuIGd1YXJkIHRoZW0gd2l0aG91dCBhIGZhbHNlXG4gIC8vIGBuby11bm5lY2Vzc2FyeS1jb25kaXRpb25gLlxuICBpbnRlcmZhY2UgV29ya3NwYWNlTGlrZSB7XG4gICAgbGF5b3V0UmVhZHk/OiBib29sZWFuO1xuICB9XG5cbiAgaW50ZXJmYWNlIEFwcExpa2Uge1xuICAgIHdvcmtzcGFjZT86IFdvcmtzcGFjZUxpa2U7XG4gIH1cblxuICB0eXBlIEN1cnJlbnRXZWJDb250ZW50cyA9IFJldHVyblR5cGU8V2luZG93WydlbGVjdHJvbiddWydyZW1vdGUnXVsnZ2V0Q3VycmVudFdlYkNvbnRlbnRzJ10+O1xuXG4gIC8vIFRoZSBFbGVjdHJvbiBtb2RpZmllci1rZXkgbmFtZXMgYHNlbmRJbnB1dEV2ZW50YCBhY2NlcHRzIChlLmcuICdtZXRhJywgJ2NvbnRyb2wnLCAnc2hpZnQnLCAnYWx0JykuXG4gIC8vIERlcml2ZWQgZnJvbSB0aGUgd2ViLWNvbnRlbnRzIHR5cGUgc28gaXQgc3RheXMgaW4gc3luYyB3aXRoIHRoZSBFbGVjdHJvbiB0eXBpbmdzLlxuICB0eXBlIEVsZWN0cm9uTW9kaWZpZXIgPSBOb25OdWxsYWJsZTxQYXJhbWV0ZXJzPEN1cnJlbnRXZWJDb250ZW50c1snc2VuZElucHV0RXZlbnQnXT5bMF1bJ21vZGlmaWVycyddPltudW1iZXJdO1xuXG4gIGludGVyZmFjZSBPYnNpZGlhbk1vZHVsZVdpdGhQbGF0Zm9ybSB7XG4gICAgUGxhdGZvcm06IE9ic2lkaWFuUGxhdGZvcm07XG4gIH1cblxuICBpbnRlcmZhY2UgT2JzaWRpYW5QbGF0Zm9ybSB7XG4gICAgaXNNYWNPUzogYm9vbGVhbjtcbiAgICBpc01vYmlsZTogYm9vbGVhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHRydXN0ZWQtaW5wdXQgcmVxdWVzdCBoYW5kZWQgdG8gdGhlIGhvc3Qgb3ZlciB0aGUgYFJ1bnRpbWUuYWRkQmluZGluZ2AgY2hhbm5lbC5cbiAgICpcbiAgICogU3RydWN0dXJhbGx5IGlkZW50aWNhbCB0byBgTW9iaWxlSW5wdXRSZXF1ZXN0YCBpbiBgbW9iaWxlLWlucHV0LnRzYCwgcmVkZWNsYXJlZCBoZXJlIGJlY2F1c2UgdGhpc1xuICAgKiBjbG9zdXJlIGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYCBhbmQgY2Fubm90IGltcG9ydCAoKipMMTUqKikuIFRoZSB0d28gYXJlIG9uZSB3aXJlIGZvcm1hdDsgY2hhbmdlXG4gICAqIHRoZW0gdG9nZXRoZXIuXG4gICAqL1xuICB0eXBlIE1vYmlsZUlucHV0UmVxdWVzdCA9IE1vYmlsZUtleUlucHV0UmVxdWVzdCB8IE1vYmlsZVBvaW50ZXJJbnB1dFJlcXVlc3Q7XG5cbiAgaW50ZXJmYWNlIE1vYmlsZUtleUlucHV0UmVxdWVzdCB7XG4gICAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkga2luZDogJ2tleSc7XG4gICAgcmVhZG9ubHkgbW9kaWZpZXJzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgfVxuXG4gIGludGVyZmFjZSBNb2JpbGVQb2ludGVySW5wdXRSZXF1ZXN0IHtcbiAgICByZWFkb25seSBraW5kOiAnbG9uZ1ByZXNzJyB8ICd0YXAnO1xuICAgIHJlYWRvbmx5IG1vZGlmaWVyczogcmVhZG9ubHkgc3RyaW5nW107XG4gICAgcmVhZG9ubHkgeDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IHk6IG51bWJlcjtcbiAgfVxuXG4gIGludGVyZmFjZSBQZW5kaW5nSW5wdXQge1xuICAgIHJlamVjdChlcnJvcjogRXJyb3IpOiB2b2lkO1xuICAgIHJlc29sdmUoKTogdm9pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxheSAoaW4gbXMpIGJlZm9yZSBpbnZva2luZyBgZWxlY3Ryb25XaW5kb3cuZGVzdHJveSgpYCBzbyB0aGUgZXZhbCB0aGF0XG4gICAqIHRyaWdnZXJlZCB0aGUgY2FsbCBoYXMgdGltZSB0byByZXR1cm4gaXRzIHJlc3VsdCB0byB0aGUgY2FsbGVyLiBXaXRob3V0XG4gICAqIGl0IHRoZSByZW5kZXJlciBkaWVzIGJlZm9yZSB0aGUgSVBDIHJlcGx5IHNoaXBzLCB0aGUgY2FsbGVyIHdhaXRzIGZvciB0aGVcbiAgICogZnVsbCBldmFsIHRpbWVvdXQsIGFuZCBzdGFsZSBgQnJvd3NlcldpbmRvd2AgZW50cmllcyBwaWxlIHVwLlxuICAgKi9cbiAgY29uc3QgREVTVFJPWV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSA1MDtcblxuICAvKipcbiAgICogSW50ZXJ2YWwgKGluIG1zKSBiZXR3ZWVuIHBvbGxzIHdoaWxlIHdhaXRpbmcgZm9yIGEgdHJ1c3RlZCBpbnB1dCBldmVudCB0b1xuICAgKiB0YWtlIGVmZmVjdCAodGhlIGVkaXRvciBkb2N1bWVudCB1cGRhdGVzLCBvciBhbiBlbGVtZW50J3MgYDpob3ZlcmAgc3RhdGVcbiAgICogZmxpcHMpLiBTaGFyZWQgYnkgZXZlcnkgdHJ1c3RlZC1pbnB1dCBoZWxwZXIuXG4gICAqL1xuICBjb25zdCBJTlBVVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHRpbWUgKGluIG1zKSB0byB3YWl0IGZvciBhIHRydXN0ZWQgaW5wdXQgZXZlbnQgdG8gdGFrZSBlZmZlY3RcbiAgICogYmVmb3JlIGdpdmluZyB1cCAodGhlIGV4cGVjdGVkIG91dGNvbWUgd2hlbiB0aGUgaW5wdXQgaXMgcmVqZWN0ZWQgXHUyMDE0IGUuZy4gYVxuICAgKiByZWFkLW9ubHkgZWRpdG9yLCBvciBhIHBvaW50ZXIgbW92ZSB0aGF0IG5ldmVyIGxhbmRzIG9uIHRoZSBlbGVtZW50KS5cbiAgICovXG4gIGNvbnN0IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcblxuICAvKipcbiAgICogRGVmYXVsdCBtYXhpbXVtIHRpbWUgKGluIG1zKSB7QGxpbmsgb3BlblNldHRpbmdzVGFifSB3YWl0cyBmb3IgdGhlIHNldHRpbmdzXG4gICAqIG1vZGFsIHRvIG9wZW4gYW5kIGZvciB0aGUgcmVxdWVzdGVkIHRhYiB0byByZW5kZXIsIHdoZW4gdGhlIGNhbGxlciBkb2VzIG5vdFxuICAgKiBvdmVycmlkZSBpdC5cbiAgICovXG4gIGNvbnN0IFNFVFRJTkdTX1RBQl9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgaW50ZXJ2YWwgKGluIG1zKSBiZXR3ZWVuIHtAbGluayB3YWl0VW50aWx9IHByZWRpY2F0ZSBjaGVja3Mgd2hlbiB0aGVcbiAgICogY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heGltdW0gdGltZSAoaW4gbXMpIHtAbGluayB3YWl0VW50aWx9IHdhaXRzIGZvciBpdHMgcHJlZGljYXRlIHRvXG4gICAqIGJlY29tZSB0cnV0aHkgYmVmb3JlIHJlamVjdGluZywgd2hlbiB0aGUgY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IHRpbWVzIHtAbGluayBjcmVhdGVOb3RlfSByZXdyaXRlcyBhIG5vdGUgd2hvc2UgY29udGVudCBkaWQgbm90XG4gICAqIHJlYWNoIHRoZSBmaWxlc3lzdGVtIGJlZm9yZSBnaXZpbmcgdXAuXG4gICAqXG4gICAqIFRoZSBBbmRyb2lkIGVtdWxhdG9yIGxvc2VzIHJvdWdobHkgMSB3cml0ZSBpbiAxMTAsIHNvIGEgc2luZ2xlIHJlcGFpclxuICAgKiBhbHJlYWR5IG1ha2VzIGEgbG9zdCBub3RlIGFzdHJvbm9taWNhbGx5IHVubGlrZWx5OyB0aGUgZXh0cmEgYXR0ZW1wdHMgY29zdFxuICAgKiBub3RoaW5nIHdoZW4gbm90aGluZyBpcyBsb3N0LCBhbmQgdGhlIGNhcCBpcyB3aGF0IGtlZXBzIGEgZ2VudWluZWx5IGJyb2tlblxuICAgKiB3cml0ZSBmcm9tIGJlaW5nIHJldHJpZWQgZm9yZXZlciBpbnN0ZWFkIG9mIGZhaWxpbmcgd2l0aCBhIHJlYWRhYmxlIGVycm9yLlxuICAgKi9cbiAgY29uc3QgQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQgPSAzO1xuXG4gIC8qKlxuICAgKiBQcmVmaXggdXNlZCBieSB7QGxpbmsgZXJyb3JUb1N0cmluZ30ncyBuZXN0ZWQtZXJyb3Igc2VwYXJhdG9yIGxpbmVzLCBtYXRjaGluZ1xuICAgKiB0aGUgYCAgICBhdGAgcHJlZml4IG9mIGEgVjggc3RhY2stdHJhY2UgZnJhbWUgc28gdGhlIHNlcGFyYXRvcnMgYmxlbmQgaW50b1xuICAgKiB0aGUgc3Vycm91bmRpbmcgc3RhY2suIEtlcHQgaWRlbnRpY2FsIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgJyBgZXJyb3JUb1N0cmluZ2AuXG4gICAqL1xuICBjb25zdCBTVEFDS19UUkFDRV9QUkVGSVggPSAnICAgIGF0JztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gQXBwcm92ZWQgZG91YmxlIGNhc3Q6IGBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBpcyBvdXIgaW50ZXJuYWwgV2luZG93IGF1Z21lbnRhdGlvbiwgaW50ZW50aW9uYWxseSBrZXB0IGxvY2FsIChub3QgZGVjbGFyZWQgZ2xvYmFsbHkpIHRvIGF2b2lkIGxlYWtpbmcgaW50byBjb25zdW1lciB0eXBlcy5cbiAgY29uc3QgaG9sZGVyID0gZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFBhcnRpYWw8SW50ZWdyYXRpb25UZXN0aW5nSG9sZGVyPjtcbiAgY29uc3QgZXhpc3RpbmdDb250ZXh0cyA9IGhvbGRlci5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5jb250ZXh0cyA/PyB7fTtcbiAgY29uc3QgZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSA9IGhvbGRlci5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5vYnNpZGlhbk1vZHVsZTtcbiAgLy8gV2FybiBhdCBtb3N0IG9uY2UgcGVyIGJvb3RzdHJhcCB0aGF0IGBvYnNpZGlhbk1vZHVsZWAgaXMgYG51bGxgIG9uIHRoaXMgdmVyc2lvbi5cbiAgbGV0IGhhc1dhcm5lZE1pc3NpbmdPYnNpZGlhbk1vZHVsZSA9IGZhbHNlO1xuXG4gIC8vIEluLWZsaWdodCBtb2JpbGUgaW5wdXQgcmVxdWVzdHMsIGtleWVkIGJ5IHJlcXVlc3QgaWQsIGF3YWl0aW5nIHRoZSBob3N0J3MgYW5zd2VyIHZpYSBgcmVzb2x2ZUlucHV0YC5cbiAgY29uc3QgcGVuZGluZ0lucHV0cyA9IG5ldyBNYXA8c3RyaW5nLCBQZW5kaW5nSW5wdXQ+KCk7XG4gIGxldCBuZXh0SW5wdXRJZCA9IDA7XG5cbiAgLy8gUmVxdWVzdCBpZHMgYWxyZWFkeSBjbGFpbWVkIGJ5IHNvbWUgaG9zdCwgc28gYSBzZWNvbmQgYXR0YWNoZWQgaG9zdCBkb2VzIG5vdCBpbmplY3QgdGhlIGdlc3R1cmUgYVxuICAvLyBzZWNvbmQgdGltZSBcdTIwMTQgc2VlIGBjbGFpbUlucHV0YC4gSWRzIGFyZSBtb25vdG9uaWMgd2l0aGluIGEgcGFnZSwgc28gdGhpcyBvbmx5IGdyb3dzIGFzIGZhc3QgYXMgdGhlXG4gIC8vIHJ1biBkcml2ZXMgaW5wdXQsIGFuZCBpdCBkaWVzIHdpdGggdGhlIHBhZ2UuXG4gIGNvbnN0IGNsYWltZWRJbnB1dElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0IG5zOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UgPSB7XG4gICAgZ2V0IGFwcCgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSBgYXBwYCBnZXR0ZXIgcmVhZHMgYHdpbmRvdy5hcHBgIHdoaWNoIGlzIHNldCBieSBPYnNpZGlhbi5cbiAgICAgIHJldHVybiBnbG9iYWxUaGlzLmFwcDtcbiAgICB9LFxuXG4gICAgY2xhaW1JbnB1dCh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIGlmIChjbGFpbWVkSW5wdXRJZHMuaGFzKGlkKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNsYWltZWRJbnB1dElkcy5hZGQoaWQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIGNvbnRleHRzOiBleGlzdGluZ0NvbnRleHRzLFxuXG4gICAgYXN5bmMgZGVzdHJveUN1cnJlbnRXaW5kb3codGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICBhd2FpdCBzbGVlcCgwKTtcbiAgICAgIGNvbnN0IGVsZWN0cm9uV2luZG93ID0gZ2xvYmFsVGhpcy5lbGVjdHJvbldpbmRvdztcbiAgICAgIGdsb2JhbFRoaXMuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGVsZWN0cm9uV2luZG93LmRlc3Ryb3koKTtcbiAgICAgIH0sIERFU1RST1lfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZW5zdXJlTGF5b3V0UmVhZHkodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeShyZXNvbHZlKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBlcnJvclRvU3RyaW5nKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGVycm9yVG9TdHJpbmdJbXBsKGVycm9yKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZXZhbFdyYXBwZXIodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgLy8gT2xkIE9ic2lkaWFuIChlLmcuIDAuNi54KSBwcmVkYXRlcyB0aGUgY29tbXVuaXR5LXBsdWdpbiBBUEk6IGBwbHVnaW5zYFxuICAgICAgLy8gZXhpc3RzIGJ1dCBoYXMgbm8gYGlzRW5hYmxlZGAvYHNldEVuYWJsZWAsIGFuZCB0aGVyZSBhcmUgbm8gdGhpcmQtcGFydHlcbiAgICAgIC8vIHBsdWdpbnMgdG8gZW5hYmxlLCBzbyBza2lwIHRoaXMgc3RlcCB3aGVuIHRoZSBBUEkgaXMgYWJzZW50LlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIHByb2JlIHRoZSBydW50aW1lLW9wdGlvbmFsIGNvbW11bml0eS1wbHVnaW4gQVBJLlxuICAgICAgY29uc3QgcGx1Z2lucyA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmIChwbHVnaW5zLmlzRW5hYmxlZCAmJiAhcGx1Z2lucy5pc0VuYWJsZWQoKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC5wbHVnaW5zLnNldEVuYWJsZSh0cnVlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2lkaWFuTW9kdWxlID0gYXdhaXQgdGhpcy5nZXRPYnNpZGlhbk1vZHVsZSgpO1xuICAgICAgLy8gQXZvaWQgYD8/PWA6IG9sZCBPYnNpZGlhbidzIENocm9taXVtIChlLmcuIDAuNi54IG9uIENocm9taXVtIDgwKSBwcmVkYXRlc1xuICAgICAgLy8gRVMyMDIxIGxvZ2ljYWwtYXNzaWdubWVudCBhbmQgY2Fubm90IHBhcnNlIGl0IGluIHRoaXMgc2VyaWFsaXplZCBib290c3RyYXAuXG4gICAgICBsZXQgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgIGlmIChwYXJhbXMuY29udGV4dElkKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGV4dCA9IHRoaXMuY29udGV4dHNbcGFyYW1zLmNvbnRleHRJZF07XG4gICAgICAgIGlmIChleGlzdGluZ0NvbnRleHQpIHtcbiAgICAgICAgICBjb250ZXh0ID0gZXhpc3RpbmdDb250ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY29udGV4dHNbcGFyYW1zLmNvbnRleHRJZF0gPSBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgaW5qZWN0ZWQgYGxpYmAgYmFnOiBiYXNlIGhlbHBlcnMgZnJvbSB0aGUgaGFybmVzcywgdGhlbiBwcm92aWRlcnMgb24gdG9wLlxuICAgICAgLy8gUmVzb2x2ZXJzIHJ1biBpbi1yZW5kZXJlciAodGhleSByZWFkIHJlbmRlcmVyIGdsb2JhbHMgYSBwcm92aWRlciBwdWJsaXNoZWQpLlxuICAgICAgLy8gUmVidWlsZGluZyBwZXIgZXZhbCBrZWVwcyBgbGliYCBmcmVzaCBhbmQgdG9sZXJhbnQgb2YgYSBsYXRlLWxvYWRlZCBwcm92aWRlci5cbiAgICAgIGNvbnN0IGxpYiA9IHtcbiAgICAgICAgY2xpY2tFbGVtZW50LFxuICAgICAgICBjbGlja01vdXNlLFxuICAgICAgICBjcmVhdGVOb3RlLFxuICAgICAgICBob3ZlckVsZW1lbnQsXG4gICAgICAgIG1vdmVNb3VzZSxcbiAgICAgICAgb3BlblNldHRpbmdzVGFiLFxuICAgICAgICBwcmVzc0tleSxcbiAgICAgICAgdHlwZUludG9FZGl0b3IsXG4gICAgICAgIHVuaG92ZXJFbGVtZW50LFxuICAgICAgICB3YWl0VW50aWxcbiAgICAgIH07XG4gICAgICBmb3IgKGNvbnN0IHJlc29sdmVMaWIgb2YgdGhpcy5saWJSZXNvbHZlcnMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihsaWIsIHJlc29sdmVMaWIoKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmdWxsQXJndW1lbnRzID0geyAuLi5wYXJhbXMuaW5wdXQsIGFwcDogdGhpcy5hcHAsIGNvbnRleHQsIGxpYiwgb2JzaWRpYW5Nb2R1bGUgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhcmFtcy5jYWxsYmFjayhmdWxsQXJndW1lbnRzKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3VuZGVmaW5lZCcgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IHJlc3VsdCB9KTtcbiAgICAgIH0gY2F0Y2ggKGV2YWxFcnJvcikge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnZXJyb3InLCB2YWx1ZTogdGhpcy5lcnJvclRvU3RyaW5nKGV2YWxFcnJvcikgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGdldE9ic2lkaWFuTW9kdWxlKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgaWYgKHRoaXMub2JzaWRpYW5Nb2R1bGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzaWRpYW5Nb2R1bGU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSB0ZW1wLXBsdWdpbiB0cmljayBiZWxvdyByZXNvbHZlcyBgcmVxdWlyZSgnb2JzaWRpYW4nKWAsIHdoaWNoIG9ubHlcbiAgICAgIC8vIHdvcmtzIGluc2lkZSBhIHBsdWdpbi1sb2FkIGNvbnRleHQuIEl0IG5lZWRzIHRoZSBjb21tdW5pdHktcGx1Z2luIHJlZ2lzdHJ5XG4gICAgICAvLyAoYGxvYWRQbHVnaW5gICsgYG1hbmlmZXN0c2ApLCB3aGljaCBGSVJTVCBhcHBlYXJzIGluIE9ic2lkaWFuIDAuOS43OyB0aGVcbiAgICAgIC8vIDAuNi40LTAuOS42IGJhbmQgaGFzIG5vIHJlZ2lzdHJ5IGFuZCBjYW5ub3QgcnVuIGl0LCBzbyByZXR1cm4gYG51bGxgIChub3RcbiAgICAgIC8vIGB1bmRlZmluZWRgKSAtIGFwcC1vbmx5IGNsb3N1cmVzIChgY2FsbGJhY2soeyBhcHAgfSlgKSBzdGlsbCBydW4uXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gcHJvYmUgdGhlIHJ1bnRpbWUtb3B0aW9uYWwgY29tbXVuaXR5LXBsdWdpbiBBUEkuXG4gICAgICBjb25zdCBwbHVnaW5zID0gdGhpcy5hcHAucGx1Z2lucyBhcyB1bmtub3duIGFzIFBsdWdpbnNMaWtlO1xuICAgICAgaWYgKCFwbHVnaW5zLmxvYWRQbHVnaW4gfHwgIXBsdWdpbnMubWFuaWZlc3RzKSB7XG4gICAgICAgIGlmICghaGFzV2FybmVkTWlzc2luZ09ic2lkaWFuTW9kdWxlKSB7XG4gICAgICAgICAgaGFzV2FybmVkTWlzc2luZ09ic2lkaWFuTW9kdWxlID0gdHJ1ZTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nXSBgb2JzaWRpYW5Nb2R1bGVgIGlzIGBudWxsYDogdGhpcyBPYnNpZGlhbiB2ZXJzaW9uIHByZWRhdGVzIHRoZSBjb21tdW5pdHktcGx1Z2luIEFQSSAoYWRkZWQgaW4gMC45LjcpLCBzbyB0aGUgYG9ic2lkaWFuYCBtb2R1bGUgY2Fubm90IGJlIHJlc29sdmVkLiBBcHAtb25seSBjbG9zdXJlcyAoYGNhbGxiYWNrKHsgYXBwIH0pYCkgc3RpbGwgd29yay4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgU0xJQ0VfU1RBUlQgPSAyO1xuICAgICAgY29uc3QgcmFuZG9tU3VmZml4ID0gU3RyaW5nKE1hdGgucmFuZG9tKCkpLnNsaWNlKFNMSUNFX1NUQVJUKTtcbiAgICAgIGNvbnN0IHRlbXBvcmFyeU1vZHVsZU5hbWUgPSBgZ2V0LW9ic2lkaWFuLW1vZHVsZS0ke3JhbmRvbVN1ZmZpeH1gO1xuICAgICAgLy8gT2xkIHZlcnNpb25zIChlLmcuIDAuOS4xMCkgbGVhdmUgYHZhdWx0LmNvbmZpZ0RpcmAgdW5kZWZpbmVkOyBmYWxsIGJhY2sgdG9cbiAgICAgIC8vIE9ic2lkaWFuJ3MgZGVmYXVsdCBjb25maWcgZGlyIHNvIHRoZSB0ZW1wIHBsdWdpbiBzdGlsbCBnZXRzIGEgdmFsaWQgcGF0aCxcbiAgICAgIC8vIGxvYWRzLCBhbmQgaXRzIGByZXF1aXJlKCdvYnNpZGlhbicpYCByZXNvbHZlcyB0aGUgbW9kdWxlLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIGNvbmZpZ0RpciBpcyBydW50aW1lLW9wdGlvbmFsIG9uIG9sZCB2ZXJzaW9ucy5cbiAgICAgIGNvbnN0IGNvbmZpZ0RpcmVjdG9yeSA9ICh0aGlzLmFwcC52YXVsdCBhcyB1bmtub3duIGFzIFZhdWx0TGlrZSkuY29uZmlnRGlyID8/ICcub2JzaWRpYW4nO1xuICAgICAgY29uc3QgcGx1Z2luc0RpcmVjdG9yeSA9IGAke2NvbmZpZ0RpcmVjdG9yeX0vcGx1Z2luc2A7XG4gICAgICBjb25zdCBkaXJlY3RvcnkgPSBgJHtwbHVnaW5zRGlyZWN0b3J5fS8ke3RlbXBvcmFyeU1vZHVsZU5hbWV9YDtcbiAgICAgIHRoaXMuYXBwLnBsdWdpbnMubWFuaWZlc3RzW3RlbXBvcmFyeU1vZHVsZU5hbWVdID0ge1xuICAgICAgICBhdXRob3I6ICcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGBkaXJgIGlzIE9ic2lkaWFuJ3Mgb3duIGBQbHVnaW5NYW5pZmVzdGAgbWVtYmVyIG5hbWUuXG4gICAgICAgIGRpcjogZGlyZWN0b3J5LFxuICAgICAgICBpZDogdGVtcG9yYXJ5TW9kdWxlTmFtZSxcbiAgICAgICAgaXNEZXNrdG9wT25seTogZmFsc2UsXG4gICAgICAgIG1pbkFwcFZlcnNpb246ICcnLFxuICAgICAgICBuYW1lOiB0ZW1wb3JhcnlNb2R1bGVOYW1lLFxuICAgICAgICB2ZXJzaW9uOiAnJ1xuICAgICAgfTtcbiAgICAgIC8vIGBhZGFwdGVyLm1rZGlyYCBpcyBub3QgcmVjdXJzaXZlLCBhbmQgYW4gb2xkIHZlcnNpb24gb24gYSBmcmVzaCB2YXVsdCBtYXkgbm90XG4gICAgICAvLyBoYXZlIHRoZSBjb25maWcvcGx1Z2lucyBkaXJzIHlldCBcdTIwMTQgY3JlYXRlIHRoZSBjaGFpbiBzbyBgbG9hZFBsdWdpbmAgZmluZHMgdGhlXG4gICAgICAvLyB0ZW1wIHBsdWdpbiBhdCBgPGNvbmZpZ0Rpcj4vcGx1Z2lucy88aWQ+YC5cbiAgICAgIGlmICghKGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKGNvbmZpZ0RpcmVjdG9yeSkpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIubWtkaXIoY29uZmlnRGlyZWN0b3J5KTtcbiAgICAgIH1cbiAgICAgIGlmICghKGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKHBsdWdpbnNEaXJlY3RvcnkpKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLm1rZGlyKHBsdWdpbnNEaXJlY3RvcnkpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5ta2RpcihkaXJlY3RvcnkpO1xuXG4gICAgICBjb25zdCBwbHVnaW5GdW5jdGlvbkJvZHkgPSAnY29uc3Qgcj1yZXF1aXJlLGU9ZXhwb3J0cztjb25zdCBtPXIoXFwnb2JzaWRpYW5cXCcpO3dpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLm9ic2lkaWFuTW9kdWxlPW07ZS5kZWZhdWx0PW0uUGx1Z2luOyc7XG4gICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLndyaXRlKGAke2RpcmVjdG9yeX0vbWFpbi5qc2AsIHBsdWdpbkZ1bmN0aW9uQm9keSk7XG5cbiAgICAgIGF3YWl0IHRoaXMuYXBwLnBsdWdpbnMubG9hZFBsdWdpbih0ZW1wb3JhcnlNb2R1bGVOYW1lKTtcbiAgICAgIC8vIGB1bmluc3RhbGxQbHVnaW5gIGFycml2ZWQgYWZ0ZXIgdGhlIHBsdWdpbiBBUEkgaXRzZWxmLCBzbyBpdCBpcyBhYnNlbnQgb25cbiAgICAgIC8vIDAuOS43IC0gdGhlIEZJUlNUIHZlcnNpb24gdG8gZXhwb3NlIGBsb2FkUGx1Z2luYC9gbWFuaWZlc3RzYCAoMC45LjYgYW5kIGJlbG93XG4gICAgICAvLyBoYXZlIG5laXRoZXIsIGFuZCByZXR1cm4gYHVuZGVmaW5lZGAgYWJvdmUpLiBUaGUgbW9kdWxlIGlzIGFscmVhZHkgY2FwdHVyZWQgYnlcbiAgICAgIC8vIHRoZSBwbHVnaW4ncyBgbWFpbi5qc2AgYXQgdGhpcyBwb2ludCwgc28gb25seSB1bmluc3RhbGwgd2hlbiB0aGUgbWV0aG9kIGV4aXN0cztcbiAgICAgIC8vIE9uIDAuOS43IHRoZSB0ZW1wIHBsdWdpbiBsaW5nZXJzIGhhcm1sZXNzbHkgaW4gdGhlIGVwaGVtZXJhbCBvd25lZCB2YXVsdC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSB1bmluc3RhbGxQbHVnaW4gaXMgcnVudGltZS1vcHRpb25hbCBvbiBvbGQgdmVyc2lvbnMuXG4gICAgICBjb25zdCBwbHVnaW5zRm9yQ2xlYW51cCA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmIChwbHVnaW5zRm9yQ2xlYW51cC51bmluc3RhbGxQbHVnaW4pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy51bmluc3RhbGxQbHVnaW4odGVtcG9yYXJ5TW9kdWxlTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9ic2lkaWFuTW9kdWxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9ic2lkaWFuTW9kdWxlO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIG9ic2lkaWFuIG1vZHVsZScpO1xuICAgIH0sXG5cbiAgICBhc3luYyBpcGNTZW5kU3luYyh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIHBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgZ2xvYmFsVGhpcy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyhwYXJhbXMuY2hhbm5lbCwgLi4ucGFyYW1zLmNoYW5uZWxBcmd1bWVudHMpO1xuICAgIH0sXG5cbiAgICBsaWJSZXNvbHZlcnM6IGJvb3RzdHJhcFBhcmFtcy5saWJSZXNvbHZlcnMsXG5cbiAgICBvYnNpZGlhbk1vZHVsZTogZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSxcblxuICAgIGFzeW5jIHBvbGxWYXVsdEJhc2VQYXRoKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAvLyBgd2luZG93LmFwcGAsIGl0cyBgd29ya3NwYWNlYCwgYW5kIGxheW91dCBjYW4gYWxsIGJlIHRyYW5zaWVudGx5XG4gICAgICAvLyB1bmF2YWlsYWJsZSBkdXJpbmcgYm9vdCBvciByaWdodCBhZnRlciBhbiBvd25lZC13aW5kb3cgcmVsb2FkLCBhbmQgb2xkXG4gICAgICAvLyBPYnNpZGlhbiBwcmVkYXRlcyBgV29ya3NwYWNlLm9uTGF5b3V0UmVhZHlgLiBUaGlzIHJ1bnMgaW5zaWRlIHRoZSB0cmFuc3BvcnQnc1xuICAgICAgLy8gcmVhZGluZXNzIHBvbGwsIHdoaWNoIHJldHJpZXMgb24gdGhyb3csIHNvIGNoZWNrIGB3aW5kb3cuYXBwYCBGSVJTVCBhbmQgYmFpbFxuICAgICAgLy8gY2xlYW5seSB1bnRpbCBpdCwgaXRzIHdvcmtzcGFjZSwgYW5kIGxheW91dCBhcmUgYWxsIHJlYWR5IFx1MjAxNCBuZXZlciBkZXJlZmVyZW5jZVxuICAgICAgLy8gYW4gdW5kZWZpbmVkIGB3aW5kb3cuYXBwYC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSB3aW5kb3cuYXBwL3dvcmtzcGFjZSBhcmUgcnVudGltZS1vcHRpb25hbCBkdXJpbmcgYm9vdC5cbiAgICAgIGNvbnN0IGFwcCA9IHRoaXMuYXBwIGFzIHVua25vd24gYXMgQXBwTGlrZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghYXBwPy53b3Jrc3BhY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPd25lZCB2YXVsdCBpcyBub3QgcmVhZHkgeWV0ICh3aW5kb3cuYXBwL3dvcmtzcGFjZSBub3QgaW5pdGlhbGl6ZWQpLicpO1xuICAgICAgfVxuICAgICAgLy8gT2xkIE9ic2lkaWFuIHByZWRhdGVzIGBXb3Jrc3BhY2Uub25MYXlvdXRSZWFkeWAgYnV0IGhhcyBgbGF5b3V0UmVhZHkgPT09IHRydWVgXG4gICAgICAvLyBieSB0aGUgdGltZSBhIHdpbmRvdyBpcyB1cDsgb25seSB3YWl0IHZpYSBgZW5zdXJlTGF5b3V0UmVhZHlgIHdoZW4gaXQgaXMgbm90XG4gICAgICAvLyB5ZXQgcmVhZHkgKG1vZGVybiB2ZXJzaW9ucyBlYXJseSBpbiBib290KSwgc28gdGhlIG1pc3NpbmcgbWV0aG9kIGlzIG5ldmVyIGhpdC5cbiAgICAgIGlmICghYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeSkge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBEYXRhQWRhcHRlciBpcyBhY3R1YWxseSBGaWxlU3lzdGVtQWRhcHRlciBhdCBydW50aW1lIG9uIGRlc2t0b3AuXG4gICAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hcHAudmF1bHQuYWRhcHRlciBhcyB1bmtub3duIGFzIEZpbGVTeXN0ZW1BZGFwdGVyTGlrZTtcbiAgICAgIC8vIE9sZCBPYnNpZGlhbiB2ZXJzaW9ucyAoZS5nLiAwLjYueCkgcHJlZGF0ZSB0aGUgYGdldEJhc2VQYXRoKClgIG1ldGhvZCBidXRcbiAgICAgIC8vIGV4cG9zZSB0aGUgYGJhc2VQYXRoYCBwcm9wZXJ0eTsgdGhlIG1ldGhvZCBleGlzdHMgZnJvbSB+MC45LjIwIG9ud2FyZC5cbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gYWRhcHRlci5nZXRCYXNlUGF0aCA/IGFkYXB0ZXIuZ2V0QmFzZVBhdGgoKSA6IChhZGFwdGVyLmJhc2VQYXRoID8/ICcnKTtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShiYXNlUGF0aCk7XG4gICAgfSxcblxuICAgIHJlc29sdmVJbnB1dCh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIGlkOiBzdHJpbmcsIGVycm9yTWVzc2FnZTogbnVsbCB8IHN0cmluZyk6IHZvaWQge1xuICAgICAgY29uc3QgcGVuZGluZyA9IHBlbmRpbmdJbnB1dHMuZ2V0KGlkKTtcbiAgICAgIGlmICghcGVuZGluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBlbmRpbmdJbnB1dHMuZGVsZXRlKGlkKTtcbiAgICAgIGlmIChlcnJvck1lc3NhZ2UgPT09IG51bGwpIHtcbiAgICAgICAgcGVuZGluZy5yZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcGVuZGluZy5yZWplY3QobmV3IEVycm9yKGVycm9yTWVzc2FnZSkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBzZXRMb2NhbFN0b3JhZ2VJdGVtKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgcGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShwYXJhbXMua2V5LCBwYXJhbXMudmFsdWUpO1xuICAgIH0sXG5cbiAgICAvLyBUaGUgc2FtZSBmdW5jdGlvbiBvYmplY3RzIGBldmFsV3JhcHBlcmAgcHV0cyBpbiBhIGNsb3N1cmUncyBgbGliYCBiYWcgXHUyMDE0IGRlbGliZXJhdGVseSBub3QgcmUtZGVyaXZlZFxuICAgIC8vIGFuZCBub3Qgd3JhcHBlZCwgc28gYG9ic2lkaWFuLWRldi11dGlsc2AgZ2V0cyBleGFjdGx5IHRoZSBoYXJuZXNzJ3MgYmVoYXZpb3Igb24gYm90aCBwbGF0Zm9ybXMuXG4gICAgdHJ1c3RlZElucHV0OiB7XG4gICAgICBjbGlja0VsZW1lbnQsXG4gICAgICBjbGlja01vdXNlLFxuICAgICAgaG92ZXJFbGVtZW50LFxuICAgICAgbW92ZU1vdXNlLFxuICAgICAgcHJlc3NLZXksXG4gICAgICB0eXBlSW50b0VkaXRvcixcbiAgICAgIHVuaG92ZXJFbGVtZW50XG4gICAgfSxcblxuICAgIHZlcnNpb246IGJvb3RzdHJhcFBhcmFtcy52ZXJzaW9uXG4gIH07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGRvdWJsZSBjYXN0OiBgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgaXMgb3VyIGludGVybmFsIFdpbmRvdyBhdWdtZW50YXRpb24sIGludGVudGlvbmFsbHkga2VwdCBsb2NhbCAobm90IGRlY2xhcmVkIGdsb2JhbGx5KSB0byBhdm9pZCBsZWFraW5nIGludG8gY29uc3VtZXIgdHlwZXMuXG4gIChnbG9iYWxUaGlzIGFzIHVua25vd24gYXMgUGFydGlhbDxJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+KS5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nID0gbnM7XG5cbiAgYXN5bmMgZnVuY3Rpb24gdHlwZUludG9FZGl0b3IodHlwZVBhcmFtczogVHlwZUludG9FZGl0b3JQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBGT0NVU19TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuXG4gICAgY29uc3QgeyBlZGl0b3IsIHRleHQgfSA9IHR5cGVQYXJhbXM7XG4gICAgY29uc3QgdmFsdWVCZWZvcmVUeXBpbmcgPSBlZGl0b3IuZ2V0VmFsdWUoKTtcblxuICAgIC8vIEZvY3VzIHRoZSBlZGl0b3IgYW5kIHBsYWNlIHRoZSBjYXJldCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC5cbiAgICBlZGl0b3IuZm9jdXMoKTtcbiAgICBjb25zdCBsYXN0TGluZSA9IGVkaXRvci5sYXN0TGluZSgpO1xuICAgIGVkaXRvci5zZXRDdXJzb3IobGFzdExpbmUsIGVkaXRvci5nZXRMaW5lKGxhc3RMaW5lKS5sZW5ndGgpO1xuXG4gICAgLy8gTGV0IGFueSBmb2N1cyB0cmFwIChhIGBzZXRUaW1lb3V0KDApYCByZS1mb2N1cykgZmlyZSBiZWZvcmUgdHlwaW5nLCBzbyBzdG9sZW4gZm9jdXMgaXMgZGV0ZWN0ZWQuXG4gICAgYXdhaXQgc2xlZXAoRk9DVVNfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICAvLyBUeXBpbmcgaXMgcHJlc3NpbmcgZWFjaCBjaGFyYWN0ZXIga2V5IGluIHR1cm46IGBwcmVzc0tleWAgaW5qZWN0cyB0aGUgc2FtZSB0cnVzdGVkXG4gICAgLy8gYGtleURvd25gIC0+IGBjaGFyYCAtPiBga2V5VXBgIGEgcmVhbCB1c2VyIHByb2R1Y2VzIFx1MjAxNCB0ZXh0IGxhbmRzIG9ubHkgaWYgdGhlIGVkaXRvciBob2xkcyBmb2N1cy5cbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgdGV4dCkge1xuICAgICAgYXdhaXQgcHJlc3NLZXkoeyBrZXk6IGNoYXIgfSk7XG4gICAgfVxuXG4gICAgLy8gUG9sbCB1bnRpbCB0aGUgZG9jdW1lbnQgcmVmbGVjdHMgdGhlIGlucHV0IG9yIHRoZSB0aW1lb3V0IGVsYXBzZXMsIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoZWRpdG9yLmdldFZhbHVlKCkgPT09IHZhbHVlQmVmb3JlVHlwaW5nICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRydWUgd2hlbiB0aGlzIGNsb3N1cmUgaXMgcnVubmluZyBpbiBPYnNpZGlhbiBNb2JpbGUgcmF0aGVyIHRoYW4gdGhlIEVsZWN0cm9uIGRlc2t0b3AgYXBwLlxuICAvLyBSZWFkaW5nIGBQbGF0Zm9ybWAgb2ZmIHRoZSByZXNvbHZlZCBvYnNpZGlhbiBtb2R1bGUgaXMgc2FmZSBoZXJlOiBgZXZhbFdyYXBwZXJgIGFsd2F5cyByZXNvbHZlcyB0aGF0XG4gIC8vIG1vZHVsZSBiZWZvcmUgYW55IGNhbGxiYWNrIGNhbiBydW4sIHdoaWNoIGlzIHRoZSBzYW1lIGd1YXJhbnRlZSBgdG9FbGVjdHJvbk1vZGlmaWVyc2AgcmVsaWVzIG9uLlxuICBmdW5jdGlvbiBjaGVja0lzTW9iaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAobnMub2JzaWRpYW5Nb2R1bGUgYXMgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0pLlBsYXRmb3JtLmlzTW9iaWxlO1xuICB9XG5cbiAgLy8gSGFuZHMgb25lIHRydXN0ZWQtaW5wdXQgcmVxdWVzdCB0byB0aGUgaG9zdCBhbmQgd2FpdHMgZm9yIGl0IHRvIGJlIGluamVjdGVkLlxuICAvL1xuICAvLyBNb2JpbGUgaGFzIG5vIGluLXJlbmRlcmVyIHJvdXRlIHRvIGEgdHJ1c3RlZCBldmVudCBhdCBhbGwgXHUyMDE0IGBkaXNwYXRjaEV2ZW50YCBhbmQgYGVsZW1lbnQuY2xpY2soKWAgYXJlXG4gIC8vIGBpc1RydXN0ZWQgPT09IGZhbHNlYCBieSBzcGVjIFx1MjAxNCBzbyB0aGUgaW5qZWN0aW9uIGhhcyB0byBoYXBwZW4gZnJvbSB0aGUgTm9kZSBzaWRlLCBvdmVyIGEgQ0RQXG4gIC8vIGNvbm5lY3Rpb24gaW5kZXBlbmRlbnQgb2YgdGhlIEFwcGl1bSBzZXNzaW9uIHRoYXQgaXMgY3VycmVudGx5IGJsb2NrZWQgYXdhaXRpbmcgdGhpcyB2ZXJ5IGNsb3N1cmVcbiAgLy8gKHNlZSBMMzkpLiBgYmluZGluZ05hbWVgIGlzIGEgaG9zdC1pbnN0YWxsZWQgZ2xvYmFsOyBjYWxsaW5nIGl0IGRlbGl2ZXJzIHRoZSByZXF1ZXN0LCBhbmQgdGhlIGhvc3RcbiAgLy8gYW5zd2VycyBieSBjYWxsaW5nIGBucy5yZXNvbHZlSW5wdXRgLlxuICBhc3luYyBmdW5jdGlvbiByZXF1ZXN0SG9zdElucHV0KHJlcXVlc3Q6IE1vYmlsZUlucHV0UmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJpbmRpbmdOYW1lID0gYm9vdHN0cmFwUGFyYW1zLmlucHV0QmluZGluZ05hbWU7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGNhc3Q6IHRoZSBiaW5kaW5nIGlzIGluc3RhbGxlZCBieSB0aGUgaG9zdCBhdCBydW50aW1lIHZpYSBgUnVudGltZS5hZGRCaW5kaW5nYCwgc28gaXQgY2Fubm90IGJlIGRlY2xhcmVkIG9uIGBXaW5kb3dgLlxuICAgIGNvbnN0IGJpbmRpbmcgPSAoZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtiaW5kaW5nTmFtZV0gYXMgKChwYXlsb2FkOiBzdHJpbmcpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgYmluZGluZyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYFRydXN0ZWQgaW5wdXQgaXMgdW5hdmFpbGFibGU6IHRoZSBob3N0IGhhcyBub3QgaW5zdGFsbGVkIHRoZSBcXGAke2JpbmRpbmdOYW1lfVxcYCBjaGFubmVsLiBgXG4gICAgICAgICAgKyAnT24gbW9iaWxlIHRoZXNlIGhlbHBlcnMgcmVxdWlyZSB0aGUgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZyBBcHBpdW0gdHJhbnNwb3J0LidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbmV4dElucHV0SWQrKztcbiAgICBjb25zdCBpZCA9IFN0cmluZyhuZXh0SW5wdXRJZCk7XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBwZW5kaW5nSW5wdXRzLnNldChpZCwgeyByZWplY3QsIHJlc29sdmUgfSk7XG4gICAgICBnbG9iYWxUaGlzLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoIXBlbmRpbmdJbnB1dHMuaGFzKGlkKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHBlbmRpbmdJbnB1dHMuZGVsZXRlKGlkKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVGhlIGhvc3QgZGlkIG5vdCBzZXJ2aWNlIHRoZSB0cnVzdGVkIGlucHV0IHJlcXVlc3Qgd2l0aGluICR7U3RyaW5nKGJvb3RzdHJhcFBhcmFtcy5pbnB1dFRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMuYCkpO1xuICAgICAgfSwgYm9vdHN0cmFwUGFyYW1zLmlucHV0VGltZW91dEluTWlsbGlzZWNvbmRzKTtcblxuICAgICAgYmluZGluZyhKU09OLnN0cmluZ2lmeSh7IGlkLCByZXF1ZXN0IH0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEEgcG9pbnRlciBoZWxwZXIgdGhhdCBoYXMgbm8gdG91Y2ggYW5hbG9nIGlzIGEgaGFyZCBlcnJvciwgbmV2ZXIgYSBzaWxlbnQgbm8tb3A6IGA6aG92ZXJgIGRvZXMgbm90XG4gIC8vIGV4aXN0IG9uIHRvdWNoLCBzbyBhIHRlc3QgdGhhdCBcImhvdmVyZWRcIiBhbmQgdGhlbiBhc3NlcnRlZCB3b3VsZCBwYXNzIHdoaWxlIGV4ZXJjaXNpbmcgbm90aGluZyBcdTIwMTRcbiAgLy8gZXhhY3RseSB0aGUgZmFsc2UtY29uZmlkZW5jZSBmYWlsdXJlIHRoZSB0cnVzdGVkLWlucHV0IHdvcmsgZXhpc3RzIHRvIGVuZC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1mdW5jdGlvbi1zY29waW5nIC0tIEl0IGNhbm5vdCBtb3ZlIHRvIHRoZSBvdXRlciBzY29wZTogdGhpcyB3aG9sZSBmdW5jdGlvbiBpcyBzZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIG1heSBub3QgcmVmZXJlbmNlIGFueXRoaW5nIG91dHNpZGUgaXRzZWxmIChMMTUpLlxuICBmdW5jdGlvbiB0aHJvd1Vuc3VwcG9ydGVkT25Nb2JpbGUoaGVscGVyTmFtZTogc3RyaW5nKTogbmV2ZXIge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBcXGAke2hlbHBlck5hbWV9XFxgIGhhcyBubyBtZWFuaW5nIG9uIG1vYmlsZTogdG91Y2ggaW5wdXQgaGFzIG5vIGhvdmVyIHN0YXRlLiBgXG4gICAgICAgICsgJ0JyYW5jaCBvbiBgUGxhdGZvcm0uaXNEZXNrdG9wQXBwYCwgb3IgZHJpdmUgdGhlIGVsZW1lbnQgd2l0aCBgY2xpY2tFbGVtZW50YCBpbnN0ZWFkLidcbiAgICApO1xuICB9XG5cbiAgLy8gTWFwcyBPYnNpZGlhbidzIGBNb2RpZmllcmAgbmFtZXMgdG8gRWxlY3Ryb24ncyBsb3dlcmNhc2UgYHNlbmRJbnB1dEV2ZW50YCBtb2RpZmllciBuYW1lcy5cbiAgLy8gTmFtZXMgJ01ldGEnLCAnQWx0JywgJ1NoaWZ0JyBsb3dlcmNhc2UgZGlyZWN0bHk7ICdDdHJsJyAtPiAnY29udHJvbCc7ICdNb2QnIHJlc29sdmVzIHBlci1wbGF0Zm9ybS5cbiAgLy8gU2hhcmVkIGJ5IGV2ZXJ5IHRydXN0ZWQtaW5wdXQgaGVscGVyLCBzbyBhIGtleSBwcmVzcyBhbmQgYSBjbGljayBjYW5ub3QgZGlzYWdyZWUgb24gYCdNb2QnYC5cbiAgZnVuY3Rpb24gdG9FbGVjdHJvbk1vZGlmaWVycyhtb2RpZmllcnM6IHJlYWRvbmx5IE1vZGlmaWVyW10pOiBFbGVjdHJvbk1vZGlmaWVyW10ge1xuICAgIC8vICdNb2QnIGlzIE9ic2lkaWFuJ3MgcGxhdGZvcm0tYWdub3N0aWMgbW9kaWZpZXI6IENtZCAobWV0YSkgb24gbWFjT1MsIEN0cmwgZWxzZXdoZXJlLlxuICAgIC8vIFJlYWRpbmcgYFBsYXRmb3JtLmlzTWFjT1NgIG9mZiB0aGUgcmVzb2x2ZWQgb2JzaWRpYW4gbW9kdWxlIGlzIHNhZmUgaGVyZTpcbiAgICAvLyBgZXZhbFdyYXBwZXJgIGFsd2F5cyByZXNvbHZlcyB0aGF0IG1vZHVsZSBiZWZvcmUgYW55IGNhbGxiYWNrIGNhbiBydW4uXG4gICAgY29uc3QgaXNNYWNPUyA9IChucy5vYnNpZGlhbk1vZHVsZSBhcyBPYnNpZGlhbk1vZHVsZVdpdGhQbGF0Zm9ybSkuUGxhdGZvcm0uaXNNYWNPUztcblxuICAgIHJldHVybiBtb2RpZmllcnMubWFwKChtb2RpZmllcik6IEVsZWN0cm9uTW9kaWZpZXIgPT4ge1xuICAgICAgc3dpdGNoIChtb2RpZmllcikge1xuICAgICAgICBjYXNlICdBbHQnOiB7XG4gICAgICAgICAgcmV0dXJuICdhbHQnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0N0cmwnOiB7XG4gICAgICAgICAgcmV0dXJuICdjb250cm9sJztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdNZXRhJzoge1xuICAgICAgICAgIHJldHVybiAnbWV0YSc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTW9kJzoge1xuICAgICAgICAgIHJldHVybiBpc01hY09TID8gJ21ldGEnIDogJ2NvbnRyb2wnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NoaWZ0Jzoge1xuICAgICAgICAgIHJldHVybiAnc2hpZnQnO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAvLyBFeGhhdXN0aXZlbmVzcyBndWFyZDogYWRkaW5nIGEgYE1vZGlmaWVyYCBtZW1iZXIgd2l0aG91dCBhIGNhc2UgYWJvdmUgYmVjb21lcyBhIGNvbXBpbGUgZXJyb3IuXG4gICAgICAgICAgY29uc3QgdW5rbm93bk1vZGlmaWVyOiBuZXZlciA9IG1vZGlmaWVyO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtb2RpZmllcjogJHtTdHJpbmcodW5rbm93bk1vZGlmaWVyKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY2xpY2tNb3VzZShjbGlja1BhcmFtczogQ2xpY2tNb3VzZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IFNJTkdMRV9DTElDS19DT1VOVCA9IDE7XG5cbiAgICBjb25zdCB7IGJ1dHRvbiA9ICdsZWZ0JywgbW9kaWZpZXJzID0gW10sIHgsIHkgfSA9IGNsaWNrUGFyYW1zO1xuXG4gICAgY29uc3QgZWxlY3Ryb25Nb2RpZmllcnMgPSB0b0VsZWN0cm9uTW9kaWZpZXJzKG1vZGlmaWVycyk7XG4gICAgY29uc3Qgcm91bmRlZFggPSBNYXRoLnJvdW5kKHgpO1xuICAgIGNvbnN0IHJvdW5kZWRZID0gTWF0aC5yb3VuZCh5KTtcblxuICAgIGlmIChjaGVja0lzTW9iaWxlKCkpIHtcbiAgICAgIC8vIFRvdWNoIGhhcyBubyBidXR0b25zLiBBIGxlZnQgY2xpY2sgaXMgYSB0YXA7IGEgcmlnaHQgY2xpY2sgaXMgdGhlIGxvbmctcHJlc3MgdGhhdCBvcGVucyBPYnNpZGlhblxuICAgICAgLy8gTW9iaWxlJ3MgY29udGV4dCBtZW51LCBzbyBpdCBpcyBoaWRkZW4gYmVoaW5kIHRoZSBzYW1lIG5hbWUgcmF0aGVyIHRoYW4gYSBzZXBhcmF0ZSBoZWxwZXIuIEFcbiAgICAgIC8vIG1pZGRsZSBjbGljayBoYXMgbm8gZ2VzdHVyZSBhdCBhbGwsIGFuZCBpbnZlbnRpbmcgb25lIHdvdWxkIGJlIHdvcnNlIHRoYW4gc2F5aW5nIHNvLlxuICAgICAgaWYgKGJ1dHRvbiA9PT0gJ21pZGRsZScpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdgY2xpY2tNb3VzZSh7IGJ1dHRvbjogXFwnbWlkZGxlXFwnIH0pYCBoYXMgbm8gbWVhbmluZyBvbiBtb2JpbGU6IHRvdWNoIGlucHV0IGhhcyBubyBtaWRkbGUgYnV0dG9uLicpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCByZXF1ZXN0SG9zdElucHV0KHtcbiAgICAgICAga2luZDogYnV0dG9uID09PSAncmlnaHQnID8gJ2xvbmdQcmVzcycgOiAndGFwJyxcbiAgICAgICAgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycyxcbiAgICAgICAgeDogcm91bmRlZFgsXG4gICAgICAgIHk6IHJvdW5kZWRZXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJDb250ZW50cyA9IGdsb2JhbFRoaXMuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpO1xuXG4gICAgLy8gQSB0cnVzdGVkIGNsaWNrIGlzIG1vdXNlTW92ZSAtPiBtb3VzZURvd24gLT4gbW91c2VVcCBhdCBvbmUgcG9pbnQuXG4gICAgLy8gQ2hyb21pdW0gc3ludGhlc2l6ZXMgdGhlIGBjbGlja2AgKG9yIGBjb250ZXh0bWVudWApIERPTSBldmVudCBmcm9tIHRoYXQgc2VxdWVuY2UuXG4gICAgLy8gVGhlIGxlYWRpbmcgbW92ZSBpcyB3aGF0IHB1dHMgdGhlIHBvaW50ZXIgb3ZlciB0aGUgaGl0LXRlc3QgdGFyZ2V0IGJlZm9yZSB0aGUgYnV0dG9uIGdvZXMgZG93bi5cbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdtb3VzZU1vdmUnLCB4OiByb3VuZGVkWCwgeTogcm91bmRlZFkgfSk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoe1xuICAgICAgYnV0dG9uLFxuICAgICAgY2xpY2tDb3VudDogU0lOR0xFX0NMSUNLX0NPVU5ULFxuICAgICAgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycyxcbiAgICAgIHR5cGU6ICdtb3VzZURvd24nLFxuICAgICAgeDogcm91bmRlZFgsXG4gICAgICB5OiByb3VuZGVkWVxuICAgIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHtcbiAgICAgIGJ1dHRvbixcbiAgICAgIGNsaWNrQ291bnQ6IFNJTkdMRV9DTElDS19DT1VOVCxcbiAgICAgIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsXG4gICAgICB0eXBlOiAnbW91c2VVcCcsXG4gICAgICB4OiByb3VuZGVkWCxcbiAgICAgIHk6IHJvdW5kZWRZXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjbGlja0VsZW1lbnQoY2xpY2tQYXJhbXM6IENsaWNrRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcblxuICAgIGNvbnN0IHsgYnV0dG9uID0gJ2xlZnQnLCBlbGVtZW50LCBtb2RpZmllcnMgPSBbXSB9ID0gY2xpY2tQYXJhbXM7XG5cbiAgICAvLyBWaWV3cG9ydCBjb29yZHMgZXF1YWwgd2ViLWNvbnRlbnRzIERJUCBjb29yZHMgZm9yIHRoZSBmdWxsLXdpbmRvdyBgQnJvd3NlcldpbmRvd2AsIGFuZCBlcXVhbCBDRFAnc1xuICAgIC8vIHBhZ2UgY29vcmRpbmF0ZXMgaW4gdGhlIG1vYmlsZSBXZWJWaWV3IFx1MjAxNCBzbyBuZWl0aGVyIHBhdGggbmVlZHMgYSBkZXZpY2UtcGl4ZWwgY29udmVyc2lvbi5cbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBhd2FpdCBjbGlja01vdXNlKHtcbiAgICAgIGJ1dHRvbixcbiAgICAgIG1vZGlmaWVycyxcbiAgICAgIHg6IHJlY3QubGVmdCArIHJlY3Qud2lkdGggLyBDRU5URVJfRElWSVNPUixcbiAgICAgIHk6IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUlxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcHJlc3NLZXkocHJlc3NQYXJhbXM6IFByZXNzS2V5UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBrZXksIG1vZGlmaWVycyA9IFtdIH0gPSBwcmVzc1BhcmFtcztcblxuICAgIGNvbnN0IGVsZWN0cm9uTW9kaWZpZXJzID0gdG9FbGVjdHJvbk1vZGlmaWVycyhtb2RpZmllcnMpO1xuXG4gICAgaWYgKGNoZWNrSXNNb2JpbGUoKSkge1xuICAgICAgYXdhaXQgcmVxdWVzdEhvc3RJbnB1dCh7IGtleSwga2luZDogJ2tleScsIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSBnbG9iYWxUaGlzLmVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKTtcblxuICAgIC8vIEEgdHJ1c3RlZCBrZXkgcHJlc3MgaXMga2V5RG93biAtPiBjaGFyIC0+IGtleVVwOiBrZXlEb3duIGZpcmVzIGBrZXlkb3duYCwgY2hhciBmaXJlc1xuICAgIC8vIGBrZXlwcmVzc2AvYGJlZm9yZWlucHV0YC9gaW5wdXRgLCBrZXlVcCBmaXJlcyBga2V5dXBgIFx1MjAxNCB0aGUgZnVsbCByZWFsIGtleSBwaXBlbGluZS5cbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IGtleUNvZGU6IGtleSwgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycywgdHlwZTogJ2tleURvd24nIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsga2V5Q29kZToga2V5LCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAnY2hhcicgfSk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBrZXlDb2RlOiBrZXksIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdrZXlVcCcgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBob3ZlckVsZW1lbnQoaG92ZXJQYXJhbXM6IEhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcblxuICAgIGNvbnN0IHsgZWxlbWVudCB9ID0gaG92ZXJQYXJhbXM7XG5cbiAgICBpZiAoY2hlY2tJc01vYmlsZSgpKSB7XG4gICAgICB0aHJvd1Vuc3VwcG9ydGVkT25Nb2JpbGUoJ2hvdmVyRWxlbWVudCcpO1xuICAgIH1cblxuICAgIC8vIFZpZXdwb3J0IGNvb3JkcyBlcXVhbCB3ZWItY29udGVudHMgRElQIGNvb3JkcyBmb3IgdGhlIGZ1bGwtd2luZG93IGBCcm93c2VyV2luZG93YC5cbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBhd2FpdCBtb3ZlTW91c2UoeyB4OiByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gQ0VOVEVSX0RJVklTT1IsIHk6IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUiB9KTtcblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIHJlYWwgYDpob3ZlcmAgc3RhdGUgaGFzIGFjdHVhbGx5IHRha2VuLCBpbnN0ZWFkIG9mIGEgZml4ZWQgc2V0dGxlLlxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKCFlbGVtZW50Lm1hdGNoZXMoJzpob3ZlcicpICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cblxuICAgIGlmICghZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIHBvaW50ZXIgd2FzIG1vdmVkIHRvIHRoZSBjZW50ZXIgb2YgdGhlIGVsZW1lbnQsIGJ1dCBpdCBuZXZlciBtYXRjaGVkIFxcYDpob3ZlclxcYCB3aXRoaW4gJHtTdHJpbmcoSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLiBgXG4gICAgICAgICAgKyAnTW9zdCBvZnRlbiB0aGUgY2VudGVyIGJlbG9uZ3MgdG8gc29tZXRoaW5nIG9uIHRvcCBvZiB0aGUgZWxlbWVudCwgb3IgdGhlIGVsZW1lbnQgbW92ZWQgYWZ0ZXIgaXRzIGJveCB3YXMgcmVhZC4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVxdWlyZS1hd2FpdCAtLSBBc3luYyB0byBtYXRjaCBpdHMgbW9iaWxlLWNhcGFibGUgc2libGluZ3MgYW5kIHRvIGtlZXAgb25lIGBQcm9taXNlPHZvaWQ+YCBzaGFwZSBhY3Jvc3MgdGhlIHRydXN0ZWQtaW5wdXQgc2V0OyB0aGUgZGVza3RvcCBib2R5IGlzIGdlbnVpbmVseSBzeW5jaHJvbm91cy5cbiAgYXN5bmMgZnVuY3Rpb24gbW92ZU1vdXNlKG1vdmVQYXJhbXM6IE1vdmVNb3VzZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChjaGVja0lzTW9iaWxlKCkpIHtcbiAgICAgIHRocm93VW5zdXBwb3J0ZWRPbk1vYmlsZSgnbW92ZU1vdXNlJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSBnbG9iYWxUaGlzLmVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IHR5cGU6ICdtb3VzZU1vdmUnLCB4OiBNYXRoLnJvdW5kKG1vdmVQYXJhbXMueCksIHk6IE1hdGgucm91bmQobW92ZVBhcmFtcy55KSB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVuaG92ZXJFbGVtZW50KHVuaG92ZXJQYXJhbXM6IFVuaG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuICAgIGNvbnN0IE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMUyA9IDE7XG5cbiAgICBjb25zdCB7IGVsZW1lbnQgfSA9IHVuaG92ZXJQYXJhbXM7XG5cbiAgICBpZiAoY2hlY2tJc01vYmlsZSgpKSB7XG4gICAgICB0aHJvd1Vuc3VwcG9ydGVkT25Nb2JpbGUoJ3VuaG92ZXJFbGVtZW50Jyk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBNb3ZlIHRvIGEgcG9pbnQganVzdCBvdXRzaWRlIHRoZSBlbGVtZW50J3MgYm94LiBXaGVuIGZsdXNoIGFnYWluc3QgdGhlIHZpZXdwb3J0J3MgbGVmdCBlZGdlLCB1c2UganVzdFxuICAgICAqIHBhc3QgdGhlIHJpZ2h0IGVkZ2UuIEEgZnVsbC12aWV3cG9ydC13aWR0aCBlbGVtZW50IHNob3VsZCB1c2UgYG1vdmVNb3VzZWAgZGlyZWN0bHkgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIFRoZSBlZGdlIGlzIFNOQVBQRUQgYXdheSBmcm9tIHRoZSBib3ggYmVmb3JlIHRoZSBvZmZzZXQgaXMgYXBwbGllZCwgYW5kIHRoYXQgaXMgdGhlIHdob2xlIGNvcnJlY3RuZXNzXG4gICAgICogb2YgdGhpcyBmdW5jdGlvbi4gQSBsYXlvdXQgYm94IHJhcmVseSBsYW5kcyBvbiBhIHdob2xlIHBpeGVsLCBhbmQgYG1vdmVNb3VzZWAgcm91bmRzIFx1MjAxNCBzbyBzdWJ0cmFjdGluZ1xuICAgICAqIG9uZSBmcm9tIGEgZnJhY3Rpb25hbCBsZWZ0IGVkZ2Ugcm91bmRzIHN0cmFpZ2h0IGJhY2sgb250byB0aGUgZWxlbWVudCdzIG93biBwaXhlbCBjb2x1bW4gYW5kIHRoZVxuICAgICAqIHBvaW50ZXIgbmV2ZXIgbGVhdmVzLiBNZWFzdXJlZCBvbiBhIGJhciB3aG9zZSBgbGVmdGAgd2FzIDg1OS43OTY4NzU6IHRoZSBwbGFpbiBgbGVmdCAtIDFgIGJlY29tZXMgODU5XG4gICAgICogYW5kIGA6aG92ZXJgIG5ldmVyIGNsZWFycywgd2hpbGUgYE1hdGguZmxvb3IobGVmdCkgLSAxYCBiZWNvbWVzIDg1OCBhbmQgaXQgY2xlYXJzIGluIDI2IG1zLiBTbmFwcGluZ1xuICAgICAqIGZpcnN0IG1lYW5zIHRoZSBvZmZzZXQgaXMgYSB3aG9sZSBwaXhlbCBvZiByZWFsIGNsZWFyYW5jZSBpbnN0ZWFkIG9mIHdoYXRldmVyIHRoZSBmcmFjdGlvbiBsZWF2ZXMuXG4gICAgICovXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeCA9IHJlY3QubGVmdCA+PSBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFNcbiAgICAgID8gTWF0aC5mbG9vcihyZWN0LmxlZnQpIC0gT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTXG4gICAgICA6IE1hdGguY2VpbChyZWN0LnJpZ2h0KSArIE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMUztcbiAgICBjb25zdCB5ID0gcmVjdC50b3AgKyByZWN0LmhlaWdodCAvIENFTlRFUl9ESVZJU09SO1xuICAgIGF3YWl0IG1vdmVNb3VzZSh7IHgsIHkgfSk7XG5cbiAgICAvLyBQb2xsIHVudGlsIHRoZSByZWFsIGA6aG92ZXJgIHN0YXRlIGhhcyBhY3R1YWxseSBjbGVhcmVkLCBpbnN0ZWFkIG9mIGEgZml4ZWQgc2V0dGxlLlxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKGVsZW1lbnQubWF0Y2hlcygnOmhvdmVyJykgJiYgRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKSB7XG4gICAgICBhd2FpdCBzbGVlcChJTlBVVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnOmhvdmVyJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBwb2ludGVyIHdhcyBtb3ZlZCBvdXRzaWRlIHRoZSBlbGVtZW50J3MgYm94LCBidXQgaXQgc3RpbGwgbWF0Y2hlZCBcXGA6aG92ZXJcXGAgYWZ0ZXIgJHtTdHJpbmcoSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLiBgXG4gICAgICAgICAgKyAnQW4gZWxlbWVudCB0aGF0IHNwYW5zIHRoZSBmdWxsIHZpZXdwb3J0IGhhcyBubyBwb2ludCBvdXRzaWRlIGl0cyBib3ggdG8gbW92ZSB0byBcdTIwMTQgdXNlIGBtb3ZlTW91c2VgIHRvIGEga25vd24gZW1wdHkgY29vcmRpbmF0ZSBpbnN0ZWFkLidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTm90ZShub3RlUGFyYW1zOiBDcmVhdGVOb3RlUGFyYW1zKTogUHJvbWlzZTxURmlsZT4ge1xuICAgIGNvbnN0IHsgY29udGVudCwgcGF0aCB9ID0gbm90ZVBhcmFtcztcblxuICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBucy5hcHAudmF1bHQuY3JlYXRlKHBhdGgsIGNvbnRlbnQpO1xuXG4gICAgLy8gUmVhZCB0aGUgZmlsZSBiYWNrIHJhdGhlciB0aGFuIHRydXN0aW5nIGBmaWxlLnN0YXRgLiBgc3RhdGAgaXMgcHJlY2lzZWx5XG4gICAgLy8gdGhlIGZpZWxkIHRoYXQgbGllcyBoZXJlOiBvbiBhIGxvc3Qgd3JpdGUgaXQgcmVwb3J0cyB0aGUgZnVsbCBieXRlIGNvdW50XG4gICAgLy8gd2hpbGUgdGhlIGZpbGVzeXN0ZW0gaG9sZHMgemVybyBieXRlcy5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSBDUkVBVEVfTk9URV9SRVBBSVJfQVRURU1QVF9DT1VOVDsgYXR0ZW1wdCsrKSB7XG4gICAgICBjb25zdCBhY3R1YWxDb250ZW50ID0gYXdhaXQgbnMuYXBwLnZhdWx0LnJlYWQoZmlsZSk7XG4gICAgICBpZiAoYWN0dWFsQ29udGVudCA9PT0gY29udGVudCkge1xuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF0dGVtcHQgPT09IENSRUFURV9OT1RFX1JFUEFJUl9BVFRFTVBUX0NPVU5UKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgY3JlYXRlTm90ZSBjb3VsZCBub3Qgd3JpdGUgXCIke3BhdGh9XCI6IGV4cGVjdGVkICR7U3RyaW5nKGNvbnRlbnQubGVuZ3RoKX0gY2hhcmFjdGVycywgYFxuICAgICAgICAgICAgKyBgdGhlIHZhdWx0IGhvbGRzICR7U3RyaW5nKGFjdHVhbENvbnRlbnQubGVuZ3RoKX0gYWZ0ZXIgJHtTdHJpbmcoQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQpfSByZXBhaXIgYXR0ZW1wdHMuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBBIHJld3JpdGUgb2YgdGhlIHNhbWUgY29udGVudCBsYW5kcyBjb3JyZWN0bHkgXHUyMDE0IG1lYXN1cmVkLiBUaGlzIGlzIHRoZVxuICAgICAgLy8gd2hvbGUgd29ya2Fyb3VuZC5cbiAgICAgIGF3YWl0IG5zLmFwcC52YXVsdC5tb2RpZnkoZmlsZSwgY29udGVudCk7XG4gICAgfVxuXG4gICAgLy8gVW5yZWFjaGFibGU6IHRoZSBsb29wIGVpdGhlciByZXR1cm5zIG9yIHRocm93cyBvbiBpdHMgbGFzdCBpdGVyYXRpb24uXG4gICAgdGhyb3cgbmV3IEVycm9yKGBjcmVhdGVOb3RlIGNvdWxkIG5vdCB3cml0ZSBcIiR7cGF0aH1cIi5gKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIG9wZW5TZXR0aW5nc1RhYihvcGVuUGFyYW1zOiBPcGVuU2V0dGluZ3NUYWJQYXJhbXMpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgeyB0YWJJZCwgdGltZW91dEluTWlsbGlzZWNvbmRzID0gU0VUVElOR1NfVEFCX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0gPSBvcGVuUGFyYW1zO1xuXG4gICAgY29uc3Qgc2V0dGluZyA9IG5zLmFwcC5zZXR0aW5nO1xuXG4gICAgLypcbiAgICAgKiBBIEZBTExCQUNLIGZvciBhIHZhdWx0IHRoYXQgZG9lcyBub3QgY2FycnkgdGhlIGhhcm5lc3MncyBgc2V0dGluZ3NQb3BvdXRXaW5kb3c6IGZhbHNlYCBkZWZhdWx0IFx1MjAxNFxuICAgICAqIEFuZCBpdCBNVVNUIGhhcHBlbiBiZWZvcmUgYG9wZW4oKWAuXG4gICAgICpcbiAgICAgKiBXaXRoIHRoZSBkZWZhdWx0IGluIHBsYWNlIGBvcGVuKClgIGF0dGFjaGVzIGBjb250YWluZXJFbGAgdG8gdGhpcyBkb2N1bWVudCBpdHNlbGYsIGFuZCB0aGlzIGJyYW5jaFxuICAgICAqIE5ldmVyIGZpcmVzIChtZWFzdXJlZCwgYG93bmVkLWluc3RhbmNlLXdvcmtlci1hdHRhY2guaW50ZWdyYXRpb24udGVzdC50c2ApLiBXaXRob3V0IGl0IE9ic2lkaWFuXG4gICAgICogU2hpcHMgdGhlIGtleSBgdHJ1ZWAsIGBzaG91bGRVc2VQb3BvdXQoKWAgcmV0dXJucyBpdCwgYW5kIGBvcGVuKClgIHB1dHMgdGhlIG1vZGFsIGluIGEgU0VDT05EXG4gICAgICogRWxlY3Ryb24gd2luZG93IGluc3RlYWQgXHUyMDE0IGxlYXZpbmcgdGhpcyBkb2N1bWVudCB3aXRoIG5vdGhpbmcgd2hpbGUgcmV0dXJuaW5nIHdpdGhvdXQgdGhyb3dpbmcuXG4gICAgICogUHJlLWF0dGFjaGluZyBrZWVwcyBgY29udGFpbmVyRWxgIHJlYWNoYWJsZSBoZXJlLCB3aGljaCBpcyBlbm91Z2ggZm9yIGEgY2FsbGVyIHRoYXQgcmVhZHMgcm93cyBvZmZcbiAgICAgKiBUaGUgdGFiOyBpdCBpcyBOT1QgZW5vdWdoIGZvciBhIHNjcmVlbnNob3QsIHdob3NlIGZyYW1lIGlzIG9mIHRoaXMgd2luZG93LiBPbmx5IHRoZSB2YXVsdC1sZXZlbFxuICAgICAqIERlZmF1bHQgZml4ZXMgdGhhdCwgc28gdGhpcyBpcyBhIGZsb29yIHJhdGhlciB0aGFuIHRoZSBmaXguXG4gICAgICpcbiAgICAgKiBBdHRhY2hpbmcgQUZURVJXQVJEUyBpcyB1c2VsZXNzIGVpdGhlciB3YXk6IHdoYXRldmVyIHRoZSBtb2RhbCByZW5kZXJlZCBvbiBvcGVuIGhhcyBhbHJlYWR5IGdvbmVcbiAgICAgKiBXaGVyZSBpdCB3ZW50LlxuICAgICAqL1xuICAgIGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyhzZXR0aW5nLmNvbnRhaW5lckVsKSkge1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoc2V0dGluZy5jb250YWluZXJFbCk7XG4gICAgfVxuXG4gICAgLy8gQm90aCBsaXN0cyBhcmUgcG9wdWxhdGVkIGJlZm9yZSBgb3BlbigpYCwgc28gYW4gdW5rbm93biBpZCBjYW4gYmUgcmVqZWN0ZWQgdXAgZnJvbnQgXHUyMDE0IHdpdGggdGhlXG4gICAgLy8gaWRzIHRoYXQgRE8gZXhpc3QgXHUyMDE0IGluc3RlYWQgb2Ygc3BlbmRpbmcgdGhlIHdob2xlIHRpbWVvdXQgbG9va2luZyBleGFjdGx5IGxpa2UgdGhlIG1vZGFsLWRvZXMtXG4gICAgLy8gbm90LXJlbmRlciBzeW1wdG9tIHRoaXMgaGVscGVyIGV4aXN0cyB0byBydWxlIG91dC4gUGx1Z2luIHRhYnMgbGl2ZSBpbiBgcGx1Z2luVGFic2AsIG5vdFxuICAgIC8vIGBzZXR0aW5nVGFic2AsIHNvIGJvdGggYXJlIHNlYXJjaGVkLlxuICAgIGNvbnN0IGtub3duVGFicyA9IFsuLi5zZXR0aW5nLnNldHRpbmdUYWJzLCAuLi5zZXR0aW5nLnBsdWdpblRhYnNdO1xuICAgIGlmIChrbm93blRhYnMuZXZlcnkoKHRhYikgPT4gdGFiLmlkICE9PSB0YWJJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYG9wZW5TZXR0aW5nc1RhYjogbm8gc2V0dGluZ3MgdGFiIHdpdGggaWQgXCIke3RhYklkfVwiLiBBdmFpbGFibGUgaWRzOiAke2tub3duVGFicy5tYXAoKHRhYikgPT4gdGFiLmlkKS5qb2luKCcsICcpfS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIHNldHRpbmcub3BlbigpO1xuICAgIHNldHRpbmcub3BlblRhYkJ5SWQodGFiSWQpO1xuXG4gICAgLy8gUG9sbCB0aGUgbW9kYWwncyBvd24gc3RhdGUgcmF0aGVyIHRoYW4gc2xlZXBpbmc6IGEgZml4ZWQgZGVsYXkgaXMgZWl0aGVyIHRvbyBzaG9ydCBvbiBhIGxvYWRlZFxuICAgIC8vIG1hY2hpbmUgb3Igd2FzdGVkIHRpbWUuIEEgcmVuZGVyZWQgdGFiIGlzIHRoZSByZXF1ZXN0ZWQgb25lIEFORCBoYXMgY29udGVudC5cbiAgICBhd2FpdCB3YWl0VW50aWwoe1xuICAgICAgbWVzc2FnZTogYHRoZSBcIiR7dGFiSWR9XCIgc2V0dGluZ3MgdGFiIHRvIHJlbmRlcmAsXG4gICAgICBwcmVkaWNhdGU6ICgpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudFRhYiA9IHNldHRpbmcuYWN0aXZlVGFiO1xuICAgICAgICBpZiAoIWN1cnJlbnRUYWIpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRUYWIuaWQgPT09IHRhYklkICYmIGN1cnJlbnRUYWIuY29udGFpbmVyRWwuY2hpbGRFbGVtZW50Q291bnQgPiAwO1xuICAgICAgfSxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgIH0pO1xuXG4gICAgY29uc3QgYWN0aXZlVGFiID0gc2V0dGluZy5hY3RpdmVUYWI7XG4gICAgaWYgKCFhY3RpdmVUYWIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignb3BlblNldHRpbmdzVGFiOiB0aGUgc2V0dGluZ3MgbW9kYWwgcmVwb3J0ZWQgbm8gYWN0aXZlIHRhYiBhZnRlciBpdCByZW5kZXJlZC4nKTtcbiAgICB9XG5cbiAgICAvLyBOb3QgZXZlcnkgdGFiIHJlbmRlcnMgYC5zZXR0aW5nLWl0ZW0tbmFtZWAgcm93cyAoSG90a2V5cyBkb2VzIG5vdCksIHNvIGFuIGVtcHR5IGFycmF5IGlzIGEgdmFsaWRcbiAgICAvLyBhbnN3ZXIgaGVyZSBcdTIwMTQgdGhlIHJlbmRlciBpdHNlbGYgd2FzIGFscmVhZHkgcHJvdmVuIGJ5IHRoZSBwb2xsIGFib3ZlLlxuICAgIHJldHVybiBbLi4uYWN0aXZlVGFiLmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZXR0aW5nLWl0ZW0tbmFtZScpXS5tYXAoKG5hbWVFbCkgPT4gbmFtZUVsLnRleHRDb250ZW50KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHdhaXRVbnRpbCh3YWl0UGFyYW1zOiBXYWl0VW50aWxQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7XG4gICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzID0gV0FJVF9VTlRJTF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBwcmVkaWNhdGUsXG4gICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHMgPSBXQUlUX1VOVElMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gICAgfSA9IHdhaXRQYXJhbXM7XG5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlICghKGF3YWl0IHByZWRpY2F0ZSgpKSkge1xuICAgICAgaWYgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPj0gdGltZW91dEluTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IG1lc3NhZ2UgPT09IHVuZGVmaW5lZCA/ICcnIDogYDogJHttZXNzYWdlfWA7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgd2FpdFVudGlsIHRpbWVkIG91dCBhZnRlciAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfSBtaWxsaXNlY29uZHMke3N1ZmZpeH1gKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHNsZWVwKGludGVydmFsSW5NaWxsaXNlY29uZHMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVycm9yVG9TdHJpbmdJbXBsKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgcmV0dXJuIFN0cmluZyhlcnJvcik7XG4gICAgfVxuXG4gICAgbGV0IG1lc3NhZ2UgPSBlcnJvci5zdGFjayA/PyBgJHtlcnJvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgaWYgKGVycm9yLmNhdXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1lc3NhZ2UgPSBhcHBlbmROZXN0ZWRFcnJvcihtZXNzYWdlLCBlcnJvci5jYXVzZSwgJ0NhdXNlZCBieTonKTtcbiAgICB9XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQWdncmVnYXRlRXJyb3IpIHtcbiAgICAgIGNvbnN0IGFnZ3JlZ2F0ZWRFcnJvcnM6IHJlYWRvbmx5IHVua25vd25bXSA9IGVycm9yLmVycm9ycztcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBhZ2dyZWdhdGVkRXJyb3JdIG9mIGFnZ3JlZ2F0ZWRFcnJvcnMuZW50cmllcygpKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBhcHBlbmROZXN0ZWRFcnJvcihtZXNzYWdlLCBhZ2dyZWdhdGVkRXJyb3IsIGBBZ2dyZWdhdGVkIGVycm9yICMke1N0cmluZyhpbmRleCArIDEpfTpgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBlbmROZXN0ZWRFcnJvcihtZXNzYWdlOiBzdHJpbmcsIG5lc3RlZEVycm9yOiB1bmtub3duLCB0aXRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0ID0gYCR7bWVzc2FnZX1cXG4ke2dlbmVyYXRlU3RhY2tUcmFjZUxpbmUodGl0bGUpfWA7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGVycm9yVG9TdHJpbmdJbXBsKG5lc3RlZEVycm9yKS5zcGxpdCgnXFxuJykpIHtcbiAgICAgIGlmICghbGluZS50cmltKCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gbGluZS5zdGFydHNXaXRoKFNUQUNLX1RSQUNFX1BSRUZJWClcbiAgICAgICAgPyBgXFxuJHtsaW5lfWBcbiAgICAgICAgOiBgXFxuJHtnZW5lcmF0ZVN0YWNrVHJhY2VMaW5lKGxpbmUpfWA7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBnZW5lcmF0ZVN0YWNrVHJhY2VMaW5lKHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtTVEFDS19UUkFDRV9QUkVGSVh9IC0tLSAke3RpdGxlfSAtLS0gKDApYDtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBaUNBLFNBQVMsNEJBQTRCO0FBQ3JDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFrQ1AsZUFBc0IsNEJBQTRCLFdBQThCLEtBQWEsdUJBQStDO0FBQzFJLFFBQU0sY0FBb0M7QUFBQSxJQUN4QztBQUFBLElBQ0EsR0FBSSwwQkFBMEIsVUFBYSxFQUFFLHNCQUFzQjtBQUFBLEVBQ3JFO0FBQ0EsUUFBTSxtQkFBbUIsb0JBQW9CO0FBQzdDLFFBQU0sY0FBYyxLQUFLLFVBQVUsZ0JBQWdCO0FBQ25ELFFBQU0sbUJBQW1CLE1BQU0sVUFBVTtBQUFBLElBQ3ZDLG1FQUFtRSxXQUFXO0FBQUEsSUFDOUU7QUFBQSxFQUNGO0FBRUEsTUFBSSxxQkFBcUIsUUFBUTtBQUMvQjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLHNCQUFzQixxQkFBcUIsb0JBQW9CO0FBQUEsSUFDbkUsa0JBQWtCO0FBQUEsSUFDbEIsNEJBQTRCO0FBQUEsSUFDNUIsY0FBYyxDQUFDLEdBQUcsMEJB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
|
|
491
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbWVzcGFjZS1ib290c3RyYXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpbiB0aGVcbiAqIE9ic2lkaWFuIHByb2Nlc3MuIEV4dHJhY3RlZCB0byBpdHMgb3duIG1vZHVsZSB0byBhdm9pZCBkZXBlbmRlbmN5IGN5Y2xlc1xuICogYmV0d2VlbiBgZXZhbC1pbi1vYnNpZGlhbi50c2AgYW5kIHRoZSB0cmFuc3BvcnQgbW9kdWxlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgTW9kaWZpZXIsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBDbGlja0VsZW1lbnRQYXJhbXMsXG4gIENsaWNrTW91c2VQYXJhbXMsXG4gIENyZWF0ZU5vdGVQYXJhbXMsXG4gIEhvdmVyRWxlbWVudFBhcmFtcyxcbiAgTW92ZU1vdXNlUGFyYW1zLFxuICBPcGVuU2V0dGluZ3NUYWJQYXJhbXMsXG4gIFByZXNzS2V5UGFyYW1zLFxuICBUeXBlSW50b0VkaXRvclBhcmFtcyxcbiAgVW5ob3ZlckVsZW1lbnRQYXJhbXMsXG4gIFdhaXRVbnRpbFBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVGdW5jdGlvbkNhbGxQYXJhbXMgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwubWpzJztcbmltcG9ydCB0eXBlIHsgTGliUmVzb2x2ZXIgfSBmcm9tICcuL2xpYi1yZWdpc3RyeS5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVGdW5jdGlvbkNhbGwgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwubWpzJztcbmltcG9ydCB7XG4gIGdldEJvb3RzdHJhcFZlcnNpb24sXG4gIGdldFJlZ2lzdGVyZWRMaWJSZXNvbHZlcnNcbn0gZnJvbSAnLi9saWItcmVnaXN0cnkubWpzJztcbmltcG9ydCB7XG4gIE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUUsXG4gIE1PQklMRV9JTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EU1xufSBmcm9tICcuL21vYmlsZS1pbnB1dC5tanMnO1xuXG5pbnRlcmZhY2UgQm9vdHN0cmFwTmFtZXNwYWNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBob3N0LWluc3RhbGxlZCBgUnVudGltZS5hZGRCaW5kaW5nYCBmdW5jdGlvbiB0aGUgbW9iaWxlIHRydXN0ZWQtaW5wdXQgcGF0aCBjYWxscy5cbiAgICpcbiAgICogUGFzc2VkIGluIGFzIGRhdGEgYmVjYXVzZSB0aGUgYm9vdHN0cmFwIGNsb3N1cmUgbWF5IG5vdCByZWFkIG91dGVyIHNjb3BlICgqKkwxNSoqKSwgc28gaXQgY2Fubm90XG4gICAqIGltcG9ydCB7QGxpbmsgTU9CSUxFX0lOUFVUX0JJTkRJTkdfTkFNRX0gZGlyZWN0bHkuXG4gICAqL1xuICByZWFkb25seSBpbnB1dEJpbmRpbmdOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoZSBtb2JpbGUgdHJ1c3RlZC1pbnB1dCBwYXRoIHdhaXRzIGZvciB0aGUgaG9zdCB0byBhbnN3ZXIgb25lIHJlcXVlc3QuXG4gICAqL1xuICByZWFkb25seSBpbnB1dFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIHJlYWRvbmx5IGxpYlJlc29sdmVyczogTGliUmVzb2x2ZXJbXTtcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhlIGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgbmFtZXNwYWNlIGlzIGJvb3RzdHJhcHBlZFxuICogaW4gdGhlIE9ic2lkaWFuIHByb2Nlc3Mgd2l0aCB0aGUgY3VycmVudCBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUGVyZm9ybXMgYSBsaWdodHdlaWdodCB2ZXJzaW9uIGNoZWNrIHZpYSB0aGUgdHJhbnNwb3J0LiBJZiB0aGUgbmFtZXNwYWNlXG4gKiBkb2Vzbid0IGV4aXN0IG9yIGhhcyBhIGRpZmZlcmVudCB2ZXJzaW9uLCBzZW5kcyB0aGUgZnVsbCBib290c3RyYXAgZXhwcmVzc2lvblxuICogdG8gcmVnaXN0ZXIgYWxsIGhlbHBlciBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSB0cmFuc3BvcnQgdG8gdXNlIGZvciBldmFsdWF0aW9uLlxuICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeSAodmF1bHQgcGF0aCkuXG4gKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gT3B0aW9uYWwgcGVyLWV2YWwgdGltZW91dC4gRm9yd2FyZGVkIHRvIGJvdGhcbiAqICAgdGhlIHZlcnNpb24gY2hlY2sgYW5kIHRoZSBib290c3RyYXAgZXZhbCBzbyBhIGh1bmcgYG9ic2lkaWFuIGV2YWxgIHJlamVjdHNcbiAqICAgaW5zdGVhZCBvZiBibG9ja2luZyB0aGUgY2FsbGVyIGluZGVmaW5pdGVseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0LCBjd2Q6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGV2YWxPcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyA9IHtcbiAgICBjd2QsXG4gICAgLi4uKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gIH07XG4gIGNvbnN0IGJvb3RzdHJhcFZlcnNpb24gPSBnZXRCb290c3RyYXBWZXJzaW9uKCk7XG4gIGNvbnN0IHZlcnNpb25Kc29uID0gSlNPTi5zdHJpbmdpZnkoYm9vdHN0cmFwVmVyc2lvbik7XG4gIGNvbnN0IHZlcnNpb25NYXRjaEpzb24gPSBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoXG4gICAgYEpTT04uc3RyaW5naWZ5KHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy52ZXJzaW9uID09PSAke3ZlcnNpb25Kc29ufSlgLFxuICAgIGV2YWxPcHRpb25zXG4gICk7XG5cbiAgaWYgKHZlcnNpb25NYXRjaEpzb24gPT09ICd0cnVlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJvb3RzdHJhcEV4cHJlc3Npb24gPSBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbChib290c3RyYXBOYW1lc3BhY2UsIHtcbiAgICBpbnB1dEJpbmRpbmdOYW1lOiBNT0JJTEVfSU5QVVRfQklORElOR19OQU1FLFxuICAgIGlucHV0VGltZW91dEluTWlsbGlzZWNvbmRzOiBNT0JJTEVfSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgbGliUmVzb2x2ZXJzOiBbLi4uZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVycygpXSxcbiAgICB2ZXJzaW9uOiBib290c3RyYXBWZXJzaW9uXG4gIH0pO1xuICBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoYm9vdHN0cmFwRXhwcmVzc2lvbiwgZXZhbE9wdGlvbnMpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gU2VyaWFsaXplZCB2aWEgdG9TdHJpbmcoKSBhbmQgZXhlY3V0ZWQgaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLCBub3QgaW4gTm9kZS4gQ292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cy4gKi9cblxuLyoqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSB3aXRoIGFsbFxuICogaGVscGVyIGZ1bmN0aW9ucy4gU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBzZW50IHRvIE9ic2lkaWFuIG9uY2VcbiAqIHBlciBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUHJlc2VydmVzIGBjb250ZXh0c2AgYWNyb3NzIHZlcnNpb24gdXBncmFkZXMgc28gbGl2ZSB7QGxpbmsgQ29udGV4dElkfVxuICogcmVmZXJlbmNlcyBzdXJ2aXZlLlxuICpcbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUgXHUyMDE0IGl0IGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYC5cbiAqXG4gKiBAcGFyYW0gYm9vdHN0cmFwUGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHRoZSBsaWJyYXJ5IHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGJvb3RzdHJhcE5hbWVzcGFjZShib290c3RyYXBQYXJhbXM6IEdlbmVyYXRlRnVuY3Rpb25DYWxsUGFyYW1zPEJvb3RzdHJhcE5hbWVzcGFjZVBhcmFtcz4pOiB2b2lkIHtcbiAgaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gICAgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZzogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGU7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIGNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICAgIG9ic2lkaWFuTW9kdWxlPzogdW5rbm93bjtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlIGV4dGVuZHMgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cml2aWFsIFx1MjAxNCByZWFkc1xuICAgICAqIGB3aW5kb3cuYXBwYCwgd2hpY2ggZXZlcnkgY2xvc3VyZSBhbHJlYWR5IHJlY2VpdmVzIGRpcmVjdGx5IGFzIGl0cyBgYXBwYFxuICAgICAqIGFyZywgc28gdGhlcmUgaXMgbm90aGluZyBnZW5lcmFsLXB1cnBvc2UgdG8gc2hhcmUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0IGlzIHRoZSByZW5kZXJlciBoYWxmIG9mXG4gICAgICogdGhlIG1vYmlsZSB0cnVzdGVkLWlucHV0IGNoYW5uZWwncyAqKmV4YWN0bHktb25jZSoqIGd1YXJhbnRlZSAoKipMMzkqKikuXG4gICAgICpcbiAgICAgKiBDRFAgYnJvYWRjYXN0cyBgUnVudGltZS5iaW5kaW5nQ2FsbGVkYCB0byAqKmV2ZXJ5KiogYXR0YWNoZWQgc2Vzc2lvbiwgc28gZXZlcnkgTm9kZSBwcm9jZXNzXG4gICAgICogaG9sZGluZyBhbiBpbnB1dCBjaGFubmVsIHRvIHRoaXMgV2ViVmlldyBzZXJ2aWNlcyB0aGUgc2FtZSByZXF1ZXN0IFx1MjAxNCBhbmQgZWFjaCBvbmUgaW5qZWN0cyB0aGVcbiAgICAgKiBmdWxsIGdlc3R1cmUuIFdpdGggdHdvIHByb2Nlc3NlcyBhdHRhY2hlZCAoYSBWaXRlc3QgbWFpbiBwcm9jZXNzIGFuZCBpdHMgd29ya2VyLCB3aGljaCBpcyB0aGVcbiAgICAgKiBvcmRpbmFyeSBjb25zdW1lciBzaGFwZSkgb25lIGBjbGlja0VsZW1lbnRgIHRoZXJlZm9yZSBhcnJpdmVkIGFzIFRXTyB0YXBzLCBhbmQgb25lIGBwcmVzc0tleWAgYXNcbiAgICAgKiB0d28ga2V5IHByZXNzZXMuIE1lYXN1cmVkIDIwMjYtMDktMTA6IHR3byBwaWRzIHNlcnZpY2luZyByZXF1ZXN0IGBpZD0xYCBpbiB0aGUgc2FtZSBtaWxsaXNlY29uZC5cbiAgICAgKlxuICAgICAqIFRoZSBjbGFpbSBpcyBtYWRlIGluIHRoZSBQQUdFIHJhdGhlciB0aGFuIGluIGFueSBob3N0IGJlY2F1c2UgdGhlIHBhZ2UgaXMgdGhlIG9ubHkgdGhpbmcgYWxsIHRoZVxuICAgICAqIGhvc3RzIHNoYXJlLiBKYXZhU2NyaXB0IGlzIHNpbmdsZS10aHJlYWRlZCwgc28gdHdvIGBSdW50aW1lLmV2YWx1YXRlYCBjYWxscyByYWNpbmcgZm9yIHRoZSBzYW1lXG4gICAgICogaWQgYXJlIHNlcmlhbGl6ZWQgYW5kIGV4YWN0bHkgb25lIHNlZXMgYHRydWVgLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIHJlcXVlc3QgaWQgdG8gY2xhaW0uXG4gICAgICogQHJldHVybnMgYHRydWVgIGZvciB0aGUgZmlyc3QgY2FsbGVyIHRvIGNsYWltIHRoaXMgaWQsIGBmYWxzZWAgZm9yIGV2ZXJ5IGxhdGVyIG9uZS5cbiAgICAgKi9cbiAgICBjbGFpbUlucHV0OiAoaWQ6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXRcbiAgICAgKiBvd25zIHRoZSBoYXJuZXNzIHRlc3Qgd2luZG93J3MgbGlmZWN5Y2xlIHZpYSBFbGVjdHJvbiAoYHdpbmRvdy5lbGVjdHJvbldpbmRvd2ApLFxuICAgICAqIHdoaWNoIGlzIHRoZSBoYXJuZXNzJ3MgY29uY2Vybiwgbm90IGEgZ2VuZXJhbCB1dGlsaXR5LlxuICAgICAqL1xuICAgIGRlc3Ryb3lDdXJyZW50V2luZG93OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogU3luY2VkIHdpdGggYG9ic2lkaWFuLWRldi11dGlsc2AgKG1pcnJvciBgd29ya3NwYWNlLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZW5zdXJlTGF5b3V0UmVhZHk6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBTeW5jZWQgd2l0aCBgb2JzaWRpYW4tZGV2LXV0aWxzYCAobWlycm9yIGBlcnJvci50c2ApIFx1MjAxNCBzZWUgTDE3LlxuICAgICAqL1xuICAgIGVycm9yVG9TdHJpbmc6IChlcnJvcjogdW5rbm93bikgPT4gc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBUaGlzXG4gICAgICogaXMgdGhlIGhhcm5lc3MncyBvd24gZXZhbCBwbHVtYmluZyAoYnVpbGRzIHRoZSBgbGliYCBiYWcsIHJlc29sdmVzIHRoZVxuICAgICAqIG1vZHVsZSwgaW52b2tlcyB0aGUgY2xvc3VyZSwgZW52ZWxvcGVzIHRoZSByZXN1bHQpIFx1MjAxNCBtZWFuaW5nbGVzcyBvdXRzaWRlXG4gICAgICogdGhlIGhhcm5lc3MuXG4gICAgICovXG4gICAgZXZhbFdyYXBwZXI6IChuc1BhcmFtczogRXZhbFdyYXBwZXJQYXJhbXMpID0+IFByb21pc2U8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXNcbiAgICAgKiB0aGUgaGFybmVzcydzIG9uZS10aW1lIGJvb3RzdHJhcCB0aGF0IHJlc29sdmVzIHRoZSBgb2JzaWRpYW5gIG1vZHVsZSBmb3JcbiAgICAgKiB0aGUgcHJvY2VzczsgY2xvc3VyZXMgb2J0YWluIGl0IGRpcmVjdGx5IHZpYSB0aGVpciBgb2JzaWRpYW5Nb2R1bGVgIGFyZy5cbiAgICAgKi9cbiAgICBnZXRPYnNpZGlhbk1vZHVsZTogKCkgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gUmF3XG4gICAgICogRWxlY3Ryb24gSVBDIChgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jYCkgaXMgYSBoYXJuZXNzL3RyYW5zcG9ydFxuICAgICAqIHByaW1pdGl2ZSwgbm90IGEgZ2VuZXJhbC1wdXJwb3NlIGhlbHBlci5cbiAgICAgKi9cbiAgICBpcGNTZW5kU3luYzogKG5zUGFyYW1zOiBJcGNTZW5kU3luY1BhcmFtcykgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXNcbiAgICAgKiBwYXJ0IG9mIHRoZSBoYXJuZXNzJ3MgdmF1bHQtcGF0aCBoYW5kc2hha2Ugd2l0aCB0aGUgTm9kZSBzaWRlLCBub3QgYVxuICAgICAqIGdlbmVyYWwgdXRpbGl0eS5cbiAgICAgKi9cbiAgICBwb2xsVmF1bHRCYXNlUGF0aDogKCkgPT4gUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBJdCBpcyB0aGUgcmVuZGVyZXIgZW5kIG9mIHRoZVxuICAgICAqIG1vYmlsZSB0cnVzdGVkLWlucHV0IGNoYW5uZWwgKCoqTDM5KiopIFx1MjAxNCB0aGUgaG9zdCBjYWxscyBpdCBvdmVyIENEUCB0byBhbnN3ZXIgYSByZXF1ZXN0IHRoaXNcbiAgICAgKiBjbG9zdXJlIGlzIGF3YWl0aW5nLCBzbyBpdCBpcyBtZWFuaW5nbGVzcyBvdXRzaWRlIHRoZSBoYXJuZXNzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIHJlcXVlc3QgaWQgYmVpbmcgYW5zd2VyZWQuXG4gICAgICogQHBhcmFtIGVycm9yTWVzc2FnZSAtIFdoeSB0aGUgaW5qZWN0aW9uIGZhaWxlZCwgb3IgYG51bGxgIG9uIHN1Y2Nlc3MuXG4gICAgICovXG4gICAgcmVzb2x2ZUlucHV0OiAoaWQ6IHN0cmluZywgZXJyb3JNZXNzYWdlOiBudWxsIHwgc3RyaW5nKSA9PiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IG5pY2hlL3RyaXZpYWwgXHUyMDE0IGFcbiAgICAgKiBvbmUtbGluZSBgbG9jYWxTdG9yYWdlLnNldEl0ZW1gIHdyYXBwZXIgdXNlZCBvbmx5IGJ5IHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIHNldExvY2FsU3RvcmFnZUl0ZW06IChuc1BhcmFtczogU2V0TG9jYWxTdG9yYWdlSXRlbVBhcmFtcykgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkZWxpYmVyYXRlIHNlYW0gYG9ic2lkaWFuLWRldi11dGlsc2AgcmVhZHMgb24gbW9iaWxlIFx1MjAxNCB0aGUgb25lIG5hbWVzcGFjZSBtZW1iZXIgdGhhdCBleGlzdHMgZm9yXG4gICAgICogYW5vdGhlciBwYWNrYWdlIHJhdGhlciB0aGFuIGZvciB0aGUgaGFybmVzcy4gSXRzICoqTDE3KiogbWlycm9yIChgZGVza3RvcC10cnVzdGVkLWlucHV0LnRzYCkgY2FuXG4gICAgICogcmVhY2ggYSB0cnVzdGVkIGV2ZW50IG9uIGRlc2t0b3AgYnkgaXRzZWxmLCBidXQgb24gbW9iaWxlIHRoZSBpbmplY3Rpb24gaGFzIHRvIGNvbWUgZnJvbSB0aGUgTm9kZVxuICAgICAqIHNpZGUgb3ZlciB0aGUgaGFybmVzcydzIENEUCBjaGFubmVsICgqKkwzOSoqKSwgYW5kIGBvYnNpZGlhbi1kZXYtdXRpbHNgIG11c3QgbmV2ZXIgaW1wb3J0IHRoaXNcbiAgICAgKiBwYWNrYWdlIGF0IHJ1bnRpbWUgKGl0cyBvd24gcGVlci1kZXBlbmRlbmN5IHJ1bGUpLiBTbyBpdCByZWFkcyB0aGVzZSBvZmZcbiAgICAgKiBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGluc3RlYWQsIGRlY2xhcmluZyB0aGUgc2hhcGUgbG9jYWxseS5cbiAgICAgKlxuICAgICAqIFRoZXNlIGFyZSB0aGUgKipzYW1lIGZ1bmN0aW9uIG9iamVjdHMqKiBgZXZhbFdyYXBwZXJgIHB1dHMgaW4gYSBjbG9zdXJlJ3MgYGxpYmAgYmFnLCBub3Qgd3JhcHBlcnM6XG4gICAgICogZWFjaCBhbHJlYWR5IGJyYW5jaGVzIG9uIGBQbGF0Zm9ybS5pc01vYmlsZWAgaW50ZXJuYWxseSwgc28gdGhlIG1vYmlsZSBzZW1hbnRpY3MgbGl2ZSBpbiBleGFjdGx5IG9uZVxuICAgICAqIHBsYWNlIGFuZCBvbmUgc2VhbSBzZXJ2ZXMgYm90aCBwbGF0Zm9ybXMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgdHJ1c3RlZElucHV0OiBUcnVzdGVkSW5wdXRIZWxwZXJzO1xuICB9XG5cbiAgaW50ZXJmYWNlIEV2YWxXcmFwcGVyUGFyYW1zIHtcbiAgICByZWFkb25seSBjYWxsYmFjazogKGZ1bmN0aW9uQXJndW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdW5rbm93bjtcbiAgICByZWFkb25seSBjb250ZXh0SWQ/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgaW50ZXJmYWNlIEZpbGVTeXN0ZW1BZGFwdGVyTGlrZSB7XG4gICAgYmFzZVBhdGg/OiBzdHJpbmc7XG4gICAgZ2V0QmFzZVBhdGg/OiAoKSA9PiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSXBjU2VuZFN5bmNQYXJhbXMge1xuICAgIHJlYWRvbmx5IGNoYW5uZWw6IHN0cmluZztcbiAgICByZWFkb25seSBjaGFubmVsQXJndW1lbnRzOiB1bmtub3duW107XG4gIH1cblxuICAvLyBDb21tdW5pdHktcGx1Z2luIEFQSSBtZW1iZXJzIHRoYXQgb2xkIE9ic2lkaWFuIHZlcnNpb25zIChlLmcuIDAuNi54KSBsYWNrLlxuICAvLyBgb2JzaWRpYW4tdHlwaW5nc2AgZGVjbGFyZXMgdGhlbSBhcyBhbHdheXMtcHJlc2VudCwgc28gcHJvYmUgdGhyb3VnaCB0aGlzXG4gIC8vIG9wdGlvbmFsLW1lbWJlciB2aWV3IHRvIGRldGVjdCB0aGVpciBydW50aW1lIGFic2VuY2Ugd2l0aG91dCBhIGZhbHNlXG4gIC8vIGBuby11bm5lY2Vzc2FyeS1jb25kaXRpb25gLlxuICBpbnRlcmZhY2UgUGx1Z2luc0xpa2Uge1xuICAgIGlzRW5hYmxlZD86ICgpID0+IGJvb2xlYW47XG4gICAgbG9hZFBsdWdpbj86IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIG1hbmlmZXN0cz86IHVua25vd247XG4gICAgdW5pbnN0YWxsUGx1Z2luPzogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gIH1cblxuICBpbnRlcmZhY2UgU2V0TG9jYWxTdG9yYWdlSXRlbVBhcmFtcyB7XG4gICAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbiAgfVxuXG4gIC8vIFRoZSBzaGFwZSBvZiB0aGUgYHRydXN0ZWRJbnB1dGAgc2VhbS4gRXZlcnkgbWVtYmVyIGlzIG9uZSBvZiB0aGUgTDE3LXN5bmNlZCBoZWxwZXJzLCBleHBvc2VkIGFzIHRoZVxuICAvLyBzYW1lIGZ1bmN0aW9uIG9iamVjdCBgZXZhbFdyYXBwZXJgIHB1dHMgaW4gYSBjbG9zdXJlJ3MgYGxpYmAgYmFnLlxuICBpbnRlcmZhY2UgVHJ1c3RlZElucHV0SGVscGVycyB7XG4gICAgY2xpY2tFbGVtZW50OiAoY2xpY2tQYXJhbXM6IENsaWNrRWxlbWVudFBhcmFtcykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBjbGlja01vdXNlOiAoY2xpY2tQYXJhbXM6IENsaWNrTW91c2VQYXJhbXMpID0+IFByb21pc2U8dm9pZD47XG4gICAgaG92ZXJFbGVtZW50OiAoaG92ZXJQYXJhbXM6IEhvdmVyRWxlbWVudFBhcmFtcykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBtb3ZlTW91c2U6IChtb3ZlUGFyYW1zOiBNb3ZlTW91c2VQYXJhbXMpID0+IFByb21pc2U8dm9pZD47XG4gICAgcHJlc3NLZXk6IChwcmVzc1BhcmFtczogUHJlc3NLZXlQYXJhbXMpID0+IFByb21pc2U8dm9pZD47XG4gICAgdHlwZUludG9FZGl0b3I6ICh0eXBlUGFyYW1zOiBUeXBlSW50b0VkaXRvclBhcmFtcykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICB1bmhvdmVyRWxlbWVudDogKHVuaG92ZXJQYXJhbXM6IFVuaG92ZXJFbGVtZW50UGFyYW1zKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB9XG5cbiAgLy8gYFZhdWx0LmNvbmZpZ0RpcmAgaXMgZGVjbGFyZWQgYWx3YXlzLXByZXNlbnQgYnkgYG9ic2lkaWFuLXR5cGluZ3NgLCBidXQgb2xkXG4gIC8vIE9ic2lkaWFuIHZlcnNpb25zIChlLmcuIDAuOS4xMCkgbGVhdmUgaXQgdW5kZWZpbmVkIGF0IHJ1bnRpbWUuIFByb2JlIHRocm91Z2hcbiAgLy8gdGhpcyBvcHRpb25hbC1tZW1iZXIgdmlldyBzbyBhIGA/PyAnLm9ic2lkaWFuJ2AgZGVmYXVsdCBpcyBub3QgZmxhZ2dlZCBhcyBhblxuICAvLyB1bm5lY2Vzc2FyeSBjb25kaXRpb24uXG4gIGludGVyZmFjZSBWYXVsdExpa2Uge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIFN0cnVjdHVyYWwgbWlycm9yIG9mIE9ic2lkaWFuJ3Mgb3duIGBWYXVsdC5jb25maWdEaXJgOyB0aGUgbmFtZSBoYXMgdG8gbWF0Y2ggZm9yIHRoZSBwcm9iZSB0byByZWFkIGl0LlxuICAgIGNvbmZpZ0Rpcj86IHN0cmluZztcbiAgfVxuXG4gIC8vIGB3aW5kb3cuYXBwYCAvIGBhcHAud29ya3NwYWNlYCBhcmUgZGVjbGFyZWQgYWx3YXlzLXByZXNlbnQsIGJ1dCBhcmUgdHJhbnNpZW50bHlcbiAgLy8gdW5kZWZpbmVkIGR1cmluZyBib290IGFuZCBhZnRlciBhbiBvd25lZC13aW5kb3cgcmVsb2FkLiBQcm9iZSB0aHJvdWdoIHRoZXNlXG4gIC8vIG9wdGlvbmFsLW1lbWJlciB2aWV3cyBzbyB0aGUgcmVhZGluZXNzIGNoZWNrIGNhbiBndWFyZCB0aGVtIHdpdGhvdXQgYSBmYWxzZVxuICAvLyBgbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uYC5cbiAgaW50ZXJmYWNlIFdvcmtzcGFjZUxpa2Uge1xuICAgIGxheW91dFJlYWR5PzogYm9vbGVhbjtcbiAgfVxuXG4gIGludGVyZmFjZSBBcHBMaWtlIHtcbiAgICB3b3Jrc3BhY2U/OiBXb3Jrc3BhY2VMaWtlO1xuICB9XG5cbiAgdHlwZSBDdXJyZW50V2ViQ29udGVudHMgPSBSZXR1cm5UeXBlPFdpbmRvd1snZWxlY3Ryb24nXVsncmVtb3RlJ11bJ2dldEN1cnJlbnRXZWJDb250ZW50cyddPjtcblxuICAvLyBUaGUgRWxlY3Ryb24gbW9kaWZpZXIta2V5IG5hbWVzIGBzZW5kSW5wdXRFdmVudGAgYWNjZXB0cyAoZS5nLiAnbWV0YScsICdjb250cm9sJywgJ3NoaWZ0JywgJ2FsdCcpLlxuICAvLyBEZXJpdmVkIGZyb20gdGhlIHdlYi1jb250ZW50cyB0eXBlIHNvIGl0IHN0YXlzIGluIHN5bmMgd2l0aCB0aGUgRWxlY3Ryb24gdHlwaW5ncy5cbiAgdHlwZSBFbGVjdHJvbk1vZGlmaWVyID0gTm9uTnVsbGFibGU8UGFyYW1ldGVyczxDdXJyZW50V2ViQ29udGVudHNbJ3NlbmRJbnB1dEV2ZW50J10+WzBdWydtb2RpZmllcnMnXT5bbnVtYmVyXTtcblxuICBpbnRlcmZhY2UgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0ge1xuICAgIFBsYXRmb3JtOiBPYnNpZGlhblBsYXRmb3JtO1xuICB9XG5cbiAgaW50ZXJmYWNlIE9ic2lkaWFuUGxhdGZvcm0ge1xuICAgIGlzTWFjT1M6IGJvb2xlYW47XG4gICAgaXNNb2JpbGU6IGJvb2xlYW47XG4gIH1cblxuICAvKipcbiAgICogQSB0cnVzdGVkLWlucHV0IHJlcXVlc3QgaGFuZGVkIHRvIHRoZSBob3N0IG92ZXIgdGhlIGBSdW50aW1lLmFkZEJpbmRpbmdgIGNoYW5uZWwuXG4gICAqXG4gICAqIFN0cnVjdHVyYWxseSBpZGVudGljYWwgdG8gYE1vYmlsZUlucHV0UmVxdWVzdGAgaW4gYG1vYmlsZS1pbnB1dC50c2AsIHJlZGVjbGFyZWQgaGVyZSBiZWNhdXNlIHRoaXNcbiAgICogY2xvc3VyZSBpcyBzZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIGNhbm5vdCBpbXBvcnQgKCoqTDE1KiopLiBUaGUgdHdvIGFyZSBvbmUgd2lyZSBmb3JtYXQ7IGNoYW5nZVxuICAgKiB0aGVtIHRvZ2V0aGVyLlxuICAgKi9cbiAgdHlwZSBNb2JpbGVJbnB1dFJlcXVlc3QgPSBNb2JpbGVLZXlJbnB1dFJlcXVlc3QgfCBNb2JpbGVQb2ludGVySW5wdXRSZXF1ZXN0O1xuXG4gIGludGVyZmFjZSBNb2JpbGVLZXlJbnB1dFJlcXVlc3Qge1xuICAgIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGtpbmQ6ICdrZXknO1xuICAgIHJlYWRvbmx5IG1vZGlmaWVyczogcmVhZG9ubHkgc3RyaW5nW107XG4gIH1cblxuICBpbnRlcmZhY2UgTW9iaWxlUG9pbnRlcklucHV0UmVxdWVzdCB7XG4gICAgcmVhZG9ubHkga2luZDogJ2xvbmdQcmVzcycgfCAndGFwJztcbiAgICByZWFkb25seSBtb2RpZmllcnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAgIHJlYWRvbmx5IHg6IG51bWJlcjtcbiAgICByZWFkb25seSB5OiBudW1iZXI7XG4gIH1cblxuICBpbnRlcmZhY2UgUGVuZGluZ0lucHV0IHtcbiAgICByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gICAgcmVzb2x2ZTogKCkgPT4gdm9pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxheSAoaW4gbXMpIGJlZm9yZSBpbnZva2luZyBgZWxlY3Ryb25XaW5kb3cuZGVzdHJveSgpYCBzbyB0aGUgZXZhbCB0aGF0XG4gICAqIHRyaWdnZXJlZCB0aGUgY2FsbCBoYXMgdGltZSB0byByZXR1cm4gaXRzIHJlc3VsdCB0byB0aGUgY2FsbGVyLiBXaXRob3V0XG4gICAqIGl0IHRoZSByZW5kZXJlciBkaWVzIGJlZm9yZSB0aGUgSVBDIHJlcGx5IHNoaXBzLCB0aGUgY2FsbGVyIHdhaXRzIGZvciB0aGVcbiAgICogZnVsbCBldmFsIHRpbWVvdXQsIGFuZCBzdGFsZSBgQnJvd3NlcldpbmRvd2AgZW50cmllcyBwaWxlIHVwLlxuICAgKi9cbiAgY29uc3QgREVTVFJPWV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSA1MDtcblxuICAvKipcbiAgICogSW50ZXJ2YWwgKGluIG1zKSBiZXR3ZWVuIHBvbGxzIHdoaWxlIHdhaXRpbmcgZm9yIGEgdHJ1c3RlZCBpbnB1dCBldmVudCB0b1xuICAgKiB0YWtlIGVmZmVjdCAodGhlIGVkaXRvciBkb2N1bWVudCB1cGRhdGVzLCBvciBhbiBlbGVtZW50J3MgYDpob3ZlcmAgc3RhdGVcbiAgICogZmxpcHMpLiBTaGFyZWQgYnkgZXZlcnkgdHJ1c3RlZC1pbnB1dCBoZWxwZXIuXG4gICAqL1xuICBjb25zdCBJTlBVVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHRpbWUgKGluIG1zKSB0byB3YWl0IGZvciBhIHRydXN0ZWQgaW5wdXQgZXZlbnQgdG8gdGFrZSBlZmZlY3RcbiAgICogYmVmb3JlIGdpdmluZyB1cCAodGhlIGV4cGVjdGVkIG91dGNvbWUgd2hlbiB0aGUgaW5wdXQgaXMgcmVqZWN0ZWQgXHUyMDE0IGUuZy4gYVxuICAgKiByZWFkLW9ubHkgZWRpdG9yLCBvciBhIHBvaW50ZXIgbW92ZSB0aGF0IG5ldmVyIGxhbmRzIG9uIHRoZSBlbGVtZW50KS5cbiAgICovXG4gIGNvbnN0IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcblxuICAvKipcbiAgICogRGVmYXVsdCBtYXhpbXVtIHRpbWUgKGluIG1zKSB7QGxpbmsgb3BlblNldHRpbmdzVGFifSB3YWl0cyBmb3IgdGhlIHNldHRpbmdzXG4gICAqIG1vZGFsIHRvIG9wZW4gYW5kIGZvciB0aGUgcmVxdWVzdGVkIHRhYiB0byByZW5kZXIsIHdoZW4gdGhlIGNhbGxlciBkb2VzIG5vdFxuICAgKiBvdmVycmlkZSBpdC5cbiAgICovXG4gIGNvbnN0IFNFVFRJTkdTX1RBQl9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgaW50ZXJ2YWwgKGluIG1zKSBiZXR3ZWVuIHtAbGluayB3YWl0VW50aWx9IHByZWRpY2F0ZSBjaGVja3Mgd2hlbiB0aGVcbiAgICogY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heGltdW0gdGltZSAoaW4gbXMpIHtAbGluayB3YWl0VW50aWx9IHdhaXRzIGZvciBpdHMgcHJlZGljYXRlIHRvXG4gICAqIGJlY29tZSB0cnV0aHkgYmVmb3JlIHJlamVjdGluZywgd2hlbiB0aGUgY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IHRpbWVzIHtAbGluayBjcmVhdGVOb3RlfSByZXdyaXRlcyBhIG5vdGUgd2hvc2UgY29udGVudCBkaWQgbm90XG4gICAqIHJlYWNoIHRoZSBmaWxlc3lzdGVtIGJlZm9yZSBnaXZpbmcgdXAuXG4gICAqXG4gICAqIFRoZSBBbmRyb2lkIGVtdWxhdG9yIGxvc2VzIHJvdWdobHkgMSB3cml0ZSBpbiAxMTAsIHNvIGEgc2luZ2xlIHJlcGFpclxuICAgKiBhbHJlYWR5IG1ha2VzIGEgbG9zdCBub3RlIGFzdHJvbm9taWNhbGx5IHVubGlrZWx5OyB0aGUgZXh0cmEgYXR0ZW1wdHMgY29zdFxuICAgKiBub3RoaW5nIHdoZW4gbm90aGluZyBpcyBsb3N0LCBhbmQgdGhlIGNhcCBpcyB3aGF0IGtlZXBzIGEgZ2VudWluZWx5IGJyb2tlblxuICAgKiB3cml0ZSBmcm9tIGJlaW5nIHJldHJpZWQgZm9yZXZlciBpbnN0ZWFkIG9mIGZhaWxpbmcgd2l0aCBhIHJlYWRhYmxlIGVycm9yLlxuICAgKi9cbiAgY29uc3QgQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQgPSAzO1xuXG4gIC8qKlxuICAgKiBQcmVmaXggdXNlZCBieSB7QGxpbmsgZXJyb3JUb1N0cmluZ30ncyBuZXN0ZWQtZXJyb3Igc2VwYXJhdG9yIGxpbmVzLCBtYXRjaGluZ1xuICAgKiB0aGUgYCAgICBhdGAgcHJlZml4IG9mIGEgVjggc3RhY2stdHJhY2UgZnJhbWUgc28gdGhlIHNlcGFyYXRvcnMgYmxlbmQgaW50b1xuICAgKiB0aGUgc3Vycm91bmRpbmcgc3RhY2suIEtlcHQgaWRlbnRpY2FsIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgJyBgZXJyb3JUb1N0cmluZ2AuXG4gICAqL1xuICBjb25zdCBTVEFDS19UUkFDRV9QUkVGSVggPSAnICAgIGF0JztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gQXBwcm92ZWQgZG91YmxlIGNhc3Q6IGBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBpcyBvdXIgaW50ZXJuYWwgV2luZG93IGF1Z21lbnRhdGlvbiwgaW50ZW50aW9uYWxseSBrZXB0IGxvY2FsIChub3QgZGVjbGFyZWQgZ2xvYmFsbHkpIHRvIGF2b2lkIGxlYWtpbmcgaW50byBjb25zdW1lciB0eXBlcy5cbiAgY29uc3QgaG9sZGVyID0gZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFBhcnRpYWw8SW50ZWdyYXRpb25UZXN0aW5nSG9sZGVyPjtcbiAgY29uc3QgZXhpc3RpbmdDb250ZXh0cyA9IGhvbGRlci5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5jb250ZXh0cyA/PyB7fTtcbiAgY29uc3QgZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSA9IGhvbGRlci5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5vYnNpZGlhbk1vZHVsZTtcbiAgLy8gV2FybiBhdCBtb3N0IG9uY2UgcGVyIGJvb3RzdHJhcCB0aGF0IGBvYnNpZGlhbk1vZHVsZWAgaXMgYG51bGxgIG9uIHRoaXMgdmVyc2lvbi5cbiAgbGV0IGhhc1dhcm5lZE1pc3NpbmdPYnNpZGlhbk1vZHVsZSA9IGZhbHNlO1xuXG4gIC8vIEluLWZsaWdodCBtb2JpbGUgaW5wdXQgcmVxdWVzdHMsIGtleWVkIGJ5IHJlcXVlc3QgaWQsIGF3YWl0aW5nIHRoZSBob3N0J3MgYW5zd2VyIHZpYSBgcmVzb2x2ZUlucHV0YC5cbiAgY29uc3QgcGVuZGluZ0lucHV0cyA9IG5ldyBNYXA8c3RyaW5nLCBQZW5kaW5nSW5wdXQ+KCk7XG4gIGxldCBuZXh0SW5wdXRJZCA9IDA7XG5cbiAgLy8gUmVxdWVzdCBpZHMgYWxyZWFkeSBjbGFpbWVkIGJ5IHNvbWUgaG9zdCwgc28gYSBzZWNvbmQgYXR0YWNoZWQgaG9zdCBkb2VzIG5vdCBpbmplY3QgdGhlIGdlc3R1cmUgYVxuICAvLyBzZWNvbmQgdGltZSBcdTIwMTQgc2VlIGBjbGFpbUlucHV0YC4gSWRzIGFyZSBtb25vdG9uaWMgd2l0aGluIGEgcGFnZSwgc28gdGhpcyBvbmx5IGdyb3dzIGFzIGZhc3QgYXMgdGhlXG4gIC8vIHJ1biBkcml2ZXMgaW5wdXQsIGFuZCBpdCBkaWVzIHdpdGggdGhlIHBhZ2UuXG4gIGNvbnN0IGNsYWltZWRJbnB1dElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0IG5zOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UgPSB7XG4gICAgZ2V0IGFwcCgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSBgYXBwYCBnZXR0ZXIgcmVhZHMgYHdpbmRvdy5hcHBgIHdoaWNoIGlzIHNldCBieSBPYnNpZGlhbi5cbiAgICAgIHJldHVybiBnbG9iYWxUaGlzLmFwcDtcbiAgICB9LFxuXG4gICAgY2xhaW1JbnB1dCh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIGlmIChjbGFpbWVkSW5wdXRJZHMuaGFzKGlkKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNsYWltZWRJbnB1dElkcy5hZGQoaWQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIGNvbnRleHRzOiBleGlzdGluZ0NvbnRleHRzLFxuXG4gICAgYXN5bmMgZGVzdHJveUN1cnJlbnRXaW5kb3codGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICBhd2FpdCBzbGVlcCgwKTtcbiAgICAgIGNvbnN0IGVsZWN0cm9uV2luZG93ID0gZ2xvYmFsVGhpcy5lbGVjdHJvbldpbmRvdztcbiAgICAgIGdsb2JhbFRoaXMuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGVsZWN0cm9uV2luZG93LmRlc3Ryb3koKTtcbiAgICAgIH0sIERFU1RST1lfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZW5zdXJlTGF5b3V0UmVhZHkodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeShyZXNvbHZlKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBlcnJvclRvU3RyaW5nKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGVycm9yVG9TdHJpbmdJbXBsKGVycm9yKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZXZhbFdyYXBwZXIodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgLy8gT2xkIE9ic2lkaWFuIChlLmcuIDAuNi54KSBwcmVkYXRlcyB0aGUgY29tbXVuaXR5LXBsdWdpbiBBUEk6IGBwbHVnaW5zYFxuICAgICAgLy8gZXhpc3RzIGJ1dCBoYXMgbm8gYGlzRW5hYmxlZGAvYHNldEVuYWJsZWAsIGFuZCB0aGVyZSBhcmUgbm8gdGhpcmQtcGFydHlcbiAgICAgIC8vIHBsdWdpbnMgdG8gZW5hYmxlLCBzbyBza2lwIHRoaXMgc3RlcCB3aGVuIHRoZSBBUEkgaXMgYWJzZW50LlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIHByb2JlIHRoZSBydW50aW1lLW9wdGlvbmFsIGNvbW11bml0eS1wbHVnaW4gQVBJLlxuICAgICAgY29uc3QgcGx1Z2lucyA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmIChwbHVnaW5zLmlzRW5hYmxlZCAmJiAhcGx1Z2lucy5pc0VuYWJsZWQoKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC5wbHVnaW5zLnNldEVuYWJsZSh0cnVlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2lkaWFuTW9kdWxlID0gYXdhaXQgdGhpcy5nZXRPYnNpZGlhbk1vZHVsZSgpO1xuICAgICAgLy8gQXZvaWQgYD8/PWA6IG9sZCBPYnNpZGlhbidzIENocm9taXVtIChlLmcuIDAuNi54IG9uIENocm9taXVtIDgwKSBwcmVkYXRlc1xuICAgICAgLy8gRVMyMDIxIGxvZ2ljYWwtYXNzaWdubWVudCBhbmQgY2Fubm90IHBhcnNlIGl0IGluIHRoaXMgc2VyaWFsaXplZCBib290c3RyYXAuXG4gICAgICBsZXQgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgIGlmIChwYXJhbXMuY29udGV4dElkKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGV4dCA9IHRoaXMuY29udGV4dHNbcGFyYW1zLmNvbnRleHRJZF07XG4gICAgICAgIGlmIChleGlzdGluZ0NvbnRleHQpIHtcbiAgICAgICAgICBjb250ZXh0ID0gZXhpc3RpbmdDb250ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY29udGV4dHNbcGFyYW1zLmNvbnRleHRJZF0gPSBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgaW5qZWN0ZWQgYGxpYmAgYmFnOiBiYXNlIGhlbHBlcnMgZnJvbSB0aGUgaGFybmVzcywgdGhlbiBwcm92aWRlcnMgb24gdG9wLlxuICAgICAgLy8gUmVzb2x2ZXJzIHJ1biBpbi1yZW5kZXJlciAodGhleSByZWFkIHJlbmRlcmVyIGdsb2JhbHMgYSBwcm92aWRlciBwdWJsaXNoZWQpLlxuICAgICAgLy8gUmVidWlsZGluZyBwZXIgZXZhbCBrZWVwcyBgbGliYCBmcmVzaCBhbmQgdG9sZXJhbnQgb2YgYSBsYXRlLWxvYWRlZCBwcm92aWRlci5cbiAgICAgIGNvbnN0IGxpYiA9IHtcbiAgICAgICAgY2xpY2tFbGVtZW50LFxuICAgICAgICBjbGlja01vdXNlLFxuICAgICAgICBjcmVhdGVOb3RlLFxuICAgICAgICBob3ZlckVsZW1lbnQsXG4gICAgICAgIG1vdmVNb3VzZSxcbiAgICAgICAgb3BlblNldHRpbmdzVGFiLFxuICAgICAgICBwcmVzc0tleSxcbiAgICAgICAgdHlwZUludG9FZGl0b3IsXG4gICAgICAgIHVuaG92ZXJFbGVtZW50LFxuICAgICAgICB3YWl0VW50aWxcbiAgICAgIH07XG4gICAgICBmb3IgKGNvbnN0IHJlc29sdmVMaWIgb2YgdGhpcy5saWJSZXNvbHZlcnMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihsaWIsIHJlc29sdmVMaWIoKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmdWxsQXJndW1lbnRzID0geyAuLi5wYXJhbXMuaW5wdXQsIGFwcDogdGhpcy5hcHAsIGNvbnRleHQsIGxpYiwgb2JzaWRpYW5Nb2R1bGUgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhcmFtcy5jYWxsYmFjayhmdWxsQXJndW1lbnRzKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3VuZGVmaW5lZCcgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IHJlc3VsdCB9KTtcbiAgICAgIH0gY2F0Y2ggKGV2YWxFcnJvcikge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnZXJyb3InLCB2YWx1ZTogdGhpcy5lcnJvclRvU3RyaW5nKGV2YWxFcnJvcikgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGdldE9ic2lkaWFuTW9kdWxlKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgaWYgKHRoaXMub2JzaWRpYW5Nb2R1bGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzaWRpYW5Nb2R1bGU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSB0ZW1wLXBsdWdpbiB0cmljayBiZWxvdyByZXNvbHZlcyBgcmVxdWlyZSgnb2JzaWRpYW4nKWAsIHdoaWNoIG9ubHlcbiAgICAgIC8vIHdvcmtzIGluc2lkZSBhIHBsdWdpbi1sb2FkIGNvbnRleHQuIEl0IG5lZWRzIHRoZSBjb21tdW5pdHktcGx1Z2luIHJlZ2lzdHJ5XG4gICAgICAvLyAoYGxvYWRQbHVnaW5gICsgYG1hbmlmZXN0c2ApLCB3aGljaCBGSVJTVCBhcHBlYXJzIGluIE9ic2lkaWFuIDAuOS43OyB0aGVcbiAgICAgIC8vIDAuNi40LTAuOS42IGJhbmQgaGFzIG5vIHJlZ2lzdHJ5IGFuZCBjYW5ub3QgcnVuIGl0LCBzbyByZXR1cm4gYG51bGxgIChub3RcbiAgICAgIC8vIGB1bmRlZmluZWRgKSAtIGFwcC1vbmx5IGNsb3N1cmVzIChgY2FsbGJhY2soeyBhcHAgfSlgKSBzdGlsbCBydW4uXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gcHJvYmUgdGhlIHJ1bnRpbWUtb3B0aW9uYWwgY29tbXVuaXR5LXBsdWdpbiBBUEkuXG4gICAgICBjb25zdCBwbHVnaW5zID0gdGhpcy5hcHAucGx1Z2lucyBhcyB1bmtub3duIGFzIFBsdWdpbnNMaWtlO1xuICAgICAgaWYgKCFwbHVnaW5zLmxvYWRQbHVnaW4gfHwgIXBsdWdpbnMubWFuaWZlc3RzKSB7XG4gICAgICAgIGlmICghaGFzV2FybmVkTWlzc2luZ09ic2lkaWFuTW9kdWxlKSB7XG4gICAgICAgICAgaGFzV2FybmVkTWlzc2luZ09ic2lkaWFuTW9kdWxlID0gdHJ1ZTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nXSBgb2JzaWRpYW5Nb2R1bGVgIGlzIGBudWxsYDogdGhpcyBPYnNpZGlhbiB2ZXJzaW9uIHByZWRhdGVzIHRoZSBjb21tdW5pdHktcGx1Z2luIEFQSSAoYWRkZWQgaW4gMC45LjcpLCBzbyB0aGUgYG9ic2lkaWFuYCBtb2R1bGUgY2Fubm90IGJlIHJlc29sdmVkLiBBcHAtb25seSBjbG9zdXJlcyAoYGNhbGxiYWNrKHsgYXBwIH0pYCkgc3RpbGwgd29yay4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgU0xJQ0VfU1RBUlQgPSAyO1xuICAgICAgY29uc3QgcmFuZG9tU3VmZml4ID0gU3RyaW5nKE1hdGgucmFuZG9tKCkpLnNsaWNlKFNMSUNFX1NUQVJUKTtcbiAgICAgIGNvbnN0IHRlbXBvcmFyeU1vZHVsZU5hbWUgPSBgZ2V0LW9ic2lkaWFuLW1vZHVsZS0ke3JhbmRvbVN1ZmZpeH1gO1xuICAgICAgLy8gT2xkIHZlcnNpb25zIChlLmcuIDAuOS4xMCkgbGVhdmUgYHZhdWx0LmNvbmZpZ0RpcmAgdW5kZWZpbmVkOyBmYWxsIGJhY2sgdG9cbiAgICAgIC8vIE9ic2lkaWFuJ3MgZGVmYXVsdCBjb25maWcgZGlyIHNvIHRoZSB0ZW1wIHBsdWdpbiBzdGlsbCBnZXRzIGEgdmFsaWQgcGF0aCxcbiAgICAgIC8vIGxvYWRzLCBhbmQgaXRzIGByZXF1aXJlKCdvYnNpZGlhbicpYCByZXNvbHZlcyB0aGUgbW9kdWxlLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIGNvbmZpZ0RpciBpcyBydW50aW1lLW9wdGlvbmFsIG9uIG9sZCB2ZXJzaW9ucy5cbiAgICAgIGNvbnN0IGNvbmZpZ0RpcmVjdG9yeSA9ICh0aGlzLmFwcC52YXVsdCBhcyB1bmtub3duIGFzIFZhdWx0TGlrZSkuY29uZmlnRGlyID8/ICcub2JzaWRpYW4nO1xuICAgICAgY29uc3QgcGx1Z2luc0RpcmVjdG9yeSA9IGAke2NvbmZpZ0RpcmVjdG9yeX0vcGx1Z2luc2A7XG4gICAgICBjb25zdCBkaXJlY3RvcnkgPSBgJHtwbHVnaW5zRGlyZWN0b3J5fS8ke3RlbXBvcmFyeU1vZHVsZU5hbWV9YDtcbiAgICAgIHRoaXMuYXBwLnBsdWdpbnMubWFuaWZlc3RzW3RlbXBvcmFyeU1vZHVsZU5hbWVdID0ge1xuICAgICAgICBhdXRob3I6ICcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGBkaXJgIGlzIE9ic2lkaWFuJ3Mgb3duIGBQbHVnaW5NYW5pZmVzdGAgbWVtYmVyIG5hbWUuXG4gICAgICAgIGRpcjogZGlyZWN0b3J5LFxuICAgICAgICBpZDogdGVtcG9yYXJ5TW9kdWxlTmFtZSxcbiAgICAgICAgaXNEZXNrdG9wT25seTogZmFsc2UsXG4gICAgICAgIG1pbkFwcFZlcnNpb246ICcnLFxuICAgICAgICBuYW1lOiB0ZW1wb3JhcnlNb2R1bGVOYW1lLFxuICAgICAgICB2ZXJzaW9uOiAnJ1xuICAgICAgfTtcbiAgICAgIC8vIGBhZGFwdGVyLm1rZGlyYCBpcyBub3QgcmVjdXJzaXZlLCBhbmQgYW4gb2xkIHZlcnNpb24gb24gYSBmcmVzaCB2YXVsdCBtYXkgbm90XG4gICAgICAvLyBoYXZlIHRoZSBjb25maWcvcGx1Z2lucyBkaXJzIHlldCBcdTIwMTQgY3JlYXRlIHRoZSBjaGFpbiBzbyBgbG9hZFBsdWdpbmAgZmluZHMgdGhlXG4gICAgICAvLyB0ZW1wIHBsdWdpbiBhdCBgPGNvbmZpZ0Rpcj4vcGx1Z2lucy88aWQ+YC5cbiAgICAgIGlmICghKGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKGNvbmZpZ0RpcmVjdG9yeSkpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIubWtkaXIoY29uZmlnRGlyZWN0b3J5KTtcbiAgICAgIH1cbiAgICAgIGlmICghKGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKHBsdWdpbnNEaXJlY3RvcnkpKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLm1rZGlyKHBsdWdpbnNEaXJlY3RvcnkpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5ta2RpcihkaXJlY3RvcnkpO1xuXG4gICAgICBjb25zdCBwbHVnaW5GdW5jdGlvbkJvZHkgPSAnY29uc3Qgcj1yZXF1aXJlLGU9ZXhwb3J0cztjb25zdCBtPXIoXFwnb2JzaWRpYW5cXCcpO3dpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLm9ic2lkaWFuTW9kdWxlPW07ZS5kZWZhdWx0PW0uUGx1Z2luOyc7XG4gICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLndyaXRlKGAke2RpcmVjdG9yeX0vbWFpbi5qc2AsIHBsdWdpbkZ1bmN0aW9uQm9keSk7XG5cbiAgICAgIGF3YWl0IHRoaXMuYXBwLnBsdWdpbnMubG9hZFBsdWdpbih0ZW1wb3JhcnlNb2R1bGVOYW1lKTtcbiAgICAgIC8vIGB1bmluc3RhbGxQbHVnaW5gIGFycml2ZWQgYWZ0ZXIgdGhlIHBsdWdpbiBBUEkgaXRzZWxmLCBzbyBpdCBpcyBhYnNlbnQgb25cbiAgICAgIC8vIDAuOS43IC0gdGhlIEZJUlNUIHZlcnNpb24gdG8gZXhwb3NlIGBsb2FkUGx1Z2luYC9gbWFuaWZlc3RzYCAoMC45LjYgYW5kIGJlbG93XG4gICAgICAvLyBoYXZlIG5laXRoZXIsIGFuZCByZXR1cm4gYHVuZGVmaW5lZGAgYWJvdmUpLiBUaGUgbW9kdWxlIGlzIGFscmVhZHkgY2FwdHVyZWQgYnlcbiAgICAgIC8vIHRoZSBwbHVnaW4ncyBgbWFpbi5qc2AgYXQgdGhpcyBwb2ludCwgc28gb25seSB1bmluc3RhbGwgd2hlbiB0aGUgbWV0aG9kIGV4aXN0cztcbiAgICAgIC8vIE9uIDAuOS43IHRoZSB0ZW1wIHBsdWdpbiBsaW5nZXJzIGhhcm1sZXNzbHkgaW4gdGhlIGVwaGVtZXJhbCBvd25lZCB2YXVsdC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSB1bmluc3RhbGxQbHVnaW4gaXMgcnVudGltZS1vcHRpb25hbCBvbiBvbGQgdmVyc2lvbnMuXG4gICAgICBjb25zdCBwbHVnaW5zRm9yQ2xlYW51cCA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmIChwbHVnaW5zRm9yQ2xlYW51cC51bmluc3RhbGxQbHVnaW4pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy51bmluc3RhbGxQbHVnaW4odGVtcG9yYXJ5TW9kdWxlTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9ic2lkaWFuTW9kdWxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9ic2lkaWFuTW9kdWxlO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIG9ic2lkaWFuIG1vZHVsZScpO1xuICAgIH0sXG5cbiAgICBhc3luYyBpcGNTZW5kU3luYyh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIHBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgZ2xvYmFsVGhpcy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyhwYXJhbXMuY2hhbm5lbCwgLi4ucGFyYW1zLmNoYW5uZWxBcmd1bWVudHMpO1xuICAgIH0sXG5cbiAgICBsaWJSZXNvbHZlcnM6IGJvb3RzdHJhcFBhcmFtcy5saWJSZXNvbHZlcnMsXG5cbiAgICBvYnNpZGlhbk1vZHVsZTogZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSxcblxuICAgIGFzeW5jIHBvbGxWYXVsdEJhc2VQYXRoKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAvLyBgd2luZG93LmFwcGAsIGl0cyBgd29ya3NwYWNlYCwgYW5kIGxheW91dCBjYW4gYWxsIGJlIHRyYW5zaWVudGx5XG4gICAgICAvLyB1bmF2YWlsYWJsZSBkdXJpbmcgYm9vdCBvciByaWdodCBhZnRlciBhbiBvd25lZC13aW5kb3cgcmVsb2FkLCBhbmQgb2xkXG4gICAgICAvLyBPYnNpZGlhbiBwcmVkYXRlcyBgV29ya3NwYWNlLm9uTGF5b3V0UmVhZHlgLiBUaGlzIHJ1bnMgaW5zaWRlIHRoZSB0cmFuc3BvcnQnc1xuICAgICAgLy8gcmVhZGluZXNzIHBvbGwsIHdoaWNoIHJldHJpZXMgb24gdGhyb3csIHNvIGNoZWNrIGB3aW5kb3cuYXBwYCBGSVJTVCBhbmQgYmFpbFxuICAgICAgLy8gY2xlYW5seSB1bnRpbCBpdCwgaXRzIHdvcmtzcGFjZSwgYW5kIGxheW91dCBhcmUgYWxsIHJlYWR5IFx1MjAxNCBuZXZlciBkZXJlZmVyZW5jZVxuICAgICAgLy8gYW4gdW5kZWZpbmVkIGB3aW5kb3cuYXBwYC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSB3aW5kb3cuYXBwL3dvcmtzcGFjZSBhcmUgcnVudGltZS1vcHRpb25hbCBkdXJpbmcgYm9vdC5cbiAgICAgIGNvbnN0IGFwcCA9IHRoaXMuYXBwIGFzIHVua25vd24gYXMgQXBwTGlrZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghYXBwPy53b3Jrc3BhY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPd25lZCB2YXVsdCBpcyBub3QgcmVhZHkgeWV0ICh3aW5kb3cuYXBwL3dvcmtzcGFjZSBub3QgaW5pdGlhbGl6ZWQpLicpO1xuICAgICAgfVxuICAgICAgLy8gT2xkIE9ic2lkaWFuIHByZWRhdGVzIGBXb3Jrc3BhY2Uub25MYXlvdXRSZWFkeWAgYnV0IGhhcyBgbGF5b3V0UmVhZHkgPT09IHRydWVgXG4gICAgICAvLyBieSB0aGUgdGltZSBhIHdpbmRvdyBpcyB1cDsgb25seSB3YWl0IHZpYSBgZW5zdXJlTGF5b3V0UmVhZHlgIHdoZW4gaXQgaXMgbm90XG4gICAgICAvLyB5ZXQgcmVhZHkgKG1vZGVybiB2ZXJzaW9ucyBlYXJseSBpbiBib290KSwgc28gdGhlIG1pc3NpbmcgbWV0aG9kIGlzIG5ldmVyIGhpdC5cbiAgICAgIGlmICghYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeSkge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBEYXRhQWRhcHRlciBpcyBhY3R1YWxseSBGaWxlU3lzdGVtQWRhcHRlciBhdCBydW50aW1lIG9uIGRlc2t0b3AuXG4gICAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hcHAudmF1bHQuYWRhcHRlciBhcyB1bmtub3duIGFzIEZpbGVTeXN0ZW1BZGFwdGVyTGlrZTtcbiAgICAgIC8vIE9sZCBPYnNpZGlhbiB2ZXJzaW9ucyAoZS5nLiAwLjYueCkgcHJlZGF0ZSB0aGUgYGdldEJhc2VQYXRoKClgIG1ldGhvZCBidXRcbiAgICAgIC8vIGV4cG9zZSB0aGUgYGJhc2VQYXRoYCBwcm9wZXJ0eTsgdGhlIG1ldGhvZCBleGlzdHMgZnJvbSB+MC45LjIwIG9ud2FyZC5cbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gYWRhcHRlci5nZXRCYXNlUGF0aCA/IGFkYXB0ZXIuZ2V0QmFzZVBhdGgoKSA6IChhZGFwdGVyLmJhc2VQYXRoID8/ICcnKTtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShiYXNlUGF0aCk7XG4gICAgfSxcblxuICAgIHJlc29sdmVJbnB1dCh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIGlkOiBzdHJpbmcsIGVycm9yTWVzc2FnZTogbnVsbCB8IHN0cmluZyk6IHZvaWQge1xuICAgICAgY29uc3QgcGVuZGluZyA9IHBlbmRpbmdJbnB1dHMuZ2V0KGlkKTtcbiAgICAgIGlmICghcGVuZGluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBlbmRpbmdJbnB1dHMuZGVsZXRlKGlkKTtcbiAgICAgIGlmIChlcnJvck1lc3NhZ2UgPT09IG51bGwpIHtcbiAgICAgICAgcGVuZGluZy5yZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcGVuZGluZy5yZWplY3QobmV3IEVycm9yKGVycm9yTWVzc2FnZSkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBzZXRMb2NhbFN0b3JhZ2VJdGVtKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgcGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShwYXJhbXMua2V5LCBwYXJhbXMudmFsdWUpO1xuICAgIH0sXG5cbiAgICAvLyBUaGUgc2FtZSBmdW5jdGlvbiBvYmplY3RzIGBldmFsV3JhcHBlcmAgcHV0cyBpbiBhIGNsb3N1cmUncyBgbGliYCBiYWcgXHUyMDE0IGRlbGliZXJhdGVseSBub3QgcmUtZGVyaXZlZFxuICAgIC8vIGFuZCBub3Qgd3JhcHBlZCwgc28gYG9ic2lkaWFuLWRldi11dGlsc2AgZ2V0cyBleGFjdGx5IHRoZSBoYXJuZXNzJ3MgYmVoYXZpb3Igb24gYm90aCBwbGF0Zm9ybXMuXG4gICAgdHJ1c3RlZElucHV0OiB7XG4gICAgICBjbGlja0VsZW1lbnQsXG4gICAgICBjbGlja01vdXNlLFxuICAgICAgaG92ZXJFbGVtZW50LFxuICAgICAgbW92ZU1vdXNlLFxuICAgICAgcHJlc3NLZXksXG4gICAgICB0eXBlSW50b0VkaXRvcixcbiAgICAgIHVuaG92ZXJFbGVtZW50XG4gICAgfSxcblxuICAgIHZlcnNpb246IGJvb3RzdHJhcFBhcmFtcy52ZXJzaW9uXG4gIH07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGRvdWJsZSBjYXN0OiBgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgaXMgb3VyIGludGVybmFsIFdpbmRvdyBhdWdtZW50YXRpb24sIGludGVudGlvbmFsbHkga2VwdCBsb2NhbCAobm90IGRlY2xhcmVkIGdsb2JhbGx5KSB0byBhdm9pZCBsZWFraW5nIGludG8gY29uc3VtZXIgdHlwZXMuXG4gIChnbG9iYWxUaGlzIGFzIHVua25vd24gYXMgUGFydGlhbDxJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+KS5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nID0gbnM7XG5cbiAgYXN5bmMgZnVuY3Rpb24gdHlwZUludG9FZGl0b3IodHlwZVBhcmFtczogVHlwZUludG9FZGl0b3JQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBGT0NVU19TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuXG4gICAgY29uc3QgeyBlZGl0b3IsIHRleHQgfSA9IHR5cGVQYXJhbXM7XG4gICAgY29uc3QgdmFsdWVCZWZvcmVUeXBpbmcgPSBlZGl0b3IuZ2V0VmFsdWUoKTtcblxuICAgIC8vIEZvY3VzIHRoZSBlZGl0b3IgYW5kIHBsYWNlIHRoZSBjYXJldCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC5cbiAgICBlZGl0b3IuZm9jdXMoKTtcbiAgICBjb25zdCBsYXN0TGluZSA9IGVkaXRvci5sYXN0TGluZSgpO1xuICAgIGVkaXRvci5zZXRDdXJzb3IobGFzdExpbmUsIGVkaXRvci5nZXRMaW5lKGxhc3RMaW5lKS5sZW5ndGgpO1xuXG4gICAgLy8gTGV0IGFueSBmb2N1cyB0cmFwIChhIGBzZXRUaW1lb3V0KDApYCByZS1mb2N1cykgZmlyZSBiZWZvcmUgdHlwaW5nLCBzbyBzdG9sZW4gZm9jdXMgaXMgZGV0ZWN0ZWQuXG4gICAgYXdhaXQgc2xlZXAoRk9DVVNfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICAvLyBUeXBpbmcgaXMgcHJlc3NpbmcgZWFjaCBjaGFyYWN0ZXIga2V5IGluIHR1cm46IGBwcmVzc0tleWAgaW5qZWN0cyB0aGUgc2FtZSB0cnVzdGVkXG4gICAgLy8gYGtleURvd25gIC0+IGBjaGFyYCAtPiBga2V5VXBgIGEgcmVhbCB1c2VyIHByb2R1Y2VzIFx1MjAxNCB0ZXh0IGxhbmRzIG9ubHkgaWYgdGhlIGVkaXRvciBob2xkcyBmb2N1cy5cbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgdGV4dCkge1xuICAgICAgYXdhaXQgcHJlc3NLZXkoeyBrZXk6IGNoYXIgfSk7XG4gICAgfVxuXG4gICAgLy8gUG9sbCB1bnRpbCB0aGUgZG9jdW1lbnQgcmVmbGVjdHMgdGhlIGlucHV0IG9yIHRoZSB0aW1lb3V0IGVsYXBzZXMsIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoZWRpdG9yLmdldFZhbHVlKCkgPT09IHZhbHVlQmVmb3JlVHlwaW5nICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRydWUgd2hlbiB0aGlzIGNsb3N1cmUgaXMgcnVubmluZyBpbiBPYnNpZGlhbiBNb2JpbGUgcmF0aGVyIHRoYW4gdGhlIEVsZWN0cm9uIGRlc2t0b3AgYXBwLlxuICAvLyBSZWFkaW5nIGBQbGF0Zm9ybWAgb2ZmIHRoZSByZXNvbHZlZCBvYnNpZGlhbiBtb2R1bGUgaXMgc2FmZSBoZXJlOiBgZXZhbFdyYXBwZXJgIGFsd2F5cyByZXNvbHZlcyB0aGF0XG4gIC8vIG1vZHVsZSBiZWZvcmUgYW55IGNhbGxiYWNrIGNhbiBydW4sIHdoaWNoIGlzIHRoZSBzYW1lIGd1YXJhbnRlZSBgdG9FbGVjdHJvbk1vZGlmaWVyc2AgcmVsaWVzIG9uLlxuICBmdW5jdGlvbiBjaGVja0lzTW9iaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAobnMub2JzaWRpYW5Nb2R1bGUgYXMgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0pLlBsYXRmb3JtLmlzTW9iaWxlO1xuICB9XG5cbiAgLy8gSGFuZHMgb25lIHRydXN0ZWQtaW5wdXQgcmVxdWVzdCB0byB0aGUgaG9zdCBhbmQgd2FpdHMgZm9yIGl0IHRvIGJlIGluamVjdGVkLlxuICAvL1xuICAvLyBNb2JpbGUgaGFzIG5vIGluLXJlbmRlcmVyIHJvdXRlIHRvIGEgdHJ1c3RlZCBldmVudCBhdCBhbGwgXHUyMDE0IGBkaXNwYXRjaEV2ZW50YCBhbmQgYGVsZW1lbnQuY2xpY2soKWAgYXJlXG4gIC8vIGBpc1RydXN0ZWQgPT09IGZhbHNlYCBieSBzcGVjIFx1MjAxNCBzbyB0aGUgaW5qZWN0aW9uIGhhcyB0byBoYXBwZW4gZnJvbSB0aGUgTm9kZSBzaWRlLCBvdmVyIGEgQ0RQXG4gIC8vIGNvbm5lY3Rpb24gaW5kZXBlbmRlbnQgb2YgdGhlIEFwcGl1bSBzZXNzaW9uIHRoYXQgaXMgY3VycmVudGx5IGJsb2NrZWQgYXdhaXRpbmcgdGhpcyB2ZXJ5IGNsb3N1cmVcbiAgLy8gKHNlZSBMMzkpLiBgYmluZGluZ05hbWVgIGlzIGEgaG9zdC1pbnN0YWxsZWQgZ2xvYmFsOyBjYWxsaW5nIGl0IGRlbGl2ZXJzIHRoZSByZXF1ZXN0LCBhbmQgdGhlIGhvc3RcbiAgLy8gYW5zd2VycyBieSBjYWxsaW5nIGBucy5yZXNvbHZlSW5wdXRgLlxuICBhc3luYyBmdW5jdGlvbiByZXF1ZXN0SG9zdElucHV0KHJlcXVlc3Q6IE1vYmlsZUlucHV0UmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJpbmRpbmdOYW1lID0gYm9vdHN0cmFwUGFyYW1zLmlucHV0QmluZGluZ05hbWU7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGNhc3Q6IHRoZSBiaW5kaW5nIGlzIGluc3RhbGxlZCBieSB0aGUgaG9zdCBhdCBydW50aW1lIHZpYSBgUnVudGltZS5hZGRCaW5kaW5nYCwgc28gaXQgY2Fubm90IGJlIGRlY2xhcmVkIG9uIGBXaW5kb3dgLlxuICAgIGNvbnN0IGJpbmRpbmcgPSAoZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtiaW5kaW5nTmFtZV0gYXMgKChwYXlsb2FkOiBzdHJpbmcpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgYmluZGluZyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYFRydXN0ZWQgaW5wdXQgaXMgdW5hdmFpbGFibGU6IHRoZSBob3N0IGhhcyBub3QgaW5zdGFsbGVkIHRoZSBcXGAke2JpbmRpbmdOYW1lfVxcYCBjaGFubmVsLiBgXG4gICAgICAgICAgKyAnT24gbW9iaWxlIHRoZXNlIGhlbHBlcnMgcmVxdWlyZSB0aGUgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZyBBcHBpdW0gdHJhbnNwb3J0LidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbmV4dElucHV0SWQrKztcbiAgICBjb25zdCBpZCA9IFN0cmluZyhuZXh0SW5wdXRJZCk7XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBwZW5kaW5nSW5wdXRzLnNldChpZCwgeyByZWplY3QsIHJlc29sdmUgfSk7XG4gICAgICBnbG9iYWxUaGlzLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoIXBlbmRpbmdJbnB1dHMuaGFzKGlkKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHBlbmRpbmdJbnB1dHMuZGVsZXRlKGlkKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVGhlIGhvc3QgZGlkIG5vdCBzZXJ2aWNlIHRoZSB0cnVzdGVkIGlucHV0IHJlcXVlc3Qgd2l0aGluICR7U3RyaW5nKGJvb3RzdHJhcFBhcmFtcy5pbnB1dFRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMuYCkpO1xuICAgICAgfSwgYm9vdHN0cmFwUGFyYW1zLmlucHV0VGltZW91dEluTWlsbGlzZWNvbmRzKTtcblxuICAgICAgYmluZGluZyhKU09OLnN0cmluZ2lmeSh7IGlkLCByZXF1ZXN0IH0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEEgcG9pbnRlciBoZWxwZXIgdGhhdCBoYXMgbm8gdG91Y2ggYW5hbG9nIGlzIGEgaGFyZCBlcnJvciwgbmV2ZXIgYSBzaWxlbnQgbm8tb3A6IGA6aG92ZXJgIGRvZXMgbm90XG4gIC8vIGV4aXN0IG9uIHRvdWNoLCBzbyBhIHRlc3QgdGhhdCBcImhvdmVyZWRcIiBhbmQgdGhlbiBhc3NlcnRlZCB3b3VsZCBwYXNzIHdoaWxlIGV4ZXJjaXNpbmcgbm90aGluZyBcdTIwMTRcbiAgLy8gZXhhY3RseSB0aGUgZmFsc2UtY29uZmlkZW5jZSBmYWlsdXJlIHRoZSB0cnVzdGVkLWlucHV0IHdvcmsgZXhpc3RzIHRvIGVuZC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1mdW5jdGlvbi1zY29waW5nIC0tIEl0IGNhbm5vdCBtb3ZlIHRvIHRoZSBvdXRlciBzY29wZTogdGhpcyB3aG9sZSBmdW5jdGlvbiBpcyBzZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIG1heSBub3QgcmVmZXJlbmNlIGFueXRoaW5nIG91dHNpZGUgaXRzZWxmIChMMTUpLlxuICBmdW5jdGlvbiB0aHJvd1Vuc3VwcG9ydGVkT25Nb2JpbGUoaGVscGVyTmFtZTogc3RyaW5nKTogbmV2ZXIge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBcXGAke2hlbHBlck5hbWV9XFxgIGhhcyBubyBtZWFuaW5nIG9uIG1vYmlsZTogdG91Y2ggaW5wdXQgaGFzIG5vIGhvdmVyIHN0YXRlLiBgXG4gICAgICAgICsgJ0JyYW5jaCBvbiBgUGxhdGZvcm0uaXNEZXNrdG9wQXBwYCwgb3IgZHJpdmUgdGhlIGVsZW1lbnQgd2l0aCBgY2xpY2tFbGVtZW50YCBpbnN0ZWFkLidcbiAgICApO1xuICB9XG5cbiAgLy8gTWFwcyBPYnNpZGlhbidzIGBNb2RpZmllcmAgbmFtZXMgdG8gRWxlY3Ryb24ncyBsb3dlcmNhc2UgYHNlbmRJbnB1dEV2ZW50YCBtb2RpZmllciBuYW1lcy5cbiAgLy8gTmFtZXMgJ01ldGEnLCAnQWx0JywgJ1NoaWZ0JyBsb3dlcmNhc2UgZGlyZWN0bHk7ICdDdHJsJyAtPiAnY29udHJvbCc7ICdNb2QnIHJlc29sdmVzIHBlci1wbGF0Zm9ybS5cbiAgLy8gU2hhcmVkIGJ5IGV2ZXJ5IHRydXN0ZWQtaW5wdXQgaGVscGVyLCBzbyBhIGtleSBwcmVzcyBhbmQgYSBjbGljayBjYW5ub3QgZGlzYWdyZWUgb24gYCdNb2QnYC5cbiAgZnVuY3Rpb24gdG9FbGVjdHJvbk1vZGlmaWVycyhtb2RpZmllcnM6IHJlYWRvbmx5IE1vZGlmaWVyW10pOiBFbGVjdHJvbk1vZGlmaWVyW10ge1xuICAgIC8vICdNb2QnIGlzIE9ic2lkaWFuJ3MgcGxhdGZvcm0tYWdub3N0aWMgbW9kaWZpZXI6IENtZCAobWV0YSkgb24gbWFjT1MsIEN0cmwgZWxzZXdoZXJlLlxuICAgIC8vIFJlYWRpbmcgYFBsYXRmb3JtLmlzTWFjT1NgIG9mZiB0aGUgcmVzb2x2ZWQgb2JzaWRpYW4gbW9kdWxlIGlzIHNhZmUgaGVyZTpcbiAgICAvLyBgZXZhbFdyYXBwZXJgIGFsd2F5cyByZXNvbHZlcyB0aGF0IG1vZHVsZSBiZWZvcmUgYW55IGNhbGxiYWNrIGNhbiBydW4uXG4gICAgY29uc3QgaXNNYWNPUyA9IChucy5vYnNpZGlhbk1vZHVsZSBhcyBPYnNpZGlhbk1vZHVsZVdpdGhQbGF0Zm9ybSkuUGxhdGZvcm0uaXNNYWNPUztcblxuICAgIHJldHVybiBtb2RpZmllcnMubWFwKChtb2RpZmllcik6IEVsZWN0cm9uTW9kaWZpZXIgPT4ge1xuICAgICAgc3dpdGNoIChtb2RpZmllcikge1xuICAgICAgICBjYXNlICdBbHQnOiB7XG4gICAgICAgICAgcmV0dXJuICdhbHQnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0N0cmwnOiB7XG4gICAgICAgICAgcmV0dXJuICdjb250cm9sJztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdNZXRhJzoge1xuICAgICAgICAgIHJldHVybiAnbWV0YSc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTW9kJzoge1xuICAgICAgICAgIHJldHVybiBpc01hY09TID8gJ21ldGEnIDogJ2NvbnRyb2wnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NoaWZ0Jzoge1xuICAgICAgICAgIHJldHVybiAnc2hpZnQnO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAvLyBFeGhhdXN0aXZlbmVzcyBndWFyZDogYWRkaW5nIGEgYE1vZGlmaWVyYCBtZW1iZXIgd2l0aG91dCBhIGNhc2UgYWJvdmUgYmVjb21lcyBhIGNvbXBpbGUgZXJyb3IuXG4gICAgICAgICAgY29uc3QgdW5rbm93bk1vZGlmaWVyOiBuZXZlciA9IG1vZGlmaWVyO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtb2RpZmllcjogJHtTdHJpbmcodW5rbm93bk1vZGlmaWVyKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY2xpY2tNb3VzZShjbGlja1BhcmFtczogQ2xpY2tNb3VzZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IFNJTkdMRV9DTElDS19DT1VOVCA9IDE7XG5cbiAgICBjb25zdCB7IGJ1dHRvbiA9ICdsZWZ0JywgbW9kaWZpZXJzID0gW10sIHgsIHkgfSA9IGNsaWNrUGFyYW1zO1xuXG4gICAgY29uc3QgZWxlY3Ryb25Nb2RpZmllcnMgPSB0b0VsZWN0cm9uTW9kaWZpZXJzKG1vZGlmaWVycyk7XG4gICAgY29uc3Qgcm91bmRlZFggPSBNYXRoLnJvdW5kKHgpO1xuICAgIGNvbnN0IHJvdW5kZWRZID0gTWF0aC5yb3VuZCh5KTtcblxuICAgIGlmIChjaGVja0lzTW9iaWxlKCkpIHtcbiAgICAgIC8vIFRvdWNoIGhhcyBubyBidXR0b25zLiBBIGxlZnQgY2xpY2sgaXMgYSB0YXA7IGEgcmlnaHQgY2xpY2sgaXMgdGhlIGxvbmctcHJlc3MgdGhhdCBvcGVucyBPYnNpZGlhblxuICAgICAgLy8gTW9iaWxlJ3MgY29udGV4dCBtZW51LCBzbyBpdCBpcyBoaWRkZW4gYmVoaW5kIHRoZSBzYW1lIG5hbWUgcmF0aGVyIHRoYW4gYSBzZXBhcmF0ZSBoZWxwZXIuIEFcbiAgICAgIC8vIG1pZGRsZSBjbGljayBoYXMgbm8gZ2VzdHVyZSBhdCBhbGwsIGFuZCBpbnZlbnRpbmcgb25lIHdvdWxkIGJlIHdvcnNlIHRoYW4gc2F5aW5nIHNvLlxuICAgICAgaWYgKGJ1dHRvbiA9PT0gJ21pZGRsZScpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdgY2xpY2tNb3VzZSh7IGJ1dHRvbjogXFwnbWlkZGxlXFwnIH0pYCBoYXMgbm8gbWVhbmluZyBvbiBtb2JpbGU6IHRvdWNoIGlucHV0IGhhcyBubyBtaWRkbGUgYnV0dG9uLicpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCByZXF1ZXN0SG9zdElucHV0KHtcbiAgICAgICAga2luZDogYnV0dG9uID09PSAncmlnaHQnID8gJ2xvbmdQcmVzcycgOiAndGFwJyxcbiAgICAgICAgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycyxcbiAgICAgICAgeDogcm91bmRlZFgsXG4gICAgICAgIHk6IHJvdW5kZWRZXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJDb250ZW50cyA9IGdsb2JhbFRoaXMuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpO1xuXG4gICAgLy8gQSB0cnVzdGVkIGNsaWNrIGlzIG1vdXNlTW92ZSAtPiBtb3VzZURvd24gLT4gbW91c2VVcCBhdCBvbmUgcG9pbnQuXG4gICAgLy8gQ2hyb21pdW0gc3ludGhlc2l6ZXMgdGhlIGBjbGlja2AgKG9yIGBjb250ZXh0bWVudWApIERPTSBldmVudCBmcm9tIHRoYXQgc2VxdWVuY2UuXG4gICAgLy8gVGhlIGxlYWRpbmcgbW92ZSBpcyB3aGF0IHB1dHMgdGhlIHBvaW50ZXIgb3ZlciB0aGUgaGl0LXRlc3QgdGFyZ2V0IGJlZm9yZSB0aGUgYnV0dG9uIGdvZXMgZG93bi5cbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdtb3VzZU1vdmUnLCB4OiByb3VuZGVkWCwgeTogcm91bmRlZFkgfSk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoe1xuICAgICAgYnV0dG9uLFxuICAgICAgY2xpY2tDb3VudDogU0lOR0xFX0NMSUNLX0NPVU5ULFxuICAgICAgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycyxcbiAgICAgIHR5cGU6ICdtb3VzZURvd24nLFxuICAgICAgeDogcm91bmRlZFgsXG4gICAgICB5OiByb3VuZGVkWVxuICAgIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHtcbiAgICAgIGJ1dHRvbixcbiAgICAgIGNsaWNrQ291bnQ6IFNJTkdMRV9DTElDS19DT1VOVCxcbiAgICAgIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsXG4gICAgICB0eXBlOiAnbW91c2VVcCcsXG4gICAgICB4OiByb3VuZGVkWCxcbiAgICAgIHk6IHJvdW5kZWRZXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjbGlja0VsZW1lbnQoY2xpY2tQYXJhbXM6IENsaWNrRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcblxuICAgIGNvbnN0IHsgYnV0dG9uID0gJ2xlZnQnLCBlbGVtZW50LCBtb2RpZmllcnMgPSBbXSB9ID0gY2xpY2tQYXJhbXM7XG5cbiAgICAvLyBWaWV3cG9ydCBjb29yZHMgZXF1YWwgd2ViLWNvbnRlbnRzIERJUCBjb29yZHMgZm9yIHRoZSBmdWxsLXdpbmRvdyBgQnJvd3NlcldpbmRvd2AsIGFuZCBlcXVhbCBDRFAnc1xuICAgIC8vIHBhZ2UgY29vcmRpbmF0ZXMgaW4gdGhlIG1vYmlsZSBXZWJWaWV3IFx1MjAxNCBzbyBuZWl0aGVyIHBhdGggbmVlZHMgYSBkZXZpY2UtcGl4ZWwgY29udmVyc2lvbi5cbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBhd2FpdCBjbGlja01vdXNlKHtcbiAgICAgIGJ1dHRvbixcbiAgICAgIG1vZGlmaWVycyxcbiAgICAgIHg6IHJlY3QubGVmdCArIHJlY3Qud2lkdGggLyBDRU5URVJfRElWSVNPUixcbiAgICAgIHk6IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUlxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcHJlc3NLZXkocHJlc3NQYXJhbXM6IFByZXNzS2V5UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBrZXksIG1vZGlmaWVycyA9IFtdIH0gPSBwcmVzc1BhcmFtcztcblxuICAgIGNvbnN0IGVsZWN0cm9uTW9kaWZpZXJzID0gdG9FbGVjdHJvbk1vZGlmaWVycyhtb2RpZmllcnMpO1xuXG4gICAgaWYgKGNoZWNrSXNNb2JpbGUoKSkge1xuICAgICAgYXdhaXQgcmVxdWVzdEhvc3RJbnB1dCh7IGtleSwga2luZDogJ2tleScsIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSBnbG9iYWxUaGlzLmVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKTtcblxuICAgIC8vIEEgdHJ1c3RlZCBrZXkgcHJlc3MgaXMga2V5RG93biAtPiBjaGFyIC0+IGtleVVwOiBrZXlEb3duIGZpcmVzIGBrZXlkb3duYCwgY2hhciBmaXJlc1xuICAgIC8vIGBrZXlwcmVzc2AvYGJlZm9yZWlucHV0YC9gaW5wdXRgLCBrZXlVcCBmaXJlcyBga2V5dXBgIFx1MjAxNCB0aGUgZnVsbCByZWFsIGtleSBwaXBlbGluZS5cbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IGtleUNvZGU6IGtleSwgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycywgdHlwZTogJ2tleURvd24nIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsga2V5Q29kZToga2V5LCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAnY2hhcicgfSk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBrZXlDb2RlOiBrZXksIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdrZXlVcCcgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBob3ZlckVsZW1lbnQoaG92ZXJQYXJhbXM6IEhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcblxuICAgIGNvbnN0IHsgZWxlbWVudCB9ID0gaG92ZXJQYXJhbXM7XG5cbiAgICBpZiAoY2hlY2tJc01vYmlsZSgpKSB7XG4gICAgICB0aHJvd1Vuc3VwcG9ydGVkT25Nb2JpbGUoJ2hvdmVyRWxlbWVudCcpO1xuICAgIH1cblxuICAgIC8vIFZpZXdwb3J0IGNvb3JkcyBlcXVhbCB3ZWItY29udGVudHMgRElQIGNvb3JkcyBmb3IgdGhlIGZ1bGwtd2luZG93IGBCcm93c2VyV2luZG93YC5cbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBhd2FpdCBtb3ZlTW91c2UoeyB4OiByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gQ0VOVEVSX0RJVklTT1IsIHk6IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUiB9KTtcblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIHJlYWwgYDpob3ZlcmAgc3RhdGUgaGFzIGFjdHVhbGx5IHRha2VuLCBpbnN0ZWFkIG9mIGEgZml4ZWQgc2V0dGxlLlxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKCFlbGVtZW50Lm1hdGNoZXMoJzpob3ZlcicpICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cblxuICAgIGlmICghZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIHBvaW50ZXIgd2FzIG1vdmVkIHRvIHRoZSBjZW50ZXIgb2YgdGhlIGVsZW1lbnQsIGJ1dCBpdCBuZXZlciBtYXRjaGVkIFxcYDpob3ZlclxcYCB3aXRoaW4gJHtTdHJpbmcoSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLiBgXG4gICAgICAgICAgKyAnTW9zdCBvZnRlbiB0aGUgY2VudGVyIGJlbG9uZ3MgdG8gc29tZXRoaW5nIG9uIHRvcCBvZiB0aGUgZWxlbWVudCwgb3IgdGhlIGVsZW1lbnQgbW92ZWQgYWZ0ZXIgaXRzIGJveCB3YXMgcmVhZC4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVxdWlyZS1hd2FpdCAtLSBBc3luYyB0byBtYXRjaCBpdHMgbW9iaWxlLWNhcGFibGUgc2libGluZ3MgYW5kIHRvIGtlZXAgb25lIGBQcm9taXNlPHZvaWQ+YCBzaGFwZSBhY3Jvc3MgdGhlIHRydXN0ZWQtaW5wdXQgc2V0OyB0aGUgZGVza3RvcCBib2R5IGlzIGdlbnVpbmVseSBzeW5jaHJvbm91cy5cbiAgYXN5bmMgZnVuY3Rpb24gbW92ZU1vdXNlKG1vdmVQYXJhbXM6IE1vdmVNb3VzZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChjaGVja0lzTW9iaWxlKCkpIHtcbiAgICAgIHRocm93VW5zdXBwb3J0ZWRPbk1vYmlsZSgnbW92ZU1vdXNlJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSBnbG9iYWxUaGlzLmVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IHR5cGU6ICdtb3VzZU1vdmUnLCB4OiBNYXRoLnJvdW5kKG1vdmVQYXJhbXMueCksIHk6IE1hdGgucm91bmQobW92ZVBhcmFtcy55KSB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVuaG92ZXJFbGVtZW50KHVuaG92ZXJQYXJhbXM6IFVuaG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuICAgIGNvbnN0IE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMUyA9IDE7XG5cbiAgICBjb25zdCB7IGVsZW1lbnQgfSA9IHVuaG92ZXJQYXJhbXM7XG5cbiAgICBpZiAoY2hlY2tJc01vYmlsZSgpKSB7XG4gICAgICB0aHJvd1Vuc3VwcG9ydGVkT25Nb2JpbGUoJ3VuaG92ZXJFbGVtZW50Jyk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBNb3ZlIHRvIGEgcG9pbnQganVzdCBvdXRzaWRlIHRoZSBlbGVtZW50J3MgYm94LiBXaGVuIGZsdXNoIGFnYWluc3QgdGhlIHZpZXdwb3J0J3MgbGVmdCBlZGdlLCB1c2UganVzdFxuICAgICAqIHBhc3QgdGhlIHJpZ2h0IGVkZ2UuIEEgZnVsbC12aWV3cG9ydC13aWR0aCBlbGVtZW50IHNob3VsZCB1c2UgYG1vdmVNb3VzZWAgZGlyZWN0bHkgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIFRoZSBlZGdlIGlzIFNOQVBQRUQgYXdheSBmcm9tIHRoZSBib3ggYmVmb3JlIHRoZSBvZmZzZXQgaXMgYXBwbGllZCwgYW5kIHRoYXQgaXMgdGhlIHdob2xlIGNvcnJlY3RuZXNzXG4gICAgICogb2YgdGhpcyBmdW5jdGlvbi4gQSBsYXlvdXQgYm94IHJhcmVseSBsYW5kcyBvbiBhIHdob2xlIHBpeGVsLCBhbmQgYG1vdmVNb3VzZWAgcm91bmRzIFx1MjAxNCBzbyBzdWJ0cmFjdGluZ1xuICAgICAqIG9uZSBmcm9tIGEgZnJhY3Rpb25hbCBsZWZ0IGVkZ2Ugcm91bmRzIHN0cmFpZ2h0IGJhY2sgb250byB0aGUgZWxlbWVudCdzIG93biBwaXhlbCBjb2x1bW4gYW5kIHRoZVxuICAgICAqIHBvaW50ZXIgbmV2ZXIgbGVhdmVzLiBNZWFzdXJlZCBvbiBhIGJhciB3aG9zZSBgbGVmdGAgd2FzIDg1OS43OTY4NzU6IHRoZSBwbGFpbiBgbGVmdCAtIDFgIGJlY29tZXMgODU5XG4gICAgICogYW5kIGA6aG92ZXJgIG5ldmVyIGNsZWFycywgd2hpbGUgYE1hdGguZmxvb3IobGVmdCkgLSAxYCBiZWNvbWVzIDg1OCBhbmQgaXQgY2xlYXJzIGluIDI2IG1zLiBTbmFwcGluZ1xuICAgICAqIGZpcnN0IG1lYW5zIHRoZSBvZmZzZXQgaXMgYSB3aG9sZSBwaXhlbCBvZiByZWFsIGNsZWFyYW5jZSBpbnN0ZWFkIG9mIHdoYXRldmVyIHRoZSBmcmFjdGlvbiBsZWF2ZXMuXG4gICAgICovXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeCA9IHJlY3QubGVmdCA+PSBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFNcbiAgICAgID8gTWF0aC5mbG9vcihyZWN0LmxlZnQpIC0gT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTXG4gICAgICA6IE1hdGguY2VpbChyZWN0LnJpZ2h0KSArIE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMUztcbiAgICBjb25zdCB5ID0gcmVjdC50b3AgKyByZWN0LmhlaWdodCAvIENFTlRFUl9ESVZJU09SO1xuICAgIGF3YWl0IG1vdmVNb3VzZSh7IHgsIHkgfSk7XG5cbiAgICAvLyBQb2xsIHVudGlsIHRoZSByZWFsIGA6aG92ZXJgIHN0YXRlIGhhcyBhY3R1YWxseSBjbGVhcmVkLCBpbnN0ZWFkIG9mIGEgZml4ZWQgc2V0dGxlLlxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKGVsZW1lbnQubWF0Y2hlcygnOmhvdmVyJykgJiYgRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKSB7XG4gICAgICBhd2FpdCBzbGVlcChJTlBVVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnOmhvdmVyJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBwb2ludGVyIHdhcyBtb3ZlZCBvdXRzaWRlIHRoZSBlbGVtZW50J3MgYm94LCBidXQgaXQgc3RpbGwgbWF0Y2hlZCBcXGA6aG92ZXJcXGAgYWZ0ZXIgJHtTdHJpbmcoSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLiBgXG4gICAgICAgICAgKyAnQW4gZWxlbWVudCB0aGF0IHNwYW5zIHRoZSBmdWxsIHZpZXdwb3J0IGhhcyBubyBwb2ludCBvdXRzaWRlIGl0cyBib3ggdG8gbW92ZSB0byBcdTIwMTQgdXNlIGBtb3ZlTW91c2VgIHRvIGEga25vd24gZW1wdHkgY29vcmRpbmF0ZSBpbnN0ZWFkLidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTm90ZShub3RlUGFyYW1zOiBDcmVhdGVOb3RlUGFyYW1zKTogUHJvbWlzZTxURmlsZT4ge1xuICAgIGNvbnN0IHsgY29udGVudCwgcGF0aCB9ID0gbm90ZVBhcmFtcztcblxuICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBucy5hcHAudmF1bHQuY3JlYXRlKHBhdGgsIGNvbnRlbnQpO1xuXG4gICAgLy8gUmVhZCB0aGUgZmlsZSBiYWNrIHJhdGhlciB0aGFuIHRydXN0aW5nIGBmaWxlLnN0YXRgLiBgc3RhdGAgaXMgcHJlY2lzZWx5XG4gICAgLy8gdGhlIGZpZWxkIHRoYXQgbGllcyBoZXJlOiBvbiBhIGxvc3Qgd3JpdGUgaXQgcmVwb3J0cyB0aGUgZnVsbCBieXRlIGNvdW50XG4gICAgLy8gd2hpbGUgdGhlIGZpbGVzeXN0ZW0gaG9sZHMgemVybyBieXRlcy5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSBDUkVBVEVfTk9URV9SRVBBSVJfQVRURU1QVF9DT1VOVDsgYXR0ZW1wdCsrKSB7XG4gICAgICBjb25zdCBhY3R1YWxDb250ZW50ID0gYXdhaXQgbnMuYXBwLnZhdWx0LnJlYWQoZmlsZSk7XG4gICAgICBpZiAoYWN0dWFsQ29udGVudCA9PT0gY29udGVudCkge1xuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF0dGVtcHQgPT09IENSRUFURV9OT1RFX1JFUEFJUl9BVFRFTVBUX0NPVU5UKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgY3JlYXRlTm90ZSBjb3VsZCBub3Qgd3JpdGUgXCIke3BhdGh9XCI6IGV4cGVjdGVkICR7U3RyaW5nKGNvbnRlbnQubGVuZ3RoKX0gY2hhcmFjdGVycywgYFxuICAgICAgICAgICAgKyBgdGhlIHZhdWx0IGhvbGRzICR7U3RyaW5nKGFjdHVhbENvbnRlbnQubGVuZ3RoKX0gYWZ0ZXIgJHtTdHJpbmcoQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQpfSByZXBhaXIgYXR0ZW1wdHMuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBBIHJld3JpdGUgb2YgdGhlIHNhbWUgY29udGVudCBsYW5kcyBjb3JyZWN0bHkgXHUyMDE0IG1lYXN1cmVkLiBUaGlzIGlzIHRoZVxuICAgICAgLy8gd2hvbGUgd29ya2Fyb3VuZC5cbiAgICAgIGF3YWl0IG5zLmFwcC52YXVsdC5tb2RpZnkoZmlsZSwgY29udGVudCk7XG4gICAgfVxuXG4gICAgLy8gVW5yZWFjaGFibGU6IHRoZSBsb29wIGVpdGhlciByZXR1cm5zIG9yIHRocm93cyBvbiBpdHMgbGFzdCBpdGVyYXRpb24uXG4gICAgdGhyb3cgbmV3IEVycm9yKGBjcmVhdGVOb3RlIGNvdWxkIG5vdCB3cml0ZSBcIiR7cGF0aH1cIi5gKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIG9wZW5TZXR0aW5nc1RhYihvcGVuUGFyYW1zOiBPcGVuU2V0dGluZ3NUYWJQYXJhbXMpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgeyB0YWJJZCwgdGltZW91dEluTWlsbGlzZWNvbmRzID0gU0VUVElOR1NfVEFCX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0gPSBvcGVuUGFyYW1zO1xuXG4gICAgY29uc3Qgc2V0dGluZyA9IG5zLmFwcC5zZXR0aW5nO1xuXG4gICAgLypcbiAgICAgKiBBIEZBTExCQUNLIGZvciBhIHZhdWx0IHRoYXQgZG9lcyBub3QgY2FycnkgdGhlIGhhcm5lc3MncyBgc2V0dGluZ3NQb3BvdXRXaW5kb3c6IGZhbHNlYCBkZWZhdWx0IFx1MjAxNFxuICAgICAqIEFuZCBpdCBNVVNUIGhhcHBlbiBiZWZvcmUgYG9wZW4oKWAuXG4gICAgICpcbiAgICAgKiBXaXRoIHRoZSBkZWZhdWx0IGluIHBsYWNlIGBvcGVuKClgIGF0dGFjaGVzIGBjb250YWluZXJFbGAgdG8gdGhpcyBkb2N1bWVudCBpdHNlbGYsIGFuZCB0aGlzIGJyYW5jaFxuICAgICAqIE5ldmVyIGZpcmVzIChtZWFzdXJlZCwgYG93bmVkLWluc3RhbmNlLXdvcmtlci1hdHRhY2guaW50ZWdyYXRpb24udGVzdC50c2ApLiBXaXRob3V0IGl0IE9ic2lkaWFuXG4gICAgICogU2hpcHMgdGhlIGtleSBgdHJ1ZWAsIGBzaG91bGRVc2VQb3BvdXQoKWAgcmV0dXJucyBpdCwgYW5kIGBvcGVuKClgIHB1dHMgdGhlIG1vZGFsIGluIGEgU0VDT05EXG4gICAgICogRWxlY3Ryb24gd2luZG93IGluc3RlYWQgXHUyMDE0IGxlYXZpbmcgdGhpcyBkb2N1bWVudCB3aXRoIG5vdGhpbmcgd2hpbGUgcmV0dXJuaW5nIHdpdGhvdXQgdGhyb3dpbmcuXG4gICAgICogUHJlLWF0dGFjaGluZyBrZWVwcyBgY29udGFpbmVyRWxgIHJlYWNoYWJsZSBoZXJlLCB3aGljaCBpcyBlbm91Z2ggZm9yIGEgY2FsbGVyIHRoYXQgcmVhZHMgcm93cyBvZmZcbiAgICAgKiBUaGUgdGFiOyBpdCBpcyBOT1QgZW5vdWdoIGZvciBhIHNjcmVlbnNob3QsIHdob3NlIGZyYW1lIGlzIG9mIHRoaXMgd2luZG93LiBPbmx5IHRoZSB2YXVsdC1sZXZlbFxuICAgICAqIERlZmF1bHQgZml4ZXMgdGhhdCwgc28gdGhpcyBpcyBhIGZsb29yIHJhdGhlciB0aGFuIHRoZSBmaXguXG4gICAgICpcbiAgICAgKiBBdHRhY2hpbmcgQUZURVJXQVJEUyBpcyB1c2VsZXNzIGVpdGhlciB3YXk6IHdoYXRldmVyIHRoZSBtb2RhbCByZW5kZXJlZCBvbiBvcGVuIGhhcyBhbHJlYWR5IGdvbmVcbiAgICAgKiBXaGVyZSBpdCB3ZW50LlxuICAgICAqL1xuICAgIGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyhzZXR0aW5nLmNvbnRhaW5lckVsKSkge1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoc2V0dGluZy5jb250YWluZXJFbCk7XG4gICAgfVxuXG4gICAgLy8gQm90aCBsaXN0cyBhcmUgcG9wdWxhdGVkIGJlZm9yZSBgb3BlbigpYCwgc28gYW4gdW5rbm93biBpZCBjYW4gYmUgcmVqZWN0ZWQgdXAgZnJvbnQgXHUyMDE0IHdpdGggdGhlXG4gICAgLy8gaWRzIHRoYXQgRE8gZXhpc3QgXHUyMDE0IGluc3RlYWQgb2Ygc3BlbmRpbmcgdGhlIHdob2xlIHRpbWVvdXQgbG9va2luZyBleGFjdGx5IGxpa2UgdGhlIG1vZGFsLWRvZXMtXG4gICAgLy8gbm90LXJlbmRlciBzeW1wdG9tIHRoaXMgaGVscGVyIGV4aXN0cyB0byBydWxlIG91dC4gUGx1Z2luIHRhYnMgbGl2ZSBpbiBgcGx1Z2luVGFic2AsIG5vdFxuICAgIC8vIGBzZXR0aW5nVGFic2AsIHNvIGJvdGggYXJlIHNlYXJjaGVkLlxuICAgIGNvbnN0IGtub3duVGFicyA9IFsuLi5zZXR0aW5nLnNldHRpbmdUYWJzLCAuLi5zZXR0aW5nLnBsdWdpblRhYnNdO1xuICAgIGlmIChrbm93blRhYnMuZXZlcnkoKHRhYikgPT4gdGFiLmlkICE9PSB0YWJJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYG9wZW5TZXR0aW5nc1RhYjogbm8gc2V0dGluZ3MgdGFiIHdpdGggaWQgXCIke3RhYklkfVwiLiBBdmFpbGFibGUgaWRzOiAke2tub3duVGFicy5tYXAoKHRhYikgPT4gdGFiLmlkKS5qb2luKCcsICcpfS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIHNldHRpbmcub3BlbigpO1xuICAgIHNldHRpbmcub3BlblRhYkJ5SWQodGFiSWQpO1xuXG4gICAgLy8gUG9sbCB0aGUgbW9kYWwncyBvd24gc3RhdGUgcmF0aGVyIHRoYW4gc2xlZXBpbmc6IGEgZml4ZWQgZGVsYXkgaXMgZWl0aGVyIHRvbyBzaG9ydCBvbiBhIGxvYWRlZFxuICAgIC8vIG1hY2hpbmUgb3Igd2FzdGVkIHRpbWUuIEEgcmVuZGVyZWQgdGFiIGlzIHRoZSByZXF1ZXN0ZWQgb25lIEFORCBoYXMgY29udGVudC5cbiAgICBhd2FpdCB3YWl0VW50aWwoe1xuICAgICAgbWVzc2FnZTogYHRoZSBcIiR7dGFiSWR9XCIgc2V0dGluZ3MgdGFiIHRvIHJlbmRlcmAsXG4gICAgICBwcmVkaWNhdGU6ICgpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudFRhYiA9IHNldHRpbmcuYWN0aXZlVGFiO1xuICAgICAgICBpZiAoIWN1cnJlbnRUYWIpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRUYWIuaWQgPT09IHRhYklkICYmIGN1cnJlbnRUYWIuY29udGFpbmVyRWwuY2hpbGRFbGVtZW50Q291bnQgPiAwO1xuICAgICAgfSxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgIH0pO1xuXG4gICAgY29uc3QgYWN0aXZlVGFiID0gc2V0dGluZy5hY3RpdmVUYWI7XG4gICAgaWYgKCFhY3RpdmVUYWIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignb3BlblNldHRpbmdzVGFiOiB0aGUgc2V0dGluZ3MgbW9kYWwgcmVwb3J0ZWQgbm8gYWN0aXZlIHRhYiBhZnRlciBpdCByZW5kZXJlZC4nKTtcbiAgICB9XG5cbiAgICAvLyBOb3QgZXZlcnkgdGFiIHJlbmRlcnMgYC5zZXR0aW5nLWl0ZW0tbmFtZWAgcm93cyAoSG90a2V5cyBkb2VzIG5vdCksIHNvIGFuIGVtcHR5IGFycmF5IGlzIGEgdmFsaWRcbiAgICAvLyBhbnN3ZXIgaGVyZSBcdTIwMTQgdGhlIHJlbmRlciBpdHNlbGYgd2FzIGFscmVhZHkgcHJvdmVuIGJ5IHRoZSBwb2xsIGFib3ZlLlxuICAgIHJldHVybiBbLi4uYWN0aXZlVGFiLmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZXR0aW5nLWl0ZW0tbmFtZScpXS5tYXAoKG5hbWVFbCkgPT4gbmFtZUVsLnRleHRDb250ZW50KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHdhaXRVbnRpbCh3YWl0UGFyYW1zOiBXYWl0VW50aWxQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7XG4gICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzID0gV0FJVF9VTlRJTF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBwcmVkaWNhdGUsXG4gICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHMgPSBXQUlUX1VOVElMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gICAgfSA9IHdhaXRQYXJhbXM7XG5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlICghKGF3YWl0IHByZWRpY2F0ZSgpKSkge1xuICAgICAgaWYgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPj0gdGltZW91dEluTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IG1lc3NhZ2UgPT09IHVuZGVmaW5lZCA/ICcnIDogYDogJHttZXNzYWdlfWA7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgd2FpdFVudGlsIHRpbWVkIG91dCBhZnRlciAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfSBtaWxsaXNlY29uZHMke3N1ZmZpeH1gKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHNsZWVwKGludGVydmFsSW5NaWxsaXNlY29uZHMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVycm9yVG9TdHJpbmdJbXBsKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgcmV0dXJuIFN0cmluZyhlcnJvcik7XG4gICAgfVxuXG4gICAgbGV0IG1lc3NhZ2UgPSBlcnJvci5zdGFjayA/PyBgJHtlcnJvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgaWYgKGVycm9yLmNhdXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1lc3NhZ2UgPSBhcHBlbmROZXN0ZWRFcnJvcihtZXNzYWdlLCBlcnJvci5jYXVzZSwgJ0NhdXNlZCBieTonKTtcbiAgICB9XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQWdncmVnYXRlRXJyb3IpIHtcbiAgICAgIGNvbnN0IGFnZ3JlZ2F0ZWRFcnJvcnM6IHJlYWRvbmx5IHVua25vd25bXSA9IGVycm9yLmVycm9ycztcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBhZ2dyZWdhdGVkRXJyb3JdIG9mIGFnZ3JlZ2F0ZWRFcnJvcnMuZW50cmllcygpKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBhcHBlbmROZXN0ZWRFcnJvcihtZXNzYWdlLCBhZ2dyZWdhdGVkRXJyb3IsIGBBZ2dyZWdhdGVkIGVycm9yICMke1N0cmluZyhpbmRleCArIDEpfTpgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBlbmROZXN0ZWRFcnJvcihtZXNzYWdlOiBzdHJpbmcsIG5lc3RlZEVycm9yOiB1bmtub3duLCB0aXRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0ID0gYCR7bWVzc2FnZX1cXG4ke2dlbmVyYXRlU3RhY2tUcmFjZUxpbmUodGl0bGUpfWA7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGVycm9yVG9TdHJpbmdJbXBsKG5lc3RlZEVycm9yKS5zcGxpdCgnXFxuJykpIHtcbiAgICAgIGlmICghbGluZS50cmltKCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gbGluZS5zdGFydHNXaXRoKFNUQUNLX1RSQUNFX1BSRUZJWClcbiAgICAgICAgPyBgXFxuJHtsaW5lfWBcbiAgICAgICAgOiBgXFxuJHtnZW5lcmF0ZVN0YWNrVHJhY2VMaW5lKGxpbmUpfWA7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBnZW5lcmF0ZVN0YWNrVHJhY2VMaW5lKHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtTVEFDS19UUkFDRV9QUkVGSVh9IC0tLSAke3RpdGxlfSAtLS0gKDApYDtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBaUNBLFNBQVMsNEJBQTRCO0FBQ3JDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFrQ1AsZUFBc0IsNEJBQTRCLFdBQThCLEtBQWEsdUJBQStDO0FBQzFJLFFBQU0sY0FBb0M7QUFBQSxJQUN4QztBQUFBLElBQ0EsR0FBSSwwQkFBMEIsVUFBYSxFQUFFLHNCQUFzQjtBQUFBLEVBQ3JFO0FBQ0EsUUFBTSxtQkFBbUIsb0JBQW9CO0FBQzdDLFFBQU0sY0FBYyxLQUFLLFVBQVUsZ0JBQWdCO0FBQ25ELFFBQU0sbUJBQW1CLE1BQU0sVUFBVTtBQUFBLElBQ3ZDLG1FQUFtRSxXQUFXO0FBQUEsSUFDOUU7QUFBQSxFQUNGO0FBRUEsTUFBSSxxQkFBcUIsUUFBUTtBQUMvQjtB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
|
|
@@ -46,7 +46,7 @@ export interface OwnedObsidianInstance {
|
|
|
46
46
|
/**
|
|
47
47
|
Kills the instance and its entire process tree.
|
|
48
48
|
*/
|
|
49
|
-
kill()
|
|
49
|
+
kill: () => void;
|
|
50
50
|
/**
|
|
51
51
|
* Loopback port the instance's renderer connects back to so it destroys
|
|
52
52
|
* itself if this harness process dies without cleaning up. See
|
|
@@ -64,11 +64,11 @@ export interface OwnedObsidianInstance {
|
|
|
64
64
|
* another process reads the same facts from the exit marker
|
|
65
65
|
* (`owned-instance-exit-marker.ts`).
|
|
66
66
|
*/
|
|
67
|
-
readExitInfo()
|
|
67
|
+
readExitInfo: () => ProcessExitInfo | undefined;
|
|
68
68
|
/**
|
|
69
69
|
Returns the tail of everything the instance wrote to stdout/stderr.
|
|
70
70
|
*/
|
|
71
|
-
readOutput()
|
|
71
|
+
readOutput: () => string;
|
|
72
72
|
}
|
|
73
73
|
/**
|
|
74
74
|
* Launches an isolated, harness-owned Obsidian instance and waits until its CDP
|
|
@@ -127,4 +127,4 @@ export {
|
|
|
127
127
|
launchOwnedObsidianInstance,
|
|
128
128
|
pickFreePort
|
|
129
129
|
};
|
|
130
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLWluc3RhbmNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogTGF1bmNoZXMgYW5kIG1hbmFnZXMgYSBoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBPYnNpZGlhbiBkZXNrdG9wIGluc3RhbmNlLlxuICpcbiAqIFRoZSBpbnN0YW5jZSBydW5zIGFnYWluc3QgYSBkZWRpY2F0ZWQgYC0tdXNlci1kYXRhLWRpcmAgKHNvIGl0IG5ldmVyIHRvdWNoZXNcbiAqIHRoZSB1c2VyJ3MgT2JzaWRpYW4gY29uZmlnLCByZWdpc3RyeSwgb3IgcnVubmluZyB3aW5kb3cpIGFuZCBleHBvc2VzIENEUCBvbiBhXG4gKiBkZWRpY2F0ZWQgYC0tcmVtb3RlLWRlYnVnZ2luZy1wb3J0YC4gQmVjYXVzZSBFbGVjdHJvbidzIHNpbmdsZS1pbnN0YW5jZSBsb2NrXG4gKiBpcyBrZXllZCB0byB0aGUgdXNlci1kYXRhIGRpciwgdGhlIG93bmVkIGluc3RhbmNlIHJ1bnMgaW4gcGFyYWxsZWwgd2l0aCB0aGVcbiAqIHVzZXIncyBvd24gT2JzaWRpYW4uIENvbmZpcm1lZCBieSB0aGUgUGhhc2UgMCBzcGlrZSAoc2VlIHRoZSBwcm9qZWN0IHBsYW4pLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHByb2Nlc3MgbWFuYWdlbWVudCBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSAnbm9kZTpuZXQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NFeGl0SW5mbyB9IGZyb20gJy4vcHJvY2Vzcy1leGl0LW1lc3NhZ2UubWpzJztcblxuaW1wb3J0IHsga2lsbFByb2Nlc3NUcmVlIH0gZnJvbSAnLi9raWxsLXByb2Nlc3MtdHJlZS5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7XG4gIGNsZWFyT3duZWRJbnN0YW5jZUV4aXRNYXJrZXIsXG4gIHdyaXRlT3duZWRJbnN0YW5jZUV4aXRNYXJrZXJcbn0gZnJvbSAnLi9vd25lZC1pbnN0YW5jZS1leGl0LW1hcmtlci5tanMnO1xuaW1wb3J0IHsgT3duZWRJbnN0YW5jZUV4aXRlZEVycm9yIH0gZnJvbSAnLi9vd25lZC1pbnN0YW5jZS1leGl0ZWQtZXJyb3IubWpzJztcbmltcG9ydCB7IHN0YXJ0UGFyZW50TGl2ZW5lc3NTZXJ2ZXIgfSBmcm9tICcuL3BhcmVudC1saXZlbmVzcy5tanMnO1xuaW1wb3J0IHsgYXR0YWNoUHJvY2Vzc0NhcHR1cmUgfSBmcm9tICcuL3Byb2Nlc3MtY2FwdHVyZS5tanMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBsYXVuY2hPd25lZE9ic2lkaWFuSW5zdGFuY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExhdW5jaE93bmVkT2JzaWRpYW5JbnN0YW5jZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBDRFAgaG9zdCB0byBiaW5kL3BvbGwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnMTI3LjAuMC4xJ2BcbiAgICovXG4gIHJlYWRvbmx5IGNkcEhvc3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIE9ic2lkaWFuIGV4ZWN1dGFibGUgKHNoZWxsKSB0byBsYXVuY2guXG4gICAqL1xuICByZWFkb25seSBleGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEV4dHJhIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgYXBwZW5kZWQgYWZ0ZXIgYC0tdXNlci1kYXRhLWRpcmAgYW5kXG4gICAqIGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydGAgXHUyMDE0IHVzZWQgdG8gcGFzcyB0aGUga2VlcC1hbGl2ZSBDaHJvbWl1bSBmbGFncyB3aGVuXG4gICAqIHRoZSBpbnN0YW5jZSBpcyBsYXVuY2hlZCBoaWRkZW4gKG9mZi1zY3JlZW4pLiBFbXB0eSBieSBkZWZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFBcmd1bWVudHM/OiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgQWJzb2x1dGUgcGF0aCB0byB0aGUgaXNvbGF0ZWQgdXNlci1kYXRhIGRpciB0byBwYXNzIHZpYSBgLS11c2VyLWRhdGEtZGlyYC5cbiAgICovXG5cbiAgcmVhZG9ubHkgdXNlckRhdGFEaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHJ1bm5pbmcsIGhhcm5lc3Mtb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZWRPYnNpZGlhbkluc3RhbmNlIHtcbiAgLyoqXG4gIEJhc2UgQ0RQIFVSTCwgZS5nLiBgaHR0cDovLzEyNy4wLjAuMTo1MTg4OGAuXG4gICAqL1xuICByZWFkb25seSBjZHBVcmw6IHN0cmluZztcblxuICAvKipcbiAgS2lsbHMgdGhlIGluc3RhbmNlIGFuZCBpdHMgZW50aXJlIHByb2Nlc3MgdHJlZS5cbiAgICovXG4gIGtpbGwoKTogdm9pZDtcblxuICAvKipcbiAgICogTG9vcGJhY2sgcG9ydCB0aGUgaW5zdGFuY2UncyByZW5kZXJlciBjb25uZWN0cyBiYWNrIHRvIHNvIGl0IGRlc3Ryb3lzXG4gICAqIGl0c2VsZiBpZiB0aGlzIGhhcm5lc3MgcHJvY2VzcyBkaWVzIHdpdGhvdXQgY2xlYW5pbmcgdXAuIFNlZVxuICAgKiBgcGFyZW50LWxpdmVuZXNzLnRzYCBmb3Igd2h5IHRoZSBwYXJlbnQvY2hpbGQgcmVsYXRpb25zaGlwIGFsb25lIGlzIG5vdFxuICAgKiBlbm91Z2guXG4gICAqL1xuICByZWFkb25seSBwYXJlbnRMaXZlbmVzc1BvcnQ6IG51bWJlcjtcblxuICAvKipcbiAgVGhlIENEUCByZW1vdGUtZGVidWdnaW5nIHBvcnQgdGhlIGluc3RhbmNlIHdhcyBsYXVuY2hlZCB3aXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGhvdyB0aGUgaW5zdGFuY2UgZGllZCBvbmNlIGl0IGlzIG5vIGxvbmdlciBydW5uaW5nLCBvdGhlcndpc2VcbiAgICogYHVuZGVmaW5lZGAuIFRoaXMgaXMgdGhlIGluLXByb2Nlc3MgaGFsZiBvZiB0aGUgYW5zd2VyOyBhIHRlc3Qgd29ya2VyIGluXG4gICAqIGFub3RoZXIgcHJvY2VzcyByZWFkcyB0aGUgc2FtZSBmYWN0cyBmcm9tIHRoZSBleGl0IG1hcmtlclxuICAgKiAoYG93bmVkLWluc3RhbmNlLWV4aXQtbWFya2VyLnRzYCkuXG4gICAqL1xuICByZWFkRXhpdEluZm8oKTogUHJvY2Vzc0V4aXRJbmZvIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBSZXR1cm5zIHRoZSB0YWlsIG9mIGV2ZXJ5dGhpbmcgdGhlIGluc3RhbmNlIHdyb3RlIHRvIHN0ZG91dC9zdGRlcnIuXG4gICAqL1xuICByZWFkT3V0cHV0KCk6IHN0cmluZztcbn1cblxuY29uc3QgREVGQVVMVF9DRFBfSE9TVCA9ICcxMjcuMC4wLjEnO1xuY29uc3QgQ0RQX1JFQURZX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMTAwMDtcbmNvbnN0IENEUF9SRUFEWV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwXzAwMDtcbmNvbnN0IE9CU0lESUFOX09VVFBVVF9UQUlMX01BWF9MRU5HVEggPSA4MDAwO1xuXG5pbnRlcmZhY2UgQ2RwVGFyZ2V0IHtcbiAgdHlwZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIExhdW5jaGVzIGFuIGlzb2xhdGVkLCBoYXJuZXNzLW93bmVkIE9ic2lkaWFuIGluc3RhbmNlIGFuZCB3YWl0cyB1bnRpbCBpdHMgQ0RQXG4gKiBlbmRwb2ludCBpcyBzZXJ2aW5nIHBhZ2UgdGFyZ2V0cy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gTGF1bmNoIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgcnVubmluZyBvd25lZCBpbnN0YW5jZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgQ0RQIGRvZXMgbm90IGJlY29tZSByZWFjaGFibGUgd2l0aGluIHRoZSB0aW1lb3V0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGF1bmNoT3duZWRPYnNpZGlhbkluc3RhbmNlKFxuICBwYXJhbXM6IExhdW5jaE93bmVkT2JzaWRpYW5JbnN0YW5jZVBhcmFtc1xuKTogUHJvbWlzZTxPd25lZE9ic2lkaWFuSW5zdGFuY2U+IHtcbiAgY29uc3QgY2RwSG9zdCA9IHBhcmFtcy5jZHBIb3N0ID8/IERFRkFVTFRfQ0RQX0hPU1Q7XG4gIGNvbnN0IHBvcnQgPSBhd2FpdCBwaWNrRnJlZVBvcnQoKTtcbiAgY29uc3QgY2RwVXJsID0gYGh0dHA6Ly8ke2NkcEhvc3R9OiR7U3RyaW5nKHBvcnQpfWA7XG5cbiAgLy8gTGlzdGVuIEJFRk9SRSBzcGF3bmluZywgc28gdGhlIHJlbmRlcmVyIHdhdGNoZG9nIGNhbiBuZXZlciByYWNlIHRoZSBzZXJ2ZXJcbiAgLy8gaW50byBhIGZhaWxlZCBjb25uZWN0ICh3aGljaCBpdCB0cmVhdHMgYXMgXCJubyB3YXRjaGRvZ1wiLCBsZWF2aW5nIHRoZSBpbnN0YW5jZSBhbGl2ZSkuXG4gIGNvbnN0IGxpdmVuZXNzU2VydmVyID0gYXdhaXQgc3RhcnRQYXJlbnRMaXZlbmVzc1NlcnZlcigpO1xuXG4gIC8vIFBvcnRzIGFyZSByZWN5Y2xlZCBieSB0aGUgT1MsIHNvIGFuIG9sZGVyIGluc3RhbmNlJ3MgZGVhdGggcmVjb3JkZWQgb24gdGhpc1xuICAvLyBwb3J0IHdvdWxkIG90aGVyd2lzZSBiZSByZWFkIGFzIHRoaXMgb25lJ3MuXG4gIGNsZWFyT3duZWRJbnN0YW5jZUV4aXRNYXJrZXIocG9ydCk7XG5cbiAgbG9nKGBbb2JzaWRpYW4taW5zdGFuY2VdIExhdW5jaGluZyBvd25lZCBPYnNpZGlhbjogdXNlckRhdGE9JHtwYXJhbXMudXNlckRhdGFEaXJlY3Rvcnl9LCBjZHBQb3J0PSR7U3RyaW5nKHBvcnQpfWApO1xuICAvKlxuICAgKiBQaXBlZCByYXRoZXIgdGhhbiBgJ2lnbm9yZSdgOiBhbiBFbGVjdHJvbi9DaHJvbWl1bSBmYXRhbCBpcyB3cml0dGVuIHRvXG4gICAqIHN0ZGVyciBhbmQgbm93aGVyZSBlbHNlLCBhbmQgZGlzY2FyZGluZyBpdCBpcyB3aHkgYSBkeWluZyBpbnN0YW5jZSB1c2VkIHRvXG4gICAqIGJlIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYSBoZWFsdGh5IG9uZS4gVGhlIGNhcHR1cmUgZHJhaW5zIGJvdGggcGlwZXMgZm9yXG4gICAqIHRoZSBwcm9jZXNzJ3Mgd2hvbGUgbGlmZSAoYSBmdWxsIHBpcGUgYnVmZmVyIHdvdWxkIGJsb2NrIHRoZSBhcHAgaXRzZWxmKSBhbmRcbiAgICoga2VlcHMgb25seSBhIGJvdW5kZWQgdGFpbC5cbiAgICovXG4gIGNvbnN0IGNoaWxkID0gc3Bhd24oXG4gICAgcGFyYW1zLmV4ZVBhdGgsXG4gICAgW2AtLXVzZXItZGF0YS1kaXI9JHtwYXJhbXMudXNlckRhdGFEaXJlY3Rvcnl9YCwgYC0tcmVtb3RlLWRlYnVnZ2luZy1wb3J0PSR7U3RyaW5nKHBvcnQpfWAsIC4uLihwYXJhbXMuZXh0cmFBcmd1bWVudHMgPz8gW10pXSxcbiAgICB7IGRldGFjaGVkOiB0cnVlLCBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10gfVxuICApO1xuICBjb25zdCBjYXB0dXJlID0gYXR0YWNoUHJvY2Vzc0NhcHR1cmUoY2hpbGQsIHtcbiAgICBtYXhPdXRwdXRMZW5ndGhJbkNoYXJhY3RlcnM6IE9CU0lESUFOX09VVFBVVF9UQUlMX01BWF9MRU5HVEgsXG4gICAgb25DaHVuazogKGNodW5rKSA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gY2h1bmsudGV4dC50cmltRW5kKCk7XG4gICAgICBpZiAodGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxvZyhgW29ic2lkaWFuLWluc3RhbmNlOiR7Y2h1bmsuc3RyZWFtfV0gJHt0ZXh0fWApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gU2V0IGJ5IGBraWxsKClgLCBzbyBhIGRlYXRoIHRoZSBoYXJuZXNzIG9yZGVyZWQgaXMgbmV2ZXIgcmVwb3J0ZWQgYXMgb25lIGl0XG4gIC8vIHN1ZmZlcmVkIFx1MjAxNCBhIG1hcmtlciBsZWZ0IGJ5IGEgY2xlYW4gdGVhcmRvd24gd291bGQgY29udmljdCB0aGUgbmV4dCBydW4nc1xuICAvLyBoZWFsdGh5IGluc3RhbmNlIG9mIGFuIGV4aXQgdGhhdCBuZXZlciBoYXBwZW5lZC5cbiAgbGV0IGlzS2lsbEV4cGVjdGVkID0gZmFsc2U7XG5cbiAgY2hpbGQub25jZSgnZXhpdCcsIChjb2RlOiBudWxsIHwgbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4ge1xuICAgIGlmIChpc0tpbGxFeHBlY3RlZCkge1xuICAgICAgbG9nKGBbb2JzaWRpYW4taW5zdGFuY2VdIE93bmVkIE9ic2lkaWFuIGV4aXRlZCBhcyBhc2tlZDogcGlkPSR7U3RyaW5nKGNoaWxkLnBpZCl9IGNvZGU9JHtTdHJpbmcoY29kZSl9IHNpZ25hbD0ke1N0cmluZyhzaWduYWwpfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIExvdWQgb24gcHVycG9zZS4gVGhpcyBvbmUgbGluZSBpcyB3aGF0IHNlcGFyYXRlcyBhIGNsZWFuIHF1aXQgZnJvbSBhXG4gICAgLy8gY3Jhc2gsIGFuZCBpdHMgYWJzZW5jZSBvbmNlIGNvc3QgYSBkYXkgb2YgZ3Vlc3NpbmcuXG4gICAgbG9nKGBbb2JzaWRpYW4taW5zdGFuY2VdICEhISBPV05FRCBPQlNJRElBTiBFWElURUQ6IHBpZD0ke1N0cmluZyhjaGlsZC5waWQpfSBjb2RlPSR7U3RyaW5nKGNvZGUpfSBzaWduYWw9JHtTdHJpbmcoc2lnbmFsKX1gKTtcbiAgICB3cml0ZU93bmVkSW5zdGFuY2VFeGl0TWFya2VyKHtcbiAgICAgIGNvZGUsXG4gICAgICBvdXRwdXRUYWlsOiBjYXB0dXJlLnJlYWRPdXRwdXQoKSxcbiAgICAgIHBpZDogY2hpbGQucGlkLFxuICAgICAgcG9ydCxcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICB9KTtcblxuICBjaGlsZC51bnJlZigpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgd2FpdEZvckNkcFJlYWR5KGNkcFVybCk7XG4gICAgbG9nKGBbb2JzaWRpYW4taW5zdGFuY2VdIE93bmVkIE9ic2lkaWFuIGlzIHNlcnZpbmcgQ0RQIGF0ICR7Y2RwVXJsfS5gKTtcbiAgICByZXR1cm4ge1xuICAgICAgY2RwVXJsLFxuICAgICAga2lsbCxcbiAgICAgIHBhcmVudExpdmVuZXNzUG9ydDogbGl2ZW5lc3NTZXJ2ZXIucG9ydCxcbiAgICAgIHBvcnQsXG4gICAgICByZWFkRXhpdEluZm86ICgpID0+IGNhcHR1cmUucmVhZEV4aXRJbmZvKCksXG4gICAgICByZWFkT3V0cHV0OiAoKSA9PiBjYXB0dXJlLnJlYWRPdXRwdXQoKVxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgLypcbiAgICAgKiBSZWFkIGJlZm9yZSBraWxsaW5nLCBzbyB0aGUgdmVyZGljdCBpcyB0aGUgaW5zdGFuY2UncyBvd24uIEEgQ0RQIHRpbWVvdXRcbiAgICAgKiB3aG9zZSBwcm9jZXNzIGlzIGFscmVhZHkgZ29uZSBpcyBub3QgYSBzbG93IGJvb3QgXHUyMDE0IGl0IGlzIGEgYm9vdCB0aGF0XG4gICAgICogZW5kZWQgXHUyMDE0IGFuZCBzYXlpbmcgc28gYmVhdHMgcmVwb3J0aW5nIG9ubHkgdGhlIGJ1ZGdldCBpdCBibGV3LlxuICAgICAqXG4gICAgICogRGVsaWJlcmF0ZWx5IE5PVCBhIGZhc3QtZmFpbCBpbnNpZGUgdGhlIHBvbGw6IG9uIHNvbWUgaW5zdGFsbHMgdGhlXG4gICAgICogbGF1bmNoZWQgZXhlY3V0YWJsZSBpcyBhIHNoaW0gdGhhdCBleGl0cyBvbmNlIGl0IGhhcyBoYW5kZWQgb2ZmIHRvIHRoZVxuICAgICAqIHJlYWwgYXBwLCBzbyBhIGRlYWQgY2hpbGQgbWlkLXBvbGwgZG9lcyBub3QgaW1wbHkgYSBkZWFkIGluc3RhbmNlLiBPbmx5IGFcbiAgICAgKiBkZWFkIGNoaWxkIHRoYXQgYWxzbyBuZXZlciBzZXJ2ZWQgQ0RQIGRvZXMuXG4gICAgICovXG4gICAgY29uc3QgZXhpdEluZm8gPSBjYXB0dXJlLnJlYWRFeGl0SW5mbygpO1xuICAgIGtpbGwoKTtcbiAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgIHRocm93IG5ldyBPd25lZEluc3RhbmNlRXhpdGVkRXJyb3Ioe1xuICAgICAgICBjZHBVcmwsXG4gICAgICAgIGNvZGU6IGV4aXRJbmZvLmNvZGUsXG4gICAgICAgIG91dHB1dFRhaWw6IGNhcHR1cmUucmVhZE91dHB1dCgpLFxuICAgICAgICBwaWQ6IGNoaWxkLnBpZCxcbiAgICAgICAgc2lnbmFsOiBleGl0SW5mby5zaWduYWwsXG4gICAgICAgIHNwYXduRXJyb3I6IGV4aXRJbmZvLnNwYXduRXJyb3JcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGtpbGwoKTogdm9pZCB7XG4gICAgaXNLaWxsRXhwZWN0ZWQgPSB0cnVlO1xuICAgIGNsZWFyT3duZWRJbnN0YW5jZUV4aXRNYXJrZXIocG9ydCk7XG4gICAgbGl2ZW5lc3NTZXJ2ZXIuY2xvc2UoKTtcbiAgICBraWxsUHJvY2Vzc1RyZWUoY2hpbGQpO1xuICB9XG59XG5cbi8qKlxuICogUGlja3MgYSBmcmVlIFRDUCBwb3J0IGJ5IGJpbmRpbmcgdG8gcG9ydCBgMGAgYW5kIHJlYWRpbmcgdGhlIGFzc2lnbmVkIHBvcnQuXG4gKlxuICogVGhlcmUgaXMgYSBzbWFsbCB0aW1lLW9mLWNoZWNrL3RpbWUtb2YtdXNlIHdpbmRvdyBiZXR3ZWVuIHJlbGVhc2luZyB0aGUgcG9ydFxuICogaGVyZSBhbmQgT2JzaWRpYW4gYmluZGluZyBpdDsgaW4gcHJhY3RpY2UgaXQgaXMgbmVnbGlnaWJsZSBmb3IgdGVzdCBydW5zLlxuICpcbiAqIEByZXR1cm5zIEEgZnJlZSBUQ1AgcG9ydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpY2tGcmVlUG9ydCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigpO1xuICAgIHNlcnZlci5vbmNlKCdlcnJvcicsIHJlamVjdCk7XG4gICAgc2VydmVyLmxpc3RlbigwLCBERUZBVUxUX0NEUF9IT1NULCAoKSA9PiB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gc2VydmVyLmFkZHJlc3MoKTtcbiAgICAgIGlmIChhZGRyZXNzID09PSBudWxsIHx8IHR5cGVvZiBhZGRyZXNzID09PSAnc3RyaW5nJykge1xuICAgICAgICBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIGRldGVybWluZSBhIGZyZWUgcG9ydC4nKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgcG9ydCB9ID0gYWRkcmVzcztcbiAgICAgIHNlcnZlci5jbG9zZSgoKSA9PiB7XG4gICAgICAgIHJlc29sdmUocG9ydCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZ2l2ZW4gZGVsYXkuXG4gKlxuICogQHBhcmFtIG1zIC0gVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBkZWxheS5cbiAqL1xuZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUG9sbHMgdGhlIENEUCBgL2pzb25gIGVuZHBvaW50IHVudGlsIGF0IGxlYXN0IG9uZSBwYWdlIHRhcmdldCBhcHBlYXJzLlxuICpcbiAqIEBwYXJhbSBjZHBVcmwgLSBUaGUgYmFzZSBDRFAgVVJMLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yQ2RwUmVhZHkoY2RwVXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQ0RQX1JFQURZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7Y2RwVXJsfS9qc29uYCk7XG4gICAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIENkcFRhcmdldFtdO1xuICAgICAgaWYgKHRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQudHlwZSA9PT0gJ3BhZ2UnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBFbmRwb2ludCBub3QgdXAgeWV0IFx1MjAxNCBrZWVwIHBvbGxpbmcuXG4gICAgfVxuICAgIGF3YWl0IGRlbGF5KENEUF9SRUFEWV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBPd25lZCBPYnNpZGlhbiBpbnN0YW5jZSBkaWQgbm90IGV4cG9zZSBDRFAgYXQgJHtjZHBVcmx9IHdpdGhpbiAke1N0cmluZyhDRFBfUkVBRFlfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgKTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQWNBLFNBQVMsYUFBYTtBQUN0QixTQUFTLG9CQUFvQjtBQUk3QixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLFdBQVc7QUFDcEI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9B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
|
|
130
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLWluc3RhbmNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogTGF1bmNoZXMgYW5kIG1hbmFnZXMgYSBoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBPYnNpZGlhbiBkZXNrdG9wIGluc3RhbmNlLlxuICpcbiAqIFRoZSBpbnN0YW5jZSBydW5zIGFnYWluc3QgYSBkZWRpY2F0ZWQgYC0tdXNlci1kYXRhLWRpcmAgKHNvIGl0IG5ldmVyIHRvdWNoZXNcbiAqIHRoZSB1c2VyJ3MgT2JzaWRpYW4gY29uZmlnLCByZWdpc3RyeSwgb3IgcnVubmluZyB3aW5kb3cpIGFuZCBleHBvc2VzIENEUCBvbiBhXG4gKiBkZWRpY2F0ZWQgYC0tcmVtb3RlLWRlYnVnZ2luZy1wb3J0YC4gQmVjYXVzZSBFbGVjdHJvbidzIHNpbmdsZS1pbnN0YW5jZSBsb2NrXG4gKiBpcyBrZXllZCB0byB0aGUgdXNlci1kYXRhIGRpciwgdGhlIG93bmVkIGluc3RhbmNlIHJ1bnMgaW4gcGFyYWxsZWwgd2l0aCB0aGVcbiAqIHVzZXIncyBvd24gT2JzaWRpYW4uIENvbmZpcm1lZCBieSB0aGUgUGhhc2UgMCBzcGlrZSAoc2VlIHRoZSBwcm9qZWN0IHBsYW4pLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHByb2Nlc3MgbWFuYWdlbWVudCBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSAnbm9kZTpuZXQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NFeGl0SW5mbyB9IGZyb20gJy4vcHJvY2Vzcy1leGl0LW1lc3NhZ2UubWpzJztcblxuaW1wb3J0IHsga2lsbFByb2Nlc3NUcmVlIH0gZnJvbSAnLi9raWxsLXByb2Nlc3MtdHJlZS5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7XG4gIGNsZWFyT3duZWRJbnN0YW5jZUV4aXRNYXJrZXIsXG4gIHdyaXRlT3duZWRJbnN0YW5jZUV4aXRNYXJrZXJcbn0gZnJvbSAnLi9vd25lZC1pbnN0YW5jZS1leGl0LW1hcmtlci5tanMnO1xuaW1wb3J0IHsgT3duZWRJbnN0YW5jZUV4aXRlZEVycm9yIH0gZnJvbSAnLi9vd25lZC1pbnN0YW5jZS1leGl0ZWQtZXJyb3IubWpzJztcbmltcG9ydCB7IHN0YXJ0UGFyZW50TGl2ZW5lc3NTZXJ2ZXIgfSBmcm9tICcuL3BhcmVudC1saXZlbmVzcy5tanMnO1xuaW1wb3J0IHsgYXR0YWNoUHJvY2Vzc0NhcHR1cmUgfSBmcm9tICcuL3Byb2Nlc3MtY2FwdHVyZS5tanMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBsYXVuY2hPd25lZE9ic2lkaWFuSW5zdGFuY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExhdW5jaE93bmVkT2JzaWRpYW5JbnN0YW5jZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBDRFAgaG9zdCB0byBiaW5kL3BvbGwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnMTI3LjAuMC4xJ2BcbiAgICovXG4gIHJlYWRvbmx5IGNkcEhvc3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIE9ic2lkaWFuIGV4ZWN1dGFibGUgKHNoZWxsKSB0byBsYXVuY2guXG4gICAqL1xuICByZWFkb25seSBleGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEV4dHJhIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgYXBwZW5kZWQgYWZ0ZXIgYC0tdXNlci1kYXRhLWRpcmAgYW5kXG4gICAqIGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydGAgXHUyMDE0IHVzZWQgdG8gcGFzcyB0aGUga2VlcC1hbGl2ZSBDaHJvbWl1bSBmbGFncyB3aGVuXG4gICAqIHRoZSBpbnN0YW5jZSBpcyBsYXVuY2hlZCBoaWRkZW4gKG9mZi1zY3JlZW4pLiBFbXB0eSBieSBkZWZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFBcmd1bWVudHM/OiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgQWJzb2x1dGUgcGF0aCB0byB0aGUgaXNvbGF0ZWQgdXNlci1kYXRhIGRpciB0byBwYXNzIHZpYSBgLS11c2VyLWRhdGEtZGlyYC5cbiAgICovXG5cbiAgcmVhZG9ubHkgdXNlckRhdGFEaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHJ1bm5pbmcsIGhhcm5lc3Mtb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZWRPYnNpZGlhbkluc3RhbmNlIHtcbiAgLyoqXG4gIEJhc2UgQ0RQIFVSTCwgZS5nLiBgaHR0cDovLzEyNy4wLjAuMTo1MTg4OGAuXG4gICAqL1xuICByZWFkb25seSBjZHBVcmw6IHN0cmluZztcblxuICAvKipcbiAgS2lsbHMgdGhlIGluc3RhbmNlIGFuZCBpdHMgZW50aXJlIHByb2Nlc3MgdHJlZS5cbiAgICovXG4gIGtpbGw6ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIExvb3BiYWNrIHBvcnQgdGhlIGluc3RhbmNlJ3MgcmVuZGVyZXIgY29ubmVjdHMgYmFjayB0byBzbyBpdCBkZXN0cm95c1xuICAgKiBpdHNlbGYgaWYgdGhpcyBoYXJuZXNzIHByb2Nlc3MgZGllcyB3aXRob3V0IGNsZWFuaW5nIHVwLiBTZWVcbiAgICogYHBhcmVudC1saXZlbmVzcy50c2AgZm9yIHdoeSB0aGUgcGFyZW50L2NoaWxkIHJlbGF0aW9uc2hpcCBhbG9uZSBpcyBub3RcbiAgICogZW5vdWdoLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50TGl2ZW5lc3NQb3J0OiBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSBDRFAgcmVtb3RlLWRlYnVnZ2luZyBwb3J0IHRoZSBpbnN0YW5jZSB3YXMgbGF1bmNoZWQgd2l0aC5cbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogUmV0dXJucyBob3cgdGhlIGluc3RhbmNlIGRpZWQgb25jZSBpdCBpcyBubyBsb25nZXIgcnVubmluZywgb3RoZXJ3aXNlXG4gICAqIGB1bmRlZmluZWRgLiBUaGlzIGlzIHRoZSBpbi1wcm9jZXNzIGhhbGYgb2YgdGhlIGFuc3dlcjsgYSB0ZXN0IHdvcmtlciBpblxuICAgKiBhbm90aGVyIHByb2Nlc3MgcmVhZHMgdGhlIHNhbWUgZmFjdHMgZnJvbSB0aGUgZXhpdCBtYXJrZXJcbiAgICogKGBvd25lZC1pbnN0YW5jZS1leGl0LW1hcmtlci50c2ApLlxuICAgKi9cbiAgcmVhZEV4aXRJbmZvOiAoKSA9PiBQcm9jZXNzRXhpdEluZm8gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFJldHVybnMgdGhlIHRhaWwgb2YgZXZlcnl0aGluZyB0aGUgaW5zdGFuY2Ugd3JvdGUgdG8gc3Rkb3V0L3N0ZGVyci5cbiAgICovXG4gIHJlYWRPdXRwdXQ6ICgpID0+IHN0cmluZztcbn1cblxuY29uc3QgREVGQVVMVF9DRFBfSE9TVCA9ICcxMjcuMC4wLjEnO1xuY29uc3QgQ0RQX1JFQURZX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMTAwMDtcbmNvbnN0IENEUF9SRUFEWV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwXzAwMDtcbmNvbnN0IE9CU0lESUFOX09VVFBVVF9UQUlMX01BWF9MRU5HVEggPSA4MDAwO1xuXG5pbnRlcmZhY2UgQ2RwVGFyZ2V0IHtcbiAgdHlwZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIExhdW5jaGVzIGFuIGlzb2xhdGVkLCBoYXJuZXNzLW93bmVkIE9ic2lkaWFuIGluc3RhbmNlIGFuZCB3YWl0cyB1bnRpbCBpdHMgQ0RQXG4gKiBlbmRwb2ludCBpcyBzZXJ2aW5nIHBhZ2UgdGFyZ2V0cy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gTGF1bmNoIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgcnVubmluZyBvd25lZCBpbnN0YW5jZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgQ0RQIGRvZXMgbm90IGJlY29tZSByZWFjaGFibGUgd2l0aGluIHRoZSB0aW1lb3V0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGF1bmNoT3duZWRPYnNpZGlhbkluc3RhbmNlKFxuICBwYXJhbXM6IExhdW5jaE93bmVkT2JzaWRpYW5JbnN0YW5jZVBhcmFtc1xuKTogUHJvbWlzZTxPd25lZE9ic2lkaWFuSW5zdGFuY2U+IHtcbiAgY29uc3QgY2RwSG9zdCA9IHBhcmFtcy5jZHBIb3N0ID8/IERFRkFVTFRfQ0RQX0hPU1Q7XG4gIGNvbnN0IHBvcnQgPSBhd2FpdCBwaWNrRnJlZVBvcnQoKTtcbiAgY29uc3QgY2RwVXJsID0gYGh0dHA6Ly8ke2NkcEhvc3R9OiR7U3RyaW5nKHBvcnQpfWA7XG5cbiAgLy8gTGlzdGVuIEJFRk9SRSBzcGF3bmluZywgc28gdGhlIHJlbmRlcmVyIHdhdGNoZG9nIGNhbiBuZXZlciByYWNlIHRoZSBzZXJ2ZXJcbiAgLy8gaW50byBhIGZhaWxlZCBjb25uZWN0ICh3aGljaCBpdCB0cmVhdHMgYXMgXCJubyB3YXRjaGRvZ1wiLCBsZWF2aW5nIHRoZSBpbnN0YW5jZSBhbGl2ZSkuXG4gIGNvbnN0IGxpdmVuZXNzU2VydmVyID0gYXdhaXQgc3RhcnRQYXJlbnRMaXZlbmVzc1NlcnZlcigpO1xuXG4gIC8vIFBvcnRzIGFyZSByZWN5Y2xlZCBieSB0aGUgT1MsIHNvIGFuIG9sZGVyIGluc3RhbmNlJ3MgZGVhdGggcmVjb3JkZWQgb24gdGhpc1xuICAvLyBwb3J0IHdvdWxkIG90aGVyd2lzZSBiZSByZWFkIGFzIHRoaXMgb25lJ3MuXG4gIGNsZWFyT3duZWRJbnN0YW5jZUV4aXRNYXJrZXIocG9ydCk7XG5cbiAgbG9nKGBbb2JzaWRpYW4taW5zdGFuY2VdIExhdW5jaGluZyBvd25lZCBPYnNpZGlhbjogdXNlckRhdGE9JHtwYXJhbXMudXNlckRhdGFEaXJlY3Rvcnl9LCBjZHBQb3J0PSR7U3RyaW5nKHBvcnQpfWApO1xuICAvKlxuICAgKiBQaXBlZCByYXRoZXIgdGhhbiBgJ2lnbm9yZSdgOiBhbiBFbGVjdHJvbi9DaHJvbWl1bSBmYXRhbCBpcyB3cml0dGVuIHRvXG4gICAqIHN0ZGVyciBhbmQgbm93aGVyZSBlbHNlLCBhbmQgZGlzY2FyZGluZyBpdCBpcyB3aHkgYSBkeWluZyBpbnN0YW5jZSB1c2VkIHRvXG4gICAqIGJlIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYSBoZWFsdGh5IG9uZS4gVGhlIGNhcHR1cmUgZHJhaW5zIGJvdGggcGlwZXMgZm9yXG4gICAqIHRoZSBwcm9jZXNzJ3Mgd2hvbGUgbGlmZSAoYSBmdWxsIHBpcGUgYnVmZmVyIHdvdWxkIGJsb2NrIHRoZSBhcHAgaXRzZWxmKSBhbmRcbiAgICoga2VlcHMgb25seSBhIGJvdW5kZWQgdGFpbC5cbiAgICovXG4gIGNvbnN0IGNoaWxkID0gc3Bhd24oXG4gICAgcGFyYW1zLmV4ZVBhdGgsXG4gICAgW2AtLXVzZXItZGF0YS1kaXI9JHtwYXJhbXMudXNlckRhdGFEaXJlY3Rvcnl9YCwgYC0tcmVtb3RlLWRlYnVnZ2luZy1wb3J0PSR7U3RyaW5nKHBvcnQpfWAsIC4uLihwYXJhbXMuZXh0cmFBcmd1bWVudHMgPz8gW10pXSxcbiAgICB7IGRldGFjaGVkOiB0cnVlLCBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10gfVxuICApO1xuICBjb25zdCBjYXB0dXJlID0gYXR0YWNoUHJvY2Vzc0NhcHR1cmUoY2hpbGQsIHtcbiAgICBtYXhPdXRwdXRMZW5ndGhJbkNoYXJhY3RlcnM6IE9CU0lESUFOX09VVFBVVF9UQUlMX01BWF9MRU5HVEgsXG4gICAgb25DaHVuazogKGNodW5rKSA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gY2h1bmsudGV4dC50cmltRW5kKCk7XG4gICAgICBpZiAodGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxvZyhgW29ic2lkaWFuLWluc3RhbmNlOiR7Y2h1bmsuc3RyZWFtfV0gJHt0ZXh0fWApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gU2V0IGJ5IGBraWxsKClgLCBzbyBhIGRlYXRoIHRoZSBoYXJuZXNzIG9yZGVyZWQgaXMgbmV2ZXIgcmVwb3J0ZWQgYXMgb25lIGl0XG4gIC8vIHN1ZmZlcmVkIFx1MjAxNCBhIG1hcmtlciBsZWZ0IGJ5IGEgY2xlYW4gdGVhcmRvd24gd291bGQgY29udmljdCB0aGUgbmV4dCBydW4nc1xuICAvLyBoZWFsdGh5IGluc3RhbmNlIG9mIGFuIGV4aXQgdGhhdCBuZXZlciBoYXBwZW5lZC5cbiAgbGV0IGlzS2lsbEV4cGVjdGVkID0gZmFsc2U7XG5cbiAgY2hpbGQub25jZSgnZXhpdCcsIChjb2RlOiBudWxsIHwgbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4ge1xuICAgIGlmIChpc0tpbGxFeHBlY3RlZCkge1xuICAgICAgbG9nKGBbb2JzaWRpYW4taW5zdGFuY2VdIE93bmVkIE9ic2lkaWFuIGV4aXRlZCBhcyBhc2tlZDogcGlkPSR7U3RyaW5nKGNoaWxkLnBpZCl9IGNvZGU9JHtTdHJpbmcoY29kZSl9IHNpZ25hbD0ke1N0cmluZyhzaWduYWwpfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIExvdWQgb24gcHVycG9zZS4gVGhpcyBvbmUgbGluZSBpcyB3aGF0IHNlcGFyYXRlcyBhIGNsZWFuIHF1aXQgZnJvbSBhXG4gICAgLy8gY3Jhc2gsIGFuZCBpdHMgYWJzZW5jZSBvbmNlIGNvc3QgYSBkYXkgb2YgZ3Vlc3NpbmcuXG4gICAgbG9nKGBbb2JzaWRpYW4taW5zdGFuY2VdICEhISBPV05FRCBPQlNJRElBTiBFWElURUQ6IHBpZD0ke1N0cmluZyhjaGlsZC5waWQpfSBjb2RlPSR7U3RyaW5nKGNvZGUpfSBzaWduYWw9JHtTdHJpbmcoc2lnbmFsKX1gKTtcbiAgICB3cml0ZU93bmVkSW5zdGFuY2VFeGl0TWFya2VyKHtcbiAgICAgIGNvZGUsXG4gICAgICBvdXRwdXRUYWlsOiBjYXB0dXJlLnJlYWRPdXRwdXQoKSxcbiAgICAgIHBpZDogY2hpbGQucGlkLFxuICAgICAgcG9ydCxcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICB9KTtcblxuICBjaGlsZC51bnJlZigpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgd2FpdEZvckNkcFJlYWR5KGNkcFVybCk7XG4gICAgbG9nKGBbb2JzaWRpYW4taW5zdGFuY2VdIE93bmVkIE9ic2lkaWFuIGlzIHNlcnZpbmcgQ0RQIGF0ICR7Y2RwVXJsfS5gKTtcbiAgICByZXR1cm4ge1xuICAgICAgY2RwVXJsLFxuICAgICAga2lsbCxcbiAgICAgIHBhcmVudExpdmVuZXNzUG9ydDogbGl2ZW5lc3NTZXJ2ZXIucG9ydCxcbiAgICAgIHBvcnQsXG4gICAgICByZWFkRXhpdEluZm86ICgpID0+IGNhcHR1cmUucmVhZEV4aXRJbmZvKCksXG4gICAgICByZWFkT3V0cHV0OiAoKSA9PiBjYXB0dXJlLnJlYWRPdXRwdXQoKVxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgLypcbiAgICAgKiBSZWFkIGJlZm9yZSBraWxsaW5nLCBzbyB0aGUgdmVyZGljdCBpcyB0aGUgaW5zdGFuY2UncyBvd24uIEEgQ0RQIHRpbWVvdXRcbiAgICAgKiB3aG9zZSBwcm9jZXNzIGlzIGFscmVhZHkgZ29uZSBpcyBub3QgYSBzbG93IGJvb3QgXHUyMDE0IGl0IGlzIGEgYm9vdCB0aGF0XG4gICAgICogZW5kZWQgXHUyMDE0IGFuZCBzYXlpbmcgc28gYmVhdHMgcmVwb3J0aW5nIG9ubHkgdGhlIGJ1ZGdldCBpdCBibGV3LlxuICAgICAqXG4gICAgICogRGVsaWJlcmF0ZWx5IE5PVCBhIGZhc3QtZmFpbCBpbnNpZGUgdGhlIHBvbGw6IG9uIHNvbWUgaW5zdGFsbHMgdGhlXG4gICAgICogbGF1bmNoZWQgZXhlY3V0YWJsZSBpcyBhIHNoaW0gdGhhdCBleGl0cyBvbmNlIGl0IGhhcyBoYW5kZWQgb2ZmIHRvIHRoZVxuICAgICAqIHJlYWwgYXBwLCBzbyBhIGRlYWQgY2hpbGQgbWlkLXBvbGwgZG9lcyBub3QgaW1wbHkgYSBkZWFkIGluc3RhbmNlLiBPbmx5IGFcbiAgICAgKiBkZWFkIGNoaWxkIHRoYXQgYWxzbyBuZXZlciBzZXJ2ZWQgQ0RQIGRvZXMuXG4gICAgICovXG4gICAgY29uc3QgZXhpdEluZm8gPSBjYXB0dXJlLnJlYWRFeGl0SW5mbygpO1xuICAgIGtpbGwoKTtcbiAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgIHRocm93IG5ldyBPd25lZEluc3RhbmNlRXhpdGVkRXJyb3Ioe1xuICAgICAgICBjZHBVcmwsXG4gICAgICAgIGNvZGU6IGV4aXRJbmZvLmNvZGUsXG4gICAgICAgIG91dHB1dFRhaWw6IGNhcHR1cmUucmVhZE91dHB1dCgpLFxuICAgICAgICBwaWQ6IGNoaWxkLnBpZCxcbiAgICAgICAgc2lnbmFsOiBleGl0SW5mby5zaWduYWwsXG4gICAgICAgIHNwYXduRXJyb3I6IGV4aXRJbmZvLnNwYXduRXJyb3JcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGtpbGwoKTogdm9pZCB7XG4gICAgaXNLaWxsRXhwZWN0ZWQgPSB0cnVlO1xuICAgIGNsZWFyT3duZWRJbnN0YW5jZUV4aXRNYXJrZXIocG9ydCk7XG4gICAgbGl2ZW5lc3NTZXJ2ZXIuY2xvc2UoKTtcbiAgICBraWxsUHJvY2Vzc1RyZWUoY2hpbGQpO1xuICB9XG59XG5cbi8qKlxuICogUGlja3MgYSBmcmVlIFRDUCBwb3J0IGJ5IGJpbmRpbmcgdG8gcG9ydCBgMGAgYW5kIHJlYWRpbmcgdGhlIGFzc2lnbmVkIHBvcnQuXG4gKlxuICogVGhlcmUgaXMgYSBzbWFsbCB0aW1lLW9mLWNoZWNrL3RpbWUtb2YtdXNlIHdpbmRvdyBiZXR3ZWVuIHJlbGVhc2luZyB0aGUgcG9ydFxuICogaGVyZSBhbmQgT2JzaWRpYW4gYmluZGluZyBpdDsgaW4gcHJhY3RpY2UgaXQgaXMgbmVnbGlnaWJsZSBmb3IgdGVzdCBydW5zLlxuICpcbiAqIEByZXR1cm5zIEEgZnJlZSBUQ1AgcG9ydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpY2tGcmVlUG9ydCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigpO1xuICAgIHNlcnZlci5vbmNlKCdlcnJvcicsIHJlamVjdCk7XG4gICAgc2VydmVyLmxpc3RlbigwLCBERUZBVUxUX0NEUF9IT1NULCAoKSA9PiB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gc2VydmVyLmFkZHJlc3MoKTtcbiAgICAgIGlmIChhZGRyZXNzID09PSBudWxsIHx8IHR5cGVvZiBhZGRyZXNzID09PSAnc3RyaW5nJykge1xuICAgICAgICBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIGRldGVybWluZSBhIGZyZWUgcG9ydC4nKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgcG9ydCB9ID0gYWRkcmVzcztcbiAgICAgIHNlcnZlci5jbG9zZSgoKSA9PiB7XG4gICAgICAgIHJlc29sdmUocG9ydCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZ2l2ZW4gZGVsYXkuXG4gKlxuICogQHBhcmFtIG1zIC0gVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBkZWxheS5cbiAqL1xuZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUG9sbHMgdGhlIENEUCBgL2pzb25gIGVuZHBvaW50IHVudGlsIGF0IGxlYXN0IG9uZSBwYWdlIHRhcmdldCBhcHBlYXJzLlxuICpcbiAqIEBwYXJhbSBjZHBVcmwgLSBUaGUgYmFzZSBDRFAgVVJMLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yQ2RwUmVhZHkoY2RwVXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQ0RQX1JFQURZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7Y2RwVXJsfS9qc29uYCk7XG4gICAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIENkcFRhcmdldFtdO1xuICAgICAgaWYgKHRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQudHlwZSA9PT0gJ3BhZ2UnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBFbmRwb2ludCBub3QgdXAgeWV0IFx1MjAxNCBrZWVwIHBvbGxpbmcuXG4gICAgfVxuICAgIGF3YWl0IGRlbGF5KENEUF9SRUFEWV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBPd25lZCBPYnNpZGlhbiBpbnN0YW5jZSBkaWQgbm90IGV4cG9zZSBDRFAgYXQgJHtjZHBVcmx9IHdpdGhpbiAke1N0cmluZyhDRFBfUkVBRFlfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgKTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQWNBLFNBQVMsYUFBYTtBQUN0QixTQUFTLG9CQUFvQjtBQUk3QixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLFdBQVc7QUFDcEI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGdDQUFnQztBQUN6QyxTQUFTLGlDQUFpQztBQUMxQyxTQUFTLDRCQUE0QjtBQXlFckMsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSwwQ0FBMEM7QUFDaEQsTUFBTSxvQ0FBb0M7QUFDMUMsTUFBTSxrQ0FBa0M7QUFjeEMsZUFBc0IsNEJBQ3BCLFFBQ2dDO0FBQ2hDLFFBQU0sVUFBVSxPQUFPLFdBQVc7QUFDbEMsUUFBTSxPQUFPLE1BQU0sYUFBYTtBQUNoQyxRQUFNLFNBQVMsVUFBVSxPQUFPLElBQUksT0FBTyxJQUFJLENBQUM7QUFJaEQsUUFBTSxpQkFBaUIsTUFBTSwwQkFBMEI7QUFJdkQsK0JBQTZCLElBQUk7QUFFakMsTUFBSSwwREFBMEQsT0FBTyxpQkFBaUIsYUFBYSxPQUFPLElBQUksQ0FBQyxFQUFFO0FBUWpILFFBQU0sUUFBUTtBQUFBLElBQ1osT0FBTztBQUFBLElBQ1AsQ0FBQyxtQkFBbUIsT0FBTyxpQkFBaUIsSUFBSSwyQkFBMkIsT0FBTyxJQUFJLENBQUMsSUFBSSxHQUFJLE9BQU8sa0JBQWtCLENBQUMsQ0FBRTtBQUFBLElBQzNILEVBQUUsVUFBVSxNQUFNLE9BQU8sQ0FBQyxVQUFVLFFBQVEsTUFBTSxFQUFFO0FBQUEsRUFDdEQ7QUFDQSxRQUFNLFVBQVUscUJBQXFCLE9BQU87QUFBQSxJQUMxQyw2QkFBNkI7QUFBQSxJQUM3QixTQUFTLENBQUMsVUFBVTtBQUNsQixZQUFNLE9BQU8sTUFBTSxLQUFLLFFBQVE7QUFDaEMsVUFBSSxLQUFLLFNBQVMsR0FBRztBQUNuQixZQUFJLHNCQUFzQixNQUFNLE1BQU0sS0FBSyxJQUFJLEVBQUU7QUFBQSxNQUNuRDtBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQUM7QUFLRCxNQUFJLGlCQUFpQjtBQUVyQixRQUFNLEtBQUssUUFBUSxDQUFDLE1BQXFCLFdBQWtDO0FBQ3pFLFFBQUksZ0JBQWdCO0FBQ2xCLFVBQUksMkRBQTJELE9BQU8sTUFBTSxHQUFHLENBQUMsU0FBUyxPQUFPLElBQUksQ0FBQyxXQUFXLE9BQU8sTUFBTSxDQUFDLEVBQUU7QUFDaEk7QUFBQSxJQUNGO0FBSUEsUUFBSSxzREFBc0QsT0FBTyxNQUFNLEdBQUcsQ0FBQyxTQUFTLE9BQU8sSUFBSSxDQUFDLFdBQVcsT0FBTyxNQUFNLENBQUMsRUFBRTtBQUMzSCxpQ0FBNkI7QUFBQSxNQUMzQjtBQUFBLE1BQ0EsWUFBWSxRQUFRLFdBQVc7QUFBQSxNQUMvQixLQUFLLE1BQU07QUFBQSxNQUNYO0FBQUEsTUFDQTtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0gsQ0FBQztBQUVELFFBQU0sTUFBTTtBQUVaLE1BQUk7QUFDRixVQUFNLGdCQUFnQixNQUFNO0FBQzVCLFFBQUksd0RBQXdELE1BQU0sR0FBRztBQUNyRSxXQUFPO0FBQUEsTUFDTDtBQUFBLE1BQ0E7QUFBQSxNQUNBLG9CQUFvQixlQUFlO0FBQUEsTUFDbkM7QUFBQSxNQUNBLGNBQWMsTUFBTSxRQUFRLGFBQWE7QUFBQSxNQUN6QyxZQUFZLE1BQU0sUUFBUSxXQUFXO0FBQUEsSUFDdkM7QUFBQSxFQUNGLFNBQVMsT0FBZ0I7QUFXdkIsVUFBTSxXQUFXLFFBQVEsYUFBYTtBQUN0QyxTQUFLO0FBQ0wsUUFBSSxVQUFVO0FBQ1osWUFBTSxJQUFJLHlCQUF5QjtBQUFBLFFBQ2pDO0FBQUEsUUFDQSxNQUFNLFNBQVM7QUFBQSxRQUNmLFlBQVksUUFBUSxXQUFXO0FBQUEsUUFDL0IsS0FBSyxNQUFNO0FBQUEsUUFDWCxRQUFRLFNBQVM7QUFBQSxRQUNqQixZQUFZLFNBQVM7QUFBQSxNQUN2QixDQUFDO0FBQUEsSUFDSDtBQUNBLFVBQU07QUFBQSxFQUNSO0FBRUEsV0FBUyxPQUFhO0FBQ3BCLHFCQUFpQjtBQUNqQixpQ0FBNkIsSUFBSTtBQUNqQyxtQkFBZSxNQUFNO0FBQ3JCLG9CQUFnQixLQUFLO0FBQUEsRUFDdkI7QUFDRjtBQVVPLFNBQVMsZUFBZ0M7QUFDOUMsU0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFDdEMsVUFBTSxTQUFTLGFBQWE7QUFDNUIsV0FBTyxLQUFLLFNBQVMsTUFBTTtBQUMzQixXQUFPLE9BQU8sR0FBRyxrQkFBa0IsTUFBTTtBQUN2QyxZQUFNLFVBQVUsT0FBTyxRQUFRO0FBQy9CLFVBQUksWUFBWSxRQUFRLE9BQU8sWUFBWSxVQUFVO0FBQ25ELGVBQU8sTUFBTTtBQUNiLGVBQU8sSUFBSSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BEO0FBQUEsTUFDRjtBQUNBLFlBQU0sRUFBRSxLQUFLLElBQUk7QUFDakIsYUFBTyxNQUFNLE1BQU07QUFDakIsZ0JBQVEsSUFBSTtBQUFBLE1BQ2QsQ0FBQztBQUFBLElBQ0gsQ0FBQztBQUFBLEVBQ0gsQ0FBQztBQUNIO0FBUUEsU0FBUyxNQUFNLElBQTJCO0FBQ3hDLFNBQU8sSUFBSSxRQUFRLENBQUMsWUFBWTtBQUM5QixlQUFXLFNBQVMsRUFBRTtBQUFBLEVBQ3hCLENBQUM7QUFDSDtBQU9BLGVBQWUsZ0JBQWdCLFFBQStCO0FBQzVELFFBQU0sV0FBVyxLQUFLLElBQUksSUFBSTtBQUM5QixTQUFPLEtBQUssSUFBSSxJQUFJLFVBQVU7QUFDNUIsUUFBSTtBQUNGLFlBQU0sV0FBVyxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU87QUFDN0MsWUFBTSxVQUFVLE1BQU0sU0FBUyxLQUFLO0FBQ3BDLFVBQUksUUFBUSxLQUFLLENBQUMsV0FBVyxPQUFPLFNBQVMsTUFBTSxHQUFHO0FBQ3BEO0FBQUEsTUFDRjtBQUFBLElBQ0YsUUFBUTtBQUFBLElBRVI7QUFDQSxVQUFNLE1BQU0sdUNBQXVDO0FBQUEsRUFDckQ7QUFDQSxRQUFNLElBQUk7QUFBQSxJQUNSLGlEQUFpRCxNQUFNLFdBQVcsT0FBTyxpQ0FBaUMsQ0FBQztBQUFBLEVBQzdHO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|