UNPKG

@synerty/vortexjs

Version:

Custom observable data serialisation and routing based on Angular 2+

121 lines 16.3 kB
import { Payload } from "./Payload"; import { Inject, Injectable } from "@angular/core"; import { PayloadEndpoint } from "./PayloadEndpoint"; import { TupleLoader } from "./TupleLoader"; import { VortexStatusService } from "./VortexStatusService"; import { VortexClientHttp } from "./VortexClientHttp"; import { VortexClientWebsocket } from "./VortexClientWebsocket"; import { dateStr } from "./UtilMisc"; import * as i0 from "@angular/core"; export class VortexService { vortexStatusService; vortex; static vortexUrl = "/vortex"; static vortexClientName = ""; constructor(vortexStatusService) { this.vortexStatusService = vortexStatusService; this.reconnect() // .catch((e) => console.log(`${dateStr()} VortexService constructor reconnect failed`)); } /** * Set Vortex URL * * This method should not be used except in rare cases, such as an ios or android app. * * @param url: The new URL for the vortex to use. */ static setVortexUrl(url) { VortexService.vortexUrl = url; } /** * Set Vortex Name * * @param vortexClientName: The vortexClientName to tell the server that we are. */ static setVortexClientName(vortexClientName) { VortexService.vortexClientName = vortexClientName; } async reconnect() { if (VortexService.vortexUrl == null) { this.vortexStatusService.setOnline(false); return; } if (VortexService.vortexClientName == "") { throw new Error("VortexService.setVortexClientName() not set yet"); } if (this.vortex != null) await this.vortex.close(); if (VortexService.vortexUrl.toLowerCase().startsWith("ws")) { this.vortex = new VortexClientWebsocket(this.vortexStatusService, VortexService.vortexUrl, VortexService.vortexClientName); } else { this.vortex = new VortexClientHttp(this.vortexStatusService, VortexService.vortexUrl, VortexService.vortexClientName); } await this.vortex.reconnect(); } sendTuple(filt, tuples) { if (typeof filt === "string") { filt = { key: filt }; } this.sendPayload(new Payload(filt, tuples)); } sendFilt(filt) { this.sendPayload(new Payload(filt)); } /** Send Payload * * @param {Payload[] | Payload} payload * @returns {Promise<void>} */ sendPayload(payload) { if (this.vortex == null) { throw new Error("The vortex is not initialised yet."); } let payloads = []; if (payload instanceof Array) payloads = payload; else payloads = [payload]; let promises = []; for (let payload of payloads) { promises.push(payload .makePayloadEnvelope() .then((payloadEnvelope) => { this.vortex.send(payloadEnvelope); })); } let ret = Promise.all(promises); return ret; } /** Send Payload Envelope(s) * * @param {PayloadEnvelope[] | PayloadEnvelope} payloadEnvelope * @returns {Promise<void>} */ sendPayloadEnvelope(payloadEnvelope) { if (this.vortex == null) { throw new Error("The vortex is not initialised yet."); } return this.vortex.send(payloadEnvelope); } createEndpointObservable(component, filter, processLatestOnly = false) { let endpoint = new PayloadEndpoint(component, filter, processLatestOnly); return this.createEndpoint(component, filter, processLatestOnly) .observable; } createEndpoint(component, filter, processLatestOnly = false) { return new PayloadEndpoint(component, filter, processLatestOnly); } createTupleLoader(component, filterUpdateCallable) { return new TupleLoader(this.vortex, this.vortexStatusService, component, filterUpdateCallable); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VortexService, deps: [{ token: VortexStatusService }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VortexService }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VortexService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [VortexStatusService] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVm9ydGV4U2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy92b3J0ZXgvVm9ydGV4U2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdCLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUduRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUF5QixXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHaEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQzs7QUFHckMsTUFBTSxPQUFPLGFBQWE7SUFLMkI7SUFKekMsTUFBTSxDQUFrQjtJQUN4QixNQUFNLENBQUMsU0FBUyxHQUFrQixTQUFTLENBQUM7SUFDNUMsTUFBTSxDQUFDLGdCQUFnQixHQUFXLEVBQUUsQ0FBQztJQUU3QyxZQUFpRCxtQkFBbUI7UUFBbkIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFBO1FBQ2hFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFO2FBQ2QsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDVCxPQUFPLENBQUMsR0FBRyxDQUNQLEdBQUcsT0FBTyxFQUFFLDZDQUE2QyxDQUM1RCxDQUNKLENBQUM7SUFDVixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFrQjtRQUNsQyxhQUFhLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7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QztJQUM3QyxDQUFDO0lBRUQsd0JBQXdCLENBQ3BCLFNBQTRCLEVBQzVCLE1BQW9CLEVBQ3BCLG9CQUE2QixLQUFLO1FBRWxDLElBQUksUUFBUSxHQUFHLElBQUksZUFBZSxDQUM5QixTQUFTLEVBQ1QsTUFBTSxFQUNOLGlCQUFpQixDQUNwQixDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLENBQUM7YUFDM0QsVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxjQUFjLENBQ1YsU0FBNEIsRUFDNUIsTUFBb0IsRUFDcEIsb0JBQTZCLEtBQUs7UUFFbEMsT0FBTyxJQUFJLGVBQWUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELGlCQUFpQixDQUNiLFNBQTRCLEVBQzVCLG9CQUEwRDtRQUUxRCxPQUFPLElBQUksV0FBVyxDQUNsQixJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxtQkFBbUIsRUFDeEIsU0FBUyxFQUNULG9CQUFvQixDQUN2QixDQUFDO0lBQ04sQ0FBQzt3R0FySlEsYUFBYSxrQkFLRixtQkFBbUI7NEdBTDlCLGFBQWE7OzRGQUFiLGFBQWE7a0JBRHpCLFVBQVU7OzBCQU1NLE1BQU07MkJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVBheWxvYWRGaWx0LCBQYXlsb2FkIH0gZnJvbSBcIi4vUGF5bG9hZFwiO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFR1cGxlIH0gZnJvbSBcIi4vZXhwb3J0c1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBQYXlsb2FkRW5kcG9pbnQgfSBmcm9tIFwiLi9QYXlsb2FkRW5kcG9pbnRcIjtcbmltcG9ydCB7IElGaWx0ZXJVcGRhdGVDYWxsYWJsZSwgVHVwbGVMb2FkZXIgfSBmcm9tIFwiLi9UdXBsZUxvYWRlclwiO1xuaW1wb3J0IHsgVm9ydGV4U3RhdHVzU2VydmljZSB9IGZyb20gXCIuL1ZvcnRleFN0YXR1c1NlcnZpY2VcIjtcbmltcG9ydCB7IFZvcnRleENsaWVudEFCQyB9IGZyb20gXCIuL1ZvcnRleENsaWVudEFCQ1wiO1xuaW1wb3J0IHsgVm9ydGV4Q2xpZW50SHR0cCB9IGZyb20gXCIuL1ZvcnRleENsaWVudEh0dHBcIjtcbmltcG9ydCB7IFZvcnRleENsaWVudFdlYnNvY2tldCB9IGZyb20gXCIuL1ZvcnRleENsaWVudFdlYnNvY2tldFwiO1xuaW1wb3J0IHsgUGF5bG9hZEVudmVsb3BlIH0gZnJvbSBcIi4vUGF5bG9hZEVudmVsb3BlXCI7XG5pbXBvcnQgeyBOZ0xpZmVDeWNsZUV2ZW50cyB9IGZyb20gXCIuLi91dGlsL05nTGlmZUN5Y2xlRXZlbnRzXCI7XG5pbXBvcnQgeyBkYXRlU3RyIH0gZnJvbSBcIi4vVXRpbE1pc2NcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFZvcnRleFNlcnZpY2Uge1xuICAgIHByaXZhdGUgdm9ydGV4OiBWb3J0ZXhDbGllbnRBQkM7XG4gICAgcHJpdmF0ZSBzdGF0aWMgdm9ydGV4VXJsOiBzdHJpbmcgfCBudWxsID0gXCIvdm9ydGV4XCI7XG4gICAgcHJpdmF0ZSBzdGF0aWMgdm9ydGV4Q2xpZW50TmFtZTogc3RyaW5nID0gXCJcIjtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoVm9ydGV4U3RhdHVzU2VydmljZSkgcHJpdmF0ZSB2b3J0ZXhTdGF0dXNTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMucmVjb25uZWN0KCkgLy9cbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgICAgYCR7ZGF0ZVN0cigpfSBWb3J0ZXhTZXJ2aWNlIGNvbnN0cnVjdG9yIHJlY29ubmVjdCBmYWlsZWRgXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgVm9ydGV4IFVSTFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkIGV4Y2VwdCBpbiByYXJlIGNhc2VzLCBzdWNoIGFzIGFuIGlvcyBvciBhbmRyb2lkIGFwcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmw6IFRoZSBuZXcgVVJMIGZvciB0aGUgdm9ydGV4IHRvIHVzZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgc2V0Vm9ydGV4VXJsKHVybDogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBWb3J0ZXhTZXJ2aWNlLnZvcnRleFVybCA9IHVybDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgVm9ydGV4IE5hbWVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2b3J0ZXhDbGllbnROYW1lOiBUaGUgdm9ydGV4Q2xpZW50TmFtZSB0byB0ZWxsIHRoZSBzZXJ2ZXIgdGhhdCB3ZSBhcmUuXG4gICAgICovXG4gICAgc3RhdGljIHNldFZvcnRleENsaWVudE5hbWUodm9ydGV4Q2xpZW50TmFtZTogc3RyaW5nKSB7XG4gICAgICAgIFZvcnRleFNlcnZpY2Uudm9ydGV4Q2xpZW50TmFtZSA9IHZvcnRleENsaWVudE5hbWU7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVjb25uZWN0KCkge1xuICAgICAgICBpZiAoVm9ydGV4U2VydmljZS52b3J0ZXhVcmwgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy52b3J0ZXhTdGF0dXNTZXJ2aWNlLnNldE9ubGluZShmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVm9ydGV4U2VydmljZS52b3J0ZXhDbGllbnROYW1lID09IFwiXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlZvcnRleFNlcnZpY2Uuc2V0Vm9ydGV4Q2xpZW50TmFtZSgpIG5vdCBzZXQgeWV0XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudm9ydGV4ICE9IG51bGwpIGF3YWl0IHRoaXMudm9ydGV4LmNsb3NlKCk7XG5cbiAgICAgICAgaWYgKFZvcnRleFNlcnZpY2Uudm9ydGV4VXJsLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChcIndzXCIpKSB7XG4gICAgICAgICAgICB0aGlzLnZvcnRleCA9IG5ldyBWb3J0ZXhDbGllbnRXZWJzb2NrZXQoXG4gICAgICAgICAgICAgICAgdGhpcy52b3J0ZXhTdGF0dXNTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIFZvcnRleFNlcnZpY2Uudm9ydGV4VXJsLFxuICAgICAgICAgICAgICAgIFZvcnRleFNlcnZpY2Uudm9ydGV4Q2xpZW50TmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudm9ydGV4ID0gbmV3IFZvcnRleENsaWVudEh0dHAoXG4gICAgICAgICAgICAgICAgdGhpcy52b3J0ZXhTdGF0dXNTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIFZvcnRleFNlcnZpY2Uudm9ydGV4VXJsLFxuICAgICAgICAgICAgICAgIFZvcnRleFNlcnZpY2Uudm9ydGV4Q2xpZW50TmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMudm9ydGV4LnJlY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHNlbmRUdXBsZShmaWx0OiBJUGF5bG9hZEZpbHQgfCBzdHJpbmcsIHR1cGxlczogYW55W10gfCBUdXBsZVtdKTogdm9pZCB7XG4gICAgICAgIGlmICh0eXBlb2YgZmlsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgZmlsdCA9IHsga2V5OiBmaWx0IH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZW5kUGF5bG9hZChuZXcgUGF5bG9hZChmaWx0LCB0dXBsZXMpKTtcbiAgICB9XG5cbiAgICBzZW5kRmlsdChmaWx0KTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VuZFBheWxvYWQobmV3IFBheWxvYWQoZmlsdCkpO1xuICAgIH1cblxuICAgIC8qKiBTZW5kIFBheWxvYWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UGF5bG9hZFtdIHwgUGF5bG9hZH0gcGF5bG9hZFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqL1xuICAgIHNlbmRQYXlsb2FkKHBheWxvYWQ6IFBheWxvYWRbXSB8IFBheWxvYWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMudm9ydGV4ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSB2b3J0ZXggaXMgbm90IGluaXRpYWxpc2VkIHlldC5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGF5bG9hZHM6IFBheWxvYWRbXSA9IFtdO1xuICAgICAgICBpZiAocGF5bG9hZCBpbnN0YW5jZW9mIEFycmF5KSBwYXlsb2FkcyA9IHBheWxvYWQ7XG4gICAgICAgIGVsc2UgcGF5bG9hZHMgPSBbcGF5bG9hZF07XG5cbiAgICAgICAgbGV0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcGF5bG9hZCBvZiBwYXlsb2Fkcykge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICAgICAgICAgICAgIC5tYWtlUGF5bG9hZEVudmVsb3BlKClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHBheWxvYWRFbnZlbG9wZTogUGF5bG9hZEVudmVsb3BlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZvcnRleC5zZW5kKHBheWxvYWRFbnZlbG9wZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXQ6IGFueSA9IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICAvKiogU2VuZCBQYXlsb2FkIEVudmVsb3BlKHMpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BheWxvYWRFbnZlbG9wZVtdIHwgUGF5bG9hZEVudmVsb3BlfSBwYXlsb2FkRW52ZWxvcGVcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBzZW5kUGF5bG9hZEVudmVsb3BlKFxuICAgICAgICBwYXlsb2FkRW52ZWxvcGU6IFBheWxvYWRFbnZlbG9wZVtdIHwgUGF5bG9hZEVudmVsb3BlXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnZvcnRleCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgdm9ydGV4IGlzIG5vdCBpbml0aWFsaXNlZCB5ZXQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnZvcnRleC5zZW5kKHBheWxvYWRFbnZlbG9wZSk7XG4gICAgfVxuXG4gICAgY3JlYXRlRW5kcG9pbnRPYnNlcnZhYmxlKFxuICAgICAgICBjb21wb25lbnQ6IE5nTGlmZUN5Y2xlRXZlbnRzLFxuICAgICAgICBmaWx0ZXI6IElQYXlsb2FkRmlsdCxcbiAgICAgICAgcHJvY2Vzc0xhdGVzdE9ubHk6IGJvb2xlYW4gPSBmYWxzZVxuICAgICk6IE9ic2VydmFibGU8UGF5bG9hZEVudmVsb3BlPiB7XG4gICAgICAgIGxldCBlbmRwb2ludCA9IG5ldyBQYXlsb2FkRW5kcG9pbnQoXG4gICAgICAgICAgICBjb21wb25lbnQsXG4gICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICBwcm9jZXNzTGF0ZXN0T25seVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUVuZHBvaW50KGNvbXBvbmVudCwgZmlsdGVyLCBwcm9jZXNzTGF0ZXN0T25seSlcbiAgICAgICAgICAgIC5vYnNlcnZhYmxlO1xuICAgIH1cblxuICAgIGNyZWF0ZUVuZHBvaW50KFxuICAgICAgICBjb21wb25lbnQ6IE5nTGlmZUN5Y2xlRXZlbnRzLFxuICAgICAgICBmaWx0ZXI6IElQYXlsb2FkRmlsdCxcbiAgICAgICAgcHJvY2Vzc0xhdGVzdE9ubHk6IGJvb2xlYW4gPSBmYWxzZVxuICAgICk6IFBheWxvYWRFbmRwb2ludCB7XG4gICAgICAgIHJldHVybiBuZXcgUGF5bG9hZEVuZHBvaW50KGNvbXBvbmVudCwgZmlsdGVyLCBwcm9jZXNzTGF0ZXN0T25seSk7XG4gICAgfVxuXG4gICAgY3JlYXRlVHVwbGVMb2FkZXIoXG4gICAgICAgIGNvbXBvbmVudDogTmdMaWZlQ3ljbGVFdmVudHMsXG4gICAgICAgIGZpbHRlclVwZGF0ZUNhbGxhYmxlOiBJRmlsdGVyVXBkYXRlQ2FsbGFibGUgfCBJUGF5bG9hZEZpbHRcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUdXBsZUxvYWRlcihcbiAgICAgICAgICAgIHRoaXMudm9ydGV4LFxuICAgICAgICAgICAgdGhpcy52b3J0ZXhTdGF0dXNTZXJ2aWNlLFxuICAgICAgICAgICAgY29tcG9uZW50LFxuICAgICAgICAgICAgZmlsdGVyVXBkYXRlQ2FsbGFibGVcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=