private String getClientGeoLocation(final ClientInfo clientInfo) {
        return geoLocationService
            .stream()
            .map(service -> {
                val geoLocation = service.locate(clientInfo.getClientIpAddress());
                if (geoLocation != null && geoLocation.getAddresses() != null && !geoLocation.getAddresses().isEmpty()) {
                    return org.springframework.util.StringUtils.collectionToCommaDelimitedString(geoLocation.getAddresses());
                }
                return clientInfo.getClientIpAddress();
            })
            .filter(Objects::nonNull)
            .findFirst()
            .orElseGet(clientInfo::getClientIpAddress);
    }
The {@link DefaultCasCookieValueManager} is responsible for creating
the CAS SSO cookie and encrypting and signing its value.
<p>
This class by default ({@code CookieProperties.isPinToSession=true}) ensures the cookie is used on a
request from same IP and with the same user-agent as when cookie was created.
The client info (with original client ip) may be null if cluster failover occurs and session replication not working.

@author Misagh Moayyed
@since 4.1
core/cas-server-core-cookie-api/src/main/java/org/apereo/cas/web/support/mgmr/DefaultCasCookieValueManager.java