UNPKG

matrix-react-sdk

Version:
131 lines (109 loc) 16.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classnames = _interopRequireDefault(require("classnames")); var _react = _interopRequireWildcard(require("react")); var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore")); var _callFeed = require("matrix-js-sdk/src/webrtc/callFeed"); var _logger = require("matrix-js-sdk/src/logger"); var _MemberAvatar = _interopRequireDefault(require("../avatars/MemberAvatar")); var _replaceableComponent = require("../../../utils/replaceableComponent"); var _dec, _class, _temp; let VideoFeed = (_dec = (0, _replaceableComponent.replaceableComponent)("views.voip.VideoFeed"), _dec(_class = (_temp = class VideoFeed extends _react.default.Component /*:: <IProps, IState>*/ { constructor(props /*: IProps*/ ) { super(props); (0, _defineProperty2.default)(this, "element", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2.default)(this, "onNewStream", () => { this.setState({ audioMuted: this.props.feed.isAudioMuted(), videoMuted: this.props.feed.isVideoMuted() }); this.playMedia(); }); (0, _defineProperty2.default)(this, "onResize", e => { if (this.props.onResize && !this.props.feed.isLocal()) { this.props.onResize(e); } }); this.state = { audioMuted: this.props.feed.isAudioMuted(), videoMuted: this.props.feed.isVideoMuted() }; } componentDidMount() { this.props.feed.addListener(_callFeed.CallFeedEvent.NewStream, this.onNewStream); this.playMedia(); } componentWillUnmount() { this.props.feed.removeListener(_callFeed.CallFeedEvent.NewStream, this.onNewStream); this.element.current?.removeEventListener('resize', this.onResize); this.stopMedia(); } playMedia() { const element = this.element.current; if (!element) return; // We play audio in AudioFeed, not here element.muted = true; element.srcObject = this.props.feed.stream; element.autoplay = true; try { // A note on calling methods on media elements: // We used to have queues per media element to serialise all calls on those elements. // The reason given for this was that load() and play() were racing. However, we now // never call load() explicitly so this seems unnecessary. However, serialising every // operation was causing bugs where video would not resume because some play command // had got stuck and all media operations were queued up behind it. If necessary, we // should serialise the ones that need to be serialised but then be able to interrupt // them with another load() which will cancel the pending one, but since we don't call // load() explicitly, it shouldn't be a problem. - Dave element.play(); } catch (e) { _logger.logger.info("Failed to play media element with feed", this.props.feed, e); } } stopMedia() { const element = this.element.current; if (!element) return; element.pause(); element.src = null; // As per comment in componentDidMount, setting the sink ID back to the // default once the call is over makes setSinkId work reliably. - Dave // Since we are not using the same element anymore, the above doesn't // seem to be necessary - Šimon } render() { const videoClasses = { mx_VideoFeed: true, mx_VideoFeed_local: this.props.feed.isLocal(), mx_VideoFeed_remote: !this.props.feed.isLocal(), mx_VideoFeed_voice: this.state.videoMuted, mx_VideoFeed_video: !this.state.videoMuted, mx_VideoFeed_mirror: this.props.feed.isLocal() && _SettingsStore.default.getValue('VideoView.flipVideoHorizontally') }; if (this.state.videoMuted) { const member = this.props.feed.getMember(); const avatarSize = this.props.pipMode ? 76 : 160; return /*#__PURE__*/_react.default.createElement("div", { className: (0, _classnames.default)(videoClasses) }, /*#__PURE__*/_react.default.createElement(_MemberAvatar.default, { member: member, height: avatarSize, width: avatarSize })); } else { return /*#__PURE__*/_react.default.createElement("video", { className: (0, _classnames.default)(videoClasses), ref: this.element }); } } }, _temp)) || _class); exports.default = VideoFeed; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3ZvaXAvVmlkZW9GZWVkLnRzeCJdLCJuYW1lcyI6WyJWaWRlb0ZlZWQiLCJSZWFjdCIsIkNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJzZXRTdGF0ZSIsImF1ZGlvTXV0ZWQiLCJmZWVkIiwiaXNBdWRpb011dGVkIiwidmlkZW9NdXRlZCIsImlzVmlkZW9NdXRlZCIsInBsYXlNZWRpYSIsImUiLCJvblJlc2l6ZSIsImlzTG9jYWwiLCJzdGF0ZSIsImNvbXBvbmVudERpZE1vdW50IiwiYWRkTGlzdGVuZXIiLCJDYWxsRmVlZEV2ZW50IiwiTmV3U3RyZWFtIiwib25OZXdTdHJlYW0iLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInJlbW92ZUxpc3RlbmVyIiwiZWxlbWVudCIsImN1cnJlbnQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwic3RvcE1lZGlhIiwibXV0ZWQiLCJzcmNPYmplY3QiLCJzdHJlYW0iLCJhdXRvcGxheSIsInBsYXkiLCJsb2dnZXIiLCJpbmZvIiwicGF1c2UiLCJzcmMiLCJyZW5kZXIiLCJ2aWRlb0NsYXNzZXMiLCJteF9WaWRlb0ZlZWQiLCJteF9WaWRlb0ZlZWRfbG9jYWwiLCJteF9WaWRlb0ZlZWRfcmVtb3RlIiwibXhfVmlkZW9GZWVkX3ZvaWNlIiwibXhfVmlkZW9GZWVkX3ZpZGVvIiwibXhfVmlkZW9GZWVkX21pcnJvciIsIlNldHRpbmdzU3RvcmUiLCJnZXRWYWx1ZSIsIm1lbWJlciIsImdldE1lbWJlciIsImF2YXRhclNpemUiLCJwaXBNb2RlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBZ0JBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0lBd0JxQkEsUyxXQURwQixnREFBcUIsc0JBQXJCLEMseUJBQUQsTUFDcUJBLFNBRHJCLFNBQ3VDQyxlQUFNQztBQUQ3QztBQUN1RTtBQUduRUMsRUFBQUEsV0FBVyxDQUFDQztBQUFE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SmQ7QUFLakJpQyxNQUFBQSxrQkFBa0IsRUFBRSxDQUFDLEtBQUszQixLQUFMLENBQVdOLFVBTGY7QUFNakJrQyxNQUFBQSxtQkFBbUIsRUFDZixLQUFLdkMsS0FBTCxDQUFXRyxJQUFYLENBQWdCTyxPQUFoQixNQUNBOEIsdUJBQWNDLFFBQWQsQ0FBdUIsaUNBQXZCO0FBUmEsS0FBckI7O0FBWUEsUUFBSSxLQUFLOUIsS0FBTCxDQUFXTixVQUFmLEVBQTJCO0FBQ3ZCLFlBQU1xQyxNQUFNLEdBQUcsS0FBSzFDLEtBQUwsQ0FBV0csSUFBWCxDQUFnQndDLFNBQWhCLEVBQWY7QUFDQSxZQUFNQyxVQUFVLEdBQUcsS0FBSzVDLEtBQUwsQ0FBVzZDLE9BQVgsR0FBcUIsRUFBckIsR0FBMEIsR0FBN0M7QUFFQSwwQkFDSTtBQUFLLFFBQUEsU0FBUyxFQUFFLHlCQUFXWixZQUFYO0FBQWhCLHNCQUNJLDZCQUFDLHFCQUFEO0FBQ0ksUUFBQSxNQUFNLEVBQUVTLE1BRFo7QUFFSSxRQUFBLE1BQU0sRUFBRUUsVUFGWjtBQUdJLFFBQUEsS0FBSyxFQUFFQTtBQUhYLFFBREosQ0FESjtBQVNILEtBYkQsTUFhTztBQUNILDBCQUNJO0FBQU8sUUFBQSxTQUFTLEVBQUUseUJBQVdYLFlBQVgsQ0FBbEI7QUFBNEMsUUFBQSxHQUFHLEVBQUUsS0FBS2Q7QUFBdEQsUUFESjtBQUdIO0FBQ0o7O0FBeEdrRSxDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDE1LCAyMDE2LCAyMDE5IFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBNYXRyaXhDYWxsIH0gZnJvbSAnbWF0cml4LWpzLXNkay9zcmMvd2VicnRjL2NhbGwnO1xuaW1wb3J0IFJlYWN0LCB7Y3JlYXRlUmVmfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgU2V0dGluZ3NTdG9yZSBmcm9tIFwiLi4vLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3NTdG9yZVwiO1xuaW1wb3J0IHsgQ2FsbEZlZWQsIENhbGxGZWVkRXZlbnQgfSBmcm9tICdtYXRyaXgtanMtc2RrL3NyYy93ZWJydGMvY2FsbEZlZWQnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnbWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyJztcbmltcG9ydCBNZW1iZXJBdmF0YXIgZnJvbSBcIi4uL2F2YXRhcnMvTWVtYmVyQXZhdGFyXCJcbmltcG9ydCB7cmVwbGFjZWFibGVDb21wb25lbnR9IGZyb20gXCIuLi8uLi8uLi91dGlscy9yZXBsYWNlYWJsZUNvbXBvbmVudFwiO1xuXG5pbnRlcmZhY2UgSVByb3BzIHtcbiAgICBjYWxsOiBNYXRyaXhDYWxsLFxuXG4gICAgZmVlZDogQ2FsbEZlZWQsXG5cbiAgICAvLyBXaGV0aGVyIHRoaXMgY2FsbCB2aWV3IGlzIGZvciBwaWN0dXJlLWluLXBpY3R1cmUgbW9kZVxuICAgIC8vIG90aGVyd2lzZSwgaXQncyB0aGUgbGFyZ2VyIGNhbGwgdmlldyB3aGVuIHZpZXdpbmcgdGhlIHJvb20gdGhlIGNhbGwgaXMgaW4uXG4gICAgLy8gVGhpcyBpcyBzb3J0IG9mIGEgcHJveHkgZm9yIGEgbnVtYmVyIG9mIHRoaW5ncyBidXQgd2UgY3VycmVudGx5IGhhdmUgbm9cbiAgICAvLyBuZWVkIHRvIGNvbnRyb2wgdGhvc2UgdGhpbmdzIHNlcGFyYXRlbHksIHNvIHRoaXMgaXMgc2ltcGxlci5cbiAgICBwaXBNb2RlPzogYm9vbGVhbjtcblxuICAgIC8vIGEgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIHdoZW4gdGhlIHZpZGVvIGVsZW1lbnQgaXMgcmVzaXplZFxuICAgIC8vIGR1ZSB0byBhIGNoYW5nZSBpbiB2aWRlbyBtZXRhZGF0YVxuICAgIG9uUmVzaXplPzogKGU6IEV2ZW50KSA9PiB2b2lkLFxufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBhdWRpb011dGVkOiBib29sZWFuO1xuICAgIHZpZGVvTXV0ZWQ6IGJvb2xlYW47XG59XG5cbkByZXBsYWNlYWJsZUNvbXBvbmVudChcInZpZXdzLnZvaXAuVmlkZW9GZWVkXCIpXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWaWRlb0ZlZWQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8SVByb3BzLCBJU3RhdGU+IHtcbiAgICBwcml2YXRlIGVsZW1lbnQgPSBjcmVhdGVSZWY8SFRNTFZpZGVvRWxlbWVudD4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBJUHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBhdWRpb011dGVkOiB0aGlzLnByb3BzLmZlZWQuaXNBdWRpb011dGVkKCksXG4gICAgICAgICAgICB2aWRlb011dGVkOiB0aGlzLnByb3BzLmZlZWQuaXNWaWRlb011dGVkKCksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIHRoaXMucHJvcHMuZmVlZC5hZGRMaXN0ZW5lcihDYWxsRmVlZEV2ZW50Lk5ld1N0cmVhbSwgdGhpcy5vbk5ld1N0cmVhbSk7XG4gICAgICAgIHRoaXMucGxheU1lZGlhKCk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIHRoaXMucHJvcHMuZmVlZC5yZW1vdmVMaXN0ZW5lcihDYWxsRmVlZEV2ZW50Lk5ld1N0cmVhbSwgdGhpcy5vbk5ld1N0cmVhbSk7XG4gICAgICAgIHRoaXMuZWxlbWVudC5jdXJyZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLm9uUmVzaXplKTtcbiAgICAgICAgdGhpcy5zdG9wTWVkaWEoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBsYXlNZWRpYSgpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudC5jdXJyZW50O1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybjtcbiAgICAgICAgLy8gV2UgcGxheSBhdWRpbyBpbiBBdWRpb0ZlZWQsIG5vdCBoZXJlXG4gICAgICAgIGVsZW1lbnQubXV0ZWQgPSB0cnVlO1xuICAgICAgICBlbGVtZW50LnNyY09iamVjdCA9IHRoaXMucHJvcHMuZmVlZC5zdHJlYW07XG4gICAgICAgIGVsZW1lbnQuYXV0b3BsYXkgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQSBub3RlIG9uIGNhbGxpbmcgbWV0aG9kcyBvbiBtZWRpYSBlbGVtZW50czpcbiAgICAgICAgICAgIC8vIFdlIHVzZWQgdG8gaGF2ZSBxdWV1ZXMgcGVyIG1lZGlhIGVsZW1lbnQgdG8gc2VyaWFsaXNlIGFsbCBjYWxscyBvbiB0aG9zZSBlbGVtZW50cy5cbiAgICAgICAgICAgIC8vIFRoZSByZWFzb24gZ2l2ZW4gZm9yIHRoaXMgd2FzIHRoYXQgbG9hZCgpIGFuZCBwbGF5KCkgd2VyZSByYWNpbmcuIEhvd2V2ZXIsIHdlIG5vd1xuICAgICAgICAgICAgLy8gbmV2ZXIgY2FsbCBsb2FkKCkgZXhwbGljaXRseSBzbyB0aGlzIHNlZW1zIHVubmVjZXNzYXJ5LiBIb3dldmVyLCBzZXJpYWxpc2luZyBldmVyeVxuICAgICAgICAgICAgLy8gb3BlcmF0aW9uIHdhcyBjYXVzaW5nIGJ1Z3Mgd2hlcmUgdmlkZW8gd291bGQgbm90IHJlc3VtZSBiZWNhdXNlIHNvbWUgcGxheSBjb21tYW5kXG4gICAgICAgICAgICAvLyBoYWQgZ290IHN0dWNrIGFuZCBhbGwgbWVkaWEgb3BlcmF0aW9ucyB3ZXJlIHF1ZXVlZCB1cCBiZWhpbmQgaXQuIElmIG5lY2Vzc2FyeSwgd2VcbiAgICAgICAgICAgIC8vIHNob3VsZCBzZXJpYWxpc2UgdGhlIG9uZXMgdGhhdCBuZWVkIHRvIGJlIHNlcmlhbGlzZWQgYnV0IHRoZW4gYmUgYWJsZSB0byBpbnRlcnJ1cHRcbiAgICAgICAgICAgIC8vIHRoZW0gd2l0aCBhbm90aGVyIGxvYWQoKSB3aGljaCB3aWxsIGNhbmNlbCB0aGUgcGVuZGluZyBvbmUsIGJ1dCBzaW5jZSB3ZSBkb24ndCBjYWxsXG4gICAgICAgICAgICAvLyBsb2FkKCkgZXhwbGljaXRseSwgaXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4gLSBEYXZlXG4gICAgICAgICAgICBlbGVtZW50LnBsYXkoKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhcIkZhaWxlZCB0byBwbGF5IG1lZGlhIGVsZW1lbnQgd2l0aCBmZWVkXCIsIHRoaXMucHJvcHMuZmVlZCwgZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0b3BNZWRpYSgpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudC5jdXJyZW50O1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybjtcblxuICAgICAgICBlbGVtZW50LnBhdXNlKCk7XG4gICAgICAgIGVsZW1lbnQuc3JjID0gbnVsbDtcblxuICAgICAgICAvLyBBcyBwZXIgY29tbWVudCBpbiBjb21wb25lbnREaWRNb3VudCwgc2V0dGluZyB0aGUgc2luayBJRCBiYWNrIHRvIHRoZVxuICAgICAgICAvLyBkZWZhdWx0IG9uY2UgdGhlIGNhbGwgaXMgb3ZlciBtYWtlcyBzZXRTaW5rSWQgd29yayByZWxpYWJseS4gLSBEYXZlXG4gICAgICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgdXNpbmcgdGhlIHNhbWUgZWxlbWVudCBhbnltb3JlLCB0aGUgYWJvdmUgZG9lc24ndFxuICAgICAgICAvLyBzZWVtIHRvIGJlIG5lY2Vzc2FyeSAtIMWgaW1vblxuICAgIH1cblxuICAgIHByaXZhdGUgb25OZXdTdHJlYW0gPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgYXVkaW9NdXRlZDogdGhpcy5wcm9wcy5mZWVkLmlzQXVkaW9NdXRlZCgpLFxuICAgICAgICAgICAgdmlkZW9NdXRlZDogdGhpcy5wcm9wcy5mZWVkLmlzVmlkZW9NdXRlZCgpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wbGF5TWVkaWEoKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvblJlc2l6ZSA9IChlKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uUmVzaXplICYmICF0aGlzLnByb3BzLmZlZWQuaXNMb2NhbCgpKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uUmVzaXplKGUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3QgdmlkZW9DbGFzc2VzID0ge1xuICAgICAgICAgICAgbXhfVmlkZW9GZWVkOiB0cnVlLFxuICAgICAgICAgICAgbXhfVmlkZW9GZWVkX2xvY2FsOiB0aGlzLnByb3BzLmZlZWQuaXNMb2NhbCgpLFxuICAgICAgICAgICAgbXhfVmlkZW9GZWVkX3JlbW90ZTogIXRoaXMucHJvcHMuZmVlZC5pc0xvY2FsKCksXG4gICAgICAgICAgICBteF9WaWRlb0ZlZWRfdm9pY2U6IHRoaXMuc3RhdGUudmlkZW9NdXRlZCxcbiAgICAgICAgICAgIG14X1ZpZGVvRmVlZF92aWRlbzogIXRoaXMuc3RhdGUudmlkZW9NdXRlZCxcbiAgICAgICAgICAgIG14X1ZpZGVvRmVlZF9taXJyb3I6IChcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLmZlZWQuaXNMb2NhbCgpICYmXG4gICAgICAgICAgICAgICAgU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZSgnVmlkZW9WaWV3LmZsaXBWaWRlb0hvcml6b250YWxseScpXG4gICAgICAgICAgICApLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnZpZGVvTXV0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lbWJlciA9IHRoaXMucHJvcHMuZmVlZC5nZXRNZW1iZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IGF2YXRhclNpemUgPSB0aGlzLnByb3BzLnBpcE1vZGUgPyA3NiA6IDE2MDtcblxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NuYW1lcyh2aWRlb0NsYXNzZXMpfSA+XG4gICAgICAgICAgICAgICAgICAgIDxNZW1iZXJBdmF0YXJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcj17bWVtYmVyfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PXthdmF0YXJTaXplfVxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9e2F2YXRhclNpemV9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8dmlkZW8gY2xhc3NOYW1lPXtjbGFzc25hbWVzKHZpZGVvQ2xhc3Nlcyl9IHJlZj17dGhpcy5lbGVtZW50fSAvPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==