UNPKG

@synerty/vortexjs

Version:

Custom observable data serialisation and routing based on Angular 2+

126 lines 16.5 kB
import { VortexClientABC } from "./VortexClientABC"; import { dateStr } from "./UtilMisc"; import { NgLifeCycleEvents } from "../util/NgLifeCycleEvents"; import { takeUntil } from "rxjs/operators"; /** Payload Response * * This class is used to catch responses from a sent payload. * If the remote end is going to send back a payload, with the same filt, * this class catches this then either resolves or rejects the promise. * * If the response is not received within the timeout, the errback is called. * * ** The PayloadResponse in VortexJS Sends the Payload ** * * Here is some example usage. * * :: * * payload = Payload(filt={"rapuiServerEcho":True}) * responsePromise = PayloadResponse(vortexService, payload) * .then((payload) => console.log(`Received payload ${payload}`)) * .catch((err) => console.log(err)); * */ export class PayloadResponse { payloadEnvelope; timeoutSeconds; resultCheck; static RESPONSE_TIMEOUT_SECONDS = 30.0; static messageIdKey = "PayloadResponse.messageId"; PROCESSING = "Processing"; // NO_ENDPOINT = "No Endpoint" FAILED = "Failed"; SEND_FAILED = "Send Failed"; SUCCESS = "Success"; TIMED_OUT = "Timed Out"; _messageId = VortexClientABC.makeUuid(); _status = this.PROCESSING; _lcEmitter = new NgLifeCycleEvents(); promise; /** Constructor * @param vortexService * @param payloadEnvelope The PayloadEnvelope to send. * @param timeoutSeconds The timeout to wait for a response - in seconds; * @param resultCheck Should the result of the payload response be checked. */ constructor(vortexService, payloadEnvelope, timeoutSeconds = PayloadResponse.RESPONSE_TIMEOUT_SECONDS, resultCheck = true) { this.payloadEnvelope = payloadEnvelope; this.timeoutSeconds = timeoutSeconds; this.resultCheck = resultCheck; this.promise = new Promise((resolve, reject) => { // Start the timer let timer = null; // Create the endpoint this.payloadEnvelope.filt[PayloadResponse.messageIdKey] = this._messageId; let endpoint = vortexService.createEndpoint(this._lcEmitter, this.payloadEnvelope.filt); let finish = (status) => { this._status = status; this._lcEmitter.onDestroyEvent.next(); if (timer != null) { clearTimeout(timer); timer = null; } }; let callFail = (status, msgArg = "") => { let filtStr = JSON.stringify(this.payloadEnvelope.filt); let msg = `${dateStr()} PayloadEndpoint ${status} Failed : ${msgArg}\n${filtStr}`; console.log(msg); finish(status); reject(msgArg); }; // Subscribe endpoint.observable .pipe(takeUntil(this._lcEmitter.onDestroyEvent)) .subscribe((payloadEnvelope) => { let r = payloadEnvelope.result; // success is null or true if (this.resultCheck && !(r == null || r === true)) { callFail(this.FAILED, r.toString()); } else { finish(this.SUCCESS); resolve(payloadEnvelope); } }); vortexService .sendPayloadEnvelope(this.payloadEnvelope) .then(() => { timer = setTimeout(() => callFail(this.TIMED_OUT), timeoutSeconds * 1000); }) .catch((err) => { callFail(this.SEND_FAILED, err); }); }); } /** * Attaches callbacks for the resolution and/or rejection of the Promise. * @param onfulfilled The callback to execute when the Promise is resolved. * @param onrejected The callback to execute when the Promise is rejected. * @returns A Promise for the completion of which ever callback is executed. */ then(onfulfilled, onrejected = null) { return this.promise.then(onfulfilled, onrejected); } /** * Attaches a callback for only the rejection of the Promise. * @param onrejected The callback to execute when the Promise is rejected. * @returns A Promise for the completion of the callback. */ catch(onrejected) { return this.promise.catch(onrejected); } /** Is Response Payload * * The PayloadResponse tags the payloads, so it expects a unique message back. * * @returns True if this payload has been tagged by a PayloadResponse class */ static isResponsePayloadEnvelope(payloadEnvelope) { return payloadEnvelope.filt.hasOwnProperty(PayloadResponse.messageIdKey); } get status() { return this._status; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGF5bG9hZFJlc3BvbnNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3ZvcnRleC9QYXlsb2FkUmVzcG9uc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWxELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFbkMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFFNUQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRXpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUEwQlo7SUFDQTtJQUNBO0lBM0JMLE1BQU0sQ0FBVSx3QkFBd0IsR0FBRyxJQUFJLENBQUM7SUFDL0MsTUFBTSxDQUFDLFlBQVksR0FBRywyQkFBMkIsQ0FBQztJQUVqRCxVQUFVLEdBQUcsWUFBWSxDQUFDO0lBQ25DLDhCQUE4QjtJQUNyQixNQUFNLEdBQUcsUUFBUSxDQUFDO0lBQ2xCLFdBQVcsR0FBRyxhQUFhLENBQUM7SUFDNUIsT0FBTyxHQUFHLFNBQVMsQ0FBQztJQUNwQixTQUFTLEdBQUcsV0FBVyxDQUFDO0lBRXpCLFVBQVUsR0FBVyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDaEQsT0FBTyxHQUFXLElBQUksQ0FBQyxVQUFVLENBQUM7SUFFbEMsVUFBVSxHQUFzQixJQUFJLGlCQUFpQixFQUFFLENBQUM7SUFFeEQsT0FBTyxDQUEyQjtJQUUxQzs7Ozs7T0FLRztJQUNILFlBQ0ksYUFBNEIsRUFDcEIsZUFBZ0MsRUFDaEMsaUJBQXlCLGVBQWUsQ0FBQyx3QkFBd0IsRUFDakUsY0FBdUIsSUFBSTtRQUYzQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsbUJBQWMsR0FBZCxjQUFjLENBQW1EO1FBQ2pFLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtR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QUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLHlCQUF5QixDQUFDLGVBQWdDO1FBQzdELE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQ3RDLGVBQWUsQ0FBQyxZQUFZLENBQy9CLENBQUM7SUFDTixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ04sT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1ZvcnRleENsaWVudEFCQ30gZnJvbSBcIi4vVm9ydGV4Q2xpZW50QUJDXCI7XG5pbXBvcnQge0lQYXlsb2FkRmlsdH0gZnJvbSBcIi4vUGF5bG9hZFwiO1xuaW1wb3J0IHtkYXRlU3RyfSBmcm9tIFwiLi9VdGlsTWlzY1wiO1xuaW1wb3J0IHtWb3J0ZXhTZXJ2aWNlfSBmcm9tIFwiLi9Wb3J0ZXhTZXJ2aWNlXCI7XG5pbXBvcnQge05nTGlmZUN5Y2xlRXZlbnRzfSBmcm9tIFwiLi4vdXRpbC9OZ0xpZmVDeWNsZUV2ZW50c1wiO1xuaW1wb3J0IHtQYXlsb2FkRW52ZWxvcGV9IGZyb20gXCIuL1BheWxvYWRFbnZlbG9wZVwiO1xuaW1wb3J0IHt0YWtlVW50aWx9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG4vKiogUGF5bG9hZCBSZXNwb25zZVxuICpcbiAqICAgIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjYXRjaCByZXNwb25zZXMgZnJvbSBhIHNlbnQgcGF5bG9hZC5cbiAqICAgIElmIHRoZSByZW1vdGUgZW5kIGlzIGdvaW5nIHRvIHNlbmQgYmFjayBhIHBheWxvYWQsIHdpdGggdGhlIHNhbWUgZmlsdCxcbiAqICAgIHRoaXMgY2xhc3MgY2F0Y2hlcyB0aGlzIHRoZW4gZWl0aGVyIHJlc29sdmVzIG9yIHJlamVjdHMgdGhlIHByb21pc2UuXG4gKlxuICogICAgSWYgdGhlIHJlc3BvbnNlIGlzIG5vdCByZWNlaXZlZCB3aXRoaW4gdGhlIHRpbWVvdXQsIHRoZSBlcnJiYWNrIGlzIGNhbGxlZC5cbiAqXG4gKiAgICAqKiBUaGUgUGF5bG9hZFJlc3BvbnNlIGluIFZvcnRleEpTIFNlbmRzIHRoZSBQYXlsb2FkICoqXG4gKlxuICogICAgSGVyZSBpcyBzb21lIGV4YW1wbGUgdXNhZ2UuXG4gKlxuICogICAgOjpcbiAqXG4gKiAgICAgICAgcGF5bG9hZCA9IFBheWxvYWQoZmlsdD17XCJyYXB1aVNlcnZlckVjaG9cIjpUcnVlfSlcbiAqICAgICAgICByZXNwb25zZVByb21pc2UgPSBQYXlsb2FkUmVzcG9uc2Uodm9ydGV4U2VydmljZSwgcGF5bG9hZClcbiAqICAgICAgICAgIC50aGVuKChwYXlsb2FkKSA9PiBjb25zb2xlLmxvZyhgUmVjZWl2ZWQgcGF5bG9hZCAke3BheWxvYWR9YCkpXG4gKiAgICAgICAgICAuY2F0Y2goKGVycikgPT4gY29uc29sZS5sb2coZXJyKSk7XG4gKlxuICovXG5leHBvcnQgY2xhc3MgUGF5bG9hZFJlc3BvbnNlIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJFU1BPTlNFX1RJTUVPVVRfU0VDT05EUyA9IDMwLjA7XG4gICAgcHJpdmF0ZSBzdGF0aWMgbWVzc2FnZUlkS2V5ID0gXCJQYXlsb2FkUmVzcG9uc2UubWVzc2FnZUlkXCI7XG5cbiAgICByZWFkb25seSBQUk9DRVNTSU5HID0gXCJQcm9jZXNzaW5nXCI7XG4gICAgLy8gTk9fRU5EUE9JTlQgPSBcIk5vIEVuZHBvaW50XCJcbiAgICByZWFkb25seSBGQUlMRUQgPSBcIkZhaWxlZFwiO1xuICAgIHJlYWRvbmx5IFNFTkRfRkFJTEVEID0gXCJTZW5kIEZhaWxlZFwiO1xuICAgIHJlYWRvbmx5IFNVQ0NFU1MgPSBcIlN1Y2Nlc3NcIjtcbiAgICByZWFkb25seSBUSU1FRF9PVVQgPSBcIlRpbWVkIE91dFwiO1xuXG4gICAgcHJpdmF0ZSBfbWVzc2FnZUlkOiBzdHJpbmcgPSBWb3J0ZXhDbGllbnRBQkMubWFrZVV1aWQoKTtcbiAgICBwcml2YXRlIF9zdGF0dXM6IHN0cmluZyA9IHRoaXMuUFJPQ0VTU0lORztcblxuICAgIHByaXZhdGUgX2xjRW1pdHRlcjogTmdMaWZlQ3ljbGVFdmVudHMgPSBuZXcgTmdMaWZlQ3ljbGVFdmVudHMoKTtcblxuICAgIHByaXZhdGUgcHJvbWlzZTogUHJvbWlzZTxQYXlsb2FkRW52ZWxvcGU+O1xuXG4gICAgLyoqIENvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHZvcnRleFNlcnZpY2VcbiAgICAgKiBAcGFyYW0gcGF5bG9hZEVudmVsb3BlIFRoZSBQYXlsb2FkRW52ZWxvcGUgdG8gc2VuZC5cbiAgICAgKiBAcGFyYW0gdGltZW91dFNlY29uZHMgVGhlIHRpbWVvdXQgdG8gd2FpdCBmb3IgYSByZXNwb25zZSAtIGluIHNlY29uZHM7XG4gICAgICogQHBhcmFtIHJlc3VsdENoZWNrIFNob3VsZCB0aGUgcmVzdWx0IG9mIHRoZSBwYXlsb2FkIHJlc3BvbnNlIGJlIGNoZWNrZWQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHZvcnRleFNlcnZpY2U6IFZvcnRleFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcGF5bG9hZEVudmVsb3BlOiBQYXlsb2FkRW52ZWxvcGUsXG4gICAgICAgIHByaXZhdGUgdGltZW91dFNlY29uZHM6IG51bWJlciA9IFBheWxvYWRSZXNwb25zZS5SRVNQT05TRV9USU1FT1VUX1NFQ09ORFMsXG4gICAgICAgIHByaXZhdGUgcmVzdWx0Q2hlY2s6IGJvb2xlYW4gPSB0cnVlLFxuICAgICkge1xuICAgICAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZTxQYXlsb2FkRW52ZWxvcGU+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSB0aW1lclxuICAgICAgICAgICAgbGV0IHRpbWVyID0gbnVsbDtcblxuICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBlbmRwb2ludFxuICAgICAgICAgICAgdGhpcy5wYXlsb2FkRW52ZWxvcGUuZmlsdFtQYXlsb2FkUmVzcG9uc2UubWVzc2FnZUlkS2V5XSA9XG4gICAgICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUlkO1xuICAgICAgICAgICAgbGV0IGVuZHBvaW50ID0gdm9ydGV4U2VydmljZS5jcmVhdGVFbmRwb2ludChcbiAgICAgICAgICAgICAgICB0aGlzLl9sY0VtaXR0ZXIsXG4gICAgICAgICAgICAgICAgPElQYXlsb2FkRmlsdD50aGlzLnBheWxvYWRFbnZlbG9wZS5maWx0LFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgbGV0IGZpbmlzaCA9IChzdGF0dXMpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGNFbWl0dGVyLm9uRGVzdHJveUV2ZW50Lm5leHQoKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aW1lciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgY2FsbEZhaWwgPSAoc3RhdHVzOiBzdHJpbmcsIG1zZ0FyZyA9IFwiXCIpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZmlsdFN0ciA9IEpTT04uc3RyaW5naWZ5KHRoaXMucGF5bG9hZEVudmVsb3BlLmZpbHQpO1xuICAgICAgICAgICAgICAgIGxldCBtc2cgPSBgJHtkYXRlU3RyKCl9IFBheWxvYWRFbmRwb2ludCAke3N0YXR1c30gRmFpbGVkIDogJHttc2dBcmd9XFxuJHtmaWx0U3RyfWA7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cobXNnKTtcblxuICAgICAgICAgICAgICAgIGZpbmlzaChzdGF0dXMpO1xuICAgICAgICAgICAgICAgIHJlamVjdChtc2dBcmcpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gU3Vic2NyaWJlXG4gICAgICAgICAgICBlbmRwb2ludC5vYnNlcnZhYmxlXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2xjRW1pdHRlci5vbkRlc3Ryb3lFdmVudCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgocGF5bG9hZEVudmVsb3BlOiBQYXlsb2FkRW52ZWxvcGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHIgPSBwYXlsb2FkRW52ZWxvcGUucmVzdWx0OyAvLyBzdWNjZXNzIGlzIG51bGwgb3IgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXN1bHRDaGVjayAmJiAhKHIgPT0gbnVsbCB8fCByID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEZhaWwodGhpcy5GQUlMRUQsIHIudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2godGhpcy5TVUNDRVNTKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocGF5bG9hZEVudmVsb3BlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB2b3J0ZXhTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLnNlbmRQYXlsb2FkRW52ZWxvcGUodGhpcy5wYXlsb2FkRW52ZWxvcGUpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiBjYWxsRmFpbCh0aGlzLlRJTUVEX09VVCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0U2Vjb25kcyAqIDEwMDAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjYWxsRmFpbCh0aGlzLlNFTkRfRkFJTEVELCBlcnIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hlcyBjYWxsYmFja3MgZm9yIHRoZSByZXNvbHV0aW9uIGFuZC9vciByZWplY3Rpb24gb2YgdGhlIFByb21pc2UuXG4gICAgICogQHBhcmFtIG9uZnVsZmlsbGVkIFRoZSBjYWxsYmFjayB0byBleGVjdXRlIHdoZW4gdGhlIFByb21pc2UgaXMgcmVzb2x2ZWQuXG4gICAgICogQHBhcmFtIG9ucmVqZWN0ZWQgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgd2hlbiB0aGUgUHJvbWlzZSBpcyByZWplY3RlZC5cbiAgICAgKiBAcmV0dXJucyBBIFByb21pc2UgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHdoaWNoIGV2ZXIgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuXG4gICAgICovXG4gICAgdGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCA9IG51bGwpOiBQcm9taXNlPFBheWxvYWRFbnZlbG9wZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlLnRoZW4ob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIGEgY2FsbGJhY2sgZm9yIG9ubHkgdGhlIHJlamVjdGlvbiBvZiB0aGUgUHJvbWlzZS5cbiAgICAgKiBAcGFyYW0gb25yZWplY3RlZCBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSB3aGVuIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLlxuICAgICAqIEByZXR1cm5zIEEgUHJvbWlzZSBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGNhbGxiYWNrLlxuICAgICAqL1xuICAgIGNhdGNoKG9ucmVqZWN0ZWQpOiBQcm9taXNlPFBheWxvYWRFbnZlbG9wZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlLmNhdGNoKG9ucmVqZWN0ZWQpO1xuICAgIH1cblxuICAgIC8qKiBJcyBSZXNwb25zZSBQYXlsb2FkXG4gICAgICpcbiAgICAgKiBUaGUgUGF5bG9hZFJlc3BvbnNlIHRhZ3MgdGhlIHBheWxvYWRzLCBzbyBpdCBleHBlY3RzIGEgdW5pcXVlIG1lc3NhZ2UgYmFjay5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhpcyBwYXlsb2FkIGhhcyBiZWVuIHRhZ2dlZCBieSBhIFBheWxvYWRSZXNwb25zZSBjbGFzc1xuICAgICAqL1xuICAgIHN0YXRpYyBpc1Jlc3BvbnNlUGF5bG9hZEVudmVsb3BlKHBheWxvYWRFbnZlbG9wZTogUGF5bG9hZEVudmVsb3BlKSB7XG4gICAgICAgIHJldHVybiBwYXlsb2FkRW52ZWxvcGUuZmlsdC5oYXNPd25Qcm9wZXJ0eShcbiAgICAgICAgICAgIFBheWxvYWRSZXNwb25zZS5tZXNzYWdlSWRLZXksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0IHN0YXR1cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXR1cztcbiAgICB9XG59XG4iXX0=