ngx-google-analytics
Version:
A simple ng-9 wrapper to load Google Analytics dependency by angular way
228 lines • 22 kB
JavaScript
import { Injectable, Inject, isDevMode } from '@angular/core';
import { NGX_GOOGLE_ANALYTICS_SETTINGS_TOKEN } from '../tokens/ngx-google-analytics-settings-token';
import { DOCUMENT } from '@angular/common';
import { NGX_GTAG_FN } from '../tokens/ngx-gtag-token';
import * as i0 from "@angular/core";
export class GoogleAnalyticsService {
constructor(settings, _document, _gtag) {
this.settings = settings;
this._document = _document;
this._gtag = _gtag;
}
get document() {
return this._document;
}
throw(err) {
if ((this.settings.enableTracing || isDevMode()) && console && console.error) {
console.error(err);
}
}
/** @todo Change this to `Object.fromEntity()` in the future... */
toKeyValue(map) {
return (map.size > 0)
? Array.from(map).reduce((obj, [key, value]) => Object.defineProperty(obj, key, { value, enumerable: true }), {})
: undefined;
}
/**
* Call native GA Tag
*/
gtag(...args) {
try {
this._gtag(...args.filter(x => x !== undefined));
}
catch (err) {
this.throw(err);
}
}
/**
* Send an event trigger to GA. It is the same as call:
* ```js
* gtag('event', 'video_auto_play_start', {
* 'event_label': 'My promotional video',
* 'event_category': 'video_auto_play'
* });
* ```
*
* @param action 'video_auto_play_start'
* @param category 'video_auto_play'
* @param label 'My promotional video'
* @param value An value to measure something
* @param interaction If user interaction is performed
*/
event(action, category, label, value, interaction, options) {
try {
const opt = new Map();
if (category) {
opt.set('event_category', category);
}
if (label) {
opt.set('event_label', label);
}
if (value) {
opt.set('value', value);
}
if (interaction !== undefined) {
opt.set('interaction', interaction);
}
if (options) {
Object
.entries(options)
.map(([key, value]) => opt.set(key, value));
}
const params = this.toKeyValue(opt);
if (params) {
this.gtag('event', action, params);
}
else {
this.gtag('event', action);
}
}
catch (error) {
this.throw(error);
}
}
/**
* Send an page view event. This is the same as
*
* ```js
* gtag('config', 'GA_TRACKING_ID', {
* 'page_title' : 'Homepage',
* 'page_path': '/home'
* });
* ```
*
* The tracking ID is injected automatically by Inject Token NGX_GOOGLE_ANALYTICS_SETTINGS_TOKEN
*
* @param path /home
* @param title Homepage
* @param location '{ page_location }'
* @param options '{ ... custom dimentions }'
*/
pageView(path, title, location, options) {
try {
const opt = new Map([['page_path', path]]);
if (title) {
opt.set('page_title', title);
}
if (location || this.document) {
opt.set('page_location', (location || this.document.location.href));
}
if (options) {
Object
.entries(options)
.map(([key, value]) => opt.set(key, value));
}
this.gtag('config', this.settings.trackingCode, this.toKeyValue(opt));
}
catch (error) {
this.throw(error);
}
}
/**
* Send an event to report a App Page View. It is the same as
*
* ```js
* gtag('event', 'screen_view', {
* 'app_name': 'myAppName',
* 'screen_name' : 'Home'
* });
*
* ```
*
* @param screen 'screen_name'
* @param appName 'app_name'
* @param appId 'app_id'
* @param appVersion 'app_version'
* @param installerId 'app_installer_id'
*/
appView(screen, appName, appId, appVersion, installerId) {
try {
const opt = new Map([['screen_name', screen], ['app_name', appName]]);
if (appId) {
opt.set('app_id', appId);
}
if (appVersion) {
opt.set('app_version', appVersion);
}
if (installerId) {
opt.set('app_installer_id', installerId);
}
this.gtag('event', 'screen_view', this.toKeyValue(opt));
}
catch (error) {
this.throw(error);
}
}
/**
* Defines persistent values on GoogleAnalytics
*
* @see https://developers.google.com/analytics/devguides/collection/gtagjs/setting-values
*
* ```js
* gtag('set', {
* 'currency': 'USD',
* 'country': 'US'
* });
* ```
*/
set(...options) {
try {
this._gtag('set', ...options);
}
catch (err) {
this.throw(err);
}
}
/**
* Send an event to GA to report an application error. It is the same as
*
* ```js
* gtag('event', 'exception', {
* 'description': 'error_description',
* 'fatal': false // set to true if the error is fatal
* });
* ```
*
* @param description 'error_description'
* @param fatal set to true if the error is fatal
*/
exception(description, fatal) {
try {
const opt = new Map();
if (description) {
opt.set('description', description);
}
if (fatal) {
opt.set('fatal', fatal);
}
const params = this.toKeyValue(opt);
if (params) {
this.gtag('event', 'exception', this.toKeyValue(opt));
}
else {
this.gtag('event', 'exception');
}
}
catch (error) {
this.throw(error);
}
}
}
GoogleAnalyticsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: GoogleAnalyticsService, deps: [{ token: NGX_GOOGLE_ANALYTICS_SETTINGS_TOKEN }, { token: DOCUMENT }, { token: NGX_GTAG_FN }], target: i0.ɵɵFactoryTarget.Injectable });
GoogleAnalyticsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: GoogleAnalyticsService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: GoogleAnalyticsService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [NGX_GOOGLE_ANALYTICS_SETTINGS_TOKEN]
}] }, { type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: undefined, decorators: [{
type: Inject,
args: [NGX_GTAG_FN]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLWFuYWx5dGljcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWdvb2dsZS1hbmFseXRpY3Mvc3JjL2xpYi9zZXJ2aWNlcy9nb29nbGUtYW5hbHl0aWNzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBR3BHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBTXZELE1BQU0sT0FBTyxzQkFBc0I7SUFNakMsWUFDZ0UsUUFBa0MsRUFDN0QsU0FBYyxFQUNYLEtBQWE7UUFGVyxhQUFRLEdBQVIsUUFBUSxDQUEwQjtRQUM3RCxjQUFTLEdBQVQsU0FBUyxDQUFLO1FBQ1gsVUFBSyxHQUFMLEtBQUssQ0FBUTtJQUNqRCxDQUFDO0lBUkwsSUFBWSxRQUFRO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBUU8sS0FBSyxDQUFDLEdBQVU7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxJQUFJLFNBQVMsRUFBRSxDQUFDLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDNUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFFRCxrRUFBa0U7SUFDMUQsVUFBVSxDQUFDLEdBQXFCO1FBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNuQixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFN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QkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVFJLE1BQU07MkJBQUMsbUNBQW1DOzswQkFDMUMsTUFBTTsyQkFBQyxRQUFROzswQkFDZixNQUFNOzJCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdYX0dPT0dMRV9BTkFMWVRJQ1NfU0VUVElOR1NfVE9LRU4gfSBmcm9tICcuLi90b2tlbnMvbmd4LWdvb2dsZS1hbmFseXRpY3Mtc2V0dGluZ3MtdG9rZW4nO1xuaW1wb3J0IHsgSUdvb2dsZUFuYWx5dGljc1NldHRpbmdzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9pLWdvb2dsZS1hbmFseXRpY3Mtc2V0dGluZ3MnO1xuaW1wb3J0IHsgR2FBY3Rpb25FbnVtIH0gZnJvbSAnLi4vZW51bXMvZ2EtYWN0aW9uLmVudW0nO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTkdYX0dUQUdfRk4gfSBmcm9tICcuLi90b2tlbnMvbmd4LWd0YWctdG9rZW4nO1xuaW1wb3J0IHsgR3RhZ0ZuIH0gZnJvbSAnLi4vdHlwZXMvZ3RhZy50eXBlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgR29vZ2xlQW5hbHl0aWNzU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBnZXQgZG9jdW1lbnQoKTogRG9jdW1lbnQge1xuICAgIHJldHVybiB0aGlzLl9kb2N1bWVudDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoTkdYX0dPT0dMRV9BTkFMWVRJQ1NfU0VUVElOR1NfVE9LRU4pIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3M6IElHb29nbGVBbmFseXRpY3NTZXR0aW5ncyxcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIHJlYWRvbmx5IF9kb2N1bWVudDogYW55LFxuICAgIEBJbmplY3QoTkdYX0dUQUdfRk4pIHByaXZhdGUgcmVhZG9ubHkgX2d0YWc6IEd0YWdGblxuICApIHsgfVxuXG4gIHByaXZhdGUgdGhyb3coZXJyOiBFcnJvcikge1xuICAgIGlmICgodGhpcy5zZXR0aW5ncy5lbmFibGVUcmFjaW5nIHx8IGlzRGV2TW9kZSgpKSAmJiBjb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKiogQHRvZG8gQ2hhbmdlIHRoaXMgdG8gYE9iamVjdC5mcm9tRW50aXR5KClgIGluIHRoZSBmdXR1cmUuLi4gKi9cbiAgcHJpdmF0ZSB0b0tleVZhbHVlKG1hcDogTWFwPHN0cmluZywgYW55Pik6IHsgW3BhcmFtOiBzdHJpbmddOiBhbnkgfSB8IHZvaWQge1xuICAgIHJldHVybiAobWFwLnNpemUgPiAwKVxuICAgICAgPyBBcnJheS5mcm9tKG1hcCkucmVkdWNlKFxuICAgICAgICAob2JqLCBba2V5LCB2YWx1ZV0pID0+IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSB9KSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgbmF0aXZlIEdBIFRhZ1xuICAgKi9cbiAgZ3RhZyguLi5hcmdzOiBhbnlbXSkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9ndGFnKC4uLmFyZ3MuZmlsdGVyKHggPT4geCAhPT0gdW5kZWZpbmVkKSk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHRoaXMudGhyb3coZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhbiBldmVudCB0cmlnZ2VyIHRvIEdBLiBJdCBpcyB0aGUgc2FtZSBhcyBjYWxsOlxuICAgKiBgYGBqc1xuICAgKiBndGFnKCdldmVudCcsICd2aWRlb19hdXRvX3BsYXlfc3RhcnQnLCB7XG4gICAqICAgJ2V2ZW50X2xhYmVsJzogJ015IHByb21vdGlvbmFsIHZpZGVvJyxcbiAgICogICAnZXZlbnRfY2F0ZWdvcnknOiAndmlkZW9fYXV0b19wbGF5J1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBhY3Rpb24gJ3ZpZGVvX2F1dG9fcGxheV9zdGFydCdcbiAgICogQHBhcmFtIGNhdGVnb3J5ICd2aWRlb19hdXRvX3BsYXknXG4gICAqIEBwYXJhbSBsYWJlbCAnTXkgcHJvbW90aW9uYWwgdmlkZW8nXG4gICAqIEBwYXJhbSB2YWx1ZSBBbiB2YWx1ZSB0byBtZWFzdXJlIHNvbWV0aGluZ1xuICAgKiBAcGFyYW0gaW50ZXJhY3Rpb24gSWYgdXNlciBpbnRlcmFjdGlvbiBpcyBwZXJmb3JtZWRcbiAgICovXG4gIGV2ZW50KGFjdGlvbjogR2FBY3Rpb25FbnVtIHwgc3RyaW5nLCBjYXRlZ29yeT86IHN0cmluZywgbGFiZWw/OiBzdHJpbmcsIHZhbHVlPzogbnVtYmVyLCBpbnRlcmFjdGlvbj86IGJvb2xlYW4sIG9wdGlvbnM/OiBPYmplY3QpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3B0ID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICAgIGlmIChjYXRlZ29yeSkge1xuICAgICAgICBvcHQuc2V0KCdldmVudF9jYXRlZ29yeScsIGNhdGVnb3J5KTtcbiAgICAgIH1cbiAgICAgIGlmIChsYWJlbCkge1xuICAgICAgICBvcHQuc2V0KCdldmVudF9sYWJlbCcsIGxhYmVsKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBvcHQuc2V0KCd2YWx1ZScsIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChpbnRlcmFjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdC5zZXQoJ2ludGVyYWN0aW9uJywgaW50ZXJhY3Rpb24pO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgT2JqZWN0XG4gICAgICAgICAgLmVudHJpZXMob3B0aW9ucylcbiAgICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IG9wdC5zZXQoa2V5LCB2YWx1ZSkpO1xuICAgICAgfSAgICAgIFxuICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy50b0tleVZhbHVlKG9wdCk7XG4gICAgICBpZiAocGFyYW1zKSB7XG4gICAgICAgIHRoaXMuZ3RhZygnZXZlbnQnLCBhY3Rpb24gYXMgc3RyaW5nLCBwYXJhbXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ndGFnKCdldmVudCcsIGFjdGlvbiBhcyBzdHJpbmcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHRoaXMudGhyb3coZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGFuIHBhZ2UgdmlldyBldmVudC4gVGhpcyBpcyB0aGUgc2FtZSBhc1xuICAgKlxuICAgKiBgYGBqc1xuICAgKiBndGFnKCdjb25maWcnLCAnR0FfVFJBQ0tJTkdfSUQnLCB7XG4gICAqICAgJ3BhZ2VfdGl0bGUnIDogJ0hvbWVwYWdlJyxcbiAgICogICAncGFnZV9wYXRoJzogJy9ob21lJ1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIFRoZSB0cmFja2luZyBJRCBpcyBpbmplY3RlZCBhdXRvbWF0aWNhbGx5IGJ5IEluamVjdCBUb2tlbiBOR1hfR09PR0xFX0FOQUxZVElDU19TRVRUSU5HU19UT0tFTlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAvaG9tZVxuICAgKiBAcGFyYW0gdGl0bGUgSG9tZXBhZ2VcbiAgICogQHBhcmFtIGxvY2F0aW9uICd7IHBhZ2VfbG9jYXRpb24gfSdcbiAgICogQHBhcmFtIG9wdGlvbnMgJ3sgLi4uIGN1c3RvbSBkaW1lbnRpb25zIH0nXG4gICAqL1xuICBwYWdlVmlldyggcGF0aDogc3RyaW5nLCB0aXRsZT86IHN0cmluZywgbG9jYXRpb24/OiBzdHJpbmcsIG9wdGlvbnM/OiBPYmplY3QpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3B0ID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oW1sncGFnZV9wYXRoJywgcGF0aF1dKTtcbiAgICAgIGlmICh0aXRsZSkge1xuICAgICAgICBvcHQuc2V0KCdwYWdlX3RpdGxlJywgdGl0bGUpO1xuICAgICAgfVxuICAgICAgaWYgKGxvY2F0aW9uIHx8IHRoaXMuZG9jdW1lbnQpIHtcbiAgICAgICAgb3B0LnNldCgncGFnZV9sb2NhdGlvbicsIChsb2NhdGlvbiB8fCB0aGlzLmRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgIE9iamVjdFxuICAgICAgICAgIC5lbnRyaWVzKG9wdGlvbnMpXG4gICAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBvcHQuc2V0KGtleSwgdmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ3RhZygnY29uZmlnJywgdGhpcy5zZXR0aW5ncy50cmFja2luZ0NvZGUsIHRoaXMudG9LZXlWYWx1ZShvcHQpKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLnRocm93KGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhbiBldmVudCB0byByZXBvcnQgYSBBcHAgUGFnZSBWaWV3LiBJdCBpcyB0aGUgc2FtZSBhc1xuICAgKlxuICAgKiBgYGBqc1xuICAgKiBndGFnKCdldmVudCcsICdzY3JlZW5fdmlldycsIHtcbiAgICogICAnYXBwX25hbWUnOiAnbXlBcHBOYW1lJyxcbiAgICogICAnc2NyZWVuX25hbWUnIDogJ0hvbWUnXG4gICAqIH0pO1xuICAgKlxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHNjcmVlbiAnc2NyZWVuX25hbWUnXG4gICAqIEBwYXJhbSBhcHBOYW1lICdhcHBfbmFtZSdcbiAgICogQHBhcmFtIGFwcElkICdhcHBfaWQnXG4gICAqIEBwYXJhbSBhcHBWZXJzaW9uICdhcHBfdmVyc2lvbidcbiAgICogQHBhcmFtIGluc3RhbGxlcklkICdhcHBfaW5zdGFsbGVyX2lkJ1xuICAgKi9cbiAgYXBwVmlldyhzY3JlZW46IHN0cmluZywgYXBwTmFtZTogc3RyaW5nLCBhcHBJZD86IHN0cmluZywgYXBwVmVyc2lvbj86IHN0cmluZywgaW5zdGFsbGVySWQ/OiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3B0ID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oW1snc2NyZWVuX25hbWUnLCBzY3JlZW5dLCBbJ2FwcF9uYW1lJywgYXBwTmFtZV1dKTtcbiAgICAgIGlmIChhcHBJZCkge1xuICAgICAgICBvcHQuc2V0KCdhcHBfaWQnLCBhcHBJZCk7XG4gICAgICB9XG4gICAgICBpZiAoYXBwVmVyc2lvbikge1xuICAgICAgICBvcHQuc2V0KCdhcHBfdmVyc2lvbicsIGFwcFZlcnNpb24pO1xuICAgICAgfVxuICAgICAgaWYgKGluc3RhbGxlcklkKSB7XG4gICAgICAgIG9wdC5zZXQoJ2FwcF9pbnN0YWxsZXJfaWQnLCBpbnN0YWxsZXJJZCk7XG4gICAgICB9XG4gICAgICB0aGlzLmd0YWcoJ2V2ZW50JywgJ3NjcmVlbl92aWV3JywgdGhpcy50b0tleVZhbHVlKG9wdCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHRoaXMudGhyb3coZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHBlcnNpc3RlbnQgdmFsdWVzIG9uIEdvb2dsZUFuYWx5dGljc1xuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2FuYWx5dGljcy9kZXZndWlkZXMvY29sbGVjdGlvbi9ndGFnanMvc2V0dGluZy12YWx1ZXNcbiAgICpcbiAgICogYGBganNcbiAgICogZ3RhZygnc2V0Jywge1xuICAgKiAgICdjdXJyZW5jeSc6ICdVU0QnLFxuICAgKiAgICdjb3VudHJ5JzogJ1VTJ1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBzZXQoLi4ub3B0aW9uczogQXJyYXk8YW55Pikge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9ndGFnKCdzZXQnLCAuLi5vcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgdGhpcy50aHJvdyhlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGFuIGV2ZW50IHRvIEdBIHRvIHJlcG9ydCBhbiBhcHBsaWNhdGlvbiBlcnJvci4gSXQgaXMgdGhlIHNhbWUgYXNcbiAgICpcbiAgICogYGBganNcbiAgICogZ3RhZygnZXZlbnQnLCAnZXhjZXB0aW9uJywge1xuICAgKiAgICdkZXNjcmlwdGlvbic6ICdlcnJvcl9kZXNjcmlwdGlvbicsXG4gICAqICAgJ2ZhdGFsJzogZmFsc2UgICAvLyBzZXQgdG8gdHJ1ZSBpZiB0aGUgZXJyb3IgaXMgZmF0YWxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gJ2Vycm9yX2Rlc2NyaXB0aW9uJ1xuICAgKiBAcGFyYW0gZmF0YWwgc2V0IHRvIHRydWUgaWYgdGhlIGVycm9yIGlzIGZhdGFsXG4gICAqL1xuICBleGNlcHRpb24oZGVzY3JpcHRpb24/OiBzdHJpbmcsIGZhdGFsPzogYm9vbGVhbikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvcHQgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIG9wdC5zZXQoJ2Rlc2NyaXB0aW9uJywgZGVzY3JpcHRpb24pO1xuICAgICAgfVxuICAgICAgaWYgKGZhdGFsKSB7XG4gICAgICAgIG9wdC5zZXQoJ2ZhdGFsJywgZmF0YWwpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy50b0tleVZhbHVlKG9wdCk7XG4gICAgICBpZiAocGFyYW1zKSB7XG4gICAgICAgIHRoaXMuZ3RhZygnZXZlbnQnLCAnZXhjZXB0aW9uJywgdGhpcy50b0tleVZhbHVlKG9wdCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ndGFnKCdldmVudCcsICdleGNlcHRpb24nKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLnRocm93KGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==