UNPKG

aws-cdk

Version:

AWS CDK CLI, the command line tool for CDK apps

212 lines 25.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TelemetrySession = void 0; exports.isValidWrapperUserAgent = isValidWrapperUserAgent; const node_crypto_1 = require("node:crypto"); const toolkit_lib_1 = require("@aws-cdk/toolkit-lib"); const installation_id_1 = require("./installation-id"); const library_version_1 = require("./library-version"); const sanitation_1 = require("./sanitation"); const ci_systems_1 = require("../ci-systems"); const messages_1 = require("../telemetry/messages"); const ci_1 = require("../util/ci"); const version_1 = require("../version"); const error_1 = require("./error"); const ABORTED_ERROR_MESSAGE = '__CDK-Toolkit__Aborted'; /** * Valid user agent prefixes that are allowed to report through CDK_CLI_USERAGENT. * This creates a mechanism to report user agents we control. */ const VALID_USER_AGENTS = ['aws-blocks']; class TelemetrySession { constructor(props) { this.props = props; this.count = 0; this.ioHost = props.ioHost; this.client = props.client; } async begin() { // sanitize the raw cli input const { path, parameters } = (0, sanitation_1.sanitizeCommandLineArguments)(this.props.arguments); this._sessionInfo = { identifiers: { installationId: await (0, installation_id_1.getOrCreateInstallationId)(this.ioHost.asIoHelper()), sessionId: (0, node_crypto_1.randomUUID)(), telemetryVersion: '2.0', cdkCliVersion: (0, version_1.versionNumber)(), cdkLibraryVersion: await (0, library_version_1.getLibraryVersion)(this.ioHost.asIoHelper()), }, event: { command: { path, parameters, config: { context: (0, sanitation_1.sanitizeContext)(this.props.context), ...(isValidWrapperUserAgent(process.env.CDK_CLI_USERAGENT) ? { cdkCliUserAgent: { [process.env.CDK_CLI_USERAGENT]: true } } : {}), }, }, }, environment: { ci: (0, ci_1.isCI)() || Boolean((0, ci_systems_1.detectCiSystem)()), os: { platform: process.platform, release: process.release.name, }, nodeVersion: process.version, }, project: {}, }; // If SIGINT has a listener installed, its default behavior will be removed (Node.js will no longer exit). // This ensures that on SIGINT we process safely close the telemetry session before exiting. process.on('SIGINT', async () => { try { await this.end({ name: error_1.USER_INTERRUPTED_CODE, message: ABORTED_ERROR_MESSAGE, }); } catch (e) { await this.ioHost.defaults.trace(`Ending Telemetry failed: ${e.message}`); } process.exit(1); }); // Begin the session span this.span = await this.ioHost.asIoHelper().span(messages_1.CLI_PRIVATE_SPAN.COMMAND).begin({}); } async attachRegion(region) { this.sessionInfo.identifiers = { ...this.sessionInfo.identifiers, region, }; } /** * Attach a language guess */ attachLanguage(language) { // Don't want to crash accidentally if (!this._sessionInfo) { return; } if (language) { mutable(this.sessionInfo.project).language = language; } } /** * Attach our best guess at running under an agent or not */ attachAgent(isAgent) { // Don't want to crash accidentally if (!this._sessionInfo) { return; } mutable(this.sessionInfo.environment).agent = isAgent; } /** * Temporarily attach counters for the next event operation. * * They may be committed to the sent telemetry later. */ attachCountersToNextEvent(counters) { this._nextEventCounters = counters; } /** * Attach the CDK library version * * By default the telemetry will guess at the CDK library version if it so * happens that the CDK project is an NPM project and the CDK CLI is executed * in the root of NPM project with `aws-cdk-lib` available in `node_modules`. * This may succeed or may fail. * * Once we have produced and loaded the cloud assembly more accurate * information becomes available that we can add in. */ attachCdkLibVersion(libVersion) { // Don't want to crash accidentally if (!this._sessionInfo) { return; } mutable(this.sessionInfo.identifiers).cdkLibraryVersion = libVersion; } /** * When the command is complete, so is the CliIoHost. Ends the span of the entire CliIoHost * and notifies with an optional error message in the data. */ async end(error) { await this.span?.end({ error }); // Ideally span.end() should no-op if called twice, but that is not the case right now this.span = undefined; await this.client.flush(); } async emit(event) { this.count += 1; const counters = { ...this._nextEventCounters, ...event.counters, }; this._nextEventCounters = undefined; return this.client.emit({ event: { command: this.sessionInfo.event.command, state: getState(event.error), eventType: event.eventType, }, identifiers: { ...this.sessionInfo.identifiers, eventId: `${this.sessionInfo.identifiers.sessionId}:${this.count}`, timestamp: new Date().toISOString(), }, environment: this.sessionInfo.environment, project: this.sessionInfo.project, duration: { total: event.duration, }, ...(event.error ? { error: { name: event.error.name, }, } : {}), ...(Object.keys(counters).length > 0 ? { counters } : {}), }); } get sessionInfo() { if (!this._sessionInfo) { throw new toolkit_lib_1.ToolkitError('SessionNotInitialized', 'Session Info not initialized. Call begin() first.'); } return this._sessionInfo; } } exports.TelemetrySession = TelemetrySession; function getState(error) { if (error) { return isAbortedError(error) ? 'ABORTED' : 'FAILED'; } return 'SUCCEEDED'; } function isAbortedError(error) { if (error?.name === 'ToolkitError' && error?.message?.includes(ABORTED_ERROR_MESSAGE)) { return true; } return false; } function mutable(x) { return x; } /** * Validates that the CDK_CLI_USERAGENT env var value matches * the expected format: `<name>/<version>/<mode>` where name is one of * VALID_USER_AGENTS and mode is either `sandbox` or `production`. */ function isValidWrapperUserAgent(value) { if (!value) return false; const parts = value.split('/'); if (parts.length !== 3) return false; const [name, _version, mode] = parts; if (!VALID_USER_AGENTS.includes(name)) return false; return mode === 'sandbox' || mode === 'production'; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBaVFBLDBEQU9DO0FBeFFELDZDQUF5QztBQUN6QyxzREFBb0Q7QUFDcEQsdURBQThEO0FBQzlELHVEQUFzRDtBQUN0RCw2Q0FBNkU7QUFLN0UsOENBQStDO0FBRy9DLG9EQUF5RDtBQUN6RCxtQ0FBa0M7QUFDbEMsd0NBQTJDO0FBQzNDLG1DQUFnRDtBQUVoRCxNQUFNLHFCQUFxQixHQUFHLHdCQUF3QixDQUFDO0FBRXZEOzs7R0FHRztBQUNILE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQStCekMsTUFBYSxnQkFBZ0I7SUFRM0IsWUFBNkIsS0FBNEI7UUFBNUIsVUFBSyxHQUFMLEtBQUssQ0FBdUI7UUFGakQsVUFBSyxHQUFHLENBQUMsQ0FBQztRQUdoQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzdCLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNoQiw2QkFBNkI7UUFDN0IsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFBLHlDQUE0QixFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLFlBQVksR0FBRztZQUNsQixXQUFXLEVBQUU7Z0JBQ1gsY0FBYyxFQUFFLE1BQU0sSUFBQSwyQ0FBeUIsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN6RSxTQUFTLEVBQUUsSUFBQSx3QkFBVSxHQUFFO2dCQUN2QixnQkFBZ0IsRUFBRSxLQUFLO2dCQUN2QixhQUFhLEVBQUUsSUFBQSx1QkFBYSxHQUFFO2dCQUM5QixpQkFBaUIsRUFBRSxNQUFNLElBQUEsbUNBQWlCLEVBQUMsSUFB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QUssRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQztRQUN0RixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBbUIsQ0FBSTtJQUNyQyxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQUMsS0FBeUI7SUFDL0QsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDckMsTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3JDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDcEQsT0FBTyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxZQUFZLENBQUM7QUFDckQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICdAYXdzLWNkay90b29sa2l0LWxpYic7XG5pbXBvcnQgeyBnZXRPckNyZWF0ZUluc3RhbGxhdGlvbklkIH0gZnJvbSAnLi9pbnN0YWxsYXRpb24taWQnO1xuaW1wb3J0IHsgZ2V0TGlicmFyeVZlcnNpb24gfSBmcm9tICcuL2xpYnJhcnktdmVyc2lvbic7XG5pbXBvcnQgeyBzYW5pdGl6ZUNvbW1hbmRMaW5lQXJndW1lbnRzLCBzYW5pdGl6ZUNvbnRleHQgfSBmcm9tICcuL3Nhbml0YXRpb24nO1xuaW1wb3J0IHsgdHlwZSBFdmVudFR5cGUsIHR5cGUgU2Vzc2lvblNjaGVtYSwgdHlwZSBTdGF0ZSwgdHlwZSBFcnJvckRldGFpbHMgfSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgdHlwZSB7IElUZWxlbWV0cnlTaW5rIH0gZnJvbSAnLi9zaW5rL3NpbmstaW50ZXJmYWNlJztcbmltcG9ydCB0eXBlIHsgQ29udGV4dCB9IGZyb20gJy4uLy4uL2FwaS9jb250ZXh0JztcbmltcG9ydCB0eXBlIHsgSU1lc3NhZ2VTcGFuIH0gZnJvbSAnLi4vLi4vYXBpLXByaXZhdGUnO1xuaW1wb3J0IHsgZGV0ZWN0Q2lTeXN0ZW0gfSBmcm9tICcuLi9jaS1zeXN0ZW1zJztcbmltcG9ydCB0eXBlIHsgQ2xpSW9Ib3N0IH0gZnJvbSAnLi4vaW8taG9zdC9jbGktaW8taG9zdCc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50UmVzdWx0IH0gZnJvbSAnLi4vdGVsZW1ldHJ5L21lc3NhZ2VzJztcbmltcG9ydCB7IENMSV9QUklWQVRFX1NQQU4gfSBmcm9tICcuLi90ZWxlbWV0cnkvbWVzc2FnZXMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWwvY2knO1xuaW1wb3J0IHsgdmVyc2lvbk51bWJlciB9IGZyb20gJy4uL3ZlcnNpb24nO1xuaW1wb3J0IHsgVVNFUl9JTlRFUlJVUFRFRF9DT0RFIH0gZnJvbSAnLi9lcnJvcic7XG5cbmNvbnN0IEFCT1JURURfRVJST1JfTUVTU0FHRSA9ICdfX0NESy1Ub29sa2l0X19BYm9ydGVkJztcblxuLyoqXG4gKiBWYWxpZCB1c2VyIGFnZW50IHByZWZpeGVzIHRoYXQgYXJlIGFsbG93ZWQgdG8gcmVwb3J0IHRocm91Z2ggQ0RLX0NMSV9VU0VSQUdFTlQuXG4gKiBUaGlzIGNyZWF0ZXMgYSBtZWNoYW5pc20gdG8gcmVwb3J0IHVzZXIgYWdlbnRzIHdlIGNvbnRyb2wuXG4gKi9cbmNvbnN0IFZBTElEX1VTRVJfQUdFTlRTID0gWydhd3MtYmxvY2tzJ107XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVsZW1ldHJ5U2Vzc2lvblByb3BzIHtcbiAgcmVhZG9ubHkgaW9Ib3N0OiBDbGlJb0hvc3Q7XG4gIHJlYWRvbmx5IGNsaWVudDogSVRlbGVtZXRyeVNpbms7XG4gIHJlYWRvbmx5IGFyZ3VtZW50czogYW55O1xuICByZWFkb25seSBjb250ZXh0OiBDb250ZXh0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlbGVtZXRyeUV2ZW50IHtcbiAgcmVhZG9ubHkgZXZlbnRUeXBlOiBFdmVudFR5cGU7XG4gIHJlYWRvbmx5IGR1cmF0aW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IGVycm9yPzogRXJyb3JEZXRhaWxzO1xuICByZWFkb25seSBjb3VudGVycz86IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG59XG5cbi8qKlxuICogVGltZXIgb2YgYSBzaW5nbGUgZXZlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1pbmcge1xuICAvKipcbiAgICogVG90YWwgdGltZSBzcGVudCBpbiB0aGlzIG9wZXJhdGlvblxuICAgKi9cbiAgdG90YWxNczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDb3VudCBvZiBvcGVyYXRpb25zIHRoYXQgdG9nZXRoZXIgdG9vayBgdG90YWxNc2AuXG4gICAqL1xuICBjb3VudDogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgVGVsZW1ldHJ5U2Vzc2lvbiB7XG4gIHByaXZhdGUgaW9Ib3N0OiBDbGlJb0hvc3Q7XG4gIHByaXZhdGUgY2xpZW50OiBJVGVsZW1ldHJ5U2luaztcbiAgcHJpdmF0ZSBfc2Vzc2lvbkluZm8/OiBTZXNzaW9uU2NoZW1hO1xuICBwcml2YXRlIHNwYW4/OiBJTWVzc2FnZVNwYW48RXZlbnRSZXN1bHQ+O1xuICBwcml2YXRlIF9uZXh0RXZlbnRDb3VudGVycz86IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG4gIHByaXZhdGUgY291bnQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IFRlbGVtZXRyeVNlc3Npb25Qcm9wcykge1xuICAgIHRoaXMuaW9Ib3N0ID0gcHJvcHMuaW9Ib3N0O1xuICAgIHRoaXMuY2xpZW50ID0gcHJvcHMuY2xpZW50O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGJlZ2luKCkge1xuICAgIC8vIHNhbml0aXplIHRoZSByYXcgY2xpIGlucHV0XG4gICAgY29uc3QgeyBwYXRoLCBwYXJhbWV0ZXJzIH0gPSBzYW5pdGl6ZUNvbW1hbmRMaW5lQXJndW1lbnRzKHRoaXMucHJvcHMuYXJndW1lbnRzKTtcbiAgICB0aGlzLl9zZXNzaW9uSW5mbyA9IHtcbiAgICAgIGlkZW50aWZpZXJzOiB7XG4gICAgICAgIGluc3RhbGxhdGlvbklkOiBhd2FpdCBnZXRPckNyZWF0ZUluc3RhbGxhdGlvbklkKHRoaXMuaW9Ib3N0LmFzSW9IZWxwZXIoKSksXG4gICAgICAgIHNlc3Npb25JZDogcmFuZG9tVVVJRCgpLFxuICAgICAgICB0ZWxlbWV0cnlWZXJzaW9uOiAnMi4wJyxcbiAgICAgICAgY2RrQ2xpVmVyc2lvbjogdmVyc2lvbk51bWJlcigpLFxuICAgICAgICBjZGtMaWJyYXJ5VmVyc2lvbjogYXdhaXQgZ2V0TGlicmFyeVZlcnNpb24odGhpcy5pb0hvc3QuYXNJb0hlbHBlcigpKSxcbiAgICAgIH0sXG4gICAgICBldmVudDoge1xuICAgICAgICBjb21tYW5kOiB7XG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgY29udGV4dDogc2FuaXRpemVDb250ZXh0KHRoaXMucHJvcHMuY29udGV4dCksXG4gICAgICAgICAgICAuLi4oaXNWYWxpZFdyYXBwZXJVc2VyQWdlbnQocHJvY2Vzcy5lbnYuQ0RLX0NMSV9VU0VSQUdFTlQpXG4gICAgICAgICAgICAgID8geyBjZGtDbGlVc2VyQWdlbnQ6IHsgW3Byb2Nlc3MuZW52LkNES19DTElfVVNFUkFHRU5UXTogdHJ1ZSB9IH1cbiAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBjaTogaXNDSSgpIHx8IEJvb2xlYW4oZGV0ZWN0Q2lTeXN0ZW0oKSksXG4gICAgICAgIG9zOiB7XG4gICAgICAgICAgcGxhdGZvcm06IHByb2Nlc3MucGxhdGZvcm0sXG4gICAgICAgICAgcmVsZWFzZTogcHJvY2Vzcy5yZWxlYXNlLm5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIG5vZGVWZXJzaW9uOiBwcm9jZXNzLnZlcnNpb24sXG4gICAgICB9LFxuICAgICAgcHJvamVjdDoge30sXG4gICAgfTtcblxuICAgIC8vIElmIFNJR0lOVCBoYXMgYSBsaXN0ZW5lciBpbnN0YWxsZWQsIGl0cyBkZWZhdWx0IGJlaGF2aW9yIHdpbGwgYmUgcmVtb3ZlZCAoTm9kZS5qcyB3aWxsIG5vIGxvbmdlciBleGl0KS5cbiAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCBvbiBTSUdJTlQgd2UgcHJvY2VzcyBzYWZlbHkgY2xvc2UgdGhlIHRlbGVtZXRyeSBzZXNzaW9uIGJlZm9yZSBleGl0aW5nLlxuICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsIGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5kKHtcbiAgICAgICAgICBuYW1lOiBVU0VSX0lOVEVSUlVQVEVEX0NPREUsXG4gICAgICAgICAgbWVzc2FnZTogQUJPUlRFRF9FUlJPUl9NRVNTQUdFLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBhd2FpdCB0aGlzLmlvSG9zdC5kZWZhdWx0cy50cmFjZShgRW5kaW5nIFRlbGVtZXRyeSBmYWlsZWQ6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH0pO1xuXG4gICAgLy8gQmVnaW4gdGhlIHNlc3Npb24gc3BhblxuICAgIHRoaXMuc3BhbiA9IGF3YWl0IHRoaXMuaW9Ib3N0LmFzSW9IZWxwZXIoKS5zcGFuKENMSV9QUklWQVRFX1NQQU4uQ09NTUFORCkuYmVnaW4oe30pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGF0dGFjaFJlZ2lvbihyZWdpb246IHN0cmluZykge1xuICAgIHRoaXMuc2Vzc2lvbkluZm8uaWRlbnRpZmllcnMgPSB7XG4gICAgICAuLi50aGlzLnNlc3Npb25JbmZvLmlkZW50aWZpZXJzLFxuICAgICAgcmVnaW9uLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIGEgbGFuZ3VhZ2UgZ3Vlc3NcbiAgICovXG4gIHB1YmxpYyBhdHRhY2hMYW5ndWFnZShsYW5ndWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgLy8gRG9uJ3Qgd2FudCB0byBjcmFzaCBhY2NpZGVudGFsbHlcbiAgICBpZiAoIXRoaXMuX3Nlc3Npb25JbmZvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGxhbmd1YWdlKSB7XG4gICAgICBtdXRhYmxlKHRoaXMuc2Vzc2lvbkluZm8ucHJvamVjdCkubGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIG91ciBiZXN0IGd1ZXNzIGF0IHJ1bm5pbmcgdW5kZXIgYW4gYWdlbnQgb3Igbm90XG4gICAqL1xuICBwdWJsaWMgYXR0YWNoQWdlbnQoaXNBZ2VudDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIC8vIERvbid0IHdhbnQgdG8gY3Jhc2ggYWNjaWRlbnRhbGx5XG4gICAgaWYgKCF0aGlzLl9zZXNzaW9uSW5mbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG11dGFibGUodGhpcy5zZXNzaW9uSW5mby5lbnZpcm9ubWVudCkuYWdlbnQgPSBpc0FnZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFRlbXBvcmFyaWx5IGF0dGFjaCBjb3VudGVycyBmb3IgdGhlIG5leHQgZXZlbnQgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBUaGV5IG1heSBiZSBjb21taXR0ZWQgdG8gdGhlIHNlbnQgdGVsZW1ldHJ5IGxhdGVyLlxuICAgKi9cbiAgcHVibGljIGF0dGFjaENvdW50ZXJzVG9OZXh0RXZlbnQoY291bnRlcnM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4pIHtcbiAgICB0aGlzLl9uZXh0RXZlbnRDb3VudGVycyA9IGNvdW50ZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCB0aGUgQ0RLIGxpYnJhcnkgdmVyc2lvblxuICAgKlxuICAgKiBCeSBkZWZhdWx0IHRoZSB0ZWxlbWV0cnkgd2lsbCBndWVzcyBhdCB0aGUgQ0RLIGxpYnJhcnkgdmVyc2lvbiBpZiBpdCBzb1xuICAgKiBoYXBwZW5zIHRoYXQgdGhlIENESyBwcm9qZWN0IGlzIGFuIE5QTSBwcm9qZWN0IGFuZCB0aGUgQ0RLIENMSSBpcyBleGVjdXRlZFxuICAgKiBpbiB0aGUgcm9vdCBvZiBOUE0gcHJvamVjdCB3aXRoIGBhd3MtY2RrLWxpYmAgYXZhaWxhYmxlIGluIGBub2RlX21vZHVsZXNgLlxuICAgKiBUaGlzIG1heSBzdWNjZWVkIG9yIG1heSBmYWlsLlxuICAgKlxuICAgKiBPbmNlIHdlIGhhdmUgcHJvZHVjZWQgYW5kIGxvYWRlZCB0aGUgY2xvdWQgYXNzZW1ibHkgbW9yZSBhY2N1cmF0ZVxuICAgKiBpbmZvcm1hdGlvbiBiZWNvbWVzIGF2YWlsYWJsZSB0aGF0IHdlIGNhbiBhZGQgaW4uXG4gICAqL1xuICBwdWJsaWMgYXR0YWNoQ2RrTGliVmVyc2lvbihsaWJWZXJzaW9uOiBzdHJpbmcpIHtcbiAgICAvLyBEb24ndCB3YW50IHRvIGNyYXNoIGFjY2lkZW50YWxseVxuICAgIGlmICghdGhpcy5fc2Vzc2lvbkluZm8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBtdXRhYmxlKHRoaXMuc2Vzc2lvbkluZm8uaWRlbnRpZmllcnMpLmNka0xpYnJhcnlWZXJzaW9uID0gbGliVmVyc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBjb21tYW5kIGlzIGNvbXBsZXRlLCBzbyBpcyB0aGUgQ2xpSW9Ib3N0LiBFbmRzIHRoZSBzcGFuIG9mIHRoZSBlbnRpcmUgQ2xpSW9Ib3N0XG4gICAqIGFuZCBub3RpZmllcyB3aXRoIGFuIG9wdGlvbmFsIGVycm9yIG1lc3NhZ2UgaW4gdGhlIGRhdGEuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW5kKGVycm9yPzogRXJyb3JEZXRhaWxzKSB7XG4gICAgYXdhaXQgdGhpcy5zcGFuPy5lbmQoeyBlcnJvciB9KTtcbiAgICAvLyBJZGVhbGx5IHNwYW4uZW5kKCkgc2hvdWxkIG5vLW9wIGlmIGNhbGxlZCB0d2ljZSwgYnV0IHRoYXQgaXMgbm90IHRoZSBjYXNlIHJpZ2h0IG5vd1xuICAgIHRoaXMuc3BhbiA9IHVuZGVmaW5lZDtcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5mbHVzaCgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGVtaXQoZXZlbnQ6IFRlbGVtZXRyeUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jb3VudCArPSAxO1xuXG4gICAgY29uc3QgY291bnRlcnMgPSB7XG4gICAgICAuLi50aGlzLl9uZXh0RXZlbnRDb3VudGVycyxcbiAgICAgIC4uLmV2ZW50LmNvdW50ZXJzLFxuICAgIH07XG4gICAgdGhpcy5fbmV4dEV2ZW50Q291bnRlcnMgPSB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZW1pdCh7XG4gICAgICBldmVudDoge1xuICAgICAgICBjb21tYW5kOiB0aGlzLnNlc3Npb25JbmZvLmV2ZW50LmNvbW1hbmQsXG4gICAgICAgIHN0YXRlOiBnZXRTdGF0ZShldmVudC5lcnJvciksXG4gICAgICAgIGV2ZW50VHlwZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgfSxcbiAgICAgIGlkZW50aWZpZXJzOiB7XG4gICAgICAgIC4uLnRoaXMuc2Vzc2lvbkluZm8uaWRlbnRpZmllcnMsXG4gICAgICAgIGV2ZW50SWQ6IGAke3RoaXMuc2Vzc2lvbkluZm8uaWRlbnRpZmllcnMuc2Vzc2lvbklkfToke3RoaXMuY291bnR9YCxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9LFxuICAgICAgZW52aXJvbm1lbnQ6IHRoaXMuc2Vzc2lvbkluZm8uZW52aXJvbm1lbnQsXG4gICAgICBwcm9qZWN0OiB0aGlzLnNlc3Npb25JbmZvLnByb2plY3QsXG4gICAgICBkdXJhdGlvbjoge1xuICAgICAgICB0b3RhbDogZXZlbnQuZHVyYXRpb24sXG4gICAgICB9LFxuICAgICAgLi4uKGV2ZW50LmVycm9yID8ge1xuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIG5hbWU6IGV2ZW50LmVycm9yLm5hbWUsXG4gICAgICAgIH0sXG4gICAgICB9IDoge30pLFxuICAgICAgLi4uKE9iamVjdC5rZXlzKGNvdW50ZXJzKS5sZW5ndGggPiAwID8geyBjb3VudGVycyB9IDoge30pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgc2Vzc2lvbkluZm8oKTogU2Vzc2lvblNjaGVtYSB7XG4gICAgaWYgKCF0aGlzLl9zZXNzaW9uSW5mbykge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignU2Vzc2lvbk5vdEluaXRpYWxpemVkJywgJ1Nlc3Npb24gSW5mbyBub3QgaW5pdGlhbGl6ZWQuIENhbGwgYmVnaW4oKSBmaXJzdC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25JbmZvO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0YXRlKGVycm9yPzogRXJyb3JEZXRhaWxzKTogU3RhdGUge1xuICBpZiAoZXJyb3IpIHtcbiAgICByZXR1cm4gaXNBYm9ydGVkRXJyb3IoZXJyb3IpID8gJ0FCT1JURUQnIDogJ0ZBSUxFRCc7XG4gIH1cbiAgcmV0dXJuICdTVUNDRUVERUQnO1xufVxuXG5mdW5jdGlvbiBpc0Fib3J0ZWRFcnJvcihlcnJvcj86IEVycm9yRGV0YWlscykge1xuICBpZiAoZXJyb3I/Lm5hbWUgPT09ICdUb29sa2l0RXJyb3InICYmIGVycm9yPy5tZXNzYWdlPy5pbmNsdWRlcyhBQk9SVEVEX0VSUk9SX01FU1NBR0UpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBtdXRhYmxlPEEgZXh0ZW5kcyBvYmplY3Q+KHg6IEEpOiB7IC1yZWFkb25seSBbayBpbiBrZXlvZiBBXTogQVtrXSB9IHtcbiAgcmV0dXJuIHg7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoYXQgdGhlIENES19DTElfVVNFUkFHRU5UIGVudiB2YXIgdmFsdWUgbWF0Y2hlc1xuICogdGhlIGV4cGVjdGVkIGZvcm1hdDogYDxuYW1lPi88dmVyc2lvbj4vPG1vZGU+YCB3aGVyZSBuYW1lIGlzIG9uZSBvZlxuICogVkFMSURfVVNFUl9BR0VOVFMgYW5kIG1vZGUgaXMgZWl0aGVyIGBzYW5kYm94YCBvciBgcHJvZHVjdGlvbmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkV3JhcHBlclVzZXJBZ2VudCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogdmFsdWUgaXMgc3RyaW5nIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwYXJ0cyA9IHZhbHVlLnNwbGl0KCcvJyk7XG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgW25hbWUsIF92ZXJzaW9uLCBtb2RlXSA9IHBhcnRzO1xuICBpZiAoIVZBTElEX1VTRVJfQUdFTlRTLmluY2x1ZGVzKG5hbWUpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBtb2RlID09PSAnc2FuZGJveCcgfHwgbW9kZSA9PT0gJ3Byb2R1Y3Rpb24nO1xufVxuIl19