UNPKG

@data-client/normalizr

Version:

Normalizes and denormalizes JSON according to schema for Redux and Flux applications

121 lines (112 loc) 18.6 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import { getCheckLoop } from './getCheckLoop.js'; import { POJODelegate } from '../delegate/Delegate.js'; import { INVALID } from '../denormalize/symbol.js'; /** Full normalize() logic for POJO state */ export class NormalizeDelegate extends POJODelegate { constructor(state, actionMeta) { super(state); this.newEntities = new Map(); this.newIndexes = new Map(); this.entitiesMeta = state.entitiesMeta; this.meta = actionMeta; this.checkLoop = getCheckLoop(); } getNewEntity(key, pk) { return this.getNewEntities(key).get(pk); } getNewEntities(key) { // first time we come across this type of entity if (!this.newEntities.has(key)) { this.newEntities.set(key, new Map()); // we will be editing these, so we need to clone them first this.entities[key] = _extends({}, this.entities[key]); this.entitiesMeta[key] = _extends({}, this.entitiesMeta[key]); } return this.newEntities.get(key); } getNewIndexes(key) { if (!this.newIndexes.has(key)) { this.newIndexes.set(key, new Map()); this.indexes[key] = _extends({}, this.indexes[key]); } return this.newIndexes.get(key); } /** Updates an entity using merge lifecycles when it has previously been set */ mergeEntity(schema, pk, incomingEntity) { const key = schema.key; // default when this is completely new entity let nextEntity = incomingEntity; let nextMeta = this.meta; // if we already processed this entity during this normalization (in another nested place) let entity = this.getNewEntity(key, pk); if (entity) { nextEntity = schema.merge(entity, incomingEntity); } else { // if we find it in the store entity = this.getEntity(key, pk); if (entity) { const meta = this.getMeta(key, pk); nextEntity = schema.mergeWithStore(meta, nextMeta, entity, incomingEntity); nextMeta = schema.mergeMetaWithStore(meta, nextMeta, entity, incomingEntity); } } // once we have computed the merged values, set them this.setEntity(schema, pk, nextEntity, nextMeta); } /** Sets an entity overwriting any previously set values */ setEntity(schema, pk, entity, meta = this.meta) { const key = schema.key; const newEntities = this.getNewEntities(key); const updateMeta = !newEntities.has(pk); newEntities.set(pk, entity); // update index if (schema.indexes) { handleIndexes(pk, schema.indexes, this.getNewIndexes(key), this.indexes[key], entity, this.entities[key]); } // set this after index updates so we know what indexes to remove from this._setEntity(key, pk, entity); if (updateMeta) this._setMeta(key, pk, meta); } /** Invalidates an entity, potentially triggering suspense */ invalidate({ key }, pk) { // set directly: any queued updates are meaningless with delete this.setEntity({ key }, pk, INVALID); } _setEntity(key, pk, entity) { this.entities[key][pk] = entity; } _setMeta(key, pk, meta) { this.entitiesMeta[key][pk] = meta; } getMeta(key, pk) { return this.entitiesMeta[key][pk]; } } function handleIndexes(id, schemaIndexes, indexes, storeIndexes, entity, storeEntities) { for (const index of schemaIndexes) { if (!indexes.has(index)) { indexes.set(index, storeIndexes[index] = {}); } const indexMap = indexes.get(index); if (storeEntities[id]) { delete indexMap[storeEntities[id][index]]; } // entity already in cache but the index changed if (storeEntities && storeEntities[id] && storeEntities[id][index] !== entity[index]) { indexMap[storeEntities[id][index]] = INVALID; } if (index in entity) { indexMap[entity[index]] = id; } /* istanbul ignore next */else if (process.env.NODE_ENV !== 'production') { console.warn(`Index not found in entity. Indexes must be top-level members of your entity. Index: ${index} Entity: ${JSON.stringify(entity, undefined, 2)}`); } } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRDaGVja0xvb3AiLCJQT0pPRGVsZWdhdGUiLCJJTlZBTElEIiwiTm9ybWFsaXplRGVsZWdhdGUiLCJjb25zdHJ1Y3RvciIsInN0YXRlIiwiYWN0aW9uTWV0YSIsIm5ld0VudGl0aWVzIiwiTWFwIiwibmV3SW5kZXhlcyIsImVudGl0aWVzTWV0YSIsIm1ldGEiLCJjaGVja0xvb3AiLCJnZXROZXdFbnRpdHkiLCJrZXkiLCJwayIsImdldE5ld0VudGl0aWVzIiwiZ2V0IiwiaGFzIiwic2V0IiwiZW50aXRpZXMiLCJfZXh0ZW5kcyIsImdldE5ld0luZGV4ZXMiLCJpbmRleGVzIiwibWVyZ2VFbnRpdHkiLCJzY2hlbWEiLCJpbmNvbWluZ0VudGl0eSIsIm5leHRFbnRpdHkiLCJuZXh0TWV0YSIsImVudGl0eSIsIm1lcmdlIiwiZ2V0RW50aXR5IiwiZ2V0TWV0YSIsIm1lcmdlV2l0aFN0b3JlIiwibWVyZ2VNZXRhV2l0aFN0b3JlIiwic2V0RW50aXR5IiwidXBkYXRlTWV0YSIsImhhbmRsZUluZGV4ZXMiLCJfc2V0RW50aXR5IiwiX3NldE1ldGEiLCJpbnZhbGlkYXRlIiwiaWQiLCJzY2hlbWFJbmRleGVzIiwic3RvcmVJbmRleGVzIiwic3RvcmVFbnRpdGllcyIsImluZGV4IiwiaW5kZXhNYXAiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJjb25zb2xlIiwid2FybiIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bmRlZmluZWQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbm9ybWFsaXplL05vcm1hbGl6ZURlbGVnYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudGl0eVRhYmxlLFxuICBOb3JtYWxpemVkSW5kZXgsXG4gIElOb3JtYWxpemVEZWxlZ2F0ZSxcbiAgTWVyZ2VhYmxlLFxufSBmcm9tICcuLi9pbnRlcmZhY2UuanMnO1xuaW1wb3J0IHsgZ2V0Q2hlY2tMb29wIH0gZnJvbSAnLi9nZXRDaGVja0xvb3AuanMnO1xuaW1wb3J0IHsgUE9KT0RlbGVnYXRlIH0gZnJvbSAnLi4vZGVsZWdhdGUvRGVsZWdhdGUuanMnO1xuaW1wb3J0IHsgSU5WQUxJRCB9IGZyb20gJy4uL2Rlbm9ybWFsaXplL3N5bWJvbC5qcyc7XG5cbi8qKiBGdWxsIG5vcm1hbGl6ZSgpIGxvZ2ljIGZvciBQT0pPIHN0YXRlICovXG5leHBvcnQgY2xhc3MgTm9ybWFsaXplRGVsZWdhdGVcbiAgZXh0ZW5kcyBQT0pPRGVsZWdhdGVcbiAgaW1wbGVtZW50cyBJTm9ybWFsaXplRGVsZWdhdGVcbntcbiAgZGVjbGFyZSByZWFkb25seSBlbnRpdGllc01ldGE6IHtcbiAgICBbZW50aXR5S2V5OiBzdHJpbmddOiB7XG4gICAgICBbcGs6IHN0cmluZ106IHtcbiAgICAgICAgZGF0ZTogbnVtYmVyO1xuICAgICAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgICAgICAgZmV0Y2hlZEF0OiBudW1iZXI7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG5cbiAgZGVjbGFyZSByZWFkb25seSBtZXRhOiB7IGZldGNoZWRBdDogbnVtYmVyOyBkYXRlOiBudW1iZXI7IGV4cGlyZXNBdDogbnVtYmVyIH07XG4gIGRlY2xhcmUgY2hlY2tMb29wOiAoZW50aXR5S2V5OiBzdHJpbmcsIHBrOiBzdHJpbmcsIGlucHV0OiBvYmplY3QpID0+IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIG5ld0VudGl0aWVzID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIGFueT4+KCk7XG4gIHByb3RlY3RlZCBuZXdJbmRleGVzID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIGFueT4+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc3RhdGU6IHtcbiAgICAgIGVudGl0aWVzOiBFbnRpdHlUYWJsZTtcbiAgICAgIGluZGV4ZXM6IE5vcm1hbGl6ZWRJbmRleDtcbiAgICAgIGVudGl0aWVzTWV0YToge1xuICAgICAgICBbZW50aXR5S2V5OiBzdHJpbmddOiB7XG4gICAgICAgICAgW3BrOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBkYXRlOiBudW1iZXI7XG4gICAgICAgICAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgICAgICAgICAgIGZldGNoZWRBdDogbnVtYmVyO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH0sXG4gICAgYWN0aW9uTWV0YTogeyBmZXRjaGVkQXQ6IG51bWJlcjsgZGF0ZTogbnVtYmVyOyBleHBpcmVzQXQ6IG51bWJlciB9LFxuICApIHtcbiAgICBzdXBlcihzdGF0ZSk7XG4gICAgdGhpcy5lbnRpdGllc01ldGEgPSBzdGF0ZS5lbnRpdGllc01ldGE7XG4gICAgdGhpcy5tZXRhID0gYWN0aW9uTWV0YTtcbiAgICB0aGlzLmNoZWNrTG9vcCA9IGdldENoZWNrTG9vcCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldE5ld0VudGl0eShrZXk6IHN0cmluZywgcGs6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmdldE5ld0VudGl0aWVzKGtleSkuZ2V0KHBrKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXROZXdFbnRpdGllcyhrZXk6IHN0cmluZyk6IE1hcDxzdHJpbmcsIGFueT4ge1xuICAgIC8vIGZpcnN0IHRpbWUgd2UgY29tZSBhY3Jvc3MgdGhpcyB0eXBlIG9mIGVudGl0eVxuICAgIGlmICghdGhpcy5uZXdFbnRpdGllcy5oYXMoa2V5KSkge1xuICAgICAgdGhpcy5uZXdFbnRpdGllcy5zZXQoa2V5LCBuZXcgTWFwKCkpO1xuICAgICAgLy8gd2Ugd2lsbCBiZSBlZGl0aW5nIHRoZXNlLCBzbyB3ZSBuZWVkIHRvIGNsb25lIHRoZW0gZmlyc3RcbiAgICAgIHRoaXMuZW50aXRpZXNba2V5XSA9IHtcbiAgICAgICAgLi4udGhpcy5lbnRpdGllc1trZXldLFxuICAgICAgfTtcbiAgICAgIHRoaXMuZW50aXRpZXNNZXRhW2tleV0gPSB7XG4gICAgICAgIC4uLnRoaXMuZW50aXRpZXNNZXRhW2tleV0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm5ld0VudGl0aWVzLmdldChrZXkpIGFzIE1hcDxzdHJpbmcsIGFueT47XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TmV3SW5kZXhlcyhrZXk6IHN0cmluZyk6IE1hcDxzdHJpbmcsIGFueT4ge1xuICAgIGlmICghdGhpcy5uZXdJbmRleGVzLmhhcyhrZXkpKSB7XG4gICAgICB0aGlzLm5ld0luZGV4ZXMuc2V0KGtleSwgbmV3IE1hcCgpKTtcbiAgICAgIHRoaXMuaW5kZXhlc1trZXldID0geyAuLi50aGlzLmluZGV4ZXNba2V5XSB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5uZXdJbmRleGVzLmdldChrZXkpIGFzIE1hcDxzdHJpbmcsIGFueT47XG4gIH1cblxuICAvKiogVXBkYXRlcyBhbiBlbnRpdHkgdXNpbmcgbWVyZ2UgbGlmZWN5Y2xlcyB3aGVuIGl0IGhhcyBwcmV2aW91c2x5IGJlZW4gc2V0ICovXG4gIG1lcmdlRW50aXR5KFxuICAgIHNjaGVtYTogTWVyZ2VhYmxlICYgeyBpbmRleGVzPzogYW55IH0sXG4gICAgcGs6IHN0cmluZyxcbiAgICBpbmNvbWluZ0VudGl0eTogYW55LFxuICApIHtcbiAgICBjb25zdCBrZXkgPSBzY2hlbWEua2V5O1xuXG4gICAgLy8gZGVmYXVsdCB3aGVuIHRoaXMgaXMgY29tcGxldGVseSBuZXcgZW50aXR5XG4gICAgbGV0IG5leHRFbnRpdHkgPSBpbmNvbWluZ0VudGl0eTtcbiAgICBsZXQgbmV4dE1ldGEgPSB0aGlzLm1ldGE7XG5cbiAgICAvLyBpZiB3ZSBhbHJlYWR5IHByb2Nlc3NlZCB0aGlzIGVudGl0eSBkdXJpbmcgdGhpcyBub3JtYWxpemF0aW9uIChpbiBhbm90aGVyIG5lc3RlZCBwbGFjZSlcbiAgICBsZXQgZW50aXR5ID0gdGhpcy5nZXROZXdFbnRpdHkoa2V5LCBwayk7XG4gICAgaWYgKGVudGl0eSkge1xuICAgICAgbmV4dEVudGl0eSA9IHNjaGVtYS5tZXJnZShlbnRpdHksIGluY29taW5nRW50aXR5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgd2UgZmluZCBpdCBpbiB0aGUgc3RvcmVcbiAgICAgIGVudGl0eSA9IHRoaXMuZ2V0RW50aXR5KGtleSwgcGspO1xuICAgICAgaWYgKGVudGl0eSkge1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRNZXRhKGtleSwgcGspO1xuICAgICAgICBuZXh0RW50aXR5ID0gc2NoZW1hLm1lcmdlV2l0aFN0b3JlKFxuICAgICAgICAgIG1ldGEsXG4gICAgICAgICAgbmV4dE1ldGEsXG4gICAgICAgICAgZW50aXR5LFxuICAgICAgICAgIGluY29taW5nRW50aXR5LFxuICAgICAgICApO1xuICAgICAgICBuZXh0TWV0YSA9IHNjaGVtYS5tZXJnZU1ldGFXaXRoU3RvcmUoXG4gICAgICAgICAgbWV0YSxcbiAgICAgICAgICBuZXh0TWV0YSxcbiAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgaW5jb21pbmdFbnRpdHksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gb25jZSB3ZSBoYXZlIGNvbXB1dGVkIHRoZSBtZXJnZWQgdmFsdWVzLCBzZXQgdGhlbVxuICAgIHRoaXMuc2V0RW50aXR5KHNjaGVtYSwgcGssIG5leHRFbnRpdHksIG5leHRNZXRhKTtcbiAgfVxuXG4gIC8qKiBTZXRzIGFuIGVudGl0eSBvdmVyd3JpdGluZyBhbnkgcHJldmlvdXNseSBzZXQgdmFsdWVzICovXG4gIHNldEVudGl0eShcbiAgICBzY2hlbWE6IHsga2V5OiBzdHJpbmc7IGluZGV4ZXM/OiBhbnkgfSxcbiAgICBwazogc3RyaW5nLFxuICAgIGVudGl0eTogYW55LFxuICAgIG1ldGE6IHsgZmV0Y2hlZEF0OiBudW1iZXI7IGRhdGU6IG51bWJlcjsgZXhwaXJlc0F0OiBudW1iZXIgfSA9IHRoaXMubWV0YSxcbiAgKSB7XG4gICAgY29uc3Qga2V5ID0gc2NoZW1hLmtleTtcbiAgICBjb25zdCBuZXdFbnRpdGllcyA9IHRoaXMuZ2V0TmV3RW50aXRpZXMoa2V5KTtcbiAgICBjb25zdCB1cGRhdGVNZXRhID0gIW5ld0VudGl0aWVzLmhhcyhwayk7XG4gICAgbmV3RW50aXRpZXMuc2V0KHBrLCBlbnRpdHkpO1xuXG4gICAgLy8gdXBkYXRlIGluZGV4XG4gICAgaWYgKHNjaGVtYS5pbmRleGVzKSB7XG4gICAgICBoYW5kbGVJbmRleGVzKFxuICAgICAgICBwayxcbiAgICAgICAgc2NoZW1hLmluZGV4ZXMsXG4gICAgICAgIHRoaXMuZ2V0TmV3SW5kZXhlcyhrZXkpLFxuICAgICAgICB0aGlzLmluZGV4ZXNba2V5XSxcbiAgICAgICAgZW50aXR5LFxuICAgICAgICB0aGlzLmVudGl0aWVzW2tleV0gYXMgYW55LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBzZXQgdGhpcyBhZnRlciBpbmRleCB1cGRhdGVzIHNvIHdlIGtub3cgd2hhdCBpbmRleGVzIHRvIHJlbW92ZSBmcm9tXG4gICAgdGhpcy5fc2V0RW50aXR5KGtleSwgcGssIGVudGl0eSk7XG5cbiAgICBpZiAodXBkYXRlTWV0YSkgdGhpcy5fc2V0TWV0YShrZXksIHBrLCBtZXRhKTtcbiAgfVxuXG4gIC8qKiBJbnZhbGlkYXRlcyBhbiBlbnRpdHksIHBvdGVudGlhbGx5IHRyaWdnZXJpbmcgc3VzcGVuc2UgKi9cbiAgaW52YWxpZGF0ZSh7IGtleSB9OiB7IGtleTogc3RyaW5nIH0sIHBrOiBzdHJpbmcpIHtcbiAgICAvLyBzZXQgZGlyZWN0bHk6IGFueSBxdWV1ZWQgdXBkYXRlcyBhcmUgbWVhbmluZ2xlc3Mgd2l0aCBkZWxldGVcbiAgICB0aGlzLnNldEVudGl0eSh7IGtleSB9LCBwaywgSU5WQUxJRCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3NldEVudGl0eShrZXk6IHN0cmluZywgcGs6IHN0cmluZywgZW50aXR5OiBhbnkpIHtcbiAgICAodGhpcy5lbnRpdGllc1trZXldIGFzIGFueSlbcGtdID0gZW50aXR5O1xuICB9XG5cbiAgcHJvdGVjdGVkIF9zZXRNZXRhKFxuICAgIGtleTogc3RyaW5nLFxuICAgIHBrOiBzdHJpbmcsXG4gICAgbWV0YTogeyBmZXRjaGVkQXQ6IG51bWJlcjsgZGF0ZTogbnVtYmVyOyBleHBpcmVzQXQ6IG51bWJlciB9LFxuICApIHtcbiAgICB0aGlzLmVudGl0aWVzTWV0YVtrZXldW3BrXSA9IG1ldGE7XG4gIH1cblxuICBnZXRNZXRhKGtleTogc3RyaW5nLCBwazogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZW50aXRpZXNNZXRhW2tleV1bcGtdO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUluZGV4ZXMoXG4gIGlkOiBzdHJpbmcsXG4gIHNjaGVtYUluZGV4ZXM6IHN0cmluZ1tdLFxuICBpbmRleGVzOiBNYXA8c3RyaW5nLCBhbnk+LFxuICBzdG9yZUluZGV4ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGVudGl0eTogYW55LFxuICBzdG9yZUVudGl0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuKSB7XG4gIGZvciAoY29uc3QgaW5kZXggb2Ygc2NoZW1hSW5kZXhlcykge1xuICAgIGlmICghaW5kZXhlcy5oYXMoaW5kZXgpKSB7XG4gICAgICBpbmRleGVzLnNldChpbmRleCwgKHN0b3JlSW5kZXhlc1tpbmRleF0gPSB7fSkpO1xuICAgIH1cbiAgICBjb25zdCBpbmRleE1hcCA9IGluZGV4ZXMuZ2V0KGluZGV4KTtcbiAgICBpZiAoc3RvcmVFbnRpdGllc1tpZF0pIHtcbiAgICAgIGRlbGV0ZSBpbmRleE1hcFtzdG9yZUVudGl0aWVzW2lkXVtpbmRleF1dO1xuICAgIH1cbiAgICAvLyBlbnRpdHkgYWxyZWFkeSBpbiBjYWNoZSBidXQgdGhlIGluZGV4IGNoYW5nZWRcbiAgICBpZiAoXG4gICAgICBzdG9yZUVudGl0aWVzICYmXG4gICAgICBzdG9yZUVudGl0aWVzW2lkXSAmJlxuICAgICAgc3RvcmVFbnRpdGllc1tpZF1baW5kZXhdICE9PSBlbnRpdHlbaW5kZXhdXG4gICAgKSB7XG4gICAgICBpbmRleE1hcFtzdG9yZUVudGl0aWVzW2lkXVtpbmRleF1dID0gSU5WQUxJRDtcbiAgICB9XG4gICAgaWYgKGluZGV4IGluIGVudGl0eSkge1xuICAgICAgaW5kZXhNYXBbZW50aXR5W2luZGV4XV0gPSBpZDtcbiAgICB9IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIGVsc2UgaWYgKFxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJ1xuICAgICkge1xuICAgICAgY29uc29sZS53YXJuKGBJbmRleCBub3QgZm91bmQgaW4gZW50aXR5LiBJbmRleGVzIG11c3QgYmUgdG9wLWxldmVsIG1lbWJlcnMgb2YgeW91ciBlbnRpdHkuXG5JbmRleDogJHtpbmRleH1cbkVudGl0eTogJHtKU09OLnN0cmluZ2lmeShlbnRpdHksIHVuZGVmaW5lZCwgMil9YCk7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7QUFNQSxTQUFTQSxZQUFZLFFBQVEsbUJBQW1CO0FBQ2hELFNBQVNDLFlBQVksUUFBUSx5QkFBeUI7QUFDdEQsU0FBU0MsT0FBTyxRQUFRLDBCQUEwQjs7QUFFbEQ7QUFDQSxPQUFPLE1BQU1DLGlCQUFpQixTQUNwQkYsWUFBWSxDQUV0QjtFQWlCRUcsV0FBV0EsQ0FDVEMsS0FZQyxFQUNEQyxVQUFrRSxFQUNsRTtJQUNBLEtBQUssQ0FBQ0QsS0FBSyxDQUFDO0lBQUMsS0FuQkxFLFdBQVcsR0FBRyxJQUFJQyxHQUFHLENBQTJCLENBQUM7SUFBQSxLQUNqREMsVUFBVSxHQUFHLElBQUlELEdBQUcsQ0FBMkIsQ0FBQztJQW1CeEQsSUFBSSxDQUFDRSxZQUFZLEdBQUdMLEtBQUssQ0FBQ0ssWUFBWTtJQUN0QyxJQUFJLENBQUNDLElBQUksR0FBR0wsVUFBVTtJQUN0QixJQUFJLENBQUNNLFNBQVMsR0FBR1osWUFBWSxDQUFDLENBQUM7RUFDakM7RUFFVWEsWUFBWUEsQ0FBQ0MsR0FBVyxFQUFFQyxFQUFVLEVBQUU7SUFDOUMsT0FBTyxJQUFJLENBQUNDLGNBQWMsQ0FBQ0YsR0FBRyxDQUFDLENBQUNHLEdBQUcsQ0FBQ0YsRUFBRSxDQUFDO0VBQ3pD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