UNPKG

matrix-react-sdk

Version:
215 lines (211 loc) 37.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _maplibreGl = _interopRequireDefault(require("maplibre-gl")); var _logger = require("matrix-js-sdk/src/logger"); var _matrix = require("matrix-js-sdk/src/matrix"); var _languageHandler = require("../../../languageHandler"); var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext")); var _Modal = _interopRequireDefault(require("../../../Modal")); var _WellKnownUtils = require("../../../utils/WellKnownUtils"); var _beacon = require("../../../utils/beacon"); var _location = require("../../../utils/location"); var _ErrorDialog = _interopRequireDefault(require("../dialogs/ErrorDialog")); var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton")); var _MapError = require("./MapError"); var _LiveDurationDropdown = _interopRequireWildcard(require("./LiveDurationDropdown")); var _shareLocation = require("./shareLocation"); var _Marker = _interopRequireDefault(require("./Marker")); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } /* Copyright 2024 New Vector Ltd. Copyright 2021 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ const isSharingOwnLocation = shareType => shareType === _shareLocation.LocationShareType.Own || shareType === _shareLocation.LocationShareType.Live; class LocationPicker extends _react.default.Component { constructor(props, context) { super(props, context); (0, _defineProperty2.default)(this, "map", void 0); (0, _defineProperty2.default)(this, "geolocate", void 0); (0, _defineProperty2.default)(this, "marker", void 0); (0, _defineProperty2.default)(this, "getMarkerId", () => { return "mx_MLocationPicker_marker"; }); (0, _defineProperty2.default)(this, "addMarkerToMap", () => { this.marker = new _maplibreGl.default.Marker({ element: document.getElementById(this.getMarkerId()) ?? undefined, anchor: "bottom", offset: [0, -1] }).setLngLat(new _maplibreGl.default.LngLat(0, 0)).addTo(this.map); }); (0, _defineProperty2.default)(this, "updateStyleUrl", clientWellKnown => { const style = (0, _WellKnownUtils.tileServerFromWellKnown)(clientWellKnown)?.["map_style_url"]; if (style) { this.map?.setStyle(style); } }); (0, _defineProperty2.default)(this, "onGeolocate", position => { if (!this.marker) { this.addMarkerToMap(); } this.setState({ position: (0, _beacon.genericPositionFromGeolocation)(position) }); this.marker?.setLngLat(new _maplibreGl.default.LngLat(position.coords.longitude, position.coords.latitude)); }); (0, _defineProperty2.default)(this, "onClick", event => { if (!this.marker) { this.addMarkerToMap(); } this.marker?.setLngLat(event.lngLat); this.setState({ position: { timestamp: Date.now(), latitude: event.lngLat.lat, longitude: event.lngLat.lng } }); }); (0, _defineProperty2.default)(this, "onGeolocateError", e => { _logger.logger.error("Could not fetch location", e); // close the dialog and show an error when trying to share own location // pin drop location without permissions is ok if (isSharingOwnLocation(this.props.shareType)) { this.props.onFinished(); _Modal.default.createDialog(_ErrorDialog.default, { title: (0, _languageHandler._t)("location_sharing|error_fetch_location"), description: (0, _location.positionFailureMessage)(e.code) }); } if (this.geolocate) { this.map?.removeControl(this.geolocate); } }); (0, _defineProperty2.default)(this, "onTimeoutChange", timeout => { this.setState({ timeout }); }); (0, _defineProperty2.default)(this, "onOk", () => { const { timeout, position } = this.state; this.props.onChoose(position ? { uri: (0, _beacon.getGeoUri)(position), timestamp: position.timestamp, timeout } : { timeout }); this.props.onFinished(); }); this.state = { position: undefined, timeout: _LiveDurationDropdown.DEFAULT_DURATION_MS, error: undefined }; } componentDidMount() { this.context.on(_matrix.ClientEvent.ClientWellKnown, this.updateStyleUrl); try { this.map = new _maplibreGl.default.Map({ container: "mx_LocationPicker_map", style: (0, _location.findMapStyleUrl)(this.context), center: [0, 0], zoom: 1 }); // Add geolocate control to the map. this.geolocate = new _maplibreGl.default.GeolocateControl({ positionOptions: { enableHighAccuracy: true }, trackUserLocation: false }); this.map.addControl(this.geolocate); this.map.on("error", e => { _logger.logger.error("Failed to load map: check map_style_url in config.json has a valid URL and API key", e.error); this.setState({ error: _location.LocationShareError.MapStyleUrlNotReachable }); }); this.map.on("load", () => { this.geolocate?.trigger(); }); this.geolocate.on("error", this.onGeolocateError); if (isSharingOwnLocation(this.props.shareType)) { this.geolocate.on("geolocate", this.onGeolocate); } if (this.props.shareType === _shareLocation.LocationShareType.Pin) { const navigationControl = new _maplibreGl.default.NavigationControl({ showCompass: false, showZoom: true }); this.map.addControl(navigationControl, "bottom-right"); this.map.on("click", this.onClick); } } catch (e) { _logger.logger.error("Failed to render map", e); const errorMessage = e?.message; let errorType; if (errorMessage === _location.LocationShareError.MapStyleUrlNotConfigured) errorType = _location.LocationShareError.MapStyleUrlNotConfigured;else if (errorMessage.includes("Failed to initialize WebGL")) errorType = _location.LocationShareError.WebGLNotEnabled;else errorType = _location.LocationShareError.Default; this.setState({ error: errorType }); } } componentWillUnmount() { this.geolocate?.off("error", this.onGeolocateError); this.geolocate?.off("geolocate", this.onGeolocate); this.map?.off("click", this.onClick); this.context.off(_matrix.ClientEvent.ClientWellKnown, this.updateStyleUrl); } render() { if (this.state.error) { return /*#__PURE__*/_react.default.createElement("div", { className: "mx_LocationPicker mx_LocationPicker_hasError" }, /*#__PURE__*/_react.default.createElement(_MapError.MapError, { error: this.state.error, onFinished: this.props.onFinished })); } return /*#__PURE__*/_react.default.createElement("div", { className: "mx_LocationPicker" }, /*#__PURE__*/_react.default.createElement("div", { id: "mx_LocationPicker_map" }), this.props.shareType === _shareLocation.LocationShareType.Pin && /*#__PURE__*/_react.default.createElement("div", { className: "mx_LocationPicker_pinText" }, /*#__PURE__*/_react.default.createElement("span", null, this.state.position ? (0, _languageHandler._t)("location_sharing|click_move_pin") : (0, _languageHandler._t)("location_sharing|click_drop_pin"))), /*#__PURE__*/_react.default.createElement("div", { className: "mx_LocationPicker_footer" }, /*#__PURE__*/_react.default.createElement("form", { onSubmit: this.onOk }, this.props.shareType === _shareLocation.LocationShareType.Live && /*#__PURE__*/_react.default.createElement(_LiveDurationDropdown.default, { onChange: this.onTimeoutChange, timeout: this.state.timeout }), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { "data-testid": "location-picker-submit-button", type: "submit", element: "button", kind: "primary", className: "mx_LocationPicker_submitButton", disabled: !this.state.position, onClick: this.onOk }, (0, _languageHandler._t)("location_sharing|share_button")))), /*#__PURE__*/_react.default.createElement("div", { id: this.getMarkerId() }, !!this.marker && /*#__PURE__*/_react.default.createElement(_Marker.default, { roomMember: isSharingOwnLocation(this.props.shareType) ? this.props.sender : undefined, useMemberColor: this.props.shareType === _shareLocation.LocationShareType.Live }))); } } (0, _defineProperty2.default)(LocationPicker, "contextType", _MatrixClientContext.default); var _default = exports.default = LocationPicker; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tYXBsaWJyZUdsIiwiX2xvZ2dlciIsIl9tYXRyaXgiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX01hdHJpeENsaWVudENvbnRleHQiLCJfTW9kYWwiLCJfV2VsbEtub3duVXRpbHMiLCJfYmVhY29uIiwiX2xvY2F0aW9uIiwiX0Vycm9yRGlhbG9nIiwiX0FjY2Vzc2libGVCdXR0b24iLCJfTWFwRXJyb3IiLCJfTGl2ZUR1cmF0aW9uRHJvcGRvd24iLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9zaGFyZUxvY2F0aW9uIiwiX01hcmtlciIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsImlzU2hhcmluZ093bkxvY2F0aW9uIiwic2hhcmVUeXBlIiwiTG9jYXRpb25TaGFyZVR5cGUiLCJPd24iLCJMaXZlIiwiTG9jYXRpb25QaWNrZXIiLCJSZWFjdCIsIkNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJjb250ZXh0IiwiX2RlZmluZVByb3BlcnR5MiIsIm1hcmtlciIsIm1hcGxpYnJlZ2wiLCJNYXJrZXIiLCJlbGVtZW50IiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImdldE1hcmtlcklkIiwidW5kZWZpbmVkIiwiYW5jaG9yIiwib2Zmc2V0Iiwic2V0TG5nTGF0IiwiTG5nTGF0IiwiYWRkVG8iLCJtYXAiLCJjbGllbnRXZWxsS25vd24iLCJzdHlsZSIsInRpbGVTZXJ2ZXJGcm9tV2VsbEtub3duIiwic2V0U3R5bGUiLCJwb3NpdGlvbiIsImFkZE1hcmtlclRvTWFwIiwic2V0U3RhdGUiLCJnZW5lcmljUG9zaXRpb25Gcm9tR2VvbG9jYXRpb24iLCJjb29yZHMiLCJsb25naXR1ZGUiLCJsYXRpdHVkZSIsImV2ZW50IiwibG5nTGF0IiwidGltZXN0YW1wIiwiRGF0ZSIsIm5vdyIsImxhdCIsImxuZyIsImxvZ2dlciIsImVycm9yIiwib25GaW5pc2hlZCIsIk1vZGFsIiwiY3JlYXRlRGlhbG9nIiwiRXJyb3JEaWFsb2ciLCJ0aXRsZSIsIl90IiwiZGVzY3JpcHRpb24iLCJwb3NpdGlvbkZhaWx1cmVNZXNzYWdlIiwiY29kZSIsImdlb2xvY2F0ZSIsInJlbW92ZUNvbnRyb2wiLCJ0aW1lb3V0Iiwic3RhdGUiLCJvbkNob29zZSIsInVyaSIsImdldEdlb1VyaSIsIkRFRkFVTFRfRFVSQVRJT05fTVMiLCJjb21wb25lbnREaWRNb3VudCIsIm9uIiwiQ2xpZW50RXZlbnQiLCJDbGllbnRXZWxsS25vd24iLCJ1cGRhdGVTdHlsZVVybCIsIk1hcCIsImNvbnRhaW5lciIsImZpbmRNYXBTdHlsZVVybCIsImNlbnRlciIsInpvb20iLCJHZW9sb2NhdGVDb250cm9sIiwicG9zaXRpb25PcHRpb25zIiwiZW5hYmxlSGlnaEFjY3VyYWN5IiwidHJhY2tVc2VyTG9jYXRpb24iLCJhZGRDb250cm9sIiwiTG9jYXRpb25TaGFyZUVycm9yIiwiTWFwU3R5bGVVcmxOb3RSZWFjaGFibGUiLCJ0cmlnZ2VyIiwib25HZW9sb2NhdGVFcnJvciIsIm9uR2VvbG9jYXRlIiwiUGluIiwibmF2aWdhdGlvbkNvbnRyb2wiLCJOYXZpZ2F0aW9uQ29udHJvbCIsInNob3dDb21wYXNzIiwic2hvd1pvb20iLCJvbkNsaWNrIiwiZXJyb3JNZXNzYWdlIiwibWVzc2FnZSIsImVycm9yVHlwZSIsIk1hcFN0eWxlVXJsTm90Q29uZmlndXJlZCIsImluY2x1ZGVzIiwiV2ViR0xOb3RFbmFibGVkIiwiRGVmYXVsdCIsImNvbXBvbmVudFdpbGxVbm1vdW50Iiwib2ZmIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsIk1hcEVycm9yIiwiaWQiLCJvblN1Ym1pdCIsIm9uT2siLCJvbkNoYW5nZSIsIm9uVGltZW91dENoYW5nZSIsInR5cGUiLCJraW5kIiwiZGlzYWJsZWQiLCJyb29tTWVtYmVyIiwic2VuZGVyIiwidXNlTWVtYmVyQ29sb3IiLCJNYXRyaXhDbGllbnRDb250ZXh0IiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3MvbG9jYXRpb24vTG9jYXRpb25QaWNrZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIxIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCwgeyBTeW50aGV0aWNFdmVudCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IG1hcGxpYnJlZ2wsIHsgTWFwTW91c2VFdmVudCB9IGZyb20gXCJtYXBsaWJyZS1nbFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuaW1wb3J0IHsgUm9vbU1lbWJlciwgQ2xpZW50RXZlbnQsIElDbGllbnRXZWxsS25vd24gfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5cbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IE1hdHJpeENsaWVudENvbnRleHQgZnJvbSBcIi4uLy4uLy4uL2NvbnRleHRzL01hdHJpeENsaWVudENvbnRleHRcIjtcbmltcG9ydCBNb2RhbCBmcm9tIFwiLi4vLi4vLi4vTW9kYWxcIjtcbmltcG9ydCB7IHRpbGVTZXJ2ZXJGcm9tV2VsbEtub3duIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL1dlbGxLbm93blV0aWxzXCI7XG5pbXBvcnQgeyBHZW5lcmljUG9zaXRpb24sIGdlbmVyaWNQb3NpdGlvbkZyb21HZW9sb2NhdGlvbiwgZ2V0R2VvVXJpIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2JlYWNvblwiO1xuaW1wb3J0IHsgTG9jYXRpb25TaGFyZUVycm9yLCBmaW5kTWFwU3R5bGVVcmwsIHBvc2l0aW9uRmFpbHVyZU1lc3NhZ2UgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbG9jYXRpb25cIjtcbmltcG9ydCBFcnJvckRpYWxvZyBmcm9tIFwiLi4vZGlhbG9ncy9FcnJvckRpYWxvZ1wiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24gZnJvbSBcIi4uL2VsZW1lbnRzL0FjY2Vzc2libGVCdXR0b25cIjtcbmltcG9ydCB7IE1hcEVycm9yIH0gZnJvbSBcIi4vTWFwRXJyb3JcIjtcbmltcG9ydCBMaXZlRHVyYXRpb25Ecm9wZG93biwgeyBERUZBVUxUX0RVUkFUSU9OX01TIH0gZnJvbSBcIi4vTGl2ZUR1cmF0aW9uRHJvcGRvd25cIjtcbmltcG9ydCB7IExvY2F0aW9uU2hhcmVUeXBlLCBTaGFyZUxvY2F0aW9uRm4gfSBmcm9tIFwiLi9zaGFyZUxvY2F0aW9uXCI7XG5pbXBvcnQgTWFya2VyIGZyb20gXCIuL01hcmtlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElMb2NhdGlvblBpY2tlclByb3BzIHtcbiAgICBzZW5kZXI6IFJvb21NZW1iZXI7XG4gICAgc2hhcmVUeXBlOiBMb2NhdGlvblNoYXJlVHlwZTtcbiAgICBvbkNob29zZTogU2hhcmVMb2NhdGlvbkZuO1xuICAgIG9uRmluaXNoZWQoZXY/OiBTeW50aGV0aWNFdmVudCk6IHZvaWQ7XG59XG5cbmludGVyZmFjZSBJU3RhdGUge1xuICAgIHRpbWVvdXQ6IG51bWJlcjtcbiAgICBwb3NpdGlvbj86IEdlbmVyaWNQb3NpdGlvbjtcbiAgICBlcnJvcj86IExvY2F0aW9uU2hhcmVFcnJvcjtcbn1cblxuY29uc3QgaXNTaGFyaW5nT3duTG9jYXRpb24gPSAoc2hhcmVUeXBlOiBMb2NhdGlvblNoYXJlVHlwZSk6IGJvb2xlYW4gPT5cbiAgICBzaGFyZVR5cGUgPT09IExvY2F0aW9uU2hhcmVUeXBlLk93biB8fCBzaGFyZVR5cGUgPT09IExvY2F0aW9uU2hhcmVUeXBlLkxpdmU7XG5cbmNsYXNzIExvY2F0aW9uUGlja2VyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PElMb2NhdGlvblBpY2tlclByb3BzLCBJU3RhdGU+IHtcbiAgICBwdWJsaWMgc3RhdGljIGNvbnRleHRUeXBlID0gTWF0cml4Q2xpZW50Q29udGV4dDtcbiAgICBwdWJsaWMgZGVjbGFyZSBjb250ZXh0OiBSZWFjdC5Db250ZXh0VHlwZTx0eXBlb2YgTWF0cml4Q2xpZW50Q29udGV4dD47XG4gICAgcHJpdmF0ZSBtYXA/OiBtYXBsaWJyZWdsLk1hcDtcbiAgICBwcml2YXRlIGdlb2xvY2F0ZT86IG1hcGxpYnJlZ2wuR2VvbG9jYXRlQ29udHJvbDtcbiAgICBwcml2YXRlIG1hcmtlcj86IG1hcGxpYnJlZ2wuTWFya2VyO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3BzOiBJTG9jYXRpb25QaWNrZXJQcm9wcywgY29udGV4dDogUmVhY3QuQ29udGV4dFR5cGU8dHlwZW9mIE1hdHJpeENsaWVudENvbnRleHQ+KSB7XG4gICAgICAgIHN1cGVyKHByb3BzLCBjb250ZXh0KTtcblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgcG9zaXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRpbWVvdXQ6IERFRkFVTFRfRFVSQVRJT05fTVMsXG4gICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TWFya2VySWQgPSAoKTogc3RyaW5nID0+IHtcbiAgICAgICAgcmV0dXJuIFwibXhfTUxvY2F0aW9uUGlja2VyX21hcmtlclwiO1xuICAgIH07XG5cbiAgICBwdWJsaWMgY29tcG9uZW50RGlkTW91bnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udGV4dC5vbihDbGllbnRFdmVudC5DbGllbnRXZWxsS25vd24sIHRoaXMudXBkYXRlU3R5bGVVcmwpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLm1hcCA9IG5ldyBtYXBsaWJyZWdsLk1hcCh7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyOiBcIm14X0xvY2F0aW9uUGlja2VyX21hcFwiLFxuICAgICAgICAgICAgICAgIHN0eWxlOiBmaW5kTWFwU3R5bGVVcmwodGhpcy5jb250ZXh0KSxcbiAgICAgICAgICAgICAgICBjZW50ZXI6IFswLCAwXSxcbiAgICAgICAgICAgICAgICB6b29tOiAxLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIEFkZCBnZW9sb2NhdGUgY29udHJvbCB0byB0aGUgbWFwLlxuICAgICAgICAgICAgdGhpcy5nZW9sb2NhdGUgPSBuZXcgbWFwbGlicmVnbC5HZW9sb2NhdGVDb250cm9sKHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbk9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlSGlnaEFjY3VyYWN5OiB0cnVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdHJhY2tVc2VyTG9jYXRpb246IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMubWFwLmFkZENvbnRyb2wodGhpcy5nZW9sb2NhdGUpO1xuXG4gICAgICAgICAgICB0aGlzLm1hcC5vbihcImVycm9yXCIsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIkZhaWxlZCB0byBsb2FkIG1hcDogY2hlY2sgbWFwX3N0eWxlX3VybCBpbiBjb25maWcuanNvbiBoYXMgYSB2YWxpZCBVUkwgYW5kIEFQSSBrZXlcIixcbiAgICAgICAgICAgICAgICAgICAgZS5lcnJvcixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBlcnJvcjogTG9jYXRpb25TaGFyZUVycm9yLk1hcFN0eWxlVXJsTm90UmVhY2hhYmxlIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMubWFwLm9uKFwibG9hZFwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZW9sb2NhdGU/LnRyaWdnZXIoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmdlb2xvY2F0ZS5vbihcImVycm9yXCIsIHRoaXMub25HZW9sb2NhdGVFcnJvcik7XG5cbiAgICAgICAgICAgIGlmIChpc1NoYXJpbmdPd25Mb2NhdGlvbih0aGlzLnByb3BzLnNoYXJlVHlwZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdlb2xvY2F0ZS5vbihcImdlb2xvY2F0ZVwiLCB0aGlzLm9uR2VvbG9jYXRlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuc2hhcmVUeXBlID09PSBMb2NhdGlvblNoYXJlVHlwZS5QaW4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uQ29udHJvbCA9IG5ldyBtYXBsaWJyZWdsLk5hdmlnYXRpb25Db250cm9sKHtcbiAgICAgICAgICAgICAgICAgICAgc2hvd0NvbXBhc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBzaG93Wm9vbTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm1hcC5hZGRDb250cm9sKG5hdmlnYXRpb25Db250cm9sLCBcImJvdHRvbS1yaWdodFwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1hcC5vbihcImNsaWNrXCIsIHRoaXMub25DbGljayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkZhaWxlZCB0byByZW5kZXIgbWFwXCIsIGUpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gKGUgYXMgRXJyb3IpPy5tZXNzYWdlO1xuICAgICAgICAgICAgbGV0IGVycm9yVHlwZTtcbiAgICAgICAgICAgIGlmIChlcnJvck1lc3NhZ2UgPT09IExvY2F0aW9uU2hhcmVFcnJvci5NYXBTdHlsZVVybE5vdENvbmZpZ3VyZWQpXG4gICAgICAgICAgICAgICAgZXJyb3JUeXBlID0gTG9jYXRpb25TaGFyZUVycm9yLk1hcFN0eWxlVXJsTm90Q29uZmlndXJlZDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yTWVzc2FnZS5pbmNsdWRlcyhcIkZhaWxlZCB0byBpbml0aWFsaXplIFdlYkdMXCIpKVxuICAgICAgICAgICAgICAgIGVycm9yVHlwZSA9IExvY2F0aW9uU2hhcmVFcnJvci5XZWJHTE5vdEVuYWJsZWQ7XG4gICAgICAgICAgICBlbHNlIGVycm9yVHlwZSA9IExvY2F0aW9uU2hhcmVFcnJvci5EZWZhdWx0O1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGVycm9yOiBlcnJvclR5cGUgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50V2lsbFVubW91bnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZ2VvbG9jYXRlPy5vZmYoXCJlcnJvclwiLCB0aGlzLm9uR2VvbG9jYXRlRXJyb3IpO1xuICAgICAgICB0aGlzLmdlb2xvY2F0ZT8ub2ZmKFwiZ2VvbG9jYXRlXCIsIHRoaXMub25HZW9sb2NhdGUpO1xuICAgICAgICB0aGlzLm1hcD8ub2ZmKFwiY2xpY2tcIiwgdGhpcy5vbkNsaWNrKTtcbiAgICAgICAgdGhpcy5jb250ZXh0Lm9mZihDbGllbnRFdmVudC5DbGllbnRXZWxsS25vd24sIHRoaXMudXBkYXRlU3R5bGVVcmwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkTWFya2VyVG9NYXAgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMubWFya2VyID0gbmV3IG1hcGxpYnJlZ2wuTWFya2VyKHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0TWFya2VySWQoKSkgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgYW5jaG9yOiBcImJvdHRvbVwiLFxuICAgICAgICAgICAgb2Zmc2V0OiBbMCwgLTFdLFxuICAgICAgICB9KVxuICAgICAgICAgICAgLnNldExuZ0xhdChuZXcgbWFwbGlicmVnbC5MbmdMYXQoMCwgMCkpXG4gICAgICAgICAgICAuYWRkVG8odGhpcy5tYXAhKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSB1cGRhdGVTdHlsZVVybCA9IChjbGllbnRXZWxsS25vd246IElDbGllbnRXZWxsS25vd24pOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSB0aWxlU2VydmVyRnJvbVdlbGxLbm93bihjbGllbnRXZWxsS25vd24pPy5bXCJtYXBfc3R5bGVfdXJsXCJdO1xuICAgICAgICBpZiAoc3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMubWFwPy5zZXRTdHlsZShzdHlsZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkdlb2xvY2F0ZSA9IChwb3NpdGlvbjogR2VvbG9jYXRpb25Qb3NpdGlvbik6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoIXRoaXMubWFya2VyKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE1hcmtlclRvTWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHBvc2l0aW9uOiBnZW5lcmljUG9zaXRpb25Gcm9tR2VvbG9jYXRpb24ocG9zaXRpb24pIH0pO1xuICAgICAgICB0aGlzLm1hcmtlcj8uc2V0TG5nTGF0KG5ldyBtYXBsaWJyZWdsLkxuZ0xhdChwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlLCBwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGUpKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkNsaWNrID0gKGV2ZW50OiBNYXBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tYXJrZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkTWFya2VyVG9NYXAoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcmtlcj8uc2V0TG5nTGF0KGV2ZW50LmxuZ0xhdCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgbGF0aXR1ZGU6IGV2ZW50LmxuZ0xhdC5sYXQsXG4gICAgICAgICAgICAgICAgbG9uZ2l0dWRlOiBldmVudC5sbmdMYXQubG5nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25HZW9sb2NhdGVFcnJvciA9IChlOiBHZW9sb2NhdGlvblBvc2l0aW9uRXJyb3IpOiB2b2lkID0+IHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFwiQ291bGQgbm90IGZldGNoIGxvY2F0aW9uXCIsIGUpO1xuICAgICAgICAvLyBjbG9zZSB0aGUgZGlhbG9nIGFuZCBzaG93IGFuIGVycm9yIHdoZW4gdHJ5aW5nIHRvIHNoYXJlIG93biBsb2NhdGlvblxuICAgICAgICAvLyBwaW4gZHJvcCBsb2NhdGlvbiB3aXRob3V0IHBlcm1pc3Npb25zIGlzIG9rXG4gICAgICAgIGlmIChpc1NoYXJpbmdPd25Mb2NhdGlvbih0aGlzLnByb3BzLnNoYXJlVHlwZSkpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25GaW5pc2hlZCgpO1xuICAgICAgICAgICAgTW9kYWwuY3JlYXRlRGlhbG9nKEVycm9yRGlhbG9nLCB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IF90KFwibG9jYXRpb25fc2hhcmluZ3xlcnJvcl9mZXRjaF9sb2NhdGlvblwiKSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogcG9zaXRpb25GYWlsdXJlTWVzc2FnZShlLmNvZGUpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5nZW9sb2NhdGUpIHtcbiAgICAgICAgICAgIHRoaXMubWFwPy5yZW1vdmVDb250cm9sKHRoaXMuZ2VvbG9jYXRlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIG9uVGltZW91dENoYW5nZSA9ICh0aW1lb3V0OiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHRpbWVvdXQgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25PayA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgeyB0aW1lb3V0LCBwb3NpdGlvbiB9ID0gdGhpcy5zdGF0ZTtcblxuICAgICAgICB0aGlzLnByb3BzLm9uQ2hvb3NlKFxuICAgICAgICAgICAgcG9zaXRpb25cbiAgICAgICAgICAgICAgICA/IHsgdXJpOiBnZXRHZW9VcmkocG9zaXRpb24pLCB0aW1lc3RhbXA6IHBvc2l0aW9uLnRpbWVzdGFtcCwgdGltZW91dCB9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucHJvcHMub25GaW5pc2hlZCgpO1xuICAgIH07XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfTG9jYXRpb25QaWNrZXIgbXhfTG9jYXRpb25QaWNrZXJfaGFzRXJyb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPE1hcEVycm9yIGVycm9yPXt0aGlzLnN0YXRlLmVycm9yfSBvbkZpbmlzaGVkPXt0aGlzLnByb3BzLm9uRmluaXNoZWR9IC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfTG9jYXRpb25QaWNrZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwibXhfTG9jYXRpb25QaWNrZXJfbWFwXCIgLz5cblxuICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLnNoYXJlVHlwZSA9PT0gTG9jYXRpb25TaGFyZVR5cGUuUGluICYmIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9Mb2NhdGlvblBpY2tlcl9waW5UZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dGhpcy5zdGF0ZS5wb3NpdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF90KFwibG9jYXRpb25fc2hhcmluZ3xjbGlja19tb3ZlX3BpblwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF90KFwibG9jYXRpb25fc2hhcmluZ3xjbGlja19kcm9wX3BpblwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0xvY2F0aW9uUGlja2VyX2Zvb3RlclwiPlxuICAgICAgICAgICAgICAgICAgICA8Zm9ybSBvblN1Ym1pdD17dGhpcy5vbk9rfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLnNoYXJlVHlwZSA9PT0gTG9jYXRpb25TaGFyZVR5cGUuTGl2ZSAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPExpdmVEdXJhdGlvbkRyb3Bkb3duIG9uQ2hhbmdlPXt0aGlzLm9uVGltZW91dENoYW5nZX0gdGltZW91dD17dGhpcy5zdGF0ZS50aW1lb3V0fSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJsb2NhdGlvbi1waWNrZXItc3VibWl0LWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudD1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZD1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0xvY2F0aW9uUGlja2VyX3N1Ym1pdEJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyF0aGlzLnN0YXRlLnBvc2l0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMub25Pa31cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJsb2NhdGlvbl9zaGFyaW5nfHNoYXJlX2J1dHRvblwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9e3RoaXMuZ2V0TWFya2VySWQoKX0+XG4gICAgICAgICAgICAgICAgICAgIHsvKlxuICAgICAgICAgICAgICAgICAgICBtYXBsaWJyZWdsIGhpamFja3MgdGhlIGRpdiBhYm92ZSB0byBzdHlsZSB0aGUgbWFya2VyXG4gICAgICAgICAgICAgICAgICAgIGl0IG11c3QgYmUgaW4gdGhlIGRvbSB3aGVuIHRoZSBtYXAgaXMgaW5pdGlhbGlzZWRcbiAgICAgICAgICAgICAgICAgICAgYW5kIGtlZXAgYSBjb25zaXN0ZW50IGNsYXNzXG4gICAgICAgICAgICAgICAgICAgIHdlIHdhbnQgdG8gaGlkZSB0aGUgbWFya2VyIHVudGlsIGl0IGlzIHNldCBpbiB0aGUgY2FzZSBvZiBwaW4gZHJvcFxuICAgICAgICAgICAgICAgICAgICBzbyBoaWRlIHRoZSBpbnRlcm5hbCB2aXNpYmxlIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgICAgICovfVxuXG4gICAgICAgICAgICAgICAgICAgIHshIXRoaXMubWFya2VyICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxNYXJrZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb29tTWVtYmVyPXtpc1NoYXJpbmdPd25Mb2NhdGlvbih0aGlzLnByb3BzLnNoYXJlVHlwZSkgPyB0aGlzLnByb3BzLnNlbmRlciA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VNZW1iZXJDb2xvcj17dGhpcy5wcm9wcy5zaGFyZVR5cGUgPT09IExvY2F0aW9uU2hhcmVUeXBlLkxpdmV9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMb2NhdGlvblBpY2tlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFRQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxXQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxPQUFBLEdBQUFILE9BQUE7QUFFQSxJQUFBSSxnQkFBQSxHQUFBSixPQUFBO0FBQ0EsSUFB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