UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

205 lines (165 loc) 23.1 kB
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var _a; import { DEBUG } from '@glimmer/env'; import { assert, symbol } from '@glimmer/util'; import { track, updateTag } from '@glimmer/validator'; import { DOMChangesImpl, DOMTreeConstruction } from './dom/helper'; import { RuntimeProgramImpl } from '@glimmer/program'; import DebugRenderTree from './debug-render-tree'; export var TRANSACTION = symbol('TRANSACTION'); var TransactionImpl = /*#__PURE__*/function () { function TransactionImpl() { this.scheduledInstallModifiers = []; this.scheduledUpdateModifiers = []; this.createdComponents = []; this.updatedComponents = []; } var _proto = TransactionImpl.prototype; _proto.didCreate = function didCreate(component) { this.createdComponents.push(component); }; _proto.didUpdate = function didUpdate(component) { this.updatedComponents.push(component); }; _proto.scheduleInstallModifier = function scheduleInstallModifier(modifier) { this.scheduledInstallModifiers.push(modifier); }; _proto.scheduleUpdateModifier = function scheduleUpdateModifier(modifier) { this.scheduledUpdateModifiers.push(modifier); }; _proto.commit = function commit() { var createdComponents = this.createdComponents, updatedComponents = this.updatedComponents; for (var i = 0; i < createdComponents.length; i++) { var _createdComponents$i = createdComponents[i], _manager = _createdComponents$i.manager, _state = _createdComponents$i.state; _manager.didCreate(_state); } for (var _i = 0; _i < updatedComponents.length; _i++) { var _updatedComponents$_i = updatedComponents[_i], _manager2 = _updatedComponents$_i.manager, _state2 = _updatedComponents$_i.state; _manager2.didUpdate(_state2); } var scheduledInstallModifiers = this.scheduledInstallModifiers, scheduledUpdateModifiers = this.scheduledUpdateModifiers; // Prevent a transpilation issue we guard against in Ember, the // throw-if-closure-required issue var manager, state; for (var _i2 = 0; _i2 < scheduledInstallModifiers.length; _i2++) { var modifier = scheduledInstallModifiers[_i2]; manager = modifier.manager; state = modifier.state; var modifierTag = manager.getTag(state); if (modifierTag !== null) { var tag = track( // eslint-disable-next-line no-loop-func function () { return manager.install(state); }, DEBUG && "- While rendering:\n (instance of a `" + (modifier.definition.resolvedName || manager.getDebugName(modifier.definition.state)) + "` modifier)"); updateTag(modifierTag, tag); } else { manager.install(state); } } for (var _i3 = 0; _i3 < scheduledUpdateModifiers.length; _i3++) { var _modifier = scheduledUpdateModifiers[_i3]; manager = _modifier.manager; state = _modifier.state; var _modifierTag = manager.getTag(state); if (_modifierTag !== null) { var _tag = track( // eslint-disable-next-line no-loop-func function () { return manager.update(state); }, DEBUG && "- While rendering:\n (instance of a `" + (_modifier.definition.resolvedName || manager.getDebugName(_modifier.definition.state)) + "` modifier)"); updateTag(_modifierTag, _tag); } else { manager.update(state); } } }; return TransactionImpl; }(); export var EnvironmentImpl = /*#__PURE__*/function () { function EnvironmentImpl(options, delegate) { this.delegate = delegate; this[_a] = null; // Delegate methods and values this.isInteractive = this.delegate.isInteractive; this.debugRenderTree = this.delegate.enableDebugTooling ? new DebugRenderTree() : undefined; if (options.appendOperations) { this.appendOperations = options.appendOperations; this.updateOperations = options.updateOperations; } else if (options.document) { this.appendOperations = new DOMTreeConstruction(options.document); this.updateOperations = new DOMChangesImpl(options.document); } else if (DEBUG) { throw new Error('you must pass document or appendOperations to a new runtime'); } } var _proto2 = EnvironmentImpl.prototype; _proto2.getAppendOperations = function getAppendOperations() { return this.appendOperations; }; _proto2.getDOM = function getDOM() { return this.updateOperations; }; _proto2.begin = function begin() { var _b; false && 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(); }; _proto2.didCreate = function didCreate(component) { this.transaction.didCreate(component); }; _proto2.didUpdate = function didUpdate(component) { this.transaction.didUpdate(component); }; _proto2.scheduleInstallModifier = function scheduleInstallModifier(modifier) { if (this.isInteractive) { this.transaction.scheduleInstallModifier(modifier); } }; _proto2.scheduleUpdateModifier = function scheduleUpdateModifier(modifier) { if (this.isInteractive) { this.transaction.scheduleUpdateModifier(modifier); } }; _proto2.commit = function commit() { var _b; var transaction = this.transaction; this[TRANSACTION] = null; transaction.commit(); (_b = this.debugRenderTree) === null || _b === void 0 ? void 0 : _b.commit(); this.delegate.onTransactionCommit(); }; _createClass(EnvironmentImpl, [{ key: "transaction", get: function get() { return this[TRANSACTION]; } }]); return EnvironmentImpl; }(); _a = TRANSACTION; export function runtimeContext(options, delegate, artifacts, resolver) { return { env: new EnvironmentImpl(options, delegate), program: new RuntimeProgramImpl(artifacts.constants, artifacts.heap), resolver: resolver }; } export function inTransaction(env, cb) { if (!env[TRANSACTION]) { env.begin(); try { cb(); } finally { env.commit(); } } else { cb(); } } export default EnvironmentImpl; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2Vudmlyb25tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLFNBQUEsS0FBQSxRQUFBLGNBQUE7QUFpQkEsU0FBQSxNQUFBLEVBQUEsTUFBQSxRQUFBLGVBQUE7QUFDQSxTQUFBLEtBQUEsRUFBQSxTQUFBLFFBQUEsb0JBQUE7QUFDQSxTQUFBLGNBQUEsRUFBQSxtQkFBQSxRQUFBLGNBQUE7QUFDQSxTQUFBLGtCQUFBLFFBQUEsa0JBQUE7QUFDQSxPQUFBLGVBQUEsTUFBQSxxQkFBQTtBQUVBLE9BQU8sSUFBTSxXQUFXLEdBQXNCLE1BQU0sQ0FBN0MsYUFBNkMsQ0FBN0M7O0lBRVAsZTtBQUFBLDZCQUFBO0FBQ1MsU0FBQSx5QkFBQSxHQUFBLEVBQUE7QUFDQSxTQUFBLHdCQUFBLEdBQUEsRUFBQTtBQUNBLFNBQUEsaUJBQUEsR0FBQSxFQUFBO0FBQ0EsU0FBQSxpQkFBQSxHQUFBLEVBQUE7QUFpRlI7Ozs7U0EvRUMsUyxHQUFBLG1CQUFTLFNBQVQsRUFBZ0Q7QUFDOUMsU0FBQSxpQkFBQSxDQUFBLElBQUEsQ0FBQSxTQUFBO0FBQ0QsRzs7U0FFRCxTLEdBQUEsbUJBQVMsU0FBVCxFQUFnRDtBQUM5QyxTQUFBLGlCQUFBLENBQUEsSUFBQSxDQUFBLFNBQUE7QUFDRCxHOztTQUVELHVCLEdBQUEsaUNBQXVCLFFBQXZCLEVBQWtEO0FBQ2hELFNBQUEseUJBQUEsQ0FBQSxJQUFBLENBQUEsUUFBQTtBQUNELEc7O1NBRUQsc0IsR0FBQSxnQ0FBc0IsUUFBdEIsRUFBaUQ7QUFDL0MsU0FBQSx3QkFBQSxDQUFBLElBQUEsQ0FBQSxRQUFBO0FBQ0QsRzs7U0FFRCxNLEdBQUEsa0JBQU07QUFBQSxRQUNBLGlCQURBLEdBQ0osSUFESSxDQUNBLGlCQURBO0FBQUEsUUFDcUIsaUJBRHJCLEdBQ0osSUFESSxDQUNxQixpQkFEckI7O0FBR0osU0FBSyxJQUFJLENBQUMs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Q0EsQ0FEQTtBQUVMLElBQUEsT0FBTyxFQUFFLElBQUEsa0JBQUEsQ0FBdUIsU0FBUyxDQUFoQyxTQUFBLEVBQTRDLFNBQVMsQ0FGekQsSUFFSSxDQUZKO0FBR0wsSUFBQSxRQUFRLEVBQUU7QUFITCxHQUFQO0FBS0Q7QUFFRCxPQUFNLFNBQUEsYUFBQSxDQUFBLEdBQUEsRUFBQSxFQUFBLEVBQXdEO0FBQzVELE1BQUksQ0FBQyxHQUFHLENBQVIsV0FBUSxDQUFSLEVBQXVCO0FBQ3JCLElBQUEsR0FBRyxDQUFILEtBQUE7O0FBQ0EsUUFBSTtBQUNGLE1BQUEsRUFBRTtBQURKLEtBQUEsU0FFVTtBQUNSLE1BQUEsR0FBRyxDQUFILE1BQUE7QUFDRDtBQU5ILEdBQUEsTUFPTztBQUNMLElBQUEsRUFBRTtBQUNIO0FBQ0Y7QUFFRCxlQUFBLGVBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBERUJVRyB9IGZyb20gJ0BnbGltbWVyL2Vudic7XG5pbXBvcnQge1xuICBFbnZpcm9ubWVudCxcbiAgRW52aXJvbm1lbnRPcHRpb25zLFxuICBHbGltbWVyVHJlZUNoYW5nZXMsXG4gIEdsaW1tZXJUcmVlQ29uc3RydWN0aW9uLFxuICBUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb25TeW1ib2wsXG4gIFJ1bnRpbWVDb250ZXh0LFxuICBSdW50aW1lUmVzb2x2ZXIsXG4gIE9wdGlvbixcbiAgUnVudGltZUFydGlmYWN0cyxcbiAgQ29tcG9uZW50SW5zdGFuY2VXaXRoQ3JlYXRlLFxuICBNb2RpZmllckluc3RhbmNlLFxuICBJbnRlcm5hbE1vZGlmaWVyTWFuYWdlcixcbiAgTW9kaWZpZXJJbnN0YW5jZVN0YXRlLFxufSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFzc2VydCwgZXhwZWN0LCBzeW1ib2wgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7IHRyYWNrLCB1cGRhdGVUYWcgfSBmcm9tICdAZ2xpbW1lci92YWxpZGF0b3InO1xuaW1wb3J0IHsgRE9NQ2hhbmdlc0ltcGwsIERPTVRyZWVDb25zdHJ1Y3Rpb24gfSBmcm9tICcuL2RvbS9oZWxwZXInO1xuaW1wb3J0IHsgUnVudGltZVByb2dyYW1JbXBsIH0gZnJvbSAnQGdsaW1tZXIvcHJvZ3JhbSc7XG5pbXBvcnQgRGVidWdSZW5kZXJUcmVlIGZyb20gJy4vZGVidWctcmVuZGVyLXRyZWUnO1xuXG5leHBvcnQgY29uc3QgVFJBTlNBQ1RJT046IFRyYW5zYWN0aW9uU3ltYm9sID0gc3ltYm9sKCdUUkFOU0FDVElPTicpO1xuXG5jbGFzcyBUcmFuc2FjdGlvbkltcGwgaW1wbGVtZW50cyBUcmFuc2FjdGlvbiB7XG4gIHB1YmxpYyBzY2hlZHVsZWRJbnN0YWxsTW9kaWZpZXJzOiBNb2RpZmllckluc3RhbmNlW10gPSBbXTtcbiAgcHVibGljIHNjaGVkdWxlZFVwZGF0ZU1vZGlmaWVyczogTW9kaWZpZXJJbnN0YW5jZVtdID0gW107XG4gIHB1YmxpYyBjcmVhdGVkQ29tcG9uZW50czogQ29tcG9uZW50SW5zdGFuY2VXaXRoQ3JlYXRlW10gPSBbXTtcbiAgcHVibGljIHVwZGF0ZWRDb21wb25lbnRzOiBDb21wb25lbnRJbnN0YW5jZVdpdGhDcmVhdGVbXSA9IFtdO1xuXG4gIGRpZENyZWF0ZShjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlV2l0aENyZWF0ZSkge1xuICAgIHRoaXMuY3JlYXRlZENvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICB9XG5cbiAgZGlkVXBkYXRlKGNvbXBvbmVudDogQ29tcG9uZW50SW5zdGFuY2VXaXRoQ3JlYXRlKSB7XG4gICAgdGhpcy51cGRhdGVkQ29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gIH1cblxuICBzY2hlZHVsZUluc3RhbGxNb2RpZmllcihtb2RpZmllcjogTW9kaWZpZXJJbnN0YW5jZSkge1xuICAgIHRoaXMuc2NoZWR1bGVkSW5zdGFsbE1vZGlmaWVycy5wdXNoKG1vZGlmaWVyKTtcbiAgfVxuXG4gIHNjaGVkdWxlVXBkYXRlTW9kaWZpZXIobW9kaWZpZXI6IE1vZGlmaWVySW5zdGFuY2UpIHtcbiAgICB0aGlzLnNjaGVkdWxlZFVwZGF0ZU1vZGlmaWVycy5wdXNoKG1vZGlmaWVyKTtcbiAgfVxuXG4gIGNvbW1pdCgpIHtcbiAgICBsZXQgeyBjcmVhdGVkQ29tcG9uZW50cywgdXBkYXRlZENvbXBvbmVudHMgfSA9IHRoaXM7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNyZWF0ZWRDb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgeyBtYW5hZ2VyLCBzdGF0ZSB9ID0gY3JlYXRlZENvbXBvbmVudHNbaV07XG4gICAgICBtYW5hZ2VyLmRpZENyZWF0ZShzdGF0ZSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cGRhdGVkQ29tcG9uZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHsgbWFuYWdlciwgc3RhdGUgfSA9IHVwZGF0ZWRDb21wb25lbnRzW2ldO1xuICAgICAgbWFuYWdlci5kaWRVcGRhdGUoc3RhdGUpO1xuICAgIH1cblxuICAgIGxldCB7IHNjaGVkdWxlZEluc3RhbGxNb2RpZmllcnMsIHNjaGVkdWxlZFVwZGF0ZU1vZGlmaWVycyB9ID0gdGhpcztcblxuICAgIC8vIFByZXZlbnQgYSB0cmFuc3BpbGF0aW9uIGlzc3VlIHdlIGd1YXJkIGFnYWluc3QgaW4gRW1iZXIsIHRoZVxuICAgIC8vIHRocm93LWlmLWNsb3N1cmUtcmVxdWlyZWQgaXNzdWVcbiAgICBsZXQgbWFuYWdlcjogSW50ZXJuYWxNb2RpZmllck1hbmFnZXIsIHN0YXRlOiBNb2RpZmllckluc3RhbmNlU3RhdGU7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVkdWxlZEluc3RhbGxNb2RpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBtb2RpZmllciA9IHNjaGVkdWxlZEluc3RhbGxNb2RpZmllcnNbaV07XG4gICAgICBtYW5hZ2VyID0gbW9kaWZpZXIubWFuYWdlcjtcbiAgICAgIHN0YXRlID0gbW9kaWZpZXIuc3RhdGU7XG5cbiAgICAgIGxldCBtb2RpZmllclRhZyA9IG1hbmFnZXIuZ2V0VGFnKHN0YXRlKTtcblxuICAgICAgaWYgKG1vZGlmaWVyVGFnICE9PSBudWxsKSB7XG4gICAgICAgIGxldCB0YWcgPSB0cmFjayhcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1mdW5jXG4gICAgICAgICAgKCkgPT4gbWFuYWdlci5pbnN0YWxsKHN0YXRlKSxcbiAgICAgICAgICBERUJVRyAmJlxuICAgICAgICAgICAgYC0gV2hpbGUgcmVuZGVyaW5nOlxcbiAgKGluc3RhbmNlIG9mIGEgXFxgJHtcbiAgICAgICAgICAgICAgbW9kaWZpZXIuZGVmaW5pdGlvbi5yZXNvbHZlZE5hbWUgfHwgbWFuYWdlci5nZXREZWJ1Z05hbWUobW9kaWZpZXIuZGVmaW5pdGlvbi5zdGF0ZSlcbiAgICAgICAgICAgIH1cXGAgbW9kaWZpZXIpYFxuICAgICAgICApO1xuICAgICAgICB1cGRhdGVUYWcobW9kaWZpZXJUYWcsIHRhZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYW5hZ2VyLmluc3RhbGwoc3RhdGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZWR1bGVkVXBkYXRlTW9kaWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgbW9kaWZpZXIgPSBzY2hlZHVsZWRVcGRhdGVNb2RpZmllcnNbaV07XG4gICAgICBtYW5hZ2VyID0gbW9kaWZpZXIubWFuYWdlcjtcbiAgICAgIHN0YXRlID0gbW9kaWZpZXIuc3RhdGU7XG5cbiAgICAgIGxldCBtb2RpZmllclRhZyA9IG1hbmFnZXIuZ2V0VGFnKHN0YXRlKTtcblxuICAgICAgaWYgKG1vZGlmaWVyVGFnICE9PSBudWxsKSB7XG4gICAgICAgIGxldCB0YWcgPSB0cmFjayhcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1mdW5jXG4gICAgICAgICAgKCkgPT4gbWFuYWdlci51cGRhdGUoc3RhdGUpLFxuICAgICAgICAgIERFQlVHICYmXG4gICAgICAgICAgICBgLSBXaGlsZSByZW5kZXJpbmc6XFxuICAoaW5zdGFuY2Ugb2YgYSBcXGAke1xuICAgICAgICAgICAgICBtb2RpZmllci5kZWZpbml0aW9uLnJlc29sdmVkTmFtZSB8fCBtYW5hZ2VyLmdldERlYnVnTmFtZShtb2RpZmllci5kZWZpbml0aW9uLnN0YXRlKVxuICAgICAgICAgICAgfVxcYCBtb2RpZmllcilgXG4gICAgICAgICk7XG4gICAgICAgIHVwZGF0ZVRhZyhtb2RpZmllclRhZywgdGFnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hbmFnZXIudXBkYXRlKHN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50SW1wbCBpbXBsZW1lbnRzIEVudmlyb25tZW50IHtcbiAgW1RSQU5TQUNUSU9OXTogT3B0aW9uPFRyYW5zYWN0aW9uSW1wbD4gPSBudWxsO1xuXG4gIHByb3RlY3RlZCBhcHBlbmRPcGVyYXRpb25zITogR2xpbW1lclRyZWVDb25zdHJ1Y3Rpb247XG4gIHByb3RlY3RlZCB1cGRhdGVPcGVyYXRpb25zPzogR2xpbW1lclRyZWVDaGFuZ2VzO1xuXG4gIC8vIERlbGVnYXRlIG1ldGhvZHMgYW5kIHZhbHVlc1xuICBwdWJsaWMgaXNJbnRlcmFjdGl2ZSA9IHRoaXMuZGVsZWdhdGUuaXNJbnRlcmFjdGl2ZTtcblxuICBkZWJ1Z1JlbmRlclRyZWUgPSB0aGlzLmRlbGVnYXRlLmVuYWJsZURlYnVnVG9vbGluZyA/IG5ldyBEZWJ1Z1JlbmRlclRyZWUoKSA6IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbnMsIHByaXZhdGUgZGVsZWdhdGU6IEVudmlyb25tZW50RGVsZWdhdGUpIHtcbiAgICBpZiAob3B0aW9ucy5hcHBlbmRPcGVyYXRpb25zKSB7XG4gICAgICB0aGlzLmFwcGVuZE9wZXJhdGlvbnMgPSBvcHRpb25zLmFwcGVuZE9wZXJhdGlvbnM7XG4gICAgICB0aGlzLnVwZGF0ZU9wZXJhdGlvbnMgPSBvcHRpb25zLnVwZGF0ZU9wZXJhdGlvbnM7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmRvY3VtZW50KSB7XG4gICAgICB0aGlzLmFwcGVuZE9wZXJhdGlvbnMgPSBuZXcgRE9NVHJlZUNvbnN0cnVjdGlvbihvcHRpb25zLmRvY3VtZW50KTtcbiAgICAgIHRoaXMudXBkYXRlT3BlcmF0aW9ucyA9IG5ldyBET01DaGFuZ2VzSW1wbChvcHRpb25zLmRvY3VtZW50KTtcbiAgICB9IGVsc2UgaWYgKERFQlVHKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3lvdSBtdXN0IHBhc3MgZG9jdW1lbnQgb3IgYXBwZW5kT3BlcmF0aW9ucyB0byBhIG5ldyBydW50aW1lJyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QXBwZW5kT3BlcmF0aW9ucygpOiBHbGltbWVyVHJlZUNvbnN0cnVjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuYXBwZW5kT3BlcmF0aW9ucztcbiAgfVxuXG4gIGdldERPTSgpOiBHbGltbWVyVHJlZUNoYW5nZXMge1xuICAgIHJldHVybiBleHBlY3QoXG4gICAgICB0aGlzLnVwZGF0ZU9wZXJhdGlvbnMsXG4gICAgICAnQXR0ZW1wdGVkIHRvIGdldCBET00gdXBkYXRlT3BlcmF0aW9ucywgYnV0IHRoZXkgd2VyZSBub3QgcHJvdmlkZWQgYnkgdGhlIGVudmlyb25tZW50LiBZb3UgbWF5IGJlIGF0dGVtcHRpbmcgdG8gcmVyZW5kZXIgaW4gYW4gZW52aXJvbm1lbnQgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCByZXJlbmRlcmluZywgc3VjaCBhcyBTU1IuJ1xuICAgICk7XG4gIH1cblxuICBiZWdpbigpIHtcbiAgICBhc3NlcnQoXG4gICAgICAhdGhpc1tUUkFOU0FDVElPTl0sXG4gICAgICAnQSBnbGltbWVyIHRyYW5zYWN0aW9uIHdhcyBiZWd1biwgYnV0IG9uZSBhbHJlYWR5IGV4aXN0cy4gWW91IG1heSBoYXZlIGEgbmVzdGVkIHRyYW5zYWN0aW9uLCBwb3NzaWJseSBjYXVzZWQgYnkgYW4gZWFybGllciBydW50aW1lIGV4Y2VwdGlvbiB3aGlsZSByZW5kZXJpbmcuIFBsZWFzZSBjaGVjayB5b3VyIGNvbnNvbGUgZm9yIHRoZSBzdGFjayB0cmFjZSBvZiBhbnkgcHJpb3IgZXhjZXB0aW9ucy4nXG4gICAgKTtcblxuICAgIHRoaXMuZGVidWdSZW5kZXJUcmVlPy5iZWdpbigpO1xuXG4gICAgdGhpc1tUUkFOU0FDVElPTl0gPSBuZXcgVHJhbnNhY3Rpb25JbXBsKCk7XG4gIH1cblxuICBwcml2YXRlIGdldCB0cmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbkltcGwge1xuICAgIHJldHVybiBleHBlY3QodGhpc1tUUkFOU0FDVElPTl0hLCAnbXVzdCBiZSBpbiBhIHRyYW5zYWN0aW9uJyk7XG4gIH1cblxuICBkaWRDcmVhdGUoY29tcG9uZW50OiBDb21wb25lbnRJbnN0YW5jZVdpdGhDcmVhdGUpIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLmRpZENyZWF0ZShjb21wb25lbnQpO1xuICB9XG5cbiAgZGlkVXBkYXRlKGNvbXBvbmVudDogQ29tcG9uZW50SW5zdGFuY2VXaXRoQ3JlYXRlKSB7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5kaWRVcGRhdGUoY29tcG9uZW50KTtcbiAgfVxuXG4gIHNjaGVkdWxlSW5zdGFsbE1vZGlmaWVyKG1vZGlmaWVyOiBNb2RpZmllckluc3RhbmNlKSB7XG4gICAgaWYgKHRoaXMuaXNJbnRlcmFjdGl2ZSkge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbi5zY2hlZHVsZUluc3RhbGxNb2RpZmllcihtb2RpZmllcik7XG4gICAgfVxuICB9XG5cbiAgc2NoZWR1bGVVcGRhdGVNb2RpZmllcihtb2RpZmllcjogTW9kaWZpZXJJbnN0YW5jZSkge1xuICAgIGlmICh0aGlzLmlzSW50ZXJhY3RpdmUpIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uc2NoZWR1bGVVcGRhdGVNb2RpZmllcihtb2RpZmllcik7XG4gICAgfVxuICB9XG5cbiAgY29tbWl0KCkge1xuICAgIGxldCB0cmFuc2FjdGlvbiA9IHRoaXMudHJhbnNhY3Rpb247XG4gICAgdGhpc1tUUkFOU0FDVElPTl0gPSBudWxsO1xuICAgIHRyYW5zYWN0aW9uLmNvbW1pdCgpO1xuXG4gICAgdGhpcy5kZWJ1Z1JlbmRlclRyZWU/LmNvbW1pdCgpO1xuXG4gICAgdGhpcy5kZWxlZ2F0ZS5vblRyYW5zYWN0aW9uQ29tbWl0KCk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbnZpcm9ubWVudERlbGVnYXRlIHtcbiAgLyoqXG4gICAqIFVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB0aGUgZW52aXJvbm1lbnQgaXMgaW50ZXJhY3RpdmUgKGUuZy4gU1NSIGlzIG5vdFxuICAgKiBpbnRlcmFjdGl2ZSkuIEludGVyYWN0aXZlIGVudmlyb25tZW50cyBzY2hlZHVsZSBtb2RpZmllcnMsIGFtb25nIG90aGVyIHRoaW5ncy5cbiAgICovXG4gIGlzSW50ZXJhY3RpdmU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gZW5hYmxlIGRlYnVnIHRvb2xpbmdcbiAgICovXG4gIGVuYWJsZURlYnVnVG9vbGluZzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gYW4gZW52aXJvbm1lbnQgdHJhbnNhY3Rpb24gY29tbWl0c1xuICAgKi9cbiAgb25UcmFuc2FjdGlvbkNvbW1pdDogKCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bnRpbWVDb250ZXh0KFxuICBvcHRpb25zOiBFbnZpcm9ubWVudE9wdGlvbnMsXG4gIGRlbGVnYXRlOiBFbnZpcm9ubWVudERlbGVnYXRlLFxuICBhcnRpZmFjdHM6IFJ1bnRpbWVBcnRpZmFjdHMsXG4gIHJlc29sdmVyOiBSdW50aW1lUmVzb2x2ZXJcbik6IFJ1bnRpbWVDb250ZXh0IHtcbiAgcmV0dXJuIHtcbiAgICBlbnY6IG5ldyBFbnZpcm9ubWVudEltcGwob3B0aW9ucywgZGVsZWdhdGUpLFxuICAgIHByb2dyYW06IG5ldyBSdW50aW1lUHJvZ3JhbUltcGwoYXJ0aWZhY3RzLmNvbnN0YW50cywgYXJ0aWZhY3RzLmhlYXApLFxuICAgIHJlc29sdmVyOiByZXNvbHZlcixcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluVHJhbnNhY3Rpb24oZW52OiBFbnZpcm9ubWVudCwgY2I6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgaWYgKCFlbnZbVFJBTlNBQ1RJT05dKSB7XG4gICAgZW52LmJlZ2luKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNiKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVudi5jb21taXQoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY2IoKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFbnZpcm9ubWVudEltcGw7XG4iXSwic291cmNlUm9vdCI6IiJ9