UNPKG

@hsaadawy/ngx-chat

Version:
101 lines 17.8 kB
import { __awaiter } from "tslib"; import { xml } from '@xmpp/client'; import { BehaviorSubject } from 'rxjs'; import { first } from 'rxjs/operators'; import { AbstractStanzaBuilder } from '../abstract-stanza-builder'; import { AbstractXmppPlugin } from './abstract-xmpp-plugin'; class QueryStanzaBuilder extends AbstractStanzaBuilder { constructor(xmlns, to) { super(); this.xmlns = xmlns; this.to = to; } toStanza() { return xml('iq', Object.assign({ type: 'get' }, (this.to ? { to: this.to } : {})), xml('query', { xmlns: this.xmlns })); } } /** * see XEP-0030 Service Discovery */ export class ServiceDiscoveryPlugin extends AbstractXmppPlugin { constructor(chatAdapter) { super(); this.chatAdapter = chatAdapter; this.servicesInitialized$ = new BehaviorSubject(false); this.hostedServices = []; this.resourceCache = new Map(); } onBeforeOnline() { return __awaiter(this, void 0, void 0, function* () { yield this.discoverServices(this.chatAdapter.chatConnectionService.userJid.domain); this.servicesInitialized$.next(true); }); } onOffline() { this.servicesInitialized$.next(false); this.hostedServices = []; this.resourceCache.clear(); } supportsFeature(jid, searchedFeature) { return new Promise((resolve, reject) => { this.servicesInitialized$.pipe(first(value => !!value)).subscribe(() => __awaiter(this, void 0, void 0, function* () { try { const service = this.resourceCache.get(jid) || (yield this.discoverServiceInformation(jid)); if (!service) { reject(new Error('no service found for jid ' + jid)); } resolve(service.features.includes(searchedFeature)); } catch (e) { reject(e); } })); }); } findService(category, type) { return new Promise((resolve, reject) => { this.servicesInitialized$.pipe(first(value => !!value)).subscribe(() => { const results = this.hostedServices.filter(service => service.identities.filter(identity => identity.category === category && identity.type === type).length > 0); if (results.length === 0) { reject(new Error(`no service matching category ${category} and type ${type} found!`)); } else if (results.length > 1) { reject(new Error(`multiple services matching category ${category} and type ${type} found! ${JSON.stringify(results)}`)); } else { return resolve(results[0]); } }); }); } discoverServices(mainDomain) { return __awaiter(this, void 0, void 0, function* () { const serviceListResponse = yield this.chatAdapter.chatConnectionService.sendIq(new QueryStanzaBuilder(ServiceDiscoveryPlugin.DISCO_ITEMS, this.chatAdapter.chatConnectionService.userJid.domain).toStanza()); const serviceDomains = new Set(serviceListResponse .getChild('query') .getChildren('item') .map((itemNode) => itemNode.attrs.jid)); serviceDomains.add(mainDomain); const discoveredServices = yield Promise.all([...serviceDomains.keys()] .map((serviceDomain) => this.discoverServiceInformation(serviceDomain))); this.hostedServices.push(...discoveredServices); }); } discoverServiceInformation(serviceDomain) { return __awaiter(this, void 0, void 0, function* () { const serviceInformationResponse = yield this.chatAdapter.chatConnectionService.sendIq(new QueryStanzaBuilder(ServiceDiscoveryPlugin.DISCO_INFO, serviceDomain).toStanza()); const queryNode = serviceInformationResponse.getChild('query'); const features = queryNode.getChildren('feature').map((featureNode) => featureNode.attrs.var); const serviceInformation = { identities: queryNode.getChildren('identity').map((identityNode) => identityNode.attrs), features, jid: serviceInformationResponse.attrs.from }; this.resourceCache.set(serviceInformationResponse.attrs.from, serviceInformation); return serviceInformation; }); } } ServiceDiscoveryPlugin.DISCO_INFO = 'http://jabber.org/protocol/disco#info'; ServiceDiscoveryPlugin.DISCO_ITEMS = 'http://jabber.org/protocol/disco#items'; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1kaXNjb3ZlcnkucGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGF6em5ldHdvcmsvbmd4LWNoYXQvc3JjL2xpYi9zZXJ2aWNlcy9hZGFwdGVycy94bXBwL3BsdWdpbnMvc2VydmljZS1kaXNjb3ZlcnkucGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRW5DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRW5FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTVELE1BQU0sa0JBQW1CLFNBQVEscUJBQXFCO0lBRWxELFlBQW9CLEtBQWEsRUFBVSxFQUFXO1FBQ2xELEtBQUssRUFBRSxDQUFDO1FBRFEsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUFVLE9BQUUsR0FBRixFQUFFLENBQVM7SUFFdEQsQ0FBQztJQUVELFFBQVE7UUFDSixPQUFPLEdBQUcsQ0FBQyxJQUFJLGtCQUVQLElBQUksRUFBRSxLQUFLLElBQ1IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUVyQyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUMsQ0FBQyxDQUNwQyxDQUFDO0lBQ04sQ0FBQztDQUVKO0FBY0Q7O0dBRUc7QUFDSCxNQUFNLE9BQU8sc0JBQXVCLFNBQVEsa0JBQWtCO0lBUzFELFlBQTZCLFdBQTRCO1FBQ3JELEtB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QyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQ3RGLENBQUM7WUFFRixNQUFNLFNBQVMsR0FBRywwQkFBMEIsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0QsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFvQixFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZHLE1BQU0sa0JBQWtCLEdBQU87Z0JBQzNCLFVBQVUsRUFBRSxTQUFTLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQXFCLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7Z0JBQ2hHLFFBQVE7Z0JBQ1IsR0FBRyxFQUFFLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxJQUFJO2FBQzdDLENBQUM7WUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLENBQUM7WUFDbEYsT0FBTyxrQkFBa0IsQ0FBQztRQUM5QixDQUFDO0tBQUE7O0FBbkdzQixpQ0FBVSxHQUFHLHVDQUF1QyxDQUFDO0FBQ3JELGtDQUFXLEdBQUcsd0NBQXdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB4bWwgfSBmcm9tICdAeG1wcC9jbGllbnQnO1xyXG5pbXBvcnQgeyBFbGVtZW50IH0gZnJvbSAnbHR4JztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdFN0YW56YUJ1aWxkZXIgfSBmcm9tICcuLi9hYnN0cmFjdC1zdGFuemEtYnVpbGRlcic7XHJcbmltcG9ydCB7IFhtcHBDaGF0QWRhcHRlciB9IGZyb20gJy4uL3htcHAtY2hhdC1hZGFwdGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdFhtcHBQbHVnaW4gfSBmcm9tICcuL2Fic3RyYWN0LXhtcHAtcGx1Z2luJztcclxuXHJcbmNsYXNzIFF1ZXJ5U3RhbnphQnVpbGRlciBleHRlbmRzIEFic3RyYWN0U3RhbnphQnVpbGRlciB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSB4bWxuczogc3RyaW5nLCBwcml2YXRlIHRvPzogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICB0b1N0YW56YSgpIHtcclxuICAgICAgICByZXR1cm4geG1sKCdpcScsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdnZXQnLFxyXG4gICAgICAgICAgICAgICAgLi4uKHRoaXMudG8gPyB7dG86IHRoaXMudG99IDoge30pXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHhtbCgncXVlcnknLCB7eG1sbnM6IHRoaXMueG1sbnN9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5IHtcclxuICAgIGNhdGVnb3J5OiBzdHJpbmc7XHJcbiAgICB0eXBlOiBzdHJpbmc7XHJcbiAgICBuYW1lPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2Uge1xyXG4gICAgamlkOiBzdHJpbmc7XHJcbiAgICBpZGVudGl0aWVzOiBJZGVudGl0eVtdO1xyXG4gICAgZmVhdHVyZXM6IHN0cmluZ1tdO1xyXG59XHJcblxyXG4vKipcclxuICogc2VlIFhFUC0wMDMwIFNlcnZpY2UgRGlzY292ZXJ5XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU2VydmljZURpc2NvdmVyeVBsdWdpbiBleHRlbmRzIEFic3RyYWN0WG1wcFBsdWdpbiB7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBESVNDT19JTkZPID0gJ2h0dHA6Ly9qYWJiZXIub3JnL3Byb3RvY29sL2Rpc2NvI2luZm8nO1xyXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBESVNDT19JVEVNUyA9ICdodHRwOi8vamFiYmVyLm9yZy9wcm90b2NvbC9kaXNjbyNpdGVtcyc7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXJ2aWNlc0luaXRpYWxpemVkJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xyXG4gICAgcHJpdmF0ZSBob3N0ZWRTZXJ2aWNlczogU2VydmljZVtdID0gW107XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgU2VydmljZT4oKTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNoYXRBZGFwdGVyOiBYbXBwQ2hhdEFkYXB0ZXIpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQmVmb3JlT25saW5lKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZGlzY292ZXJTZXJ2aWNlcyh0aGlzLmNoYXRBZGFwdGVyLmNoYXRDb25uZWN0aW9uU2VydmljZS51c2VySmlkLmRvbWFpbik7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWNlc0luaXRpYWxpemVkJC5uZXh0KHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uT2ZmbGluZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlcnZpY2VzSW5pdGlhbGl6ZWQkLm5leHQoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuaG9zdGVkU2VydmljZXMgPSBbXTtcclxuICAgICAgICB0aGlzLnJlc291cmNlQ2FjaGUuY2xlYXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdXBwb3J0c0ZlYXR1cmUoamlkOiBzdHJpbmcsIHNlYXJjaGVkRmVhdHVyZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2VzSW5pdGlhbGl6ZWQkLnBpcGUoZmlyc3QodmFsdWUgPT4gISF2YWx1ZSkpLnN1YnNjcmliZShhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnJlc291cmNlQ2FjaGUuZ2V0KGppZCkgfHwgYXdhaXQgdGhpcy5kaXNjb3ZlclNlcnZpY2VJbmZvcm1hdGlvbihqaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2VydmljZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdubyBzZXJ2aWNlIGZvdW5kIGZvciBqaWQgJyArIGppZCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHNlcnZpY2UuZmVhdHVyZXMuaW5jbHVkZXMoc2VhcmNoZWRGZWF0dXJlKSk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGZpbmRTZXJ2aWNlKGNhdGVnb3J5OiBzdHJpbmcsIHR5cGU6IHN0cmluZyk6IFByb21pc2U8U2VydmljZT4ge1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlc0luaXRpYWxpemVkJC5waXBlKGZpcnN0KHZhbHVlID0+ICEhdmFsdWUpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuaG9zdGVkU2VydmljZXMuZmlsdGVyKHNlcnZpY2UgPT5cclxuICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmlkZW50aXRpZXMuZmlsdGVyKGlkZW50aXR5ID0+IGlkZW50aXR5LmNhdGVnb3J5ID09PSBjYXRlZ29yeSAmJiBpZGVudGl0eS50eXBlID09PSB0eXBlKS5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYG5vIHNlcnZpY2UgbWF0Y2hpbmcgY2F0ZWdvcnkgJHtjYXRlZ29yeX0gYW5kIHR5cGUgJHt0eXBlfSBmb3VuZCFgKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdHMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYG11bHRpcGxlIHNlcnZpY2VzIG1hdGNoaW5nIGNhdGVnb3J5ICR7Y2F0ZWdvcnl9IGFuZCB0eXBlICR7dHlwZX0gZm91bmQhICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0cyl9YCkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXN1bHRzWzBdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGRpc2NvdmVyU2VydmljZXMobWFpbkRvbWFpbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3Qgc2VydmljZUxpc3RSZXNwb25zZSA9IGF3YWl0IHRoaXMuY2hhdEFkYXB0ZXIuY2hhdENvbm5lY3Rpb25TZXJ2aWNlLnNlbmRJcShcclxuICAgICAgICAgICAgbmV3IFF1ZXJ5U3RhbnphQnVpbGRlcihcclxuICAgICAgICAgICAgICAgIFNlcnZpY2VEaXNjb3ZlcnlQbHVnaW4uRElTQ09fSVRFTVMsIHRoaXMuY2hhdEFkYXB0ZXIuY2hhdENvbm5lY3Rpb25TZXJ2aWNlLnVzZXJKaWQuZG9tYWluKS50b1N0YW56YSgpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VydmljZURvbWFpbnMgPSBuZXcgU2V0KFxyXG4gICAgICAgICAgICBzZXJ2aWNlTGlzdFJlc3BvbnNlXHJcbiAgICAgICAgICAgICAgICAuZ2V0Q2hpbGQoJ3F1ZXJ5JylcclxuICAgICAgICAgICAgICAgIC5nZXRDaGlsZHJlbignaXRlbScpXHJcbiAgICAgICAgICAgICAgICAubWFwKChpdGVtTm9kZTogRWxlbWVudCkgPT4gaXRlbU5vZGUuYXR0cnMuamlkIGFzIHN0cmluZylcclxuICAgICAgICApO1xyXG4gICAgICAgIHNlcnZpY2VEb21haW5zLmFkZChtYWluRG9tYWluKTtcclxuXHJcbiAgICAgICAgY29uc3QgZGlzY292ZXJlZFNlcnZpY2VzOiBTZXJ2aWNlW10gPSBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgWy4uLnNlcnZpY2VEb21haW5zLmtleXMoKV1cclxuICAgICAgICAgICAgICAgIC5tYXAoKHNlcnZpY2VEb21haW4pID0+IHRoaXMuZGlzY292ZXJTZXJ2aWNlSW5mb3JtYXRpb24oc2VydmljZURvbWFpbikpXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmhvc3RlZFNlcnZpY2VzLnB1c2goLi4uZGlzY292ZXJlZFNlcnZpY2VzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGRpc2NvdmVyU2VydmljZUluZm9ybWF0aW9uKHNlcnZpY2VEb21haW46IHN0cmluZyk6IFByb21pc2U8U2VydmljZT4ge1xyXG4gICAgICAgIGNvbnN0IHNlcnZpY2VJbmZvcm1hdGlvblJlc3BvbnNlID0gYXdhaXQgdGhpcy5jaGF0QWRhcHRlci5jaGF0Q29ubmVjdGlvblNlcnZpY2Uuc2VuZElxKFxyXG4gICAgICAgICAgICBuZXcgUXVlcnlTdGFuemFCdWlsZGVyKFNlcnZpY2VEaXNjb3ZlcnlQbHVnaW4uRElTQ09fSU5GTywgc2VydmljZURvbWFpbikudG9TdGFuemEoKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IHF1ZXJ5Tm9kZSA9IHNlcnZpY2VJbmZvcm1hdGlvblJlc3BvbnNlLmdldENoaWxkKCdxdWVyeScpO1xyXG4gICAgICAgIGNvbnN0IGZlYXR1cmVzID0gcXVlcnlOb2RlLmdldENoaWxkcmVuKCdmZWF0dXJlJykubWFwKChmZWF0dXJlTm9kZTogRWxlbWVudCkgPT4gZmVhdHVyZU5vZGUuYXR0cnMudmFyKTtcclxuICAgICAgICBjb25zdCBzZXJ2aWNlSW5mb3JtYXRpb246YW55ID0ge1xyXG4gICAgICAgICAgICBpZGVudGl0aWVzOiBxdWVyeU5vZGUuZ2V0Q2hpbGRyZW4oJ2lkZW50aXR5JykubWFwKChpZGVudGl0eU5vZGU6IEVsZW1lbnQpID0+IGlkZW50aXR5Tm9kZS5hdHRycyksXHJcbiAgICAgICAgICAgIGZlYXR1cmVzLFxyXG4gICAgICAgICAgICBqaWQ6IHNlcnZpY2VJbmZvcm1hdGlvblJlc3BvbnNlLmF0dHJzLmZyb21cclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMucmVzb3VyY2VDYWNoZS5zZXQoc2VydmljZUluZm9ybWF0aW9uUmVzcG9uc2UuYXR0cnMuZnJvbSwgc2VydmljZUluZm9ybWF0aW9uKTtcclxuICAgICAgICByZXR1cm4gc2VydmljZUluZm9ybWF0aW9uO1xyXG4gICAgfVxyXG5cclxufVxyXG4iXX0=