TVSDK 2.7 for Android Release Notes describe what is new or changed, the resolved and known issues and the device issues in TVSDK Android 2.7

TVSDK Android 2.7

The Android reference player is included with Android TVSDK in the samples/ directory of your distribution. The accompanying README.md file explains how to build the reference player. 

Note:

To successfully build the reference player, as described in the README.md distributed with the release, make sure you do the following:

  1. Download VideoHeartbeat.jar from https://github.com/Adobe-Marketing-Cloud/video-heartbeat-v2/releases (VideoHeartbeat library for Android v2.0.0)
  2. Extract VideoHeartbeat.jar into the libs/ folder.

New features

TVSDK 2.7 for Android includes all features of version 1.4 except the features not supported listed under Feature Matrix.

What's New in TVSDK 2.7

  • Parallel Ad Resolution Support

TVSDK 2.7 supports the concurrent resolution of all the Ad requests in an Ad break, instead of sequential resolution.

New features in the previous releases

New features

What's New in TVSDK 2.5.6

  • TVSDK 2.5 supports Android P

  • Enabling Background Audio

    To enable audio playback when app moves from foreground to background, app should call enableAudioPlaybackInBackground API of MediaPlayer with true as argument when player is in PREPARED state. 

  • alwaysUseAudioOutputLatency(boolean val) in MediaPlayer class

           When set, use output latency in the audio timestamp calculation.

           Boolean parameters val - True will use audio output latency in audio timestamp calculation.

  • Optimized to get the best playback experience even if the bandwidth speed falls off suddenly

    TVSDK now cancels the ongoing segment’s download, if required, and dynamically switches to the appropriate rendition.  This is done by seamlessly switching among the bitrates without interruptions.

What's New in TVSDK 2.5.5

  • Partial Ad-Break Insertion
    TV-like experience of joining in the middle of an ad without firing the tracking for the partially watched ad.
    ExampleUser joins in the middle (at 40 seconds) of a 90-second ad break consisting of three 30-second ads. This is 10 seconds into the second ad in the break.

    • The second ad plays for the remaining duration (20 sec) followed by the third ad.
    • Ad trackers for the partial ad played (second ad) are not fired. The trackers for only the third ad are fired.
  • Secure Ad Loading over HTTPS

    Adobe Primetime provides an option to request first call to primetime ad server and CRS over https. 

  • AdSystem and Creative Id added to CRS requests
    • Now including 'AdSystem' and 'CreativeId' as new parameters in the 1401 and 1403 requests.

  • API setEncodeUrlForTracking in NetworkConfiguration class removed as the unsafe characters in a URL should be encoded.

What's New in TVSDK 2.5.4

Android TVSDK v2.5.4 offers the following updates and API changes:

  • Changes in default value for WebViewDebbuging

    WebViewDebbuging value is set to False by default. To enable it, call setWebContentsDebuggingEnabled(true) in the application.

  • OpenSSL and Curl version upgrade

    Updated libcurl to v7.57.0 and OpenSSL to v1.0.2k.

  • App level access for VAST response object

    Introduced a new API NetworkAdInfo::getVastXml() that provides access of the VAST response object to the application.     

What's New in TVSDK v2.5.3

Android TVSDK v2.5.3 offers the following updates and API changes.

  • All TVSDK customers who use CRS are encouraged to upgrade their apps with TVSDK 2.5.3.85 or latest on Android. This will be a drop-in replacement to the existing app implementation. After the TVSDK upgrade, check for the CRS creative URL requests in a proxy tool (ex: Charles) and confirm that the host name and version in the path reflects as in the sample URL structure below.

    http://primetime-a.akamaihd.net/assets/3p/v3.1/222000/167/d77/167d775d00cbf7fd224b112sf5a4bc7d_0e34cd3ca5177fbc74d66d784 bf3586d.m3u8

     

  • TVSDK's User Agent customizable: we have added some new API's to customize the user agents.
    • setCustomUserAgent(String value)
    • getCustomUserAgent()
  • Share cookies between Android Application and TVSDK: Android TVSDK now supports accessing of cookies between JAVA layer (stored in CookieStore of the Android Application) and the C++ TVSDK layer. Now, it's possible to set and/or modify the cookies in native C++ layer as they will be exposed to the Java Cookie Store.
  • API changes:
    • A new Event CookiesUpdatedEvent is added. It gets dispatched by the media player when its cookie is updated.
    • A new API is added to NetworkConfiguration::set/ getCustomUserAgent() to use custom user agent.
    • A new API is added to NetworkConfiguration::set/ getEncodedUrlForTracking to force Encoding of Unsafe characters.
    • A new API is added to NetworkConfiguration::getNetworkDownVerificationUrl() to set a network verification URL in case of a failover.
    • A new property is added to TextFormat::treatSpaceAsAlphaNum which define whether to treat space as alphanumeric while displaying captions.
  • Changes in SizeAvailableEvent: Previously, getHeight() and getWidth() methods of SizeAvailableEvent in 2.5.2 used to return Frame height and frame width, which was returned by media format. Now it returns output height and output width respectively returned by decoder.
  • Changes in Buffering behavior: Buffering behavior is changed. Its left up to App developer on what they want to do in case of buffer empty. 2.5.3 uses play buffer size at buffer empty situation.      

What's New in TVSDK v2.5.2

Android TVSDK v2.5.2 offers important bug fixes and a few API changes.

What's New in TVSDK v2.5.1

The important new features released in Android 2.5.1.

  • Performance Improvements

    The new TVSDK 2.5.1 architecture brings a number of performance improvements. Based on statistics from a third party benchmarking study, the new architecture provides a 5x reduction in startup time and 3.8x fewer dropped frames compared to the industry average:

     

    • Instant on for VOD and live - When you enable instant on, the TVSDK initializes and buffers media before playback starts. Because you can launch multiple MediaPlayerItemLoader instances simultaneously in the background, you can buffer multiple streams. When a user changes the channel, and the stream has buffered properly, playback on the new channel starts immediately. TVSDK 2.5.1 also supports the Instant On for live streams also. The live streams are re-buffered when the live window moves.
    • Improved ABR logic - The new ABR logic is based on buffer length, rate of change of buffer length, and measured bandwidth. This ensures that the ABR chooses the right bit rate when the bandwidth fluctuates and also optimizes the number of times the bitrate switch actually happens by monitoring the rate at which the buffer length changes.
    • Partial Segment Download / Sub-segmentation - TVSDK further reduces the size of each fragment, in order to start playback as soon as possible. The ts fragment must have a key frame every two seconds.
    • Lazy ad resolution - TVSDK doesn't wait for resolution of non-preroll ads before starting playback, thus decreasing the startup time. APIs like seek and trick-play are still not allowed until all ads are resolved. This is applicable to VOD streams used with CSAI. Operations like seek and fast forward are not permitted till the ad resolution is completed. For live streams this feature cannot be enabled for ad resolution during a live event.
    • Persistent network connections - This feature allows TVSDK to create and store an internal list of persistent network connections. These connections are reused for multiple requests, rather than opening a new connection for each network request and then destroying it afterwards. This increases efficiency and decreases latency in the networking code resulting in faster playback performance.

      When TVSDK opens a connection it asks the server for a keep-alive connection. Some servers may not support this type of connection, in which case TVSDK will fall back to making a connection for each request again. Also, while persistent connections will be on by default, TVSDK now has a configuration option so that apps can turn persistent connections off if desired.

    • Parallel download - Downloading video and audio in parallel rather than in series reduces startup delays. This feature allows HLS Live and VOD files to be played, optimizes the available bandwidth usage from a server, lowers the probability of getting into buffer under-run situations, and minimizes the delay between download and playback.
    • Parallel ad downloads - TVSDK prefetches ads in parallel to the content playback before hitting the ad breaks thus enabling seamless playback of ads and content.

     

  • Playback
    • MP4 Content Playback - MP4 short clips do not need to be re-transcoded to play back within TVSDK.

      Note: ABR switching, trick play, ad insertion, late audio binding, and sub-segmentation are not supported for MP4 playback.

    • Trick play with adaptive bit rate (ABR) - This feature allows TVSDK to switch between iFrame streams while in trick play mode. You can use non-iFrame profiles to do trick play at lower speeds.
    • Smoother trick play - These improvements enhance the user experience:
      • Adaptive bit-rate and frame rate selection during trick play, based on bandwidth and buffer profile
      • Use of the main stream instead of the IDR stream to get up to 30 fps fast playback.
  • Content Protection
    • Resolution-based output protection - This feature ties playback restrictions to specific resolutions, providing finer grained DRM controls.
  • Workflow Support
    • Direct Billing Integration - This sends billing metrics to the Adobe Analytics backend, which is certified by Adobe Primetime for streams used by the customer.

      TVSDK automatically collects metrics, abiding by the customer sales contract to generate periodic usage reports required for billing purposes. On every stream start event, TVSDK uses the Adobe Analytics data insertion API to send billing metrics such as content type, ad insertion enabled flags, and drm enabled flags - based on the duration of the billable stream - to the Adobe Analytics Primetime owned report suite. This does not interfere with or get included in the customer’s own Adobe Analytics report suites or server calls. On request, this billing usage report is sent to customers periodically. This is the first phase of the billing feature supporting usage billing only. It can be configured based on the sales contract using the APIs described in the documentation. This feature is enabled by default. To turn this feature off, refer to the reference player sample.

    • Improved Failover Support - Additional strategies implemented to continue uninterrupted playback, despite failures of host servers, playlist files, and segments.
  • Advertising
    • Moat Integration - Support for ad viewability measurement from Moat.
    • Companion banners - Companion banners are displayed alongside a linear ad and often continue to be displayed on the view after the ad ends. These banners can be of type html (an HTML snippet) or type iframe (a URL to an iframe page).
  • Analytics
    • VHL 2.0 - This is the latest optimized Video Heartbeats Library (VHL) integration for automatic collection of usage data for Adobe Analytics. The complexity of the APIs has been decreased to to ease the implementation. Download the VHL library v2.0.0 for Android and extract the JAR file in the libs folder.
  • SizeAvaliableEventListener
    • getHeight() and getWidth() methods of SizeAvailableEvent will now return output in height and width respectively. Display aspect ratio can be calculated as follows:

      SizeAvailableEvent e;

      DAR = e.getWidth()/ e.getHeight();

       

      Storage Aspect Ratio in terms of Sar width and Sar height can also be used to calculate Frame width and Frame height:

       

      SAR = e.getSarWidth()/e.getSarHeight();

      frameHeight = e.getHeight();

      frameWidth = e.getWidth()/SAR;

  • Cookies
    • Android TVSDK now supports access to JAVA cookies stored in CookieStore of the Android Application. A Callback API (onCookiesUpdated) is provided to record whenever a new Cookie comes as part of "Set-Cookie" Response header. These cookies are available as a List of HttpCookie(s) used for a different URI/domain by setting these cookie values on that particular URI/domain using CookieStore. Similarly the cookie values in TVSDK are updated using CookieStore add API. 

Feature matrix

TVSDK for Android supports a number of features that you can implement to add functionality to your video applications.

In the feature tables below, a 'Y' indicates that the feature is supported in the current release.    

Support playback features
Feature Content type HLS
General playback (Play, Pause, Seek) VOD + Live Y
FER - General playback (Play, Pause, Seek) FER VOD Y
Seek when an ad is playing VOD + Live Not supported
AC3 VOD + Live Not supported
MP3 VOD Not supported
MP4 Content Playback VOD Y
Adaptive Bit Rate Switching Logic VOD + Live Y
Audio Only Playback VOD + Live Y
Multi CDN Support VOD + Live Not supported
Playback of ads with audio-only media VOD + Live Not supported
Closed Captions - 608/708 VOD + Live Y
Closed Captions - WebVTT VOD + Live Y
Manifest Failover VOD + Live Y
Advanced Failover VOD + Live Y
QoS and player notifications VOD + Live Y
Support for cookie headers VOD + Live Y
Support for custom HTTP headers VOD + Live Y (Whitelisting required)
Set buffer control parameters VOD + Live Y
Set adaptive bit-rate controls VOD + Live Y
Custom Manifest Tags VOD + Live Y
Late Audio Binding VOD + Live Y
302 Redirect VOD + Live Y
Playback With Offset VOD + Live Y
Audio Only Playback VOD + Live Y
Trick Play VOD + Live Y
Slow Motion in Trick Play VOD + Live Not supported
Smooth Trick Play (with ABR) VOD + Live Y
ID3 Parsing VOD + Live Y
Blackout of ads VOD + Live Not supported
Instant On VOD + Live Not supported
Discontinuity marker support VOD + Live Y
302 Redirect Stickiness VOD + Live Y        
Supported ad-insertion features
Feature Content type HLS
General playback, ads enabled VOD + Live Y
FER content with ads enabled VOD Y
Default Ad Behaviors VOD + Live Y
VAST 2.0/3.0 VOD + Live Y
VMAP 1.0 VOD + Live Y
MP4 Ads VOD + Live Y (from CRS)
Trick Play with Ads Enabled VOD + Live Y
Ad only VOD Y
Targeting Parameters VOD + Live Y
Custom Parameters VOD + Live Y
Custom Ad Behaviors VOD + Live Y
Custom Ad Tags Live Y
Custom Ad Resolvers VOD + Live Y
Freewheel Custom Ad Resolver VOD Y
C3 VOD + Live Not supported
Lazy Ad Resolve VOD Y
Discontinuity marker support - SSAI VOD + Live Y
Companion Ads, Banner Ads, and Clickable Ads VOD + Live Y
VPAID 2.0 VOD + Live Y (JS)
Early Ad Exit Live Y
Rules-based Creative Prioritization VOD + Live Y
CRS Rules VOD + Live Y
JSON Ad Resolver VOD + Live Not supported
Moat Integration VOD + Live Y        
Supported content protection features
Feature Content type HLS
AES Encryption VOD + Live Y
Sample AES Encryption VOD + Live Y
Tokenized Streams VOD + Live Y
DRM VOD + Live Primetime DRM only (Future: Widevine)
External Playback (RBOP) VOD + Live Primetime DRM only
License Rotation VOD + Live Primetime DRM only
Key Rotation VOD + Live Primetime DRM only        
Support integration features
Feature Content type HLS
Adobe Analytics VHL integration VOD + Live Y
Billing VOD + Live Y        

Resolved issues

Android TVSDK 2.7

  • ZD#37166 - Error tracking call gets fired even when the ad is played fine. 
  • ZD#37134 - Wrong Ad IDs are returned, in case, wrapper(3P) Ad is present with multiple ads in VMAP response.

Resolved issues in the previous releases

Resolved issues

Android TVSDK 2.5.6
  • ZD #34992 - Language is empty in Closed Caption.
    • Fixed a case where TVSDK was not parsing #EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS from main manifest to get the caption track details.
  • ZD #35078 - Android P validation.
    • TVSDK 2..5.6 has been validated with latest Android P beta build(s). No issues found due to the new Android OS.
  • ZD #34149 - Player continues to requests manifests even if error is encountered.
    • Fixed the case where TVSDK was making repetitive calls even when all the profiles were down (404 error).
  • ZD #31533 - Playing audio on Android after the app is sent to background. 
    • Added enableAudioPlaybackInBackground API of MediaPlayer which should be called with 'True' as argument (when player is in PREPARED state) to enable playback of audio when app is in background.

Android TVSDK 2.5.5

  • ZD #21647 - Android TVSDK notifies 640x368 when actual video size is 640x360.
    • Due to variable m_nOutputHeight (inside AndroidMCVideoDecoder) getting updated with frame height instead of actual output height. Made relevant changes in function getVideoFrame to calculate m_nOutputHeight correctly.
  • ZD #26614 - Urgent --- 3rd party ad serving / programmatic --- failure to serve impressions.
    • Enhanced the earlier fix by handling the case in XML parsing where issue was reproducible when "space" is before the "equal" sign like <VAST version ="2.0">
  • ZD #29296 - Android: Add AdSystem and Creative id to CRS requests.
    • Now including 'AdSystem' and 'CreativeId' as new parameters in the 1401 and 1403 requests.
  • ZD #33062 - TVSDK crashes on the occurrence of pipe character in VAST response under CDATA node
    • API setEncodeUrlForTracking in NetworkConfiguration class removed as the unsafe characters in a URL to be encoded
  • ZD #33063 - CRS file selection logic was broken - TVSDK was not sending CRS request for webm format but sending it for 3gpp files instead.
    • Fixed the logic now. On using media files with webm and 3gpp format, CRS request to  be sent for webm. And on using both the media files with 3gpp format, the CRS request to be sent for the highest bitrate 3gpp file.
  • ZD #33125 - Android app crashes with specific DoubleClick tag within the VMAP. 
    • Fixed the scenario to avoid the crash.
  • ZD #32256 - License Rotation & Key Rotation Issue - Adobe Access
    • Fixed the segments initialization with the DRM metadata for SampleAES content. Works fine with AES128 content.
  • ZD #33619 - Fast-forwarding a growing playlist content stuck in buffering state near live point.
    • Handled the case when crossing the live point in trick play mode
  • ZD #34151 - TimedMetadata objects out of order.
    • Two TimedMetadata events were appearing in random order if they belonged to same time in the timeline. Maintained their original order in manifest.
  • ZD #34189 - Issue when seeking to beginning of ad break.
    • The issue was with SSAI ads which are stitched using discontinuity. And the cause was a behavior when we seek to the begining of such ads, we search for a keyframe and we don't find it. The reason was the ad's min audio timestamp being before min video timestamp. Hence, we end up searching for a key frame at a wrong fragmentDump data. Fixed now.
  • ZD #34528 - Video resolution not upgrading beyond 640x360 on FireTV 3rd gen dongle.
    • Enhanced the fix to include latest firmware updates
  • ZD #34793 - TVSDK 2.5.x used to crash with custom content resolver in some cases when VideoEngine was assuming that the auditudeSettings are available and they were not.
    • The crash was happening due to a function call on a Null shared pointer (auditudeSettings). Added a conditional check within VideoEngineTimeline::placeToSourceTimeline() to make sure auditudeSettings are available before calling anything on that object.
  • ZD #32584 - Not able to access complete information present in the <Extensions> node of a VAST response.
    • Fixed the issue around XML parsing and now NetworkAdInfo provides the complete information present in the <Extensions> node
  • ZD #35086 - Not getting complete extension data from player in case of specific VMAP responses.
    • The problem was specific to extension xml as XML parsing did not work if extension xml had double quotes within the attribute value.  Fixed the issue.

Android TVSDK 2.5.4

  • ZenDesk#33659 - Playback session enabling webview remote debugging.

WebViewDebbuging is set to False by default. To enable debugging, set as true via the application, using setWebContentsDebuggingEnabled(true).

  • ZenDesk#33011 - Ad timeline is not resolved in case of a failed CRS request.

    When a CRS request to an ad fails, the timeline gets resolved and the remaining ads are played.

  • ZenDesk#34528 - Video resolution does not upgrade beyond 640x360 on FireTV third-generation dongle.

    Video resolution switches up as bit rate switches.

  • ZenDesk#33192 - AudioTrack has null name when track is retrieved via AudioUpdatedEventListener::onAudioUpdated.

    In a few scenarios on FireTV Stick, onAudioUpdate event was getting fired when there was no actual audio update. This is fixed now.     

Android TVSDK 2.5.3

  • Zendesk#32216 - TimedMetadata custom tag subscription is not working.

    We are returning ID3 data as a byte array(to support APIC or generic data) to client whereas in 1.4 return string. Byte array does not handle null terminated character itself, therefore, it was showing special character to the client. This issue is fixed now.

  • Zendesk#32670 - Player Not Failing Over to Redundant Playlist

    This is working fine now and setNetworkDownVerificationUrl is working as expected.

  • Zendesk#32369 - Closed caption shows different color garbage or artifact.

    Issue with CC glitches has been fixed in latest build

  • Zendesk#25590 - Enhance: TVSDK cookie store ( C++ to JAVA )

    Android TVSDK now supports accessing of cookies between JAVA layer (stored in CookieStore of the Android Application) and the C++ TVSDK layer.

  • Zendesk#32252 - TVSDK_Android_2.5.2.12 does not seem to have the fix for PTPLAY-20269

    This issue has been fixed and integerated to 2.5.2 branch.

  • Zendesk#31806 - Auditude sticks in PREPARING

    Player was stuck in Preparing state because response xml had a empty tag. Now issue is fixed.

  • Zendesk#31727 - TVSDK 2.5 closed caption characters are dropped or misspelled.

    Issue is fixed and we are not dropping/misspelling any character.

  • Zendesk#31485 - DrmManager in 2.5

    There was some issue in Creating DrmManager via new DrmManager(Context context). Implemented DRMService class which would provide DRMManager.

  • Zendesk#32794- 1080P resolution stream not playing on Android

    we have changed SizeAvailableEvent and Previously, getHeight() and getWidth() methods of SizeAvailableEvent in 2.5 used to return Frame height and frame width, which was returned by media format. It now returns output height and output width respectively returned by decoder.

  • Zendesk #19359 Flash Player crashes due to the position of #EXT-X-FAXS-CM attribute in set-level manifest.

    The #EXT-X-FAXS-CM tag must always appear at the top playlist before individual bitrate or segments appear in playlist.      

Android TVSDK 2.5.2

  • Zendesk#17305 Artifacts in closed captions with non-opaque background.

    setTreatSpaceAsAlphaNum property in TextFormat is exposed. By default, the property is False. Set the property as True in a client to resolve the dark space issue.

  • Zendesk#25097 CC display has visual artifacts with CC settings.

    setTreatSpaceAsAlphaNum property in TextFormat is exposed. By default, the property is False. Set the property as True in a client to resolve the dark space issue.

  • Zendesk #31620 User agent string going out of TVSDK player is truncated.

    The User agent string will no more be truncated after 128 characters.

    Adobe Primetime version string is added to the system user agent.

  • Zendesk #30809 Missing SEEK_END event prevents app from transitioning to a playing state.

  • Zendesk #30415 Closed Caption's 'Cyan' color is now a darker hue of blue (turquoise), compared to the previous Primetime TVSDK releases.

    The color is changed from DarkCyan to Cyan.

  • Zendesk #30727 VOD ads are not being downloaded/resolved.

    In VMAP XML if there is an empty VAST tag without an explicit closing tag (‘</VAST>’) and without a newline character after it, then the VMAP XML is not parsed properly and ads may not play.

Android TVSDK 2.5.1

  • Device-specific (Samsung Galaxy Tab 4) crash; VOD DRM LBA with Auditude and click on ads.
  • VHL - Incorrect heartbeat calls are sent when starting content from an offset.
  • When VPAID ads are played, the VHL heartbeat calls for event:type:play ad are missing.
  • After going into COMPLETE status, the player goes back to the PLAYING status with SKIP adBreakPolicy for post-roll ads.
  • Cookies are not being attached to outgoing ad callbacks.
  • Ads cue points are not visible.
  • HLS with separate EAC3 SAP track won't load.
  • Player crashes as TVSDK receives a Screen On intent after the Media Player is restored.      

Known issues and limitations

Android TVSDK 2.7

  • TVSDK 2.7 supports concurrent resolution up to 5 Ads.
  • In the case of VMAP response, Ad calls in a single Ad break go concurrently, and the Ad breaks are resolved sequentially. 
  • In the case of FER, Ad calls in each opportunity are resolved concurrently.

Known issues and limitations in the previous releases

Known issues and limitations

Android TVSDK 2.5.6

  • Multiple VMAP ad breaks at same time are not supported.

Android TVSDK 2.5.3

This version has the following issues:

  • Live video playback may have audio-video sync issues on low end devices or poor network conditions.
  • For FER streams, virtualTime and localTime may differ. Also FER with offset does not work.
  • Playback might get stuck when Late Binding Audio contents are seek-ed.
  • Intermittently, webVTT captions may become out of sync for LIVE contents.
  • Intermittently, rapid playback of few frames can be seen after coming out of an ad break.
  • Sometimes, 303 error is thrown for Tripple Wrapper Ad Breaks, even though Ads are played.

Android TVSDK 2.5.2

This version has the following issues:

  • The live video playback may have audio-video sync issues on low-end devices.
  • Playback may stall at times when seeking to the end of the VOD media.
  • For FER streams, virtualTime and localTime may differ. Also, FER with offset does not work.

Android TVSDK 2.5.1

This version of TVSDK has the following issues:

  • Live video playback may have audio-video sync issues on low-end devices.
  • For FER streams, virtualTime and localTime may differ. Also, FER with offset does not work.
  • In VMAP XML, if there is an empty VAST tag without an explicit closing tag (</VAST>), and without a newline after it, then the VMAP XML is not parsed properly and ads may not play.
  • VPAID post-roll are not supported.

 

Helpful resources

This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License  Twitter™ and Facebook posts are not covered under the terms of Creative Commons.

Legal Notices   |   Online Privacy Policy