ddb-table
Version:
Strongly typed library for querying and modeling DynamoDB documents.
112 lines (111 loc) • 26.1 kB
JavaScript
"use strict";
exports.__esModule = true;
exports.default = void 0;
var _UpdateValueExpression = _interopRequireDefault(require("./UpdateValueExpression"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// Docs:
// https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html
class UpdateExpression {
constructor(names, values, init) {
this.names = void 0;
this.values = void 0;
this.sets = void 0;
this.removes = void 0;
this.adds = void 0;
this.deletes = void 0;
this.names = names;
this.values = values;
this.sets = {};
this.removes = {};
this.adds = {};
this.deletes = {};
if (!init) return;
const parts = init.trim().split(/(?:^|\s+)(SET|REMOVE|ADD|DELETE)(?:\s+)/gi);
for (let i = 1; i < parts.length; i += 2) {
const action = parts[i];
const terms = parts[i + 1].split(/\s*,\s*/g);
switch (action.toUpperCase()) {
case 'SET':
{
for (const term of terms) {
const [path, value] = term.split(/\s*=\s*/);
this.sets[path] = value;
}
break;
}
case 'REMOVE':
{
for (const term of terms) {
this.removes[term] = 1;
}
break;
}
case 'ADD':
{
for (const term of terms) {
const [path, value] = term.split(/\s+/);
this.adds[path] = value;
}
break;
}
case 'DELETE':
{
for (const term of terms) {
const [path, value] = term.split(/\s+/);
this.deletes[path] = value;
}
break;
}
}
}
}
set(path, value) {
if (!Array.isArray(path)) {
path = [path];
}
const pathName = this.names.add(...path);
const valueKey = String(path[path.length - 1]);
this.sets[pathName] = typeof value === 'function' ? value(new _UpdateValueExpression.default(this.names, this.values, pathName, valueKey)) : this.values.add(valueKey, value);
return this;
}
remove(...path) {
this.removes[this.names.add(...path)] = 1;
return this;
}
add(path, value) {
if (!Array.isArray(path)) {
path = [path];
}
this.adds[this.names.add(...path)] = this.values.add(String(path[path.length - 1]), value);
return this;
}
delete(path, value) {
if (!Array.isArray(path)) {
path = [path];
}
this.deletes[this.names.add(...path)] = this.values.add(String(path[path.length - 1]), value);
return this;
}
serialize() {
const exp = [];
const sets = Object.entries(this.sets).map(([key, value]) => `${key} = ${value}`);
if (sets.length) {
exp.push(`SET ${sets.join(', ')}`);
}
const removes = Object.keys(this.removes);
if (removes.length) {
exp.push(`REMOVE ${removes.join(', ')}`);
}
const adds = Object.entries(this.adds).map(([key, value]) => `${key} ${value}`);
if (adds.length) {
exp.push(`ADD ${adds.join(', ')}`);
}
const deletes = Object.entries(this.deletes).map(([key, value]) => `${key} ${value}`);
if (deletes.length) {
exp.push(`DELETE ${deletes.join(', ')}`);
}
return exp.join(' ') || undefined;
}
}
exports.default = UpdateExpression;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfVXBkYXRlVmFsdWVFeHByZXNzaW9uIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIlVwZGF0ZUV4cHJlc3Npb24iLCJjb25zdHJ1Y3RvciIsIm5hbWVzIiwidmFsdWVzIiwiaW5pdCIsInNldHMiLCJyZW1vdmVzIiwiYWRkcyIsImRlbGV0ZXMiLCJwYXJ0cyIsInRyaW0iLCJzcGxpdCIsImkiLCJsZW5ndGgiLCJhY3Rpb24iLCJ0ZXJtcyIsInRvVXBwZXJDYXNlIiwidGVybSIsInBhdGgiLCJ2YWx1ZSIsInNldCIsIkFycmF5IiwiaXNBcnJheSIsInBhdGhOYW1lIiwiYWRkIiwidmFsdWVLZXkiLCJTdHJpbmciLCJVcGRhdGVWYWx1ZUV4cHJlc3Npb24iLCJyZW1vdmUiLCJkZWxldGUiLCJzZXJpYWxpemUiLCJleHAiLCJPYmplY3QiLCJlbnRyaWVzIiwibWFwIiwia2V5IiwicHVzaCIsImpvaW4iLCJrZXlzIiwidW5kZWZpbmVkIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leHByZXNzaW9ucy9VcGRhdGVFeHByZXNzaW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFVwZGF0ZUV4cHJlc3Npb24gYXMgVXBkYXRlRXhwcmVzc2lvblN0ciB9IGZyb20gJy4uL0RvY3VtZW50Q2xpZW50JztcbmltcG9ydCBFeHByZXNzaW9uQXR0cmlidXRlTmFtZXMgZnJvbSAnLi9FeHByZXNzaW9uQXR0cmlidXRlTmFtZXMnO1xuaW1wb3J0IEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXMgZnJvbSAnLi9FeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzJztcbmltcG9ydCBVcGRhdGVWYWx1ZUV4cHJlc3Npb24gZnJvbSAnLi9VcGRhdGVWYWx1ZUV4cHJlc3Npb24nO1xuXG4vLyBEb2NzOlxuLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbmR5bmFtb2RiL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9FeHByZXNzaW9ucy5VcGRhdGVFeHByZXNzaW9ucy5odG1sXG5cbmV4cG9ydCB0eXBlIEFkZFZhbHVlPFQ+ID0gW1RdIGV4dGVuZHMgW1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBTZXQ8YW55PiB8IG51bWJlciB8IHVuZGVmaW5lZCxcbl1cbiAgPyBUXG4gIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIERlbGV0ZVZhbHVlPFQ+ID0gW1RdIGV4dGVuZHMgW1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBTZXQ8YW55PiB8IHVuZGVmaW5lZCxcbl1cbiAgPyBUXG4gIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIFNldFZhbHVlPFQsIFY+ID0gViB8ICgoZXhwOiBVcGRhdGVWYWx1ZUV4cHJlc3Npb248VCwgVj4pID0+IHN0cmluZyk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVwZGF0ZUV4cHJlc3Npb248VD4ge1xuICBwcml2YXRlIG5hbWVzOiBFeHByZXNzaW9uQXR0cmlidXRlTmFtZXM8VD47XG4gIHByaXZhdGUgdmFsdWVzOiBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzO1xuXG4gIHByaXZhdGUgc2V0czogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgcHJpdmF0ZSByZW1vdmVzOiB7IFtrZXk6IHN0cmluZ106IDEgfTtcbiAgcHJpdmF0ZSBhZGRzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICBwcml2YXRlIGRlbGV0ZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIG5hbWVzOiBFeHByZXNzaW9uQXR0cmlidXRlTmFtZXM8VD4sXG4gICAgdmFsdWVzOiBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzLFxuICAgIGluaXQ/OiBVcGRhdGVFeHByZXNzaW9uU3RyLFxuICApIHtcbiAgICB0aGlzLm5hbWVzID0gbmFtZXM7XG4gICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgICB0aGlzLnNldHMgPSB7fTtcbiAgICB0aGlzLnJlbW92ZXMgPSB7fTtcbiAgICB0aGlzLmFkZHMgPSB7fTtcbiAgICB0aGlzLmRlbGV0ZXMgPSB7fTtcblxuICAgIGlmICghaW5pdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFydHMgPSBpbml0XG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoLyg/Ol58XFxzKykoU0VUfFJFTU9WRXxBRER8REVMRVRFKSg/OlxccyspL2dpKTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhcnRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBwYXJ0c1tpXTtcbiAgICAgIGNvbnN0IHRlcm1zID0gcGFydHNbaSArIDFdLnNwbGl0KC9cXHMqLFxccyovZyk7XG5cbiAgICAgIHN3aXRjaCAoYWN0aW9uLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgY2FzZSAnU0VUJzoge1xuICAgICAgICAgIGZvciAoY29uc3QgdGVybSBvZiB0ZXJtcykge1xuICAgICAgICAgICAgY29uc3QgW3BhdGgsIHZhbHVlXSA9IHRlcm0uc3BsaXQoL1xccyo9XFxzKi8pO1xuICAgICAgICAgICAgdGhpcy5zZXRzW3BhdGhdID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnUkVNT1ZFJzoge1xuICAgICAgICAgIGZvciAoY29uc3QgdGVybSBvZiB0ZXJtcykge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVzW3Rlcm1dID0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdBREQnOiB7XG4gICAgICAgICAgZm9yIChjb25zdCB0ZXJtIG9mIHRlcm1zKSB7XG4gICAgICAgICAgICBjb25zdCBbcGF0aCwgdmFsdWVdID0gdGVybS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgdGhpcy5hZGRzW3BhdGhdID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnREVMRVRFJzoge1xuICAgICAgICAgIGZvciAoY29uc3QgdGVybSBvZiB0ZXJtcykge1xuICAgICAgICAgICAgY29uc3QgW3BhdGgsIHZhbHVlXSA9IHRlcm0uc3BsaXQoL1xccysvKTtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlc1twYXRoXSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXQ8SzEgZXh0ZW5kcyBrZXlvZiBUPihcbiAgICBwYXRoOiBLMSB8IFtLMV0sXG4gICAgdmFsdWU6IFNldFZhbHVlPFQsIFRbSzFdPixcbiAgKTogdGhpcztcbiAgcHVibGljIHNldDxLMSBleHRlbmRzIGtleW9mIFQsIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0+KFxuICAgIHBhdGg6IFtLMSwgSzJdLFxuICAgIHZhbHVlOiBTZXRWYWx1ZTxULCBUW0sxXVtLMl0+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgc2V0PFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICA+KHBhdGg6IFtLMSwgSzIsIEszXSwgdmFsdWU6IFNldFZhbHVlPFQsIFRbSzFdW0syXVtLM10+KTogdGhpcztcbiAgcHVibGljIHNldDxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gID4ocGF0aDogW0sxLCBLMiwgSzMsIEs0XSwgdmFsdWU6IFNldFZhbHVlPFQsIFRbSzFdW0syXVtLM11bSzRdPik6IHRoaXM7XG4gIHB1YmxpYyBzZXQ8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gID4oXG4gICAgcGF0aDogW0sxLCBLMiwgSzMsIEs0LCBLNV0sXG4gICAgdmFsdWU6IFNldFZhbHVlPFQsIFRbSzFdW0syXVtLM11bSzRdW0s1XT4sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBzZXQ8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gICAgSzYgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV0sXG4gID4oXG4gICAgcGF0aDogW0sxLCBLMiwgSzMsIEs0LCBLNSwgSzZdLFxuICAgIHZhbHVlOiBTZXRWYWx1ZTxULCBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdPixcbiAgKTogdGhpcztcbiAgcHVibGljIHNldDxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gICAgSzUgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XSxcbiAgICBLNiBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XSxcbiAgICBLNyBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl0sXG4gID4oXG4gICAgcGF0aDogW0sxLCBLMiwgSzMsIEs0LCBLNSwgSzYsIEs3XSxcbiAgICB2YWx1ZTogU2V0VmFsdWU8VCwgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XVtLN10+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgc2V0PFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICAgIEs2IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdLFxuICAgIEs3IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XSxcbiAgICBLOCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddLFxuICA+KFxuICAgIHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzUsIEs2LCBLNywgSzhdLFxuICAgIHZhbHVlOiBTZXRWYWx1ZTxULCBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdW0s3XVtLOF0+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgc2V0PFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICAgIEs2IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdLFxuICAgIEs3IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XSxcbiAgICBLOCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddLFxuICA+KFxuICAgIHBhdGg6IEsxIHwgW0sxLCBLMj8sIEszPywgSzQ/LCBLNT8sIEs2PywgSzc/LCBLOD8sIC4uLihzdHJpbmcgfCBudW1iZXIpW11dLFxuICAgIHZhbHVlOiBTZXRWYWx1ZTxULCB1bmtub3duPixcbiAgKTogdGhpcyB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhdGgpKSB7XG4gICAgICBwYXRoID0gW3BhdGhdO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGhOYW1lID0gdGhpcy5uYW1lcy5hZGQoLi4ucGF0aCk7XG4gICAgY29uc3QgdmFsdWVLZXkgPSBTdHJpbmcocGF0aFtwYXRoLmxlbmd0aCAtIDFdKTtcblxuICAgIHRoaXMuc2V0c1twYXRoTmFtZV0gPVxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gdmFsdWUoXG4gICAgICAgICAgICBuZXcgVXBkYXRlVmFsdWVFeHByZXNzaW9uKFxuICAgICAgICAgICAgICB0aGlzLm5hbWVzLFxuICAgICAgICAgICAgICB0aGlzLnZhbHVlcyxcbiAgICAgICAgICAgICAgcGF0aE5hbWUsXG4gICAgICAgICAgICAgIHZhbHVlS2V5LFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApXG4gICAgICAgIDogdGhpcy52YWx1ZXMuYWRkKHZhbHVlS2V5LCB2YWx1ZSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmU8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gICAgSzYgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV0sXG4gICAgSzcgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdLFxuICAgIEs4IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XVtLN10sXG4gID4oXG4gICAgLi4ucGF0aDogW0sxLCBLMj8sIEszPywgSzQ/LCBLNT8sIEs2PywgSzc/LCBLOD8sIC4uLihzdHJpbmcgfCBudW1iZXIpW11dXG4gICk6IHRoaXMge1xuICAgIHRoaXMucmVtb3Zlc1t0aGlzLm5hbWVzLmFkZCguLi5wYXRoKV0gPSAxO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgYWRkPEsxIGV4dGVuZHMga2V5b2YgVD4ocGF0aDogSzEgfCBbSzFdLCB2YWx1ZTogQWRkVmFsdWU8VFtLMV0+KTogdGhpcztcbiAgcHVibGljIGFkZDxLMSBleHRlbmRzIGtleW9mIFQsIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0+KFxuICAgIHBhdGg6IFtLMSwgSzJdLFxuICAgIHZhbHVlOiBBZGRWYWx1ZTxUW0sxXVtLMl0+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgYWRkPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICA+KHBhdGg6IFtLMSwgSzIsIEszXSwgdmFsdWU6IEFkZFZhbHVlPFRbSzFdW0syXVtLM10+KTogdGhpcztcbiAgcHVibGljIGFkZDxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gID4ocGF0aDogW0sxLCBLMiwgSzMsIEs0XSwgdmFsdWU6IEFkZFZhbHVlPFRbSzFdW0syXVtLM11bSzRdPik6IHRoaXM7XG4gIHB1YmxpYyBhZGQ8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gID4ocGF0aDogW0sxLCBLMiwgSzMsIEs0LCBLNV0sIHZhbHVlOiBBZGRWYWx1ZTxUW0sxXVtLMl1bSzNdW0s0XVtLNV0+KTogdGhpcztcbiAgcHVibGljIGFkZDxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gICAgSzUgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XSxcbiAgICBLNiBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XSxcbiAgPihcbiAgICBwYXRoOiBbSzEsIEsyLCBLMywgSzQsIEs1LCBLNl0sXG4gICAgdmFsdWU6IEFkZFZhbHVlPFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl0+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgYWRkPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICAgIEs2IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdLFxuICAgIEs3IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XSxcbiAgPihcbiAgICBwYXRoOiBbSzEsIEsyLCBLMywgSzQsIEs1LCBLNiwgSzddLFxuICAgIHZhbHVlOiBBZGRWYWx1ZTxUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdW0s3XT4sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBhZGQ8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gICAgSzYgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV0sXG4gICAgSzcgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdLFxuICAgIEs4IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XVtLN10sXG4gID4oXG4gICAgcGF0aDogW0sxLCBLMiwgSzMsIEs0LCBLNSwgSzYsIEs3LCBLOF0sXG4gICAgdmFsdWU6IEFkZFZhbHVlPFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddW0s4XT4sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBhZGQ8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gICAgSzYgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV0sXG4gICAgSzcgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdLFxuICAgIEs4IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XVtLN10sXG4gID4oXG4gICAgcGF0aDogSzEgfCBbSzEsIEsyPywgSzM/LCBLND8sIEs1PywgSzY/LCBLNz8sIEs4PywgLi4uKHN0cmluZyB8IG51bWJlcilbXV0sXG4gICAgdmFsdWU6IHVua25vd24sXG4gICk6IHRoaXMge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgICAgcGF0aCA9IFtwYXRoXTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZHNbdGhpcy5uYW1lcy5hZGQoLi4ucGF0aCldID0gdGhpcy52YWx1ZXMuYWRkKFxuICAgICAgU3RyaW5nKHBhdGhbcGF0aC5sZW5ndGggLSAxXSksXG4gICAgICB2YWx1ZSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlPEsxIGV4dGVuZHMga2V5b2YgVD4oXG4gICAgcGF0aDogSzEgfCBbSzFdLFxuICAgIHZhbHVlOiBEZWxldGVWYWx1ZTxUW0sxXT4sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBkZWxldGU8SzEgZXh0ZW5kcyBrZXlvZiBULCBLMiBleHRlbmRzIGtleW9mIFRbSzFdPihcbiAgICBwYXRoOiBbSzEsIEsyXSxcbiAgICB2YWx1ZTogRGVsZXRlVmFsdWU8VFtLMV1bSzJdPixcbiAgKTogdGhpcztcbiAgcHVibGljIGRlbGV0ZTxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgPihwYXRoOiBbSzEsIEsyLCBLM10sIHZhbHVlOiBEZWxldGVWYWx1ZTxUW0sxXVtLMl1bSzNdPik6IHRoaXM7XG4gIHB1YmxpYyBkZWxldGU8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICA+KHBhdGg6IFtLMSwgSzIsIEszLCBLNF0sIHZhbHVlOiBEZWxldGVWYWx1ZTxUW0sxXVtLMl1bSzNdW0s0XT4pOiB0aGlzO1xuICBwdWJsaWMgZGVsZXRlPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICA+KFxuICAgIHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzVdLFxuICAgIHZhbHVlOiBEZWxldGVWYWx1ZTxUW0sxXVtLMl1bSzNdW0s0XVtLNV0+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgZGVsZXRlPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICAgIEs2IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdLFxuICA+KFxuICAgIHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzUsIEs2XSxcbiAgICB2YWx1ZTogRGVsZXRlVmFsdWU8VFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XT4sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBkZWxldGU8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gICAgSzYgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV0sXG4gICAgSzcgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdLFxuICA+KFxuICAgIHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzUsIEs2LCBLN10sXG4gICAgdmFsdWU6IERlbGV0ZVZhbHVlPFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddPixcbiAgKTogdGhpcztcbiAgcHVibGljIGRlbGV0ZTxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gICAgSzUgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XSxcbiAgICBLNiBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XSxcbiAgICBLNyBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl0sXG4gICAgSzggZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdW0s3XSxcbiAgPihcbiAgICBwYXRoOiBbSzEsIEsyLCBLMywgSzQsIEs1LCBLNiwgSzcsIEs4XSxcbiAgICB2YWx1ZTogRGVsZXRlVmFsdWU8VFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XVtLN11bSzhdPixcbiAgKTogdGhpcztcbiAgcHVibGljIGRlbGV0ZTxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gICAgSzUgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XSxcbiAgICBLNiBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XSxcbiAgICBLNyBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl0sXG4gICAgSzggZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdW0s3XSxcbiAgPihcbiAgICBwYXRoOiBLMSB8IFtLMSwgSzI/LCBLMz8sIEs0PywgSzU/LCBLNj8sIEs3PywgSzg/LCAuLi4oc3RyaW5nIHwgbnVtYmVyKVtdXSxcbiAgICB2YWx1ZTogRGVsZXRlVmFsdWU8dW5rbm93bj4sXG4gICk6IHRoaXMge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgICAgcGF0aCA9IFtwYXRoXTtcbiAgICB9XG5cbiAgICB0aGlzLmRlbGV0ZXNbdGhpcy5uYW1lcy5hZGQoLi4ucGF0aCldID0gdGhpcy52YWx1ZXMuYWRkKFxuICAgICAgU3RyaW5nKHBhdGhbcGF0aC5sZW5ndGggLSAxXSksXG4gICAgICB2YWx1ZSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2VyaWFsaXplKCk6IFVwZGF0ZUV4cHJlc3Npb25TdHIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGV4cDogc3RyaW5nW10gPSBbXTtcblxuICAgIGNvbnN0IHNldHMgPSBPYmplY3QuZW50cmllcyh0aGlzLnNldHMpLm1hcChcbiAgICAgIChba2V5LCB2YWx1ZV0pID0+IGAke2tleX0gPSAke3ZhbHVlfWAsXG4gICAgKTtcbiAgICBpZiAoc2V0cy5sZW5ndGgpIHtcbiAgICAgIGV4cC5wdXNoKGBTRVQgJHtzZXRzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVtb3ZlcyA9IE9iamVjdC5rZXlzKHRoaXMucmVtb3Zlcyk7XG4gICAgaWYgKHJlbW92ZXMubGVuZ3RoKSB7XG4gICAgICBleHAucHVzaChgUkVNT1ZFICR7cmVtb3Zlcy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGFkZHMgPSBPYmplY3QuZW50cmllcyh0aGlzLmFkZHMpLm1hcChcbiAgICAgIChba2V5LCB2YWx1ZV0pID0+IGAke2tleX0gJHt2YWx1ZX1gLFxuICAgICk7XG4gICAgaWYgKGFkZHMubGVuZ3RoKSB7XG4gICAgICBleHAucHVzaChgQUREICR7YWRkcy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRlbGV0ZXMgPSBPYmplY3QuZW50cmllcyh0aGlzLmRlbGV0ZXMpLm1hcChcbiAgICAgIChba2V5LCB2YWx1ZV0pID0+IGAke2tleX0gJHt2YWx1ZX1gLFxuICAgICk7XG4gICAgaWYgKGRlbGV0ZXMubGVuZ3RoKSB7XG4gICAgICBleHAucHVzaChgREVMRVRFICR7ZGVsZXRlcy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIHJldHVybiBleHAuam9pbignICcpIHx8IHVuZGVmaW5lZDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBR0EsSUFBQUEsc0JBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUE0RCxTQUFBRCx1QkFBQUUsR0FBQSxXQUFBQSxHQUFBLElBQUFBLEdBQUEsQ0FBQUMsVUFBQSxHQUFBRCxHQUFBLEtBQUFFLE9BQUEsRUFBQUYsR0FBQTtBQUU1RDtBQUNBO0FBa0JlLE1BQU1HLGdCQUFnQixDQUFJO0VBU2hDQyxXQUFXQSxDQUNoQkMsS0FBa0MsRUFDbENDLE1BQWlDLEVBQ2pDQyxJQUEwQixFQUMxQjtJQUFBLEtBWk1GLEtBQUs7SUFBQSxLQUNMQyxNQUFNO0lBQUEsS0FFTkUsSUFBSTtJQUFBLEtBQ0pDLE9BQU87SUFBQSxLQUNQQyxJQUFJO0lBQUEsS0FDSkMsT0FBTztJQU9iLElBQUksQ0FBQ04sS0FBSyxHQUFHQSxLQUFLO0lBQ2xCLElBQUksQ0FBQ0MsTUFBTSxHQUFHQSxNQUFNO0lBRXBCLElBQUksQ0FBQ0UsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNkLElBQUksQ0FBQ0MsT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNqQixJQUFJLENBQUNDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDZCxJQUFJLENBQUNDLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFFakIsSUFBSSxDQUFDSixJQUFJLEVBQUU7SUFFWCxNQUFNSyxLQUFLLEdBQUdMLElBQUksQ0FDZk0sSUFBSSxFQUFFLENBQ05DLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQztJQUNyRCxLQUFLLElBQUlDLENBQUMsR0FBRyxDQUFDLEVBQUVB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