constructor(element, configs) {
    /** @private {!Element} The container element. */
    this.container_ = util.getElement(element);
    /**
     * @private {!Object<string, !UiHandlerConfig>} The configuration of the
     *     UI handler keyed by API keys.
     */
    this.configs_ = {};
    Object.keys(configs).forEach((apiKey) => {
      this.configs_[apiKey] = new UiHandlerConfig(configs[apiKey]);
    });
    /** @private {?AuthUI} The FirebaseUI instance if available. */
    this.ui_ = null;
    /**
     * @private {?firebase.auth.Auth} The Auth instance used to sign in with.
     *     This is used to keep track of the API key being used, which is
     *     needed for multi-project support.
     */
    this.signedInAuth_ = null;
    /** @private {?Spinner} The progress bar component. */
    this.progressBar_ = null;
    /** @private {?number} The ID of show progress bar timeout. */
    this.showProcessingTimeout_ = null;
    /** @private {?Base} The current UI component. */
    this.currentComponent_ = null;
    /** @private {?string} The handler's language code. */
    this.languageCode_ = null;
    Object.defineProperty(
        /** @type {!Object} */ (this),
        'languageCode',
        {
          /**
           * @return {?string} The current language code.
           * @this {!Object}
           */
          get() {
            return this.languageCode_;
          },
          /**
           * @param {?string} value The new language code.
           * @this {!Object}
           */
          set(value) {
            this.languageCode_ = value || null;
          },
          enumerable: false,
        });
  }
@param {string|!Element} element The container element or the query
    selector.
@param {!Object<string,!CIAPHandlerConfig>} configs The
    configuration of the handler keyed by API key.