diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index 9b7c39d53d08..584f6f8894aa 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -13,10 +13,10 @@ name: "CodeQL"
on:
push:
- branches: [ "master" ]
+ branches: [ "master"]
pull_request:
# The branches below must be a subset of the branches above
- branches: [ "master" ]
+ branches: [ "master"]
schedule:
- cron: '22 11 * * 0'
diff --git a/integrationExamples/gpt/captifyRtdProvider_example.html b/integrationExamples/gpt/captifyRtdProvider_example.html
deleted file mode 100644
index 955fbf8be703..000000000000
--- a/integrationExamples/gpt/captifyRtdProvider_example.html
+++ /dev/null
@@ -1,167 +0,0 @@
-
-
-
-
-
Note: for this example to work, you need access to a bid simulation tool from your MASS enabled Exchange partner.
-
-
-
-
-
-
diff --git a/libraries/analyticsAdapter/AnalyticsAdapter.js b/libraries/analyticsAdapter/AnalyticsAdapter.js
index b6e270b3c3c2..e1933d215e40 100644
--- a/libraries/analyticsAdapter/AnalyticsAdapter.js
+++ b/libraries/analyticsAdapter/AnalyticsAdapter.js
@@ -134,13 +134,7 @@ export default function AnalyticsAdapter({ url, analyticsType, global, handler }
handlers = Object.fromEntries(
Array.from(trackedEvents)
.map((ev) => {
- const handler = ev === CONSTANTS.EVENTS.AUCTION_INIT
- ? (args) => {
- // TODO: remove this special case in v8
- args.config = typeof config === 'object' ? config.options || {} : {};
- this.enqueue({eventType: ev, args});
- }
- : (args) => this.enqueue({eventType: ev, args});
+ const handler = (args) => this.enqueue({eventType: ev, args});
events.on(ev, handler);
return [ev, handler];
})
diff --git a/libraries/appnexusKeywords/anKeywords.js b/libraries/appnexusKeywords/anKeywords.js
new file mode 100644
index 000000000000..5dc0b453253b
--- /dev/null
+++ b/libraries/appnexusKeywords/anKeywords.js
@@ -0,0 +1,140 @@
+import {_each, deepAccess, getValueString, isArray, isStr, mergeDeep, isNumber} from '../../src/utils.js';
+import {getAllOrtbKeywords} from '../keywords/keywords.js';
+import {CLIENT_SECTIONS} from '../../src/fpd/oneClient.js';
+
+const ORTB_SEGTAX_KEY_MAP = {
+ 526: '1plusX',
+ 527: '1plusX',
+ 541: 'captify_segments',
+ 540: 'perid'
+};
+const ORTB_SEG_PATHS = ['user.data'].concat(
+ CLIENT_SECTIONS.map((prefix) => `${prefix}.content.data`)
+);
+
+/**
+ * Converts an object of arrays (either strings or numbers) into an array of objects containing key and value properties
+ * normally read from bidder params
+ * eg { foo: ['bar', 'baz'], fizz: ['buzz'] }
+ * becomes [{ key: 'foo', value: ['bar', 'baz']}, {key: 'fizz', value: ['buzz']}]
+ * @param {Object} keywords object of arrays representing keyvalue pairs
+ * @param {string} paramName name of parent object (eg 'keywords') containing keyword data, used in error handling
+ * @returns {Array<{key, value}>}
+ */
+export function transformBidderParamKeywords(keywords, paramName = 'keywords') {
+ const arrs = [];
+
+ _each(keywords, (v, k) => {
+ if (isArray(v)) {
+ let values = [];
+ _each(v, (val) => {
+ val = getValueString(paramName + '.' + k, val);
+ if (val || val === '') {
+ values.push(val);
+ }
+ });
+ v = values;
+ } else {
+ v = getValueString(paramName + '.' + k, v);
+ if (isStr(v)) {
+ v = [v];
+ } else {
+ return;
+ } // unsuported types - don't send a key
+ }
+ v = v.filter(kw => kw !== '')
+ const entry = {key: k}
+ if (v.length > 0) {
+ entry.value = v;
+ }
+ arrs.push(entry);
+ });
+
+ return arrs;
+}
+
+// converts a comma separated list of keywords into the standard keyword object format used in appnexus bid params
+// 'genre=rock,genre=pop,pets=dog,music' goes to { 'genre': ['rock', 'pop'], 'pets': ['dog'], 'music': [''] }
+export function convertKeywordStringToANMap(keyStr) {
+ if (isStr(keyStr) && keyStr !== '') {
+ // will split based on commas and will eat white space before/after the comma
+ return convertKeywordsToANMap(keyStr.split(/\s*(?:,)\s*/));
+ } else {
+ return {}
+ }
+}
+
+/**
+ * @param {Array