UNPKG

@pebula/metap

Version:
227 lines 18.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { array, } from '@pebula/metap/internal'; /** * @record */ export function CompiledTransformation() { } if (false) { /** * Excluded members that doesn't have a \@Prop decorator. * All \@Exclude instructions on members with \@Prop instructions are add to the PoClassPropertyMap * @type {?} */ CompiledTransformation.prototype.excluded; /** @type {?} */ CompiledTransformation.prototype.instructions; } /** * @param {?} value * @param {?} prop * @return {?} */ export function transformValueOut(value, prop) { if (prop && prop.transform && prop.transform.outgoing) { return prop.transform.outgoing(value); } return value; } /** * @param {?} value * @param {?} prop * @return {?} */ export function transformValueIn(value, prop) { if (prop && prop.transform && prop.transform.incoming) { return prop.transform.incoming(value); } return value; } /** * @param {?} e * @return {?} */ function excludedPredicate(e) { return e.name === this; } var InclusivePropertyContainer = /** @class */ (function () { function InclusivePropertyContainer(target, compiled, predicate, renamer) { this.target = target; this.compiled = compiled; this.predicate = predicate; this.renamer = renamer; } /** * @param {?} keys * @param {?} cb * @return {?} */ InclusivePropertyContainer.prototype.forEach = /** * @param {?} keys * @param {?} cb * @return {?} */ function (keys, cb) { /** @type {?} */ var len = keys.length; /** @type {?} */ var instructions = this.compiled.instructions.slice(); /** @type {?} */ var excluded = this.compiled.excluded.slice(); for (var i = 0; i < len; i++) { /** @type {?} */ var prop = array.findRemove(instructions, this.predicate, keys[i]) || { cls: keys[i], obj: keys[i], exclude: array.findRemove(excluded, excludedPredicate, keys[i]) }; if (!prop.exclude) { // we only transform names for ad-hoc properties. registered @Prop's are transformed // when the prop is compiled. if (!prop.prop && this.renamer) { this.renamer(prop); } cb(prop); } } }; /** * A forEach loop on all instructions including excluded instructions and properties not in "keys" but in metadata. * It is recommended to use "forEach" unless the mapper implementation has different transformation strategies. * @param keys * @param cb */ /** * A forEach loop on all instructions including excluded instructions and properties not in "keys" but in metadata. * It is recommended to use "forEach" unless the mapper implementation has different transformation strategies. * @param {?} keys * @param {?} cb * @return {?} */ InclusivePropertyContainer.prototype.forEachRaw = /** * A forEach loop on all instructions including excluded instructions and properties not in "keys" but in metadata. * It is recommended to use "forEach" unless the mapper implementation has different transformation strategies. * @param {?} keys * @param {?} cb * @return {?} */ function (keys, cb) { /** @type {?} */ var len = keys.length; /** @type {?} */ var instructions = this.compiled.instructions.slice(); /** @type {?} */ var excluded = this.compiled.excluded.slice(); for (var i = 0; i < len; i++) { /** @type {?} */ var prop = array.findRemove(instructions, this.predicate, keys[i]) || { cls: keys[i], obj: keys[i], exclude: array.findRemove(excluded, excludedPredicate, keys[i]) }; // we only transform names for ad-hoc properties. registered @Prop's are transformed // when the prop is compiled. if (!prop.prop && this.renamer) { this.renamer(prop); } cb(prop); } len = instructions.length; for (var i = 0; i < len; i++) { /** @type {?} */ var prop = instructions[i]; // we only transform names for ad-hoc properties. registered @Prop's are transformed // when the prop is compiled. if (!prop.prop && this.renamer) { this.renamer(prop); } cb(prop); } }; return InclusivePropertyContainer; }()); export { InclusivePropertyContainer }; if (false) { /** @type {?} */ InclusivePropertyContainer.prototype.target; /** * @type {?} * @private */ InclusivePropertyContainer.prototype.compiled; /** * @type {?} * @private */ InclusivePropertyContainer.prototype.predicate; /** * @type {?} * @private */ InclusivePropertyContainer.prototype.renamer; } var ExclusivePropertyContainer = /** @class */ (function () { function ExclusivePropertyContainer(target, compiled) { this.target = target; this.compiled = compiled; } /** * @param {?} keys * @param {?} cb * @return {?} */ ExclusivePropertyContainer.prototype.forEach = /** * @param {?} keys * @param {?} cb * @return {?} */ function (keys, cb) { /** @type {?} */ var instructions = this.compiled.instructions; // No need to apply transformNameStrategy, it is cached in the instructions. for (var i = 0, len = instructions.length; i < len; i++) { !instructions[i].exclude && cb(instructions[i]); } }; /** * A forEach loop on all instructions including excluded instructions and properties not in "keys" but in metadata. * It is recommended to use "forEach" unless the mapper implementation has different transformation strategies. * @param keys * @param cb */ /** * A forEach loop on all instructions including excluded instructions and properties not in "keys" but in metadata. * It is recommended to use "forEach" unless the mapper implementation has different transformation strategies. * @param {?} keys * @param {?} cb * @return {?} */ ExclusivePropertyContainer.prototype.forEachRaw = /** * A forEach loop on all instructions including excluded instructions and properties not in "keys" but in metadata. * It is recommended to use "forEach" unless the mapper implementation has different transformation strategies. * @param {?} keys * @param {?} cb * @return {?} */ function (keys, cb) { /** @type {?} */ var instructions = this.compiled.instructions; for (var i = 0, len = instructions.length; i < len; i++) { cb(instructions[i]); } }; return ExclusivePropertyContainer; }()); export { ExclusivePropertyContainer }; if (false) { /** @type {?} */ ExclusivePropertyContainer.prototype.target; /** * @type {?} * @private */ ExclusivePropertyContainer.prototype.compiled; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi1jb250ZXh0LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHBlYnVsYS9tZXRhcC8iLCJzb3VyY2VzIjpbImxpYi9zZXJpYWxpemF0aW9uL21hcHBpbmcvc2VyaWFsaXphdGlvbi1jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBS0wsS0FBSyxHQUNOLE1BQU0sd0JBQXdCLENBQUM7Ozs7QUFHaEMsNENBT0M7Ozs7Ozs7SUFGQywwQ0FBNEI7O0lBQzVCLDhDQUFtQzs7Ozs7OztBQUdyQyxNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBVSxFQUFFLElBQWtCO0lBQzlELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUU7UUFDckQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN2QztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQzs7Ozs7O0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEtBQVUsRUFBRSxJQUFrQjtJQUM3RCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFO1FBQ3JELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDdkM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7Ozs7O0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxDQUFrQjtJQUMzQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDO0FBQ3pCLENBQUM7QUFFRDtJQUNFLG9DQUFtQixNQUFXLEVBQ1YsUUFBZ0MsRUFDaEMsU0FBNkMsRUFDN0MsT0FBNEM7UUFIN0MsV0FBTSxHQUFOLE1BQU0sQ0FBSztRQUNWLGFBQVEsR0FBUixRQUFRLENBQXdCO1FBQ2hDLGNBQVMsR0FBVCxTQUFTLENBQW9DO1FBQzdDLFlBQU8sR0FBUCxPQUFPLENBQXFDO0lBQUcsQ0FBQzs7Ozs7O0lBRXBFLDRDQUFPOzs7OztJQUFQLFVBQVEsSUFBYyxFQUFFLEVBQXNDOztZQUN4RCxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU07O1lBRWYsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRTs7WUFDakQsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRTtRQUUvQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFOztnQkFDeEIsSUFBSSxHQUF1QixLQUFLLENBQUMsVUFBVSxDQUM3QyxZQUFZLEVBQ1osSUFBSSxDQUFDLFNBQVMsRUFDZCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ1IsSUFBSTtnQkFDSCxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDWixHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDWixPQUFPLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2hFO1lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2pCLG9GQUFvRjtnQkFDcEYsNkJBQTZCO2dCQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNwQjtnQkFDRCxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDVjtTQUNGO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHOzs7Ozs7OztJQUNILCtDQUFVOzs7Ozs7O0lBQVYsVUFBVyxJQUFjLEVBQUUsRUFBc0M7O1lBQzNELEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTTs7WUFFZixZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFOztZQUNqRCxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO1FBRS9DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O2dCQUN4QixJQUFJLEdBQXVCLEtBQUssQ0FBQyxVQUFVLENBQzdDLFlBQVksRUFDWixJQUFJLENBQUMsU0FBUyxFQUNkLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDUixJQUFJO2dCQUNILEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNaLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNaLE9BQU8sRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEU7WUFFRCxvRkFBb0Y7WUFDcEYsNkJBQTZCO1lBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDcEI7WUFDRCxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDVjtRQUVELEdBQUcsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDO1FBQzFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O2dCQUN4QixJQUFJLEdBQXVCLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFFOUMsb0ZBQW9GO1lBQ3BGLDZCQUE2QjtZQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3BCO1lBQ0QsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ1Y7SUFDSCxDQUFDO0lBQ0gsaUNBQUM7QUFBRCxDQUFDLEFBN0VELElBNkVDOzs7O0lBNUVhLDRDQUFrQjs7Ozs7SUFDbEIsOENBQXdDOzs7OztJQUN4QywrQ0FBcUQ7Ozs7O0lBQ3JELDZDQUFvRDs7QUEyRWxFO0lBQ0Usb0NBQW1CLE1BQVcsRUFBVSxRQUFnQztRQUFyRCxXQUFNLEdBQU4sTUFBTSxDQUFLO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBd0I7SUFBRyxDQUFDOzs7Ozs7SUFFNUUsNENBQU87Ozs7O0lBQVAsVUFBUSxJQUFjLEVBQUUsRUFBc0M7O1lBQ3RELFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVk7UUFDL0MsNEVBQTRFO1FBQzVFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdkQsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNqRDtJQUNILENBQUM7SUFFRDs7Ozs7T0FLRzs7Ozs7Ozs7SUFDSCwrQ0FBVTs7Ozs7OztJQUFWLFVBQVcsSUFBYyxFQUFFLEVBQXNDOztZQUN6RCxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZO1FBQy9DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdkQsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQUNILGlDQUFDO0FBQUQsQ0FBQyxBQXZCRCxJQXVCQzs7OztJQXRCYSw0Q0FBa0I7Ozs7O0lBQUUsOENBQXdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgUHJvcE1ldGFkYXRhLFxuICBFeGNsdWRlTWV0YWRhdGEsXG4gIFNlcmlhbGl6ZXJDb250ZXh0LFxuICBQb0NsYXNzUHJvcGVydHlNYXAsXG4gIGFycmF5LFxufSBmcm9tICdAcGVidWxhL21ldGFwL2ludGVybmFsJztcblxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBpbGVkVHJhbnNmb3JtYXRpb24ge1xuICAvKipcbiAgICogRXhjbHVkZWQgbWVtYmVycyB0aGF0IGRvZXNuJ3QgaGF2ZSBhIEBQcm9wIGRlY29yYXRvci5cbiAgICogQWxsIEBFeGNsdWRlIGluc3RydWN0aW9ucyBvbiBtZW1iZXJzIHdpdGggQFByb3AgaW5zdHJ1Y3Rpb25zIGFyZSBhZGQgdG8gdGhlIFBvQ2xhc3NQcm9wZXJ0eU1hcFxuICAgKi9cbiAgZXhjbHVkZWQ6IEV4Y2x1ZGVNZXRhZGF0YVtdO1xuICBpbnN0cnVjdGlvbnM6IFBvQ2xhc3NQcm9wZXJ0eU1hcFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtVmFsdWVPdXQodmFsdWU6IGFueSwgcHJvcDogUHJvcE1ldGFkYXRhKTogYW55IHtcbiAgaWYgKHByb3AgJiYgcHJvcC50cmFuc2Zvcm0gJiYgcHJvcC50cmFuc2Zvcm0ub3V0Z29pbmcpIHtcbiAgICByZXR1cm4gcHJvcC50cmFuc2Zvcm0ub3V0Z29pbmcodmFsdWUpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVZhbHVlSW4odmFsdWU6IGFueSwgcHJvcDogUHJvcE1ldGFkYXRhKTogYW55IHtcbiAgaWYgKHByb3AgJiYgcHJvcC50cmFuc2Zvcm0gJiYgcHJvcC50cmFuc2Zvcm0uaW5jb21pbmcpIHtcbiAgICByZXR1cm4gcHJvcC50cmFuc2Zvcm0uaW5jb21pbmcodmFsdWUpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZWRQcmVkaWNhdGUoZTogRXhjbHVkZU1ldGFkYXRhKSB7XG4gIHJldHVybiBlLm5hbWUgPT09IHRoaXM7XG59XG5cbmV4cG9ydCBjbGFzcyBJbmNsdXNpdmVQcm9wZXJ0eUNvbnRhaW5lciBpbXBsZW1lbnRzIFNlcmlhbGl6ZXJDb250ZXh0IHtcbiAgY29uc3RydWN0b3IocHVibGljIHRhcmdldDogYW55LFxuICAgICAgICAgICAgICBwcml2YXRlIGNvbXBpbGVkOiBDb21waWxlZFRyYW5zZm9ybWF0aW9uLFxuICAgICAgICAgICAgICBwcml2YXRlIHByZWRpY2F0ZTogKHA6IFBvQ2xhc3NQcm9wZXJ0eU1hcCkgPT4gYm9vbGVhbixcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZW5hbWVyPzogKHBvOiBQb0NsYXNzUHJvcGVydHlNYXApID0+IHN0cmluZykge31cblxuICBmb3JFYWNoKGtleXM6IHN0cmluZ1tdLCBjYjogKHBNYXA6IFBvQ2xhc3NQcm9wZXJ0eU1hcCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGxldCBsZW4gPSBrZXlzLmxlbmd0aDtcblxuICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IHRoaXMuY29tcGlsZWQuaW5zdHJ1Y3Rpb25zLnNsaWNlKCk7XG4gICAgY29uc3QgZXhjbHVkZWQgPSB0aGlzLmNvbXBpbGVkLmV4Y2x1ZGVkLnNsaWNlKCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBsZXQgcHJvcDogUG9DbGFzc1Byb3BlcnR5TWFwID0gYXJyYXkuZmluZFJlbW92ZShcbiAgICAgICAgaW5zdHJ1Y3Rpb25zLFxuICAgICAgICB0aGlzLnByZWRpY2F0ZSxcbiAgICAgICAga2V5c1tpXVxuICAgICAgKSB8fCB7XG4gICAgICAgIGNsczoga2V5c1tpXSxcbiAgICAgICAgb2JqOiBrZXlzW2ldLFxuICAgICAgICBleGNsdWRlOiBhcnJheS5maW5kUmVtb3ZlKGV4Y2x1ZGVkLCBleGNsdWRlZFByZWRpY2F0ZSwga2V5c1tpXSlcbiAgICAgIH07XG5cbiAgICAgIGlmICghcHJvcC5leGNsdWRlKSB7XG4gICAgICAgIC8vIHdlIG9ubHkgdHJhbnNmb3JtIG5hbWVzIGZvciBhZC1ob2MgcHJvcGVydGllcy4gcmVnaXN0ZXJlZCBAUHJvcCdzIGFyZSB0cmFuc2Zvcm1lZFxuICAgICAgICAvLyB3aGVuIHRoZSBwcm9wIGlzIGNvbXBpbGVkLlxuICAgICAgICBpZiAoIXByb3AucHJvcCAmJiB0aGlzLnJlbmFtZXIpIHtcbiAgICAgICAgICB0aGlzLnJlbmFtZXIocHJvcCk7XG4gICAgICAgIH1cbiAgICAgICAgY2IocHJvcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgZm9yRWFjaCBsb29wIG9uIGFsbCBpbnN0cnVjdGlvbnMgaW5jbHVkaW5nIGV4Y2x1ZGVkIGluc3RydWN0aW9ucyBhbmQgcHJvcGVydGllcyBub3QgaW4gXCJrZXlzXCIgYnV0IGluIG1ldGFkYXRhLlxuICAgKiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgXCJmb3JFYWNoXCIgdW5sZXNzIHRoZSBtYXBwZXIgaW1wbGVtZW50YXRpb24gaGFzIGRpZmZlcmVudCB0cmFuc2Zvcm1hdGlvbiBzdHJhdGVnaWVzLlxuICAgKiBAcGFyYW0ga2V5c1xuICAgKiBAcGFyYW0gY2JcbiAgICovXG4gIGZvckVhY2hSYXcoa2V5czogc3RyaW5nW10sIGNiOiAocE1hcDogUG9DbGFzc1Byb3BlcnR5TWFwKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgbGV0IGxlbiA9IGtleXMubGVuZ3RoO1xuXG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gdGhpcy5jb21waWxlZC5pbnN0cnVjdGlvbnMuc2xpY2UoKTtcbiAgICBjb25zdCBleGNsdWRlZCA9IHRoaXMuY29tcGlsZWQuZXhjbHVkZWQuc2xpY2UoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGxldCBwcm9wOiBQb0NsYXNzUHJvcGVydHlNYXAgPSBhcnJheS5maW5kUmVtb3ZlKFxuICAgICAgICBpbnN0cnVjdGlvbnMsXG4gICAgICAgIHRoaXMucHJlZGljYXRlLFxuICAgICAgICBrZXlzW2ldXG4gICAgICApIHx8IHtcbiAgICAgICAgY2xzOiBrZXlzW2ldLFxuICAgICAgICBvYmo6IGtleXNbaV0sXG4gICAgICAgIGV4Y2x1ZGU6IGFycmF5LmZpbmRSZW1vdmUoZXhjbHVkZWQsIGV4Y2x1ZGVkUHJlZGljYXRlLCBrZXlzW2ldKVxuICAgICAgfTtcblxuICAgICAgLy8gd2Ugb25seSB0cmFuc2Zvcm0gbmFtZXMgZm9yIGFkLWhvYyBwcm9wZXJ0aWVzLiByZWdpc3RlcmVkIEBQcm9wJ3MgYXJlIHRyYW5zZm9ybWVkXG4gICAgICAvLyB3aGVuIHRoZSBwcm9wIGlzIGNvbXBpbGVkLlxuICAgICAgaWYgKCFwcm9wLnByb3AgJiYgdGhpcy5yZW5hbWVyKSB7XG4gICAgICAgIHRoaXMucmVuYW1lcihwcm9wKTtcbiAgICAgIH1cbiAgICAgIGNiKHByb3ApO1xuICAgIH1cblxuICAgIGxlbiA9IGluc3RydWN0aW9ucy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgbGV0IHByb3A6IFBvQ2xhc3NQcm9wZXJ0eU1hcCA9IGluc3RydWN0aW9uc1tpXTtcblxuICAgICAgLy8gd2Ugb25seSB0cmFuc2Zvcm0gbmFtZXMgZm9yIGFkLWhvYyBwcm9wZXJ0aWVzLiByZWdpc3RlcmVkIEBQcm9wJ3MgYXJlIHRyYW5zZm9ybWVkXG4gICAgICAvLyB3aGVuIHRoZSBwcm9wIGlzIGNvbXBpbGVkLlxuICAgICAgaWYgKCFwcm9wLnByb3AgJiYgdGhpcy5yZW5hbWVyKSB7XG4gICAgICAgIHRoaXMucmVuYW1lcihwcm9wKTtcbiAgICAgIH1cbiAgICAgIGNiKHByb3ApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXhjbHVzaXZlUHJvcGVydHlDb250YWluZXIgaW1wbGVtZW50cyBTZXJpYWxpemVyQ29udGV4dCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0YXJnZXQ6IGFueSwgcHJpdmF0ZSBjb21waWxlZDogQ29tcGlsZWRUcmFuc2Zvcm1hdGlvbikge31cblxuICBmb3JFYWNoKGtleXM6IHN0cmluZ1tdLCBjYjogKHBNYXA6IFBvQ2xhc3NQcm9wZXJ0eU1hcCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IHRoaXMuY29tcGlsZWQuaW5zdHJ1Y3Rpb25zO1xuICAgIC8vIE5vIG5lZWQgdG8gYXBwbHkgdHJhbnNmb3JtTmFtZVN0cmF0ZWd5LCBpdCBpcyBjYWNoZWQgaW4gdGhlIGluc3RydWN0aW9ucy5cbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaW5zdHJ1Y3Rpb25zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAhaW5zdHJ1Y3Rpb25zW2ldLmV4Y2x1ZGUgJiYgY2IoaW5zdHJ1Y3Rpb25zW2ldKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQSBmb3JFYWNoIGxvb3Agb24gYWxsIGluc3RydWN0aW9ucyBpbmNsdWRpbmcgZXhjbHVkZWQgaW5zdHJ1Y3Rpb25zIGFuZCBwcm9wZXJ0aWVzIG5vdCBpbiBcImtleXNcIiBidXQgaW4gbWV0YWRhdGEuXG4gICAqIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBcImZvckVhY2hcIiB1bmxlc3MgdGhlIG1hcHBlciBpbXBsZW1lbnRhdGlvbiBoYXMgZGlmZmVyZW50IHRyYW5zZm9ybWF0aW9uIHN0cmF0ZWdpZXMuXG4gICAqIEBwYXJhbSBrZXlzXG4gICAqIEBwYXJhbSBjYlxuICAgKi9cbiAgZm9yRWFjaFJhdyhrZXlzOiBzdHJpbmdbXSwgY2I6IChwTWFwOiBQb0NsYXNzUHJvcGVydHlNYXApID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0aGlzLmNvbXBpbGVkLmluc3RydWN0aW9ucztcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaW5zdHJ1Y3Rpb25zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjYihpbnN0cnVjdGlvbnNbaV0pO1xuICAgIH1cbiAgfVxufVxuIl19