docs: private void init(final boolean firstTime) {
          try {
              initModel();
              setupLookAndFeel();
          } catch (Exception e) {
              setupLookAndFeel();
              if (e instanceof FileNotFoundException) {
                  JOptionPane.showMessageDialog(
                          null,
                          Constant.messages.getString("start.db.error"),
                          Constant.messages.getString("start.title.error"),
                          JOptionPane.ERROR_MESSAGE);
              }
              logger.fatal("Failed to initialise: " + e.getMessage(), e);
              System.err.println(e.getMessage());
              System.exit(1);
          }
  
          OptionsParam options = Model.getSingleton().getOptionsParam();
          OptionsParamView viewParam = options.getViewParam();
  
          for (FontUtils.FontType fontType: FontUtils.FontType.values()) {
              FontUtils.setDefaultFont(
                  fontType,
                  viewParam.getFontName(fontType),
                  viewParam.getFontSize(fontType));
          }
  
          setupLocale(options);
  
          if (viewParam.isUseSystemsLocaleForFormat()) {
              Locale.setDefault(Locale.Category.FORMAT, Constant.getSystemsLocale());
          }
  
          View.getSingleton().showSplashScreen();
  
          promptForProxyDetailsIfNeeded(options);
  
          Thread bootstrap = new Thread(new Runnable() {
  
              @Override
              public void run() {
                  try {
                      initControlAndPostViewInit();
  
                  } catch (Throwable e) {
                      if (!Constant.isDevMode()) {
                          ErrorInfo errorInfo = new ErrorInfo(
                                  Constant.messages.getString("start.gui.dialog.fatal.error.title"),
                                  Constant.messages.getString("start.gui.dialog.fatal.error.message"),
                                  null,
                                  null,
                                  e,
                                  null,
                                  null);
                          JXErrorPane errorPane = new JXErrorPane();
                          errorPane.setErrorInfo(errorInfo);
                          JXErrorPane.showDialog(View.getSingleton().getSplashScreen(), errorPane);
                      }
                      View.getSingleton().hideSplashScreen();
  
                      logger.fatal("Failed to initialise GUI: ", e);
  
                      // We must exit otherwise EDT would keep ZAP running.
                      System.exit(1);
                  }
  
                  warnAddOnsAndExtensionsNoLongerRunnable();
  
                  if (firstTime) {
                      // Disabled for now - we have too many popups occurring when you
                      // first start up
                      // be nice to have a clean start up wizard...
                      // ExtensionHelp.showHelp();
  
                  } else {
                      // Don't auto check for updates the first time, no chance of any
                      // proxy having been set
                      final ExtensionAutoUpdate eau = Control.getSingleton()
                              .getExtensionLoader().getExtension(ExtensionAutoUpdate.class);
                      if (eau != null) {
                          eau.alertIfNewVersions();
                      }
                  }
  
              }
          });
          bootstrap.setName("ZAP-BootstrapGUI");
          bootstrap.setDaemon(false);
          bootstrap.start();
      }