@rudderstack/integrations-lib
Version:
112 lines • 13.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const factory_1 = require("../../network/factory");
const config_1 = require("./config");
/**
* CriteoAudience SDK for managing audience segments in Criteo
* @class
*/
class CriteoAudience {
/**
* Creates an instance of CriteoAudience
* @param {AuthObject} authObject - Authentication object containing access token and refresh function
* @throws {Error} If authObject is invalid or missing required properties
*/
constructor(authObject) {
CriteoAudience.validateAuthObject(authObject);
this.authObject = authObject;
this.httpClient = factory_1.HttpClientFactory.getHttpClient(factory_1.ClientNames.Axios, {
baseURL: config_1.BASE_URL,
});
}
/**
* Validates the authentication object
* @param {AuthObject} authObject - Authentication object to validate
* @throws {Error} If authObject is invalid or missing required properties
* @private
*/
static validateAuthObject(authObject) {
if (!authObject) {
throw new Error('authObject is required.');
}
const { accessToken, refreshAccessTokenFunc } = authObject;
if (!accessToken) {
throw new Error('Criteo Audience accessToken is required.');
}
if (!refreshAccessTokenFunc) {
throw new Error('Criteo Audience a refresh access token function is required.');
}
}
/**
* Refreshes the access token using the provided refresh function
* @throws {Error} If token refresh fails
* @private
*/
async refreshToken() {
try {
const accessToken = await this.authObject.refreshAccessTokenFunc();
this.authObject.accessToken = accessToken;
}
catch (error) {
throw new Error(`Unable to refresh token, with error: ${error}`);
}
}
/**
* Gets the request headers with authentication
* @returns {RequestConfig} Request configuration with headers
* @private
*/
getHeader() {
return {
headers: {
authorization: `Bearer ${this.authObject.accessToken}`,
accept: 'application/json',
'content-type': 'application/json',
},
};
}
/**
* Executes a POST request with token refresh handling
* @template T - Response type
* @param {string} url - API endpoint URL
* @param {object} data - Request payload
* @returns {Promise<ApiResponse<T>>} API response
* @private
*/
async executePostRequest(url, data) {
const response = await this.httpClient.post(url, data, this.getHeader());
switch (response.type) {
case 'application-error':
if (response.statusCode === 401 &&
(response.responseBody.errors[0].code === 'authorization-token-invalid' ||
response.responseBody.errors[0].code === 'authorization-token-expired')) {
await this.refreshToken();
return this.httpClient.post(url, data, this.getHeader());
}
return response;
default:
return response;
}
}
/**
* Creates a new audience segment in Criteo
* @param {AudienceSegmentBody} audienceSegmentBody - Audience segment data
* @returns {Promise<AudienceSegmentData>} Created audience segment data
* @throws {Error} If audience segment creation fails
*/
async createAudienceSegment(audienceSegmentBody) {
const createAudienceSegmentResponse = await this.executePostRequest(`/marketing-solutions/audience-segments/create`, audienceSegmentBody);
if (createAudienceSegmentResponse.type === 'success') {
const { data } = createAudienceSegmentResponse.responseBody;
if (data && data.length > 0) {
return data[0];
}
}
const errorMessage = createAudienceSegmentResponse.type === 'client-error'
? createAudienceSegmentResponse.message
: JSON.stringify(createAudienceSegmentResponse.responseBody);
throw new Error(`Failed to create audience segment, with error: ${errorMessage}`);
}
}
exports.default = CriteoAudience;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JpdGVvQXVkaWVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2Rrcy9jcml0ZW9BdWRpZW5jZS9jcml0ZW9BdWRpZW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG1EQUF1RTtBQUV2RSxxQ0FBb0M7QUFRcEM7OztHQUdHO0FBQ0gsTUFBcUIsY0FBYztJQUtqQzs7OztPQUlHO0lBQ0gsWUFBWSxVQUFzQjtRQUNoQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRywyQkFBaUIsQ0FBQyxhQUFhLENBQUMscUJBQVcsQ0FBQyxLQUFLLEVBQUU7WUFDbkUsT0FBTyxFQUFFLGlCQUFRO1NBQ2xCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxVQUFzQjtRQUN0RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxNQUFNLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFLEdBQUcsVUFBVSxDQUFDO1FBQzNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztRQUNsRixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsWUFBWTtRQUN4QixJQUFJLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNuRSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDNUMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFNBQVM7UUFDZixPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQLGFBQWEsRUFBRSxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFO2dCQUN0RCxNQUFNLEVBQUUsa0JBQWtCO2dCQUMxQixjQUFjLEVBQUUsa0JBQWtCO2FBQ25DO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssS0FBSyxDQUFDLGtCQUFrQixDQUFJLEdBQVcsRUFBRSxJQUFZO1FBQzNELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUksR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUM1RSxRQUFRLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0QixLQUFLLG1CQUFtQjtnQkFDdEIsSUFDRSxRQUFRLENBQUMsVUFBVSxLQUFLLEdBQUc7b0JBQzNCLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLDZCQUE2Qjt3QkFDckUsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLDZCQUE2QixDQUFDLEVBQ3pFLENBQUM7b0JBQ0QsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQzFCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUksR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFDOUQsQ0FBQztnQkFDRCxPQUFPLFFBQVEsQ0FBQztZQUNsQjtnQkFDRSxPQUFPLFFBQVEsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLHFCQUFxQixDQUNoQyxtQkFBd0M7UUFFeEMsTUFBTSw2QkFBNkIsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FDakUsK0NBQStDLEVBQy9DLG1CQUFtQixDQUNwQixDQUFDO1FBQ0YsSUFBSSw2QkFBNkIsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDckQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLDZCQUE2QixDQUFDLFlBQVksQ0FBQztZQUM1RCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM1QixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQixDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUNoQiw2QkFBNkIsQ0FBQyxJQUFJLEtBQUssY0FBYztZQUNuRCxDQUFDLENBQUMsNkJBQTZCLENBQUMsT0FBTztZQUN2QyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyw2QkFBNkIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVqRSxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7Q0FDRjtBQXZIRCxpQ0F1SEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50RmFjdG9yeSwgQ2xpZW50TmFtZXMgfSBmcm9tICcuLi8uLi9uZXR3b3JrL2ZhY3RvcnknO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgUmVxdWVzdENvbmZpZywgQXBpUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9uZXR3b3JrL2NsaWVudHMvdHlwZXMnO1xuaW1wb3J0IHsgQkFTRV9VUkwgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQge1xuICBBdXRoT2JqZWN0LFxuICBBdWRpZW5jZVNlZ21lbnRCb2R5LFxuICBBdWRpZW5jZVNlZ21lbnRSZXNwb25zZSxcbiAgQXVkaWVuY2VTZWdtZW50RGF0YSxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQ3JpdGVvQXVkaWVuY2UgU0RLIGZvciBtYW5hZ2luZyBhdWRpZW5jZSBzZWdtZW50cyBpbiBDcml0ZW9cbiAqIEBjbGFzc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDcml0ZW9BdWRpZW5jZSB7XG4gIHByaXZhdGUgYXV0aE9iamVjdDogQXV0aE9iamVjdDtcblxuICBwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ3JpdGVvQXVkaWVuY2VcbiAgICogQHBhcmFtIHtBdXRoT2JqZWN0fSBhdXRoT2JqZWN0IC0gQXV0aGVudGljYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgYWNjZXNzIHRva2VuIGFuZCByZWZyZXNoIGZ1bmN0aW9uXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBhdXRoT2JqZWN0IGlzIGludmFsaWQgb3IgbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0aWVzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhdXRoT2JqZWN0OiBBdXRoT2JqZWN0KSB7XG4gICAgQ3JpdGVvQXVkaWVuY2UudmFsaWRhdGVBdXRoT2JqZWN0KGF1dGhPYmplY3QpO1xuICAgIHRoaXMuYXV0aE9iamVjdCA9IGF1dGhPYmplY3Q7XG4gICAgdGhpcy5odHRwQ2xpZW50ID0gSHR0cENsaWVudEZhY3RvcnkuZ2V0SHR0cENsaWVudChDbGllbnROYW1lcy5BeGlvcywge1xuICAgICAgYmFzZVVSTDogQkFTRV9VUkwsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBhdXRoZW50aWNhdGlvbiBvYmplY3RcbiAgICogQHBhcmFtIHtBdXRoT2JqZWN0fSBhdXRoT2JqZWN0IC0gQXV0aGVudGljYXRpb24gb2JqZWN0IHRvIHZhbGlkYXRlXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBhdXRoT2JqZWN0IGlzIGludmFsaWQgb3IgbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0aWVzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyB2YWxpZGF0ZUF1dGhPYmplY3QoYXV0aE9iamVjdDogQXV0aE9iamVjdCkge1xuICAgIGlmICghYXV0aE9iamVjdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhdXRoT2JqZWN0IGlzIHJlcXVpcmVkLicpO1xuICAgIH1cbiAgICBjb25zdCB7IGFjY2Vzc1Rva2VuLCByZWZyZXNoQWNjZXNzVG9rZW5GdW5jIH0gPSBhdXRoT2JqZWN0O1xuICAgIGlmICghYWNjZXNzVG9rZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ3JpdGVvIEF1ZGllbmNlIGFjY2Vzc1Rva2VuIGlzIHJlcXVpcmVkLicpO1xuICAgIH1cbiAgICBpZiAoIXJlZnJlc2hBY2Nlc3NUb2tlbkZ1bmMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ3JpdGVvIEF1ZGllbmNlIGEgcmVmcmVzaCBhY2Nlc3MgdG9rZW4gZnVuY3Rpb24gaXMgcmVxdWlyZWQuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2hlcyB0aGUgYWNjZXNzIHRva2VuIHVzaW5nIHRoZSBwcm92aWRlZCByZWZyZXNoIGZ1bmN0aW9uXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0b2tlbiByZWZyZXNoIGZhaWxzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hUb2tlbigpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLmF1dGhPYmplY3QucmVmcmVzaEFjY2Vzc1Rva2VuRnVuYygpO1xuICAgICAgdGhpcy5hdXRoT2JqZWN0LmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHJlZnJlc2ggdG9rZW4sIHdpdGggZXJyb3I6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJlcXVlc3QgaGVhZGVycyB3aXRoIGF1dGhlbnRpY2F0aW9uXG4gICAqIEByZXR1cm5zIHtSZXF1ZXN0Q29uZmlnfSBSZXF1ZXN0IGNvbmZpZ3VyYXRpb24gd2l0aCBoZWFkZXJzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGdldEhlYWRlcigpOiBSZXF1ZXN0Q29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5hdXRoT2JqZWN0LmFjY2Vzc1Rva2VufWAsXG4gICAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgUE9TVCByZXF1ZXN0IHdpdGggdG9rZW4gcmVmcmVzaCBoYW5kbGluZ1xuICAgKiBAdGVtcGxhdGUgVCAtIFJlc3BvbnNlIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIEFQSSBlbmRwb2ludCBVUkxcbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBSZXF1ZXN0IHBheWxvYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8QXBpUmVzcG9uc2U8VD4+fSBBUEkgcmVzcG9uc2VcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZVBvc3RSZXF1ZXN0PFQ+KHVybDogc3RyaW5nLCBkYXRhOiBvYmplY3QpOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmh0dHBDbGllbnQucG9zdDxUPih1cmwsIGRhdGEsIHRoaXMuZ2V0SGVhZGVyKCkpO1xuICAgIHN3aXRjaCAocmVzcG9uc2UudHlwZSkge1xuICAgICAgY2FzZSAnYXBwbGljYXRpb24tZXJyb3InOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDAxICYmXG4gICAgICAgICAgKHJlc3BvbnNlLnJlc3BvbnNlQm9keS5lcnJvcnNbMF0uY29kZSA9PT0gJ2F1dGhvcml6YXRpb24tdG9rZW4taW52YWxpZCcgfHxcbiAgICAgICAgICAgIHJlc3BvbnNlLnJlc3BvbnNlQm9keS5lcnJvcnNbMF0uY29kZSA9PT0gJ2F1dGhvcml6YXRpb24tdG9rZW4tZXhwaXJlZCcpXG4gICAgICAgICkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaFRva2VuKCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PFQ+KHVybCwgZGF0YSwgdGhpcy5nZXRIZWFkZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGF1ZGllbmNlIHNlZ21lbnQgaW4gQ3JpdGVvXG4gICAqIEBwYXJhbSB7QXVkaWVuY2VTZWdtZW50Qm9keX0gYXVkaWVuY2VTZWdtZW50Qm9keSAtIEF1ZGllbmNlIHNlZ21lbnQgZGF0YVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBdWRpZW5jZVNlZ21lbnREYXRhPn0gQ3JlYXRlZCBhdWRpZW5jZSBzZWdtZW50IGRhdGFcbiAgICogQHRocm93cyB7RXJyb3J9IElmIGF1ZGllbmNlIHNlZ21lbnQgY3JlYXRpb24gZmFpbHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVBdWRpZW5jZVNlZ21lbnQoXG4gICAgYXVkaWVuY2VTZWdtZW50Qm9keTogQXVkaWVuY2VTZWdtZW50Qm9keSxcbiAgKTogUHJvbWlzZTxBdWRpZW5jZVNlZ21lbnREYXRhPiB7XG4gICAgY29uc3QgY3JlYXRlQXVkaWVuY2VTZWdtZW50UmVzcG9uc2UgPSBhd2FpdCB0aGlzLmV4ZWN1dGVQb3N0UmVxdWVzdDxBdWRpZW5jZVNlZ21lbnRSZXNwb25zZT4oXG4gICAgICBgL21hcmtldGluZy1zb2x1dGlvbnMvYXVkaWVuY2Utc2VnbWVudHMvY3JlYXRlYCxcbiAgICAgIGF1ZGllbmNlU2VnbWVudEJvZHksXG4gICAgKTtcbiAgICBpZiAoY3JlYXRlQXVkaWVuY2VTZWdtZW50UmVzcG9uc2UudHlwZSA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IGNyZWF0ZUF1ZGllbmNlU2VnbWVudFJlc3BvbnNlLnJlc3BvbnNlQm9keTtcbiAgICAgIGlmIChkYXRhICYmIGRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gZGF0YVswXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPVxuICAgICAgY3JlYXRlQXVkaWVuY2VTZWdtZW50UmVzcG9uc2UudHlwZSA9PT0gJ2NsaWVudC1lcnJvcidcbiAgICAgICAgPyBjcmVhdGVBdWRpZW5jZVNlZ21lbnRSZXNwb25zZS5tZXNzYWdlXG4gICAgICAgIDogSlNPTi5zdHJpbmdpZnkoY3JlYXRlQXVkaWVuY2VTZWdtZW50UmVzcG9uc2UucmVzcG9uc2VCb2R5KTtcblxuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBhdWRpZW5jZSBzZWdtZW50LCB3aXRoIGVycm9yOiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgfVxufVxuIl19