@neocomplexx/ngx-neo-indexeddb
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.
393 lines (385 loc) • 35.1 kB
JavaScript
import { NgModule } from '@angular/core';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
class NgxNeoIndexedDbModule {
/**
* @return {?}
*/
static forRoot() {
return {
ngModule: NgxNeoIndexedDbModule,
providers: []
};
}
}
NgxNeoIndexedDbModule.decorators = [
{ type: NgModule, args: [{
declarations: [],
imports: [],
exports: []
},] }
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
class DbWrapper {
/**
* @param {?} dbName
* @param {?} version
*/
constructor(dbName, version) {
this.dbName = dbName;
this.dbVersion = version || 1;
this.db = null;
}
/**
* @param {?} storeName
* @return {?}
*/
validateStoreName(storeName) {
return this.db.objectStoreNames.contains(storeName);
}
/**
* @param {?} storeName
* @param {?} reject
* @return {?}
*/
validateBeforeTransaction(storeName, reject) {
if (!this.db) {
reject('You need to use the openDatabase function to create a database before you query it!');
}
if (!this.validateStoreName(storeName)) {
reject(('objectStore does not exists: ' + storeName));
}
}
/**
* @param {?} options
* @return {?}
*/
createTransaction(options) {
/** @type {?} */
const trans = this.db.transaction(options.storeName, options.dbMode);
trans.onerror = options.error;
trans.oncomplete = options.complete;
trans.onabort = options.abort;
return trans;
}
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
class Utils {
constructor() {
this.indexedDB = window.indexedDB || ((/** @type {?} */ (window))).mozIndexedDB || ((/** @type {?} */ (window))).webkitIndexedDB || ((/** @type {?} */ (window))).msIndexedDB;
}
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
class NgxNeoIDB {
/**
* @param {?} dbName
* @param {?} version
*/
constructor(dbName, version) {
this.utils = new Utils();
this.dbWrapper = new DbWrapper(dbName, version);
}
/**
* @param {?} version
* @param {?=} upgradeCallback
* @return {?}
*/
openDatabase(version, upgradeCallback) {
return new Promise((resolve, reject) => {
this.dbWrapper.dbVersion = version;
/** @type {?} */
const request = this.utils.indexedDB.open(this.dbWrapper.dbName, version);
request.onsuccess = (e) => {
this.dbWrapper.db = request.result;
resolve();
};
request.onerror = (e) => {
reject('IndexedDB error: ' + ((/** @type {?} */ (e.target))).errorCode ?
((/** @type {?} */ (e.target))).errorCode + ' (' + ((/** @type {?} */ (e.target))).error + ')' :
((/** @type {?} */ (e.target))).errorCode);
};
if (typeof upgradeCallback === 'function') {
request.onupgradeneeded = (e) => {
upgradeCallback(e, this.dbWrapper.db);
};
}
});
}
/**
* @param {?} storeName
* @param {?} key
* @return {?}
*/
getByKey(storeName, key) {
return new Promise((resolve, reject) => {
this.dbWrapper.validateBeforeTransaction(storeName, reject);
/** @type {?} */
const transaction = this.dbWrapper.createTransaction({
storeName: storeName,
dbMode: 'readonly',
error: (e) => {
reject(e);
},
complete: (e) => {
}
});
/** @type {?} */
const objectStore = transaction.objectStore(storeName);
/** @type {?} */
let request;
request = objectStore.get(key);
request.onsuccess = (event) => {
resolve(((/** @type {?} */ (event.target))).result);
};
});
}
/**
* @param {?} storeName
* @param {?=} keyRange
* @param {?=} indexDetails
* @return {?}
*/
getAll(storeName, keyRange, indexDetails) {
return new Promise((resolve, reject) => {
this.dbWrapper.validateBeforeTransaction(storeName, reject);
/** @type {?} */
const transaction = this.dbWrapper.createTransaction({
storeName: storeName,
dbMode: 'readonly',
error: (e) => {
reject(e);
},
complete: (e) => {
}
});
/** @type {?} */
const objectStore = transaction.objectStore(storeName);
/** @type {?} */
const result = [];
/** @type {?} */
let request;
if (indexDetails) {
/** @type {?} */
const index = objectStore.index(indexDetails.indexName);
/** @type {?} */
const order = (indexDetails.order === 'desc') ? 'prev' : 'next';
request = index.openCursor(keyRange, (/** @type {?} */ (order)));
}
else {
request = objectStore.openCursor(keyRange);
}
request.onerror = (e) => {
reject(e);
};
request.onsuccess = (evt) => {
/** @type {?} */
const cursor = ((/** @type {?} */ (evt.target))).result;
if (cursor) {
result.push(cursor.value);
cursor['continue']();
}
else {
resolve(result);
}
};
});
}
/**
* @param {?} storeName
* @param {?} value
* @param {?=} key
* @return {?}
*/
add(storeName, value, key) {
return new Promise((resolve, reject) => {
this.dbWrapper.validateBeforeTransaction(storeName, reject);
/** @type {?} */
const transaction = this.dbWrapper.createTransaction({
storeName: storeName,
dbMode: 'readwrite',
error: (e) => {
reject(e);
},
complete: (e) => {
resolve({ key: key, value: value });
}
});
/** @type {?} */
const objectStore = transaction.objectStore(storeName);
/** @type {?} */
const request = objectStore.add(value, key);
request.onsuccess = (evt) => {
key = evt.target.result;
};
});
}
/**
* @param {?} storeName
* @param {?} value
* @param {?=} key
* @return {?}
*/
update(storeName, value, key) {
return new Promise((resolve, reject) => {
this.dbWrapper.validateBeforeTransaction(storeName, reject);
/** @type {?} */
const transaction = this.dbWrapper.createTransaction({
storeName: storeName,
dbMode: 'readwrite',
error: (e) => {
reject(e);
},
complete: (e) => {
resolve(value);
},
abort: (e) => {
reject(e);
}
});
/** @type {?} */
const objectStore = transaction.objectStore(storeName);
objectStore.put(value, key);
});
}
/**
* @param {?} storeName
* @param {?} key
* @return {?}
*/
delete(storeName, key) {
return new Promise((resolve, reject) => {
this.dbWrapper.validateBeforeTransaction(storeName, reject);
/** @type {?} */
const transaction = this.dbWrapper.createTransaction({
storeName: storeName,
dbMode: 'readwrite',
error: (e) => {
reject(e);
},
complete: (e) => {
resolve();
},
abort: (e) => {
reject(e);
}
});
/** @type {?} */
const objectStore = transaction.objectStore(storeName);
objectStore['delete'](key);
});
}
/**
* @param {?} storeName
* @param {?} cursorCallback
* @param {?=} keyRange
* @return {?}
*/
openCursor(storeName, cursorCallback, keyRange) {
return new Promise((resolve, reject) => {
this.dbWrapper.validateBeforeTransaction(storeName, reject);
/** @type {?} */
const transaction = this.dbWrapper.createTransaction({
storeName: storeName,
dbMode: 'readonly',
error: (e) => {
reject(e);
},
complete: (e) => {
resolve();
},
abort: (e) => {
reject(e);
}
});
/** @type {?} */
const objectStore = transaction.objectStore(storeName);
/** @type {?} */
const request = objectStore.openCursor(keyRange);
request.onsuccess = (evt) => {
cursorCallback(evt);
resolve();
};
});
}
/**
* @param {?} storeName
* @return {?}
*/
clear(storeName) {
return new Promise((resolve, reject) => {
this.dbWrapper.validateBeforeTransaction(storeName, reject);
/** @type {?} */
const transaction = this.dbWrapper.createTransaction({
storeName: storeName,
dbMode: 'readwrite',
error: (e) => {
reject(e);
},
complete: (e) => {
resolve();
},
abort: (e) => {
reject(e);
}
});
/** @type {?} */
const objectStore = transaction.objectStore(storeName);
objectStore.clear();
resolve();
});
}
/**
* @param {?} storeName
* @param {?} indexName
* @param {?} key
* @return {?}
*/
getByIndex(storeName, indexName, key) {
return new Promise((resolve, reject) => {
this.dbWrapper.validateBeforeTransaction(storeName, reject);
/** @type {?} */
const transaction = this.dbWrapper.createTransaction({
storeName: storeName,
dbMode: 'readonly',
error: (e) => {
reject(e);
},
abort: (e) => {
reject(e);
},
complete: (e) => {
}
});
/** @type {?} */
const objectStore = transaction.objectStore(storeName);
/** @type {?} */
const index = objectStore.index(indexName);
/** @type {?} */
const request = index.get(key);
request.onsuccess = (event) => {
resolve(((/** @type {?} */ (event.target))).result);
};
});
}
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
export { NgxNeoIndexedDbModule, NgxNeoIDB };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVvY29tcGxleHgtbmd4LW5lby1pbmRleGVkZGIuanMubWFwIiwic291cmNlcyI6WyJuZzovL0BuZW9jb21wbGV4eC9uZ3gtbmVvLWluZGV4ZWRkYi9saWIvbmd4LW5lby1pbmRleGVkLWRiLm1vZHVsZS50cyIsIm5nOi8vQG5lb2NvbXBsZXh4L25neC1uZW8taW5kZXhlZGRiL2xpYi9jbGFzc2VzL2RiV3JhcHBlci50cyIsIm5nOi8vQG5lb2NvbXBsZXh4L25neC1uZW8taW5kZXhlZGRiL2xpYi9jbGFzc2VzL3V0aWxzLnRzIiwibmc6Ly9AbmVvY29tcGxleHgvbmd4LW5lby1pbmRleGVkZGIvbGliL05neElEQi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBhdXRob3IgU2ViYXN0aWFuIExhcnJpZXVcbiAqIEBlbWFpbCBzbGFycmlldUBuZW9jb21wbGV4eC5jb21cbiAqIEBjcmVhdGUgZGF0ZSAyMDE4LTExLTIyIDA4OjIzOjMwXG4gKiBAbW9kaWZ5IGRhdGUgMjAxOC0xMS0yMiAwODoyMzozMFxuKi9cbmltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW10sXG4gIGltcG9ydHM6IFtdLFxuICBleHBvcnRzOiBbXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3hOZW9JbmRleGVkRGJNb2R1bGUge1xuICBzdGF0aWMgZm9yUm9vdCgpOiBNb2R1bGVXaXRoUHJvdmlkZXJzIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IE5neE5lb0luZGV4ZWREYk1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW11cbiAgICB9O1xuICB9XG4gfVxuIiwiZXhwb3J0IGNsYXNzIERiV3JhcHBlciB7XHJcbiAgICBkYk5hbWU6IHN0cmluZztcclxuICAgIGRiVmVyc2lvbjogbnVtYmVyO1xyXG4gICAgZGI6IElEQkRhdGFiYXNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGRiTmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLmRiTmFtZSA9IGRiTmFtZTtcclxuICAgICAgICB0aGlzLmRiVmVyc2lvbiA9IHZlcnNpb24gfHwgMTtcclxuICAgICAgICB0aGlzLmRiID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGF0ZVN0b3JlTmFtZShzdG9yZU5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoc3RvcmVOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGF0ZUJlZm9yZVRyYW5zYWN0aW9uKHN0b3JlTmFtZTogc3RyaW5nLCByZWplY3Q6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRiKSB7XHJcbiAgICAgICAgICAgIHJlamVjdCgnWW91IG5lZWQgdG8gdXNlIHRoZSBvcGVuRGF0YWJhc2UgZnVuY3Rpb24gdG8gY3JlYXRlIGEgZGF0YWJhc2UgYmVmb3JlIHlvdSBxdWVyeSBpdCEnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlU3RvcmVOYW1lKHN0b3JlTmFtZSkpIHtcclxuICAgICAgICAgICAgcmVqZWN0KCgnb2JqZWN0U3RvcmUgZG9lcyBub3QgZXhpc3RzOiAnICsgc3RvcmVOYW1lKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVRyYW5zYWN0aW9uKFxyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgc3RvcmVOYW1lOiBzdHJpbmcsIGRiTW9kZTogSURCVHJhbnNhY3Rpb25Nb2RlLFxyXG4gICAgICAgICAgICBlcnJvcjogKGU6IEV2ZW50KSA9PiBhbnksXHJcbiAgICAgICAgICAgIGNvbXBsZXRlOiAoZTogRXZlbnQpID0+IGFueSxcclxuICAgICAgICAgICAgYWJvcnQ/OiAoZTogRXZlbnQpID0+IGFueVxyXG4gICAgICAgIH0pOiBJREJUcmFuc2FjdGlvbiB7XHJcbiAgICAgICAgY29uc3QgdHJhbnM6IElEQlRyYW5zYWN0aW9uID0gdGhpcy5kYi50cmFuc2FjdGlvbihvcHRpb25zLnN0b3JlTmFtZSwgb3B0aW9ucy5kYk1vZGUpO1xyXG4gICAgICAgIHRyYW5zLm9uZXJyb3IgPSBvcHRpb25zLmVycm9yO1xyXG4gICAgICAgIHRyYW5zLm9uY29tcGxldGUgPSBvcHRpb25zLmNvbXBsZXRlO1xyXG4gICAgICAgIHRyYW5zLm9uYWJvcnQgPSBvcHRpb25zLmFib3J0O1xyXG4gICAgICAgIHJldHVybiB0cmFucztcclxuICAgIH1cclxufVxyXG4iLCJleHBvcnQgY2xhc3MgVXRpbHMge1xyXG4gICAgaW5kZXhlZERCOiBJREJGYWN0b3J5O1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5pbmRleGVkREIgPSB3aW5kb3cuaW5kZXhlZERCIHx8ICg8YW55PndpbmRvdykubW96SW5kZXhlZERCIHx8ICg8YW55PndpbmRvdykud2Via2l0SW5kZXhlZERCIHx8ICg8YW55PndpbmRvdykubXNJbmRleGVkREI7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRGJXcmFwcGVyIH0gZnJvbSAnLi9jbGFzc2VzL2RiV3JhcHBlcic7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4vY2xhc3Nlcy91dGlscyc7XG5pbXBvcnQgeyBJbmRleERldGFpbHMgfSBmcm9tICcuL2NsYXNzZXMvaW5kZXhEZXRhaWxzJztcblxuXG5leHBvcnQgY2xhc3MgTmd4TmVvSURCIHtcbiAgdXRpbHM6IFV0aWxzO1xuICBkYldyYXBwZXI6IERiV3JhcHBlcjtcblxuICBjb25zdHJ1Y3RvcihkYk5hbWU6IHN0cmluZywgdmVyc2lvbjogbnVtYmVyKSB7XG4gICAgdGhpcy51dGlscyA9IG5ldyBVdGlscygpO1xuICAgIHRoaXMuZGJXcmFwcGVyID0gbmV3IERiV3JhcHBlcihkYk5hbWUsIHZlcnNpb24pO1xuICB9XG5cbiAgb3BlbkRhdGFiYXNlKHZlcnNpb246IG51bWJlciwgdXBncmFkZUNhbGxiYWNrPzogRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmRiV3JhcHBlci5kYlZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMudXRpbHMuaW5kZXhlZERCLm9wZW4odGhpcy5kYldyYXBwZXIuZGJOYW1lLCB2ZXJzaW9uKTtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKGUpID0+IHtcbiAgICAgICAgdGhpcy5kYldyYXBwZXIuZGIgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgICAgcmVqZWN0KCdJbmRleGVkREIgZXJyb3I6ICcgKyAoPGFueT5lLnRhcmdldCkuZXJyb3JDb2RlID9cbiAgICAgICAgICAoPGFueT5lLnRhcmdldCkuZXJyb3JDb2RlICsgJyAoJyArICg8YW55PmUudGFyZ2V0KS5lcnJvciArICcpJyA6XG4gICAgICAgICAgKDxhbnk+ZS50YXJnZXQpLmVycm9yQ29kZSk7XG4gICAgICB9O1xuXG4gICAgICBpZiAodHlwZW9mIHVwZ3JhZGVDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChlKSA9PiB7XG4gICAgICAgICAgdXBncmFkZUNhbGxiYWNrKGUsIHRoaXMuZGJXcmFwcGVyLmRiKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldEJ5S2V5KHN0b3JlTmFtZTogc3RyaW5nLCBrZXk6IGFueSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGJXcmFwcGVyLnZhbGlkYXRlQmVmb3JlVHJhbnNhY3Rpb24oc3RvcmVOYW1lLCByZWplY3QpO1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRiV3JhcHBlci5jcmVhdGVUcmFuc2FjdGlvbih7XG4gICAgICAgIHN0b3JlTmFtZTogc3RvcmVOYW1lLFxuICAgICAgICBkYk1vZGU6ICdyZWFkb25seScsXG4gICAgICAgIGVycm9yOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBsZXRlOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBvYmplY3RTdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSk7XG4gICAgICBsZXQgcmVxdWVzdDogSURCUmVxdWVzdDtcblxuICAgICAgcmVxdWVzdCA9IG9iamVjdFN0b3JlLmdldChrZXkpO1xuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgIHJlc29sdmUoKDxhbnk+ZXZlbnQudGFyZ2V0KS5yZXN1bHQpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEFsbChzdG9yZU5hbWU6IHN0cmluZywga2V5UmFuZ2U/OiBJREJLZXlSYW5nZSwgaW5kZXhEZXRhaWxzPzogSW5kZXhEZXRhaWxzKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYldyYXBwZXIudmFsaWRhdGVCZWZvcmVUcmFuc2FjdGlvbihzdG9yZU5hbWUsIHJlamVjdCk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYldyYXBwZXIuY3JlYXRlVHJhbnNhY3Rpb24oe1xuICAgICAgICBzdG9yZU5hbWU6IHN0b3JlTmFtZSxcbiAgICAgICAgZGJNb2RlOiAncmVhZG9ubHknLFxuICAgICAgICBlcnJvcjogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZTogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3Qgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpO1xuICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxhbnk+ID0gW107XG4gICAgICBsZXQgcmVxdWVzdDogSURCUmVxdWVzdDtcbiAgICAgIGlmIChpbmRleERldGFpbHMpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBvYmplY3RTdG9yZS5pbmRleChpbmRleERldGFpbHMuaW5kZXhOYW1lKSxcbiAgICAgICAgICBvcmRlciA9IChpbmRleERldGFpbHMub3JkZXIgPT09ICdkZXNjJykgPyAncHJldicgOiAnbmV4dCc7XG4gICAgICAgIHJlcXVlc3QgPSBpbmRleC5vcGVuQ3Vyc29yKGtleVJhbmdlLCA8SURCQ3Vyc29yRGlyZWN0aW9uPm9yZGVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVlc3QgPSBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKGtleVJhbmdlKTtcbiAgICAgIH1cblxuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAgKGV2dDogRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgY3Vyc29yOiBhbnkgPSAoPElEQk9wZW5EQlJlcXVlc3Q+ZXZ0LnRhcmdldCkucmVzdWx0O1xuICAgICAgICBpZiAoY3Vyc29yKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goY3Vyc29yLnZhbHVlKTtcbiAgICAgICAgICBjdXJzb3JbJ2NvbnRpbnVlJ10oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBhZGQoc3RvcmVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGtleT86IGFueSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGJXcmFwcGVyLnZhbGlkYXRlQmVmb3JlVHJhbnNhY3Rpb24oc3RvcmVOYW1lLCByZWplY3QpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGJXcmFwcGVyLmNyZWF0ZVRyYW5zYWN0aW9uKHtcbiAgICAgICAgc3RvcmVOYW1lOiBzdG9yZU5hbWUsXG4gICAgICAgIGRiTW9kZTogJ3JlYWR3cml0ZScsXG4gICAgICAgIGVycm9yOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBsZXRlOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHsga2V5OiBrZXksIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAgIG9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcblxuICAgICAgY29uc3QgcmVxdWVzdCA9IG9iamVjdFN0b3JlLmFkZCh2YWx1ZSwga2V5KTtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKGV2dDogYW55KSA9PiB7XG4gICAgICAgIGtleSA9IGV2dC50YXJnZXQucmVzdWx0O1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZShzdG9yZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwga2V5PzogYW55KSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYldyYXBwZXIudmFsaWRhdGVCZWZvcmVUcmFuc2FjdGlvbihzdG9yZU5hbWUsIHJlamVjdCk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYldyYXBwZXIuY3JlYXRlVHJhbnNhY3Rpb24oe1xuICAgICAgICBzdG9yZU5hbWU6IHN0b3JlTmFtZSxcbiAgICAgICAgZGJNb2RlOiAncmVhZHdyaXRlJyxcbiAgICAgICAgZXJyb3I6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGxldGU6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBhYm9ydDogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgICAgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpO1xuXG4gICAgICBvYmplY3RTdG9yZS5wdXQodmFsdWUsIGtleSk7XG4gICAgfSk7XG4gIH1cblxuICBkZWxldGUoc3RvcmVOYW1lOiBzdHJpbmcsIGtleTogYW55KSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYldyYXBwZXIudmFsaWRhdGVCZWZvcmVUcmFuc2FjdGlvbihzdG9yZU5hbWUsIHJlamVjdCk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYldyYXBwZXIuY3JlYXRlVHJhbnNhY3Rpb24oe1xuICAgICAgICBzdG9yZU5hbWU6IHN0b3JlTmFtZSxcbiAgICAgICAgZGJNb2RlOiAncmVhZHdyaXRlJyxcbiAgICAgICAgZXJyb3I6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGxldGU6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgYWJvcnQ6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAgIG9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcblxuICAgICAgb2JqZWN0U3RvcmVbJ2RlbGV0ZSddKGtleSk7XG4gICAgfSk7XG4gIH1cblxuICBvcGVuQ3Vyc29yKHN0b3JlTmFtZTogc3RyaW5nLCBjdXJzb3JDYWxsYmFjazogKGV2dDogRXZlbnQpID0+IHZvaWQsIGtleVJhbmdlPzogSURCS2V5UmFuZ2UpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmRiV3JhcHBlci52YWxpZGF0ZUJlZm9yZVRyYW5zYWN0aW9uKHN0b3JlTmFtZSwgcmVqZWN0KTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRiV3JhcHBlci5jcmVhdGVUcmFuc2FjdGlvbih7XG4gICAgICAgIHN0b3JlTmFtZTogc3RvcmVOYW1lLFxuICAgICAgICBkYk1vZGU6ICdyZWFkb25seScsXG4gICAgICAgIGVycm9yOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBsZXRlOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGFib3J0OiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgICBvYmplY3RTdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSksXG4gICAgICAgIHJlcXVlc3QgPSBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKGtleVJhbmdlKTtcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoZXZ0OiBFdmVudCkgPT4ge1xuICAgICAgICBjdXJzb3JDYWxsYmFjayhldnQpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgY2xlYXIoc3RvcmVOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmRiV3JhcHBlci52YWxpZGF0ZUJlZm9yZVRyYW5zYWN0aW9uKHN0b3JlTmFtZSwgcmVqZWN0KTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRiV3JhcHBlci5jcmVhdGVUcmFuc2FjdGlvbih7XG4gICAgICAgIHN0b3JlTmFtZTogc3RvcmVOYW1lLFxuICAgICAgICBkYk1vZGU6ICdyZWFkd3JpdGUnLFxuICAgICAgICBlcnJvcjogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZTogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LFxuICAgICAgICBhYm9ydDogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgICAgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpO1xuICAgICAgb2JqZWN0U3RvcmUuY2xlYXIoKTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEJ5SW5kZXgoc3RvcmVOYW1lOiBzdHJpbmcsIGluZGV4TmFtZTogc3RyaW5nLCBrZXk6IGFueSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGJXcmFwcGVyLnZhbGlkYXRlQmVmb3JlVHJhbnNhY3Rpb24oc3RvcmVOYW1lLCByZWplY3QpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGJXcmFwcGVyLmNyZWF0ZVRyYW5zYWN0aW9uKHtcbiAgICAgICAgc3RvcmVOYW1lOiBzdG9yZU5hbWUsXG4gICAgICAgIGRiTW9kZTogJ3JlYWRvbmx5JyxcbiAgICAgICAgZXJyb3I6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSxcbiAgICAgICAgYWJvcnQ6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGxldGU6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgICAgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpLFxuICAgICAgICBpbmRleCA9IG9iamVjdFN0b3JlLmluZGV4KGluZGV4TmFtZSksXG4gICAgICAgIHJlcXVlc3QgPSBpbmRleC5nZXQoa2V5KTtcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgcmVzb2x2ZSgoPElEQk9wZW5EQlJlcXVlc3Q+ZXZlbnQudGFyZ2V0KS5yZXN1bHQpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztNQWFhLHFCQUFxQjs7OztJQUNoQyxPQUFPLE9BQU87UUFDWixPQUFPO1lBQ0wsUUFBUSxFQUFFLHFCQUFxQjtZQUMvQixTQUFTLEVBQUUsRUFBRTtTQUNkLENBQUM7S0FDSDs7O1lBWEYsUUFBUSxTQUFDO2dCQUNSLFlBQVksRUFBRSxFQUFFO2dCQUNoQixPQUFPLEVBQUUsRUFBRTtnQkFDWCxPQUFPLEVBQUUsRUFBRTthQUNaOzs7Ozs7O0FDWkQsTUFBYSxTQUFTOzs7OztJQUtsQixZQUFZLE1BQWMsRUFBRSxPQUFlO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxJQUFJLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQztLQUNsQjs7Ozs7SUFFRCxpQkFBaUIsQ0FBQyxTQUFpQjtRQUMvQixPQUFPLElBQUksQ0FB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