Files
dandelion/db.js
2024-03-10 15:48:35 -07:00

135 lines
21 KiB
JavaScript

// interface MyJsonObject {
// id: string;
// name: string;
// email: string;
// }
const dbName = "ddln";
const storeNameBase = "posts";
let keyBase = "dandelion_posts_v1_";
let key = "";
export function openDatabase(userID) {
const storeName = `${storeNameBase}_${userID}`;
return new Promise((resolve, reject) => {
const request = indexedDB.open(dbName, 1);
request.onerror = (event) => {
// Use a type assertion to access the specific properties of IDBRequest error event
const errorEvent = event;
reject(`Database error: ${errorEvent.target.error?.message}`);
};
request.onupgradeneeded = (event) => {
const db = event.target.result;
if (!db.objectStoreNames.contains(storeName)) {
let store = db.createObjectStore(storeName, { keyPath: "id", autoIncrement: true });
store.createIndex("datetimeIndex", "post_timestamp", { unique: false });
}
};
request.onsuccess = (event) => {
const db = event.target.result;
resolve(db);
};
});
}
export async function addData(userID, data) {
try {
const storeName = `${storeNameBase}_${userID}`;
const db = await openDatabase(userID);
const transaction = db.transaction(storeName, "readwrite");
const store = transaction.objectStore(storeName);
const addRequest = store.add({ post_timestamp: data.post_timestamp, data: data });
addRequest.onsuccess = (e) => {
// console.log('Data has been added:', (e.target as IDBRequest).result);
};
addRequest.onerror = (event) => {
// Use a type assertion to access the specific properties of IDBRequest error event
const errorEvent = event;
console.error('Error in adding data:', errorEvent.target.error?.message);
};
}
catch (error) {
console.error('Error in opening database:', error);
}
}
export async function addDataArray(userID, array) {
try {
const storeName = `${storeNameBase}_${userID}`;
const db = await openDatabase(userID);
const transaction = db.transaction(storeName, "readwrite");
const store = transaction.objectStore(storeName);
let count = 0;
array.reverse();
for (let data of array) {
const addRequest = store.add({ post_timestamp: data.post_timestamp, data: data });
addRequest.onsuccess = (e) => {
// console.log('Data has been added:', (e.target as IDBRequest).result);
};
addRequest.onerror = (event) => {
// Use a type assertion to access the specific properties of IDBRequest error event
const errorEvent = event;
console.error('Error in adding data:', errorEvent.target.error?.message);
};
count++;
// if (count % 100 === 0) {
// console.log(`Added ${count} posts...`);
// }
}
}
catch (error) {
console.error('Error in opening database:', error);
}
}
export async function getData(userID, lowerID, upperID) {
const storeName = `${storeNameBase}_${userID}`;
const db = await openDatabase(userID);
const transaction = db.transaction(storeName, "readonly");
const store = transaction.objectStore(storeName);
return new Promise((resolve, reject) => {
const keyRangeValue = IDBKeyRange.bound(lowerID, upperID);
const records = [];
const index = store.index("datetimeIndex");
const cursorRequest = index.openCursor(keyRangeValue);
cursorRequest.onsuccess = (event) => {
const cursor = event.target.result;
if (cursor) {
records.push(cursor.value.data); // Collect the record
cursor.continue(); // Move to the next item in the range
}
else {
// No more entries in the range
resolve(records);
}
};
cursorRequest.onerror = (event) => {
// Use a type assertion to access the specific properties of IDBRequest error event
const errorEvent = event;
console.error('Transaction failed:', errorEvent.target.error?.message);
reject(errorEvent.target.error); // Reject the promise if there's an error
};
});
}
export async function getAllData(userID) {
const storeName = `${storeNameBase}_${userID}`;
const db = await openDatabase(userID);
const transaction = db.transaction(storeName, "readonly");
const store = transaction.objectStore(storeName);
return new Promise((resolve, reject) => {
const getRequest = store.getAll();
getRequest.onsuccess = () => {
if (getRequest.result) {
// console.log('Retrieved data:', getRequest.result.jsonData);
// resolve(getRequest.result.jsonData as any);
resolve(getRequest.result);
}
else {
console.log('No data record found for key', key);
resolve(undefined); // explicitly resolve with undefined when no data is found
}
};
getRequest.onerror = (event) => {
// Use a type assertion to access the specific properties of IDBRequest error event
const errorEvent = event;
console.error('Transaction failed:', errorEvent.target.error?.message);
reject(errorEvent.target.error); // reject the promise if there's an error
};
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzcmMvZGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMkJBQTJCO0FBQzNCLGdCQUFnQjtBQUNoQixrQkFBa0I7QUFDbEIsbUJBQW1CO0FBQ25CLElBQUk7QUFFSixNQUFNLE1BQU0sR0FBVyxNQUFNLENBQUM7QUFDOUIsTUFBTSxhQUFhLEdBQVcsT0FBTyxDQUFDO0FBQ3RDLElBQUksT0FBTyxHQUFHLHFCQUFxQixDQUFBO0FBQ25DLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztBQVliLE1BQU0sVUFBVSxZQUFZLENBQUMsTUFBYTtJQUN0QyxNQUFNLFNBQVMsR0FBRyxHQUFHLGFBQWEsSUFBSSxNQUFNLEVBQUUsQ0FBQztJQUUvQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ25DLE1BQU0sT0FBTyxHQUFxQixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUU1RCxPQUFPLENBQUMsT0FBTyxHQUFHLENBQUMsS0FBWSxFQUFFLEVBQUU7WUFDL0IsbUZBQW1GO1lBQ25GLE1BQU0sVUFBVSxHQUFHLEtBQXdCLENBQUM7WUFDNUMsTUFBTSxDQUFDLG1CQUFtQixVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQztRQUVGLE9BQU8sQ0FBQyxlQUFlLEdBQUcsQ0FBQyxLQUE0QixFQUFFLEVBQUU7WUFDdkQsTUFBTSxFQUFFLEdBQWlCLEtBQUssQ0FBQyxNQUEyQixDQUFDLE1BQU0sQ0FBQztZQUNsRSxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLEVBQUUsT0FBTyxFQUFFLElB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eEIsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3BCLGdFQUFnRTtnQkFDaEUsOENBQThDO2dCQUM5QyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9CLENBQUM7aUJBQU0sQ0FBQztnQkFDSixPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNqRCxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQywwREFBMEQ7WUFDbEYsQ0FBQztRQUNMLENBQUMsQ0FBQztRQUVGLFVBQVUsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFZLEVBQUUsRUFBRTtZQUNsQyxtRkFBbUY7WUFDbkYsTUFBTSxVQUFVLEdBQUcsS0FBd0IsQ0FBQztZQUM1QyxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMseUNBQXlDO1FBQzlFLENBQUMsQ0FBQztJQUNOLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGludGVyZmFjZSBNeUpzb25PYmplY3Qge1xuLy8gICBpZDogc3RyaW5nO1xuLy8gICBuYW1lOiBzdHJpbmc7XG4vLyAgIGVtYWlsOiBzdHJpbmc7XG4vLyB9XG5cbmNvbnN0IGRiTmFtZTogc3RyaW5nID0gXCJkZGxuXCI7XG5jb25zdCBzdG9yZU5hbWVCYXNlOiBzdHJpbmcgPSBcInBvc3RzXCI7XG5sZXQga2V5QmFzZSA9IFwiZGFuZGVsaW9uX3Bvc3RzX3YxX1wiXG5sZXQga2V5ID0gXCJcIjtcblxuXG5pbnRlcmZhY2UgSURCUmVxdWVzdEV2ZW50PFQgPSBhbnk+IGV4dGVuZHMgRXZlbnQge1xuICAgIHRhcmdldDogSURCUmVxdWVzdDxUPjtcbn1cblxuLy8gSW5kZXhlZERCIHVzZXMgRE9NRXhjZXB0aW9uLCBzbyBsZXQncyB1c2UgaXQgZm9yIGVycm9yIHR5cGluZ1xudHlwZSBEQkVycm9yID0gRXZlbnQgJiB7XG4gICAgdGFyZ2V0OiB7IGVycm9yQ29kZTogRE9NRXhjZXB0aW9uIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gb3BlbkRhdGFiYXNlKHVzZXJJRDpzdHJpbmcpOiBQcm9taXNlPElEQkRhdGFiYXNlPiB7XG4gICAgY29uc3Qgc3RvcmVOYW1lID0gYCR7c3RvcmVOYW1lQmFzZX1fJHt1c2VySUR9YDtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3Q6IElEQk9wZW5EQlJlcXVlc3QgPSBpbmRleGVkREIub3BlbihkYk5hbWUsIDEpO1xuXG4gICAgICAgIHJlcXVlc3Qub25lcnJvciA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICAgIC8vIFVzZSBhIHR5cGUgYXNzZXJ0aW9uIHRvIGFjY2VzcyB0aGUgc3BlY2lmaWMgcHJvcGVydGllcyBvZiBJREJSZXF1ZXN0IGVycm9yIGV2ZW50XG4gICAgICAgICAgICBjb25zdCBlcnJvckV2ZW50ID0gZXZlbnQgYXMgSURCUmVxdWVzdEV2ZW50O1xuICAgICAgICAgICAgcmVqZWN0KGBEYXRhYmFzZSBlcnJvcjogJHtlcnJvckV2ZW50LnRhcmdldC5lcnJvcj8ubWVzc2FnZX1gKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChldmVudDogSURCVmVyc2lvbkNoYW5nZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYjogSURCRGF0YWJhc2UgPSAoZXZlbnQudGFyZ2V0IGFzIElEQk9wZW5EQlJlcXVlc3QpLnJlc3VsdDtcbiAgICAgICAgICAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhzdG9yZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoc3RvcmVOYW1lLCB7IGtleVBhdGg6IFwiaWRcIiwgYXV0b0luY3JlbWVudDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICBzdG9yZS5jcmVhdGVJbmRleChcImRhdGV0aW1lSW5kZXhcIiwgXCJwb3N0X3RpbWVzdGFtcFwiLCB7IHVuaXF1ZTogZmFsc2UgfSk7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRiOiBJREJEYXRhYmFzZSA9IChldmVudC50YXJnZXQgYXMgSURCT3BlbkRCUmVxdWVzdCkucmVzdWx0O1xuICAgICAgICAgICAgcmVzb2x2ZShkYik7XG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cblxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkRGF0YSh1c2VySUQ6IHN0cmluZywgZGF0YTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RvcmVOYW1lID0gYCR7c3RvcmVOYW1lQmFzZX1fJHt1c2VySUR9YDtcbiAgICAgICAgY29uc3QgZGIgPSBhd2FpdCBvcGVuRGF0YWJhc2UodXNlcklEKTtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihzdG9yZU5hbWUsIFwicmVhZHdyaXRlXCIpO1xuICAgICAgICBjb25zdCBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSk7XG5cbiAgICAgICAgY29uc3QgYWRkUmVxdWVzdCA9IHN0b3JlLmFkZCh7cG9zdF90aW1lc3RhbXA6IGRhdGEucG9zdF90aW1lc3RhbXAsIGRhdGE6ZGF0YX0pO1xuXG4gICAgICAgIGFkZFJlcXVlc3Qub25zdWNjZXNzID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnRGF0YSBoYXMgYmVlbiBhZGRlZDonLCAoZS50YXJnZXQgYXMgSURCUmVxdWVzdCkucmVzdWx0KTtcbiAgICAgICAgfTtcblxuICAgICAgICBhZGRSZXF1ZXN0Lm9uZXJyb3IgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBVc2UgYSB0eXBlIGFzc2VydGlvbiB0byBhY2Nlc3MgdGhlIHNwZWNpZmljIHByb3BlcnRpZXMgb2YgSURCUmVxdWVzdCBlcnJvciBldmVudFxuICAgICAgICAgICAgY29uc3QgZXJyb3JFdmVudCA9IGV2ZW50IGFzIElEQlJlcXVlc3RFdmVudDtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGFkZGluZyBkYXRhOicsIGVycm9yRXZlbnQudGFyZ2V0LmVycm9yPy5tZXNzYWdlKTtcbiAgICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBvcGVuaW5nIGRhdGFiYXNlOicsIGVycm9yKTtcbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGREYXRhQXJyYXkodXNlcklEOiBzdHJpbmcsIGFycmF5OiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0b3JlTmFtZSA9IGAke3N0b3JlTmFtZUJhc2V9XyR7dXNlcklEfWA7XG4gICAgICAgIGNvbnN0IGRiID0gYXdhaXQgb3BlbkRhdGFiYXNlKHVzZXJJRCk7XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oc3RvcmVOYW1lLCBcInJlYWR3cml0ZVwiKTtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpO1xuXG4gICAgICAgIGxldCBjb3VudCA9IDA7XG5cbiAgICAgICAgYXJyYXkucmV2ZXJzZSgpO1xuXG4gICAgICAgIGZvciAobGV0IGRhdGEgb2YgYXJyYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGFkZFJlcXVlc3QgPSBzdG9yZS5hZGQoe3Bvc3RfdGltZXN0YW1wOiBkYXRhLnBvc3RfdGltZXN0YW1wLCBkYXRhOmRhdGF9KTtcbiAgICAgICAgICAgIGFkZFJlcXVlc3Qub25zdWNjZXNzID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ0RhdGEgaGFzIGJlZW4gYWRkZWQ6JywgKGUudGFyZ2V0IGFzIElEQlJlcXVlc3QpLnJlc3VsdCk7XG4gICAgICAgICAgICB9O1xuICAgIFxuICAgICAgICAgICAgYWRkUmVxdWVzdC5vbmVycm9yID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFVzZSBhIHR5cGUgYXNzZXJ0aW9uIHRvIGFjY2VzcyB0aGUgc3BlY2lmaWMgcHJvcGVydGllcyBvZiBJREJSZXF1ZXN0IGVycm9yIGV2ZW50XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3JFdmVudCA9IGV2ZW50IGFzIElEQlJlcXVlc3RFdmVudDtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBhZGRpbmcgZGF0YTonLCBlcnJvckV2ZW50LnRhcmdldC5lcnJvcj8ubWVzc2FnZSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb3VudCsrO1xuXG4gICAgICAgICAgICAvLyBpZiAoY291bnQgJSAxMDAgPT09IDApIHtcbiAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhgQWRkZWQgJHtjb3VudH0gcG9zdHMuLi5gKTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfVxuXG4gICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gb3BlbmluZyBkYXRhYmFzZTonLCBlcnJvcik7XG4gICAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RGF0YSh1c2VySUQ6c3RyaW5nLCBsb3dlcklEOkRhdGUsIHVwcGVySUQ6RGF0ZSk6IFByb21pc2U8YW55IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgc3RvcmVOYW1lID0gYCR7c3RvcmVOYW1lQmFzZX1fJHt1c2VySUR9YDtcbiAgICBjb25zdCBkYiA9IGF3YWl0IG9wZW5EYXRhYmFzZSh1c2VySUQpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oc3RvcmVOYW1lLCBcInJlYWRvbmx5XCIpO1xuICAgIGNvbnN0IHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGtleVJhbmdlVmFsdWUgPSBJREJLZXlSYW5nZS5ib3VuZChsb3dlcklELCB1cHBlcklEKTtcblxuICAgICAgICBjb25zdCByZWNvcmRzOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gc3RvcmUuaW5kZXgoXCJkYXRldGltZUluZGV4XCIpO1xuXG5cbiAgICAgICAgY29uc3QgY3Vyc29yUmVxdWVzdCA9IGluZGV4Lm9wZW5DdXJzb3Ioa2V5UmFuZ2VWYWx1ZSk7XG5cbiAgICAgICAgY3Vyc29yUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJzb3IgPSAoZXZlbnQudGFyZ2V0IGFzIElEQlJlcXVlc3QpLnJlc3VsdCBhcyBJREJDdXJzb3JXaXRoVmFsdWU7XG4gICAgICAgICAgICBpZiAoY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgcmVjb3Jkcy5wdXNoKGN1cnNvci52YWx1ZS5kYXRhKTsgLy8gQ29sbGVjdCB0aGUgcmVjb3JkXG4gICAgICAgICAgICAgICAgY3Vyc29yLmNvbnRpbnVlKCk7IC8vIE1vdmUgdG8gdGhlIG5leHQgaXRlbSBpbiB0aGUgcmFuZ2VcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTm8gbW9yZSBlbnRyaWVzIGluIHRoZSByYW5nZVxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVjb3Jkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY3Vyc29yUmVxdWVzdC5vbmVycm9yID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gVXNlIGEgdHlwZSBhc3NlcnRpb24gdG8gYWNjZXNzIHRoZSBzcGVjaWZpYyBwcm9wZXJ0aWVzIG9mIElEQlJlcXVlc3QgZXJyb3IgZXZlbnRcbiAgICAgICAgICAgIGNvbnN0IGVycm9yRXZlbnQgPSBldmVudCBhcyBJREJSZXF1ZXN0RXZlbnQ7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUcmFuc2FjdGlvbiBmYWlsZWQ6JywgZXJyb3JFdmVudC50YXJnZXQuZXJyb3I/Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yRXZlbnQudGFyZ2V0LmVycm9yKTsgLy8gUmVqZWN0IHRoZSBwcm9taXNlIGlmIHRoZXJlJ3MgYW4gZXJyb3JcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEFsbERhdGEodXNlcklEOnN0cmluZyk6IFByb21pc2U8YW55IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgc3RvcmVOYW1lID0gYCR7c3RvcmVOYW1lQmFzZX1fJHt1c2VySUR9YDtcbiAgICBjb25zdCBkYiA9IGF3YWl0IG9wZW5EYXRhYmFzZSh1c2VySUQpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oc3RvcmVOYW1lLCBcInJlYWRvbmx5XCIpO1xuICAgIGNvbnN0IHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGdldFJlcXVlc3QgPSBzdG9yZS5nZXRBbGwoKTtcblxuICAgICAgICBnZXRSZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChnZXRSZXF1ZXN0LnJlc3VsdCkge1xuICAgICAgICAgICAgICAgIC8vICAgY29uc29sZS5sb2coJ1JldHJpZXZlZCBkYXRhOicsIGdldFJlcXVlc3QucmVzdWx0Lmpzb25EYXRhKTtcbiAgICAgICAgICAgICAgICAvLyByZXNvbHZlKGdldFJlcXVlc3QucmVzdWx0Lmpzb25EYXRhIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShnZXRSZXF1ZXN0LnJlc3VsdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdObyBkYXRhIHJlY29yZCBmb3VuZCBmb3Iga2V5Jywga2V5KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7IC8vIGV4cGxpY2l0bHkgcmVzb2x2ZSB3aXRoIHVuZGVmaW5lZCB3aGVuIG5vIGRhdGEgaXMgZm91bmRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBnZXRSZXF1ZXN0Lm9uZXJyb3IgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBVc2UgYSB0eXBlIGFzc2VydGlvbiB0byBhY2Nlc3MgdGhlIHNwZWNpZmljIHByb3BlcnRpZXMgb2YgSURCUmVxdWVzdCBlcnJvciBldmVudFxuICAgICAgICAgICAgY29uc3QgZXJyb3JFdmVudCA9IGV2ZW50IGFzIElEQlJlcXVlc3RFdmVudDtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RyYW5zYWN0aW9uIGZhaWxlZDonLCBlcnJvckV2ZW50LnRhcmdldC5lcnJvcj8ubWVzc2FnZSk7XG4gICAgICAgICAgICByZWplY3QoZXJyb3JFdmVudC50YXJnZXQuZXJyb3IpOyAvLyByZWplY3QgdGhlIHByb21pc2UgaWYgdGhlcmUncyBhbiBlcnJvclxuICAgICAgICB9O1xuICAgIH0pO1xufVxuIl19