@decaf-ts/for-couchdb
Version:
template for ts projects
183 lines • 22 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.reAuth = reAuth;
exports.wrapDocumentScope = wrapDocumentScope;
exports.testReservedAttributes = testReservedAttributes;
exports.generateIndexName = generateIndexName;
exports.generateIndexDoc = generateIndexDoc;
const core_1 = require("@decaf-ts/core");
const constants_1 = require("./constants.cjs");
const db_decorators_1 = require("@decaf-ts/db-decorators");
const constants_2 = require("./query/constants.cjs");
/**
* @description Re-authenticates a connection to CouchDB
* @summary Refreshes the authentication for a CouchDB connection using the provided credentials
* @param {any} con - The CouchDB connection object
* @param {string} user - The username for authentication
* @param {string} pass - The password for authentication
* @return {Promise<any>} A promise that resolves to the authentication result
* @function reAuth
* @memberOf module:for-couchdb
*/
async function reAuth(con, user, pass) {
return con.auth(user, pass);
}
/**
* @description Wraps a CouchDB database connection with automatic re-authentication
* @summary Creates a proxy around a CouchDB database connection that automatically re-authenticates before each operation
* @param {any} con - The CouchDB connection object
* @param {string} dbName - The name of the database to use
* @param {string} user - The username for authentication
* @param {string} pass - The password for authentication
* @return {any} The wrapped database connection object
* @function wrapDocumentScope
* @memberOf module:for-couchdb
* @mermaid
* sequenceDiagram
* participant Client
* participant wrapDocumentScope
* participant DB
* participant reAuth
*
* Client->>wrapDocumentScope: con, dbName, user, pass
* wrapDocumentScope->>DB: con.use(dbName)
* Note over wrapDocumentScope: Wrap DB methods with re-auth
*
* loop For each method (insert, get, put, destroy, find)
* wrapDocumentScope->>wrapDocumentScope: Store original method
* wrapDocumentScope->>wrapDocumentScope: Define new method with re-auth
* end
*
* wrapDocumentScope->>wrapDocumentScope: Add NATIVE property with con value
* wrapDocumentScope-->>Client: Return wrapped DB
*
* Note over Client: Later when client uses DB methods
* Client->>DB: Any wrapped method call
* DB->>reAuth: Authenticate before operation
* reAuth-->>DB: Authentication complete
* DB->>DB: Call original method
* DB-->>Client: Return result
*/
function wrapDocumentScope(con, dbName, user, pass) {
const db = con.use(dbName);
["insert", "get", "put", "destroy", "find"].forEach((k) => {
const original = db[k];
Object.defineProperty(db, k, {
enumerable: false,
configurable: true,
value: async (...args) => {
await reAuth(con, user, pass);
return original.call(db, ...args);
},
});
});
Object.defineProperty(db, constants_1.CouchDBKeys.NATIVE, {
enumerable: false,
configurable: false,
writable: false,
value: con,
});
return db;
}
/**
* @description Tests if an attribute name is reserved in CouchDB
* @summary Checks if an attribute name starts with an underscore, which indicates it's a reserved attribute in CouchDB
* @param {string} attr - The attribute name to test
* @return {RegExpMatchArray|null} The match result or null if no match
* @function testReservedAttributes
* @memberOf module:for-couchdb
*/
function testReservedAttributes(attr) {
const regexp = /^_.*$/g;
return attr.match(regexp);
}
/**
* @description Generates a name for a CouchDB index
* @summary Creates a standardized name for a CouchDB index based on the table, attribute, compositions, and order
* @param {string} attribute - The primary attribute for the index
* @param {string} tableName - The name of the table
* @param {string[]} [compositions] - Optional additional attributes to include in the index
* @param {OrderDirection} [order] - Optional sort order for the index
* @param {string} [separator=DefaultSeparator] - The separator to use between parts of the index name
* @return {string} The generated index name
* @function generateIndexName
* @memberOf module:for-couchdb
*/
function generateIndexName(attribute, tableName, compositions, order, separator = db_decorators_1.DefaultSeparator) {
const attr = [core_1.PersistenceKeys.INDEX, tableName, attribute];
if (compositions)
attr.push(...compositions);
if (order)
attr.push(order);
return attr.join(separator);
}
/**
* @description Generates a CouchDB index configuration
* @summary Creates a complete CreateIndexRequest object for defining a CouchDB index based on specified parameters
* @param {string} attribute - The primary attribute for the index
* @param {string} tableName - The name of the table
* @param {string[]} [compositions] - Optional additional attributes to include in the index
* @param {OrderDirection} [order] - Optional sort order for the index
* @param {string} [separator=DefaultSeparator] - The separator to use between parts of the index name
* @return {CreateIndexRequest} The complete index configuration object
* @function generateIndexDoc
* @memberOf module:for-couchdb
* @mermaid
* sequenceDiagram
* participant Caller
* participant generateIndexDoc
* participant generateIndexName
*
* Caller->>generateIndexDoc: attribute, tableName, compositions, order, separator
*
* Note over generateIndexDoc: Create partial filter selector
* generateIndexDoc->>generateIndexDoc: Set up filter for tableName
*
* alt order is specified
* Note over generateIndexDoc: Create ordered fields array
* generateIndexDoc->>generateIndexDoc: Create orderProp for attribute
* generateIndexDoc->>generateIndexDoc: Map compositions to ordered props
* generateIndexDoc->>generateIndexDoc: Create sortedTable for table field
* generateIndexDoc->>generateIndexDoc: Combine all ordered fields
* else
* Note over generateIndexDoc: Create simple fields array
* generateIndexDoc->>generateIndexDoc: Use attribute, compositions, and table as strings
* end
*
* generateIndexDoc->>generateIndexName: Generate index name
* generateIndexName-->>generateIndexDoc: Return name
*
* Note over generateIndexDoc: Create final index request
* generateIndexDoc-->>Caller: Return CreateIndexRequest
*/
function generateIndexDoc(attribute, tableName, compositions, order, separator = db_decorators_1.DefaultSeparator) {
const partialFilterSelector = {};
partialFilterSelector[constants_1.CouchDBKeys.TABLE] = {};
partialFilterSelector[constants_1.CouchDBKeys.TABLE][constants_2.CouchDBOperator.EQUAL] = tableName;
let fields;
if (order) {
const orderProp = {};
orderProp[attribute] = order;
const sortedCompositions = (compositions || []).map((c) => {
const r = {};
r[c] = order;
return r;
});
const sortedTable = {};
sortedTable[constants_1.CouchDBKeys.TABLE] = order;
fields = [orderProp, ...sortedCompositions, sortedTable];
}
else {
fields = [attribute, ...(compositions || []), constants_1.CouchDBKeys.TABLE];
}
const name = generateIndexName(attribute, tableName, compositions, order, separator);
return {
index: {
fields: fields,
// partial_filter_selector: partialFilterSelector,
},
ddoc: [name, constants_1.CouchDBKeys.DDOC].join(separator),
name: name,
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFnQkEsd0JBRUM7QUFzQ0QsOENBeUJDO0FBVUQsd0RBR0M7QUFjRCw4Q0FXQztBQXlDRCw0Q0EwQ0M7QUExTUQseUNBQWlFO0FBQ2pFLCtDQUEwQztBQUMxQywyREFBMkQ7QUFDM0QscURBQW9EO0FBR3BEOzs7Ozs7Ozs7R0FTRztBQUNJLEtBQUssVUFBVSxNQUFNLENBQUMsR0FBUSxFQUFFLElBQVksRUFBRSxJQUFZO0lBQy9ELE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1DRztBQUNILFNBQWdCLGlCQUFpQixDQUMvQixHQUFRLEVBQ1IsTUFBYyxFQUNkLElBQVksRUFDWixJQUFZO0lBRVosTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQixDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUN4RCxNQUFNLFFBQVEsR0FBSSxFQUEwQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUMzQixVQUFVLEVBQUUsS0FBSztZQUNqQixZQUFZLEVBQUUsSUFBSTtZQUNsQixLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBVyxFQUFFLEVBQUU7Z0JBQzlCLE1BQU0sTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzlCLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMs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QUFXLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUM5QyxJQUFJLEVBQUUsSUFBSTtLQUNYLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3JkZXJEaXJlY3Rpb24sIFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQ291Y2hEQktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IERlZmF1bHRTZXBhcmF0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvdWNoREJPcGVyYXRvciB9IGZyb20gXCIuL3F1ZXJ5L2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ3JlYXRlSW5kZXhSZXF1ZXN0LCBNYW5nb1NlbGVjdG9yLCBTb3J0T3JkZXIgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZS1hdXRoZW50aWNhdGVzIGEgY29ubmVjdGlvbiB0byBDb3VjaERCXG4gKiBAc3VtbWFyeSBSZWZyZXNoZXMgdGhlIGF1dGhlbnRpY2F0aW9uIGZvciBhIENvdWNoREIgY29ubmVjdGlvbiB1c2luZyB0aGUgcHJvdmlkZWQgY3JlZGVudGlhbHNcbiAqIEBwYXJhbSB7YW55fSBjb24gLSBUaGUgQ291Y2hEQiBjb25uZWN0aW9uIG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IHVzZXIgLSBUaGUgdXNlcm5hbWUgZm9yIGF1dGhlbnRpY2F0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFzcyAtIFRoZSBwYXNzd29yZCBmb3IgYXV0aGVudGljYXRpb25cbiAqIEByZXR1cm4ge1Byb21pc2U8YW55Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGF1dGhlbnRpY2F0aW9uIHJlc3VsdFxuICogQGZ1bmN0aW9uIHJlQXV0aFxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItY291Y2hkYlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVBdXRoKGNvbjogYW55LCB1c2VyOiBzdHJpbmcsIHBhc3M6IHN0cmluZykge1xuICByZXR1cm4gY29uLmF1dGgodXNlciwgcGFzcyk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFdyYXBzIGEgQ291Y2hEQiBkYXRhYmFzZSBjb25uZWN0aW9uIHdpdGggYXV0b21hdGljIHJlLWF1dGhlbnRpY2F0aW9uXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgcHJveHkgYXJvdW5kIGEgQ291Y2hEQiBkYXRhYmFzZSBjb25uZWN0aW9uIHRoYXQgYXV0b21hdGljYWxseSByZS1hdXRoZW50aWNhdGVzIGJlZm9yZSBlYWNoIG9wZXJhdGlvblxuICogQHBhcmFtIHthbnl9IGNvbiAtIFRoZSBDb3VjaERCIGNvbm5lY3Rpb24gb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gZGJOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGRhdGFiYXNlIHRvIHVzZVxuICogQHBhcmFtIHtzdHJpbmd9IHVzZXIgLSBUaGUgdXNlcm5hbWUgZm9yIGF1dGhlbnRpY2F0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFzcyAtIFRoZSBwYXNzd29yZCBmb3IgYXV0aGVudGljYXRpb25cbiAqIEByZXR1cm4ge2FueX0gVGhlIHdyYXBwZWQgZGF0YWJhc2UgY29ubmVjdGlvbiBvYmplY3RcbiAqIEBmdW5jdGlvbiB3cmFwRG9jdW1lbnRTY29wZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItY291Y2hkYlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgd3JhcERvY3VtZW50U2NvcGVcbiAqICAgcGFydGljaXBhbnQgREJcbiAqICAgcGFydGljaXBhbnQgcmVBdXRoXG4gKiAgIFxuICogICBDbGllbnQtPj53cmFwRG9jdW1lbnRTY29wZTogY29uLCBkYk5hbWUsIHVzZXIsIHBhc3NcbiAqICAgd3JhcERvY3VtZW50U2NvcGUtPj5EQjogY29uLnVzZShkYk5hbWUpXG4gKiAgIE5vdGUgb3ZlciB3cmFwRG9jdW1lbnRTY29wZTogV3JhcCBEQiBtZXRob2RzIHdpdGggcmUtYXV0aFxuICogICBcbiAqICAgbG9vcCBGb3IgZWFjaCBtZXRob2QgKGluc2VydCwgZ2V0LCBwdXQsIGRlc3Ryb3ksIGZpbmQpXG4gKiAgICAgd3JhcERvY3VtZW50U2NvcGUtPj53cmFwRG9jdW1lbnRTY29wZTogU3RvcmUgb3JpZ2luYWwgbWV0aG9kXG4gKiAgICAgd3JhcERvY3VtZW50U2NvcGUtPj53cmFwRG9jdW1lbnRTY29wZTogRGVmaW5lIG5ldyBtZXRob2Qgd2l0aCByZS1hdXRoXG4gKiAgIGVuZFxuICogICBcbiAqICAgd3JhcERvY3VtZW50U2NvcGUtPj53cmFwRG9jdW1lbnRTY29wZTogQWRkIE5BVElWRSBwcm9wZXJ0eSB3aXRoIGNvbiB2YWx1ZVxuICogICB3cmFwRG9jdW1lbnRTY29wZS0tPj5DbGllbnQ6IFJldHVybiB3cmFwcGVkIERCXG4gKiAgIFxuICogICBOb3RlIG92ZXIgQ2xpZW50OiBMYXRlciB3aGVuIGNsaWVudCB1c2VzIERCIG1ldGhvZHNcbiAqICAgQ2xpZW50LT4+REI6IEFueSB3cmFwcGVkIG1ldGhvZCBjYWxsXG4gKiAgIERCLT4+cmVBdXRoOiBBdXRoZW50aWNhdGUgYmVmb3JlIG9wZXJhdGlvblxuICogICByZUF1dGgtLT4+REI6IEF1dGhlbnRpY2F0aW9uIGNvbXBsZXRlXG4gKiAgIERCLT4+REI6IENhbGwgb3JpZ2luYWwgbWV0aG9kXG4gKiAgIERCLS0+PkNsaWVudDogUmV0dXJuIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcERvY3VtZW50U2NvcGUoXG4gIGNvbjogYW55LFxuICBkYk5hbWU6IHN0cmluZyxcbiAgdXNlcjogc3RyaW5nLFxuICBwYXNzOiBzdHJpbmdcbik6IGFueSB7XG4gIGNvbnN0IGRiID0gY29uLnVzZShkYk5hbWUpO1xuICBbXCJpbnNlcnRcIiwgXCJnZXRcIiwgXCJwdXRcIiwgXCJkZXN0cm95XCIsIFwiZmluZFwiXS5mb3JFYWNoKChrKSA9PiB7XG4gICAgY29uc3Qgb3JpZ2luYWwgPSAoZGIgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba107XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRiLCBrLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBhc3luYyAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgYXdhaXQgcmVBdXRoKGNvbiwgdXNlciwgcGFzcyk7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbC5jYWxsKGRiLCAuLi5hcmdzKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGIsIENvdWNoREJLZXlzLk5BVElWRSwge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBjb24sXG4gIH0pO1xuICByZXR1cm4gZGI7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRlc3RzIGlmIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIHJlc2VydmVkIGluIENvdWNoREJcbiAqIEBzdW1tYXJ5IENoZWNrcyBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBzdGFydHMgd2l0aCBhbiB1bmRlcnNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaXQncyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBpbiBDb3VjaERCXG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0ciAtIFRoZSBhdHRyaWJ1dGUgbmFtZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHtSZWdFeHBNYXRjaEFycmF5fG51bGx9IFRoZSBtYXRjaCByZXN1bHQgb3IgbnVsbCBpZiBubyBtYXRjaFxuICogQGZ1bmN0aW9uIHRlc3RSZXNlcnZlZEF0dHJpYnV0ZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWNvdWNoZGJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RSZXNlcnZlZEF0dHJpYnV0ZXMoYXR0cjogc3RyaW5nKSB7XG4gIGNvbnN0IHJlZ2V4cCA9IC9eXy4qJC9nO1xuICByZXR1cm4gYXR0ci5tYXRjaChyZWdleHApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBuYW1lIGZvciBhIENvdWNoREIgaW5kZXhcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzdGFuZGFyZGl6ZWQgbmFtZSBmb3IgYSBDb3VjaERCIGluZGV4IGJhc2VkIG9uIHRoZSB0YWJsZSwgYXR0cmlidXRlLCBjb21wb3NpdGlvbnMsIGFuZCBvcmRlclxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSAtIFRoZSBwcmltYXJ5IGF0dHJpYnV0ZSBmb3IgdGhlIGluZGV4XG4gKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbY29tcG9zaXRpb25zXSAtIE9wdGlvbmFsIGFkZGl0aW9uYWwgYXR0cmlidXRlcyB0byBpbmNsdWRlIGluIHRoZSBpbmRleFxuICogQHBhcmFtIHtPcmRlckRpcmVjdGlvbn0gW29yZGVyXSAtIE9wdGlvbmFsIHNvcnQgb3JkZXIgZm9yIHRoZSBpbmRleFxuICogQHBhcmFtIHtzdHJpbmd9IFtzZXBhcmF0b3I9RGVmYXVsdFNlcGFyYXRvcl0gLSBUaGUgc2VwYXJhdG9yIHRvIHVzZSBiZXR3ZWVuIHBhcnRzIG9mIHRoZSBpbmRleCBuYW1lXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgaW5kZXggbmFtZVxuICogQGZ1bmN0aW9uIGdlbmVyYXRlSW5kZXhOYW1lXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1jb3VjaGRiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4TmFtZShcbiAgYXR0cmlidXRlOiBzdHJpbmcsXG4gIHRhYmxlTmFtZTogc3RyaW5nLFxuICBjb21wb3NpdGlvbnM/OiBzdHJpbmdbXSxcbiAgb3JkZXI/OiBPcmRlckRpcmVjdGlvbixcbiAgc2VwYXJhdG9yID0gRGVmYXVsdFNlcGFyYXRvclxuKTogc3RyaW5nIHtcbiAgY29uc3QgYXR0ciA9IFtQZXJzaXN0ZW5jZUtleXMuSU5ERVgsIHRhYmxlTmFtZSwgYXR0cmlidXRlXTtcbiAgaWYgKGNvbXBvc2l0aW9ucykgYXR0ci5wdXNoKC4uLmNvbXBvc2l0aW9ucyk7XG4gIGlmIChvcmRlcikgYXR0ci5wdXNoKG9yZGVyKTtcbiAgcmV0dXJuIGF0dHIuam9pbihzZXBhcmF0b3IpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBDb3VjaERCIGluZGV4IGNvbmZpZ3VyYXRpb25cbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBjb21wbGV0ZSBDcmVhdGVJbmRleFJlcXVlc3Qgb2JqZWN0IGZvciBkZWZpbmluZyBhIENvdWNoREIgaW5kZXggYmFzZWQgb24gc3BlY2lmaWVkIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgLSBUaGUgcHJpbWFyeSBhdHRyaWJ1dGUgZm9yIHRoZSBpbmRleFxuICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gW2NvbXBvc2l0aW9uc10gLSBPcHRpb25hbCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgdG8gaW5jbHVkZSBpbiB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7T3JkZXJEaXJlY3Rpb259IFtvcmRlcl0gLSBPcHRpb25hbCBzb3J0IG9yZGVyIGZvciB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPURlZmF1bHRTZXBhcmF0b3JdIC0gVGhlIHNlcGFyYXRvciB0byB1c2UgYmV0d2VlbiBwYXJ0cyBvZiB0aGUgaW5kZXggbmFtZVxuICogQHJldHVybiB7Q3JlYXRlSW5kZXhSZXF1ZXN0fSBUaGUgY29tcGxldGUgaW5kZXggY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4RG9jXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1jb3VjaGRiXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBnZW5lcmF0ZUluZGV4RG9jXG4gKiAgIHBhcnRpY2lwYW50IGdlbmVyYXRlSW5kZXhOYW1lXG4gKiAgIFxuICogICBDYWxsZXItPj5nZW5lcmF0ZUluZGV4RG9jOiBhdHRyaWJ1dGUsIHRhYmxlTmFtZSwgY29tcG9zaXRpb25zLCBvcmRlciwgc2VwYXJhdG9yXG4gKiAgIFxuICogICBOb3RlIG92ZXIgZ2VuZXJhdGVJbmRleERvYzogQ3JlYXRlIHBhcnRpYWwgZmlsdGVyIHNlbGVjdG9yXG4gKiAgIGdlbmVyYXRlSW5kZXhEb2MtPj5nZW5lcmF0ZUluZGV4RG9jOiBTZXQgdXAgZmlsdGVyIGZvciB0YWJsZU5hbWVcbiAqICAgXG4gKiAgIGFsdCBvcmRlciBpcyBzcGVjaWZpZWRcbiAqICAgICBOb3RlIG92ZXIgZ2VuZXJhdGVJbmRleERvYzogQ3JlYXRlIG9yZGVyZWQgZmllbGRzIGFycmF5XG4gKiAgICAgZ2VuZXJhdGVJbmRleERvYy0+PmdlbmVyYXRlSW5kZXhEb2M6IENyZWF0ZSBvcmRlclByb3AgZm9yIGF0dHJpYnV0ZVxuICogICAgIGdlbmVyYXRlSW5kZXhEb2MtPj5nZW5lcmF0ZUluZGV4RG9jOiBNYXAgY29tcG9zaXRpb25zIHRvIG9yZGVyZWQgcHJvcHNcbiAqICAgICBnZW5lcmF0ZUluZGV4RG9jLT4+Z2VuZXJhdGVJbmRleERvYzogQ3JlYXRlIHNvcnRlZFRhYmxlIGZvciB0YWJsZSBmaWVsZFxuICogICAgIGdlbmVyYXRlSW5kZXhEb2MtPj5nZW5lcmF0ZUluZGV4RG9jOiBDb21iaW5lIGFsbCBvcmRlcmVkIGZpZWxkc1xuICogICBlbHNlXG4gKiAgICAgTm90ZSBvdmVyIGdlbmVyYXRlSW5kZXhEb2M6IENyZWF0ZSBzaW1wbGUgZmllbGRzIGFycmF5XG4gKiAgICAgZ2VuZXJhdGVJbmRleERvYy0+PmdlbmVyYXRlSW5kZXhEb2M6IFVzZSBhdHRyaWJ1dGUsIGNvbXBvc2l0aW9ucywgYW5kIHRhYmxlIGFzIHN0cmluZ3NcbiAqICAgZW5kXG4gKiAgIFxuICogICBnZW5lcmF0ZUluZGV4RG9jLT4+Z2VuZXJhdGVJbmRleE5hbWU6IEdlbmVyYXRlIGluZGV4IG5hbWVcbiAqICAgZ2VuZXJhdGVJbmRleE5hbWUtLT4+Z2VuZXJhdGVJbmRleERvYzogUmV0dXJuIG5hbWVcbiAqICAgXG4gKiAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4RG9jOiBDcmVhdGUgZmluYWwgaW5kZXggcmVxdWVzdFxuICogICBnZW5lcmF0ZUluZGV4RG9jLS0+PkNhbGxlcjogUmV0dXJuIENyZWF0ZUluZGV4UmVxdWVzdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVJbmRleERvYyhcbiAgYXR0cmlidXRlOiBzdHJpbmcsXG4gIHRhYmxlTmFtZTogc3RyaW5nLFxuICBjb21wb3NpdGlvbnM/OiBzdHJpbmdbXSxcbiAgb3JkZXI/OiBPcmRlckRpcmVjdGlvbixcbiAgc2VwYXJhdG9yID0gRGVmYXVsdFNlcGFyYXRvclxuKTogQ3JlYXRlSW5kZXhSZXF1ZXN0IHtcbiAgY29uc3QgcGFydGlhbEZpbHRlclNlbGVjdG9yOiBNYW5nb1NlbGVjdG9yID0ge307XG4gIHBhcnRpYWxGaWx0ZXJTZWxlY3RvcltDb3VjaERCS2V5cy5UQUJMRV0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAocGFydGlhbEZpbHRlclNlbGVjdG9yW0NvdWNoREJLZXlzLlRBQkxFXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICBDb3VjaERCT3BlcmF0b3IuRVFVQUxcbiAgXSA9IHRhYmxlTmFtZTtcbiAgbGV0IGZpZWxkczogU29ydE9yZGVyW107XG4gIGlmIChvcmRlcikge1xuICAgIGNvbnN0IG9yZGVyUHJvcDogU29ydE9yZGVyID0ge307XG4gICAgb3JkZXJQcm9wW2F0dHJpYnV0ZV0gPSBvcmRlciBhcyBcImFzY1wiIHwgXCJkZXNjXCI7XG4gICAgY29uc3Qgc29ydGVkQ29tcG9zaXRpb25zOiBTb3J0T3JkZXJbXSA9IChjb21wb3NpdGlvbnMgfHwgW10pLm1hcCgoYykgPT4ge1xuICAgICAgY29uc3QgcjogU29ydE9yZGVyID0ge307XG4gICAgICByW2NdID0gb3JkZXIgYXMgXCJhc2NcIiB8IFwiZGVzY1wiO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfSk7XG4gICAgY29uc3Qgc29ydGVkVGFibGU6IFNvcnRPcmRlciA9IHt9O1xuICAgIHNvcnRlZFRhYmxlW0NvdWNoREJLZXlzLlRBQkxFXSA9IG9yZGVyIGFzIFwiYXNjXCIgfCBcImRlc2NcIjtcbiAgICBmaWVsZHMgPSBbb3JkZXJQcm9wLCAuLi5zb3J0ZWRDb21wb3NpdGlvbnMsIHNvcnRlZFRhYmxlXTtcbiAgfSBlbHNlIHtcbiAgICBmaWVsZHMgPSBbYXR0cmlidXRlLCAuLi4oY29tcG9zaXRpb25zIHx8IFtdKSwgQ291Y2hEQktleXMuVEFCTEVdO1xuICB9XG4gIGNvbnN0IG5hbWUgPSBnZW5lcmF0ZUluZGV4TmFtZShcbiAgICBhdHRyaWJ1dGUsXG4gICAgdGFibGVOYW1lLFxuICAgIGNvbXBvc2l0aW9ucyxcbiAgICBvcmRlcixcbiAgICBzZXBhcmF0b3JcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICBpbmRleDoge1xuICAgICAgZmllbGRzOiBmaWVsZHMsXG4gICAgICAvLyBwYXJ0aWFsX2ZpbHRlcl9zZWxlY3RvcjogcGFydGlhbEZpbHRlclNlbGVjdG9yLFxuICAgIH0sXG4gICAgZGRvYzogW25hbWUsIENvdWNoREJLZXlzLkRET0NdLmpvaW4oc2VwYXJhdG9yKSxcbiAgICBuYW1lOiBuYW1lLFxuICB9O1xufVxuIl19