Data for Breakfast Around the World

Drive impact across your organization with data and agentic intelligence.

Snowflake for DevelopersGuidesBuilding an application on Snowflake with data from Snowflake Marketplace

Building an application on Snowflake with data from Snowflake Marketplace

Marketplace and Integrations
Bren Stokes

Overview

Snowflake Marketplace can provide rapid results to external data which can be used as an overlay or enhancement of your existing data to monitor trends and perform compelling results. Building an application to distribute your results rapidly on a modern data platform are key to innovating faster and gaining a competitive advantage. Snowflake combined with Quasar, a modern Application framework together with AWS can help you achieve that competitive advantage. In this lab, we will show how to build a small web application using the Quasar Application Framework and AWS Lambda Python Layer.

Architecture

Prerequisites

  • We will be using Visual Studio Code in this lab but you are welcome to use your preference.
  • You will need to sign-up for a free AWS trial account.
  • You will need sign-up for a free Snowflake trial account.
  • We provided the Snowflake Connector for Python and made it available for you to download.

What You’ll Learn About Snowflake Marketplace

  • How to explore Snowflake Marketplace Listings
  • How to import data from Snowflake Marketplace
  • How to review Snowflake Marketplace data for insight development

What You’ll Learn About Building an Application

  • How simple it is to connect to Snowflake Marketplace data
  • How simple it is to query the data from Snowflake Marketplace datasets
  • How to perform a quick regression analysis on the datasets
  • How to create a view of Snowflake Marketplace Datasets
  • How to create a line chart using the Quasar application framework
  • How to attach the Snowflake connector in AWS
  • How to create the AWS Lambda function to query Snowflake and pass the data to the application endpoint
  • How to build the Lambda Python script to support interaction with the Quasar line charts

What You’ll Need

What You’ll Build

  • A Quasar .vue chart sourced with Snowflake Marketplace Knoema Economy and Poverty Data
  • A Snowflake Query using the Regression function
  • A AWS Lambda with the Snowflake Python connector

Working with Snowflake Marketplace

Snowflake Marketplace provides visibility to a wide variety of datasets from third-party data stewards which broaden access to data points used to transform business process. Snowflake Marketplace also removes the need to integrate and model data by providing secure access to data sets fully maintained by the data provider.

Before we begin to review working with Snowflake Marketplace data sets, STOP and verify you have installed a trial version of Snowflake. If not, click Install Snowflake Trial. Now that you have a working trial account, and you are logged into the Snowflake Console, follow the following steps.

  • At the top right corner, make sure you are logged in as ACCOUNTADMIN
  • Click on Snowflake Marketplace
  • Click on Explore the Snowflake Marketplace
img1
  • At the Search bar, type: Knoema Economic then click on the Tile Box labeled: Economic Data Atlas.
    img1
  • At the top right corner, Select Get Data
  • Select the appropriate roles to access the Database being created and accept the Snowflake consumer terms and Knoema’s terms of use.
  • Create Database
img1
  • View Database
    img1
  • At the Search bar, type: Knoema Poverty then click on the Tile Box labeled: Poverty Data Atlas.
    img1
  • At the top right corner, Select Get Data

  • Select the appropriate roles to access the Database being created and accept the Snowflake consumer terms and Knoema’s terms of use.

  • Create Database

img1
  • View Database
    img1
  • At the top left corner select Worksheets and select Enable Worksheets and Dashboards*
    img1
  • You will see a display “ Setting Up” and then select Import Worksheets if you have any. Otherwise, you will be taken directly into the worksheet counsel click +Worksheets and paste the following code into the display.

  • At the top right corner, Select Account Admin Role and a Warehouse and select the Database: Knoema_Economy_Data Atlas and run the query by pressing the circle with arrow button at the top right-hand corner for the counsel. Explore the data and familiar yourself with the following data sets:




--## Step 1  Review the available data tables
--Review the datasets available
select * from "KNOEMA_POVERTY_DATA_ATLAS"."POVERTY"."DATASETS";
select * from "KNOEMA_ECONOMY_DATA_ATLAS"."ECONOMY"."DATASETS";

--## Step 2 Identify the columns by which data sets can be joined by running simple select statements for a variety of different data views.  This will allow you to see patterns in data which join views to produce a combined view of many datasets.

select * from "KNOEMA_POVERTY_DATA_ATLAS"."POVERTY"."sdg_01_20" agi;
--Poverty Thresholds -ilc_li01  geo, geoName, geoRegionid month start date
select * from "KNOEMA_POVERTY_DATA_ATLAS"."POVERTY"."ilc_li01";
--Household Investment rate tec00098  geo, geoName, geoRegionid annual start date
select * from "KNOEMA_ECONOMY_DATA_ATLAS"."ECONOMY"."tec00098";
--Household Saving rate teina500-20160217 geo, geoName, geoRegionid quarter start date
select * from "KNOEMA_ECONOMY_DATA_ATLAS"."ECONOMY"."teina500-20160217";
--Key indicators annual nasa_10_ki-20180427 geo, geoName, geoRegionid annual start date
select * from "KNOEMA_ECONOMY_DATA_ATLAS"."ECONOMY"."nasa_10_ki-20180427";
--Proverty and Equity WBPED2020  Country, Country Name, Country Region annual start date
select * from "KNOEMA_ECONOMY_DATA_ATLAS"."ECONOMY"."WBPED2020"

Review the datasets available and identify which data sets can be joined by running simple select statements for a variety of different data views. This will allow you to see patterns in data which join views to produce a combined view of many datasets.

Create Snowflake Views

Using Snowflake's Regression function returns the slope of the linear regression line for non-null pairs in a group. It is computed for non-null pairs, a powerful way to compare multiple variables in a set of data. It will help us evaluate in this case, Credit worthiness of Single Persons relative to Poverty. We also look at Savings rate and average investment rates by geography and time.

  • Go to the home icon and switch to classic console
img1
  • Click worksheets tab and select new worksheet
    img1
  • Select New Worksheet at the top of the Snowflake Console
  • Create a database to store your Application Views.

--# Step 1 Create a database to store your views
Create database VHOL;

--## Step 2 Create a View from the Regression query

create view VHOLAPP2 as select 
agi."geo RegionId" as GeoRegionIdAgi
, agi."Date" as dateAgi
, agi."Value" as ValueAgi
, pth."geo RegionId" as GeoRegionIdPth
, pth."Date"  as datePth
, pth."hhtyp Name" as hhtypNamePth
, pth."indic_il Name" as NamePth
, pth."currency Name"as Name3
, pth."Value" as ValuePth
, ir."geo RegionId"as GeoRegionIdIr
, ir."Date" as  DateIr
, ir."na_item Name" as na_itemNameIr
, ir."Measure Name" as MeasuerNameIr 
, ir."Value" as ValueIr
, sr."geo RegionId" as GeoRegionIdSr
, sr."Date" as  DateSr
, sr."na_item Name" as na_itemNameSr
, sr."Measure Name" as MeasuerNameSr 
, sr."Value" as ValueSr
,REGR_SLOPE(pth."Value", ir."Value") OVER (  PARTITION BY pth."geo RegionId",pth.
"hhtyp Name" ) as ir_lin
,REGR_SLOPE(pth."Value", sr."Value") OVER (  PARTITION BY pth."geo RegionId",pth.
"hhtyp Name" ) as sr_lin

from "KNOEMA_POVERTY_DATA_ATLAS"."POVERTY"."sdg_01_20" agi  --pov atlas
inner join "KNOEMA_POVERTY_DATA_ATLAS"."POVERTY"."ilc_li01" pth on agi."geo RegionId"=pth."geo RegionId" and agi."Date"=pth."Date"  -- join thresholds
inner join "KNOEMA_ECONOMY_DATA_ATLAS"."ECONOMY"."tec00098" ir on agi."geo RegionId"=ir."geo RegionId" and agi."Date"=ir."Date" -- join investment rate
inner join "KNOEMA_ECONOMY_DATA_ATLAS"."ECONOMY"."teina500-20160217" sr on agi."geo RegionId"=sr."geo RegionId" and agi."Date"=sr."Date"  -- join saving rate


--## Step 3 Create a view to pair down the variables for the APP --

create view VHOLAPP3 as select 
 GeoRegionIdPth, dateagi
 ,hhtypNamePth
 ,min(ValuePth) ValuePth
 ,avg(ir_lin) avg_Investment_Rate
 ,avg(sr_lin) avg_Savings_Rate
 from VHOLAPP2
 where GeoRegionIdAgi = 'AT' and hhtypNamePth = 'Single person'
 
  group by dateagi,GeoRegionIdPth,hhtypNamePth--, ir_lin, sr_lin
  order by dateagi,GeoRegionIdPth,hhtypNamePth--, ir_lin, sr_lin 

Limiting the variables that will be presented on the application layer (in this case our chart) is an efficient use of data and compute resources. Hence why we created the VHOLAPP3 view.

Verify your view is created by running the following:

Select * from VHOLAPP3;

Make sure at the top of your worksheet, you are in running with the appropriate access privileges ( Role, Warehouse, Selected database and Schema) which has access to these views.

Create Application Code for Line Chart

We are using the Quasar Application Framework with vue.js.

So, before we begin to review the index.vue code make sure you have successfully installed the quasar Application Framework.

Please see the prerequisite for this lab

You will need to drop the quasar folder from the repository into your local quasar project folder

Now let’s take a look at the application we are going to build. In the image displayed below, you will see a dropdown selection box for the Geography which will pass the GeoRegionIdPth variable to the selection box, A slider bar to set the Time Period (start date, and end date) which will pass the Dateagi variable(s) to slider bar. The Refresh Button which will populate 3-line charts which represent the Poverty Threshold, Savings Rate and Avg Investment Rate relative to the Time Period and Geography selected. If a Geography is not selected, an error message will display in red, “You Must select a Geography”
img1

Using your favorite code editor, open the following file: /your project folder/src/pages/index.vue

## Create Index.vue

<template>
  <q-page>
    <q-form @submit="onSubmit" @reset="onReset" class="q-gutter-md">
      <q-card class="my-card">
        <div class="row">
          <div class="col-3">
            <q-card-section>
              <div class="text-h6">Please select a geography:</div>
              <q-select
                filled
                v-model="selectedCountry"
                :options="countryOptions"
                label="Geography"
                style="width: 300px"
              />
            </q-card-section>
          </div>
          <div class="col-3">
            <q-card-section>
              <div class="text-h6">Please select the period:</div>
              <q-range
                v-model="selectedPeriod"
                :min="2013"
                :max="2020"
                :step="1"
                style="width: 300px"
                label
              />
            </q-card-section>
          </div>
          <div class="self-center">
            <q-btn color="primary" label="refresh" @click="refreshGraph" />
          </div>
        </div>

        <q-card-section> </q-card-section>
      </q-card>
    </q-form><br/>
    <q-separator />
        <q-card class="my-card">
    <echarts :option="chartOptions" :height="400" :width="1200"></echarts>
        </q-card>
  </q-page>
</template>

<script>
import echarts from "src/components/echarts.vue";
export default {
  name: "PageIndex",
  components: { echarts },
  //Let's add the list of Geography codes to selecton filter....
  data() {
    return {
      countryOptions: [
        "AT",
        "BE",
        "CZ",
        "DE",
        "DK",
        "ES",
        "FI",
        "FR",
        "GB",
        "HR",
        "IE",
        "IT",
        "NL",
        "NO",
        "PL",
        "PT",
        "RO",
        "SE",
        "SI",
      ],
      selectedCountry: null,
      selectedPeriod: {
        min: 2013,
        max: 2020,
      },
      chartOptions: null,
    };
  },
  //Let's enforce selecton of Geography, and Start and End for time period...
  methods: {
    refreshGraph: function () {
      if (!this.selectedCountry) {
        this.$q.notify({
          type: "negative",
          message: `You must select a geography.`,
        });
        this.chartOptions = null;
        return;
      }

      if (!this.selectedPeriod.min || !this.selectedPeriod.max) {
        this.$q.notify({
          type: "negative",
          message: `You must select a period.`,
        });
        this.chartOptions = null;
        this.chartOptions = null;
        return;
      }
      //Here we GET the json data passed through the lambda function from the embeded SQL query from snowflake view through our API endpoint
      return this.$axios
        .get(
          "https://rkpnrd2qf1.execute-api.us-west-1.amazonaws.com/default/snowdemo?geo=" +
            this.selectedCountry +
            "&startYear=" +
            this.selectedPeriod.min +
            "&endYear=" +
            this.selectedPeriod.max
        )
        .then((response) => {
          console.log(response);

          let results = response.data;
          let VALUEPTHValues = [];
          let AVG_INVESTMENT_RATEValues = [];
          let AVG_SAVINGS_RATEValues =[]
          //Now lets push the variables from Snowflake View  to the chart Here...
          let xDates = [];
          results.map((item) => {
            VALUEPTHValues.push(item.VALUEPTH);
            AVG_INVESTMENT_RATEValues.push(item.AVG_INVESTMENT_RATE);
             AVG_SAVINGS_RATEValues.push(item.AVG_SAVINGS_RATE)
            xDates.push(item.DATEAGI);
          });

          //Now lets add the chart title  and assign the tool tip here.....
          this.chartOptions = {
            title: {
              text: "Credit Worthiness of Single Persons Relative to Poverty",
            },
            tooltip: {
              trigger: "axis",
            },
            legend: {
              data: ["VALUEPTH", "AVG_INVESTMENT_RATE"],
            },
            grid: {
              left: "3%",
              right: "4%",
              bottom: "3%",
              containLabel: true,
            },
            toolbox: {
              feature: {
                saveAsImage: {},
              },
            },
            xAxis: {
              type: "category",
              boundaryGap: false,
              data: xDates,
            },
            yAxis: {
              type: "value",
            },
            //Now lets pass the values to the line charts for all three values here....
            series: [
              {
                name: "POVERTY THRESHOLD",
                type: "line",

                data: VALUEPTHValues,
              },
              {
            name: 'SAVINGS RATE',
            type: 'line',
       data: AVG_SAVINGS_RATEValues
        },

              {
                name: "AVG INVESTMENT RATE",
                type: "line",

                data: AVG_INVESTMENT_RATEValues,
              },
            ],
          };
        });
    },
  },
};
</script>

  • Open the quasar.config.js with your editor and add the folowing code snipit if it is missing.

quasar.config.js

//Quasar plugins
      plugins: ['Notify']
    },
  • Now go to your browser and go to localhost:8080/#/
  • You should see a non-responsive application.
    img1

We will come back to this again in a later step. If you do not see the application from your local host, verify your installation and the download of repository folder/quasar.

Building the Lambda

Now let’s begin our work on in AWS to create a server-less environment to run our application. For the purpose of the lab, we will create the application and host it from your local host. So, let’s begin.

  • Open up your AWS Console. Let's go to services and then we want to go straight into the Lambda.
    img1
  • Select, Create a layer
    img1
  • And here we're going to name this: snowflake-connector

  • Go to your application project folder where you downloaded the project from GitHub and upload the snowflake-connector-python.zip file If you forgot to download the .zip file, follow the link below:

  • Under Runtimes, select Python 3.8

  • Select Create – It may take a while as the file it is uploading is quite large. See Below..
    img1
  • Once your Lambda layer is successfully created, you can move on to the next step.

  • At the top left menu select Lambda and Select Functions, then at the top right corner select create function

  • Select the tile “Author from Scratch” add the function name “VHOL” and using the “Runtime pull down, select “Python 3.8”

  • At bottom corner, select create function and wait until your function is created.
    img1
  • Under Environment, select lambda_Function.py.

  • Now select the default script and delete so you have a clear tab. Now using visual studio code open the file “lambda.py and paste into the lambda_function tab Download Lambda
    img1
  • Click on the “Test Tab”

  • Now using visual studio code, our your preferred code editor, open the file Download Lambda“lambda-Test-Script.gyp and past into the AWS configure test event and Give it an event name "Hello"

  • Select Create
    img1

Lambda.py Function

{
  "queryStringParameters": {
    "startYear": "2015",
    "endYear": "2020",
    "geo": "DK"
  }
}

10) Greetings and Save/ create 
11) Configuration – add trigger -API Trigger  Rest, Authorization, None 
12) Review the function

import json, decimal, datetime 
import snowflake.connector
from snowflake.connector import DictCursor
def default_json_transform(obj):
    if isinstance(obj, decimal.Decimal):
        return str(obj)
    if isinstance(obj, (datetime.date, datetime.datetime)):
        return obj.isoformat()
    raise TypeError
def lambda_handler(event, context):
    print('event:',json.dumps(event))
    #print('queryStringParameters:', json.dumps(event['queryStringParameters'])
    # 1. Test query string parameters
    # TODO implement
    #startY= event["startYear"]
    #endY= event["endYear"]
    #geo= event["geo"]
     # Lets Parse query string parameters
    startY= event["queryStringParameters"]["startYear"]
    endY= event["queryStringParameters"]["endYear"]
    geo= event["queryStringParameters"]["geo"]
  
    
    # Lets get connection going...
    ctx = snowflake.connector.connect(
        user='yournusername',
        account='sfsenorthamerica_youraccount',
        password='SnowGlowXXX',
        role='ACCOUNTADMIN',
        warehouse='SNOWBALL',
        database="TEMP",
        schema='PUBLIC')
        # set the cursor...
    cs = ctx.cursor(DictCursor)

    # Let's execute the query to snowflake.....
    cs.execute("select  ValuePth, DateAgi, Avg_Investment_Rate, Avg_Savings_Rate, GeoRegionIdPth from TEMP.public.VHOLAPP3 WHERE  hhtypNamePth = 'Single person' and GeoRegionIdPth='" + geo + "' AND DateAgi >=TO_DATE('" + startY + "-01-01','YYYY-DD-MM') AND DateAgi <= TO_DATE('"+endY +"-01-01','YYYY-DD-MM')") 
    
    # Here it goes to the Array.....
    dataArr= []
    # It dumps the string to Json....WHEW! Finish up done
    for rec in cs:
        dataArr.append(rec)
    json_formatted_str = json.dumps(dataArr, default=default_json_transform)
    cs.close()
    return {
        'statusCode': 200,
        'body': json_formatted_str,
        'headers': {
            'Content-Type': 'application/json',
            'Access-Control-Allow-Origin': '*'
            },
    }

Test Script using the AWS Lambda Test Tab

{
  "queryStringParameters": {
    "startYear": "2015",
    "endYear": "2020",
    "geo": "DK"
  }
}

  • Now go to the Configuration and select, then select general configuration and select the edit icon and increase the memory to 3032 and select “save”
    img1
  • Select +Add trigger and select API Gateway create and API, select REST and the security endpoint for this lab select “open” and finally select the Add button.
    img1
  • Select API Details and verify:
    img1
  • Click Deploy to Deploy the new code. Then select Test and it should be successful
    img1
  • Click on the Details of your created API Gateway and select the endpoint highlighted in blue. And replace it into your index.vue file
    img1

Now lets’ go back to your browser and go to localhost:8080/#/

  • Select geography and select the time period and select Refresh. Your application should now be connected to the service and should work.
    img1
    ❄️ Congratulations! This concludes our lab ❄️

Additional References

A fantastic reference for downloading the snowflake-python connector .zip file Getting your AWS Lambda Functions to work with Snowflake to see how to use markdown to generate these elements.

Conclusion

To learn more about Snowflake Marketplace visit the official website here: Snowflake Marketplace

To learn more about Building Data Applications visit the official website here: Building Data Applications

What we've covered

  • You were acquainted with Snowflake Marketplace
  • You became familiar with building an application using the Quasar Application Framework
  • We guided you through using the Snowflake Connector for Python via AWS Lambda
  • We created the API Gateway and tested the functionality of the application
Updated 2024-03-11

This content is provided as is, and is not maintained on an ongoing basis. It may be out of date with current Snowflake instances

\r\n\r\n```\r\n* Open the quasar.config.js with your editor and add the folowing code snipit if it is missing.\r\n\r\n### quasar.config.js\r\n```\r\n//Quasar plugins\r\n plugins: ['Notify']\r\n },\r\n```\r\n* Now go to your browser and go to localhost:8080/#/\r\n* You should see a non-responsive application.\r\n![img1](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/vhol-data-marketplace-app/vue1.png)\r\n\r\nWe will come back to this again in a later step. If you do not see the application from your local host, verify your installation and the download of repository folder/quasar.\r\n\r\n\r\n## Building the Lambda\r\n\r\n\r\nNow let’s begin our work on in AWS to create a server-less environment to run our application. For the purpose of the lab, we will create the application and host it from your local host. So, let’s begin.\r\n- [AWS] (https://aws.amazon.com/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=*all) Free trial Account ✅ Is Installed\r\n\r\n* Open up your AWS Console. Let's go to services and then we want to go straight into the Lambda.\r\n![img1](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/vhol-data-marketplace-app/lambda1.png)\r\n\r\n\r\n\r\n* Select, Create a layer\r\n![img1](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/vhol-data-marketplace-app/lambda2.png)\r\n\r\n* And here we're going to name this: **snowflake-connector**\r\n* Go to your application project folder where you downloaded the project from GitHub and upload the snowflake-connector-python.zip file **If you forgot to download the .zip file, follow the link below:** \r\n- [Download snowflake-connector-python.zip](https://github.com/Snowflake-Labs/sfguide-marketplace-data-app/releases/tag/v1)\r\n* Under Runtimes, select Python 3.8\r\n* Select Create – It may take a while as the file it is uploading is quite large. See Below..\r\n![img1](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/vhol-data-marketplace-app/lambda3.png)\r\n\r\n* Once your Lambda layer is successfully created, you can move on to the next step.\r\n* At the top left menu select Lambda and Select Functions, then at the top right corner select create function\r\n* Select the tile “Author from Scratch” add the function name “VHOL” and using the “Runtime pull down, select “Python 3.8”\r\n* At bottom corner, select create function and wait until your function is created.\r\n![img1](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/vhol-data-marketplace-app/lambda4.png)\r\n* Under Environment, select lambda_Function.py. \r\n* Now select the default script and delete so you have a clear tab. Now using visual studio code open the file “lambda.py and paste into the lambda_function tab\r\n[Download Lambda](https://github.com/Snowflake-Labs/sfguide-marketplace-data-app/tree/main/Lambda-src)\r\n![img1](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/vhol-data-marketplace-app/lambda5.png)\r\n* Click on the “Test Tab” \r\n* Now using visual studio code, our your preferred code editor, open the file [Download Lambda](https://github.com/Snowflake-Labs/sfguide-marketplace-data-app/tree/main/Lambda-src)“lambda-Test-Script.gyp and past into the AWS configure test event and Give it an event name \"Hello\"\r\n* Select Create\r\n![img1](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/vhol-data-marketplace-app/lambda6.png)\r\n\r\n\r\n### Lambda.py Function \r\n```javascript\r\n{\r\n \"queryStringParameters\": {\r\n \"startYear\": \"2015\",\r\n \"endYear\": \"2020\",\r\n \"geo\": \"DK\"\r\n }\r\n}\r\n\r\n10) Greetings and Save/ create \r\n11) Configuration – add trigger -API Trigger Rest, Authorization, None \r\n12) Review the function\r\n\r\nimport json, decimal, datetime \r\nimport snowflake.connector\r\nfrom snowflake.connector import DictCursor\r\ndef default_json_transform(obj):\r\n if isinstance(obj, decimal.Decimal):\r\n return str(obj)\r\n if isinstance(obj, (datetime.date, datetime.datetime)):\r\n return obj.isoformat()\r\n raise TypeError\r\ndef lambda_handler(event, context):\r\n print('event:',json.dumps(event))\r\n #print('queryStringParameters:', json.dumps(event['queryStringParameters'])\r\n # 1. Test query string parameters\r\n # TODO implement\r\n #startY= event[\"startYear\"]\r\n #endY= event[\"endYear\"]\r\n #geo= event[\"geo\"]\r\n # Lets Parse query string parameters\r\n startY= event[\"queryStringParameters\"][\"startYear\"]\r\n endY= event[\"queryStringParameters\"][\"endYear\"]\r\n geo= event[\"queryStringParameters\"][\"geo\"]\r\n \r\n \r\n # Lets get connection going...\r\n ctx = snowflake.connector.connect(\r\n user='yournusername',\r\n account='sfsenorthamerica_youraccount',\r\n password='SnowGlowXXX',\r\n role='ACCOUNTADMIN',\r\n warehouse='SNOWBALL',\r\n database=\"TEMP\",\r\n schema='PUBLIC')\r\n # set the cursor...\r\n cs = ctx.cursor(DictCursor)\r\n\r\n # Let's execute the query to snowflake.....\r\n cs.execute(\"select ValuePth, DateAgi, Avg_Investment_Rate, Avg_Savings_Rate, GeoRegionIdPth from TEMP.public.VHOLAPP3 WHERE hhtypNamePth = 'Single person' and GeoRegionIdPth='\" + geo + \"' AND DateAgi >=TO_DATE('\" + startY + \"-01-01','YYYY-DD-MM') AND DateAgi <= TO_DATE('\"+endY +\"-01-01','YYYY-DD-MM')\") \r\n \r\n # Here it goes to the Array.....\r\n dataArr= []\r\n # It dumps the string to Json....WHEW! Finish up done\r\n for rec in cs:\r\n dataArr.append(rec)\r\n json_formatted_str = json.dumps(dataArr, default=default_json_transform)\r\n cs.close()\r\n return {\r\n 'statusCode': 200,\r\n 'body': json_formatted_str,\r\n 'headers': {\r\n 'Content-Type': 'application/json',\r\n 'Access-Control-Allow-Origin': '*'\r\n },\r\n }\r\n\r\n```\r\n\r\n### Test Script using the AWS Lambda Test Tab\r\n```\r\n{\r\n \"queryStringParameters\": {\r\n \"startYear\": \"2015\",\r\n \"endYear\": \"2020\",\r\n \"geo\": \"DK\"\r\n }\r\n}\r\n\r\n```\r\n\r\n* Now go to the Configuration and select, then select general configuration and select the edit icon and increase the memory to 3032 and select “save”\r\n![img1](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/vhol-data-marketplace-app/lambda7.png)\r\n* Select +Add trigger and select API Gateway create and API, select REST and the security endpoint for this lab select “open” and finally select the Add button. \r\n![img1](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/vhol-data-marketplace-app/lambda8.png)\r\n* Select API Details and verify:\r\n![img1](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/vhol-data-marketplace-app/lambda9.png)\r\n* Click Deploy to Deploy the new code. Then select Test and it should be successful \r\n![img1](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/vhol-data-marketplace-app/lambda10.png)\r\n* Click on the Details of your created API Gateway and select the endpoint highlighted in blue. And replace it into your index.vue file \r\n![img1](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/vhol-data-marketplace-app/lambda12.png)\r\n\r\n**Now lets’ go back to your browser and go to localhost:8080/#/**\r\n* Select geography and select the time period and select Refresh. Your application should now be connected to the service and should work.\r\n![img1](https://www.snowflake.com/content/dam/snowflake-site/developers/guides/vhol-data-marketplace-app/vue-final.png)\r\n❄️ Congratulations! This concludes our lab ❄️\r\n\r\n\r\n## Additional References\r\n\r\nA fantastic reference for downloading the snowflake-python connector .zip file [Getting your AWS Lambda Functions to work with Snowflake](https://medium.com/snowflake/getting-your-aws-lambda-functions-to-work-with-snowflake-a14b453bb5ee) to see how to use markdown to generate these elements. \r\n\r\n\r\n\r\n## Conclusion\r\n\r\n\r\n\r\nTo learn more about Snowflake Marketplace visit the official website here: [Snowflake Marketplace](/data-marketplace/)\r\n\r\nTo learn more about Building Data Applications visit the official website here: [Building Data Applications](/workloads/data-applications/)\r\n\r\n\r\n\r\n### What we've covered\r\n- You were acquainted with Snowflake Marketplace\r\n- You became familiar with building an application using the Quasar Application Framework\r\n- We guided you through using the Snowflake Connector for Python via AWS Lambda\r\n- We created the API Gateway and tested the functionality of the application","multiValue":false,":type":"text/x-markdown"}},"model":"snowflake-site/models/quickstart-article"},"flexible_column_cont":{"id":"flexible-column-container-ae329e83d3","type":"2-column-75-25","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"none","bottomPadding":"none","spaceBetween":"none","reverseOnMobile":false,"carouselOnMobile":false,"backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-e389c2c6ae",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":itemsOrder":["quickstart_last_modi","text"],":items":{"quickstart_last_modi":{"id":"quickstart-last-modified-5a0b6fee95","icon":{"id":"icon","icon":"calendar",":type":"snowflake-site/components/icon","appliedCssClassNames":"snowflake-icon-blue"},"lastModifiedDatePrefix":"Updated","lastModifiedDate":"2024-03-11",":type":"snowflake-site/components/quickstart/quickstart-last-modified","appliedCssClassNames":"snowflake-responsive-component-top-padding-small"},"text":{"id":"text-bfa58f740a","additionalClasses":"qs-disclaimer-text","text":"

This content is provided as is, and is not maintained on an ongoing basis. It may be out of date with current Snowflake instances

\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"snowflake-responsive-component-top-padding-small"}}},"flexible_column_content_container_2":{"layout":"SIMPLE","id":"container-3acc420dd9",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":itemsOrder":[],":items":{}},":type":"snowflake-site/components/flexible-column-container"}}},"flexible_column_content_container_2":{"layout":"SIMPLE","id":"container-4901541e9d",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":itemsOrder":["quickstart_table_of_"],":items":{"quickstart_table_of_":{"layout":"SIMPLE","id":"container-ce3be83e9e",":type":"snowflake-site/components/quickstart/quickstart-table-of-content/quickstart-table-of-content-container",":itemsOrder":["quickstart_table_of_","quickstart_button"],":items":{"quickstart_table_of_":{"id":"quickstart-table-of-content-438405ae4b","headings":["

Overview

","

Prerequisites

","

What You’ll Learn About Snowflake Marketplace

","

What You’ll Learn About Building an Application

","

What You’ll Need

","

What You’ll Build

","

Working with Snowflake Marketplace

","

Create Snowflake Views

","

Create Application Code for Line Chart

","

quasar.config.js

","

Building the Lambda

","

Lambda.py Function

","

Test Script using the AWS Lambda Test Tab

","

Additional References

","

Conclusion

","

What we've covered

"],":type":"snowflake-site/components/quickstart/quickstart-table-of-content","fragmentPath":"/content/dam/snowflake-site/en/content-fragments/quickstarts/vhol-data-marketplace-app","tableOfContents":[{"headingText":"Overview","level":"h2","hierarchicalChildrenStructure":[{"headingText":"Prerequisites","level":"h3","hierarchicalChildrenStructure":[]},{"headingText":"What You’ll Learn About Snowflake Marketplace","level":"h3","hierarchicalChildrenStructure":[]},{"headingText":"What You’ll Learn About Building an Application","level":"h3","hierarchicalChildrenStructure":[]},{"headingText":"What You’ll Need","level":"h3","hierarchicalChildrenStructure":[]},{"headingText":"What You’ll Build","level":"h3","hierarchicalChildrenStructure":[]}]},{"headingText":"Working with Snowflake Marketplace","level":"h2","hierarchicalChildrenStructure":[]},{"headingText":"Create Snowflake Views","level":"h2","hierarchicalChildrenStructure":[]},{"headingText":"Create Application Code for Line Chart","level":"h2","hierarchicalChildrenStructure":[{"headingText":"quasar.config.js","level":"h3","hierarchicalChildrenStructure":[]}]},{"headingText":"Building the Lambda","level":"h2","hierarchicalChildrenStructure":[{"headingText":"Lambda.py Function","level":"h3","hierarchicalChildrenStructure":[]},{"headingText":"Test Script using the AWS Lambda Test Tab","level":"h3","hierarchicalChildrenStructure":[]}]},{"headingText":"Additional References","level":"h2","hierarchicalChildrenStructure":[]},{"headingText":"Conclusion","level":"h2","hierarchicalChildrenStructure":[{"headingText":"What we've covered","level":"h3","hierarchicalChildrenStructure":[]}]}]},"quickstart_button":{"id":"quickstart-button-8fc2d85c37",":type":"snowflake-site/components/quickstart/quickstart-button","fragmentPath":"/content/dam/snowflake-site/en/content-fragments/quickstarts/vhol-data-marketplace-app","appliedCssClassNames":"snowflake-responsive-component-top-padding-none"}}}}},":type":"snowflake-site/components/flexible-column-container"},"markup_editor":{"id":"markup-editor-91284cfe17","title":"Page CSS","cssContent":"#quickstart-template-main-flexible-container {\r\n padding: 24px;\r\n}\r\n#quickstart-template-main-flexible-container > .snowflake-flexible-column-container-items {\r\n grid-template-columns: 1fr 0fr;\r\n}\r\n\r\n.qs-disclaimer-text p > span {\r\n font-size: 15px !important;\r\n}\r\n\r\n@media (min-width: 768px) {\r\n #quickstart-template-main-flexible-container {\r\n padding: 24px 32px;\r\n }\r\n #quickstart-template-main-flexible-container > .snowflake-flexible-column-container-items {\r\n grid-template-columns: 7fr 3fr;\r\n gap: 48px;\r\n }\r\n}\r\n\r\n@media (max-width: 767px) {\r\n #quickstart-template-main-flexible-container > .snowflake-flexible-column-container-items {\r\n gap: 0px;\r\n }\r\n}\r\n\r\n@media (min-width: 1024px) {\r\n #quickstart-template-main-flexible-container {\r\n padding: 0 92px 48px 92px;\r\n }\r\n #quickstart-template-main-flexible-container > .snowflake-flexible-column-container-items {\r\n gap: 117px;\r\n }\r\n}",":type":"snowflake-site/components/markup-editor","isGSAPEnabled":false}},":type":"wcm/foundation/components/responsivegrid","id":"responsive-grid-main-content"},"modal_container":{"layout":"SIMPLE","id":"container-4f6adcb765",":type":"snowflake-site/components/modal/modal-container",":itemsOrder":[],":items":{}},"experiencefragment-footer":{"id":"experiencefragment-a4af68567b","configured":true,"localizedFragmentVariationPath":"/content/experience-fragments/snowflake-site/language-masters/en/site/footer/master/jcr:content",":type":"snowflake-site/components/experiencefragment",":itemsOrder":["root"],":items":{"root":{"additionalClasses":"sf-footer","layout":"SIMPLE","id":"container-1494143b75",":type":"snowflake-site/components/container",":itemsOrder":["container_copy","container_573483281_","markup_editor_copy"],":items":{"container_copy":{"additionalClasses":"sf-footer__inner","layout":"RESPONSIVE_GRID","columnCount":12,"columnClassNames":{"flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-1d105d4283",":type":"snowflake-site/components/container",":itemsOrder":["flexible_column_cont"],":items":{"flexible_column_cont":{"id":"flexible-column-container-0db386f91b","type":"1-column","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"medium","bottomPadding":"extra-small","spaceBetween":"small","reverseOnMobile":false,"carouselOnMobile":false,"propertiesCSSClasses":"sf-footer-grid","backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-0417125ded",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":itemsOrder":["container"],":items":{"container":{"additionalClasses":"sf-footer-grid__inner","layout":"RESPONSIVE_GRID","columnCount":12,"columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12","container_1622723482":"aem-GridColumn aem-GridColumn--default--12","container_copy_copy_":"aem-GridColumn aem-GridColumn--default--12","container_copy_copy":"aem-GridColumn aem-GridColumn--default--12","container_copy":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-0abe220d53",":type":"snowflake-site/components/container",":itemsOrder":["container_1622723482","container","container_copy_copy","container_copy","container_copy_copy_"],":items":{"container_1622723482":{"additionalClasses":"sf-footer__column","layout":"RESPONSIVE_GRID","columnCount":12,"columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-6715aba72c",":type":"snowflake-site/components/container",":itemsOrder":["container"],":items":{"container":{"additionalClasses":"sf-footer__newsletter-group","layout":"RESPONSIVE_GRID","columnCount":12,"columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12","marketo_v2":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-c46a94338f",":type":"snowflake-site/components/container",":itemsOrder":["text","marketo_v2"],":items":{"text":{"id":"text-91bfdad656","additionalClasses":"sf-footer__newsletter-title","text":"

Subscribe to our monthly newsletter

\r\n

Stay up to date on Snowflake’s latest products, expert insights and resources—right in your inbox!

\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-regular text-color-text-04"},"marketo_v2":{"id":"marketo-v2-a12671fd0c","marketoForm":{"script":null,"values":null,"hidden":null,"formId":"45871","edit":false,"successUrl":null},"munchkinId":"252-RFO-227","serverInstance":"252-RFO-227.mktoweb.com","marketoConfigured":true,"formConfigured":true,":type":"snowflake-site/components/form/marketo-v2"}},"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"}},"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"},"container":{"layout":"RESPONSIVE_GRID","columnCount":12,"columnClassNames":{"text_copy":"aem-GridColumn aem-GridColumn--default--12","text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-8c4afcc5b7",":type":"snowflake-site/components/container",":itemsOrder":["text","text_copy"],":items":{"text":{"id":"text-56d0f6ebc7","additionalClasses":"sf-footer__link-group","text":"\r\n\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"},"text_copy":{"id":"text-0805a2df62","additionalClasses":"sf-footer__link-group","text":"\r\n\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"}},"appliedCssClassNames":"snowflake-responsive-container-inner-padding-medium"},"container_copy_copy":{"layout":"RESPONSIVE_GRID","columnCount":12,"columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-ea801b91e6",":type":"snowflake-site/components/container",":itemsOrder":["text"],":items":{"text":{"id":"text-129381efc1","additionalClasses":"sf-footer__link-group","text":"\r\n\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"}},"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"},"container_copy":{"layout":"RESPONSIVE_GRID","columnCount":12,"columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-fd1ec460eb",":type":"snowflake-site/components/container",":itemsOrder":["text"],":items":{"text":{"id":"text-ea5b348b17","additionalClasses":"sf-footer__link-group","text":"\r\n\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"}},"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"},"container_copy_copy_":{"layout":"RESPONSIVE_GRID","columnCount":12,"columnClassNames":{"text":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-a1e2b7b168",":type":"snowflake-site/components/container",":itemsOrder":["text"],":items":{"text":{"id":"text-69e69f235e","additionalClasses":"sf-footer__link-group","text":"\r\n\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"}},"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"}},"appliedCssClassNames":"snowflake-responsive-container-inner-padding-small"}}},":type":"snowflake-site/components/flexible-column-container"}},"appliedCssClassNames":"snowflake-container snowflake-responsive-container-inner-padding-small"},"container_573483281_":{"additionalClasses":"sf-footer__bottom","layout":"RESPONSIVE_GRID","columnCount":12,"columnClassNames":{"container_112062425":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-e6b13c86e4",":type":"snowflake-site/components/container",":itemsOrder":["container_112062425"],":items":{"container_112062425":{"layout":"RESPONSIVE_GRID","columnCount":12,"columnClassNames":{"flexible_column_cont":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-1d6bc0a861",":type":"snowflake-site/components/container",":itemsOrder":["flexible_column_cont"],":items":{"flexible_column_cont":{"id":"flexible-column-container-16ff2f4956","type":"1-column","alignColumns":"top","containerMaxWidth":"extra-large","topPadding":"none","bottomPadding":"none","spaceBetween":"small","reverseOnMobile":false,"carouselOnMobile":false,"backgroundImageOption":"none","flexible_column_content_container_1":{"layout":"SIMPLE","id":"container-0fd93cbe8c",":type":"snowflake-site/components/flexible-column-container/flexible-column-content-container",":itemsOrder":["container"],":items":{"container":{"additionalClasses":"sf-footer__legal-container","layout":"RESPONSIVE_GRID","columnCount":12,"columnClassNames":{"container":"aem-GridColumn aem-GridColumn--default--12","text_copy_copy_16360":"aem-GridColumn aem-GridColumn--default--12","markup_editor":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-ea1d52331b",":type":"snowflake-site/components/container",":itemsOrder":["container","text_copy_copy_16360","markup_editor"],":items":{"container":{"layout":"RESPONSIVE_GRID","columnCount":12,"columnClassNames":{"image":"aem-GridColumn aem-GridColumn--default--12"},"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","id":"container-d6fd3a7d08",":type":"snowflake-site/components/container",":itemsOrder":["image"],":items":{"image":{"id":"image-b198e77428","additionalClasses":"sf-footer__logo","src":"https://www.snowflake.com/content/experience-fragments/snowflake-site/language-masters/en/site/footer/master/_jcr_content/root/container_573483281_/container_112062425/flexible_column_cont/flexible_column_content_container_1/container/container/image.coreimg.svg/1747882370694/nav-icon-snowflake-bug.svg","alt":"Snowflake logo","imageLink":{"valid":true,"url":"/en/"},"lazyEnabled":true,":type":"snowflake-site/components/image"}},"appliedCssClassNames":"snowflake-responsive-container-inner-padding-extra-small"},"text_copy_copy_16360":{"id":"text-163dfcb77a","additionalClasses":"sf-footer__legal-links","text":"\r\n","richText":true,":type":"snowflake-site/components/text","appliedCssClassNames":"text-size-small text-color-text-04"},"markup_editor":{"id":"markup-editor-463e6286e7","title":" ","htmlContent":"","cssContent":".sf-footer #ot-sdk-btn.ot-sdk-show-settings, .sf-footer #ot-sdk-btn.optanon-show-settings {\r\n color: rgba(255, 255, 255, 0.7) !important;\r\n text-underline-offset: 4px;\r\n border-top: none;\r\nborder-left: none;\r\nborder-right: none;\r\nborder-bottom: 1px dotted transparent;\r\n background-color: transparent !important;\r\n background-image: none !important;\r\n transition: 300ms ease text-decoration-color;\r\n padding: 0 !important;\r\n font-size: 12px;\r\n font-family: 'Lato', sans-serif;\r\n}\r\n.sf-footer #ot-sdk-btn.ot-sdk-show-settings:hover, .sf-footer #ot-sdk-btn.optanon-show-settings:hover {\r\n color: rgba(255, 255, 255, 1) !important;\r\nborder-bottom: 1px dotted var(--ui-01);\r\n transition: 300ms ease text-decoration-color;\r\n}\r\n.sf-footer__legal-container>.container>.cmp-container>.aem-container>div:last-child { flex-shrink: 0; }\r\n.sf-footer__disclaimers { background-color: #042130; }\r\n.sf-footer__disclaimers .snowflake-simple-stat-disclaimer p a { color: inherit; text-decoration: none !important; }\r\n.sf-footer__disclaimers .snowflake-simple-stat-disclaimer p sup { margin-right: 2px; }\r\n.sf-footer__disclaimers .snowflake-simple-stat-disclaimer p { text-indent: -5px; padding-left: 5px; }\r\n.sf-footer__disclaimers-inner { border-top: 1px solid rgba(255,255,255,0.25); padding: 40px 0; }\r\n.sf-footer__disclaimers .snowflake-simple-stat { align-items: flex-start; text-align: left; color: rgba(255,255,255,0.7); margin-bottom: 10px; }\r\n.sf-footer__social {\r\n display: flex;\r\n justify-content: center;\r\n gap: 12px;\r\n}\r\n.sf-footer .snowflake-footer-social-item {\r\n margin: 0 !important;\r\n}\r\n.sf-footer .snowflake-footer-social-item a {\r\n line-height: 0;\r\nbackground-color: rgba(3, 24, 35, 0.8);\r\n display: inline-block;\r\n width: 48px !important;\r\n height: 48px;\r\n border-radius: 8px;\r\n display: inline-flex;\r\n justify-content: center;\r\n align-items: center;\r\n \r\n transition: 300ms ease background-color;\r\n\r\n}\r\n.sf-footer .snowflake-footer-social-item a:hover {\r\n background-color: var(--ui-01) !important;\r\n transition: 300ms ease background-color;\r\n}\r\n\r\n.sf-footer__bottom {\r\n /* background-color: #031823; */\r\n /* padding-top: 40px; */\r\n padding-bottom: 40px;\r\n}\r\n\r\n.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoError .mktoErrorMsg {\r\n max-width: 100%;\r\n color: #fff;\r\n}\r\n\r\n.sf-footer .mktoForm .mktoError .mktoErrorMsg .mktoErrorDetail {\r\n display: inline-block;\r\n}\r\n\r\n.sf-footer .mktoFormRow:has(.mktoHtmlText:empty) {\r\n display: none;\r\n}\r\n\r\n.sf-footer .mktoFormRow .mktoHtmlText span {\r\n color: #fff !important;\r\n}\r\n\r\n/* ==========================================================================\r\n Footer Base Styles\r\n ========================================================================== */\r\n.sf-footer {\r\n background-color: #042130;\r\n}\r\n\r\n.sf-footer .optanon-toggle-display:hover { text-decoration-color: var(--ui-01) !important;\r\ncursor: pointer !important;\r\ntext-underline-offset: 4px;\r\ntext-decoration-style: dotted !important;\r\ntext-decoration-color: var(--ui-01);\r\ncolor: #fff !important;\r\n transition: 300ms ease text-decoration-color; text-decoration: underline; opacity: 1; }\r\n\r\n.sf-footer__logo {\r\n width: 40px;\r\n}\r\n\r\n.sf-footer-grid__inner>.container>.cmp-container>.aem-container {\r\n row-gap: 32px;\r\n}\r\n\r\n.sf-footer__legal-container>.container>.cmp-container>.aem-container {\r\n display: flex;\r\n justify-content: space-between;\r\n\r\n align-items: center;\r\n text-align: center;\r\n row-gap: 16px;\r\n}\r\n\r\n\r\n\r\n.sf-footer__legal-container>.container>.cmp-container>.aem-container>div:nth-child(2) {\r\n text-align: center;\r\n flex-grow: 1;\r\n}\r\n.sf-footer__legal-links li button,\r\n.sf-footer__legal-links li a,\r\n.sf-footer__legal-links li {\r\n margin: 0;\r\n color: rgba(255, 255, 255, 0.7) !important;\r\n font-weight: 500;\r\n}\r\n\r\n.sf-footer__legal-links li a:hover {\r\n color: rgba(255, 255, 255, 1) !important;\r\n}\r\n\r\n\r\n\r\n.sf-footer div.sf-footer__copyright p,\r\n.sf-footer div.sf-footer__legal-links li,\r\n.sf-footer div.sf-footer__legal-links a,\r\n.sf-footer div.sf-footer__legal-links p {\r\n font-size: 12px !important;\r\n}\r\n\r\n.sf-footer__legal-links ul {\r\n list-style-type: none;\r\n margin: 0;\r\n padding: 0;\r\n display: flex;\r\n gap: 20px;\r\n row-gap: 4px;\r\n\r\n justify-content: center;\r\n flex-wrap: wrap;\r\n text-align: center;\r\n}\r\n\r\n\r\n\r\n/* ==========================================================================\r\n Marketo Form Container\r\n ========================================================================== */\r\n.sf-footer .mktoFormRow:has(.mktoPlaceholder),\r\n.sf-footer .mktoFormRow:has(input[type=\"hidden\"]) {\r\n display: none !important;\r\n}\r\n\r\n\r\n\r\n.sf-footer .mktoFormCol {\r\n margin-bottom: 0 !important;\r\n}\r\n\r\n.sf-footer label[for=\"adhoc1\"] {\r\n width: auto !important;\r\n flex-grow: 1;\r\n margin-left: 16px;\r\n}\r\n\r\n.sf-footer .mktoFieldWrap:has(label[for=\"adhoc1\"]) {\r\n display: flex;\r\n flex-direction: row-reverse;\r\n margin-top: 22px;\r\n\r\n}\r\n\r\n.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoCheckboxList input[type=checkbox] {\r\n background-color: transparent !important;\r\n border: 1px solid rgba(255, 255, 255, 0.4) !important;\r\n border-radius: 4px !important;\r\n\r\n}\r\n\r\n.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoEmailField,\r\n.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoTelField,\r\n.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoTextField,\r\n.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap select {\r\n background-color: transparent !important;\r\n color: #fff !important;\r\n height: auto !important;\r\n border: 1px solid rgba(255, 255, 255, 0.4) !important;\r\n border-radius: 4px !important;\r\n padding: 12px 18px !important;\r\n}\r\n\r\n.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoEmailField:focus,\r\n.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoTelField:focus,\r\n.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoTextField:focus,\r\n.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap select:focus {\r\n border-color: var(--ui-01) !important;\r\n}\r\n\r\n.sf-footer .mktoForm * {\r\n padding: 0 !important;\r\n}\r\n\r\n.sf-footer .mktoForm,\r\n.sf-footer .snowflake-marketo-form-container {\r\n padding: 0 !important;\r\n background: transparent;\r\n margin-bottom: 0;\r\n box-shadow: none;\r\n}\r\n\r\n.sf-footer .mktoHtmlText.mktoHasWidth {\r\n width: 100% !important;\r\n margin: 24px 0;\r\n}\r\n\r\n.sf-footer .mktoFormRow {\r\n flex-direction: column;\r\n}\r\n\r\n.sf-footer .mktoForm .mktoButtonWrap {\r\n margin: 0 !important;\r\n}\r\n\r\n.sf-footer select {\r\n background-image: url(\"data:image/svg+xml,%3Csvg width='14' height='8' viewBox='0 0 14 8' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.981445 1.43496L6.90897 7.32496L12.9314 1.33496' stroke='white' stroke-width='1.33333' stroke-miterlimit='10' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\") !important;\r\n}\r\n\r\n.sf-footer .snowflake-marketo-form .mktoButtonWrap.mktoNative {\r\n justify-content: flex-start;\r\n}\r\n\r\n.sf-footer *::placeholder {\r\n color: #fff !important;\r\n opacity: 0.8;\r\n}\r\n\r\n.sf-footer .mktoForm .mktoButtonWrap.mktoSimple .mktoButton {\r\n background-color: var(--ui-01) !important;\r\n color: #fff !important;\r\n width: 100% !important;\r\n padding: 12px 16px !important;\r\n border: 1px solid var(--ui-01) !important;\r\n background-image: none !important;\r\n border-radius: 48px;\r\n text-transform: uppercase;\r\n font-weight: 800 !important;\r\n font-family: 'Texta', sans-serif !important;\r\n font-size: 16px !important;\r\n line-height: 1.2;\r\n}\r\n\r\n.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoHtmlText>span,\r\n.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap .mktoLabel>span,\r\n.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap label.mktoLabel {\r\n color: #fff !important;\r\n}\r\n\r\n.sf-footer__newsletter-title p:not(:first-child) {\r\n margin-top: 8px !important;\r\n}\r\n\r\n.sf-footer__newsletter-title p b {\r\n font-weight: 800 !important;\r\n font-family: 'Texta', sans-serif !important;\r\n font-size: 22px !important;\r\n line-height: 1.2;\r\n}\r\n\r\n.sf-footer__newsletter-title p:last-child {\r\n font-size: 14px !important;\r\n opacity: 0.8;\r\n}\r\n\r\n.sf-footer__link-group li a[target=\"_blank\"]::after {\r\n content: '';\r\n display: inline-block;\r\n width: 10px;\r\n height: 10px;\r\n margin-left: 5px;\r\n background-image: url(\"data:image/svg+xml,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.72222 1.22222C6.38471 1.22222 6.11111 0.948616 6.11111 0.611111C6.11111 0.273607 6.38471 0 6.72222 0H10.3889C10.551 0 10.7064 0.0643867 10.821 0.178988C10.9356 0.293596 11 0.449032 11 0.611111V4.27778C11 4.61529 10.7264 4.88889 10.3889 4.88889C10.0514 4.88889 9.77778 4.61529 9.77778 4.27778V2.08647L4.09879 7.76545C3.86013 8.00409 3.4732 8.00409 3.23454 7.76545C2.99589 7.52681 2.99589 7.13986 3.23454 6.90122L8.91355 1.22222H6.72222ZM0 2.44444C0 1.76943 0.547207 1.22222 1.22222 1.22222H4.27778C4.61529 1.22222 4.88889 1.49583 4.88889 1.83333C4.88889 2.17084 4.61529 2.44444 4.27778 2.44444H1.22222V9.77778H8.55556V6.72222C8.55556 6.38471 8.82915 6.11111 9.16667 6.11111C9.50418 6.11111 9.77778 6.38471 9.77778 6.72222V9.77778C9.77778 10.4528 9.23059 11 8.55556 11H1.22222C0.547207 11 0 10.4528 0 9.77778V2.44444Z' fill='white'/%3E%3C/svg%3E%0A\");\r\n background-size: contain;\r\n background-repeat: no-repeat;\r\n background-position: center;\r\n}\r\n\r\n/* ==========================================================================\r\n Link Group Styles\r\n ========================================================================== */\r\n/* Base Link Group */\r\n.sf-footer__link-group ul,\r\n.sf-footer__link-group li {\r\n margin: 0;\r\n padding: 0;\r\n list-style-type: none;\r\n}\r\n\r\n.sf-footer__link-group ul {\r\n margin-top: 20px !important;\r\n}\r\n\r\n.sf-footer__link-group li {\r\n margin-top: 15px;\r\n}\r\n\r\n/* Link Group Typography */\r\n.sf-footer div.sf-footer__link-group>span>p>a,\r\n.sf-footer div.sf-footer__link-group>span>p {\r\n color: var(--ui-01) !important;\r\n font-weight: 800 !important;\r\n font-family: 'Texta', sans-serif !important;\r\n font-size: 20px !important;\r\n line-height: 1.2;\r\n}\r\n\r\n.sf-footer__link-group li a {\r\n opacity: 0.9;\r\n color: #fff !important;\r\n font-weight: 500 !important;\r\n font-size: 15px !important;\r\n line-height: 1.3;\r\n}\r\n\r\n.sf-footer__link-group li a:hover {\r\n opacity: 1;\r\n}\r\n\r\n/* ==========================================================================\r\n Grid Layout\r\n ========================================================================== */\r\n.sf-footer-grid__inner>.container>.cmp-container>.aem-container::before,\r\n.sf-footer-grid__inner>.container>.cmp-container>.aem-container::after {\r\n display: none;\r\n}\r\n\r\n.sf-footer__column {\r\n flex-grow: 1;\r\n}\r\n\r\n.sf-footer-grid__inner>.container>.cmp-container>.aem-container>div:not(:first-child) {\r\n width: 50%;\r\n\r\n}\r\n\r\n\r\n/* ==========================================================================\r\n Responsive Styles\r\n ========================================================================== */\r\n/* Desktop Styles (992px and above) */\r\n\r\n@media (min-width: 800px) {\r\n.sf-footer__legal-links ul {\r\njustify-content: flex-start;\r\ntext-align: left; \r\n}\r\n.sf-footer__social { justify-content: flex-end; }\r\n.sf-footer__legal-links ul {\r\n padding-left: 24px;\r\n}\r\n .sf-footer__legal-container>.container>.cmp-container>.aem-container {\r\n text-align: right;\r\nflex-wrap: nowrap;\r\n }\r\n\r\n .sf-footer__legal-links.align-left ul {\r\n justify-content: flex-start;\r\n }\r\n\r\n\r\n .sf-footer-grid__inner>.container>.cmp-container>.aem-container {\r\n display: flex;\r\n justify-content: space-between;\r\n flex-direction: row;\r\n\r\n\r\n }\r\n\r\n .sf-footer-grid__inner>.container>.cmp-container>.aem-container>div {\r\n width: auto !important;\r\n max-width: 200px;\r\n }\r\n\r\n\r\n .sf-footer-grid__inner>.container>.cmp-container>.aem-container>div:first-child {\r\n flex-grow: 1;\r\n order: 2;\r\n width: 100% !important;\r\n max-width: none;\r\n }\r\n\r\n .sf-footer__legal-container>.container>.cmp-container>.aem-container>div {\r\n width: auto;\r\n\r\n }\r\n}\r\n\r\n@media screen and (min-width: 1380px) {\r\n .sf-footer-grid__inner>.container>.cmp-container>.aem-container {\r\n flex-wrap: nowrap;\r\n }\r\n\r\n .sf-footer-grid__inner>.container>.cmp-container>.aem-container>div:first-child {\r\n padding-right: 48px;\r\n max-width: 380px;\r\n background-color: rgba(3, 24, 35, 0.4);\r\n padding: 32px;\r\n margin-left: 48px;\r\n border-radius: 16px;\r\n \r\n }\r\n\r\n .sf-footer__link-group li,\r\n .sf-footer__link-group li a {\r\n font-size: 14px !important;\r\n line-height: 1.3;\r\n }\r\n}\r\n\r\n@media screen and (max-width: 991px) {\r\n\r\n /* .sf-footer__newsletter-group {\r\n background-color: #031823;\r\n \r\n } */\r\n\r\n /* Mobile Grid Layout */\r\n .sf-footer-grid__inner>.container>.cmp-container>.aem-container>div:first-child {\r\n order: 2;\r\n margin-top: 24px !important;\r\n }\r\n\r\n}\r\n\r\n@media screen and (max-width: 420px) {\r\n.is-reduced-mobile .heading-1-v2, .is-reduced-mobile .heading-1-v2-sm {\r\nfont-size: 32px;\r\nline-height: 28px;\r\n}\r\n}\r\n\r\n",":type":"snowflake-site/components/markup-editor","isGSAPEnabled":false}},"appliedCssClassNames":"snowflake-responsive-container-inner-padding-none"}}},":type":"snowflake-site/components/flexible-column-container"}},"appliedCssClassNames":"snowflake-container snowflake-responsive-container-inner-padding-small"}},"appliedCssClassNames":"snowflake-responsive-container-inner-padding-none"},"markup_editor_copy":{"id":"markup-editor-06b2e4ec50","title":"New css","cssContent":".centered .snowflake-logo-content-container-inner { justify-content: center; }\r\ndiv.snowflake-linklist-dropdown-menu { max-height: 380px; }\r\n.first-line-blue .snowflake-typographyv2 .snowflake-title-v2-line:first-child { color: var(--ui-01) !important; }\r\n.is-front { position: relative; z-index: 2; }\r\n.use-case-body .snowflake-text h1,\r\n.use-case-body .snowflake-text h2,\r\n.use-case-body .snowflake-text h3,\r\n.use-case-body .snowflake-text h4,\r\n.use-case-body .snowflake-text h5,\r\n.use-case-body .snowflake-text h6 {\r\nfont-family: 'Texta', sans-serif; \r\ncolor: #000;\r\nmargin: 0.25rem 0 0 0;\r\n}\r\n.pc-hero .button-group>.container>.cmp-container>.aem-container { justify-content: flex-start; }\r\n.sf-footer .mktoFormRow .mktoHtmlText span { font-family: 'Lato', sans-serif !important; }\r\n.snowflake-button-primary.snowflake-button-blue .snowflake-button-container { justify-content: center; }\r\n.related-chip-25 { background-color: #fff; border: 1px solid rgba(204,204,204,0.5); border-radius: 8px; padding: 20px; position: relative; }\r\n.related-chip-25:hover {\r\nbox-shadow: rgba(152, 162, 179, 0.1) 0px 10px 20px 0px;\r\n}\r\n.related-chip-25:hover::after {\r\nright: 24px;\r\ntransition: 300ms ease right;\r\n}\r\n.related-chip-25::after {\r\ncontent: '';\r\ndisplay: block;\r\ntransition: 300ms ease right;\r\nbackground-image: url(\"data:image/svg+xml,%3Csvg width='8' height='14' viewBox='0 0 8 14' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7.66699 7C7.66699 6.6571 7.53559 6.32825 7.30169 6.08578L2.34446 0.947072C1.84529 0.429617 1.0164 0.429617 0.517219 0.947072C0.0427878 1.43887 0.042788 2.21798 0.517219 2.70978L4.65591 7L0.51722 11.2902C0.0427889 11.782 0.0427887 12.5611 0.51722 13.0529C1.0164 13.5704 1.84529 13.5704 2.34447 13.0529L7.30169 7.91421C7.53559 7.67175 7.66699 7.34289 7.66699 7Z' fill='%2329B5E8'/%3E%3C/svg%3E%0A\");\r\nwidth: 8px;\r\nheight: 14px;\r\ndisplay: block;\r\nposition: absolute;\r\nright: 30px;\r\ntop: 50%;\r\ntransform: translateY(-50%);\r\nbackground-size: contain;\r\nbackground-position: center;\r\nbackground-repeat: no-repeat; \r\n}\r\n.related-chip-25 .heading-5-v2 { font-size: 22px; line-height: 1.4; }\r\n.related-chip-25 .snowflake-content-chip-image { width: 48px; }\r\n.related-chip-25 .snowflake-content-chip-image__image { aspect-ratio: 1; height: auto; object-fit: contain; }\r\n.related-chip-25 .snowflake-content-chip-button { display: none; }\r\n.related-chip-25:hover::after {\r\nright: 24px;\r\ntransition: 300ms ease right;\r\n}\r\n.related-chip-25 .snowflake-content-chip-content-without-tag { flex-grow: 1; padding-right: 24px; }\r\n.related-chip-25::after {\r\ncontent: '';\r\ndisplay: block;\r\ntransition: 300ms ease right;\r\nbackground-image: url(\"data:image/svg+xml,%3Csvg width='8' height='14' viewBox='0 0 8 14' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7.66699 7C7.66699 6.6571 7.53559 6.32825 7.30169 6.08578L2.34446 0.947072C1.84529 0.429617 1.0164 0.429617 0.517219 0.947072C0.0427878 1.43887 0.042788 2.21798 0.517219 2.70978L4.65591 7L0.51722 11.2902C0.0427889 11.782 0.0427887 12.5611 0.51722 13.0529C1.0164 13.5704 1.84529 13.5704 2.34447 13.0529L7.30169 7.91421C7.53559 7.67175 7.66699 7.34289 7.66699 7Z' fill='%2329B5E8'/%3E%3C/svg%3E%0A\");\r\nwidth: 8px;\r\nheight: 14px;\r\ndisplay: block;\r\nposition: absolute;\r\nright: 30px;\r\ntop: 50%;\r\ntransform: translateY(-50%);\r\nbackground-size: contain;\r\nbackground-position: center;\r\nbackground-repeat: no-repeat; \r\n}\r\n.related-chip-25 .heading-5-v2 { font-size: 22px; line-height: 1.1; }\r\n.related-chip-25 .snowflake-content-chip-image { width: 48px; flex-shrink: 0; }\r\n.related-chip-25 .snowflake-content-chip-image__image { aspect-ratio: 1; height: auto; object-fit: contain; }\r\n.related-chip-25 .snowflake-content-chip-button { display: none; }\r\n.case-study-25.small-logo .snowflake-case-study-card-logo img {\r\n width: 60px !important;\r\n}\r\n\r\n.swiper-slide .case-study-25 { width: 95%; margin-left: auto; margin-right: auto; }\r\n\r\n.case-study-25 .snowflake-case-study-card-logo img {\r\n width: 140px !important;\r\n height: auto !important;\r\n transform: none !important;\r\n margin: 24px 0 8px 0;\r\n}\r\n\r\n.case-study-25 .snowflake-case-study-card-image__image {\r\n object-position: left center;\r\n \r\n\r\n}\r\n\r\n.case-study-25 .snowflake-case-study-card-information-container {\r\n padding-right: 24px;\r\n}\r\n\r\n.case-study-25 ul {\r\n list-style-type: none;\r\n padding: 0;\r\n margin: 8px 0 0 0;\r\n}\r\n\r\n.case-study-25 li {\r\n font-size: 15px !important;\r\n line-height: 1.3 !important;\r\n display: flex;\r\n flex-direction: column;\r\n border-left: 4px solid var(--ui-01);\r\n padding-left: 24px;\r\n margin-top: 24px;\r\n color: #535862;\r\n gap: 4px;\r\n}\r\n\r\n.case-study-25 li b {\r\n display: block;\r\n font-family: 'Texta', sans-serif;\r\n font-weight: 900 !important;\r\n font-size: 48px !important;\r\n line-height: 0.9 !important;\r\n color: var(--ui-01);\r\n}\r\n\r\n.case-study-25 .snowflake-case-study-card-description p {\r\n color: #535862;\r\n}\r\n\r\n.case-study-25 .snowflake-case-study-card-description p:nth-child(2):not(:has(a)) {\r\n color: #000;\r\n font-family: Texta;\r\n font-size: 30px !important;\r\n line-height: 1 !important;\r\n font-style: normal;\r\n font-weight: 700;\r\n text-indent: -8px;\r\n}\r\n\r\n.case-study-25.is-story .snowflake-case-study-card-description p:nth-child(2):not(:has(a)) {\r\n text-indent: 0;\r\n}\r\n\r\n.case-study-25 .snowflake-case-study-card-key-card {\r\n background-color: transparent;\r\n}\r\n\r\n.case-study-25 .snowflake-case-study-card-button {\r\n display: none;\r\n}\r\n\r\n.case-study-25 {\r\n border-radius: 24px;\r\n overflow: hidden;\r\n}\r\n@media screen and (min-width: 1024px) {\r\n\r\n\r\n\r\n .case-study-25 .snowflake-case-study-card-left-container {\r\n position: static;\r\n width: 60%;\r\n min-height: 0;\r\n }\r\n\r\n .case-study-25 .snowflake-case-study-card-right-container::after {\r\n content: '';\r\n display: block;\r\n width: 60%;\r\nmax-width: 340px;\r\n padding-bottom: 50%;\r\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 22 16' class='snowflake-pushdown-banner-placeholder-arrow'%3E%3Cpath fill='%2329B5E8' fill-rule='evenodd' d='M17.865 8.756c.088-.274.124-.555.118-.834a2.551 2.551 0 0 0-1.3-2.142L7.887.76C6.645.055 5.063.475 4.35 1.7a2.535 2.535 0 0 0 .947 3.494l4.916 2.809-4.916 2.801a2.543 2.543 0 0 0-.947 3.502c.713 1.222 2.295 1.64 3.537.934l8.796-5.024a2.541 2.541 0 0 0 1.182-1.46Z' clip-rule='evenodd'%3E%3C/path%3E%3C/svg%3E\");\r\n background-size: contain;\r\n background-repeat: no-repeat;\r\n position: absolute;\r\n top: -10%;\r\n left: -20%;\r\n }\r\n\r\n .case-study-25 .snowflake-case-study-card-right-container {\r\n max-width: none;\r\n width: 40%;\r\n position: absolute;\r\n top: -5%;\r\n right: -5%;\r\n z-index: 0;\r\n height: 110%;\r\n }\r\n\r\n\r\n}\r\n\r\n/* Media Queries */\r\n@media screen and (min-width: 768px) {\r\n .case-study-25 li {\r\n max-width: 50%;\r\n }\r\n .case-study-25 ul {\r\n\r\n display: flex;\r\n gap: 48px;\r\n }\r\n}\r\n.snowflake-text.section-eyebrow p {\r\nmargin-left: auto;\r\nmargin-right: auto;\r\nmargin-bottom: 16px !important; \r\n}\r\n.snowflake-text.section-eyebrow p,\r\n.snowflake-text.eyebrow-text p {\r\n text-transform: uppercase;\r\n font-family: 'Texta', sans-serif !important;\r\n font-weight: 800 !important;\r\n letter-spacing: .025em;\r\nmargin-bottom: 12px;\r\nline-height: 1.1 !important;\r\n\r\n}\r\n.snowflake-title-v2.dynamic .heading-2-v2 span.snowflake-title-v2-line {\r\n font-size: clamp(2.5rem, 4.5vw, 4rem) !important;\r\n line-height: 0.82 !important;\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n.checklist ul {\r\n padding: 0;\r\n margin: 0;\r\n}\r\n\r\n.checklist ul li {\r\n list-style-type: none;\r\n padding-left: 32px;\r\n position: relative;\r\n}\r\n\r\n.checklist ul li:not(:last-child) {\r\n margin-bottom: 1em;\r\n}\r\n\r\n.checklist ul li::before {\r\n content: '';\r\n display: inline-block;\r\n width: 20px;\r\n height: 20px;\r\n background-image: url(\"data:image/svg+xml,%3Csvg width='24' height='25' viewBox='0 0 24 25' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect y='0.985352' width='24' height='24' rx='12' fill='%23D4F0FA'/%3E%3Cpath d='M7.28613 13.2967L10.7147 16.7253L17.5718 9.86816' stroke='%2329B5E8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\r\n background-size: contain;\r\n background-repeat: no-repeat;\r\n position: absolute;\r\n top: 3px;\r\n left: 0;\r\n}\r\n\r\n.last-line-blue .snowflake-typographyv2 .snowflake-title-v2-line:last-child {\r\n color: var(--ui-01);\r\n}\r\n\r\n.snowflake-text p sup {\r\n line-height: 0;\r\n}\r\n\r\n.snowflake-title-v2.lowercase .heading-3-v2 {\r\n font-size: 28px;\r\n line-height: 1;\r\n text-transform: none;\r\n font-weight: 700;\r\n}\r\n\r\n.snowflake-title-v2.lowercase .heading-2-v2 {\r\n font-size: 32px;\r\n line-height: 1;\r\n text-transform: none;\r\n font-weight: 700;\r\n}\r\n\r\n\r\n\r\n.content-chip-new {\r\n border: 1px solid rgba(204, 204, 204, 0.5);\r\n border-radius: 16px;\r\n overflow: hidden;\r\n}\r\n\r\n.content-chip-new .snowflake-image-container {\r\n border-radius: 0;\r\ndisplay: none;\r\n}\r\n\r\n.content-chip-new .snowflake-content-chip-image {\r\n margin-right: 0;\r\n max-width: 180px;\r\n flex-shrink: 0;\r\n}\r\n\r\n.content-chip-new .snowflake-content-chip-content {\r\n padding: 24px;\r\n}\r\n\r\n.content-chip-new .black-blue-text-color .snowflake-title-v2-line:first-child {\r\n font-size: 24px;\r\n line-height: 1.1;\r\n}\r\n\r\n.content-chip-new .black-blue-text-color .snowflake-title-v2-line:not(:first-child) {\r\n font-family: 'Lato', sans-serif;\r\n font-size: 17px;\r\n color: #535862 !important;\r\n font-weight: 500;\r\n line-height: 1.45;\r\n margin-top: 8px;\r\n display: none;\r\n}\r\n\r\ndiv.snowflake-text a {\r\n font-weight: normal;\r\n color: var(--ui-01);\r\n text-decoration: underline;\r\n text-underline-offset: 4px;\r\n text-decoration-style: dotted !important;\r\n text-decoration-color: transparent;\r\n transition: 300ms ease text-decoration-color;\r\n}\r\n\r\ndiv.snowflake-text a:hover {\r\n text-decoration-color: var(--ui-01);\r\n transition: 300ms ease text-decoration-color;\r\n}\r\n\r\n/* Subnav Styles */\r\n.footer-nav__link-group .snowflake-button-container,\r\n.subnav__item--button,\r\n.snowflake-card-v2-advanced-button .snowflake-button-container {\r\n justify-content: flex-start;\r\n}\r\n\r\n\r\n/* Button Styles */\r\n.button-container>.container>.cmp-container>.aem-container {\r\n align-items: center;\r\n}\r\n\r\n.button-container>.container>.cmp-container>.aem-container .snowflake-button-primary+.snowflake-button-link {\r\n margin-left: 12px !important;\r\n}\r\n\r\n.snowflake-button-regular.snowflake-button-link .snowflake-button-container {\r\n font-size: 18px !important;\r\n text-align: left;\r\n justify-content: flex-start;\r\n line-height: 1.4 !important;\r\n}\r\n\r\n/* Card Styles */\r\nbody .snowflake-card-v2-advanced {\r\n border: 1px solid rgba(204, 204, 204, 0.5);\r\n border-radius: var(--spacing-02);\r\ntransition: 300ms ease all;\r\n}\r\n\r\nbody .snowflake-card-v2-advanced:hover {\r\ntransform: translateY(-10px);\r\n box-shadow: rgba(152, 162, 179, 0.1) 0px 10px 20px 0px;\r\ntransition: 300ms ease all;\r\n}\r\n\r\nbody .snowflake-card-v2-advanced-inner {\r\n border-bottom: none;\r\n}\r\n\r\n/* Card Image Styles */\r\nbody .snowflake-card-v2-advanced-image {\r\n line-height: 0;\r\n}\r\n\r\nbody .snowflake-card-v2-advanced-image__image {\r\n aspect-ratio: 16 / 9;\r\n}\r\n\r\n/* Card Content Styles */\r\nbody .snowflake-card-v2-advanced-content {\r\n position: relative;\r\n}\r\n\r\nbody .snowflake-card-v2-advanced-content::after {\r\n content: '';\r\n display: block;\r\n position: absolute;\r\n bottom: 0;\r\n left: 0;\r\n transition: 300ms ease all;\r\n width: 20%;\r\n height: 4px;\r\n background-color: var(--ui-01);\r\n opacity: 0;\r\n}\r\n\r\nbody .snowflake-card-v2-advanced:hover .snowflake-card-v2-advanced-content::after {\r\n width: 100%;\r\n opacity: 1;\r\n transition: 300ms ease all;\r\n}\r\n\r\n/* Card Button Hover Effects */\r\nbody .snowflake-card-v2-advanced .snowflake-button-link.snowflake-button-blue .snowflake-button-container>.link-icon {\r\n transition: 300ms ease transform;\r\n}\r\n\r\nbody .snowflake-card-v2-advanced:hover .snowflake-button-link.snowflake-button-blue .snowflake-button-container>.link-icon {\r\n transform: translateX(4px);\r\n transition: 300ms ease transform;\r\n}\r\n\r\n/* Column Layout Styles */\r\n.six-columns>.container>.cmp-container>.aem-container,\r\n.three-columns>.container>.cmp-container>.aem-container,\r\n.four-columns>.container>.cmp-container>.aem-container,\r\n.five-columns>.container>.cmp-container>.aem-container {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 24px;\r\n}\r\n\r\n.six-columns.align-center>.container>.cmp-container>.aem-container,\r\n.three-columns.align-center>.container>.cmp-container>.aem-container,\r\n.four-columns.align-center>.container>.cmp-container>.aem-container,\r\n.five-columns.align-center>.container>.cmp-container>.aem-container {\r\n justify-content: center;\r\n}\r\n\r\n.three-columns>.container>.cmp-container>.aem-container>div {\r\n width: 100%;\r\n margin: 0 !important;\r\n}\r\n\r\n.six-columns>.container>.cmp-container>.aem-container>div,\r\n.four-columns>.container>.cmp-container>.aem-container>div,\r\n.five-columns>.container>.cmp-container>.aem-container>div {\r\n width: calc(50% - 12px);\r\n margin: 0 !important;\r\n}\r\n\r\n/* Media Queries */\r\n@media screen and (min-width: 768px) {\r\n .three-columns>.container>.cmp-container>.aem-container>div {\r\n width: calc(50% - 12px);\r\n }\r\n\r\n .six-columns>.container>.cmp-container>.aem-container>div,\r\n .four-columns>.container>.cmp-container>.aem-container>div,\r\n .five-columns>.container>.cmp-container>.aem-container>div {\r\n width: calc(33.333% - 16px);\r\n }\r\n\r\n}\r\n\r\n@media screen and (min-width: 1024px) {\r\n .snowflake-title-v2.lowercase .heading-3-v2 {\r\n font-size: 34px;\r\n }\r\n .snowflake-title-v2.lowercase.larger .heading-2-v2 {\r\n font-size: 44px;\r\nline-height: 0.95;\r\n }\r\n\r\n\r\n .three-columns>.container>.cmp-container>.aem-container>div {\r\n width: calc(33.333% - 16px);\r\n }\r\n\r\n .four-columns>.container>.cmp-container>.aem-container>div {\r\n width: calc(25% - 18px);\r\n }\r\n\r\n .five-columns>.container>.cmp-container>.aem-container>div {\r\n width: calc(20% - 19.2px);\r\n }\r\n\r\n .six-columns>.container>.cmp-container>.aem-container>div {\r\n width: calc(16.6666% - 20px);\r\n }\r\n\r\n .snowflake-title-v2.lowercase .heading-3-v2 {\r\n font-size: 28px !important;\r\n }\r\n\r\n\r\n\r\n\r\n}\r\n\r\n@media screen and (min-width: 1200px) {\r\n .snowflake-title-v2.lowercase .heading-2-v2 {\r\n font-size: 40px;\r\n }\r\n.content-chip-new .snowflake-content-chip-content {\r\n padding: 32px;\r\n}\r\n.content-chip-new .snowflake-image-container,\r\n .content-chip-new .black-blue-text-color .snowflake-title-v2-line:not(:first-child) {\r\n display: block;\r\n }\r\n}\r\n\r\n\r\n.promo-banner-25 {\r\n border-radius: 16px;\r\n overflow: hidden;\r\n}\r\n\r\n.promo-banner-25 .snowflake-premium-content-banner-image-container {\r\n position: relative;\r\n max-width: 380px;\r\n}\r\n\r\n.promo-banner-25 .snowflake-text {\r\n color: #535862;\r\n}\r\n\r\n.promo-banner-25 .snowflake-premium-content-banner-image__image {\r\n transform: translateY(8px);\r\n transition: 300ms ease transform;\r\n border-radius: 0;\r\n width: 85%;\r\n margin: 0 auto;\r\n display: block;\r\n position: relative;\r\n z-index: 1;\r\n}\r\n\r\n.promo-banner-25 .snowflake-premium-content-banner-image__link:hover .snowflake-premium-content-banner-image__image {\r\n transform: translateY(0);\r\n transition: 300ms ease transform;\r\n}\r\n\r\n.promo-banner-25 .snowflake-premium-content-banner-image__inner {\r\n height: auto;\r\n padding-top: 24px;\r\n}\r\n\r\n.promo-banner-25 .snowflake-premium-content-banner-image__link {\r\n position: relative;\r\n z-index: 1;\r\n height: auto;\r\n}\r\n\r\n.promo-banner-25 .snowflake-premium-content-banner-image__link::after {\r\n content: '';\r\n display: block;\r\n position: absolute;\r\n clip-path: polygon(0 0, 66% 0, 100% 100%, 0% 100%);\r\n bottom: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: var(--ui-01);\r\n transition: 300ms ease width;\r\n}\r\n\r\n.promo-banner-25 .snowflake-premium-content-banner-image__link:hover::after {\r\n width: 110%;\r\n transition: 300ms ease width;\r\n}\r\n.sf-footer .snowflake-marketo-form .mktoFormRow .mktoFieldWrap select {\r\nbackground-position: 95% 50%; \r\n}\r\n.sf-footer__disclaimers .text-size-small .snowflake-text p {\r\n color: #fff !important;\r\n font-size: 10px !important;\r\n opacity: 0.8;\r\n}\r\n\r\n@media screen and (min-width: 768px) {\r\n .sf-footer__disclaimers .text-size-small .snowflake-text p {\r\n font-size: 12px !important;\r\n }\r\n\r\n}\r\n@media screen and (max-width: 1023px) {\r\n.mobile-top-padding { padding-top: 64px; }\r\n}\r\n@media (max-width: 799px) {\r\n.sf-footer .snowflake-marketo-form .mktoButtonWrap.mktoNative .mktoButton { width: 100% !important; }\r\n.sf-footer__logo {\r\ntext-align: center;\r\n display: block;\r\n margin: 0 auto;\r\n}\r\n}\r\n\r\n.customer-card .snowflake-card-v2-advanced-image {\r\naspect-ratio: 4.35 / 1;\r\n}\r\n.customer-card .snowflake-card-v2-advanced-image__image {\r\n width: 100%;\r\nheight: 100%;\r\npadding-left: 8px;\r\n object-fit: contain;\r\n\r\n\r\nobject-position: left center;\r\n margin: 0 !important;\r\naspect-ratio: initial; \r\n}\r\n\r\n.customer-card .snowflake-card-v2-advanced-image__inner { height: 110px; }\r\n\r\n\r\n.customer-card .snowflake-card-v2-advanced-tag-indicator {\r\n display: none;\r\n}\r\n.pc-hero .snowflake-container-arrow-small-gray-image { top: -34% !important; width: 18% !important; }\r\n.pc-hero .snowflake-container-arrow-small-gray-image path {\r\n fill: var(--ui-01);\r\n opacity: 1;\r\n}\r\n\r\n@media screen and (max-width: 767px) {\r\n.mobile-padding-top { padding-top: 64px; }\r\n.hide-mobile { display: none !important; }\r\n.pc-hero { padding-top: 52px; }\r\n.pc-hero .snowflake-text p,\r\n.pc-hero .left-alignment .snowflake-title-v2-line,\r\n.pc-hero h1 span { text-align: center !important; }\r\n}\r\ndiv.snowflake-pushdown-banner-button { margin-top: 0; }",":type":"snowflake-site/components/markup-editor","isGSAPEnabled":false}}}},"classNames":"aem-xf"},"markup_editor":{"id":"markup-editor-cb4ea07356","title":"Quickstarts Overrides","cssContent":".snowflake-markdown blockquote {\r\n padding: 24px 32px;\r\n background: #F6F9FA;\r\n border: 1px solid #29B5E8;\r\n border-radius: 16px;\r\n}\r\n\r\n.snowflake-markdown .snowflake-image-container img {\r\n width: auto !important;\r\n max-width: 100%; \r\n}\r\n\r\n.snowflake-markdown .snowflake-text ol {\r\n padding-left: 20px !important;\r\n}\r\n\r\n.snowflake-markdown .snowflake-text li {\r\n margin: 0 0 12px 0 !important;\r\n}\r\n\r\n.snowflake-markdown h3.snowflake-markdown-h3 {\r\n font-size: 20px !important;\r\n font-family: Texta, sans-serif !important;\r\n}\r\n\r\n@media (min-width: 768px) {\r\n .snowflake-markdown h3.snowflake-markdown-h3 {\r\n font-size: 28px !important;\r\n }\r\n}",":type":"snowflake-site/components/markup-editor","isGSAPEnabled":false}},":type":"wcm/foundation/components/responsivegrid"}},"isPasswordProtected":false,":hierarchyType":"page",":path":"/content/snowflake-site/global/en/developers/guides/vhol-data-marketplace-app","analyticsEnabled":true,"analyticsDebugMode":false,"analyticsContentTags":["snowflake-site:taxonomy/solution-center/certification/quickstart","snowflake-site:taxonomy/product/applications-and-collaboration","snowflake-site:taxonomy/snowflake-feature/marketplace-and-integrations","snowflake-site:taxonomy/exclude-tags/hidden"],"analyticsData":{"excludeFromAnalytics":false,"subCategory":"","pageType":"quickstart-page-template","templateName":"quickstart-page-template","siteName":"snowflake","pageUrl":"/content/snowflake-site/global/en/developers/guides/vhol-data-marketplace-app","language":"en","category":"general","pageName":"Building an application on Snowflake with data from Snowflake Marketplace","contentTags":["snowflake-site:taxonomy/solution-center/certification/quickstart","snowflake-site:taxonomy/product/applications-and-collaboration","snowflake-site:taxonomy/snowflake-feature/marketplace-and-integrations","snowflake-site:taxonomy/exclude-tags/hidden"]}}},"isPasswordProtected":false,":hierarchyType":"page",":path":"/content/snowflake-site/global","analyticsEnabled":true,"analyticsDebugMode":false,"analyticsContentTags":[],"analyticsData":{"excludeFromAnalytics":false,"subCategory":"","pageType":"root-page-template","templateName":"root-page-template","siteName":"snowflake","pageUrl":"/content/snowflake-site/global","language":"en","category":"general","pageName":"Global","contentTags":[]}},"rootModelUrl":"/content/snowflake-site/global","pagePath":"/content/snowflake-site/global/en/developers/guides/vhol-data-marketplace-app","initialLanguage":"en","initialTranslations":{"en":{"translation":{"languages":"Languages","language":"Language","show_more":"Show More","show_less":"Show Less","newsletter_sign_up":"Sign Up for Our Newsletter","rewatch_video":"Rewatch Video","cookie_settings":"Cookie settings","home_page":"Home page","open_pdf":"Open PDF","read_now":"Read Now","watch_video":"Watch Video","open":"Open","filter":"Filter","show_results":"Show Results","reset_filters":"Reset Filters","results_with_count":"{{count}} Result","results_with_count_one":"{{count}} Result","results_with_count_other":"{{count}} Results","please_enter_at_least_chars":"Please enter at least {{value}} characters","max_allowed_chars":"The maximum number of allowed characters is {{value}}","special_chars_error":"The search term must contain only valid characters","sort_by":"Sort by:","newest":"Newest","oldest":"Oldest","next":"Next","prev":"Previous","search_sorry_match":"Sorry! We couldn’t find a matching search.","search_try_adjust":"Try adjusting your search by changing keywords or removing filters.","results_filtered_by_with_count":"{{count}} Result filtered by","results_filtered_by_with_count_one":"{{count}} Result filtered by","results_filtered_by_with_count_other":"{{count}} Results filtered by","search_field":"Search field","close_filter":"Close filter","other_content_in_this_stream":"Other Content in this Stream","view":"View","grid_view":"Grid view","list_view":"List view","industry":"Industry","location":"Location","product_cat_used":"Snowflake Product Categories Used","learn_more":"Learn More","read_more":"Read More","view_more":"View more","view_less":"View less","register_now":"Register Now","watch_now":"Watch Now","listen_now":"Listen Now","platform":"Platform","region":"Region","select_platform":"Select a platform","select_region":"Select a region","modal_window_collapsed_message":"The modal window (ID: {{id}}) is currently collapsed in the editor view. To reveal it, please ensure that the 'Collapse modal in AEM Editor' option is unchecked.","newest_oldest":"Newest - Oldest","oldest_newest":"Oldest - Newest","a_z":"A - Z","z_a":"Z - A","nearest":"Nearest","farthest":"Farthest","iframe_validation":"Code snippet should start and end with iframe tags.","min_read_with_count":"{{count}} min read","authors":"Authors","authors_one":"Author","authors_other":"Authors","back":"Back","just_for_you":"Just For You","share_article":"Share Article","related_content":"Related Content","top_voices":"Top Voices","solution_areas":"Solution Areas","workload_specializations":"Workload Specializations","snowpro_core_certications_with_count":"Snowpro Core Certifications: {{count}}","snowpro_core_certications_with_count_one":"Snowpro Core Certification: {{count}}","snowpro_core_certications_with_count_other":"Snowpro Core Certifications: {{count}}","snowpro_advanced_certications_with_count":"Snowpro Advanced Certifications: {{count}}","snowpro_advanced_certications_with_count_one":"Snowpro Advanced Certification: {{count}}","snowpro_advanced_certications_with_count_other":"Snowpro Advanced Certifications: {{count}}","headquarters_with_value":"<0>Headquarters: {{value}}","skip_to_content":"Skip to content","version":"Version","file_name":"File Name","architecture":"Architecture","size":"Size","release_date":"Release Date","sha256_checksum":"SHA256 Checksum","client":"Client","download":"Download","documentation":"Documentation","plus_more":"+More","months_shorthand":{"jan":"jan","feb":"feb","mar":"mar","apr":"apr","may":"may","jun":"jun","jul":"jul","aug":"aug","sep":"sep","oct":"oct","nov":"nov","dec":"dec"},"share":"Share","share_event":"Share Event","twitter":"X","email":"Email","facebook":"Facebook","linkedin":"LinkedIn","password":"Password","password_error":"Incorrect password entered. Please try again.","password_enter":"Enter password to continue","password_content_protected":"This content is password protected. To access, please enter the password into the field below:","need_help":"Need help?","contact_representative":"Contact your Snowflake Account Representative","view_quickstart":"View Quickstart","fork_repo":"Fork Repo","watch_the_demo":"Watch the Demo ({{value}})","by":"By","published_with_date":"Published: {{val, shortDate(datetime)}}","updated_with_date":"Updated: {{val, shortDate(datetime)}}","watch_the_demo_modal_msg":"Please configure a modal for this button. \nModalId: {{modalId}} \nYoutube video ID: {{videoId}}","short_date":"{{val, shortDate(datetime)}}","narrow_date":"{{val, narrowDate(datetime)}}","search_by_address":"Search by an address, city, neighborhood or state","mapbox_address_sr_instructions_with_count":"Type at least {{count}} characters to search. Use arrow keys to navigate results. Press Enter to select. Press Escape to close.","mapbox_address_sr_instructions_with_count_one":"Type at least {{count}} character to search. Use arrow keys to navigate results. Press Enter to select. Press Escape to close.","mapbox_address_sr_instructions_with_count_other":"Type at least {{count}} characters to search. Use arrow keys to navigate results. Press Enter to select. Press Escape to close.","clear_search":"Clear search","finding_your_location":"Finding your location...","search_suggestions":"Search Suggestions","use_my_current_location":"Use my current location","loading":"Loading...","no_results":"No results found","no_results_location_description_reset":"Try expanding the radius, searching a different location, or <0>resetting your filters.","no_results_location_description":"Or, explore virtual events which can be attended from anywhere in the world!","results_available_with_count":"{{count}} results available","results_available_with_count_one":"{{count}} result available","results_available_with_count_other":"{{count}} results available","close_error_dialog":"Close error dialog","oops_location_error_title":"Oops, we can’t find your location","oops_location_error_description":"We couldn’t find you quickly enough! Try again later, or search near a city, place or an address instead.","clear_all":"Clear All","distance":"Distance","within_unit":"Within {{value}} {{unit}}","apply_filters":"Apply filters","sort_with_value":"Sort {{value}}","related_content_empty":"The cards won’t render in the author environment!","on_this_page":"On this page","ready_to_get_started":"Ready to get started?","youtube_video_thumbnail":"YouTube video thumbnail"}}}}