UNPKG

@orbit/records

Version:

A flexible data access and synchronization layer.

104 lines 16.9 kB
import { Orbit } from '@orbit/core'; import { AddRecordTerm, AddToRelatedRecordsTerm, RemoveFromRelatedRecordsTerm, RemoveRecordTerm, ReplaceAttributeTerm, ReplaceKeyTerm, ReplaceRelatedRecordsTerm, ReplaceRelatedRecordTerm, UpdateRecordTerm } from './record-operation-term'; const { assert, deprecate } = Orbit; export class RecordTransformBuilder { constructor(settings = {}) { const { schema, normalizer, validatorFor, recordInitializer } = settings; if (validatorFor) { assert('A RecordTransformBuilder that has been assigned a `validatorFor` requires a `schema`', schema !== undefined); } this.$schema = schema; this.$normalizer = normalizer; this.$validatorFor = validatorFor; if (recordInitializer) { if (this.$normalizer !== undefined) { deprecate('A `normalizer` and `recordInitializer` have both been assigned to the `TransformBuilder`. Only the `normalizer` will be used.'); } else { deprecate('A `recordInitializer` has been assigned to the `TransformBuilder`. The `recordInitializer` setting has been deprecated in favor of `normalizer`, and will be treated as if it were a `RecordNormalizer`.'); this.$normalizer = { normalizeRecordType(type) { return type; }, normalizeRecord(record) { return recordInitializer.initializeRecord(record); }, normalizeRecordIdentity(recordIdentity) { return recordIdentity; } }; } } } /** * Instantiate a new `addRecord` operation. */ addRecord(record) { return new AddRecordTerm(this, this.$normalizeRecord(record)); } /** * Instantiate a new `updateRecord` operation. */ updateRecord(record) { return new UpdateRecordTerm(this, this.$normalizeRecord(record)); } /** * Instantiate a new `removeRecord` operation. */ removeRecord(record) { return new RemoveRecordTerm(this, this.$normalizeRecordIdentity(record)); } /** * Instantiate a new `replaceKey` operation. */ replaceKey(record, key, value) { return new ReplaceKeyTerm(this, this.$normalizeRecordIdentity(record), key, value); } /** * Instantiate a new `replaceAttribute` operation. */ replaceAttribute(record, attribute, value) { return new ReplaceAttributeTerm(this, this.$normalizeRecordIdentity(record), attribute, value); } /** * Instantiate a new `addToRelatedRecords` operation. */ addToRelatedRecords(record, relationship, relatedRecord) { return new AddToRelatedRecordsTerm(this, this.$normalizeRecordIdentity(record), relationship, this.$normalizeRecordIdentity(relatedRecord)); } /** * Instantiate a new `removeFromRelatedRecords` operation. */ removeFromRelatedRecords(record, relationship, relatedRecord) { return new RemoveFromRelatedRecordsTerm(this, this.$normalizeRecordIdentity(record), relationship, this.$normalizeRecordIdentity(relatedRecord)); } /** * Instantiate a new `replaceRelatedRecords` operation. */ replaceRelatedRecords(record, relationship, relatedRecords) { return new ReplaceRelatedRecordsTerm(this, this.$normalizeRecordIdentity(record), relationship, relatedRecords.map((ri) => this.$normalizeRecordIdentity(ri))); } /** * Instantiate a new `replaceRelatedRecord` operation. */ replaceRelatedRecord(record, relationship, relatedRecord) { return new ReplaceRelatedRecordTerm(this, this.$normalizeRecordIdentity(record), relationship, relatedRecord ? this.$normalizeRecordIdentity(relatedRecord) : null); } $normalizeRecord(r) { if (this.$normalizer) { return this.$normalizer.normalizeRecord(r); } else { return r; } } $normalizeRecordIdentity(ri) { if (this.$normalizer !== undefined) { return this.$normalizer.normalizeRecordIdentity(ri); } else { return ri; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLXRyYW5zZm9ybS1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlY29yZC10cmFuc2Zvcm0tYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBV3BDLE9BQU8sRUFDTCxhQUFhLEVBQ2IsdUJBQXVCLEVBQ3ZCLDRCQUE0QixFQUM1QixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGNBQWMsRUFDZCx5QkFBeUIsRUFDekIsd0JBQXdCLEVBQ3hCLGdCQUFnQixFQUNqQixNQUFNLHlCQUF5QixDQUFDO0FBSWpDLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsS0FBSyxDQUFDO0FBc0JwQyxNQUFNLE9BQU8sc0JBQXNCO0lBU2pDLFlBQVksV0FBc0QsRUFBRTtRQUNsRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxRQUFRLENBQUM7UUFFekUsSUFBSSxZQUFZLEVBQUU7WUFDaEIsTUFBTSxDQUNKLHNGQUFzRixFQUN0RixNQUFNLEtBQUssU0FBUyxDQUNyQixDQUFDO1NBQ0g7UUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQztRQUVsQyxJQUFJLGlCQUFpQixFQUFFO1lBQ3JCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUU7Z0JBQ2xDLFNBQVMsQ0FDUCwrSEFBK0gsQ0FDaEksQ0FBQzthQUNIO2lCQUFNO2dCQUNMLFNBQVMsQ0FDUCwwTUFBME0sQ0FDM00sQ0FBQztnQkFDRixJQUFJLENBQUMsV0FBVyxHQUFHO29CQUNqQixtQkFBbUIsQ0FBQyxJQUFRO3dCQUMxQixPQUFRLElBQTBCLENBQUM7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QUFXLEVBQUU7WUFDcEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM1QzthQUFNO1lBQ0wsT0FBUSxDQUFrQyxDQUFDO1NBQzVDO0lBQ0gsQ0FBQztJQUVELHdCQUF3QixDQUFDLEVBQU07UUFDN0IsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUNsQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDckQ7YUFBTTtZQUNMLE9BQVEsRUFBZ0MsQ0FBQztTQUMxQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9yYml0IH0gZnJvbSAnQG9yYml0L2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNmb3JtQnVpbGRlckZ1bmMgfSBmcm9tICdAb3JiaXQvZGF0YSc7XG5pbXBvcnQgeyBTdGFuZGFyZFZhbGlkYXRvciwgVmFsaWRhdG9yRm9yRm4gfSBmcm9tICdAb3JiaXQvdmFsaWRhdG9ycyc7XG5pbXBvcnQge1xuICBJbml0aWFsaXplZFJlY29yZCxcbiAgUmVjb3JkSWRlbnRpdHksXG4gIFJlY29yZEluaXRpYWxpemVyLFxuICBVbmluaXRpYWxpemVkUmVjb3JkXG59IGZyb20gJy4vcmVjb3JkJztcbmltcG9ydCB7IFJlY29yZE5vcm1hbGl6ZXIgfSBmcm9tICcuL3JlY29yZC1ub3JtYWxpemVyJztcbmltcG9ydCB7IFJlY29yZE9wZXJhdGlvbiB9IGZyb20gJy4vcmVjb3JkLW9wZXJhdGlvbic7XG5pbXBvcnQge1xuICBBZGRSZWNvcmRUZXJtLFxuICBBZGRUb1JlbGF0ZWRSZWNvcmRzVGVybSxcbiAgUmVtb3ZlRnJvbVJlbGF0ZWRSZWNvcmRzVGVybSxcbiAgUmVtb3ZlUmVjb3JkVGVybSxcbiAgUmVwbGFjZUF0dHJpYnV0ZVRlcm0sXG4gIFJlcGxhY2VLZXlUZXJtLFxuICBSZXBsYWNlUmVsYXRlZFJlY29yZHNUZXJtLFxuICBSZXBsYWNlUmVsYXRlZFJlY29yZFRlcm0sXG4gIFVwZGF0ZVJlY29yZFRlcm1cbn0gZnJvbSAnLi9yZWNvcmQtb3BlcmF0aW9uLXRlcm0nO1xuaW1wb3J0IHsgUmVjb3JkU2NoZW1hIH0gZnJvbSAnLi9yZWNvcmQtc2NoZW1hJztcbmltcG9ydCB7IFN0YW5kYXJkUmVjb3JkVmFsaWRhdG9yIH0gZnJvbSAnLi9yZWNvcmQtdmFsaWRhdG9ycy9zdGFuZGFyZC1yZWNvcmQtdmFsaWRhdG9ycyc7XG5cbmNvbnN0IHsgYXNzZXJ0LCBkZXByZWNhdGUgfSA9IE9yYml0O1xuXG5leHBvcnQgdHlwZSBSZWNvcmRUcmFuc2Zvcm1CdWlsZGVyRnVuYyA9IFRyYW5zZm9ybUJ1aWxkZXJGdW5jPFxuICBSZWNvcmRPcGVyYXRpb24sXG4gIFJlY29yZFRyYW5zZm9ybUJ1aWxkZXJcbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkVHJhbnNmb3JtQnVpbGRlclNldHRpbmdzPFxuICBSVCA9IHN0cmluZyxcbiAgUkkgPSBSZWNvcmRJZGVudGl0eSxcbiAgUiA9IFVuaW5pdGlhbGl6ZWRSZWNvcmRcbj4ge1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgc2luY2UgdjAuMTcsIHJlcGxhY2VkIGJ5IGByZWNvcmROb3JtYWxpemVyYFxuICAgKi9cbiAgcmVjb3JkSW5pdGlhbGl6ZXI/OiBSZWNvcmRJbml0aWFsaXplcjtcblxuICBzY2hlbWE/OiBSZWNvcmRTY2hlbWE7XG4gIG5vcm1hbGl6ZXI/OiBSZWNvcmROb3JtYWxpemVyPFJULCBSSSwgUj47XG4gIHZhbGlkYXRvckZvcj86IFZhbGlkYXRvckZvckZuPFN0YW5kYXJkVmFsaWRhdG9yIHwgU3RhbmRhcmRSZWNvcmRWYWxpZGF0b3I+O1xufVxuXG5leHBvcnQgY2xhc3MgUmVjb3JkVHJhbnNmb3JtQnVpbGRlcjxcbiAgUlQgPSBzdHJpbmcsXG4gIFJJID0gUmVjb3JkSWRlbnRpdHksXG4gIFIgPSBVbmluaXRpYWxpemVkUmVjb3JkXG4+IHtcbiAgJHNjaGVtYT86IFJlY29yZFNjaGVtYTtcbiAgJG5vcm1hbGl6ZXI/OiBSZWNvcmROb3JtYWxpemVyPFJULCBSSSwgUj47XG4gICR2YWxpZGF0b3JGb3I/OiBWYWxpZGF0b3JGb3JGbjxTdGFuZGFyZFZhbGlkYXRvciB8IFN0YW5kYXJkUmVjb3JkVmFsaWRhdG9yPjtcblxuICBjb25zdHJ1Y3RvcihzZXR0aW5nczogUmVjb3JkVHJhbnNmb3JtQnVpbGRlclNldHRpbmdzPFJULCBSSSwgUj4gPSB7fSkge1xuICAgIGNvbnN0IHsgc2NoZW1hLCBub3JtYWxpemVyLCB2YWxpZGF0b3JGb3IsIHJlY29yZEluaXRpYWxpemVyIH0gPSBzZXR0aW5ncztcblxuICAgIGlmICh2YWxpZGF0b3JGb3IpIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgJ0EgUmVjb3JkVHJhbnNmb3JtQnVpbGRlciB0aGF0IGhhcyBiZWVuIGFzc2lnbmVkIGEgYHZhbGlkYXRvckZvcmAgcmVxdWlyZXMgYSBgc2NoZW1hYCcsXG4gICAgICAgIHNjaGVtYSAhPT0gdW5kZWZpbmVkXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuJHNjaGVtYSA9IHNjaGVtYTtcbiAgICB0aGlzLiRub3JtYWxpemVyID0gbm9ybWFsaXplcjtcbiAgICB0aGlzLiR2YWxpZGF0b3JGb3IgPSB2YWxpZGF0b3JGb3I7XG5cbiAgICBpZiAocmVjb3JkSW5pdGlhbGl6ZXIpIHtcbiAgICAgIGlmICh0aGlzLiRub3JtYWxpemVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVwcmVjYXRlKFxuICAgICAgICAgICdBIGBub3JtYWxpemVyYCBhbmQgYHJlY29yZEluaXRpYWxpemVyYCBoYXZlIGJvdGggYmVlbiBhc3NpZ25lZCB0byB0aGUgYFRyYW5zZm9ybUJ1aWxkZXJgLiBPbmx5IHRoZSBgbm9ybWFsaXplcmAgd2lsbCBiZSB1c2VkLidcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlcHJlY2F0ZShcbiAgICAgICAgICAnQSBgcmVjb3JkSW5pdGlhbGl6ZXJgIGhhcyBiZWVuIGFzc2lnbmVkIHRvIHRoZSBgVHJhbnNmb3JtQnVpbGRlcmAuIFRoZSBgcmVjb3JkSW5pdGlhbGl6ZXJgIHNldHRpbmcgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBgbm9ybWFsaXplcmAsIGFuZCB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgaXQgd2VyZSBhIGBSZWNvcmROb3JtYWxpemVyYC4nXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuJG5vcm1hbGl6ZXIgPSB7XG4gICAgICAgICAgbm9ybWFsaXplUmVjb3JkVHlwZSh0eXBlOiBSVCk6IHN0cmluZyB7XG4gICAgICAgICAgICByZXR1cm4gKHR5cGUgYXMgdW5rbm93bikgYXMgc3RyaW5nO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbm9ybWFsaXplUmVjb3JkKHJlY29yZDogUikge1xuICAgICAgICAgICAgcmV0dXJuIHJlY29yZEluaXRpYWxpemVyLmluaXRpYWxpemVSZWNvcmQoXG4gICAgICAgICAgICAgIChyZWNvcmQgYXMgdW5rbm93bikgYXMgVW5pbml0aWFsaXplZFJlY29yZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5vcm1hbGl6ZVJlY29yZElkZW50aXR5KHJlY29yZElkZW50aXR5OiBSSSkge1xuICAgICAgICAgICAgcmV0dXJuIChyZWNvcmRJZGVudGl0eSBhcyB1bmtub3duKSBhcyBSZWNvcmRJZGVudGl0eTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbnRpYXRlIGEgbmV3IGBhZGRSZWNvcmRgIG9wZXJhdGlvbi5cbiAgICovXG4gIGFkZFJlY29yZChyZWNvcmQ6IFIpOiBBZGRSZWNvcmRUZXJtPFJULCBSSSwgUj4ge1xuICAgIHJldHVybiBuZXcgQWRkUmVjb3JkVGVybSh0aGlzLCB0aGlzLiRub3JtYWxpemVSZWNvcmQocmVjb3JkKSk7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFudGlhdGUgYSBuZXcgYHVwZGF0ZVJlY29yZGAgb3BlcmF0aW9uLlxuICAgKi9cbiAgdXBkYXRlUmVjb3JkKHJlY29yZDogUik6IFVwZGF0ZVJlY29yZFRlcm08UlQsIFJJLCBSPiB7XG4gICAgcmV0dXJuIG5ldyBVcGRhdGVSZWNvcmRUZXJtKHRoaXMsIHRoaXMuJG5vcm1hbGl6ZVJlY29yZChyZWNvcmQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YW50aWF0ZSBhIG5ldyBgcmVtb3ZlUmVjb3JkYCBvcGVyYXRpb24uXG4gICAqL1xuICByZW1vdmVSZWNvcmQocmVjb3JkOiBSSSk6IFJlbW92ZVJlY29yZFRlcm08UlQsIFJJLCBSPiB7XG4gICAgcmV0dXJuIG5ldyBSZW1vdmVSZWNvcmRUZXJtKHRoaXMsIHRoaXMuJG5vcm1hbGl6ZVJlY29yZElkZW50aXR5KHJlY29yZCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbnRpYXRlIGEgbmV3IGByZXBsYWNlS2V5YCBvcGVyYXRpb24uXG4gICAqL1xuICByZXBsYWNlS2V5KFxuICAgIHJlY29yZDogUkksXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHN0cmluZ1xuICApOiBSZXBsYWNlS2V5VGVybTxSVCwgUkksIFI+IHtcbiAgICByZXR1cm4gbmV3IFJlcGxhY2VLZXlUZXJtKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMuJG5vcm1hbGl6ZVJlY29yZElkZW50aXR5KHJlY29yZCksXG4gICAgICBrZXksXG4gICAgICB2YWx1ZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFudGlhdGUgYSBuZXcgYHJlcGxhY2VBdHRyaWJ1dGVgIG9wZXJhdGlvbi5cbiAgICovXG4gIHJlcGxhY2VBdHRyaWJ1dGUoXG4gICAgcmVjb3JkOiBSSSxcbiAgICBhdHRyaWJ1dGU6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93blxuICApOiBSZXBsYWNlQXR0cmlidXRlVGVybTxSVCwgUkksIFI+IHtcbiAgICByZXR1cm4gbmV3IFJlcGxhY2VBdHRyaWJ1dGVUZXJtKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMuJG5vcm1hbGl6ZVJlY29yZElkZW50aXR5KHJlY29yZCksXG4gICAgICBhdHRyaWJ1dGUsXG4gICAgICB2YWx1ZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFudGlhdGUgYSBuZXcgYGFkZFRvUmVsYXRlZFJlY29yZHNgIG9wZXJhdGlvbi5cbiAgICovXG4gIGFkZFRvUmVsYXRlZFJlY29yZHMoXG4gICAgcmVjb3JkOiBSSSxcbiAgICByZWxhdGlvbnNoaXA6IHN0cmluZyxcbiAgICByZWxhdGVkUmVjb3JkOiBSSVxuICApOiBBZGRUb1JlbGF0ZWRSZWNvcmRzVGVybTxSVCwgUkksIFI+IHtcbiAgICByZXR1cm4gbmV3IEFkZFRvUmVsYXRlZFJlY29yZHNUZXJtKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMuJG5vcm1hbGl6ZVJlY29yZElkZW50aXR5KHJlY29yZCksXG4gICAgICByZWxhdGlvbnNoaXAsXG4gICAgICB0aGlzLiRub3JtYWxpemVSZWNvcmRJZGVudGl0eShyZWxhdGVkUmVjb3JkKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFudGlhdGUgYSBuZXcgYHJlbW92ZUZyb21SZWxhdGVkUmVjb3Jkc2Agb3BlcmF0aW9uLlxuICAgKi9cbiAgcmVtb3ZlRnJvbVJlbGF0ZWRSZWNvcmRzKFxuICAgIHJlY29yZDogUkksXG4gICAgcmVsYXRpb25zaGlwOiBzdHJpbmcsXG4gICAgcmVsYXRlZFJlY29yZDogUklcbiAgKTogUmVtb3ZlRnJvbVJlbGF0ZWRSZWNvcmRzVGVybTxSVCwgUkksIFI+IHtcbiAgICByZXR1cm4gbmV3IFJlbW92ZUZyb21SZWxhdGVkUmVjb3Jkc1Rlcm0oXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy4kbm9ybWFsaXplUmVjb3JkSWRlbnRpdHkocmVjb3JkKSxcbiAgICAgIHJlbGF0aW9uc2hpcCxcbiAgICAgIHRoaXMuJG5vcm1hbGl6ZVJlY29yZElkZW50aXR5KHJlbGF0ZWRSZWNvcmQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YW50aWF0ZSBhIG5ldyBgcmVwbGFjZVJlbGF0ZWRSZWNvcmRzYCBvcGVyYXRpb24uXG4gICAqL1xuICByZXBsYWNlUmVsYXRlZFJlY29yZHMoXG4gICAgcmVjb3JkOiBSSSxcbiAgICByZWxhdGlvbnNoaXA6IHN0cmluZyxcbiAgICByZWxhdGVkUmVjb3JkczogUklbXVxuICApOiBSZXBsYWNlUmVsYXRlZFJlY29yZHNUZXJtPFJULCBSSSwgUj4ge1xuICAgIHJldHVybiBuZXcgUmVwbGFjZVJlbGF0ZWRSZWNvcmRzVGVybShcbiAgICAgIHRoaXMsXG4gICAgICB0aGlzLiRub3JtYWxpemVSZWNvcmRJZGVudGl0eShyZWNvcmQpLFxuICAgICAgcmVsYXRpb25zaGlwLFxuICAgICAgcmVsYXRlZFJlY29yZHMubWFwKChyaSkgPT4gdGhpcy4kbm9ybWFsaXplUmVjb3JkSWRlbnRpdHkocmkpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFudGlhdGUgYSBuZXcgYHJlcGxhY2VSZWxhdGVkUmVjb3JkYCBvcGVyYXRpb24uXG4gICAqL1xuICByZXBsYWNlUmVsYXRlZFJlY29yZChcbiAgICByZWNvcmQ6IFJJLFxuICAgIHJlbGF0aW9uc2hpcDogc3RyaW5nLFxuICAgIHJlbGF0ZWRSZWNvcmQ6IFJJIHwgbnVsbFxuICApOiBSZXBsYWNlUmVsYXRlZFJlY29yZFRlcm08UlQsIFJJLCBSPiB7XG4gICAgcmV0dXJuIG5ldyBSZXBsYWNlUmVsYXRlZFJlY29yZFRlcm0oXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy4kbm9ybWFsaXplUmVjb3JkSWRlbnRpdHkocmVjb3JkKSxcbiAgICAgIHJlbGF0aW9uc2hpcCxcbiAgICAgIHJlbGF0ZWRSZWNvcmQgPyB0aGlzLiRub3JtYWxpemVSZWNvcmRJZGVudGl0eShyZWxhdGVkUmVjb3JkKSA6IG51bGxcbiAgICApO1xuICB9XG5cbiAgJG5vcm1hbGl6ZVJlY29yZChyOiBSKTogSW5pdGlhbGl6ZWRSZWNvcmQge1xuICAgIGlmICh0aGlzLiRub3JtYWxpemVyKSB7XG4gICAgICByZXR1cm4gdGhpcy4kbm9ybWFsaXplci5ub3JtYWxpemVSZWNvcmQocik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAociBhcyB1bmtub3duKSBhcyBJbml0aWFsaXplZFJlY29yZDtcbiAgICB9XG4gIH1cblxuICAkbm9ybWFsaXplUmVjb3JkSWRlbnRpdHkocmk6IFJJKTogUmVjb3JkSWRlbnRpdHkge1xuICAgIGlmICh0aGlzLiRub3JtYWxpemVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLiRub3JtYWxpemVyLm5vcm1hbGl6ZVJlY29yZElkZW50aXR5KHJpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIChyaSBhcyB1bmtub3duKSBhcyBSZWNvcmRJZGVudGl0eTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==