UNPKG

sq3-kv-data-store

Version:

Node.js key/value store for SQLITE3 that includes data search features

222 lines 28.6 kB
import util from 'node:util'; import { default as SqlString } from 'sqlstring'; const isComparable = (v) => { return typeof v === 'boolean' || typeof v === 'string' || typeof v === 'number'; }; const $eq = (sel, tosel) => { return SqlString.format([ '( ', // 'EXISTS json_extract(value, ?) ', // 'AND json_extract(value, ?) == ?', 'json_extract(value, ?) == ?', ' )' ].join(''), [/* sel, */ sel, tosel]); }; const $lt = (sel, tosel) => { return SqlString.format([ '( ', // 'EXISTS json_extract(value, ?) ', // 'AND json_extract(value, ?) < ?', 'json_extract(value, ?) < ?', ' )' ].join(''), [/* sel, */ sel, tosel]); }; const $lte = (sel, tosel) => { return SqlString.format([ '( ', // 'EXISTS json_extract(value, ?) ', // 'AND json_extract(value, ?) <= ?', 'json_extract(value, ?) <= ?', ' )' ].join(''), [/* sel, */ sel, tosel]); }; const $gt = (sel, tosel) => { return SqlString.format([ '( ', // 'EXISTS json_extract(value, ?) ', // 'AND json_extract(value, ?) > ?', 'json_extract(value, ?) > ?', ' )' ].join(''), [/* sel, */ sel, tosel]); }; const $gte = (sel, tosel) => { return SqlString.format([ '( ', // 'EXISTS json_extract(value, ?) ', // 'AND json_extract(value, ?) >= ?', 'json_extract(value, ?) >= ?', ' )' ].join(''), [/* sel, */ sel, tosel]); }; const $ne = (sel, tosel) => { return SqlString.format([ '( ', // 'EXISTS json_extract(value, ?) ', // 'AND json_extract(value, ?) <> ?', 'json_extract(value, ?) <> ?', ' )' ].join(''), [/* sel, */ sel, tosel]); }; const $exists = (sel) => { return SqlString.format([ '( ', 'EXISTS(json_extract(value, ?)) ', ' )' ].join(''), [sel]); }; const $null = (sel) => { return SqlString.format([ '( ', 'json_extract(value, ?) IS NULL ', ' )' ].join(''), [sel]); }; const $notnull = (sel) => { return SqlString.format([ '( ', 'json_extract(value, ?) IS NOT NULL ', ' )' ].join(''), [sel]); }; const $like = (sel, tosel) => { return SqlString.format([ '( ', // 'EXISTS json_extract(value, ?) ', // 'AND json_extract(value, ?) LIKE ?', 'json_extract(value, ?) LIKE ?', ' )' ].join(''), [/* sel, */ sel, tosel]); }; const $glob = (sel, tosel) => { return SqlString.format([ '( ', // 'EXISTS json_extract(value, ?) ', // 'AND json_extract(value, ?) GLOB ?', 'json_extract(value, ?) GLOB ?', ' )' ].join(''), [/* sel, */ sel, tosel]); }; const $regexp = (sel, tosel) => { return SqlString.format([ '( ', // 'EXISTS json_extract(value, ?) ', // 'AND json_extract(value, ?) regexp ?', 'json_extract(value, ?) regexp ?', ' )' ].join(''), [/* sel, */ sel, tosel]); }; function handleArraySelector(selectors) { const queries = new Array(); for (const sel of selectors) { if (Array.isArray(sel)) { throw new Error(`Found array in array selectors ${util.inspect(sel)}`); } if (typeof sel !== 'object') { throw new Error(`Found non-object selector ${util.inspect(sel)}`); } const sels = handleObjectSelector(sel); queries.push('( ' + sels.join(' AND ') + ' )'); } return queries; } function handleObjectSelector(selectors) { const queries = new Array(); for (const sel in selectors) { if (!(typeof sel === 'string')) { throw new Error(`handleObjectSelector got invalid selector ${util.inspect(sel)}`); } const tosel = selectors[sel]; if (sel === '$or' && !(Array.isArray(tosel))) { throw new Error(`selectors2where got $or without array ${util.inspect(tosel)}`); } if (sel === '$or') { queries.push('( ' + handleArraySelector(tosel).join(' OR ') + ' )'); continue; } if (sel === '$and' && !(Array.isArray(tosel))) { throw new Error(`selectors2where got $and without array ${util.inspect(tosel)}`); } if (sel === '$and') { queries.push('( ' + handleArraySelector(tosel).join(' AND ') + ' )'); continue; } if (sel === '$exists') { if (typeof tosel !== 'string') { throw new Error(`Incorrect operand ${util.inspect(tosel)} for $exists`); } queries.push('( ' + $exists(tosel) + ' )'); continue; } if (sel === '$null') { if (typeof tosel !== 'string') { throw new Error(`Incorrect operand ${util.inspect(tosel)} for $null`); } queries.push('( ' + $null(tosel) + ' )'); continue; } if (sel === '$notnull') { if (typeof tosel !== 'string') { throw new Error(`Incorrect operand ${util.inspect(tosel)} for $notnull`); } queries.push('( ' + $notnull(tosel) + ' )'); continue; } // THe default action is equality if (isComparable(tosel)) { queries.push($eq(sel, tosel)); continue; } if (typeof tosel === 'object') { const keys = Object.keys(tosel); if (keys.length < 1 || keys.length > 1) { throw new Error(`selectors2where got incorrect comparison operand for ${util.inspect(sel)} with ${util.inspect(tosel)}`); } const op = keys[0]; const orsel = tosel[op]; if (op === '$eq') { queries.push($eq(sel, orsel)); } else if (op === '$lt') { queries.push($lt(sel, orsel)); } else if (op === '$lte') { queries.push($lte(sel, orsel)); } else if (op === '$gt') { queries.push($gt(sel, orsel)); } else if (op === '$gte') { queries.push($gte(sel, orsel)); } else if (op === '$ne') { queries.push($ne(sel, orsel)); } else if (op === '$exists') { queries.push($exists(sel)); } else if (op === '$like') { queries.push($like(sel, orsel)); } else if (op === '$glob') { queries.push($glob(sel, orsel)); } else if (op === '$regexp') { queries.push($regexp(sel, orsel)); } else { throw new Error(`selectors2where got invalid operator ${util.inspect(op)} in ${util.inspect(tosel)}`); } } } return queries; } export function selectors2where(selectors) { if (typeof selectors !== 'object') { throw new Error(`Incorrect type for selector ${util.inspect(selectors)}`); } const queries = handleObjectSelector(selectors); return /* '( ' + */ queries.join(' AND ') /* + ' )' */; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ZpbmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUFFLE9BQU8sSUFBSSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFhakQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFNLEVBQVcsRUFBRTtJQUNyQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLFNBQVM7V0FDdEIsT0FBTyxDQUFDLEtBQUssUUFBUTtXQUNyQixPQUFPLENBQUMsS0FBSyxRQUFRLENBQUM7QUFDakMsQ0FBQyxDQUFBO0FBR0QsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFXLEVBQUUsS0FBc0IsRUFBRSxFQUFFO0lBQ2hELE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUNwQixJQUFJO1FBQ0osb0NBQW9DO1FBQ3BDLHFDQUFxQztRQUNyQyw2QkFBNkI7UUFDN0IsSUFBSTtLQUNQLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUNOLENBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUUsQ0FDNUIsQ0FBQztBQUNOLENBQUMsQ0FBQTtBQUVELE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBVyxFQUFFLEtBQXNCLEVBQUUsRUFBRTtJQUNoRCxPQUFPLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFDcEIsSUFBSTtRQUNKLG9DQUFvQztRQUNwQyxvQ0FBb0M7UUFDcEMsNEJBQTRCO1FBQzVCLElBQUk7S0FDUCxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFDTixDQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFFLENBQzVCLENBQUM7QUFDTixDQUFDLENBQUE7QUFFRCxNQUFNLElBQUksR0FBRyxDQUFDLEdBQVcsRUFBRSxLQUFzQixFQUFFLEVBQUU7SUFDakQsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQ3BCLElBQUk7UUFD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T0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2hELE9BQU8sWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDO0FBQzNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB1dGlsIGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIFNxbFN0cmluZyB9IGZyb20gJ3NxbHN0cmluZyc7XG5cblxudHlwZSBDb21wYXJhYmxlVmFsdWUgPSBib29sZWFuIHwgc3RyaW5nIHwgbnVtYmVyO1xuXG50eXBlICRlcU9wZXJhdGlvbiAgPSB7ICRlcTogIENvbXBhcmFibGVWYWx1ZSB9O1xudHlwZSAkbHRPcGVyYXRpb24gID0geyAkbHQ6ICBDb21wYXJhYmxlVmFsdWUgfTtcbnR5cGUgJGx0ZU9wZXJhdGlvbiA9IHsgJGx0ZTogQ29tcGFyYWJsZVZhbHVlIH07XG50eXBlICRndE9wZXJhdGlvbiAgPSB7ICRndDogIENvbXBhcmFibGVWYWx1ZSB9O1xudHlwZSAkZ3RlT3BlcmF0aW9uID0geyAkZ3RlOiBDb21wYXJhYmxlVmFsdWUgfTtcbnR5cGUgJG5lT3BlcmF0aW9uICA9IHsgJG5lOiAgQ29tcGFyYWJsZVZhbHVlIH07XG50eXBlICRleGlzdHNPcGVyYXRpb24gPSB7ICRleGlzdHM6IENvbXBhcmFibGVWYWx1ZSB9O1xuXG5jb25zdCBpc0NvbXBhcmFibGUgPSAodjogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnYm9vbGVhbidcbiAgICAgICAgfHwgdHlwZW9mIHYgPT09ICdzdHJpbmcnXG4gICAgICAgIHx8IHR5cGVvZiB2ID09PSAnbnVtYmVyJztcbn1cblxuXG5jb25zdCAkZXEgPSAoc2VsOiBzdHJpbmcsIHRvc2VsOiBDb21wYXJhYmxlVmFsdWUpID0+IHtcbiAgICByZXR1cm4gU3FsU3RyaW5nLmZvcm1hdChbXG4gICAgICAgICcoICcsXG4gICAgICAgIC8vICdFWElTVFMganNvbl9leHRyYWN0KHZhbHVlLCA/KSAnLFxuICAgICAgICAvLyAnQU5EIGpzb25fZXh0cmFjdCh2YWx1ZSwgPykgPT0gPycsXG4gICAgICAgICdqc29uX2V4dHJhY3QodmFsdWUsID8pID09ID8nLFxuICAgICAgICAnICknXG4gICAgXS5qb2luKCcnKSxcbiAgICAgICAgWyAvKiBzZWwsICovIHNlbCwgdG9zZWwgXVxuICAgICk7XG59XG5cbmNvbnN0ICRsdCA9IChzZWw6IHN0cmluZywgdG9zZWw6IENvbXBhcmFibGVWYWx1ZSkgPT4ge1xuICAgIHJldHVybiBTcWxTdHJpbmcuZm9ybWF0KFtcbiAgICAgICAgJyggJyxcbiAgICAgICAgLy8gJ0VYSVNUUyBqc29uX2V4dHJhY3QodmFsdWUsID8pICcsXG4gICAgICAgIC8vICdBTkQganNvbl9leHRyYWN0KHZhbHVlLCA/KSA8ID8nLFxuICAgICAgICAnanNvbl9leHRyYWN0KHZhbHVlLCA/KSA8ID8nLFxuICAgICAgICAnICknXG4gICAgXS5qb2luKCcnKSxcbiAgICAgICAgWyAvKiBzZWwsICovIHNlbCwgdG9zZWwgXVxuICAgICk7XG59XG5cbmNvbnN0ICRsdGUgPSAoc2VsOiBzdHJpbmcsIHRvc2VsOiBDb21wYXJhYmxlVmFsdWUpID0+IHtcbiAgICByZXR1cm4gU3FsU3RyaW5nLmZvcm1hdChbXG4gICAgICAgICcoICcsXG4gICAgICAgIC8vICdFWElTVFMganNvbl9leHRyYWN0KHZhbHVlLCA/KSAnLFxuICAgICAgICAvLyAnQU5EIGpzb25fZXh0cmFjdCh2YWx1ZSwgPykgPD0gPycsXG4gICAgICAgICdqc29uX2V4dHJhY3QodmFsdWUsID8pIDw9ID8nLFxuICAgICAgICAnICknXG4gICAgXS5qb2luKCcnKSxcbiAgICAgICAgWyAvKiBzZWwsICovIHNlbCwgdG9zZWwgXVxuICAgICk7XG59XG5cbmNvbnN0ICRndCA9IChzZWw6IHN0cmluZywgdG9zZWw6IENvbXBhcmFibGVWYWx1ZSkgPT4ge1xuICAgIHJldHVybiBTcWxTdHJpbmcuZm9ybWF0KFtcbiAgICAgICAgJyggJyxcbiAgICAgICAgLy8gJ0VYSVNUUyBqc29uX2V4dHJhY3QodmFsdWUsID8pICcsXG4gICAgICAgIC8vICdBTkQganNvbl9leHRyYWN0KHZhbHVlLCA/KSA+ID8nLFxuICAgICAgICAnanNvbl9leHRyYWN0KHZhbHVlLCA/KSA+ID8nLFxuICAgICAgICAnICknXG4gICAgXS5qb2luKCcnKSxcbiAgICAgICAgWyAvKiBzZWwsICovIHNlbCwgdG9zZWwgXVxuICAgICk7XG59XG5cbmNvbnN0ICRndGUgPSAoc2VsOiBzdHJpbmcsIHRvc2VsOiBDb21wYXJhYmxlVmFsdWUpID0+IHtcbiAgICByZXR1cm4gU3FsU3RyaW5nLmZvcm1hdChbXG4gICAgICAgICcoICcsXG4gICAgICAgIC8vICdFWElTVFMganNvbl9leHRyYWN0KHZhbHVlLCA/KSAnLFxuICAgICAgICAvLyAnQU5EIGpzb25fZXh0cmFjdCh2YWx1ZSwgPykgPj0gPycsXG4gICAgICAgICdqc29uX2V4dHJhY3QodmFsdWUsID8pID49ID8nLFxuICAgICAgICAnICknXG4gICAgXS5qb2luKCcnKSxcbiAgICAgICAgWyAvKiBzZWwsICovIHNlbCwgdG9zZWwgXVxuICAgICk7XG59XG5cbmNvbnN0ICRuZSA9IChzZWw6IHN0cmluZywgdG9zZWw6IENvbXBhcmFibGVWYWx1ZSkgPT4ge1xuICAgIHJldHVybiBTcWxTdHJpbmcuZm9ybWF0KFtcbiAgICAgICAgJyggJyxcbiAgICAgICAgLy8gJ0VYSVNUUyBqc29uX2V4dHJhY3QodmFsdWUsID8pICcsXG4gICAgICAgIC8vICdBTkQganNvbl9leHRyYWN0KHZhbHVlLCA/KSA8PiA/JyxcbiAgICAgICAgJ2pzb25fZXh0cmFjdCh2YWx1ZSwgPykgPD4gPycsXG4gICAgICAgICcgKSdcbiAgICBdLmpvaW4oJycpLFxuICAgICAgICBbIC8qIHNlbCwgKi8gc2VsLCB0b3NlbCBdXG4gICAgKTtcbn1cblxuY29uc3QgJGV4aXN0cyA9IChzZWw6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBTcWxTdHJpbmcuZm9ybWF0KFtcbiAgICAgICAgJyggJyxcbiAgICAgICAgJ0VYSVNUUyhqc29uX2V4dHJhY3QodmFsdWUsID8pKSAnLFxuICAgICAgICAnICknXG4gICAgXS5qb2luKCcnKSxcbiAgICAgICAgWyBzZWwgXVxuICAgICk7XG59XG5cbmNvbnN0ICRudWxsID0gKHNlbDogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIFNxbFN0cmluZy5mb3JtYXQoW1xuICAgICAgICAnKCAnLFxuICAgICAgICAnanNvbl9leHRyYWN0KHZhbHVlLCA/KSBJUyBOVUxMICcsXG4gICAgICAgICcgKSdcbiAgICBdLmpvaW4oJycpLFxuICAgICAgICBbIHNlbCBdXG4gICAgKTtcbn1cblxuY29uc3QgJG5vdG51bGwgPSAoc2VsOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gU3FsU3RyaW5nLmZvcm1hdChbXG4gICAgICAgICcoICcsXG4gICAgICAgICdqc29uX2V4dHJhY3QodmFsdWUsID8pIElTIE5PVCBOVUxMICcsXG4gICAgICAgICcgKSdcbiAgICBdLmpvaW4oJycpLFxuICAgICAgICBbIHNlbCBdXG4gICAgKTtcbn1cblxuY29uc3QgJGxpa2UgPSAoc2VsOiBzdHJpbmcsIHRvc2VsOiBDb21wYXJhYmxlVmFsdWUpID0+IHtcbiAgICByZXR1cm4gU3FsU3RyaW5nLmZvcm1hdChbXG4gICAgICAgICcoICcsXG4gICAgICAgIC8vICdFWElTVFMganNvbl9leHRyYWN0KHZhbHVlLCA/KSAnLFxuICAgICAgICAvLyAnQU5EIGpzb25fZXh0cmFjdCh2YWx1ZSwgPykgTElLRSA/JyxcbiAgICAgICAgJ2pzb25fZXh0cmFjdCh2YWx1ZSwgPykgTElLRSA/JyxcbiAgICAgICAgJyApJ1xuICAgIF0uam9pbignJyksXG4gICAgICAgIFsgLyogc2VsLCAqLyBzZWwsIHRvc2VsIF1cbiAgICApO1xufVxuXG5jb25zdCAkZ2xvYiA9IChzZWw6IHN0cmluZywgdG9zZWw6IENvbXBhcmFibGVWYWx1ZSkgPT4ge1xuICAgIHJldHVybiBTcWxTdHJpbmcuZm9ybWF0KFtcbiAgICAgICAgJyggJyxcbiAgICAgICAgLy8gJ0VYSVNUUyBqc29uX2V4dHJhY3QodmFsdWUsID8pICcsXG4gICAgICAgIC8vICdBTkQganNvbl9leHRyYWN0KHZhbHVlLCA/KSBHTE9CID8nLFxuICAgICAgICAnanNvbl9leHRyYWN0KHZhbHVlLCA/KSBHTE9CID8nLFxuICAgICAgICAnICknXG4gICAgXS5qb2luKCcnKSxcbiAgICAgICAgWyAvKiBzZWwsICovIHNlbCwgdG9zZWwgXVxuICAgICk7XG59XG5cbmNvbnN0ICRyZWdleHAgPSAoc2VsOiBzdHJpbmcsIHRvc2VsOiBDb21wYXJhYmxlVmFsdWUpID0+IHtcbiAgICByZXR1cm4gU3FsU3RyaW5nLmZvcm1hdChbXG4gICAgICAgICcoICcsXG4gICAgICAgIC8vICdFWElTVFMganNvbl9leHRyYWN0KHZhbHVlLCA/KSAnLFxuICAgICAgICAvLyAnQU5EIGpzb25fZXh0cmFjdCh2YWx1ZSwgPykgcmVnZXhwID8nLFxuICAgICAgICAnanNvbl9leHRyYWN0KHZhbHVlLCA/KSByZWdleHAgPycsXG4gICAgICAgICcgKSdcbiAgICBdLmpvaW4oJycpLFxuICAgICAgICBbIC8qIHNlbCwgKi8gc2VsLCB0b3NlbCBdXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlQXJyYXlTZWxlY3RvcihzZWxlY3RvcnM6IEFycmF5PGFueT4pXG4gICAgOiBBcnJheTxzdHJpbmc+XG57XG5cbiAgICBjb25zdCBxdWVyaWVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3Qgc2VsIG9mIHNlbGVjdG9ycykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzZWwpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kIGFycmF5IGluIGFycmF5IHNlbGVjdG9ycyAke3V0aWwuaW5zcGVjdChzZWwpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VsICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3VuZCBub24tb2JqZWN0IHNlbGVjdG9yICR7dXRpbC5pbnNwZWN0KHNlbCl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWxzID0gaGFuZGxlT2JqZWN0U2VsZWN0b3Ioc2VsKTtcbiAgICAgICAgcXVlcmllcy5wdXNoKFxuICAgICAgICAgICAgJyggJyArIHNlbHMuam9pbignIEFORCAnKSArICcgKSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcXVlcmllcztcbn1cblxuZnVuY3Rpb24gaGFuZGxlT2JqZWN0U2VsZWN0b3Ioc2VsZWN0b3JzOiBhbnkpXG4gICAgOiBBcnJheTxzdHJpbmc+XG57XG5cbiAgICBjb25zdCBxdWVyaWVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3Qgc2VsIGluIHNlbGVjdG9ycykge1xuICAgICAgICBpZiAoISh0eXBlb2Ygc2VsID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaGFuZGxlT2JqZWN0U2VsZWN0b3IgZ290IGludmFsaWQgc2VsZWN0b3IgJHt1dGlsLmluc3BlY3Qoc2VsKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvc2VsID0gc2VsZWN0b3JzW3NlbF07XG5cbiAgICAgICAgaWYgKHNlbCA9PT0gJyRvcicgJiYgIShBcnJheS5pc0FycmF5KHRvc2VsKSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc2VsZWN0b3JzMndoZXJlIGdvdCAkb3Igd2l0aG91dCBhcnJheSAke3V0aWwuaW5zcGVjdCh0b3NlbCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbCA9PT0gJyRvcicpIHtcbiAgICAgICAgICAgIHF1ZXJpZXMucHVzaChcbiAgICAgICAgICAgICAgICAnKCAnICsgaGFuZGxlQXJyYXlTZWxlY3Rvcih0b3NlbCkuam9pbignIE9SICcpICsgJyApJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWwgPT09ICckYW5kJyAmJiAhKEFycmF5LmlzQXJyYXkodG9zZWwpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZWxlY3RvcnMyd2hlcmUgZ290ICRhbmQgd2l0aG91dCBhcnJheSAke3V0aWwuaW5zcGVjdCh0b3NlbCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbCA9PT0gJyRhbmQnKSB7XG4gICAgICAgICAgICBxdWVyaWVzLnB1c2goXG4gICAgICAgICAgICAgICAgJyggJyArIGhhbmRsZUFycmF5U2VsZWN0b3IodG9zZWwpLmpvaW4oJyBBTkQgJykgKyAnICknXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsID09PSAnJGV4aXN0cycpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdG9zZWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbmNvcnJlY3Qgb3BlcmFuZCAke3V0aWwuaW5zcGVjdCh0b3NlbCl9IGZvciAkZXhpc3RzYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWVyaWVzLnB1c2goXG4gICAgICAgICAgICAgICAgJyggJyArICRleGlzdHModG9zZWwpICsgJyApJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbCA9PT0gJyRudWxsJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0b3NlbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluY29ycmVjdCBvcGVyYW5kICR7dXRpbC5pbnNwZWN0KHRvc2VsKX0gZm9yICRudWxsYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWVyaWVzLnB1c2goXG4gICAgICAgICAgICAgICAgJyggJyArICRudWxsKHRvc2VsKSArICcgKSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWwgPT09ICckbm90bnVsbCcpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdG9zZWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbmNvcnJlY3Qgb3BlcmFuZCAke3V0aWwuaW5zcGVjdCh0b3NlbCl9IGZvciAkbm90bnVsbGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVlcmllcy5wdXNoKFxuICAgICAgICAgICAgICAgICcoICcgKyAkbm90bnVsbCh0b3NlbCkgKyAnICknXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUSGUgZGVmYXVsdCBhY3Rpb24gaXMgZXF1YWxpdHlcbiAgICAgICAgaWYgKGlzQ29tcGFyYWJsZSh0b3NlbCkpIHtcbiAgICAgICAgICAgIHF1ZXJpZXMucHVzaCgkZXEoc2VsLCB0b3NlbCkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRvc2VsID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRvc2VsKTtcbiAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA8IDEgfHwga2V5cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZWxlY3RvcnMyd2hlcmUgZ290IGluY29ycmVjdCBjb21wYXJpc29uIG9wZXJhbmQgZm9yICR7dXRpbC5pbnNwZWN0KHNlbCl9IHdpdGggJHt1dGlsLmluc3BlY3QodG9zZWwpfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb3AgPSBrZXlzWzBdO1xuICAgICAgICAgICAgY29uc3Qgb3JzZWwgPSB0b3NlbFtvcF07XG4gICAgICAgICAgICBpZiAob3AgPT09ICckZXEnKSB7XG4gICAgICAgICAgICAgICAgcXVlcmllcy5wdXNoKCRlcShzZWwsIG9yc2VsKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAnJGx0Jykge1xuICAgICAgICAgICAgICAgIHF1ZXJpZXMucHVzaCgkbHQoc2VsLCBvcnNlbCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gJyRsdGUnKSB7XG4gICAgICAgICAgICAgICAgcXVlcmllcy5wdXNoKCRsdGUoc2VsLCBvcnNlbCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gJyRndCcpIHtcbiAgICAgICAgICAgICAgICBxdWVyaWVzLnB1c2goJGd0KHNlbCwgb3JzZWwpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09ICckZ3RlJykge1xuICAgICAgICAgICAgICAgIHF1ZXJpZXMucHVzaCgkZ3RlKHNlbCwgb3JzZWwpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09ICckbmUnKSB7XG4gICAgICAgICAgICAgICAgcXVlcmllcy5wdXNoKCRuZShzZWwsIG9yc2VsKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAnJGV4aXN0cycpIHtcbiAgICAgICAgICAgICAgICBxdWVyaWVzLnB1c2goJGV4aXN0cyhzZWwpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09ICckbGlrZScpIHtcbiAgICAgICAgICAgICAgICBxdWVyaWVzLnB1c2goJGxpa2Uoc2VsLCBvcnNlbCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gJyRnbG9iJykge1xuICAgICAgICAgICAgICAgIHF1ZXJpZXMucHVzaCgkZ2xvYihzZWwsIG9yc2VsKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAnJHJlZ2V4cCcpIHtcbiAgICAgICAgICAgICAgICBxdWVyaWVzLnB1c2goJHJlZ2V4cChzZWwsIG9yc2VsKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc2VsZWN0b3JzMndoZXJlIGdvdCBpbnZhbGlkIG9wZXJhdG9yICR7dXRpbC5pbnNwZWN0KG9wKX0gaW4gJHt1dGlsLmluc3BlY3QodG9zZWwpfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBxdWVyaWVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0b3JzMndoZXJlKHNlbGVjdG9yczogYW55KSB7XG5cbiAgICBpZiAodHlwZW9mIHNlbGVjdG9ycyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbmNvcnJlY3QgdHlwZSBmb3Igc2VsZWN0b3IgJHt1dGlsLmluc3BlY3Qoc2VsZWN0b3JzKX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyaWVzID0gaGFuZGxlT2JqZWN0U2VsZWN0b3Ioc2VsZWN0b3JzKTtcbiAgICByZXR1cm4gLyogJyggJyArICovIHF1ZXJpZXMuam9pbignIEFORCAnKSAvKiArICcgKScgKi87XG59Il19