@pointerstack/ngx-cookie-storage
Version:
An Angular cookie service
380 lines (379 loc) • 26.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Injectable, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
var NgxCookieStorageService = /** @class */ (function () {
function NgxCookieStorageService(
// The type `Document` may not be used here. Although a fix is on its way,
// we will go with `any` for now to support Angular 2.4.x projects.
// Issue: https://github.com/angular/angular/issues/12631
// Fix: https://github.com/angular/angular/pull/14894
document) {
this.document = document;
// To avoid issues with server side prerendering, check if `document` is defined.
this.documentIsAccessible = document !== undefined;
}
/**
* PARSER
*
* Function to parse document.cookie string and extract
* cookiename:value pairs.
* @return {?}
*/
NgxCookieStorageService.prototype.parser = /**
* PARSER
*
* Function to parse document.cookie string and extract
* cookiename:value pairs.
* @return {?}
*/
function () {
if (!this.documentIsAccessible) {
return {};
}
/** @type {?} */
var cookies = {};
/** @type {?} */
var document = this.document;
if (document.cookie && document.cookie !== '') {
/** @type {?} */
var split = document.cookie.split(';');
for (var i = 0; i < split.length; i += 1) {
/** @type {?} */
var currentCookie = split[i].split('=');
currentCookie[0] = currentCookie[0].replace(/^ /, '');
cookies[decodeURIComponent(currentCookie[0])] = decodeURIComponent(currentCookie[1]);
}
}
return cookies;
};
/**
* GET
*
* Function to get value from cookie
*
* @param {?} name Cookie Name
* @param {?=} parsedCookie Parsed Cookie
* @return {?}
*/
NgxCookieStorageService.prototype.get = /**
* GET
*
* Function to get value from cookie
*
* @param {?} name Cookie Name
* @param {?=} parsedCookie Parsed Cookie
* @return {?}
*/
function (name, parsedCookie) {
if (!parsedCookie) {
parsedCookie = this.parser();
}
return parsedCookie[name];
};
/**
* GETALL
*
* Function to get all stored cookie.
* @return {?}
*/
NgxCookieStorageService.prototype.getAll = /**
* GETALL
*
* Function to get all stored cookie.
* @return {?}
*/
function () {
return this.parser();
};
/**
* GET-ASYNC
*
* Function to get cookie value as promise.
*
* @param {?} name {string}
* @return {?}
*/
NgxCookieStorageService.prototype.getAsync = /**
* GET-ASYNC
*
* Function to get cookie value as promise.
*
* @param {?} name {string}
* @return {?}
*/
function (name) {
var _this = this;
/** @type {?} */
var _getAsyncPromiseCb = function (resolve, reject) {
if (!_this.documentIsAccessible) {
return reject(new Error("document.cookie is not accessible"));
}
return resolve(_this.get(name));
};
return new Promise(_getAsyncPromiseCb);
};
/**
* GETALL-ASYNC
*
* Function to get all stored cookie value as promise.
*
* @return {?}
*/
NgxCookieStorageService.prototype.getAllAsync = /**
* GETALL-ASYNC
*
* Function to get all stored cookie value as promise.
*
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var _getAsyncPromiseCb = function (resolve, reject) {
if (!_this.documentIsAccessible) {
return reject(new Error("document.cookie is not accessible"));
}
return resolve(_this.getAll());
};
return new Promise(_getAsyncPromiseCb);
};
/**
* SET
*
* Function to set cookie
*
* @param {?} name Cookie name
* @param {?} value Cookie value
* @param {?=} expires Number of days until the cookies expires or an actual `Date`
* @param {?=} path Cookie path
* @param {?=} domain Cookie domain
* @param {?=} secure Secure flag
* @return {?}
*/
NgxCookieStorageService.prototype.set = /**
* SET
*
* Function to set cookie
*
* @param {?} name Cookie name
* @param {?} value Cookie value
* @param {?=} expires Number of days until the cookies expires or an actual `Date`
* @param {?=} path Cookie path
* @param {?=} domain Cookie domain
* @param {?=} secure Secure flag
* @return {?}
*/
function (name, value, expires, path, domain, secure) {
if (!this.documentIsAccessible) {
return;
}
/** @type {?} */
var cookieString = encodeURIComponent(name) + '=' + encodeURIComponent(value) + ';';
if (expires) {
if (typeof expires === 'number') {
/** @type {?} */
var dateExpires = new Date(new Date().getTime() + expires * 1000 * 60 * 60 * 24);
cookieString += 'expires=' + dateExpires.toUTCString() + ';';
}
else {
cookieString += 'expires=' + expires.toUTCString() + ';';
}
}
if (path) {
cookieString += 'path=' + path + ';';
}
if (domain) {
cookieString += 'domain=' + domain + ';';
}
if (secure) {
cookieString += 'secure;';
}
this.document.cookie = cookieString;
};
/**
* SET-ASYNC
*
* Function to set cookie asynchronously.
*
* @param {?} name
* @param {?} value
* @param {?=} expires
* @param {?=} path
* @param {?=} domain
* @param {?=} secure
* @return {?}
*/
NgxCookieStorageService.prototype.setAsync = /**
* SET-ASYNC
*
* Function to set cookie asynchronously.
*
* @param {?} name
* @param {?} value
* @param {?=} expires
* @param {?=} path
* @param {?=} domain
* @param {?=} secure
* @return {?}
*/
function (name, value, expires, path, domain, secure) {
var _this = this;
/** @type {?} */
var _setAsync = function (resolve, reject) {
if (!_this.documentIsAccessible) {
return reject(new Error("document.cookie is not accessible"));
}
_this.set(name, value, expires, path, domain, secure);
setTimeout(function () {
return resolve();
}, 50);
};
return new Promise(_setAsync);
};
/**
* DELETE
*
* Function to delete a cookie
*
* @param {?} name Cookie name
* @param {?=} path Cookie path
* @param {?=} domain Cookie domain
* @return {?}
*/
NgxCookieStorageService.prototype.delete = /**
* DELETE
*
* Function to delete a cookie
*
* @param {?} name Cookie name
* @param {?=} path Cookie path
* @param {?=} domain Cookie domain
* @return {?}
*/
function (name, path, domain) {
if (!this.documentIsAccessible) {
return;
}
this.set(name, '', new Date(new Date().getTime() - 1000), path, domain);
};
/**
* DELETEALL
*
* Function to delete all cookie
*
* @param {?=} path Cookie path
* @param {?=} domain Cookie domain
* @return {?}
*/
NgxCookieStorageService.prototype.deleteAll = /**
* DELETEALL
*
* Function to delete all cookie
*
* @param {?=} path Cookie path
* @param {?=} domain Cookie domain
* @return {?}
*/
function (path, domain) {
if (!this.documentIsAccessible) {
return;
}
/** @type {?} */
var cookies = this.getAll();
for (var cookieName in cookies) {
if (cookies.hasOwnProperty(cookieName)) {
this.delete(cookieName, path, domain);
}
}
};
/**
* DELETE-ASYNC
*
* Function to delete a cookie asynchronously.
*
* @param {?} name Cookie name
* @param {?=} path Cookie path
* @param {?=} domain Cookie domain
* @return {?}
*/
NgxCookieStorageService.prototype.deleteAsync = /**
* DELETE-ASYNC
*
* Function to delete a cookie asynchronously.
*
* @param {?} name Cookie name
* @param {?=} path Cookie path
* @param {?=} domain Cookie domain
* @return {?}
*/
function (name, path, domain) {
var _this = this;
/** @type {?} */
var _deleteAsyncPromiseCb = function (resolve, reject) {
if (!_this.documentIsAccessible) {
return reject(new Error("document.cookie is not accessible"));
}
_this.delete(name, path, domain);
setTimeout(function () {
return resolve();
}, 50);
};
return new Promise(_deleteAsyncPromiseCb);
};
/**
* DELETEALL-ASYNC
*
* Function to delete all cookie asynchronously.
*
* @param {?=} path Cookie path
* @param {?=} domain Cookie domain
* @return {?}
*/
NgxCookieStorageService.prototype.deleteAllAsync = /**
* DELETEALL-ASYNC
*
* Function to delete all cookie asynchronously.
*
* @param {?=} path Cookie path
* @param {?=} domain Cookie domain
* @return {?}
*/
function (path, domain) {
var _this = this;
/** @type {?} */
var _deleteAllAsyncPromiseCb = function (resolve, reject) {
if (!_this.documentIsAccessible) {
return reject(new Error("document.cookie is not accessible"));
}
_this.deleteAll(path, domain);
setTimeout(function () {
return resolve();
}, 50);
};
return new Promise(_deleteAllAsyncPromiseCb);
};
NgxCookieStorageService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
NgxCookieStorageService.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
]; };
/** @nocollapse */ NgxCookieStorageService.ngInjectableDef = i0.defineInjectable({ factory: function NgxCookieStorageService_Factory() { return new NgxCookieStorageService(i0.inject(i1.DOCUMENT)); }, token: NgxCookieStorageService, providedIn: "root" });
return NgxCookieStorageService;
}());
export { NgxCookieStorageService };
if (false) {
/** @type {?} */
NgxCookieStorageService.prototype.documentIsAccessible;
/** @type {?} */
NgxCookieStorageService.prototype.document;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWNvb2tpZS1zdG9yYWdlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AcG9pbnRlcnN0YWNrL25neC1jb29raWUtc3RvcmFnZS8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtY29va2llLXN0b3JhZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBSUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0lBU3pDOzs7OztJQUs0QixRQUFhO1FBQWIsYUFBUSxHQUFSLFFBQVEsQ0FBSzs7UUFHdkMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFFBQVEsS0FBSyxTQUFTLENBQUM7S0FDcEQ7Ozs7Ozs7O0lBU08sd0NBQU07Ozs7Ozs7O1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM5QixPQUFPLEVBQUUsQ0FBQztTQUNYOztRQUNELElBQU0sT0FBTyxHQUFPLEVBQUUsQ0FBQzs7UUFDdkIsSUFBTSxRQUFRLEdBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNwQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUU7O1lBQzdDLElBQU0sS0FBSyxHQUFrQixRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFOztnQkFDeEMsSUFBTSxhQUFhLEdBQWtCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3pELGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUks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TSxTQUFDLFFBQVE7OztrQ0FuQnBCOztTQVVhLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIE5PVEU6IFxuLy8gTWFueSBvZiBmb2xsb3dpbmcgY29kZSBhcmUgaW5zcGlyZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vN2xlYWRzL25neC1jb29raWUtc2VydmljZVxuLy8gVGhhbmtzIHRvIDdsZWFkcyBHbWJIIFRlYW0uXG4vL1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIE5neENvb2tpZVN0b3JhZ2VTZXJ2aWNlIHtcblxuICBwcml2YXRlIGRvY3VtZW50SXNBY2Nlc3NpYmxlOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIC8vIFRoZSB0eXBlIGBEb2N1bWVudGAgbWF5IG5vdCBiZSB1c2VkIGhlcmUuIEFsdGhvdWdoIGEgZml4IGlzIG9uIGl0cyB3YXksXG4gICAgLy8gd2Ugd2lsbCBnbyB3aXRoIGBhbnlgIGZvciBub3cgdG8gc3VwcG9ydCBBbmd1bGFyIDIuNC54IHByb2plY3RzLlxuICAgIC8vIElzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xMjYzMVxuICAgIC8vIEZpeDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9wdWxsLzE0ODk0XG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogYW55XG4gICkge1xuICAgIC8vIFRvIGF2b2lkIGlzc3VlcyB3aXRoIHNlcnZlciBzaWRlIHByZXJlbmRlcmluZywgY2hlY2sgaWYgYGRvY3VtZW50YCBpcyBkZWZpbmVkLlxuICAgIHRoaXMuZG9jdW1lbnRJc0FjY2Vzc2libGUgPSBkb2N1bWVudCAhPT0gdW5kZWZpbmVkO1xuICB9XG5cblxuICAvKipcbiAgICogUEFSU0VSXG4gICAqIFxuICAgKiBGdW5jdGlvbiB0byBwYXJzZSBkb2N1bWVudC5jb29raWUgc3RyaW5nIGFuZCBleHRyYWN0XG4gICAqIGNvb2tpZW5hbWU6dmFsdWUgcGFpcnMuXG4gICAqL1xuICBwcml2YXRlIHBhcnNlcigpOiBhbnkge1xuICAgIGlmICghdGhpcy5kb2N1bWVudElzQWNjZXNzaWJsZSkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCBjb29raWVzOiB7fSA9IHt9O1xuICAgIGNvbnN0IGRvY3VtZW50OiBhbnkgPSB0aGlzLmRvY3VtZW50O1xuICAgIGlmIChkb2N1bWVudC5jb29raWUgJiYgZG9jdW1lbnQuY29va2llICE9PSAnJykge1xuICAgICAgY29uc3Qgc3BsaXQ6IEFycmF5PHN0cmluZz4gPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3QgY3VycmVudENvb2tpZTogQXJyYXk8c3RyaW5nPiA9IHNwbGl0W2ldLnNwbGl0KCc9Jyk7XG4gICAgICAgIGN1cnJlbnRDb29raWVbMF0gPSBjdXJyZW50Q29va2llWzBdLnJlcGxhY2UoL14gLywgJycpO1xuICAgICAgICBjb29raWVzW2RlY29kZVVSSUNvbXBvbmVudChjdXJyZW50Q29va2llWzBdKV0gPSBkZWNvZGVVUklDb21wb25lbnQoY3VycmVudENvb2tpZVsxXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb29raWVzO1xuICB9XG5cblxuICAvKipcbiAgICogR0VUXG4gICAqIFxuICAgKiBGdW5jdGlvbiB0byBnZXQgdmFsdWUgZnJvbSBjb29raWVcbiAgICogXG4gICAqIEBwYXJhbSBuYW1lIENvb2tpZSBOYW1lXG4gICAqIEBwYXJhbSBwYXJzZWRDb29raWUgUGFyc2VkIENvb2tpZVxuICAgKi9cbiAgcHVibGljIGdldChuYW1lOiBzdHJpbmcsIHBhcnNlZENvb2tpZT86IHt9KTogdm9pZCB8IHN0cmluZyB7XG4gICAgaWYgKCFwYXJzZWRDb29raWUpIHtcbiAgICAgIHBhcnNlZENvb2tpZSA9IHRoaXMucGFyc2VyKCk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZWRDb29raWVbbmFtZV07XG4gIH1cblxuXG4gIC8qKlxuICAgKiBHRVRBTExcbiAgICogXG4gICAqIEZ1bmN0aW9uIHRvIGdldCBhbGwgc3RvcmVkIGNvb2tpZS5cbiAgICovXG4gIHB1YmxpYyBnZXRBbGwoKTogdm9pZCB8IHt9IHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdFVC1BU1lOQ1xuICAgKiBcbiAgICogRnVuY3Rpb24gdG8gZ2V0IGNvb2tpZSB2YWx1ZSBhcyBwcm9taXNlLlxuICAgKiBcbiAgICogQHBhcmFtIG5hbWUge3N0cmluZ31cbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBnZXRBc3luYyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQgfCBzdHJpbmcgfCBFcnJvcj4ge1xuICAgIGNvbnN0IF9nZXRBc3luY1Byb21pc2VDYiA9IChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghdGhpcy5kb2N1bWVudElzQWNjZXNzaWJsZSkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgZG9jdW1lbnQuY29va2llIGlzIG5vdCBhY2Nlc3NpYmxlYCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmUodGhpcy5nZXQobmFtZSkpO1xuICAgIH07XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKF9nZXRBc3luY1Byb21pc2VDYik7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBHRVRBTEwtQVNZTkNcbiAgICogXG4gICAqIEZ1bmN0aW9uIHRvIGdldCBhbGwgc3RvcmVkIGNvb2tpZSB2YWx1ZSBhcyBwcm9taXNlLlxuICAgKiBcbiAgICovXG4gIHB1YmxpYyBnZXRBbGxBc3luYygpOiBQcm9taXNlPHZvaWQgfCBzdHJpbmcgfCBFcnJvcj4ge1xuICAgIGNvbnN0IF9nZXRBc3luY1Byb21pc2VDYiA9IChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghdGhpcy5kb2N1bWVudElzQWNjZXNzaWJsZSkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgZG9jdW1lbnQuY29va2llIGlzIG5vdCBhY2Nlc3NpYmxlYCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmUodGhpcy5nZXRBbGwoKSk7XG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoX2dldEFzeW5jUHJvbWlzZUNiKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFNFVFxuICAgKiBcbiAgICogRnVuY3Rpb24gdG8gc2V0IGNvb2tpZVxuICAgKiBcbiAgICogQHBhcmFtIG5hbWUgICAgQ29va2llIG5hbWVcbiAgICogQHBhcmFtIHZhbHVlICAgQ29va2llIHZhbHVlXG4gICAqIEBwYXJhbSBleHBpcmVzIE51bWJlciBvZiBkYXlzIHVudGlsIHRoZSBjb29raWVzIGV4cGlyZXMgb3IgYW4gYWN0dWFsIGBEYXRlYFxuICAgKiBAcGFyYW0gcGF0aCAgICBDb29raWUgcGF0aFxuICAgKiBAcGFyYW0gZG9tYWluICBDb29raWUgZG9tYWluXG4gICAqIEBwYXJhbSBzZWN1cmUgIFNlY3VyZSBmbGFnXG4gICAqL1xuICBwdWJsaWMgc2V0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIGV4cGlyZXM/OiBudW1iZXIgfCBEYXRlLFxuICAgIHBhdGg/OiBzdHJpbmcsXG4gICAgZG9tYWluPzogc3RyaW5nLFxuICAgIHNlY3VyZT86IGJvb2xlYW5cbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGNvb2tpZVN0cmluZzogc3RyaW5nID0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSArICc7JztcblxuICAgIGlmIChleHBpcmVzKSB7XG4gICAgICBpZiAodHlwZW9mIGV4cGlyZXMgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbnN0IGRhdGVFeHBpcmVzOiBEYXRlID0gbmV3IERhdGUobmV3IERhdGUoKS5nZXRUaW1lKCkgKyBleHBpcmVzICogMTAwMCAqIDYwICogNjAgKiAyNCk7XG5cbiAgICAgICAgY29va2llU3RyaW5nICs9ICdleHBpcmVzPScgKyBkYXRlRXhwaXJlcy50b1VUQ1N0cmluZygpICsgJzsnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29va2llU3RyaW5nICs9ICdleHBpcmVzPScgKyBleHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAnOyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAgIGNvb2tpZVN0cmluZyArPSAncGF0aD0nICsgcGF0aCArICc7JztcbiAgICB9XG5cbiAgICBpZiAoZG9tYWluKSB7XG4gICAgICBjb29raWVTdHJpbmcgKz0gJ2RvbWFpbj0nICsgZG9tYWluICsgJzsnO1xuICAgIH1cblxuICAgIGlmIChzZWN1cmUpIHtcbiAgICAgIGNvb2tpZVN0cmluZyArPSAnc2VjdXJlOyc7XG4gICAgfVxuXG4gICAgdGhpcy5kb2N1bWVudC5jb29raWUgPSBjb29raWVTdHJpbmc7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBTRVQtQVNZTkNcbiAgICogXG4gICAqIEZ1bmN0aW9uIHRvIHNldCBjb29raWUgYXN5bmNocm9ub3VzbHkuXG4gICAqIFxuICAgKiBAcGFyYW0gbmFtZSBcbiAgICogQHBhcmFtIHZhbHVlIFxuICAgKiBAcGFyYW0gZXhwaXJlcyBcbiAgICogQHBhcmFtIHBhdGggXG4gICAqIEBwYXJhbSBkb21haW4gXG4gICAqIEBwYXJhbSBzZWN1cmUgXG4gICAqL1xuICBwdWJsaWMgc2V0QXN5bmMoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgZXhwaXJlcz86IG51bWJlciB8IERhdGUsXG4gICAgcGF0aD86IHN0cmluZyxcbiAgICBkb21haW4/OiBzdHJpbmcsXG4gICAgc2VjdXJlPzogYm9vbGVhblxuICApOiBQcm9taXNlPHZvaWQgfCBFcnJvcj4ge1xuICAgIGNvbnN0IF9zZXRBc3luYyA9IChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghdGhpcy5kb2N1bWVudElzQWNjZXNzaWJsZSkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgZG9jdW1lbnQuY29va2llIGlzIG5vdCBhY2Nlc3NpYmxlYCkpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXQobmFtZSwgdmFsdWUsIGV4cGlyZXMsIHBhdGgsIGRvbWFpbiwgc2VjdXJlKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgfSwgNTApO1xuICAgIH07XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKF9zZXRBc3luYyk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBERUxFVEVcbiAgICogXG4gICAqIEZ1bmN0aW9uIHRvIGRlbGV0ZSBhIGNvb2tpZVxuICAgKiBcbiAgICogQHBhcmFtIG5hbWUgICBDb29raWUgbmFtZVxuICAgKiBAcGFyYW0gcGF0aCAgIENvb2tpZSBwYXRoXG4gICAqIEBwYXJhbSBkb21haW4gQ29va2llIGRvbWFpblxuICAgKi9cbiAgcHVibGljIGRlbGV0ZShuYW1lOiBzdHJpbmcsIHBhdGg/OiBzdHJpbmcsIGRvbWFpbj86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kb2N1bWVudElzQWNjZXNzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldChuYW1lLCAnJywgbmV3IERhdGUobmV3IERhdGUoKS5nZXRUaW1lKCkgLSAxMDAwKSwgcGF0aCwgZG9tYWluKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIERFTEVURUFMTFxuICAgKiBcbiAgICogRnVuY3Rpb24gdG8gZGVsZXRlIGFsbCBjb29raWVcbiAgICogXG4gICAqIEBwYXJhbSBwYXRoICAgQ29va2llIHBhdGhcbiAgICogQHBhcmFtIGRvbWFpbiBDb29raWUgZG9tYWluXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlQWxsKHBhdGg/OiBzdHJpbmcsIGRvbWFpbj86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kb2N1bWVudElzQWNjZXNzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb29raWVzOiBhbnkgPSB0aGlzLmdldEFsbCgpO1xuICAgIGZvciAoY29uc3QgY29va2llTmFtZSBpbiBjb29raWVzKSB7XG4gICAgICBpZiAoY29va2llcy5oYXNPd25Qcm9wZXJ0eShjb29raWVOYW1lKSkge1xuICAgICAgICB0aGlzLmRlbGV0ZShjb29raWVOYW1lLCBwYXRoLCBkb21haW4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIERFTEVURS1BU1lOQ1xuICAgKiBcbiAgICogRnVuY3Rpb24gdG8gZGVsZXRlIGEgY29va2llIGFzeW5jaHJvbm91c2x5LlxuICAgKiBcbiAgICogQHBhcmFtIG5hbWUgICBDb29raWUgbmFtZVxuICAgKiBAcGFyYW0gcGF0aCAgIENvb2tpZSBwYXRoXG4gICAqIEBwYXJhbSBkb21haW4gQ29va2llIGRvbWFpblxuICAgKi9cbiAgcHVibGljIGRlbGV0ZUFzeW5jKG5hbWU6IHN0cmluZywgcGF0aD86IHN0cmluZywgZG9tYWluPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkIHwgRXJyb3I+IHtcbiAgICBjb25zdCBfZGVsZXRlQXN5bmNQcm9taXNlQ2IgPSAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZG9jdW1lbnRJc0FjY2Vzc2libGUpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYGRvY3VtZW50LmNvb2tpZSBpcyBub3QgYWNjZXNzaWJsZWApKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVsZXRlKG5hbWUsIHBhdGgsIGRvbWFpbik7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgIH0sIDUwKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKF9kZWxldGVBc3luY1Byb21pc2VDYik7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBERUxFVEVBTEwtQVNZTkNcbiAgICogXG4gICAqIEZ1bmN0aW9uIHRvIGRlbGV0ZSBhbGwgY29va2llIGFzeW5jaHJvbm91c2x5LlxuICAgKiBcbiAgICogQHBhcmFtIHBhdGggICBDb29raWUgcGF0aFxuICAgKiBAcGFyYW0gZG9tYWluIENvb2tpZSBkb21haW5cbiAgICovXG4gIHB1YmxpYyBkZWxldGVBbGxBc3luYyhwYXRoPzogc3RyaW5nLCBkb21haW4/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQgfCBFcnJvcj4ge1xuICAgIGNvbnN0IF9kZWxldGVBbGxBc3luY1Byb21pc2VDYiA9IChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghdGhpcy5kb2N1bWVudElzQWNjZXNzaWJsZSkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgZG9jdW1lbnQuY29va2llIGlzIG5vdCBhY2Nlc3NpYmxlYCkpO1xuICAgICAgfVxuICAgICAgdGhpcy5kZWxldGVBbGwocGF0aCwgZG9tYWluKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgfSwgNTApO1xuICAgIH07XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKF9kZWxldGVBbGxBc3luY1Byb21pc2VDYik7XG4gIH1cbn1cbiJdfQ==