Salesforce Integrations: Integrate Salesforce and other Tools in 2024 

Salesforce integrations

Almost every sales and marketing team has used Salesforce at some point in their work life. The sheer popularity of this platform is evident in the increasing user base, enhanced customer experience, better sales cycles, and immense customizability. 

When such a powerful CRM platform needs to be integrated with other tools like GitHub, Jira, or Azure DevOps, there is no way that can be done out of the box. 

That’s why you need Salesforce integrations. They allow users the comfort of staying in the tool they already use and still getting the information they are looking for.  

So this blog will highlight the importance of Salesforce CRM integrations and how you can tap into the native capabilities of Salesforce. And then we’ll move on to see an actual implementation using a third-party integration solution called Exalate.

What’s covered in this article: 

What you Need to Know about Salesforce Integrations 

Salesforce is widely used as a CRM application, and different teams like sales, marketing, or customer service use it on a daily basis. 

And then there are other applications like Jira, GitHub, Azure DevOps, Zendesk, etc. which have their own set of customers. 

Information needs to flow between all these different platforms. However, if done manually, it can be time-consuming and prone to errors. So we must resort to automatic ways to do so. 

Salesforce third-party integration solutions can streamline collaboration between teams.

Here are some common integration scenarios: 

  • Data can be converted to a common format and be synced or exchanged between applications. 
  • Business processes, aka business logic, can be automated end-to-end. This helps streamline collaboration across different teams. This is also known as B2B integration
  • Provide a centralized user interface to teams using different applications so that they can access or manage the information through it. 

These integrations can be either synchronous or asynchronous, depending on the use case in question. 

You can also classify integrations in Salesforce based on the timing of the information exchange: 

  • Sometimes you need to integrate information that changes less frequently: monthly, daily, hourly, etc. So, at this specific time interval, information either enters or leaves Salesforce for some other application.

    Say an Opportunity is ‘Won’; triggers activate the system to transfer the details to another application, say Jira, for escalation to the license management team.
  • Most use cases depend on real-time integrations with Salesforce and other platforms. This kind of exchange gives insights to the sales team since ‘time’ is of the essence to them.

    A spin-off of this can also be a near real-time integration where a few moments of delay, maybe a couple of minutes, in information exchange does not harm anything. For instance, when there is a confirmation about a purchase order that needs to be passed between 2 systems, then near real-time can be a safe bet.
  • As discussed a while ago, customized UIs can also be created in Visualforce to implement an interface that is used to quickly evaluate some information coming in from an external system. 
  • And then we come back to square one, Salesforce, and how we can make it our single source of truth. We head over to the AppExchange and see a variety of apps purpose-built for integrations.

    They are there because they recognize the customizability Salesforce offers and make integrations with it easier and quicker to set up. We will come back to this point in a moment.

Benefits of Salesforce Integrations

Let’s have a quick look at the benefits of Salesforce integration:  

  • Avoid context switching or toggling between applications to look for information. Have it handy in the platform you already are familiar with. 
  • Increase team productivity and reduce friction. This is a byproduct of automating business processes since you bid adieu to manual ways of doing things.
  • Accurate information exchange through integrations, which in turn provides teams with better decision-making insights. 
  • Efficient communication across teams as diverse tools start interacting and collaborating with each other. 
  • Integrations are as much for business teams as they are for technical teams, so a range of audiences can benefit and get aligned on common business goals.
  • Transparency between teams and visibility of critical information comes naturally to integrated systems. 

After understanding the what and why, let’s explore a few practical use cases of Salesforce integrations. 

Common Use Cases

We will see these use cases in the form of popular patterns that are often demanded from an integration.

Use Case 1: Migrate Customer Data from External Systems to Salesforce

Sometimes information residing in external systems needs to be migrated to Salesforce. In such a case, you need to plan the scope of the migration, define mapping rules, and carry out the actual exchange of data. 

Often, such a use case is suitable for migrating from a legacy system to Salesforce or consolidating different CRM systems (a Salesforce to Salesforce integration). 

Use Case 2: Transfer Customer Information between Salesforce and Other Systems (One to many)

The sales team, for example, is keeping track of customer information in their Salesforce instance in the form of Opportunities, Cases, or Accounts. There can be a need to reflect this information into systems like Jira, GitHub, or Azure DevOps. This usually falls to the back office and development teams respectively.

The back office teams using Jira might handle the licensing and contract management tasks whereas the dev team can look into customer cases raised as issues in GitHub or Azure DevOps. And all this information can then flow back and forth smoothly between these systems increasing visibility for the teams involved. 

Use Case 3: Present Multiple Related Salesforce Objects into External Systems (Many to One)

Sometimes you need to sync multiple related Salesforce objects to Jira.

Salesforce has related objects like Cases belonging to a particular Account or Contact. And then these need to be reflected onto other systems, maybe under Jira as issues. Since these 2 systems have different fields and entities, information coming from Salesforce can be reflected in custom fields. 

Here, maintaining the Case and its related Account and Contact information under the correct Jira issue is important. Changes or updates on the Salesforce data must reflect correctly on the Jira side. 

Use Case 4: Sync Salesforce Records to the Development Team 

Customer queries, feedback, or issues are often logged into Salesforce Cases. When these useful customer insights are converted into Jira or GitHub issues or Azure DevOps work items, then they can be taken up by the development team to be worked on further. 

Comments, statuses, and attachments (if any) can be bi-directionally synced between all these systems. This can give visibility to the sales teams so they can communicate correctly to the customer about the status of their query and enhance their overall experience. 

You can also envision a workflow orchestration between Salesforce and other systems. For instance, when a customer case belonging to a particular Account, under the State = ‘New’ is created, then it is sent over to Jira.

When the dev team starts working on it, an ‘In Progress’ status in Jira puts the case under ‘Working’ in Salesforce. Comments and attachments are synced. Then when the dev team finally resolves the issue and puts it under ‘Done’ they pass a comment: ‘Issue is fixed, marked for release’ over to the sales team.

Then the case is marked ‘Solved’ in Salesforce and the comment from Jira is reflected too.

Use Case 5: Correlate Data between Salesforce and External Systems

A one-to-one connection between entities residing in Salesforce and other systems is sometimes needed.

Say incidents, problems, RITMs, etc. in ServiceNow need to be connected to a particular case in Salesforce. Then the proper status updates, work notes, and other custom fields need to be synced. This can bring useful insights for the customer support and sales teams. 

As you might have already guessed, the possibilities are endless. So keeping them in mind, we move forward with how Salesforce integrations can be implemented. 

How to Implement Salesforce Integrations 

We have talked enough about how Salesforce is a great CRM tool, boasting of customizability. So while we are at it, let me point to the native ways in which Salesforce allows you to enhance its connectivity and reach, by allowing integrations with external systems. 

Native Ways to Implement Salesforce Integrations

Of course, this seems like the most logical choice when it comes to implementing Salesforce integrations. But before we dive deeper into the nuances, let’s first see how it can be achieved. 

The way Salesforce categorizes integrations with other 3rd party applications is through ‘Inbound’ and ‘Outbound’ messages. Simply put, inbound implies data coming into Salesforce from another system, and outbound means data leaving Salesforce and being fed into an external system. 

What are Inbound and Outbound Messages? 

Inbound messages work on data-based integrations. Generally used when Java, .Net, or PHP code needs to interact with Salesforce. Here, the external system (acting as a client)  prepares and submits a request to fetch data from Salesforce (acting as a server).

The data is fetched from the server and a response is generated. This response is then handled by the client, i.e. the external system. 

Outbound messages work on business logic integration. Here, Salesforce prepares and submits a request to send to an external system. The external system receives the request and sends an acknowledgment, but the request isn’t processed just yet. After processing the request, a callback is provided that contains the result of the initial request. The result is then processed by Salesforce.  

For Inbound Salesforce integrations:

  • REST API: This is used for different operations on the data. Works in both JSON and XML format and is lightweight. It supports synchronous operations. 
  • SOAP API: It uses XML for structured payloads and supports asynchronous operations. 
  • Bulk API: This is used for high-volume transactions. It is best used if you want to migrate data to Salesforce and it supports asynchronous operations. 
  • Salesforce Connect: This allows you to view or edit remote files or data within the Salesforce environment as external objects. So they can be searched in the global search or added to the record feeds. However, this data does not persist in Salesforce. It supports real-time data access. It has a point-and-click interface. 

For Outbound Salesforce integrations:

  • Apex callouts: Apex is a powerful medium that can be used to transfer data from Salesforce to an external system. For instance, when an Account record is updated, then the update must be reflected on the external system as well. 

There are also others like Streaming API, Apex Web services, etc. 

We have seen a lot of ways Salesforce integrates with other systems. So let’s have a look at the challenges some of these alternatives pose. 

Challenges of Native Salesforce Integrations 

  • Salesforce Connect works best for Salesforce to Salesforce integrations. The external objects viewed within Salesforce are read-only and additional configuration efforts are required to make them editable. Since it is a point-and-click interface, Salesforce API integrations are bound by the native UI capability. 
  • Apex is an alternative if deeper integrations are required, but honestly, it is neither designed nor optimal for providing integration capabilities. To perform integration using Apex, we need technical resources, which might not be readily available. It is also bound by governor limits
  • The other pitfalls for the alternatives we discussed above are limited data durability, lack of strong security mechanisms, and limited read/ write capabilities. 

You can still build your own apps using the Salesforce App Cloud platform. But it comes down to additional development efforts and still no guarantee that most integration scenarios will be covered. They also sometimes require to be complemented by middleware applications on AppExchange. 

3rd-Party Integrations 

So the best alternative will be to leverage the breadth of the apps that Salesforce has to offer on AppExchange. They are professional, provide ready-made integrations to get you up and running in no time, and support a lot of different deployments and pricing models. 

Now I understand you are caught between a rock and a hard place here, so let me make this easier for you. 

Let’s first set the criteria for the right 3rd-party solution. 

How to Choose the Right 3rd-Party Integration Solution 

Decentralized Integration

Almost all the solutions out there in the market are centralized. The major problem with a centralized solution is that the integration requirements need to be mapped out over a central system, so there is an increased dependency on it. 

Also, the centralized solution becomes the driving force for carrying forward the integration and thus becomes a single point of failure. 

As opposed to this, a decentralized integration will offer the benefit of independent control at either end of the integration. This makes the systems less dependent on each other, and such loosely coupled systems then offer greater security, flexibility, and scalability.  


When 2 systems are not dependent on a central UI to manage their integration, they get to decide what information must be sent and received independently of one another. In essence, you do not send the information you don’t want the other party to access, and receive only the information you need. This avoids the possibility of unauthorized access to information. 

In addition, necessary security measures like token-based authentication, use of HTTPS, role-based access, etc. are mandatory. It also helps if the solution is ISO 27001:2002 certified.


Support for basic to advanced integrations is what these tools are made for. So the more flexible the solution, the more the possibility of assimilating it into your ever-growing integration requirements. This acknowledges the fact that businesses grow and so do integration requirements. 

Another aspect to consider is the kind of users the solution caters to. Commonly, the integration is run by business and technical teams, so it should be equally useful to both. 


Automated integration replaces manual interactions and thus avoids errors. It also ensures the data exchanged is accurate and consistent. So reliability plays an important role in determining better results for your integration. An automated mechanism to retrieve changes from the last downtime or system failure and apply them in the correct order of their initiation must be at the core of the solution. 

Number of Supported Integrations

You want a solution that supports a number of diverse platforms. Think Jira, Azure DevOps, GitHub, and the like. This will give you the liberty to connect to just another of your customers, partners, suppliers, or vendors without having to build or configure a completely new integration by yourself. 

A major point I would like to stress here is that any integration solution you consider needs to allow the teams to grow the integration into what is required by the business. This includes functionality, security, governance, and other concerns. This can only be achieved by a tool flexible, reliable, and secure enough to handle this for you. 

The tool I will use here is called Exalate

Let’s see what it has to offer: 

  • It supports decentralized integration. As already discussed, this means that each integrating side has complete, independent control over incoming and outgoing information. So it increases the inherent security within your integration.

    Exalate achieves this with the help of a scripting engine that has Sync rules, that can be configured at either end. We will see how that’s done in a while.
  • This scripting engine offers flexible and deeper integrations. It also comes with a drag-and-drop interface for common integration scenarios, but even this can be configured for advanced use cases. 
  • It uses a JWT-based token mechanism, HTTPS, and also provides role-based access control. All this can be explored in detail in its security and architecture whitepaper.
  • It supports integrations for many popular platforms like Jira, Zendesk, Azure DevOps, GitHub, HP ALM, etc. So you can simply set up a Jira Salesforce integration or you can also get the same platform integrations using Exalate like a Salesforce to Salesforce integration
  • With the help of an integrated retry mechanism, changes or updates can be applied automatically in case of downtimes. 

How to Set up Salesforce Integrations Using a 3rd-Party Solution 

In this section, we are going to set up a Salesforce integration using Exalate

Exalate is one of the top salesforce integrations that allows you to set up a flexible 2-way sync between different tools like Jira, Salesforce, GitHub, etc. It helps unlock collaboration between teams across company borders, or even between different departments or projects within a single company. 

But as a general rule, before starting with the implementation, it is important to lay the foundations of integration well. 

Let us now walk through the step-by-step approach for a Salesforce integration using Exalate.

Step 1: Lay the Groundwork

Start with extensive planning of technical/ business resources and docs, map the data flow,  orchestrate the workflows end-to-end, and set the data exchange requirements. Consider your integration as just another project, having specific roadmaps, guidelines, goals, roles, and responsibilities. 

Chalking out a detailed integration plan either within a company (intra-company integration) or across different companies (cross-company integration) is important to deliver the benefits sooner. 

When it comes to Salesforce integrations, it is also important to consider the type of integration desired (as discussed above) and review the API limits. 

Proper authorizations and authentications must also be in place. A major point here is also to ensure that the difference in the architecture of the 2 integrating systems is taken into account. 

Having undertaken this, prepare to get started with Exalate and move to the next step. 

Step 2: Install Exalate on Salesforce and the Other Application

Exalate needs to be installed as a dedicated app on Salesforce and the other application you want to integrate it with. It can be any one of the different integrations Exalate supports. 

You can request a free trial for your Salesforce Integration. The Exalate team will reach out to you with the following steps.

You can also head to Salesforce AppExchange and search for “Exalate”.

You will then need to decide where you want to install Salesforce: either “Install in This Org” or in a Sandbox org. My preference was to install it in the current org.

Install Exalate on Salesforce org

After making your selection, scroll down to review and agree to the terms and conditions. When you’re ready, click on “Confirm and Install” to initiate the installation process.

Next, you’ll be asked to specify the users for whom you want to install Salesforce. Keep in mind that you can always modify this later on. In my case, I chose “Install for All Users” and then clicked “Install”.

Now, you’ll need to “Approve Third-party Access” by clicking on “Continue”. This step allows Exalate to access the required data. Once the approval is given, the installation process will be completed. Click on “Done” to finalize the setup.

Next, go to your Salesforce instance and create a connected app. Make sure to save the “Consumer Secret” and “Consumer Key” generated during this process. Then, within your Salesforce instance, navigate to “Apps” and search for “Exalate”.

Exalate app in Salesforce

For requesting an Exalate node, provide the “Consumer Secret” and “Consumer Key” you saved earlier, and then click on “Request Node”.

Request Exalate node

To grant access permissions to Exalate, click on “Allow”. Afterward, enter your personal details and click on “Agree and Submit”. Now, simply wait for an email from the Exalate License Manager.

Register Exalate node for Salesforce

Once you receive the email, click on “Verify Exalate instance” to be redirected to the Exalate admin console.

If you ever get logged out of your Salesforce instance, you can refer back to these steps to log in again.

Note: Fan of videos? Check out Exalate installation videos.

Step 3: Connect Salesforce and the Other Application

Once Exalate is installed on both sides, you need to go to the ‘Connections’ tab in its console. A connection needs to be created. 

It first authenticates both the source and the destination platforms and then creates a secure passage through which data can be transferred back and forth according to the rules you have set. 

One side initiates the connection and the other side accepts the connection invitation. 

The Exalate UI is the same for all platforms, so it doesn’t matter which side you start from. 

Initiate connection in Exalate

From your Salesforce instance, click ‘Initiate connection’ under the ‘Connections’ tab. 

On the next screen, enter the destination instance URL. This can either be another Salesforce instance or Jira, GitHub, Azure DevOps, etc. 

Initiate connection in Exalate

Once done, a quick check is performed to check if Exalate is installed on the destination side.

Based on the destination instance you will be prompted to choose between 2 different modes. 

The Basic mode and the Script mode

The Basic mode is for simple integrations like when you want to sync a Case from Salesforce to Azure DevOps, or if you want to sync an issue (issue type, summary, description, comments, and attachments) from Jira to Salesforce. 

The sync cannot be configured in this mode, so it works best if you want to give Exalate a try for the first time. But it does come with a Free Plan that supports up to 1,000 free syncs per month. 

What makes Exalate stand out is the Script mode

It has an intuitive Groovy-based scripting engine that allows you to control your sync from either end independently with the help of outgoing and incoming processors. That controls information coming in and going out of Salesforce or the other application. These processors can be configured with the help of Sync rules. We will see how it can be done. 

Let’s first see how both these modes work. 

The Basic Mode

Choose the Basic mode on the screen above and hit ‘Next’. You will be redirected to a screen asking you if you have admin access to the other side. 

In case you do, depending on the destination application, you will be either prompted to choose a project (for instance, in Jira or Azure DevOps) or a repository in the case of GitHub or a connection will be established straight away. 

You can start by entering the Case key directly and get it synced over to the other side. 

Basic mode sync case

You can even navigate to the other side and enter the unique identifier of the entity you want to sync. 

Basic mode synchronized

The Script Mode 

Let’s try out the full functionality of Exalate. So choose Script and click ‘Next’. 

Enter the details for the remote and the local instance. You can change the connection name if you want. Enter a description too. Click ‘Initiate’.

Connection details Exalate

Next, an invitation code will be generated. This works like a shard secret that authenticates both integrating parties. Click on ‘Copy invitation code’.

Go to the other side, and now click ‘Accept Invitation’.

Paste the copied code in the text area and click ‘Next’. 

Paste invitation code

Here again, depending on the other application you will be required to either choose a project or a repository like in the Basic mode. 

A connection then gets successfully established.

Successful connection

Move to the next step. 

Step 3: Configure the Connection to Control Information Exchange 

To configure the connection, click the ‘Configure Sync’ button. Or you can even go to the ‘Connections’ tab and click the edit connection icon in front of the connection name. 

Both approaches will take you to a similar screen. 

Sync rules in Salesforce

You can see 4 tabs: ‘Rules’, ‘Triggers’, ‘Statistics’, and ‘Info’.

We will explore the ‘Rules’ tab here and the ‘Triggers’ in the next section. 

Statistics and Info simply provide more information about the connection. 

Rules are the Sync Rules we discussed a moment ago. They have both an ‘Incoming sync’ and ‘Outgoing sync’ to control information flow. 

For instance, ‘Outgoing sync’ on Salesforce means what information must be sent out from Salesforce, and ‘Incoming sync’ means how information coming from the destination platform is interpreted. The same rules are present on the other side too. 

This information is passed back and forth in something called ‘Replica’. It works like a message or payload between the integrating applications. 

For instance, replica.summary=entity.Subject in the ‘Outgoing Sync’ of Salesforce means that the subject of the entity (Case, Product, Account, Opportunity, Task, etc.) is copied into replica.summary. 

This replica.summary is copied into the summary on the other side, for instance, in Jira’s ‘Incoming Sync’ we will write issue.summary=replica.summary.  

So if you want to send additional information, you can simply add it to the replica and send it over to the other side. There we extract the information from the replica and apply it locally in any way that makes sense. 

If there is something you don’t want to send or receive, you can simply delete the line or comment it, so it will be ignored at the time of synchronization. 

Once you have decided what information must be sent and received, move to the next step where you decide when to send this information. 

Step 4: Set up Automatic Synchronization Triggers

Triggers control when information exchange must happen. Say when a new Case is created i.e. Status = ‘New’, then send it over to the other side. 

In short, when the condition set for the trigger is met, then send and receive information according to the ‘Sync rules’. 

Remember that triggers are platform-specific, so on the other side, they will be either in JQL (Jira Query Language) for Jira or WIQL (Work Item Query Language) for Azure DevOps and so on. 

Click the ‘Triggers’ tab from the last screen we saw. There is also a ‘Triggers’ screen on the left-hand side of the Exalate console. This is a global screen to manage triggers. You can create one from here too, but you need to select the connection name while doing so. 

Click the ‘Create Trigger’ button to open the ‘Add Trigger’ screen. 

Salesforce Trigger

Under the first drop-down, select the Salesforce object to which the trigger applies. It can be a Case, Account, Opportunity, or Product. 

You can directly enter some values in the text boxes provided to filter what conditions to set for the trigger. 

Or you can simply toggle the ‘Use search query’ button. This will allow you to enter triggers in the SOQL (Salesforce Object Query Language). 

For instance, if this is the query: Status = 'New' AND SuppliedCompany = 'Exalate', then it means that newly-created Cases having the Web Company = ‘Exalate’ need to be synced over to the other side. 

Leave some notes for the trigger, activate it, and click ‘Add’. 

You can view the newly created trigger on the previous screen. To delete or edit a trigger, click the 3 dots in front of the name and explore the options. You can also sync the existing entities that satisfy the trigger condition using the ‘Bulk Exalate’ option. 

Don’t forget to ‘Publish’ the changes to the connection. 

Step 5: Start Synchronization

​​There are multiple ways in which you can start synchronization. 

  • For the Basic connection, directly enter the Case number. 
  • Manually sync the Salesforce object through the Exalate panel under the object view. This option is also available for other platforms like Jira, Zendesk, etc. So just select the name of the connection you want to sync the particular object with. 
  • Create automatic sync triggers like we just saw.
  • Use the ‘Bulk Exalate’ or ‘Bulk Connect’ option to sync objects that already exist in Salesforce or other applications. 

Things to Consider When Using Exalate 

Start with a Clear Integration Scope

With a flexible tool like Exalate that allows deeper integrations with the help of scripts, it is important to have clear integration goals and requirements set. 

This also includes understanding what information must be sent and received and how it will impact security. Since decentralized integration that Exalate provides needs a deeper thought into the information exchange scope. 

API Limits

Exalate can access the Salesforce integrations API. Salesforce has its own guidelines for API Access add-ons. For instance, API access is provided by default in Enterprise accounts, while it is not the case with other accounts like Professional. This must be considered beforehand. 

Note: Visit this documentation page to learn about the different Salesforce editions Exalate supports. 

Access to the Exalate App

Managing access to the Exalate app is an important consideration since you don’t want the information to be in the wrong hands or violate any data regulatory requirements. 

This is possible by giving appropriate permissions while installing the app itself, i.e. you can choose to permit either the admins, all users, or specific users. This can also be changed later on. 


In this blog post, we discussed what Salesforce integrations are and went over the benefits of integrating the Salesforce application with other applications like Jira, GitHub, Azure DevOps, Zendesk, or HP ALM by having a look at a few real-life use cases. 

And then we looked at the native ways in which to achieve such integration. Of course, there are challenges there, but we addressed them by exploring a third-party integration solution called Exalate. 

And then we saw a step-by-step approach to our integration by seeing how it can be set up using Exalate. 

All said and done, Salesforce integrations can prove to be an effective decision for your business and we saw just that in our blog post. 

Frequently Asked Questions

Why is the advantage of Salesforce integration?

Salesforce integration offers streamlined data flow, information consistency, and reduced manual data entry. Integration enhances productivity by automating processes and providing a unified view of customer data. It also improves the customer experience by delivering personalized interactions based on integrated data. 

What are Salesforce integrations?

Salesforce integrations refer to connecting Salesforce with external systems, applications, or services to automate data exchange and extend the core functionality. Such integrations can be achieved through APIs (Application Programming Interfaces), middleware platforms, or pre-built connectors provided by third-party plugins

What applications integrate with Salesforce?

You can integrate Salesforce with various systems, such as ERP, marketing automation, customer support, or custom-built applications. For instance, you can use the best Salesforce integrations to connect Salesforce with Mailchimp, Jira, GitHub, Azure DevOps, Asana, Slack, etc. 

How to choose the correct Salesforce integration solution? 

There are a lot of tools that support Salesforce integration with multiple systems. Some factors to consider while choosing these tools are ease of use, flexibility to support advanced integration cases, scalability, maintainability, robustness of the integration, and cost. You can also create an assessment matrix and choose one that best suits your requirements. 

What is REST API in Salesforce? 

The REST API serves as a web interface allowing you to access Salesforce data externally. Through REST API access, you can interact with Salesforce by sending HTTP requests to specific endpoints. These requests enable you to create, modify, search, and retrieve various types of information. 

Integrating Salesforce using REST APIs requires technical resources to implement it. Instead, an external integration vendor can ensure a hassle-free implementation. 

Recommended Reads:

Comments are closed.