UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

214 lines (169 loc) 21.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.runtimeContext = runtimeContext; exports.inTransaction = inTransaction; exports.default = exports.EnvironmentImpl = exports.TRANSACTION = void 0; var _env = require("@glimmer/env"); var _util = require("@glimmer/util"); var _validator = require("@glimmer/validator"); var _helper = require("./dom/helper"); var _program = require("@glimmer/program"); var _debugRenderTree = _interopRequireDefault(require("./debug-render-tree")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _a; const TRANSACTION = (0, _util.symbol)('TRANSACTION'); exports.TRANSACTION = TRANSACTION; class TransactionImpl { constructor() { this.scheduledInstallModifiers = []; this.scheduledUpdateModifiers = []; this.createdComponents = []; this.updatedComponents = []; } didCreate(component) { this.createdComponents.push(component); } didUpdate(component) { this.updatedComponents.push(component); } scheduleInstallModifier(modifier) { this.scheduledInstallModifiers.push(modifier); } scheduleUpdateModifier(modifier) { this.scheduledUpdateModifiers.push(modifier); } commit() { let { createdComponents, updatedComponents } = this; for (let i = 0; i < createdComponents.length; i++) { let { manager, state } = createdComponents[i]; manager.didCreate(state); } for (let i = 0; i < updatedComponents.length; i++) { let { manager, state } = updatedComponents[i]; manager.didUpdate(state); } let { scheduledInstallModifiers, scheduledUpdateModifiers } = this; // Prevent a transpilation issue we guard against in Ember, the // throw-if-closure-required issue let manager, state; for (let i = 0; i < scheduledInstallModifiers.length; i++) { let modifier = scheduledInstallModifiers[i]; manager = modifier.manager; state = modifier.state; let modifierTag = manager.getTag(state); if (modifierTag !== null) { let tag = (0, _validator.track)( // eslint-disable-next-line no-loop-func () => manager.install(state), _env.DEBUG && `- While rendering:\n (instance of a \`${modifier.definition.resolvedName || manager.getDebugName(modifier.definition.state)}\` modifier)`); (0, _validator.updateTag)(modifierTag, tag); } else { manager.install(state); } } for (let i = 0; i < scheduledUpdateModifiers.length; i++) { let modifier = scheduledUpdateModifiers[i]; manager = modifier.manager; state = modifier.state; let modifierTag = manager.getTag(state); if (modifierTag !== null) { let tag = (0, _validator.track)( // eslint-disable-next-line no-loop-func () => manager.update(state), _env.DEBUG && `- While rendering:\n (instance of a \`${modifier.definition.resolvedName || manager.getDebugName(modifier.definition.state)}\` modifier)`); (0, _validator.updateTag)(modifierTag, tag); } else { manager.update(state); } } } } class EnvironmentImpl { constructor(options, delegate) { this.delegate = delegate; this[_a] = null; // Delegate methods and values this.isInteractive = this.delegate.isInteractive; this.debugRenderTree = this.delegate.enableDebugTooling ? new _debugRenderTree.default() : undefined; if (options.appendOperations) { this.appendOperations = options.appendOperations; this.updateOperations = options.updateOperations; } else if (options.document) { this.appendOperations = new _helper.DOMTreeConstruction(options.document); this.updateOperations = new _helper.DOMChangesImpl(options.document); } else if (_env.DEBUG) { throw new Error('you must pass document or appendOperations to a new runtime'); } } getAppendOperations() { return this.appendOperations; } getDOM() { return this.updateOperations; } begin() { var _b; false && (0, _util.assert)(!this[TRANSACTION], 'A glimmer transaction was begun, but one already exists. You may have a nested transaction, possibly caused by an earlier runtime exception while rendering. Please check your console for the stack trace of any prior exceptions.'); (_b = this.debugRenderTree) === null || _b === void 0 ? void 0 : _b.begin(); this[TRANSACTION] = new TransactionImpl(); } get transaction() { return this[TRANSACTION]; } didCreate(component) { this.transaction.didCreate(component); } didUpdate(component) { this.transaction.didUpdate(component); } scheduleInstallModifier(modifier) { if (this.isInteractive) { this.transaction.scheduleInstallModifier(modifier); } } scheduleUpdateModifier(modifier) { if (this.isInteractive) { this.transaction.scheduleUpdateModifier(modifier); } } commit() { var _b; let transaction = this.transaction; this[TRANSACTION] = null; transaction.commit(); (_b = this.debugRenderTree) === null || _b === void 0 ? void 0 : _b.commit(); this.delegate.onTransactionCommit(); } } exports.EnvironmentImpl = EnvironmentImpl; _a = TRANSACTION; function runtimeContext(options, delegate, artifacts, resolver) { return { env: new EnvironmentImpl(options, delegate), program: new _program.RuntimeProgramImpl(artifacts.constants, artifacts.heap), resolver: resolver }; } function inTransaction(env, cb) { if (!env[TRANSACTION]) { env.begin(); try { cb(); } finally { env.commit(); } } else { cb(); } } var _default = EnvironmentImpl; exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2Vudmlyb25tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztBQWlCQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7O0FBRU8sTUFBTSxXQUFXLEdBQXNCLGtCQUF2QyxhQUF1QyxDQUF2Qzs7O0FBRVAsTUFBQSxlQUFBLENBQXFCO0FBQXJCLEVBQUEsV0FBQSxHQUFBO0FBQ1MsU0FBQSx5QkFBQSxHQUFBLEVBQUE7QUFDQSxTQUFBLHdCQUFBLEdBQUEsRUFBQTtBQUNBLFNBQUEsaUJBQUEsR0FBQSxFQUFBO0FBQ0EsU0FBQSxpQkFBQSxHQUFBLEVBQUE7QUFpRlI7O0FBL0VDLEVBQUEsU0FBUyxDQUFBLFNBQUEsRUFBdUM7QUFDOUMsU0FBQSxpQkFBQSxDQUFBLElBQUEsQ0FBQSxTQUFBO0FBQ0Q7O0FBRUQsRUFBQSxTQUFTLENBQUEsU0FBQSxFQUF1QztBQUM5QyxTQUFBLGlCQUFBLENBQUEsSUFBQSxDQUFBLFNBQUE7QUFDRDs7QUFFRCxFQUFBLHVCQUF1QixDQUFBLFFBQUEsRUFBMkI7QUFDaEQsU0FBQSx5QkFBQSxDQUFBLElBQUEsQ0FBQSxRQUFBO0FBQ0Q7O0FBRUQsRUFBQSxzQkFBc0IsQ0FBQSxRQUFBLEVBQTJCO0FBQy9DLFNBQUEsd0JBQUEsQ0FBQSxJQUFBLENBQUEsUUFBQTtBQUNEOztBQUVELEVBQUEsTUFBTSxHQUFBO0FBQ0osUUFBSTtBQUFBLE1BQUEsaUJBQUE7QUFBcUIsTUFBQTtBQUFyQixRQUFKLElBQUE7O0FBRUEsU0FBSyxJQUFJLENBQUMsR0FBVixDQUFBLEVBQWdCLENBQUMsR0FBRyxpQkFBaUIsQ0FBckMsTUFBQSxFQUE4QyxDQUE5QyxFQUFBLEVBQW1EO0FBQ2pELFVBQUk7QUFBQSxRQUFBLE9BQUE7QUFBVyxRQUFBO0FBQVgsVUFBcUIsaUJBQWlCLENBQTFDLENBQTBDLENBQTFDO0FBQ0EsTUFBQSxPQUFP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IEVudmlyb25tZW50LFxuICBFbnZpcm9ubWVudE9wdGlvbnMsXG4gIEdsaW1tZXJUcmVlQ2hhbmdlcyxcbiAgR2xpbW1lclRyZWVDb25zdHJ1Y3Rpb24sXG4gIFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvblN5bWJvbCxcbiAgUnVudGltZUNvbnRleHQsXG4gIFJ1bnRpbWVSZXNvbHZlcixcbiAgT3B0aW9uLFxuICBSdW50aW1lQXJ0aWZhY3RzLFxuICBDb21wb25lbnRJbnN0YW5jZVdpdGhDcmVhdGUsXG4gIE1vZGlmaWVySW5zdGFuY2UsXG4gIEludGVybmFsTW9kaWZpZXJNYW5hZ2VyLFxuICBNb2RpZmllckluc3RhbmNlU3RhdGUsXG59IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYXNzZXJ0LCBleHBlY3QsIHN5bWJvbCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgdHJhY2ssIHVwZGF0ZVRhZyB9IGZyb20gJ0BnbGltbWVyL3ZhbGlkYXRvcic7XG5pbXBvcnQgeyBET01DaGFuZ2VzSW1wbCwgRE9NVHJlZUNvbnN0cnVjdGlvbiB9IGZyb20gJy4vZG9tL2hlbHBlcic7XG5pbXBvcnQgeyBSdW50aW1lUHJvZ3JhbUltcGwgfSBmcm9tICdAZ2xpbW1lci9wcm9ncmFtJztcbmltcG9ydCBEZWJ1Z1JlbmRlclRyZWUgZnJvbSAnLi9kZWJ1Zy1yZW5kZXItdHJlZSc7XG5cbmV4cG9ydCBjb25zdCBUUkFOU0FDVElPTjogVHJhbnNhY3Rpb25TeW1ib2wgPSBzeW1ib2woJ1RSQU5TQUNUSU9OJyk7XG5cbmNsYXNzIFRyYW5zYWN0aW9uSW1wbCBpbXBsZW1lbnRzIFRyYW5zYWN0aW9uIHtcbiAgcHVibGljIHNjaGVkdWxlZEluc3RhbGxNb2RpZmllcnM6IE1vZGlmaWVySW5zdGFuY2VbXSA9IFtdO1xuICBwdWJsaWMgc2NoZWR1bGVkVXBkYXRlTW9kaWZpZXJzOiBNb2RpZmllckluc3RhbmNlW10gPSBbXTtcbiAgcHVibGljIGNyZWF0ZWRDb21wb25lbnRzOiBDb21wb25lbnRJbnN0YW5jZVdpdGhDcmVhdGVbXSA9IFtdO1xuICBwdWJsaWMgdXBkYXRlZENvbXBvbmVudHM6IENvbXBvbmVudEluc3RhbmNlV2l0aENyZWF0ZVtdID0gW107XG5cbiAgZGlkQ3JlYXRlKGNvbXBvbmVudDogQ29tcG9uZW50SW5zdGFuY2VXaXRoQ3JlYXRlKSB7XG4gICAgdGhpcy5jcmVhdGVkQ29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gIH1cblxuICBkaWRVcGRhdGUoY29tcG9uZW50OiBDb21wb25lbnRJbnN0YW5jZVdpdGhDcmVhdGUpIHtcbiAgICB0aGlzLnVwZGF0ZWRDb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgfVxuXG4gIHNjaGVkdWxlSW5zdGFsbE1vZGlmaWVyKG1vZGlmaWVyOiBNb2RpZmllckluc3RhbmNlKSB7XG4gICAgdGhpcy5zY2hlZHVsZWRJbnN0YWxsTW9kaWZpZXJzLnB1c2gobW9kaWZpZXIpO1xuICB9XG5cbiAgc2NoZWR1bGVVcGRhdGVNb2RpZmllcihtb2RpZmllcjogTW9kaWZpZXJJbnN0YW5jZSkge1xuICAgIHRoaXMuc2NoZWR1bGVkVXBkYXRlTW9kaWZpZXJzLnB1c2gobW9kaWZpZXIpO1xuICB9XG5cbiAgY29tbWl0KCkge1xuICAgIGxldCB7IGNyZWF0ZWRDb21wb25lbnRzLCB1cGRhdGVkQ29tcG9uZW50cyB9ID0gdGhpcztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3JlYXRlZENvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCB7IG1hbmFnZXIsIHN0YXRlIH0gPSBjcmVhdGVkQ29tcG9uZW50c1tpXTtcbiAgICAgIG1hbmFnZXIuZGlkQ3JlYXRlKHN0YXRlKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVwZGF0ZWRDb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgeyBtYW5hZ2VyLCBzdGF0ZSB9ID0gdXBkYXRlZENvbXBvbmVudHNbaV07XG4gICAgICBtYW5hZ2VyLmRpZFVwZGF0ZShzdGF0ZSk7XG4gICAgfVxuXG4gICAgbGV0IHsgc2NoZWR1bGVkSW5zdGFsbE1vZGlmaWVycywgc2NoZWR1bGVkVXBkYXRlTW9kaWZpZXJzIH0gPSB0aGlzO1xuXG4gICAgLy8gUHJldmVudCBhIHRyYW5zcGlsYXRpb24gaXNzdWUgd2UgZ3VhcmQgYWdhaW5zdCBpbiBFbWJlciwgdGhlXG4gICAgLy8gdGhyb3ctaWYtY2xvc3VyZS1yZXF1aXJlZCBpc3N1ZVxuICAgIGxldCBtYW5hZ2VyOiBJbnRlcm5hbE1vZGlmaWVyTWFuYWdlciwgc3RhdGU6IE1vZGlmaWVySW5zdGFuY2VTdGF0ZTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZWR1bGVkSW5zdGFsbE1vZGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IG1vZGlmaWVyID0gc2NoZWR1bGVkSW5zdGFsbE1vZGlmaWVyc1tpXTtcbiAgICAgIG1hbmFnZXIgPSBtb2RpZmllci5tYW5hZ2VyO1xuICAgICAgc3RhdGUgPSBtb2RpZmllci5zdGF0ZTtcblxuICAgICAgbGV0IG1vZGlmaWVyVGFnID0gbWFuYWdlci5nZXRUYWcoc3RhdGUpO1xuXG4gICAgICBpZiAobW9kaWZpZXJUYWcgIT09IG51bGwpIHtcbiAgICAgICAgbGV0IHRhZyA9IHRyYWNrKFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sb29wLWZ1bmNcbiAgICAgICAgICAoKSA9PiBtYW5hZ2VyLmluc3RhbGwoc3RhdGUpLFxuICAgICAgICAgIERFQlVHICYmXG4gICAgICAgICAgICBgLSBXaGlsZSByZW5kZXJpbmc6XFxuICAoaW5zdGFuY2Ugb2YgYSBcXGAke1xuICAgICAgICAgICAgICBtb2RpZmllci5kZWZpbml0aW9uLnJlc29sdmVkTmFtZSB8fCBtYW5hZ2VyLmdldERlYnVnTmFtZShtb2RpZmllci5kZWZpbml0aW9uLnN0YXRlKVxuICAgICAgICAgICAgfVxcYCBtb2RpZmllcilgXG4gICAgICAgICk7XG4gICAgICAgIHVwZGF0ZVRhZyhtb2RpZmllclRhZywgdGFnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hbmFnZXIuaW5zdGFsbChzdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlZHVsZWRVcGRhdGVNb2RpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBtb2RpZmllciA9IHNjaGVkdWxlZFVwZGF0ZU1vZGlmaWVyc1tpXTtcbiAgICAgIG1hbmFnZXIgPSBtb2RpZmllci5tYW5hZ2VyO1xuICAgICAgc3RhdGUgPSBtb2RpZmllci5zdGF0ZTtcblxuICAgICAgbGV0IG1vZGlmaWVyVGFnID0gbWFuYWdlci5nZXRUYWcoc3RhdGUpO1xuXG4gICAgICBpZiAobW9kaWZpZXJUYWcgIT09IG51bGwpIHtcbiAgICAgICAgbGV0IHRhZyA9IHRyYWNrKFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sb29wLWZ1bmNcbiAgICAgICAgICAoKSA9PiBtYW5hZ2VyLnVwZGF0ZShzdGF0ZSksXG4gICAgICAgICAgREVCVUcgJiZcbiAgICAgICAgICAgIGAtIFdoaWxlIHJlbmRlcmluZzpcXG4gIChpbnN0YW5jZSBvZiBhIFxcYCR7XG4gICAgICAgICAgICAgIG1vZGlmaWVyLmRlZmluaXRpb24ucmVzb2x2ZWROYW1lIHx8IG1hbmFnZXIuZ2V0RGVidWdOYW1lKG1vZGlmaWVyLmRlZmluaXRpb24uc3RhdGUpXG4gICAgICAgICAgICB9XFxgIG1vZGlmaWVyKWBcbiAgICAgICAgKTtcbiAgICAgICAgdXBkYXRlVGFnKG1vZGlmaWVyVGFnLCB0YWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFuYWdlci51cGRhdGUoc3RhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW52aXJvbm1lbnRJbXBsIGltcGxlbWVudHMgRW52aXJvbm1lbnQge1xuICBbVFJBTlNBQ1RJT05dOiBPcHRpb248VHJhbnNhY3Rpb25JbXBsPiA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIGFwcGVuZE9wZXJhdGlvbnMhOiBHbGltbWVyVHJlZUNvbnN0cnVjdGlvbjtcbiAgcHJvdGVjdGVkIHVwZGF0ZU9wZXJhdGlvbnM/OiBHbGltbWVyVHJlZUNoYW5nZXM7XG5cbiAgLy8gRGVsZWdhdGUgbWV0aG9kcyBhbmQgdmFsdWVzXG4gIHB1YmxpYyBpc0ludGVyYWN0aXZlID0gdGhpcy5kZWxlZ2F0ZS5pc0ludGVyYWN0aXZlO1xuXG4gIGRlYnVnUmVuZGVyVHJlZSA9IHRoaXMuZGVsZWdhdGUuZW5hYmxlRGVidWdUb29saW5nID8gbmV3IERlYnVnUmVuZGVyVHJlZSgpIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9ucywgcHJpdmF0ZSBkZWxlZ2F0ZTogRW52aXJvbm1lbnREZWxlZ2F0ZSkge1xuICAgIGlmIChvcHRpb25zLmFwcGVuZE9wZXJhdGlvbnMpIHtcbiAgICAgIHRoaXMuYXBwZW5kT3BlcmF0aW9ucyA9IG9wdGlvbnMuYXBwZW5kT3BlcmF0aW9ucztcbiAgICAgIHRoaXMudXBkYXRlT3BlcmF0aW9ucyA9IG9wdGlvbnMudXBkYXRlT3BlcmF0aW9ucztcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZG9jdW1lbnQpIHtcbiAgICAgIHRoaXMuYXBwZW5kT3BlcmF0aW9ucyA9IG5ldyBET01UcmVlQ29uc3RydWN0aW9uKG9wdGlvbnMuZG9jdW1lbnQpO1xuICAgICAgdGhpcy51cGRhdGVPcGVyYXRpb25zID0gbmV3IERPTUNoYW5nZXNJbXBsKG9wdGlvbnMuZG9jdW1lbnQpO1xuICAgIH0gZWxzZSBpZiAoREVCVUcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigneW91IG11c3QgcGFzcyBkb2N1bWVudCBvciBhcHBlbmRPcGVyYXRpb25zIHRvIGEgbmV3IHJ1bnRpbWUnKTtcbiAgICB9XG4gIH1cblxuICBnZXRBcHBlbmRPcGVyYXRpb25zKCk6IEdsaW1tZXJUcmVlQ29uc3RydWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5hcHBlbmRPcGVyYXRpb25zO1xuICB9XG5cbiAgZ2V0RE9NKCk6IEdsaW1tZXJUcmVlQ2hhbmdlcyB7XG4gICAgcmV0dXJuIGV4cGVjdChcbiAgICAgIHRoaXMudXBkYXRlT3BlcmF0aW9ucyxcbiAgICAgICdBdHRlbXB0ZWQgdG8gZ2V0IERPTSB1cGRhdGVPcGVyYXRpb25zLCBidXQgdGhleSB3ZXJlIG5vdCBwcm92aWRlZCBieSB0aGUgZW52aXJvbm1lbnQuIFlvdSBtYXkgYmUgYXR0ZW1wdGluZyB0byByZXJlbmRlciBpbiBhbiBlbnZpcm9ubWVudCB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IHJlcmVuZGVyaW5nLCBzdWNoIGFzIFNTUi4nXG4gICAgKTtcbiAgfVxuXG4gIGJlZ2luKCkge1xuICAgIGFzc2VydChcbiAgICAgICF0aGlzW1RSQU5TQUNUSU9OXSxcbiAgICAgICdBIGdsaW1tZXIgdHJhbnNhY3Rpb24gd2FzIGJlZ3VuLCBidXQgb25lIGFscmVhZHkgZXhpc3RzLiBZb3UgbWF5IGhhdmUgYSBuZXN0ZWQgdHJhbnNhY3Rpb24sIHBvc3NpYmx5IGNhdXNlZCBieSBhbiBlYXJsaWVyIHJ1bnRpbWUgZXhjZXB0aW9uIHdoaWxlIHJlbmRlcmluZy4gUGxlYXNlIGNoZWNrIHlvdXIgY29uc29sZSBmb3IgdGhlIHN0YWNrIHRyYWNlIG9mIGFueSBwcmlvciBleGNlcHRpb25zLidcbiAgICApO1xuXG4gICAgdGhpcy5kZWJ1Z1JlbmRlclRyZWU/LmJlZ2luKCk7XG5cbiAgICB0aGlzW1RSQU5TQUNUSU9OXSA9IG5ldyBUcmFuc2FjdGlvbkltcGwoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uSW1wbCB7XG4gICAgcmV0dXJuIGV4cGVjdCh0aGlzW1RSQU5TQUNUSU9OXSEsICdtdXN0IGJlIGluIGEgdHJhbnNhY3Rpb24nKTtcbiAgfVxuXG4gIGRpZENyZWF0ZShjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlV2l0aENyZWF0ZSkge1xuICAgIHRoaXMudHJhbnNhY3Rpb24uZGlkQ3JlYXRlKGNvbXBvbmVudCk7XG4gIH1cblxuICBkaWRVcGRhdGUoY29tcG9uZW50OiBDb21wb25lbnRJbnN0YW5jZVdpdGhDcmVhdGUpIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLmRpZFVwZGF0ZShjb21wb25lbnQpO1xuICB9XG5cbiAgc2NoZWR1bGVJbnN0YWxsTW9kaWZpZXIobW9kaWZpZXI6IE1vZGlmaWVySW5zdGFuY2UpIHtcbiAgICBpZiAodGhpcy5pc0ludGVyYWN0aXZlKSB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLnNjaGVkdWxlSW5zdGFsbE1vZGlmaWVyKG1vZGlmaWVyKTtcbiAgICB9XG4gIH1cblxuICBzY2hlZHVsZVVwZGF0ZU1vZGlmaWVyKG1vZGlmaWVyOiBNb2RpZmllckluc3RhbmNlKSB7XG4gICAgaWYgKHRoaXMuaXNJbnRlcmFjdGl2ZSkge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbi5zY2hlZHVsZVVwZGF0ZU1vZGlmaWVyKG1vZGlmaWVyKTtcbiAgICB9XG4gIH1cblxuICBjb21taXQoKSB7XG4gICAgbGV0IHRyYW5zYWN0aW9uID0gdGhpcy50cmFuc2FjdGlvbjtcbiAgICB0aGlzW1RSQU5TQUNUSU9OXSA9IG51bGw7XG4gICAgdHJhbnNhY3Rpb24uY29tbWl0KCk7XG5cbiAgICB0aGlzLmRlYnVnUmVuZGVyVHJlZT8uY29tbWl0KCk7XG5cbiAgICB0aGlzLmRlbGVnYXRlLm9uVHJhbnNhY3Rpb25Db21taXQoKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50RGVsZWdhdGUge1xuICAvKipcbiAgICogVXNlZCB0byBkZXRlcm1pbmUgdGhlIHRoZSBlbnZpcm9ubWVudCBpcyBpbnRlcmFjdGl2ZSAoZS5nLiBTU1IgaXMgbm90XG4gICAqIGludGVyYWN0aXZlKS4gSW50ZXJhY3RpdmUgZW52aXJvbm1lbnRzIHNjaGVkdWxlIG1vZGlmaWVycywgYW1vbmcgb3RoZXIgdGhpbmdzLlxuICAgKi9cbiAgaXNJbnRlcmFjdGl2ZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVXNlZCB0byBlbmFibGUgZGVidWcgdG9vbGluZ1xuICAgKi9cbiAgZW5hYmxlRGVidWdUb29saW5nOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhbiBlbnZpcm9ubWVudCB0cmFuc2FjdGlvbiBjb21taXRzXG4gICAqL1xuICBvblRyYW5zYWN0aW9uQ29tbWl0OiAoKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVudGltZUNvbnRleHQoXG4gIG9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9ucyxcbiAgZGVsZWdhdGU6IEVudmlyb25tZW50RGVsZWdhdGUsXG4gIGFydGlmYWN0czogUnVudGltZUFydGlmYWN0cyxcbiAgcmVzb2x2ZXI6IFJ1bnRpbWVSZXNvbHZlclxuKTogUnVudGltZUNvbnRleHQge1xuICByZXR1cm4ge1xuICAgIGVudjogbmV3IEVudmlyb25tZW50SW1wbChvcHRpb25zLCBkZWxlZ2F0ZSksXG4gICAgcHJvZ3JhbTogbmV3IFJ1bnRpbWVQcm9ncmFtSW1wbChhcnRpZmFjdHMuY29uc3RhbnRzLCBhcnRpZmFjdHMuaGVhcCksXG4gICAgcmVzb2x2ZXI6IHJlc29sdmVyLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5UcmFuc2FjdGlvbihlbnY6IEVudmlyb25tZW50LCBjYjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICBpZiAoIWVudltUUkFOU0FDVElPTl0pIHtcbiAgICBlbnYuYmVnaW4oKTtcbiAgICB0cnkge1xuICAgICAgY2IoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZW52LmNvbW1pdCgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjYigpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVudmlyb25tZW50SW1wbDtcbiJdLCJzb3VyY2VSb290IjoiIn0=