code: protected OkHttpClient buildHttpClient(Config config) throws ClientException {
          CertificatePinner.Builder pinner = new CertificatePinner.Builder();
          for (Endpoint endpoint : Endpoint.all) {
              pinner = pinner.add(endpoint.host(), endpoint.certificateHash());
          }
  
          SSLContext sslContext;
          X509TrustManager trustManager;
          try {
              sslContext = SSLContext.getInstance("TLSv1.2");
              sslContext.init(null, null, null);
  
              trustManager = getX509TrustManager();
          } catch (NoSuchAlgorithmException | KeyStoreException | KeyManagementException e) {
              throw new ClientException(e);
          }
  
          ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
                  .tlsVersions(TlsVersion.TLS_1_2)
                  .build();
  
          return new OkHttpClient.Builder()
                  .sslSocketFactory(sslContext.getSocketFactory(), trustManager)
                  .addInterceptor(new Configurer(config))
                  .connectionSpecs(Collections.singletonList(spec))
                  .readTimeout(60, TimeUnit.SECONDS)
                  .build();
      }
docs: Returns a new {@link OkHttpClient} to use for building {@link Resource}(s). Override this to customize the HTTP
  client. This method will be called once during construction and the result will be cached internally.
  <p>
  It is generally a good idea to implement this by adding to the builder created from
  <code>super.buildHttpClient(config).newBuilder()</code> so that all configurations are properly applied and SSL
  certificates are pinned.
  </p>
  
  @param config A {@link Config} object built from constructor parameters.
  @return A new {@link OkHttpClient} object for connecting to the Omise API.
  @throws ClientException if client configuration fails (e.g. when TLSv1.2 is not supported)