Weapons of Micro Destruction: How Our ‘Likes’ Hijacked Democracy

By Dave Smith

“We were able to form a model to predict the personality of every single adult in the United States of America.” — Alexander Nix, former CEO of Cambridge Analytica

Clicking ‘Like’ is something most of us do without thinking. It’s a form of social currency that gives us a momentary jolt and revs up our dopamine centers. Yet who knew all our ‘Likes’ could predict our personality and be turned into a tool of political persuasion against us?

What follows next is:

  • A cautionary tale of how big data can be abused in the hands of bad actors.
  • A step-by-step spreadsheet tutorial that explains a personality predicting algorithm, LASSO regression.
  • And a warning about the digital footprints you leave across the web.

Nearly 2 years after the election that shocked the world, the Facebook scandal with Cambridge Analytica (“CA”) remains in the eye of the media firestorm. And it seems like every juicy angle of the story’s been covered.

But 1 question continues to go unaddressed:

How do these models work??

Not on some surface level (a correlation of Facebook Pages you like to personality quiz scores). But under the hood. In a language most people can understand…good ‘ol Mr. Excel.

As a self-confessed data nerd and spreadsheet activist, I sought to fill my curiosity appetite and was surprised at the simplicity of what I found.

With a general linear regression model called LASSO regression, I’ll use spreadsheets to show you how machine learning can predict your personality better than your family with only 125 of your Facebook Likes. Sounds a bit dystopian, but true.

Your data is valuable and you deserve to know how it‘s being used.

Parts 1–3 (~10 minutes) covers WHAT was done and gives you background on the scandal. You’ll learn the practice of micro-targeting (delivering personalized ads to you based on your personality profile) and how 87 million Facebook profiles were harvested.

Parts 4–5 (~15 minutes) covers HOW it was done — the data science. Skip to here if you’re familiar with the scandal and just want the tutorial. Part 5 is where we get under the hood and look at the details.

The model is best viewed in Excel, but you can also view online in Google Sheets (calcs are slower) and there’s a PDF with the math (part 5 of post) for easy offline reference.

Like any super power, machine learning will be used by villains (Cambridge Analytica) and heroes alike (Crisis Text Line). Proceed with caution.

If you enjoy this post and want to get other free spreadsheet tutorials that help you understand things like facial recognition or how your Netflix recommendations are generated, sign up for my email list here:

Cambridge Analytica, the data-driven analytics firm that specialized in psychographic profiling or “PSYOPS,” was hired by the Trump campaign in June of 2016 to lead its digital ops up to the November election and has boasted they have up to 5,000 data points on every adult in the US.

Source: https://cambridgeanalytica.org/


In fact, they list this as an achievement on their website (along with bankruptcy notices as of May 2018).

Source: https://ca-political.com/

In the months leading up to the election, CA poured their treasure trove of data into their personality prediction machine to build 10,000 highly personalized Facebook ads targeted to different audiences in an effort to manipulate the voter behavior of undecided voters and suppress voter turnout.

Ken Bone anyone?

They call this advertising practice ‘micro-targeting.’ The former CA whiz-kid data scientist and whistleblower who helped build the tools, Christopher Wiley, calls it:

Your voter records, where you shop, your tweets, your geo-location phone data, what church you go to, the TV shows you watch, your Facebook Likes. They have it.

Especially your Likes.

And with enough of your Likes, researchers at the forefront of the field of pyschographic profiling proved in 2014 that computers are more accurate at predicting your personality than the people closest to you.

  • With just 9 Facebook Likes, a computer can predict your personality as well as a colleague.
  • With 65 Likes, as well as a friend.
  • And with 125 Likes, your family.

According to the Cambridge researcher who ended up harvesting the Facebook data used in CA’s micro-targeting operation, it was possible to learn such a machine learning model from scratch in just 1 week:

Data’s far more valuable than models because if you have the data it’s very easy to build models — because models use just a few well understood statistical techniques to make them. I was able to go from not doing machine learning to knowing what I need to know in one week. That’s all it took. — Aleksandr Kogan

He was right.

In the grand scheme of things, the model (a sort of correlation between your Likes and personality quiz scores) is the easy part.

Before discussing how psychological profiling was used and how 87 million Facebook profiles were harvested, there’s a few things I want to to get off my chest…

  1. Data science is not a panacea. It alone can’t rig an election or make a good candidate bad. However, when elections are decided by razor-thin margins, there’s no doubt that technology can play a role.
  2. The effectiveness of micro-targeting in politics is widely debated, but we don’t know how well it worked for the Trump campaign. In the aftermath of the election, key players from all sides of the scandal (Trump campaign, CA, Ted Cruz’s campaign, Aleksandr Kogan) have made public claims saying CA’s models were worthless snake oil, the best thing since sliced bread, or not used at all. Other skeptics have debated the effectiveness of micro-targeting altogether, while the researchers in this field say otherwise. Given that CA’s models aren’t in the public domain (thankfully), I won’t speculate on how much they did or didn’t help Trump win. Just keep in mind that most sides are incentivized to either distance themselves or take credit.
Source: https://overthinkgroup.com/facebook-cambridge-analytica/

3.The root of this scandal was consent. Prior to 2014, Facebook’s developer policy allowed 3rd party apps to collect data from Facebook users’ friends without their friends’ consent. So even though only ~300,000 people took an online personality quiz and gave consent…this exposed their friends’ data as well (who didn’t explicitly consent)…87 million people. The data was subsequently shared with CA (violation of Facebook’s policy). There was no hack and the data is forever out in the wild.

4. Your digital footprint is growing. Machines are getting smarter. And politics is a high stakes game. This isn’t the last time you’ll hear about bad actors using your data for nefarious means (sigh), but it’s important to be informed so you can make your own choices on data privacy. Data brokers don’t discriminate against political party and in some cases, you can see the data these orgs have on you. Organizations like CA are already being used for the 2020 election in the US so this isn’t the last time you’ll hear about this.

Now that I got that off my chest, let’s look at how psychological profiling works.

Pyschometrics is a scientific attempt to measure someone’s personality and it’s been around since the 1980s.

Simply put, people take a Q&A personality quiz and they are scored on the standard “Big Five” Personality traits (OCEAN).

Source: Cambridge Analytica

And once you know someone’s personality, you can segment them into different advertising segments and delivered tailor-made persuasive ads that cater to their individual tastes.

Even though psychographic profiling has been around for decades, the problem has always been data collection.

Since most personality quizzes involved 100+ questions (example below) and take between 20–30 minutes to complete…it’s never been easy to collect data on a wide swath of people across the globe.

Sample personality question from IPIP

And then Facebook emerged in 2004.

The term ‘Big Data’ was coined in 2005.

The first iPhone was released in 2007.

And our digital footprint started to grow exponentially.

Suddenly, researchers saw an opportunity.

In 2007, 2 psychology researchers at Cambridge’s Pyschometrics Centre, created a Facebook personality quiz app (myPersonality) and it went viral. Over 6 million people used the app and nearly half of these people allowed the researchers to use their Facebook data.

Social scientists now had a goldmine of personality data they could mine for insight.

In 2013, they published groundbreaking research that showed your Facebook Likes could predict your personality and political views (among other things):

Source: http://www.pnas.org/content/pnas/early/2013/03/06/1218772110.full.pdf

Interestingly, it showed that the best predictors of high intelligence were likes of “thunderstorms,” “The Colbert Report,” and “curly fries.” (note: correlation isn’t causation…eating curly fries won’t make you smarter Stephen haha!).

“I can feel my brain getting bigger.” — Stephen Colbert (https://archive.org/details/COM_20130328_083000_The_Colbert_Report/start/840/end/900)

Similarly, people who liked “Hello Kitty” tended to have ‘O — Openness’ scores.

In their research, they sounded the warning bell on the implications to data privacy and ownership, but people with other agendas soon took notice.

In the summer of 2013 before he joined CA, Christopher Wiley discovered the paper and said:

“And then I came across a paper about how personality traits could be a precursor to political behaviour, and it suddenly made sense. Liberalism is correlated with high openness and low conscientiousness, and when you think of Lib Dems they’re absent-minded professors and hippies. They’re the early adopters… they’re highly open to new ideas. And it just clicked all of a sudden.”

Later in 2013, Wiley was introduced to Alexander Nix who offered him a job as research director at the British behavioral research and communications company, Strategic Communications Laboratories or “SCL,” which subsequently created the US subsidiary Cambridge Analytica.

Nix told Wylie,

“We’ll give you total freedom. Experiment. Come and test out all your crazy ideas.”

That wasn’t a good idea.

While doing research for SCL, Wiley got connected with Steve Bannon. And given Bannon’s interests in politics as the editor-in-chief of Breitbart and his support of Nigel Farage’s Leave the EU Brexit campaign, Chris’s ideas on political messaging intrigued Bannon.

In December, CA was formed with Bannon as its Vice President along with financial backing from Republican megadonor and AI pioneer Robert Mercer.

With their piggy bank fully stocked, CA needed to find a way to get the Facebook data and deliver on their promises of political persuasion.

Enter Alexsandr Kogan.

Kogan worked as a Cambridge University researcher in the Psychometrics Centre. The same research center where his colleagues published the 2013 paper showing the predictive power of Facebook Likes.

In early 2014, Wiley and Kogan got introduced to each other.

Wiley and CA were interested in the Facebook data Kogan’s research lab had access to from their app.

CA was willing to pay the researchers for the data; however, negotiations broke down between Kogan and his university colleagues (who had both ethical concerns and monetary disputes with Kogan) so Kogan and CA devised another plan.

Kogan offered to build his own app and harvest the data himself. CA agreed and helped him set up a separate entity called Global Science Research or “GSR.” GSR would acquire the data, share it with CA, and CA who would reimburse GSR for the costs.

Data Harvesting

To expedite the harvesting of data, GSR used a 3rd party online survey firm, Qualtrics, and crowd-sourced respondents through Amazon’s Mechanical Turk to pay users between $2 and $4 to take the personality survey.

The respondents were asked to authorize access to their Facebook profiles and Kogan’s app performed its’ sole function — collect their Facebook data and their friends’ data.

In total, over 300,000 Facebook users took the quiz (~$1 million cost to CA) which amounted to harvesting around 87 million people’s Facebook data (your Likes and other profile data like your location, your name, etc…).

Here’s a timeline I put together to show how some of the key players are linked:

Good Research, Bad Actors

So what went wrong?

  1. Facebook failed to read all of GSR’s app’s terms and conditions (see above pic of terms & conditions) during their app review process. They admitted this in court and GSR’s terms stated they could sell people’s data.
  2. Regardless of GSR’s own terms, GSR themselves ignored Facebook’s App Developer policy (which Kogan claimed not to read) which prohibited them from sharing their data with CA.
  3. Friends Didn’t Give Explicit Consent — Facebook’s App Developer policy (at the time) allowed 1 person to give consent to all their friends’ data.

Now that CA had their data, it was time for them to use, errr…“abuse” it.

“We exploited Facebook to harvest millions of people’s profiles. And built models to exploit what we knew about them and target their inner demons. That was the basis that the entire company was built on.” — Christopher Wiley, former data scientist at CA

Here’s a simple example of how micro-targeting works:

  1. ID Voters — Using voter records and other data, identify undecided voters
  2. ID Hot Topic — Choose a ‘hot button’ topic that’s important to voters like the 2nd amendment (gun rights)
  3. Tweak Ad to Fit Personality — Based on the individual’s personality profile, nuance the messaging to resonate better with that person.
  4. Anonymously Deliver Ads — Through a Facebook practice known as ‘dark posts’ (now banned), purchase ads anonymously and deliver to people who fit your criteria

As explained by Alexander Nix, a person with high neuroticism (’N’) and conscientiousness (‘C’), for instance, would need a message that is rational and fear-based. They’d be shown a picture of a burglar entering their home as the threat of the burglary along with the insurance policy of owning a gun is persuasive.

Source: Cambridge Analytica

Conversely, a person who has a low level of Openness (‘O’) and is highly agreeable (‘A) would need message that is rooted in tradition and family. They‘d be shown a picture of a father passing values down to his son.

According to an internal PowerPoint leaked by a former CA employee, their ads were seen 1.5 billion times during the Trump campaign.

With the rise of big data, it’s no surprise that advertising has become increasingly personalized. The issue though wasn’t personalized advertising. The issue was around data privacy, a lack of transparency, and consent.

Now I’ll explain the data science behind the scandal using step-by-step spreadsheets. Yes, there’s math. But you can follow all the formulas…no coding needed.

In this section, I’ll discuss:

  1. An overview of the algorithms used in the personality prediction research
  2. An intro to LASSO regression
  3. How to choose the best lambda in LASSO regression

Think of Part 4 as a “bird’s eye” level view of LASSO regression; whereas, Part 5 is the “worm’s eye” view.

In Part 5, you’ll see all the step-by-step math derivations and references to the formulas in the Excel file. It’s very detailed, but quite frankly, I can’t stand tutorials that hide these details so we’ll get under the hood!

Even though the exact algorithm used by CA isn’t public, we can turn to the research papers that their ideas were based off of and glean insights from interviews.

Here’s what we know from 2 key research papers:

I selected LASSO regression for this tutorial because of comments made by the researcher behind both papers and Aleksandr Kogan (Cambridge researcher who gave CA all the Facebook data).

While speaking at the Alan Turing Institute in 2018 about his 2014 paper, Stillwell said,

“Instead of doing SVD, we did a LASSO regression instead, and that improved our accuracy.”

Furthermore, Kogan has said:

“We didn’t exactly use SVD,” he wrote, noting that SVD can struggle when some users have many more “likes” than others. Instead, Kogan explained, “The technique was something we actually developed ourselves … It’s not something that is in the public domain.” Without going into details, Kogan described their method as “a multi-step co-occurrence approach.”

Both SVD and LASSO are powerful techniques when you have high-dimensional data (a “large” # of features…like millions of ‘Facebook Pages’ in our example). They each give you a way to eliminate data redundancy, focus on the information with the most predictive influence, and improve computational efficiency. LASSO has the added advantage of interpretability.

LASSO regression is a type of linear regression which uses L1 regularization (explained below) to both prevent over fitting and perform automatic feature selection.

Since our goal is to find the predictive influence of the most important Facebook Pages on a personality score, automatic feature selection (eliminating Facebook Pages with no influence or redundant influence) is very appealing.

Each Facebook Page‘s coefficient determines that page’s predictive influence

Let’s start by defining what LASSO stands for and defining the objective function behind it (based on scikit-learn’s implementation of LASSO).

‘Least Absolute Shrinkage’ and ‘Selection Operator’

The goal is to find the coefficients (the Betas) which minimize our objective function (presented below 4 different ways):

In the 1st half of the equation, measure of fit, we have a simple mean squared error equation (the 1/2 term in front is there to simplify the math that we’ll explore in part 5).

In the 2nd half of the equation, L1 penalty, if lambda (a tuning parameter we control) is greater than zero, then adding the absolute values of our coefficients means our coefficients must shrink (compared to the coefficient values with no penalty) if we wish to minimize the objective function.

Thus, the ‘Least Absolute Shrinkage’ or ‘LAS’ in LASSO.

Think of the L1 penalty as a shrink ray. It will shrink the size of the coefficients…and it could potentially make the coefficient disappear.

L1 penalty is like a shrink ray gun. It shrinks coefficients and sometimes makes them disappear!

You may be wondering why we would want to add a penalty at all to shrink the size of our coefficients? The answer is to prevent “over fitting.”

Over fitting occurs when the algorithm “memorizes the training data” and means it won’t generalize well against unseen/test data. Adding the penalty helps “regularize” the magnitude of the coefficients and improves the algorithm’s predictions on the holdout data it’s never seen.

L1 penalty prevents overfitting

As we’ll see in the next section, when the lambda value is high enough, it also forces some coefficients to zero and therefore acts as a ‘selection operator’ (the ‘SO’ in LASSO). A page with a zero coefficient means the page is ignored in the prediction and when we have many pages with zero coefficients, this is referred to as a “sparse solution.”

Conversely, if the coefficient is large (really high or really low), it means the page has a high degree of influence.

A popular technique for choosing the best lambda value is called cross-validation.

In k-fold cross-validation, you arbitrarily choose a series of lambdas (I use 0.0, 0.01, 0.10, 1.0 in the Excel model), see how each performs on your validation sets, and choose the lambda that has the lowest average error across all validation sets.

For instance, if we had enough data (not shown in Excel), we would split up our data into training/test sets and then further split up our training data into 5 (k) folds or partitions. After testing each lambda on the 5 validation sets, we’d choose the one which resulted in the lowest average error.

In the Excel model, I use an INCREDIBLY small data set as the file is intended to be easy to follow and educate you on the key principles:

  • Training Set = 5 People (and 8 possible Facebook Pages to Like)
  • Test Set = 2 People
  • Validation Set = None

Given that there’s no validation set, the 2 person test set will have to suffice for choosing the best lambda in the Excel model 😎

After testing all lambdas, it’s helpful to visualize the path of our Facebook Page coefficients at convergence as we increase the size of the lambda (See sheet “C1. Analysis — LASSO Trace” in the Excel file):

LASSO Trace — Cross Validation to Choose the Best Lambda

This gives us a few inferences:

  1. As lambda increases, the sparsity increases…the number of zero coefficients goes from none to all of them
  2. When lambda is zero (no L1 penalty), all coefficients are used and the training MSE is the best; however, the test MSE (what ultimately matters) is best when lambda is 0.01.
  3. When the lambda is too low, 0.0, we are over fitting (low training MSE, higher test MSE). When the lambda is too high, 1.0, we are under fitting (high training and test MSE).

Now that you have a high level view of what LASSO does, we’ll tackle the nitty gritty math and walk through how to train the algorithm for a specific lambda in the Excel model.

Now it’s time to get our hands dirty…I’ll tackle each section below as we train the algorithm.

  1. Define the Objective Function, Key Terms, and Excel File Overview
  2. Preprocessing Data — From ‘Likes’ to ‘Standardized’
  3. Initialize Coefficients with Zeros
  4. Cyclical Coordinate Descent — Update Coefficients ‘One at a Time’
  5. Iterate Until Convergence

Our goal is to find the Facebook Pages which have the most predictive influence on someone’s level of Openness (The ‘O’ from the OCEAN Personality Score). While the the people in the Excel file are fictional, the 8 Facebook Pages used are some of the most influential from the research papers.

As mentioned in part 4, our objective is to find the coefficients which minimize this LASSO Cost function (presented several ways below for clarity). Beneath the function is a legend that explains each Greek symbol.

As we walk through the steps to train the algorithm, you can reference the sheet “B1.TrainingAlgorithm_Lambda_.01” to see the math in action.

I’ll show you how to update 1 Facebook Page’s coefficient.

Since each coefficient is updated “one at a time” (not “all at once/simultaneously” like in gradient descent), you can apply the same math to the subsequent coefficient updates.

The Excel sheet organizes the “iterations” (a complete training loop of all coefficients) in sections from left-to-right. Within each iteration, you can see how each Facebook Page’s coefficient gets updated one at a time. Lastly, you can see our lambda hyperparameter in the upper left corner.

Before we can train our algorithm, we have to convert our ‘Likes’ into a language the computer understands…0’s and 1's!

The first step in our training pipeline is to preprocess our data. See sheet “A. Preprocessing Data” in the Excel file.

We start by converting each ‘Like’ into a ‘1’ and and everything else becomes ‘0’:

Next, to ensure that the popularity of a page doesn’t affect the algorithm’s weighting of the page, we have to get each Facebook Page on the same scale.

If 1 page is very popular (like ‘TED’ — 4 out of 5 people liked it), we need a way to ensure the algorithm doesn’t weight this page differently than a page that is less popular (like ‘The Bachelor’ — only 2 out of 5 people liked it).

To accomplish this scaling, we use a technique called standardization. Standardization centers each page so that the average score for each Page becomes 0 and it has a standard deviation of 1 (this fits each Page to the same “bell curve”).

Standardization Formula (also in Excel file):
     (Sample Page Raw Score — Page’s Average Score)
= ______________________________________________
Page’s Standard Deviation
Preprocessing Data — Standardization

At the start of training, each Facebook Page’s coefficient starts out at 0.

Then, using an iterative update method called ‘cyclical coordinate descent,’ the model “learns” to adjust the coefficients 1 at a time to generate better predictions on our training data. Each coefficient can be thought of as a ‘coordinate’ and we cycle through these in order (start with 1st and end with the 8th).

Since our data was standardized at the start of training, we can effectively ignore the bias as it has not impact on the model.

See sheet “B1.TrainingAlgorithm_Lambda_.01”:

To ensure this algorithm can be reproduced, I update the coefficients in cyclical order each iteration; however, this will not produce the best results in production.

Since LASSO does a good job of eliminating redundancy, updating them in order will result in the algorithm retaining the first Facebook Page’s coefficient it sees if there are 2 pages with identical Likes.

If you were implementing LASSO in Python (such as sci-kit learn’s package), it’s better to choose ‘random’ instead of ‘cyclic.’ This will ensure the order of coefficient updates is done at random each iteration which should also result in faster convergence.


⚠️ In this section, there’s A LOT OF MATH ⚠️

Every painstaking step is shown for clarity and you’ll see how the machine actually “learns” to update the coefficients.

For easy reference, you can view the math steps as a PDF or refer to sheet “D. LASSO Regression Math” in the Excel file.

The end result of all the math provides the 3 update rules used to update each coefficient. For instance, see rows 36–45 on sheet “B1.TrainingAlgorithm_Lambda_.01” in the Excel file.

If this isn’t for you, you could always try this approach…


Cyclical coordinate descent is an optimization algorithm. At each iteration, a coordinate (or “coefficient”) is updated in the direction that will minimize our objective function.

The key difference vs. gradient descent is that the L1 penalty term in the LASSO objective function is not differentiable because of the absolute value sign.

In essence, a function is differentiable if we know which way the output of our function (like the error) will change by changing the value of an input (like a coefficient).

Since the derivative of an absolute value can be -1, undefined, or 1, it’s not differentiable. Thus, we must calculate “sub gradients” and our update rule will take 1 of 3 forms dependent on the conditions met.

Here are the 4 steps we’ll cover:

  1. Calculate the gradient of the MSE with respect to 1 coefficient (Part 1 of the LASSO Cost)
  2. Simplify the result from step 1 and re-define terms
  3. Calculate the L1 penalty’s subgradients (Part 2 of the LASSO Cost)
  4. Combine the gradient from step 1 with the subgradients from step 3 and define the 3 update rules.

In the Excel file, you can see these calcs on sheet “B1.TrainingAlgorithm_Lambda_.01” in rows 16–34.

In the Excel file, you can see these calcs on sheet “B1.TrainingAlgorithm_Lambda_.01” in rows 36–45.

After updating each coefficient one at a time as you train the algorithm, the next question is…when do you stop training?

In LASSO regression, the convergence criteria is user-defined and the algorithm stops training when either of these 2 conditions are met:

  1. Max Iteration’— Once the algorithm goes through (insert number) of iterations (“a training loop” over all coefficients), training stops.
  2. ‘Tol = Tolerance’ — Tolerance represents the change in coefficient value before and after an iteration. At the end of each iteration, the algorithm compares each coefficient’s value before/after that iteration, and if at least 1 coefficient’s change does not exceed the tolerance amount, training stops.

In the Excel file, the tolerance criteria can be seen in rows 373–385 and I used a tolerance of 0.001.

After stopping training, you should choose the lambda that performs the best on your validation set and review the coefficients.

LASSO regression is a powerful tool when you have millions of features and you’re looking for an easy way to interpret the results.

In our example, we can see that the “The Colbert Report” was the Facebook Page that had the most predictive influence; however, keep in mind that the algorithm saw this page first and because we didn’t update the coefficients in random order, this is a biased result.

As we reflect back on the Facebook scandal, trust is a two-way street and when that trust is broken, all sides should re-examine their beliefs, policies, and actions.

We’re in the infancy of the Digital Age and we’ve barely found our footing, yet our digital footprints will continue to grow exponentially as technology accelerates:

  • As a consumer, what data are you willing to give away in exchange for free services and personalized experiences?
  • As a company, what data privacy policies should you adopt?
  • As a data scientist, are you following an ethics checklist?
  • As a government, what role should regulation play?

In the wake of such scandals, societal views on data privacy will continue to be re-shaped and companies who fail to evolve will be forced out through natural selection.

Data science is neither a panacea nor a curse. When speaking on the future of psychographics, the Stanford researcher, Michael Kosinksi, summed it up best by saying:

“It’s a bit like fire,” he says. “You can use fire to both warm your house and burn it down. You can’t ban fire, and you can’t stop some people from committing arson. What you need are firefighters and fire-safety equipment.”

If you liked this and want to get more free machine learning tutorials in Excel sent straight to your inbox, click below and enter your email.

The lessons covers things like how to build you first neural net, how facial recognition works, and how Netflix generates your recommendations.

And if you’re a spreadsheet activist, please share this post with others 😉