UNPKG

matrix-react-sdk

Version:
181 lines (170 loc) 20 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.defaultDispatcher = exports.default = exports.MatrixDispatcher = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _payloads = require("./payloads"); /* Copyright 2024 New Vector Ltd. Copyright 2020 The Matrix.org Foundation C.I.C. Copyright 2017 New Vector Ltd Copyright 2015, 2016 OpenMarket Ltd SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ function invariant(cond, error) { if (!cond) throw new Error(error); } /** * A dispatcher for ActionPayloads (the default within the SDK). * Based on the old Flux dispatcher https://github.com/facebook/flux/blob/main/src/Dispatcher.js */ class MatrixDispatcher { constructor() { (0, _defineProperty2.default)(this, "callbacks", new Map()); (0, _defineProperty2.default)(this, "isHandled", new Map()); (0, _defineProperty2.default)(this, "isPending", new Map()); (0, _defineProperty2.default)(this, "pendingPayload", void 0); (0, _defineProperty2.default)(this, "lastId", 1); /** * Dispatches a payload to all registered callbacks. */ // eslint-disable-next-line @typescript-eslint/naming-convention (0, _defineProperty2.default)(this, "_dispatch", payload => { invariant(!this.isDispatching(), "Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch."); this.startDispatching(payload); try { for (const [id] of this.callbacks) { if (this.isPending.get(id)) { continue; } this.invokeCallback(id); } } finally { this.stopDispatching(); } }); } /** * Registers a callback to be invoked with every dispatched payload. Returns * a token that can be used with `waitFor()`. */ register(callback) { const id = "ID_" + this.lastId++; this.callbacks.set(id, callback); if (this.isDispatching()) { // If there is a dispatch happening right now then the newly registered callback should be skipped this.isPending.set(id, true); this.isHandled.set(id, true); } return id; } /** * Removes a callback based on its token. */ unregister(id) { invariant(this.callbacks.has(id), `Dispatcher.unregister(...): '${id}' does not map to a registered callback.`); this.callbacks.delete(id); } /** * Waits for the callbacks specified to be invoked before continuing execution * of the current callback. This method should only be used by a callback in * response to a dispatched payload. */ waitFor(ids) { invariant(this.isDispatching(), "Dispatcher.waitFor(...): Must be invoked while dispatching."); for (const id of ids) { if (this.isPending.get(id)) { invariant(this.isHandled.get(id), `Dispatcher.waitFor(...): Circular dependency detected while waiting for '${id}'.`); continue; } invariant(this.callbacks.get(id), `Dispatcher.waitFor(...): '${id}' does not map to a registered callback.`); this.invokeCallback(id); } } /** * Is this Dispatcher currently dispatching. */ isDispatching() { return !!this.pendingPayload; } /** * Call the callback stored with the given id. Also do some internal * bookkeeping. * * Must only be called with an id which has a callback and pendingPayload set * @internal */ invokeCallback(id) { this.isPending.set(id, true); this.callbacks.get(id)(this.pendingPayload); this.isHandled.set(id, true); } /** * Set up bookkeeping needed when dispatching. * * @internal */ startDispatching(payload) { for (const [id] of this.callbacks) { this.isPending.set(id, false); this.isHandled.set(id, false); } this.pendingPayload = payload; } /** * Clear bookkeeping used for dispatching. * * @internal */ stopDispatching() { this.pendingPayload = undefined; } /** * Dispatches an event on the dispatcher's event bus. * @param {ActionPayload} payload Required. The payload to dispatch. * @param {boolean=false} sync Optional. Pass true to dispatch * synchronously. This is useful for anything triggering * an operation that the browser requires user interaction * for. Default false (async). */ dispatch(payload, sync = false) { if (payload instanceof _payloads.AsyncActionPayload) { payload.fn(action => { this.dispatch(action, sync); }); return; } if (sync) { this._dispatch(payload); } else { // Unless the caller explicitly asked for us to dispatch synchronously, // we always set a timeout to do this: The flux dispatcher complains // if you dispatch from within a dispatch, so rather than action // handlers having to worry about not calling anything that might // then dispatch, we just do dispatches asynchronously. window.setTimeout(this._dispatch, 0, payload); } } /** * Shorthand for dispatch({action: Action.WHATEVER}, sync). No additional * properties can be included with this version. * @param {Action} action The action to dispatch. * @param {boolean=false} sync Whether the dispatch should be sync or not. * @see dispatch(action: ActionPayload, sync: boolean) */ fire(action, sync = false) { this.dispatch({ action }, sync); } } exports.MatrixDispatcher = MatrixDispatcher; const defaultDispatcher = exports.defaultDispatcher = new MatrixDispatcher(); if (!window.mxDispatcher) { window.mxDispatcher = defaultDispatcher; } var _default = exports.default = defaultDispatcher; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcGF5bG9hZHMiLCJyZXF1aXJlIiwiaW52YXJpYW50IiwiY29uZCIsImVycm9yIiwiRXJyb3IiLCJNYXRyaXhEaXNwYXRjaGVyIiwiY29uc3RydWN0b3IiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsIk1hcCIsInBheWxvYWQiLCJpc0Rpc3BhdGNoaW5nIiwic3RhcnREaXNwYXRjaGluZyIsImlkIiwiY2FsbGJhY2tzIiwiaXNQZW5kaW5nIiwiZ2V0IiwiaW52b2tlQ2FsbGJhY2siLCJzdG9wRGlzcGF0Y2hpbmciLCJyZWdpc3RlciIsImNhbGxiYWNrIiwibGFzdElkIiwic2V0IiwiaXNIYW5kbGVkIiwidW5yZWdpc3RlciIsImhhcyIsImRlbGV0ZSIsIndhaXRGb3IiLCJpZHMiLCJwZW5kaW5nUGF5bG9hZCIsInVuZGVmaW5lZCIsImRpc3BhdGNoIiwic3luYyIsIkFzeW5jQWN0aW9uUGF5bG9hZCIsImZuIiwiYWN0aW9uIiwiX2Rpc3BhdGNoIiwid2luZG93Iiwic2V0VGltZW91dCIsImZpcmUiLCJleHBvcnRzIiwiZGVmYXVsdERpc3BhdGNoZXIiLCJteERpc3BhdGNoZXIiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaXNwYXRjaGVyL2Rpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjAgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cbkNvcHlyaWdodCAyMDE3IE5ldyBWZWN0b3IgTHRkXG5Db3B5cmlnaHQgMjAxNSwgMjAxNiBPcGVuTWFya2V0IEx0ZFxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwiLi9hY3Rpb25zXCI7XG5pbXBvcnQgeyBBY3Rpb25QYXlsb2FkLCBBc3luY0FjdGlvblBheWxvYWQgfSBmcm9tIFwiLi9wYXlsb2Fkc1wiO1xuXG50eXBlIERpc3BhdGNoVG9rZW4gPSBzdHJpbmc7XG5cbmZ1bmN0aW9uIGludmFyaWFudChjb25kOiBhbnksIGVycm9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWNvbmQpIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG59XG5cbi8qKlxuICogQSBkaXNwYXRjaGVyIGZvciBBY3Rpb25QYXlsb2FkcyAodGhlIGRlZmF1bHQgd2l0aGluIHRoZSBTREspLlxuICogQmFzZWQgb24gdGhlIG9sZCBGbHV4IGRpc3BhdGNoZXIgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2ZsdXgvYmxvYi9tYWluL3NyYy9EaXNwYXRjaGVyLmpzXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRyaXhEaXNwYXRjaGVyIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhbGxiYWNrcyA9IG5ldyBNYXA8RGlzcGF0Y2hUb2tlbiwgKHBheWxvYWQ6IEFjdGlvblBheWxvYWQpID0+IHZvaWQ+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpc0hhbmRsZWQgPSBuZXcgTWFwPERpc3BhdGNoVG9rZW4sIGJvb2xlYW4+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpc1BlbmRpbmcgPSBuZXcgTWFwPERpc3BhdGNoVG9rZW4sIGJvb2xlYW4+KCk7XG4gICAgcHJpdmF0ZSBwZW5kaW5nUGF5bG9hZD86IEFjdGlvblBheWxvYWQ7XG4gICAgcHJpdmF0ZSBsYXN0SWQgPSAxO1xuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aXRoIGV2ZXJ5IGRpc3BhdGNoZWQgcGF5bG9hZC4gUmV0dXJuc1xuICAgICAqIGEgdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB3aXRoIGB3YWl0Rm9yKClgLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3RlcihjYWxsYmFjazogKHBheWxvYWQ6IEFjdGlvblBheWxvYWQpID0+IHZvaWQpOiBEaXNwYXRjaFRva2VuIHtcbiAgICAgICAgY29uc3QgaWQgPSBcIklEX1wiICsgdGhpcy5sYXN0SWQrKztcbiAgICAgICAgdGhpcy5jYWxsYmFja3Muc2V0KGlkLCBjYWxsYmFjayk7XG4gICAgICAgIGlmICh0aGlzLmlzRGlzcGF0Y2hpbmcoKSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBkaXNwYXRjaCBoYXBwZW5pbmcgcmlnaHQgbm93IHRoZW4gdGhlIG5ld2x5IHJlZ2lzdGVyZWQgY2FsbGJhY2sgc2hvdWxkIGJlIHNraXBwZWRcbiAgICAgICAgICAgIHRoaXMuaXNQZW5kaW5nLnNldChpZCwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmlzSGFuZGxlZC5zZXQoaWQsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgY2FsbGJhY2sgYmFzZWQgb24gaXRzIHRva2VuLlxuICAgICAqL1xuICAgIHB1YmxpYyB1bnJlZ2lzdGVyKGlkOiBEaXNwYXRjaFRva2VuKTogdm9pZCB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLmNhbGxiYWNrcy5oYXMoaWQpLCBgRGlzcGF0Y2hlci51bnJlZ2lzdGVyKC4uLik6ICcke2lkfScgZG9lcyBub3QgbWFwIHRvIGEgcmVnaXN0ZXJlZCBjYWxsYmFjay5gKTtcbiAgICAgICAgdGhpcy5jYWxsYmFja3MuZGVsZXRlKGlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXYWl0cyBmb3IgdGhlIGNhbGxiYWNrcyBzcGVjaWZpZWQgdG8gYmUgaW52b2tlZCBiZWZvcmUgY29udGludWluZyBleGVjdXRpb25cbiAgICAgKiBvZiB0aGUgY3VycmVudCBjYWxsYmFjay4gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBhIGNhbGxiYWNrIGluXG4gICAgICogcmVzcG9uc2UgdG8gYSBkaXNwYXRjaGVkIHBheWxvYWQuXG4gICAgICovXG4gICAgcHVibGljIHdhaXRGb3IoaWRzOiBEaXNwYXRjaFRva2VuW10pOiB2b2lkIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMuaXNEaXNwYXRjaGluZygpLCBcIkRpc3BhdGNoZXIud2FpdEZvciguLi4pOiBNdXN0IGJlIGludm9rZWQgd2hpbGUgZGlzcGF0Y2hpbmcuXCIpO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNQZW5kaW5nLmdldChpZCkpIHtcbiAgICAgICAgICAgICAgICBpbnZhcmlhbnQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNIYW5kbGVkLmdldChpZCksXG4gICAgICAgICAgICAgICAgICAgIGBEaXNwYXRjaGVyLndhaXRGb3IoLi4uKTogQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZCB3aGlsZSB3YWl0aW5nIGZvciAnJHtpZH0nLmAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludmFyaWFudChcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5nZXQoaWQpLFxuICAgICAgICAgICAgICAgIGBEaXNwYXRjaGVyLndhaXRGb3IoLi4uKTogJyR7aWR9JyBkb2VzIG5vdCBtYXAgdG8gYSByZWdpc3RlcmVkIGNhbGxiYWNrLmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5pbnZva2VDYWxsYmFjayhpZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaGVzIGEgcGF5bG9hZCB0byBhbGwgcmVnaXN0ZXJlZCBjYWxsYmFja3MuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgIHByaXZhdGUgX2Rpc3BhdGNoID0gKHBheWxvYWQ6IEFjdGlvblBheWxvYWQpOiB2b2lkID0+IHtcbiAgICAgICAgaW52YXJpYW50KCF0aGlzLmlzRGlzcGF0Y2hpbmcoKSwgXCJEaXNwYXRjaC5kaXNwYXRjaCguLi4pOiBDYW5ub3QgZGlzcGF0Y2ggaW4gdGhlIG1pZGRsZSBvZiBhIGRpc3BhdGNoLlwiKTtcbiAgICAgICAgdGhpcy5zdGFydERpc3BhdGNoaW5nKHBheWxvYWQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaWRdIG9mIHRoaXMuY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQZW5kaW5nLmdldChpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlQ2FsbGJhY2soaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5zdG9wRGlzcGF0Y2hpbmcoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBJcyB0aGlzIERpc3BhdGNoZXIgY3VycmVudGx5IGRpc3BhdGNoaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc0Rpc3BhdGNoaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLnBlbmRpbmdQYXlsb2FkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGwgdGhlIGNhbGxiYWNrIHN0b3JlZCB3aXRoIHRoZSBnaXZlbiBpZC4gQWxzbyBkbyBzb21lIGludGVybmFsXG4gICAgICogYm9va2tlZXBpbmcuXG4gICAgICpcbiAgICAgKiBNdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYW4gaWQgd2hpY2ggaGFzIGEgY2FsbGJhY2sgYW5kIHBlbmRpbmdQYXlsb2FkIHNldFxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByaXZhdGUgaW52b2tlQ2FsbGJhY2soaWQ6IERpc3BhdGNoVG9rZW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1BlbmRpbmcuc2V0KGlkLCB0cnVlKTtcbiAgICAgICAgdGhpcy5jYWxsYmFja3MuZ2V0KGlkKSEodGhpcy5wZW5kaW5nUGF5bG9hZCEpO1xuICAgICAgICB0aGlzLmlzSGFuZGxlZC5zZXQoaWQsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB1cCBib29ra2VlcGluZyBuZWVkZWQgd2hlbiBkaXNwYXRjaGluZy5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhcnREaXNwYXRjaGluZyhwYXlsb2FkOiBBY3Rpb25QYXlsb2FkKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2lkXSBvZiB0aGlzLmNhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5pc1BlbmRpbmcuc2V0KGlkLCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmlzSGFuZGxlZC5zZXQoaWQsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBlbmRpbmdQYXlsb2FkID0gcGF5bG9hZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciBib29ra2VlcGluZyB1c2VkIGZvciBkaXNwYXRjaGluZy5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByaXZhdGUgc3RvcERpc3BhdGNoaW5nKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBlbmRpbmdQYXlsb2FkID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoZXMgYW4gZXZlbnQgb24gdGhlIGRpc3BhdGNoZXIncyBldmVudCBidXMuXG4gICAgICogQHBhcmFtIHtBY3Rpb25QYXlsb2FkfSBwYXlsb2FkIFJlcXVpcmVkLiBUaGUgcGF5bG9hZCB0byBkaXNwYXRjaC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49ZmFsc2V9IHN5bmMgT3B0aW9uYWwuIFBhc3MgdHJ1ZSB0byBkaXNwYXRjaFxuICAgICAqICAgICAgICBzeW5jaHJvbm91c2x5LiBUaGlzIGlzIHVzZWZ1bCBmb3IgYW55dGhpbmcgdHJpZ2dlcmluZ1xuICAgICAqICAgICAgICBhbiBvcGVyYXRpb24gdGhhdCB0aGUgYnJvd3NlciByZXF1aXJlcyB1c2VyIGludGVyYWN0aW9uXG4gICAgICogICAgICAgIGZvci4gRGVmYXVsdCBmYWxzZSAoYXN5bmMpLlxuICAgICAqL1xuICAgIHB1YmxpYyBkaXNwYXRjaDxUIGV4dGVuZHMgQWN0aW9uUGF5bG9hZD4ocGF5bG9hZDogVCwgc3luYyA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIGlmIChwYXlsb2FkIGluc3RhbmNlb2YgQXN5bmNBY3Rpb25QYXlsb2FkKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmZuKChhY3Rpb246IEFjdGlvblBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoKGFjdGlvbiwgc3luYyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzeW5jKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNwYXRjaChwYXlsb2FkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFVubGVzcyB0aGUgY2FsbGVyIGV4cGxpY2l0bHkgYXNrZWQgZm9yIHVzIHRvIGRpc3BhdGNoIHN5bmNocm9ub3VzbHksXG4gICAgICAgICAgICAvLyB3ZSBhbHdheXMgc2V0IGEgdGltZW91dCB0byBkbyB0aGlzOiBUaGUgZmx1eCBkaXNwYXRjaGVyIGNvbXBsYWluc1xuICAgICAgICAgICAgLy8gaWYgeW91IGRpc3BhdGNoIGZyb20gd2l0aGluIGEgZGlzcGF0Y2gsIHNvIHJhdGhlciB0aGFuIGFjdGlvblxuICAgICAgICAgICAgLy8gaGFuZGxlcnMgaGF2aW5nIHRvIHdvcnJ5IGFib3V0IG5vdCBjYWxsaW5nIGFueXRoaW5nIHRoYXQgbWlnaHRcbiAgICAgICAgICAgIC8vIHRoZW4gZGlzcGF0Y2gsIHdlIGp1c3QgZG8gZGlzcGF0Y2hlcyBhc3luY2hyb25vdXNseS5cbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuX2Rpc3BhdGNoLCAwLCBwYXlsb2FkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3J0aGFuZCBmb3IgZGlzcGF0Y2goe2FjdGlvbjogQWN0aW9uLldIQVRFVkVSfSwgc3luYykuIE5vIGFkZGl0aW9uYWxcbiAgICAgKiBwcm9wZXJ0aWVzIGNhbiBiZSBpbmNsdWRlZCB3aXRoIHRoaXMgdmVyc2lvbi5cbiAgICAgKiBAcGFyYW0ge0FjdGlvbn0gYWN0aW9uIFRoZSBhY3Rpb24gdG8gZGlzcGF0Y2guXG4gICAgICogQHBhcmFtIHtib29sZWFuPWZhbHNlfSBzeW5jIFdoZXRoZXIgdGhlIGRpc3BhdGNoIHNob3VsZCBiZSBzeW5jIG9yIG5vdC5cbiAgICAgKiBAc2VlIGRpc3BhdGNoKGFjdGlvbjogQWN0aW9uUGF5bG9hZCwgc3luYzogYm9vbGVhbilcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlyZShhY3Rpb246IEFjdGlvbiwgc3luYyA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goeyBhY3Rpb24gfSwgc3luYyk7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdERpc3BhdGNoZXIgPSBuZXcgTWF0cml4RGlzcGF0Y2hlcigpO1xuXG5pZiAoIXdpbmRvdy5teERpc3BhdGNoZXIpIHtcbiAgICB3aW5kb3cubXhEaXNwYXRjaGVyID0gZGVmYXVsdERpc3BhdGNoZXI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmF1bHREaXNwYXRjaGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVdBLElBQUFBLFNBQUEsR0FBQUMsT0FBQTtBQVhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFPQSxTQUFTQyxTQUFTQSxDQUFD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