UNPKG

firebaseui-angular-i18n

Version:

[![npm version](https://badge.fury.io/js/firebaseui-angular-i18n.svg)](https://badge.fury.io/js/firebaseui-angular-i18n)

143 lines 21.9 kB
import { Inject, Injectable, Optional } from '@angular/core'; import { FIREBASE_APP_NAME, FIREBASE_OPTIONS, ɵfirebaseAppFactory } from '@angular/fire/compat'; import { USE_EMULATOR as USE_AUTH_EMULATOR } from '@angular/fire/compat/auth'; import _firebase from 'firebase/compat/app'; import * as firebaseui from 'firebaseui'; import { Subject } from 'rxjs'; import { FirebaseUILanguages } from './firebaseui-angular-library.helper'; import * as jsonVersion from "./version.json"; import * as i0 from "@angular/core"; import * as i1 from "./dynamic-loader.service"; const FIREBASEUI_CDN_VERSION = jsonVersion.firebaseUiVersion || "6.0.0"; const FIREBASEUI_CDN_URL = `https://www.gstatic.com/firebasejs/ui/${FIREBASEUI_CDN_VERSION}`; export class FirebaseuiAngularLibraryService { constructor(_firebaseUiConfig, options, nameOrConfig, _useEmulator, // can't use the tuple here _scriptLoaderService, zone) { this._firebaseUiConfig = _firebaseUiConfig; this._useEmulator = _useEmulator; this._scriptLoaderService = _scriptLoaderService; /** * This method returns the observable of the Firebase UI instance */ this.getFirebaseUiObservable = () => FirebaseuiAngularLibraryService.uiInstanceObservable; // noinspection JSNonASCIINames this.firebaseInstance = ɵfirebaseAppFactory(options, zone, nameOrConfig); } /** * Creates a new instance of FirebaseUI */ instantiateFirebaseUI() { const auth = this.firebaseInstance.auth(); if (this._useEmulator) { const connectionString = this._useEmulator[0].startsWith('http') ? this._useEmulator[0] : `http://${this._useEmulator.join(':')}`; auth.useEmulator(connectionString); } FirebaseuiAngularLibraryService.firebaseUiInstance = new firebaseui.auth.AuthUI(auth); FirebaseuiAngularLibraryService.uiInstanceObservable.next(FirebaseuiAngularLibraryService.firebaseUiInstance); } //#region Changes made to the original lib to support i18n /** * Changes language of the currently displayed Firebase UI instance * @param languageCode One of the codes specified by a "FirebaseUILanguage" object */ async setLanguage(languageCode) { if (FirebaseuiAngularLibraryService.firebaseUiInstance) { await FirebaseuiAngularLibraryService.firebaseUiInstance.delete(); } const previousLanguageCode = FirebaseuiAngularLibraryService.currentLanguageCode; const previousLanguage = previousLanguageCode ? this.getLanguageByCode(previousLanguageCode) : null; FirebaseuiAngularLibraryService.currentLanguageCode = languageCode ? languageCode.toLowerCase() : "en"; if (!languageCode || (languageCode.toLowerCase() === "en" && FirebaseuiAngularLibraryService.firstLoad)) { console.log("[service] using lib from npm bundles"); return this.instantiateFirebaseUI(); } FirebaseuiAngularLibraryService.firstLoad = false; const languages = FirebaseUILanguages.filter((l) => l.code.toLowerCase() === languageCode.toLowerCase()); if (languages.length !== 1) { throw new Error("Invalid language code"); } // Otherwise we'll use a version of the same library from CDN. // Expose a reference to the firebase object or the firebaseui won't work if (typeof window !== "undefined" && typeof window.firebase === "undefined") { // Semi-cheat: firebaseInstance is an instance of FirebaseApp, // but FirebaseUI uses an instance of the "vanilla" Firebase object (hence the cast to any and the "".firebase_" part) window.firebase = _firebase; } if (typeof global !== "undefined" && typeof global["firebase"] === "undefined") { global["firebase"] = _firebase; } const language = languages[0]; const toLoad = [ { name: `firebaseui-${language.code}`, type: "js", src: `${FIREBASEUI_CDN_URL}/firebase-ui-auth__${language.code}.js` } ]; // If the selected language is a Right to Left one, load also the special css file if (language.isRtL) { toLoad.push({ name: "firebaseui-css-rtl", type: "css", src: `${FIREBASEUI_CDN_URL}/firebase-ui-auth-rtl.css` }); } // If we had previsouly loaded another language that was a RtL one and current one is not, // we need to load the LtR css if (previousLanguage && previousLanguage.isRtL && !language.isRtL) { toLoad.push({ name: "firebaseui-css", type: "css", src: `${FIREBASEUI_CDN_URL}/firebase-ui-auth.css` }); } await this._scriptLoaderService.registerAndLoad(...toLoad); // and create a new firebaseui instance, using the imported firebaseui return this.instantiateFirebaseUI(); } /** * Returns the currently selected language, as an instance of FirebaseUILanguage. * If no previous language was set, it will return language specified in the ".forRoot" method of this module. * If the parameter "language" was not set, it will defualt to English */ getCurrentLanguage() { return this.getLanguageByCode(FirebaseuiAngularLibraryService.currentLanguageCode || this._firebaseUiConfig.language || "en"); } /** * Given a FirebaseUILanguage code, it returns the matching object * @param code Language code */ getLanguageByCode(code) { const matching = FirebaseUILanguages.filter((lang) => lang.code.toLowerCase() === code.toLowerCase()); if (matching.length === 1) { return matching[0]; } return null; } } FirebaseuiAngularLibraryService.firebaseUiInstance = undefined; FirebaseuiAngularLibraryService.uiInstanceObservable = new Subject(); FirebaseuiAngularLibraryService.currentLanguageCode = ""; FirebaseuiAngularLibraryService.firstLoad = true; FirebaseuiAngularLibraryService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: FirebaseuiAngularLibraryService, deps: [{ token: 'firebaseUIAuthConfig' }, { token: FIREBASE_OPTIONS }, { token: FIREBASE_APP_NAME, optional: true }, { token: USE_AUTH_EMULATOR, optional: true }, { token: i1.DynamicLoaderService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); FirebaseuiAngularLibraryService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: FirebaseuiAngularLibraryService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: FirebaseuiAngularLibraryService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: ['firebaseUIAuthConfig'] }] }, { type: undefined, decorators: [{ type: Inject, args: [FIREBASE_OPTIONS] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [FIREBASE_APP_NAME] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [USE_AUTH_EMULATOR] }] }, { type: i1.DynamicLoaderService }, { type: i0.NgZone }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlyZWJhc2V1aS1hbmd1bGFyLWxpYnJhcnkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2ZpcmViYXNldWktYW5ndWxhci1saWJyYXJ5L3NyYy9saWIvZmlyZWJhc2V1aS1hbmd1bGFyLWxpYnJhcnkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBVSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFlLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0csT0FBTyxFQUFFLFlBQVksSUFBSSxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTlFLE9BQU8sU0FBUyxNQUFNLHFCQUFxQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0IsT0FBTyxFQUFnQyxtQkFBbUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3hHLE9BQU8sS0FBSyxXQUFXLE1BQU0sZ0JBQWdCLENBQUM7OztBQUk5QyxNQUFNLHNCQUFzQixHQUFHLFdBQVcsQ0FBQyxpQkFBaUIsSUFBSSxPQUFPLENBQUM7QUFDeEUsTUFBTSxrQkFBa0IsR0FBRyx5Q0FBeUMsc0JBQXNCLEVBQUUsQ0FBQztBQUk3RixNQUFNLE9BQU8sK0JBQStCO0lBVTFDLFlBQzBDLGlCQUErQyxFQUM3RCxPQUF3QixFQUNYLFlBQTZELEVBQ3JELFlBQWlCLEVBQUUsMkJBQTJCO0lBQ3JGLG9CQUEwQyxFQUNsRCxJQUFZO1FBTDRCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBOEI7UUFHeEMsaUJBQVksR0FBWixZQUFZLENBQUs7UUFDeEQseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQXdHcEQ7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LFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFFdEcsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN6QixPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNwQjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7QUF0SWMsa0RBQWtCLEdBQXVDLFNBQVMsQ0FBQztBQUNuRSxvREFBb0IsR0FBb0MsSUFBSSxPQUFPLEVBQTBCLENBQUM7QUFFOUYsbURBQW1CLEdBQVcsRUFBRSxDQUFDO0FBQ2pDLHlDQUFTLEdBQVksSUFBSSxDQUFDOzRIQU45QiwrQkFBK0Isa0JBV2hDLHNCQUFzQixhQUN0QixnQkFBZ0IsYUFDSixpQkFBaUIsNkJBQ2pCLGlCQUFpQjtnSUFkNUIsK0JBQStCOzJGQUEvQiwrQkFBK0I7a0JBRDNDLFVBQVU7OzBCQVlOLE1BQU07MkJBQUMsc0JBQXNCOzswQkFDN0IsTUFBTTsyQkFBQyxnQkFBZ0I7OzBCQUN2QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGlCQUFpQjs7MEJBQ3BDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBOZ1pvbmUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGaXJlYmFzZUFwcCwgRklSRUJBU0VfQVBQX05BTUUsIEZJUkVCQVNFX09QVElPTlMsIMm1ZmlyZWJhc2VBcHBGYWN0b3J5IH0gZnJvbSAnQGFuZ3VsYXIvZmlyZS9jb21wYXQnO1xuaW1wb3J0IHsgVVNFX0VNVUxBVE9SIGFzIFVTRV9BVVRIX0VNVUxBVE9SIH0gZnJvbSAnQGFuZ3VsYXIvZmlyZS9jb21wYXQvYXV0aCc7XG5pbXBvcnQgeyBGaXJlYmFzZUFwcFNldHRpbmdzLCBGaXJlYmFzZU9wdGlvbnMgfSBmcm9tICdmaXJlYmFzZS9hcHAnO1xuaW1wb3J0IF9maXJlYmFzZSBmcm9tICdmaXJlYmFzZS9jb21wYXQvYXBwJztcbmltcG9ydCAqIGFzIGZpcmViYXNldWkgZnJvbSAnZmlyZWJhc2V1aSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEeW5hbWljTG9hZGVyU2VydmljZSwgUmVzb3VyY2UgfSBmcm9tICcuL2R5bmFtaWMtbG9hZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRXh0ZW5kZWRGaXJlYmFzZVVJQXV0aENvbmZpZywgRmlyZWJhc2VVSUxhbmd1YWdlcyB9IGZyb20gJy4vZmlyZWJhc2V1aS1hbmd1bGFyLWxpYnJhcnkuaGVscGVyJztcbmltcG9ydCAqIGFzIGpzb25WZXJzaW9uIGZyb20gXCIuL3ZlcnNpb24uanNvblwiO1xuXG5kZWNsYXJlIGNvbnN0IGdsb2JhbDogYW55O1xuXG5jb25zdCBGSVJFQkFTRVVJX0NETl9WRVJTSU9OID0ganNvblZlcnNpb24uZmlyZWJhc2VVaVZlcnNpb24gfHwgXCI2LjAuMFwiO1xuY29uc3QgRklSRUJBU0VVSV9DRE5fVVJMID0gYGh0dHBzOi8vd3d3LmdzdGF0aWMuY29tL2ZpcmViYXNlanMvdWkvJHtGSVJFQkFTRVVJX0NETl9WRVJTSU9OfWA7XG5cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZpcmViYXNldWlBbmd1bGFyTGlicmFyeVNlcnZpY2Uge1xuXG4gIHByaXZhdGUgc3RhdGljIGZpcmViYXNlVWlJbnN0YW5jZTogZmlyZWJhc2V1aS5hdXRoLkF1dGhVSSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzdGF0aWMgdWlJbnN0YW5jZU9ic2VydmFibGU6IFN1YmplY3Q8ZmlyZWJhc2V1aS5hdXRoLkF1dGhVST4gPSBuZXcgU3ViamVjdDxmaXJlYmFzZXVpLmF1dGguQXV0aFVJPigpO1xuXG4gIHByaXZhdGUgc3RhdGljIGN1cnJlbnRMYW5ndWFnZUNvZGU6IHN0cmluZyA9IFwiXCI7XG4gIHByaXZhdGUgc3RhdGljIGZpcnN0TG9hZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSBmaXJlYmFzZUluc3RhbmNlOiBGaXJlYmFzZUFwcDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KCdmaXJlYmFzZVVJQXV0aENvbmZpZycpIHByaXZhdGUgX2ZpcmViYXNlVWlDb25maWc6IEV4dGVuZGVkRmlyZWJhc2VVSUF1dGhDb25maWcsXG4gICAgQEluamVjdChGSVJFQkFTRV9PUFRJT05TKSBvcHRpb25zOiBGaXJlYmFzZU9wdGlvbnMsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChGSVJFQkFTRV9BUFBfTkFNRSkgbmFtZU9yQ29uZmlnOiBzdHJpbmcgfCBGaXJlYmFzZUFwcFNldHRpbmdzIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFVTRV9BVVRIX0VNVUxBVE9SKSBwcml2YXRlIF91c2VFbXVsYXRvcjogYW55LCAvLyBjYW4ndCB1c2UgdGhlIHR1cGxlIGhlcmVcbiAgICBwcml2YXRlIF9zY3JpcHRMb2FkZXJTZXJ2aWNlOiBEeW5hbWljTG9hZGVyU2VydmljZSxcbiAgICB6b25lOiBOZ1pvbmUpIHtcblxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU05vbkFTQ0lJTmFtZXNcbiAgICB0aGlzLmZpcmViYXNlSW5zdGFuY2UgPSDJtWZpcmViYXNlQXBwRmFjdG9yeShvcHRpb25zLCB6b25lLCBuYW1lT3JDb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgRmlyZWJhc2VVSVxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YW50aWF0ZUZpcmViYXNlVUkoKSB7XG4gICAgY29uc3QgYXV0aDogX2ZpcmViYXNlLmF1dGguQXV0aCA9IHRoaXMuZmlyZWJhc2VJbnN0YW5jZS5hdXRoKCk7XG4gICAgaWYgKHRoaXMuX3VzZUVtdWxhdG9yKSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uU3RyaW5nID0gdGhpcy5fdXNlRW11bGF0b3JbMF0uc3RhcnRzV2l0aCgnaHR0cCcpID8gdGhpcy5fdXNlRW11bGF0b3JbMF0gOiBgaHR0cDovLyR7dGhpcy5fdXNlRW11bGF0b3Iuam9pbignOicpfWA7XG4gICAgICBhdXRoLnVzZUVtdWxhdG9yKGNvbm5lY3Rpb25TdHJpbmcpO1xuICAgIH1cblxuICAgIEZpcmViYXNldWlBbmd1bGFyTGlicmFyeVNlcnZpY2UuZmlyZWJhc2VVaUluc3RhbmNlID0gbmV3IGZpcmViYXNldWkuYXV0aC5BdXRoVUkoYXV0aCk7XG4gICAgRmlyZWJhc2V1aUFuZ3VsYXJMaWJyYXJ5U2VydmljZS51aUluc3RhbmNlT2JzZXJ2YWJsZS5uZXh0KEZpcmViYXNldWlBbmd1bGFyTGlicmFyeVNlcnZpY2UuZmlyZWJhc2VVaUluc3RhbmNlKTtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBDaGFuZ2VzIG1hZGUgdG8gdGhlIG9yaWdpbmFsIGxpYiB0byBzdXBwb3J0IGkxOG5cblxuICAvKipcbiAgICogQ2hhbmdlcyBsYW5ndWFnZSBvZiB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBGaXJlYmFzZSBVSSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gbGFuZ3VhZ2VDb2RlIE9uZSBvZiB0aGUgY29kZXMgc3BlY2lmaWVkIGJ5IGEgXCJGaXJlYmFzZVVJTGFuZ3VhZ2VcIiBvYmplY3RcbiAgICovXG4gIGFzeW5jIHNldExhbmd1YWdlKGxhbmd1YWdlQ29kZTogc3RyaW5nKSB7XG4gICAgaWYgKEZpcmViYXNldWlBbmd1bGFyTGlicmFyeVNlcnZpY2UuZmlyZWJhc2VVaUluc3RhbmNlKSB7XG4gICAgICBhd2FpdCBGaXJlYmFzZXVpQW5ndWxhckxpYnJhcnlTZXJ2aWNlLmZpcmViYXNlVWlJbnN0YW5jZS5kZWxldGUoKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmV2aW91c0xhbmd1YWdlQ29kZSA9IEZpcmViYXNldWlBbmd1bGFyTGlicmFyeVNlcnZpY2UuY3VycmVudExhbmd1YWdlQ29kZTtcbiAgICBjb25zdCBwcmV2aW91c0xhbmd1YWdlID0gcHJldmlvdXNMYW5ndWFnZUNvZGUgPyB0aGlzLmdldExhbmd1YWdlQnlDb2RlKHByZXZpb3VzTGFuZ3VhZ2VDb2RlKSA6IG51bGw7XG5cbiAgICBGaXJlYmFzZXVpQW5ndWxhckxpYnJhcnlTZXJ2aWNlLmN1cnJlbnRMYW5ndWFnZUNvZGUgPSBsYW5ndWFnZUNvZGUgPyBsYW5ndWFnZUNvZGUudG9Mb3dlckNhc2UoKSA6IFwiZW5cIjtcblxuICAgIGlmICghbGFuZ3VhZ2VDb2RlIHx8IChsYW5ndWFnZUNvZGUudG9Mb3dlckNhc2UoKSA9PT0gXCJlblwiICYmIEZpcmViYXNldWlBbmd1bGFyTGlicmFyeVNlcnZpY2UuZmlyc3RMb2FkKSkge1xuICAgICAgY29uc29sZS5sb2coXCJbc2VydmljZV0gdXNpbmcgbGliIGZyb20gbnBtIGJ1bmRsZXNcIik7XG4gICAgICByZXR1cm4gdGhpcy5pbnN0YW50aWF0ZUZpcmViYXNlVUkoKTtcbiAgICB9XG5cbiAgICBGaXJlYmFzZXVpQW5ndWxhckxpYnJhcnlTZXJ2aWNlLmZpcnN0TG9hZCA9IGZhbHNlO1xuICAgIGNvbnN0IGxhbmd1YWdlcyA9IEZpcmViYXNlVUlMYW5ndWFnZXMuZmlsdGVyKChsKSA9PiBsLmNvZGUudG9Mb3dlckNhc2UoKSA9PT0gbGFuZ3VhZ2VDb2RlLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgaWYgKGxhbmd1YWdlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbGFuZ3VhZ2UgY29kZVwiKTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2Ugd2UnbGwgdXNlIGEgdmVyc2lvbiBvZiB0aGUgc2FtZSBsaWJyYXJ5IGZyb20gQ0ROLlxuICAgIC8vIEV4cG9zZSBhIHJlZmVyZW5jZSB0byB0aGUgZmlyZWJhc2Ugb2JqZWN0IG9yIHRoZSBmaXJlYmFzZXVpIHdvbid0IHdvcmtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygd2luZG93LmZpcmViYXNlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAvLyBTZW1pLWNoZWF0OiBmaXJlYmFzZUluc3RhbmNlIGlzIGFuIGluc3RhbmNlIG9mIEZpcmViYXNlQXBwLFxuICAgICAgLy8gYnV0IEZpcmViYXNlVUkgdXNlcyBhbiBpbnN0YW5jZSBvZiB0aGUgXCJ2YW5pbGxhXCIgRmlyZWJhc2Ugb2JqZWN0IChoZW5jZSB0aGUgY2FzdCB0byBhbnkgYW5kIHRoZSBcIlwiLmZpcmViYXNlX1wiIHBhcnQpXG4gICAgICAod2luZG93IGFzIGFueSkuZmlyZWJhc2UgPSBfZmlyZWJhc2U7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIGdsb2JhbFtcImZpcmViYXNlXCJdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBnbG9iYWxbXCJmaXJlYmFzZVwiXSA9IF9maXJlYmFzZTtcbiAgICB9XG5cbiAgICBjb25zdCBsYW5ndWFnZSA9IGxhbmd1YWdlc1swXTtcbiAgICBjb25zdCB0b0xvYWQ6IFJlc291cmNlW10gPSBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6IGBmaXJlYmFzZXVpLSR7bGFuZ3VhZ2UuY29kZX1gLFxuICAgICAgICB0eXBlOiBcImpzXCIsXG4gICAgICAgIHNyYzogYCR7RklSRUJBU0VVSV9DRE5fVVJMfS9maXJlYmFzZS11aS1hdXRoX18ke2xhbmd1YWdlLmNvZGV9LmpzYFxuICAgICAgfVxuICAgIF07XG5cbiAgICAvLyBJZiB0aGUgc2VsZWN0ZWQgbGFuZ3VhZ2UgaXMgYSBSaWdodCB0byBMZWZ0IG9uZSwgbG9hZCBhbHNvIHRoZSBzcGVjaWFsIGNzcyBmaWxlXG4gICAgaWYgKGxhbmd1YWdlLmlzUnRMKSB7XG4gICAgICB0b0xvYWQucHVzaCh7XG4gICAgICAgIG5hbWU6IFwiZmlyZWJhc2V1aS1jc3MtcnRsXCIsXG4gICAgICAgIHR5cGU6IFwiY3NzXCIsXG4gICAgICAgIHNyYzogYCR7RklSRUJBU0VVSV9DRE5fVVJMfS9maXJlYmFzZS11aS1hdXRoLXJ0bC5jc3NgXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBoYWQgcHJldmlzb3VseSBsb2FkZWQgYW5vdGhlciBsYW5ndWFnZSB0aGF0IHdhcyBhIFJ0TCBvbmUgYW5kIGN1cnJlbnQgb25lIGlzIG5vdCxcbiAgICAvLyAgICB3ZSBuZWVkIHRvIGxvYWQgdGhlIEx0UiBjc3NcbiAgICBpZiAocHJldmlvdXNMYW5ndWFnZSAmJiBwcmV2aW91c0xhbmd1YWdlLmlzUnRMICYmICFsYW5ndWFnZS5pc1J0TCkge1xuICAgICAgdG9Mb2FkLnB1c2goe1xuICAgICAgICBuYW1lOiBcImZpcmViYXNldWktY3NzXCIsXG4gICAgICAgIHR5cGU6IFwiY3NzXCIsXG4gICAgICAgIHNyYzogYCR7RklSRUJBU0VVSV9DRE5fVVJMfS9maXJlYmFzZS11aS1hdXRoLmNzc2BcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuX3NjcmlwdExvYWRlclNlcnZpY2UucmVnaXN0ZXJBbmRMb2FkKC4uLnRvTG9hZCk7XG5cbiAgICAvLyBhbmQgY3JlYXRlIGEgbmV3IGZpcmViYXNldWkgaW5zdGFuY2UsIHVzaW5nIHRoZSBpbXBvcnRlZCBmaXJlYmFzZXVpXG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudGlhdGVGaXJlYmFzZVVJKCk7XG4gIH1cblxuICAvKipcbiAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbGFuZ3VhZ2UsIGFzIGFuIGluc3RhbmNlIG9mIEZpcmViYXNlVUlMYW5ndWFnZS5cbiAgKiBJZiBubyBwcmV2aW91cyBsYW5ndWFnZSB3YXMgc2V0LCBpdCB3aWxsIHJldHVybiBsYW5ndWFnZSBzcGVjaWZpZWQgaW4gdGhlIFwiLmZvclJvb3RcIiBtZXRob2Qgb2YgdGhpcyBtb2R1bGUuXG4gICogSWYgdGhlIHBhcmFtZXRlciBcImxhbmd1YWdlXCIgd2FzIG5vdCBzZXQsIGl0IHdpbGwgZGVmdWFsdCB0byBFbmdsaXNoXG4gICovXG4gIGdldEN1cnJlbnRMYW5ndWFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMYW5ndWFnZUJ5Q29kZShGaXJlYmFzZXVpQW5ndWxhckxpYnJhcnlTZXJ2aWNlLmN1cnJlbnRMYW5ndWFnZUNvZGUgfHwgdGhpcy5fZmlyZWJhc2VVaUNvbmZpZy5sYW5ndWFnZSB8fCBcImVuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG9ic2VydmFibGUgb2YgdGhlIEZpcmViYXNlIFVJIGluc3RhbmNlXG4gICAqL1xuICBnZXRGaXJlYmFzZVVpT2JzZXJ2YWJsZSA9ICgpID0+IEZpcmViYXNldWlBbmd1bGFyTGlicmFyeVNlcnZpY2UudWlJbnN0YW5jZU9ic2VydmFibGU7XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgRmlyZWJhc2VVSUxhbmd1YWdlIGNvZGUsIGl0IHJldHVybnMgdGhlIG1hdGNoaW5nIG9iamVjdFxuICAgKiBAcGFyYW0gY29kZSBMYW5ndWFnZSBjb2RlXG4gICAqL1xuICBwcml2YXRlIGdldExhbmd1YWdlQnlDb2RlKGNvZGU6IHN0cmluZykge1xuICAgIGNvbnN0IG1hdGNoaW5nID0gRmlyZWJhc2VVSUxhbmd1YWdlcy5maWx0ZXIoKGxhbmcpID0+IGxhbmcuY29kZS50b0xvd2VyQ2FzZSgpID09PSBjb2RlLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgaWYgKG1hdGNoaW5nLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIG1hdGNoaW5nWzBdO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbn1cbiJdfQ==