ddb-table
Version:
Strongly typed library for querying and modeling DynamoDB documents.
190 lines (189 loc) • 73.8 kB
JavaScript
"use strict";
exports.__esModule = true;
exports.default = void 0;
// Docs:
// https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html
const OppsiteOperandMatch = {
AND: /[ )]OR[ (]/i,
OR: /[ )]AND[ (]/i
};
class ConditionExpression {
static getAttributeTypeString(type) {
if (typeof type === 'string') {
return type;
}
switch (type) {
case String:
return 'S';
case Number:
return 'N';
case ArrayBuffer:
case Buffer:
return 'B';
case Boolean:
return 'BOOL';
case null:
return 'NULL';
case Array:
return 'L';
case Object:
return 'M';
default:
if (Array.isArray(type) && type.length === 1) {
switch (type[0]) {
case String:
return 'SS';
case Number:
return 'NS';
case Buffer:
case ArrayBuffer:
return 'BS';
}
}
throw new TypeError(`Unknown attribute type: ${type}`);
}
}
constructor(names, values, init) {
this.names = void 0;
this.values = void 0;
this.expression = void 0;
this.names = names;
this.values = values;
if (init) {
if (typeof init === 'string') {
this.expression = init.trim().replace(/\s+/g, ' ').replace(/\(\s+/g, '(').replace(/\s+\)/g, ')') || '';
} else {
this.expression = init.expression;
}
} else {
this.expression = '';
}
}
serialize() {
return this.expression || undefined;
}
name(...path) {
return this.names.add(...path);
}
value(key, value) {
return this.values.add(key, value);
}
eq(path, value) {
return this.comparator('=', path, value);
}
nq(path, value) {
return this.comparator('<>', path, value);
}
lt(path, value) {
return this.comparator('<', path, value);
}
lte(path, value) {
return this.comparator('<=', path, value);
}
gt(path, value) {
return this.comparator('>', path, value);
}
gte(path, value) {
return this.comparator('>=', path, value);
}
comparator(comparator, path, value) {
if (!Array.isArray(path)) {
path = [path];
}
const pathName = this.names.add(...path);
const valueStr = this.calcValueStr(path, pathName, value);
return this.append('AND', `${pathName} ${comparator} ${valueStr}`);
}
between(path, from, to) {
if (!Array.isArray(path)) {
path = [path];
}
const pathName = this.names.add(...path);
const fromStr = this.calcValueStr(path, pathName, from);
const toStr = this.calcValueStr(path, pathName, to);
return this.append('AND', `${pathName} BETWEEN ${fromStr} AND ${toStr}`);
}
attributeExists(path) {
if (!Array.isArray(path)) {
path = [path];
}
return this.fn('attribute_exists', this.names.add(...path));
}
attributeNotExists(path) {
if (!Array.isArray(path)) {
path = [path];
}
return this.fn('attribute_not_exists', this.names.add(...path));
}
attributeType(path, type) {
if (!Array.isArray(path)) {
path = [path];
}
return this.fn('attribute_type', this.names.add(...path), this.values.add(String(path[path.length - 1]), ConditionExpression.getAttributeTypeString(type)));
}
beginsWith(path, substr) {
if (!Array.isArray(path)) {
path = [path];
}
return this.fn('begins_with', this.names.add(...path), this.values.add(String(path[path.length - 1]), substr));
}
contains(path,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
operand) {
if (!Array.isArray(path)) {
path = [path];
}
return this.fn('contains', this.names.add(...path), typeof operand === 'function' ? operand(new ConditionExpression(this.names, this.values)) : this.values.add(String(path[path.length - 1]), operand));
}
size(path) {
if (!Array.isArray(path)) {
path = [path];
}
return this.fn('size', this.names.add(...path));
}
fn(fnName, ...args) {
return this.append('AND', `${fnName}(${args.join(', ')})`);
}
and(fn) {
return this.append('AND', fn(new ConditionExpression(this.names, this.values)));
}
or(fn) {
return this.append('OR', fn(new ConditionExpression(this.names, this.values)));
}
not(fn) {
return this.append('AND', fn(new ConditionExpression(this.names, this.values)), 'NOT');
}
append(operand, item, prefix) {
const condition = typeof item === 'string' ? new ConditionExpression(this.names, this.values, item) : item;
const conditionStr = condition.serialize();
if (conditionStr) {
if (this.expression) {
if (this.expression.match(OppsiteOperandMatch[operand]) && !this.expression.match(/^\(.*\)$/)) {
this.expression = `(${this.expression})`;
}
this.expression += ` ${operand} `;
}
if (prefix) {
this.expression += `${prefix} `;
}
if (conditionStr.match(OppsiteOperandMatch[operand]) && !conditionStr.match(/^\(.*\)$/)) {
this.expression += `(${conditionStr})`;
} else {
this.expression += conditionStr;
}
}
return this;
}
calcValueStr(path, pathName, value) {
if (typeof value !== 'function') {
return this.values.add(String(path[path.length - 1]), value);
}
const res = value(pathName, new ConditionExpression(this.names, this.values));
if (typeof res === 'string') {
return res;
}
return res.serialize();
}
}
exports.default = ConditionExpression;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPcHBzaXRlT3BlcmFuZE1hdGNoIiwiQU5EIiwiT1IiLCJDb25kaXRpb25FeHByZXNzaW9uIiwiZ2V0QXR0cmlidXRlVHlwZVN0cmluZyIsInR5cGUiLCJTdHJpbmciLCJOdW1iZXIiLCJBcnJheUJ1ZmZlciIsIkJ1ZmZlciIsIkJvb2xlYW4iLCJBcnJheSIsIk9iamVjdCIsImlzQXJyYXkiLCJsZW5ndGgiLCJUeXBlRXJyb3IiLCJjb25zdHJ1Y3RvciIsIm5hbWVzIiwidmFsdWVzIiwiaW5pdCIsImV4cHJlc3Npb24iLCJ0cmltIiwicmVwbGFjZSIsInNlcmlhbGl6ZSIsInVuZGVmaW5lZCIsIm5hbWUiLCJwYXRoIiwiYWRkIiwidmFsdWUiLCJrZXkiLCJlcSIsImNvbXBhcmF0b3IiLCJucSIsImx0IiwibHRlIiwiZ3QiLCJndGUiLCJwYXRoTmFtZSIsInZhbHVlU3RyIiwiY2FsY1ZhbHVlU3RyIiwiYXBwZW5kIiwiYmV0d2VlbiIsImZyb20iLCJ0byIsImZyb21TdHIiLCJ0b1N0ciIsImF0dHJpYnV0ZUV4aXN0cyIsImZuIiwiYXR0cmlidXRlTm90RXhpc3RzIiwiYXR0cmlidXRlVHlwZSIsImJlZ2luc1dpdGgiLCJzdWJzdHIiLCJjb250YWlucyIsIm9wZXJhbmQiLCJzaXplIiwiZm5OYW1lIiwiYXJncyIsImpvaW4iLCJhbmQiLCJvciIsIm5vdCIsIml0ZW0iLCJwcmVmaXgiLCJjb25kaXRpb24iLCJjb25kaXRpb25TdHIiLCJtYXRjaCIsInJlcyIsImV4cG9ydHMiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4cHJlc3Npb25zL0NvbmRpdGlvbkV4cHJlc3Npb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV4cHJlc3Npb25BdHRyaWJ1dGVOYW1lcyBmcm9tICcuL0V4cHJlc3Npb25BdHRyaWJ1dGVOYW1lcyc7XG5pbXBvcnQgRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlcyBmcm9tICcuL0V4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXMnO1xuXG4vLyBEb2NzOlxuLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbmR5bmFtb2RiL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9FeHByZXNzaW9ucy5PcGVyYXRvcnNBbmRGdW5jdGlvbnMuaHRtbFxuXG5leHBvcnQgdHlwZSBDb25kaXRpb25HZW5lcmF0b3I8VD4gPSAoXG4gIGNvbmRpdGlvbjogQ29uZGl0aW9uRXhwcmVzc2lvbjxUPixcbikgPT4gQ29uZGl0aW9uRXhwcmVzc2lvbjxUPiB8IHN0cmluZztcblxuZXhwb3J0IHR5cGUgVmFsdWVGbjxULCBWPiA9XG4gIHwgVlxuICB8ICgoXG4gICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICBjb25kaXRpb246IENvbmRpdGlvbkV4cHJlc3Npb248VD4sXG4gICAgKSA9PiBDb25kaXRpb25FeHByZXNzaW9uPFQ+IHwgc3RyaW5nKTtcblxuZXhwb3J0IHR5cGUgQ29tcGFyYXRvciA9ICc9JyB8ICc8PicgfCAnPCcgfCAnPD0nIHwgJz4nIHwgJz49JztcblxuZXhwb3J0IHR5cGUgRnVuY3Rpb25OYW1lID1cbiAgfCAnYXR0cmlidXRlX2V4aXN0cydcbiAgfCAnYXR0cmlidXRlX25vdF9leGlzdHMnXG4gIHwgJ2F0dHJpYnV0ZV90eXBlJ1xuICB8ICdiZWdpbnNfd2l0aCdcbiAgfCAnY29udGFpbnMnXG4gIHwgJ3NpemUnO1xuXG5leHBvcnQgdHlwZSBBdHRyaWJ1dGVUeXBlU3RyaW5nID1cbiAgfCAnUydcbiAgfCAnU1MnXG4gIHwgJ04nXG4gIHwgJ05TJ1xuICB8ICdCJ1xuICB8ICdCUydcbiAgfCAnQk9PTCdcbiAgfCAnTlVMTCdcbiAgfCAnTCdcbiAgfCAnTSc7XG5cbmV4cG9ydCB0eXBlIEF0dHJpYnV0ZVR5cGUgPVxuICB8IEF0dHJpYnV0ZVR5cGVTdHJpbmdcbiAgfCBTdHJpbmdDb25zdHJ1Y3RvclxuICB8IFtTdHJpbmdDb25zdHJ1Y3Rvcl1cbiAgfCBOdW1iZXJDb25zdHJ1Y3RvclxuICB8IFtOdW1iZXJDb25zdHJ1Y3Rvcl1cbiAgfCBBcnJheUJ1ZmZlckNvbnN0cnVjdG9yXG4gIHwgdHlwZW9mIEJ1ZmZlclxuICB8IFtBcnJheUJ1ZmZlckNvbnN0cnVjdG9yIHwgdHlwZW9mIEJ1ZmZlcl1cbiAgfCBCb29sZWFuQ29uc3RydWN0b3JcbiAgfCBudWxsXG4gIHwgQXJyYXlDb25zdHJ1Y3RvclxuICB8IE9iamVjdENvbnN0cnVjdG9yO1xuXG5jb25zdCBPcHBzaXRlT3BlcmFuZE1hdGNoID0ge1xuICBBTkQ6IC9bICldT1JbIChdL2ksXG4gIE9SOiAvWyApXUFORFsgKF0vaSxcbn07XG5cbmV4cG9ydCB0eXBlIENvbnRhaW5zT3BlcmFuZDxULCBWPiA9XG4gIHwgKFtOb25OdWxsYWJsZTxWPl0gZXh0ZW5kcyBbc3RyaW5nXVxuICAgICAgPyBOb25OdWxsYWJsZTxWPlxuICAgICAgOiBbTm9uTnVsbGFibGU8Vj5dIGV4dGVuZHMgW1NldDxpbmZlciBTVj5dXG4gICAgICA/IFNWXG4gICAgICA6IG5ldmVyKVxuICB8ICgoZXhwOiBDb25kaXRpb25FeHByZXNzaW9uPFQ+KSA9PiBzdHJpbmcpO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb25kaXRpb25FeHByZXNzaW9uPFQ+IHtcbiAgcHJpdmF0ZSBuYW1lczogRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzPFQ+O1xuICBwcml2YXRlIHZhbHVlczogRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlcztcblxuICBwcml2YXRlIGV4cHJlc3Npb246IHN0cmluZztcblxuICBwdWJsaWMgc3RhdGljIGdldEF0dHJpYnV0ZVR5cGVTdHJpbmcoXG4gICAgdHlwZTogQXR0cmlidXRlVHlwZSxcbiAgKTogQXR0cmlidXRlVHlwZVN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFN0cmluZzpcbiAgICAgICAgcmV0dXJuICdTJztcblxuICAgICAgY2FzZSBOdW1iZXI6XG4gICAgICAgIHJldHVybiAnTic7XG5cbiAgICAgIGNhc2UgQXJyYXlCdWZmZXI6XG4gICAgICBjYXNlIEJ1ZmZlcjpcbiAgICAgICAgcmV0dXJuICdCJztcblxuICAgICAgY2FzZSBCb29sZWFuOlxuICAgICAgICByZXR1cm4gJ0JPT0wnO1xuXG4gICAgICBjYXNlIG51bGw6XG4gICAgICAgIHJldHVybiAnTlVMTCc7XG5cbiAgICAgIGNhc2UgQXJyYXk6XG4gICAgICAgIHJldHVybiAnTCc7XG5cbiAgICAgIGNhc2UgT2JqZWN0OlxuICAgICAgICByZXR1cm4gJ00nO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlKSAmJiB0eXBlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHN3aXRjaCAodHlwZVswXSkge1xuICAgICAgICAgICAgY2FzZSBTdHJpbmc6XG4gICAgICAgICAgICAgIHJldHVybiAnU1MnO1xuXG4gICAgICAgICAgICBjYXNlIE51bWJlcjpcbiAgICAgICAgICAgICAgcmV0dXJuICdOUyc7XG5cbiAgICAgICAgICAgIGNhc2UgQnVmZmVyOlxuICAgICAgICAgICAgY2FzZSBBcnJheUJ1ZmZlcjpcbiAgICAgICAgICAgICAgcmV0dXJuICdCUyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5rbm93biBhdHRyaWJ1dGUgdHlwZTogJHt0eXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBuYW1lczogRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzPFQ+LFxuICAgIHZhbHVlczogRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlcyxcbiAgICBpbml0Pzogc3RyaW5nIHwgQ29uZGl0aW9uRXhwcmVzc2lvbjxUPixcbiAgKSB7XG4gICAgdGhpcy5uYW1lcyA9IG5hbWVzO1xuICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuXG4gICAgaWYgKGluaXQpIHtcbiAgICAgIGlmICh0eXBlb2YgaW5pdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uID1cbiAgICAgICAgICBpbml0XG4gICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxzKy9nLCAnICcpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFwoXFxzKy9nLCAnKCcpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxzK1xcKS9nLCAnKScpIHx8ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gaW5pdC5leHByZXNzaW9uO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmV4cHJlc3Npb24gPSAnJztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2VyaWFsaXplKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbiB8fCB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgbmFtZTxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gICAgSzUgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XSxcbiAgICBLNiBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XSxcbiAgICBLNyBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl0sXG4gICAgSzggZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdW0s3XSxcbiAgPihcbiAgICAuLi5wYXRoOiBbSzEsIEsyPywgSzM/LCBLND8sIEs1PywgSzY/LCBLNz8sIEs4PywgLi4uKHN0cmluZyB8IG51bWJlcilbXV1cbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lcy5hZGQoLi4ucGF0aCk7XG4gIH1cblxuICBwdWJsaWMgdmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMuYWRkKGtleSwgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGVxPEsxIGV4dGVuZHMga2V5b2YgVD4oXG4gICAgcGF0aDogSzEgfCBbSzFdLFxuICAgIHZhbHVlOiBWYWx1ZUZuPFQsIFRbSzFdPixcbiAgKTogdGhpcztcbiAgcHVibGljIGVxPEsxIGV4dGVuZHMga2V5b2YgVCwgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXT4oXG4gICAgcGF0aDogW0sxLCBLMl0sXG4gICAgdmFsdWU6IFZhbHVlRm48VCwgVFtLMV1bSzJdPixcbiAgKTogdGhpcztcbiAgcHVibGljIGVxPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICA+KHBhdGg6IFtLMSwgSzIsIEszXSwgdmFsdWU6IFZhbHVlRm48VCwgVFtLMV1bSzJdW0szXT4pOiB0aGlzO1xuICBwdWJsaWMgZXE8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICA+KHBhdGg6IFtLMSwgSzIsIEszLCBLNF0sIHZhbHVlOiBWYWx1ZUZuPFQsIFRbSzFdW0syXVtLM11bSzRdPik6IHRoaXM7XG4gIHB1YmxpYyBlcTxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gICAgSzUgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XSxcbiAgPihwYXRoOiBbSzEsIEsyLCBLMywgSzQsIEs1XSwgdmFsdWU6IFZhbHVlRm48VCwgVFtLMV1bSzJdW0szXVtLNF1bSzVdPik6IHRoaXM7XG4gIHB1YmxpYyBlcTxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gICAgSzUgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XSxcbiAgICBLNiBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XSxcbiAgPihcbiAgICBwYXRoOiBbSzEsIEsyLCBLMywgSzQsIEs1LCBLNl0sXG4gICAgdmFsdWU6IFZhbHVlRm48VCwgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XT4sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBlcTxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gICAgSzUgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XSxcbiAgICBLNiBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XSxcbiAgICBLNyBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl0sXG4gID4oXG4gICAgcGF0aDogW0sxLCBLMiwgSzMsIEs0LCBLNSwgSzYsIEs3XSxcbiAgICB2YWx1ZTogVmFsdWVGbjxULCBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdW0s3XT4sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBlcTxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gICAgSzUgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XSxcbiAgICBLNiBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XSxcbiAgICBLNyBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl0sXG4gICAgSzggZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdW0s3XSxcbiAgPihcbiAgICBwYXRoOiBbSzEsIEsyLCBLMywgSzQsIEs1LCBLNiwgSzcsIEs4XSxcbiAgICB2YWx1ZTogVmFsdWVGbjxULCBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdW0s3XVtLOF0+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgZXE8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gICAgSzYgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV0sXG4gICAgSzcgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdLFxuICAgIEs4IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XVtLN10sXG4gID4oXG4gICAgcGF0aDogSzEgfCBbSzEsIEsyPywgSzM/LCBLND8sIEs1PywgSzY/LCBLNz8sIEs4PywgLi4uKHN0cmluZyB8IG51bWJlcilbXV0sXG4gICAgdmFsdWU6IFZhbHVlRm48VCwgdW5rbm93bj4sXG4gICk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLmNvbXBhcmF0b3IoXG4gICAgICAnPScsXG4gICAgICBwYXRoIGFzIFtLMSwgSzIsIEszLCBLNCwgSzUsIEs2LCBLNywgSzhdLFxuICAgICAgdmFsdWUgYXMgVmFsdWVGbjxULCBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdW0s3XVtLOF0+LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgbnE8SzEgZXh0ZW5kcyBrZXlvZiBUPihcbiAgICBwYXRoOiBLMSB8IFtLMV0sXG4gICAgdmFsdWU6IFZhbHVlRm48VCwgVFtLMV0+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgbnE8SzEgZXh0ZW5kcyBrZXlvZiBULCBLMiBleHRlbmRzIGtleW9mIFRbSzFdPihcbiAgICBwYXRoOiBbSzEsIEsyXSxcbiAgICB2YWx1ZTogVmFsdWVGbjxULCBUW0sxXVtLMl0+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgbnE8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gID4ocGF0aDogW0sxLCBLMiwgSzNdLCB2YWx1ZTogVmFsdWVGbjxULCBUW0sxXVtLMl1bSzNdPik6IHRoaXM7XG4gIHB1YmxpYyBucTxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gID4ocGF0aDogW0sxLCBLMiwgSzMsIEs0XSwgdmFsdWU6IFZhbHVlRm48VCwgVFtLMV1bSzJdW0szXVtLNF0+KTogdGhpcztcbiAgcHVibGljIG5xPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICA+KHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzVdLCB2YWx1ZTogVmFsdWVGbjxULCBUW0sxXVtLMl1bSzNdW0s0XVtLNV0+KTogdGhpcztcbiAgcHVibGljIG5xPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICAgIEs2IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdLFxuICA+KFxuICAgIHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzUsIEs2XSxcbiAgICB2YWx1ZTogVmFsdWVGbjxULCBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdPixcbiAgKTogdGhpcztcbiAgcHVibGljIG5xPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICAgIEs2IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdLFxuICAgIEs3IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XSxcbiAgPihcbiAgICBwYXRoOiBbSzEsIEsyLCBLMywgSzQsIEs1LCBLNiwgSzddLFxuICAgIHZhbHVlOiBWYWx1ZUZuPFQsIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddPixcbiAgKTogdGhpcztcbiAgcHVibGljIG5xPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICAgIEs2IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdLFxuICAgIEs3IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XSxcbiAgICBLOCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddLFxuICA+KFxuICAgIHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzUsIEs2LCBLNywgSzhdLFxuICAgIHZhbHVlOiBWYWx1ZUZuPFQsIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddW0s4XT4sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBucTxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gICAgSzUgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XSxcbiAgICBLNiBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XSxcbiAgICBLNyBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl0sXG4gICAgSzggZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdW0s3XSxcbiAgPihcbiAgICBwYXRoOiBLMSB8IFtLMSwgSzI/LCBLMz8sIEs0PywgSzU/LCBLNj8sIEs3PywgSzg/LCAuLi4oc3RyaW5nIHwgbnVtYmVyKVtdXSxcbiAgICB2YWx1ZTogVmFsdWVGbjxULCB1bmtub3duPixcbiAgKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuY29tcGFyYXRvcihcbiAgICAgICc8PicsXG4gICAgICBwYXRoIGFzIFtLMSwgSzIsIEszLCBLNCwgSzUsIEs2LCBLNywgSzhdLFxuICAgICAgdmFsdWUgYXMgVmFsdWVGbjxULCBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdW0s3XVtLOF0+LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgbHQ8SzEgZXh0ZW5kcyBrZXlvZiBUPihcbiAgICBwYXRoOiBLMSB8IFtLMV0sXG4gICAgdmFsdWU6IFZhbHVlRm48VCwgVFtLMV0+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgbHQ8SzEgZXh0ZW5kcyBrZXlvZiBULCBLMiBleHRlbmRzIGtleW9mIFRbSzFdPihcbiAgICBwYXRoOiBbSzEsIEsyXSxcbiAgICB2YWx1ZTogVmFsdWVGbjxULCBUW0sxXVtLMl0+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgbHQ8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gID4ocGF0aDogW0sxLCBLMiwgSzNdLCB2YWx1ZTogVmFsdWVGbjxULCBUW0sxXVtLMl1bSzNdPik6IHRoaXM7XG4gIHB1YmxpYyBsdDxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gID4ocGF0aDogW0sxLCBLMiwgSzMsIEs0XSwgdmFsdWU6IFZhbHVlRm48VCwgVFtLMV1bSzJdW0szXVtLNF0+KTogdGhpcztcbiAgcHVibGljIGx0PFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICA+KHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzVdLCB2YWx1ZTogVmFsdWVGbjxULCBUW0sxXVtLMl1bSzNdW0s0XVtLNV0+KTogdGhpcztcbiAgcHVibGljIGx0PFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICAgIEs2IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdLFxuICA+KFxuICAgIHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzUsIEs2XSxcbiAgICB2YWx1ZTogVmFsdWVGbjxULCBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdPixcbiAgKTogdGhpcztcbiAgcHVibGljIGx0PFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICAgIEs2IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdLFxuICAgIEs3IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XSxcbiAgPihcbiAgICBwYXRoOiBbSzEsIEsyLCBLMywgSzQsIEs1LCBLNiwgSzddLFxuICAgIHZhbHVlOiBWYWx1ZUZuPFQsIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddPixcbiAgKTogdGhpcztcbiAgcHVibGljIGx0PFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICAgIEs2IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdLFxuICAgIEs3IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XSxcbiAgICBLOCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddLFxuICA+KFxuICAgIHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzUsIEs2LCBLNywgSzhdLFxuICAgIHZhbHVlOiBWYWx1ZUZuPFQsIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddW0s4XT4sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBsdDxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gICAgSzUgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XSxcbiAgICBLNiBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XSxcbiAgICBLNyBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl0sXG4gICAgSzggZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdW0s3XSxcbiAgPihcbiAgICBwYXRoOiBLMSB8IFtLMSwgSzI/LCBLMz8sIEs0PywgSzU/LCBLNj8sIEs3PywgSzg/LCAuLi4oc3RyaW5nIHwgbnVtYmVyKVtdXSxcbiAgICB2YWx1ZTogVmFsdWVGbjxULCB1bmtub3duPixcbiAgKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuY29tcGFyYXRvcihcbiAgICAgICc8JyxcbiAgICAgIHBhdGggYXMgW0sxLCBLMiwgSzMsIEs0LCBLNSwgSzYsIEs3LCBLOF0sXG4gICAgICB2YWx1ZSBhcyBWYWx1ZUZuPFQsIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddW0s4XT4sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBsdGU8SzEgZXh0ZW5kcyBrZXlvZiBUPihcbiAgICBwYXRoOiBLMSB8IFtLMV0sXG4gICAgdmFsdWU6IFZhbHVlRm48VCwgVFtLMV0+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgbHRlPEsxIGV4dGVuZHMga2V5b2YgVCwgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXT4oXG4gICAgcGF0aDogW0sxLCBLMl0sXG4gICAgdmFsdWU6IFZhbHVlRm48VCwgVFtLMV1bSzJdPixcbiAgKTogdGhpcztcbiAgcHVibGljIGx0ZTxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgPihwYXRoOiBbSzEsIEsyLCBLM10sIHZhbHVlOiBWYWx1ZUZuPFQsIFRbSzFdW0syXVtLM10+KTogdGhpcztcbiAgcHVibGljIGx0ZTxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gID4ocGF0aDogW0sxLCBLMiwgSzMsIEs0XSwgdmFsdWU6IFZhbHVlRm48VCwgVFtLMV1bSzJdW0szXVtLNF0+KTogdGhpcztcbiAgcHVibGljIGx0ZTxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gICAgSzUgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XSxcbiAgPihwYXRoOiBbSzEsIEsyLCBLMywgSzQsIEs1XSwgdmFsdWU6IFZhbHVlRm48VCwgVFtLMV1bSzJdW0szXVtLNF1bSzVdPik6IHRoaXM7XG4gIHB1YmxpYyBsdGU8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gICAgSzYgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV0sXG4gID4oXG4gICAgcGF0aDogW0sxLCBLMiwgSzMsIEs0LCBLNSwgSzZdLFxuICAgIHZhbHVlOiBWYWx1ZUZuPFQsIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl0+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgbHRlPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICAgIEs2IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdLFxuICAgIEs3IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XSxcbiAgPihcbiAgICBwYXRoOiBbSzEsIEsyLCBLMywgSzQsIEs1LCBLNiwgSzddLFxuICAgIHZhbHVlOiBWYWx1ZUZuPFQsIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddPixcbiAgKTogdGhpcztcbiAgcHVibGljIGx0ZTxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gICAgSzUgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XSxcbiAgICBLNiBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XSxcbiAgICBLNyBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl0sXG4gICAgSzggZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdW0s3XSxcbiAgPihcbiAgICBwYXRoOiBbSzEsIEsyLCBLMywgSzQsIEs1LCBLNiwgSzcsIEs4XSxcbiAgICB2YWx1ZTogVmFsdWVGbjxULCBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdW0s3XVtLOF0+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgbHRlPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICAgIEs2IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdLFxuICAgIEs3IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XSxcbiAgICBLOCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddLFxuICA+KFxuICAgIHBhdGg6IEsxIHwgW0sxLCBLMj8sIEszPywgSzQ/LCBLNT8sIEs2PywgSzc/LCBLOD8sIC4uLihzdHJpbmcgfCBudW1iZXIpW11dLFxuICAgIHZhbHVlOiBWYWx1ZUZuPFQsIHVua25vd24+LFxuICApOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5jb21wYXJhdG9yKFxuICAgICAgJzw9JyxcbiAgICAgIHBhdGggYXMgW0sxLCBLMiwgSzMsIEs0LCBLNSwgSzYsIEs3LCBLOF0sXG4gICAgICB2YWx1ZSBhcyBWYWx1ZUZuPFQsIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddW0s4XT4sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBndDxLMSBleHRlbmRzIGtleW9mIFQ+KFxuICAgIHBhdGg6IEsxIHwgW0sxXSxcbiAgICB2YWx1ZTogVmFsdWVGbjxULCBUW0sxXT4sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBndDxLMSBleHRlbmRzIGtleW9mIFQsIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0+KFxuICAgIHBhdGg6IFtLMSwgSzJdLFxuICAgIHZhbHVlOiBWYWx1ZUZuPFQsIFRbSzFdW0syXT4sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBndDxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgPihwYXRoOiBbSzEsIEsyLCBLM10sIHZhbHVlOiBWYWx1ZUZuPFQsIFRbSzFdW0syXVtLM10+KTogdGhpcztcbiAgcHVibGljIGd0PFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgPihwYXRoOiBbSzEsIEsyLCBLMywgSzRdLCB2YWx1ZTogVmFsdWVGbjxULCBUW0sxXVtLMl1bSzNdW0s0XT4pOiB0aGlzO1xuICBwdWJsaWMgZ3Q8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gID4ocGF0aDogW0sxLCBLMiwgSzMsIEs0LCBLNV0sIHZhbHVlOiBWYWx1ZUZuPFQsIFRbSzFdW0syXVtLM11bSzRdW0s1XT4pOiB0aGlzO1xuICBwdWJsaWMgZ3Q8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gICAgSzYgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV0sXG4gID4oXG4gICAgcGF0aDogW0sxLCBLMiwgSzMsIEs0LCBLNSwgSzZdLFxuICAgIHZhbHVlOiBWYWx1ZUZuPFQsIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl0+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgZ3Q8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gICAgSzYgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV0sXG4gICAgSzcgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdLFxuICA+KFxuICAgIHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzUsIEs2LCBLN10sXG4gICAgdmFsdWU6IFZhbHVlRm48VCwgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XVtLN10+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgZ3Q8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gICAgSzYgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV0sXG4gICAgSzcgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdLFxuICAgIEs4IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XVtLN10sXG4gID4oXG4gICAgcGF0aDogW0sxLCBLMiwgSzMsIEs0LCBLNSwgSzYsIEs3LCBLOF0sXG4gICAgdmFsdWU6IFZhbHVlRm48VCwgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XVtLN11bSzhdPixcbiAgKTogdGhpcztcbiAgcHVibGljIGd0PFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICAgIEs2IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdLFxuICAgIEs3IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XSxcbiAgICBLOCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddLFxuICA+KFxuICAgIHBhdGg6IEsxIHwgW0sxLCBLMj8sIEszPywgSzQ/LCBLNT8sIEs2PywgSzc/LCBLOD8sIC4uLihzdHJpbmcgfCBudW1iZXIpW11dLFxuICAgIHZhbHVlOiBWYWx1ZUZuPFQsIHVua25vd24+LFxuICApOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5jb21wYXJhdG9yKFxuICAgICAgJz4nLFxuICAgICAgcGF0aCBhcyBbSzEsIEsyLCBLMywgSzQsIEs1LCBLNiwgSzcsIEs4XSxcbiAgICAgIHZhbHVlIGFzIFZhbHVlRm48VCwgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XVtLN11bSzhdPixcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGd0ZTxLMSBleHRlbmRzIGtleW9mIFQ+KFxuICAgIHBhdGg6IEsxIHwgW0sxXSxcbiAgICB2YWx1ZTogVmFsdWVGbjxULCBUW0sxXT4sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBndGU8SzEgZXh0ZW5kcyBrZXlvZiBULCBLMiBleHRlbmRzIGtleW9mIFRbSzFdPihcbiAgICBwYXRoOiBbSzEsIEsyXSxcbiAgICB2YWx1ZTogVmFsdWVGbjxULCBUW0sxXVtLMl0+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgZ3RlPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICA+KHBhdGg6IFtLMSwgSzIsIEszXSwgdmFsdWU6IFZhbHVlRm48VCwgVFtLMV1bSzJdW0szXT4pOiB0aGlzO1xuICBwdWJsaWMgZ3RlPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgPihwYXRoOiBbSzEsIEsyLCBLMywgSzRdLCB2YWx1ZTogVmFsdWVGbjxULCBUW0sxXVtLMl1bSzNdW0s0XT4pOiB0aGlzO1xuICBwdWJsaWMgZ3RlPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICA+KHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzVdLCB2YWx1ZTogVmFsdWVGbjxULCBUW0sxXVtLMl1bSzNdW0s0XVtLNV0+KTogdGhpcztcbiAgcHVibGljIGd0ZTxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gICAgSzUgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XSxcbiAgICBLNiBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XSxcbiAgPihcbiAgICBwYXRoOiBbSzEsIEsyLCBLMywgSzQsIEs1LCBLNl0sXG4gICAgdmFsdWU6IFZhbHVlRm48VCwgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XT4sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBndGU8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gICAgSzYgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV0sXG4gICAgSzcgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdLFxuICA+KFxuICAgIHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzUsIEs2LCBLN10sXG4gICAgdmFsdWU6IFZhbHVlRm48VCwgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XVtLN10+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgZ3RlPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICAgIEs2IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdLFxuICAgIEs3IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XSxcbiAgICBLOCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddLFxuICA+KFxuICAgIHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzUsIEs2LCBLNywgSzhdLFxuICAgIHZhbHVlOiBWYWx1ZUZuPFQsIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddW0s4XT4sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBndGU8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gICAgSzYgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV0sXG4gICAgSzcgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdLFxuICAgIEs4IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XVtLN10sXG4gID4oXG4gICAgcGF0aDogSzEgfCBbSzEsIEsyPywgSzM/LCBLND8sIEs1PywgSzY/LCBLNz8sIEs4PywgLi4uKHN0cmluZyB8IG51bWJlcilbXV0sXG4gICAgdmFsdWU6IFZhbHVlRm48VCwgdW5rbm93bj4sXG4gICk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLmNvbXBhcmF0b3IoXG4gICAgICAnPj0nLFxuICAgICAgcGF0aCBhcyBbSzEsIEsyLCBLMywgSzQsIEs1LCBLNiwgSzcsIEs4XSxcbiAgICAgIHZhbHVlIGFzIFZhbHVlRm48VCwgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XVtLN11bSzhdPixcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNvbXBhcmF0b3I8SzEgZXh0ZW5kcyBrZXlvZiBUPihcbiAgICBjb21wYXJhdG9yOiBDb21wYXJhdG9yLFxuICAgIHBhdGg6IEsxIHwgW0sxXSxcbiAgICB2YWx1ZTogVmFsdWVGbjxULCBUW0sxXT4sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBjb21wYXJhdG9yPEsxIGV4dGVuZHMga2V5b2YgVCwgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXT4oXG4gICAgY29tcGFyYXRvcjogQ29tcGFyYXRvcixcbiAgICBwYXRoOiBbSzEsIEsyXSxcbiAgICB2YWx1ZTogVmFsdWVGbjxULCBUW0sxXVtLMl0+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgY29tcGFyYXRvcjxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgPihcbiAgICBjb21wYXJhdG9yOiBDb21wYXJhdG9yLFxuICAgIHBhdGg6IFtLMSwgSzIsIEszXSxcbiAgICB2YWx1ZTogVmFsdWVGbjxULCBUW0sxXVtLMl1bSzNdPixcbiAgKTogdGhpcztcbiAgcHVibGljIGNvbXBhcmF0b3I8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICA+KFxuICAgIGNvbXBhcmF0b3I6IENvbXBhcmF0b3IsXG4gICAgcGF0aDogW0sxLCBLMiwgSzMsIEs0XSxcbiAgICB2YWx1ZTogVmFsdWVGbjxULCBUW0sxXVtLMl1bSzNdW0s0XT4sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBjb21wYXJhdG9yPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICA+KFxuICAgIGNvbXBhcmF0b3I6IENvbXBhcmF0b3IsXG4gICAgcGF0aDogW0sxLCBLMiwgSzMsIEs0LCBLNV0sXG4gICAgdmFsdWU6IFZhbHVlRm48VCwgVFtLMV1bSzJdW0szXVtLNF1bSzVdPixcbiAgKTogdGhpcztcbiAgcHVibGljIGNvbXBhcmF0b3I8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gICAgSzYgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV0sXG4gID4oXG4gICAgY29tcGFyYXRvcjogQ29tcGFyYXRvcixcbiAgICBwYXRoOiBbSzEsIEsyLCBLMywgSzQsIEs1LCBLNl0sXG4gICAgdmFsdWU6IFZhbHVlRm48VCwgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XT4sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBjb21wYXJhdG9yPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICAgIEs2IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdLFxuICAgIEs3IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XSxcbiAgPihcbiAgICBjb21wYXJhdG9yOiBDb21wYXJhdG9yLFxuICAgIHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzUsIEs2LCBLN10sXG4gICAgdmFsdWU6IFZhbHVlRm48VCwgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XVtLN10+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgY29tcGFyYXRvcjxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gICAgSzUgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XSxcbiAgICBLNiBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XSxcbiAgICBLNyBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl0sXG4gICAgSzggZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdW0s3XSxcbiAgPihcbiAgICBjb21wYXJhdG9yOiBDb21wYXJhdG9yLFxuICAgIHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzUsIEs2LCBLNywgSzhdLFxuICAgIHZhbHVlOiBWYWx1ZUZuPFQsIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddW0s4XT4sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBjb21wYXJhdG9yPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICAgIEs2IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdLFxuICAgIEs3IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XSxcbiAgICBLOCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddLFxuICA+KFxuICAgIGNvbXBhcmF0b3I6IENvbXBhcmF0b3IsXG4gICAgcGF0aDogSzEgfCBbSzEsIEsyPywgSzM/LCBLND8sIEs1PywgSzY/LCBLNz8sIEs4PywgLi4uKHN0cmluZyB8IG51bWJlcilbXV0sXG4gICAgdmFsdWU6IFZhbHVlRm48VCwgdW5rbm93bj4sXG4gICk6IHRoaXMge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgICAgcGF0aCA9IFtwYXRoXTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoTmFtZSA9IHRoaXMubmFtZXMuYWRkKC4uLnBhdGgpO1xuICAgIGNvbnN0IHZhbHVlU3RyID0gdGhpcy5jYWxjVmFsdWVTdHIocGF0aCwgcGF0aE5hbWUsIHZhbHVlKTtcblxuICAgIHJldHVybiB0aGlzLmFwcGVuZCgnQU5EJywgYCR7cGF0aE5hbWV9ICR7Y29tcGFyYXRvcn0gJHt2YWx1ZVN0cn1gKTtcbiAgfVxuXG4gIHB1YmxpYyBiZXR3ZWVuPEsxIGV4dGVuZHMga2V5b2YgVD4oXG4gICAgcGF0aDogSzEgfCBbSzFdLFxuICAgIGZyb206IFZhbHVlRm48VCwgVFtLMV0+LFxuICAgIHRvOiBWYWx1ZUZuPFQsIFRbSzFdPixcbiAgKTogdGhpcztcbiAgcHVibGljIGJldHdlZW48SzEgZXh0ZW5kcyBrZXlvZiBULCBLMiBleHRlbmRzIGtleW9mIFRbSzFdPihcbiAgICBwYXRoOiBbSzEsIEsyXSxcbiAgICBmcm9tOiBWYWx1ZUZuPFQsIFRbSzFdW0syXT4sXG4gICAgdG86IFZhbHVlRm48VCwgVFtLMV1bSzJdPixcbiAgKTogdGhpcztcbiAgcHVibGljIGJldHdlZW48XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gID4oXG4gICAgcGF0aDogW0sxLCBLMiwgSzNdLFxuICAgIGZyb206IFZhbHVlRm48VCwgVFtLMV1bSzJdW0szXT4sXG4gICAgdG86IFZhbHVlRm48VCwgVFtLMV1bSzJdW0szXT4sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBiZXR3ZWVuPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgPihcbiAgICBwYXRoOiBbSzEsIEsyLCBLMywgSzRdLFxuICAgIGZyb206IFZhbHVlRm48VCwgVFtLMV1bSzJdW0szXVtLNF0+LFxuICAgIHRvOiBWYWx1ZUZuPFQsIFRbSzFdW0syXVtLM11bSzRdPixcbiAgKTogdGhpcztcbiAgcHVibGljIGJldHdlZW48XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gID4oXG4gICAgcGF0aDogW0sxLCBLMiwgSzMsIEs0LCBLNV0sXG4gICAgZnJvbTogVmFsdWVGbjxULCBUW0sxXVtLMl1bSzNdW0s0XVtLNV0+LFxuICAgIHRvOiBWYWx1ZUZuPFQsIFRbSzFdW0syXVtLM11bSzRdW0s1XT4sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBiZXR3ZWVuPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICAgIEs2IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdLFxuICA+KFxuICAgIHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzUsIEs2XSxcbiAgICBmcm9tOiBWYWx1ZUZuPFQsIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl0+LFxuICAgIHRvOiBWYWx1ZUZuPFQsIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl0+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgYmV0d2VlbjxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gICAgSzUgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XSxcbiAgICBLNiBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XSxcbiAgICBLNyBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl0sXG4gID4oXG4gICAgcGF0aDogW0sxLCBLMiwgSzMsIEs0LCBLNSwgSzYsIEs3XSxcbiAgICBmcm9tOiBWYWx1ZUZuPFQsIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddPixcbiAgICB0bzogVmFsdWVGbjxULCBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdW0s3XT4sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBiZXR3ZWVuPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICAgIEs2IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdLFxuICAgIEs3IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XSxcbiAgICBLOCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddLFxuICA+KFxuICAgIHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzUsIEs2LCBLNywgSzhdLFxuICAgIGZyb206IFZhbHVlRm48VCwgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XVtLN11bSzhdPixcbiAgICB0bzogVmFsdWVGbjxULCBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdW0s3XVtLOF0+LFxuICApOiB0aGlzO1xuICBwdWJsaWMgYmV0d2VlbjxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gICAgSzUgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XSxcbiAgICBLNiBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XSxcbiAgICBLNyBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl0sXG4gICAgSzggZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdW0s3XSxcbiAgPihcbiAgICBwYXRoOiBLMSB8IFtLMSwgSzI/LCBLMz8sIEs0PywgSzU/LCBLNj8sIEs3PywgSzg/LCAuLi4oc3RyaW5nIHwgbnVtYmVyKVtdXSxcbiAgICBmcm9tOiBWYWx1ZUZuPFQsIHVua25vd24+LFxuICAgIHRvOiBWYWx1ZUZuPFQsIHVua25vd24+LFxuICApOiB0aGlzIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGF0aCkpIHtcbiAgICAgIHBhdGggPSBbcGF0aF07XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aE5hbWUgPSB0aGlzLm5hbWVzLmFkZCguLi5wYXRoKTtcbiAgICBjb25zdCBmcm9tU3RyID0gdGhpcy5jYWxjVmFsdWVTdHIocGF0aCwgcGF0aE5hbWUsIGZyb20pO1xuICAgIGNvbnN0IHRvU3RyID0gdGhpcy5jYWxjVmFsdWVTdHIocGF0aCwgcGF0aE5hbWUsIHRvKTtcblxuICAgIHJldHVybiB0aGlzLmFwcGVuZCgnQU5EJywgYCR7cGF0aE5hbWV9IEJFVFdFRU4gJHtmcm9tU3RyfSBBTkQgJHt0b1N0cn1gKTtcbiAgfVxuXG4gIHB1YmxpYyBhdHRyaWJ1dGVFeGlzdHM8SzEgZXh0ZW5kcyBrZXlvZiBUPihwYXRoOiBLMSB8IFtLMV0pOiB0aGlzO1xuICBwdWJsaWMgYXR0cmlidXRlRXhpc3RzPEsxIGV4dGVuZHMga2V5b2YgVCwgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXT4oXG4gICAgcGF0aDogW0sxLCBLMl0sXG4gICk6IHRoaXM7XG4gIHB1YmxpYyBhdHRyaWJ1dGVFeGlzdHM8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gID4ocGF0aDogW0sxLCBLMiwgSzNdKTogdGhpcztcbiAgcHVibGljIGF0dHJpYnV0ZUV4aXN0czxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gID4ocGF0aDogW0sxLCBLMiwgSzMsIEs0XSk6IHRoaXM7XG4gIHB1YmxpYyBhdHRyaWJ1dGVFeGlzdHM8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gID4ocGF0aDogW0sxLCBLMiwgSzMsIEs0LCBLNV0pOiB0aGlzO1xuICBwdWJsaWMgYXR0cmlidXRlRXhpc3RzPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICAgIEs2IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdLFxuICA+KHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzUsIEs2XSk6IHRoaXM7XG4gIHB1YmxpYyBhdHRyaWJ1dGVFeGlzdHM8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gICAgSzYgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV0sXG4gICAgSzcgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdLFxuICA+KHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzUsIEs2LCBLN10pOiB0aGlzO1xuICBwdWJsaWMgYXR0cmlidXRlRXhpc3RzPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICAgIEs2IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdLFxuICAgIEs3IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XSxcbiAgICBLOCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddLFxuICA+KHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzUsIEs2LCBLNywgSzhdKTogdGhpcztcbiAgcHVibGljIGF0dHJpYnV0ZUV4aXN0czxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gICAgSzUgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XSxcbiAgICBLNiBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XSxcbiAgICBLNyBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl0sXG4gICAgSzggZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdW0s3XSxcbiAgPihcbiAgICBwYXRoOiBLMSB8IFtLMSwgSzI/LCBLMz8sIEs0PywgSzU/LCBLNj8sIEs3PywgSzg/LCAuLi4oc3RyaW5nIHwgbnVtYmVyKVtdXSxcbiAgKTogdGhpcyB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhdGgpKSB7XG4gICAgICBwYXRoID0gW3BhdGhdO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZuKCdhdHRyaWJ1dGVfZXhpc3RzJywgdGhpcy5uYW1lcy5hZGQoLi4ucGF0aCkpO1xuICB9XG5cbiAgcHVibGljIGF0dHJpYnV0ZU5vdEV4aXN0czxLMSBleHRlbmRzIGtleW9mIFQ+KHBhdGg6IEsxIHwgW0sxXSk6IHRoaXM7XG4gIHB1YmxpYyBhdHRyaWJ1dGVOb3RFeGlzdHM8SzEgZXh0ZW5kcyBrZXlvZiBULCBLMiBleHRlbmRzIGtleW9mIFRbSzFdPihcbiAgICBwYXRoOiBbSzEsIEsyXSxcbiAgKTogdGhpcztcbiAgcHVibGljIGF0dHJpYnV0ZU5vdEV4aXN0czxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgPihwYXRoOiBbSzEsIEsyLCBLM10pOiB0aGlzO1xuICBwdWJsaWMgYXR0cmlidXRlTm90RXhpc3RzPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgPihwYXRoOiBbSzEsIEsyLCBLMywgSzRdKTogdGhpcztcbiAgcHVibGljIGF0dHJpYnV0ZU5vdEV4aXN0czxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gICAgSzUgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XSxcbiAgPihwYXRoOiBbSzEsIEsyLCBLMywgSzQsIEs1XSk6IHRoaXM7XG4gIHB1YmxpYyBhdHRyaWJ1dGVOb3RFeGlzdHM8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gICAgSzYgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV0sXG4gID4ocGF0aDogW0sxLCBLMiwgSzMsIEs0LCBLNSwgSzZdKTogdGhpcztcbiAgcHVibGljIGF0dHJpYnV0ZU5vdEV4aXN0czxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gICAgSzUgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XSxcbiAgICBLNiBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XSxcbiAgICBLNyBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl0sXG4gID4ocGF0aDogW0sxLCBLMiwgSzMsIEs0LCBLNSwgSzYsIEs3XSk6IHRoaXM7XG4gIHB1YmxpYyBhdHRyaWJ1dGVOb3RFeGlzdHM8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gICAgSzYgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV0sXG4gICAgSzcgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdLFxuICAgIEs4IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XVtLN10sXG4gID4ocGF0aDogW0sxLCBLMiwgSzMsIEs0LCBLNSwgSzYsIEs3LCBLOF0pOiB0aGlzO1xuICBwdWJsaWMgYXR0cmlidXRlTm90RXhpc3RzPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICAgIEs2IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdLFxuICAgIEs3IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF1bSzVdW0s2XSxcbiAgICBLOCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdW0s1XVtLNl1bSzddLFxuICA+KFxuICAgIHBhdGg6IEsxIHwgW0sxLCBLMj8sIEszPywgSzQ/LCBLNT8sIEs2PywgSzc/LCBLOD8sIC4uLihzdHJpbmcgfCBudW1iZXIpW11dLFxuICApOiB0aGlzIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGF0aCkpIHtcbiAgICAgIHBhdGggPSBbcGF0aF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZm4oJ2F0dHJpYnV0ZV9ub3RfZXhpc3RzJywgdGhpcy5uYW1lcy5hZGQoLi4ucGF0aCkpO1xuICB9XG5cbiAgcHVibGljIGF0dHJpYnV0ZVR5cGU8SzEgZXh0ZW5kcyBrZXlvZiBUPihcbiAgICBwYXRoOiBLMSB8IFtLMV0sXG4gICAgdHlwZTogQXR0cmlidXRlVHlwZSxcbiAgKTogdGhpcztcbiAgcHVibGljIGF0dHJpYnV0ZVR5cGU8SzEgZXh0ZW5kcyBrZXlvZiBULCBLMiBleHRlbmRzIGtleW9mIFRbSzFdPihcbiAgICBwYXRoOiBbSzEsIEsyXSxcbiAgICB0eXBlOiBBdHRyaWJ1dGVUeXBlLFxuICApOiB0aGlzO1xuICBwdWJsaWMgYXR0cmlidXRlVHlwZTxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgPihwYXRoOiBbSzEsIEsyLCBLM10sIHR5cGU6IEF0dHJpYnV0ZVR5cGUpOiB0aGlzO1xuICBwdWJsaWMgYXR0cmlidXRlVHlwZTxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0syXSxcbiAgICBLNCBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM10sXG4gID4ocGF0aDogW0sxLCBLMiwgSzMsIEs0XSwgdHlwZTogQXR0cmlidXRlVHlwZSk6IHRoaXM7XG4gIHB1YmxpYyBhdHRyaWJ1dGVUeXBlPFxuICAgIEsxIGV4dGVuZHMga2V5b2YgVCxcbiAgICBLMiBleHRlbmRzIGtleW9mIFRbSzFdLFxuICAgIEszIGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdLFxuICAgIEs0IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXSxcbiAgICBLNSBleHRlbmRzIGtleW9mIFRbSzFdW0syXVtLM11bSzRdLFxuICA+KHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzVdLCB0eXBlOiBBdHRyaWJ1dGVUeXBlKTogdGhpcztcbiAgcHVibGljIGF0dHJpYnV0ZVR5cGU8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gICAgSzYgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV0sXG4gID4ocGF0aDogW0sxLCBLMiwgSzMsIEs0LCBLNSwgSzZdLCB0eXBlOiBBdHRyaWJ1dGVUeXBlKTogdGhpcztcbiAgcHVibGljIGF0dHJpYnV0ZVR5cGU8XG4gICAgSzEgZXh0ZW5kcyBrZXlvZiBULFxuICAgIEsyIGV4dGVuZHMga2V5b2YgVFtLMV0sXG4gICAgSzMgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl0sXG4gICAgSzQgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdLFxuICAgIEs1IGV4dGVuZHMga2V5b2YgVFtLMV1bSzJdW0szXVtLNF0sXG4gICAgSzYgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV0sXG4gICAgSzcgZXh0ZW5kcyBrZXlvZiBUW0sxXVtLMl1bSzNdW0s0XVtLNV1bSzZdLFxuICA+KHBhdGg6IFtLMSwgSzIsIEszLCBLNCwgSzUsIEs2LCBLN10sIHR5cGU6IEF0dHJpYnV0ZVR5cGUpOiB0aGlzO1xuICBwdWJsaWMgYXR0cmlidXRlVHlwZTxcbiAgICBLMSBleHRlbmRzIGtleW9mIFQsXG4gICAgSzIgZXh0ZW5kcyBrZXlvZiBUW0sxXSxcbiAgICBLMyBleHRlbmRzIGtleW9mIFRbSzFdW0sy