UNPKG

payload

Version:

Node, React and MongoDB Headless CMS and Application Framework

145 lines (144 loc) • 18.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "validateSearchParam", { enumerable: true, get: function() { return validateSearchParam; } }); const _types = require("../../fields/config/types"); const _getEntityPolicies = require("../../utilities/getEntityPolicies"); const _getLocalizedPaths = require("../getLocalizedPaths"); const _validateQueryPaths = require("./validateQueryPaths"); async function validateSearchParam({ collectionConfig, errors, fields, globalConfig, operator, overrideAccess, path: incomingPath, policies, req, val, versionFields }) { // Replace GraphQL nested field double underscore formatting let sanitizedPath; if (incomingPath === '_id') { sanitizedPath = 'id'; } else { sanitizedPath = incomingPath.replace(/__/g, '.'); } let paths = []; const { slug } = collectionConfig || globalConfig; if (globalConfig && !policies.globals[slug]) { // eslint-disable-next-line no-param-reassign globalConfig.fields = fields; // eslint-disable-next-line no-param-reassign policies.globals[slug] = await (0, _getEntityPolicies.getEntityPolicies)({ entity: globalConfig, operations: [ 'read' ], req, type: 'global' }); } if (sanitizedPath !== 'id') { paths = await (0, _getLocalizedPaths.getLocalizedPaths)({ collectionSlug: collectionConfig?.slug, fields, globalSlug: globalConfig?.slug, incomingPath: sanitizedPath, locale: req.locale, overrideAccess, payload: req.payload }); } const promises = []; promises.push(...paths.map(async ({ collectionSlug, field, invalid, path }, i)=>{ if (invalid) { errors.push({ path }); return; } if (!overrideAccess && (0, _types.fieldAffectsData)(field)) { if (collectionSlug) { if (!policies.collections[collectionSlug]) { // eslint-disable-next-line no-param-reassign policies.collections[collectionSlug] = await (0, _getEntityPolicies.getEntityPolicies)({ entity: req.payload.collections[collectionSlug].config, operations: [ 'read' ], req, type: 'collection' }); } if ([ 'hash', 'salt' ].includes(incomingPath) && collectionConfig.auth && !collectionConfig.auth?.disableLocalStrategy) { errors.push({ path: incomingPath }); } } let fieldPath = path; // remove locale from end of path if (path.endsWith(`.${req.locale}`)) { fieldPath = path.slice(0, -(req.locale.length + 1)); } // remove ".value" from ends of polymorphic relationship paths if (field.type === 'relationship' && Array.isArray(field.relationTo)) { fieldPath = fieldPath.replace('.value', ''); } const entityType = globalConfig ? 'globals' : 'collections'; const entitySlug = collectionSlug || globalConfig.slug; const segments = fieldPath.split('.'); let fieldAccess; if (versionFields) { fieldAccess = policies[entityType][entitySlug]; if (segments[0] === 'parent' || segments[0] === 'version') { segments.shift(); } } else { fieldAccess = policies[entityType][entitySlug].fields; } segments.forEach((segment)=>{ if (fieldAccess[segment]) { if ('fields' in fieldAccess[segment]) { fieldAccess = fieldAccess[segment].fields; } else if ('blocks' in fieldAccess[segment]) { fieldAccess = fieldAccess[segment]; } else { fieldAccess = fieldAccess[segment]; } } }); if (!fieldAccess?.read?.permission) { errors.push({ path: fieldPath }); } } if (i > 1) { // Remove top collection and reverse array // to work backwards from top const pathsToQuery = paths.slice(1).reverse(); pathsToQuery.forEach(({ collectionSlug: pathCollectionSlug, path: subPath }, pathToQueryIndex)=>{ // On the "deepest" collection, // validate query of the relationship if (pathToQueryIndex === 0) { promises.push((0, _validateQueryPaths.validateQueryPaths)({ collectionConfig: req.payload.collections[pathCollectionSlug].config, errors, globalConfig: undefined, overrideAccess, policies, req, where: { [subPath]: { [operator]: val } } })); } }); } })); await Promise.all(promises); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhYmFzZS9xdWVyeVZhbGlkYXRpb24vdmFsaWRhdGVTZWFyY2hQYXJhbXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTYW5pdGl6ZWRDb2xsZWN0aW9uQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29sbGVjdGlvbnMvY29uZmlnL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkUmVxdWVzdCB9IGZyb20gJy4uLy4uL2V4cHJlc3MvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IEZpZWxkIH0gZnJvbSAnLi4vLi4vZmllbGRzL2NvbmZpZy90eXBlcydcbmltcG9ydCB0eXBlIHsgU2FuaXRpemVkR2xvYmFsQ29uZmlnIH0gZnJvbSAnLi4vLi4vZ2xvYmFscy9jb25maWcvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IEVudGl0eVBvbGljaWVzLCBQYXRoVG9RdWVyeSB9IGZyb20gJy4vdHlwZXMnXG5cbmltcG9ydCB7IGZpZWxkQWZmZWN0c0RhdGEgfSBmcm9tICcuLi8uLi9maWVsZHMvY29uZmlnL3R5cGVzJ1xuaW1wb3J0IHsgZ2V0RW50aXR5UG9saWNpZXMgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvZ2V0RW50aXR5UG9saWNpZXMnXG5pbXBvcnQgeyBnZXRMb2NhbGl6ZWRQYXRocyB9IGZyb20gJy4uL2dldExvY2FsaXplZFBhdGhzJ1xuaW1wb3J0IHsgdmFsaWRhdGVRdWVyeVBhdGhzIH0gZnJvbSAnLi92YWxpZGF0ZVF1ZXJ5UGF0aHMnXG5cbnR5cGUgQXJncyA9IHtcbiAgY29sbGVjdGlvbkNvbmZpZz86IFNhbml0aXplZENvbGxlY3Rpb25Db25maWdcbiAgZXJyb3JzOiB7IHBhdGg6IHN0cmluZyB9W11cbiAgZmllbGRzOiBGaWVsZFtdXG4gIGdsb2JhbENvbmZpZz86IFNhbml0aXplZEdsb2JhbENvbmZpZ1xuICBvcGVyYXRvcjogc3RyaW5nXG4gIG92ZXJyaWRlQWNjZXNzOiBib29sZWFuXG4gIHBhdGg6IHN0cmluZ1xuICBwb2xpY2llczogRW50aXR5UG9saWNpZXNcbiAgcmVxOiBQYXlsb2FkUmVxdWVzdFxuICB2YWw6IHVua25vd25cbiAgdmVyc2lvbkZpZWxkcz86IEZpZWxkW11cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGUgUGF5bG9hZCBrZXkgLyB2YWx1ZSAvIG9wZXJhdG9yXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZVNlYXJjaFBhcmFtKHtcbiAgY29sbGVjdGlvbkNvbmZpZyxcbiAgZXJyb3JzLFxuICBmaWVsZHMsXG4gIGdsb2JhbENvbmZpZyxcbiAgb3BlcmF0b3IsXG4gIG92ZXJyaWRlQWNjZXNzLFxuICBwYXRoOiBpbmNvbWluZ1BhdGgsXG4gIHBvbGljaWVzLFxuICByZXEsXG4gIHZhbCxcbiAgdmVyc2lvbkZpZWxkcyxcbn06IEFyZ3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gUmVwbGFjZSBHcmFwaFFMIG5lc3RlZCBmaWVsZCBkb3VibGUgdW5kZXJzY29yZSBmb3JtYXR0aW5nXG4gIGxldCBzYW5pdGl6ZWRQYXRoXG4gIGlmIChpbmNvbWluZ1BhdGggPT09ICdfaWQnKSB7XG4gICAgc2FuaXRpemVkUGF0aCA9ICdpZCdcbiAgfSBlbHNlIHtcbiAgICBzYW5pdGl6ZWRQYXRoID0gaW5jb21pbmdQYXRoLnJlcGxhY2UoL19fL2csICcuJylcbiAgfVxuICBsZXQgcGF0aHM6IFBhdGhUb1F1ZXJ5W10gPSBbXVxuICBjb25zdCB7IHNsdWcgfSA9IGNvbGxlY3Rpb25Db25maWcgfHwgZ2xvYmFsQ29uZmlnXG5cbiAgaWYgKGdsb2JhbENvbmZpZyAmJiAhcG9saWNpZXMuZ2xvYmFsc1tzbHVnXSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIGdsb2JhbENvbmZpZy5maWVsZHMgPSBmaWVsZHNcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIHBvbGljaWVzLmdsb2JhbHNbc2x1Z10gPSBhd2FpdCBnZXRFbnRpdHlQb2xpY2llcyh7XG4gICAgICBlbnRpdHk6IGdsb2JhbENvbmZpZyxcbiAgICAgIG9wZXJhdGlvbnM6IFsncmVhZCddLFxuICAgICAgcmVxLFxuICAgICAgdHlwZTogJ2dsb2JhbCcsXG4gICAgfSlcbiAgfVxuXG4gIGlmIChzYW5pdGl6ZWRQYXRoICE9PSAnaWQnKSB7XG4gICAgcGF0aHMgPSBhd2FpdCBnZXRMb2NhbGl6ZWRQYXRocyh7XG4gICAgICBjb2xsZWN0aW9uU2x1ZzogY29sbGVjdGlvbkNvbmZpZz8uc2x1ZyxcbiAgICAgIGZpZWxkcyxcbiAgICAgIGdsb2JhbFNsdWc6IGdsb2JhbENvbmZpZz8uc2x1ZyxcbiAgICAgIGluY29taW5nUGF0aDogc2FuaXRpemVkUGF0aCxcbiAgICAgIGxvY2FsZTogcmVxLmxvY2FsZSxcbiAgICAgIG92ZXJyaWRlQWNjZXNzLFxuICAgICAgcGF5bG9hZDogcmVxLnBheWxvYWQsXG4gICAgfSlcbiAgfVxuICBjb25zdCBwcm9taXNlcyA9IFtdXG4gIHByb21pc2VzLnB1c2goXG4gICAgLi4ucGF0aHMubWFwKGFzeW5jICh7IGNvbGxlY3Rpb25TbHVnLCBmaWVsZCwgaW52YWxpZCwgcGF0aCB9LCBpKSA9PiB7XG4gICAgICBpZiAoaW52YWxpZCkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IHBhdGggfSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICghb3ZlcnJpZGVBY2Nlc3MgJiYgZmllbGRBZmZlY3RzRGF0YShmaWVsZCkpIHtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb25TbHVnKSB7XG4gICAgICAgICAgaWYgKCFwb2xpY2llcy5jb2xsZWN0aW9uc1tjb2xsZWN0aW9uU2x1Z10pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgcG9saWNpZXMuY29sbGVjdGlvbnNbY29sbGVjdGlvblNsdWddID0gYXdhaXQgZ2V0RW50aXR5UG9saWNpZXMoe1xuICAgICAgICAgICAgICBlbnRpdHk6IHJlcS5wYXlsb2FkLmNvbGxlY3Rpb25zW2NvbGxlY3Rpb25TbHVnXS5jb25maWcsXG4gICAgICAgICAgICAgIG9wZXJhdGlvbnM6IFsncmVhZCddLFxuICAgICAgICAgICAgICByZXEsXG4gICAgICAgICAgICAgIHR5cGU6ICdjb2xsZWN0aW9uJyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgWydoYXNoJywgJ3NhbHQnXS5pbmNsdWRlcyhpbmNvbWluZ1BhdGgpICYmXG4gICAgICAgICAgICBjb2xsZWN0aW9uQ29uZmlnLmF1dGggJiZcbiAgICAgICAgICAgICFjb2xsZWN0aW9uQ29uZmlnLmF1dGg/LmRpc2FibGVMb2NhbFN0cmF0ZWd5XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaCh7IHBhdGg6IGluY29taW5nUGF0aCB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgZmllbGRQYXRoID0gcGF0aFxuICAgICAgICAvLyByZW1vdmUgbG9jYWxlIGZyb20gZW5kIG9mIHBhdGhcbiAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoYC4ke3JlcS5sb2NhbGV9YCkpIHtcbiAgICAgICAgICBmaWVsZFBhdGggPSBwYXRoLnNsaWNlKDAsIC0ocmVxLmxvY2FsZS5sZW5ndGggKyAxKSlcbiAgICAgICAgfVxuICAgICAgICAvLyByZW1vdmUgXCIudmFsdWVcIiBmcm9tIGVuZHMgb2YgcG9seW1vcnBoaWMgcmVsYXRpb25zaGlwIHBhdGhzXG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAncmVsYXRpb25zaGlwJyAmJiBBcnJheS5pc0FycmF5KGZpZWxkLnJlbGF0aW9uVG8pKSB7XG4gICAgICAgICAgZmllbGRQYXRoID0gZmllbGRQYXRoLnJlcGxhY2UoJy52YWx1ZScsICcnKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVudGl0eVR5cGU6ICdjb2xsZWN0aW9ucycgfCAnZ2xvYmFscycgPSBnbG9iYWxDb25maWcgPyAnZ2xvYmFscycgOiAnY29sbGVjdGlvbnMnXG4gICAgICAgIGNvbnN0IGVudGl0eVNsdWcgPSBjb2xsZWN0aW9uU2x1ZyB8fCBnbG9iYWxDb25maWcuc2x1Z1xuICAgICAgICBjb25zdCBzZWdtZW50cyA9IGZpZWxkUGF0aC5zcGxpdCgnLicpXG5cbiAgICAgICAgbGV0IGZpZWxkQWNjZXNzXG4gICAgICAgIGlmICh2ZXJzaW9uRmllbGRzKSB7XG4gICAgICAgICAgZmllbGRBY2Nlc3MgPSBwb2xpY2llc1tlbnRpdHlUeXBlXVtlbnRpdHlTbHVnXVxuICAgICAgICAgIGlmIChzZWdtZW50c1swXSA9PT0gJ3BhcmVudCcgfHwgc2VnbWVudHNbMF0gPT09ICd2ZXJzaW9uJykge1xuICAgICAgICAgICAgc2VnbWVudHMuc2hpZnQoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZEFjY2VzcyA9IHBvbGljaWVzW2VudGl0eVR5cGVdW2VudGl0eVNsdWddLmZpZWxkc1xuICAgICAgICB9XG5cbiAgICAgICAgc2VnbWVudHMuZm9yRWFjaCgoc2VnbWVudCkgPT4ge1xuICAgICAgICAgIGlmIChmaWVsZEFjY2Vzc1tzZWdtZW50XSkge1xuICAgICAgICAgICAgaWYgKCdmaWVsZHMnIGluIGZpZWxkQWNjZXNzW3NlZ21lbnRdKSB7XG4gICAgICAgICAgICAgIGZpZWxkQWNjZXNzID0gZmllbGRBY2Nlc3Nbc2VnbWVudF0uZmllbGRzXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCdibG9ja3MnIGluIGZpZWxkQWNjZXNzW3NlZ21lbnRdKSB7XG4gICAgICAgICAgICAgIGZpZWxkQWNjZXNzID0gZmllbGRBY2Nlc3Nbc2VnbWVudF1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZpZWxkQWNjZXNzID0gZmllbGRBY2Nlc3Nbc2VnbWVudF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKCFmaWVsZEFjY2Vzcz8ucmVhZD8ucGVybWlzc2lvbikge1xuICAgICAgICAgIGVycm9ycy5wdXNoKHsgcGF0aDogZmllbGRQYXRoIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGkgPiAxKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0b3AgY29sbGVjdGlvbiBhbmQgcmV2ZXJzZSBhcnJheVxuICAgICAgICAvLyB0byB3b3JrIGJhY2t3YXJkcyBmcm9tIHRvcFxuICAgICAgICBjb25zdCBwYXRoc1RvUXVlcnkgPSBwYXRocy5zbGljZSgxKS5yZXZlcnNlKClcblxuICAgICAgICBwYXRoc1RvUXVlcnkuZm9yRWFjaChcbiAgICAgICAgICAoeyBjb2xsZWN0aW9uU2x1ZzogcGF0aENvbGxlY3Rpb25TbHVnLCBwYXRoOiBzdWJQYXRoIH0sIHBhdGhUb1F1ZXJ5SW5kZXgpID0+IHtcbiAgICAgICAgICAgIC8vIE9uIHRoZSBcImRlZXBlc3RcIiBjb2xsZWN0aW9uLFxuICAgICAgICAgICAgLy8gdmFsaWRhdGUgcXVlcnkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICAgICAgICAgICAgaWYgKHBhdGhUb1F1ZXJ5SW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZVF1ZXJ5UGF0aHMoe1xuICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbkNvbmZpZzogcmVxLnBheWxvYWQuY29sbGVjdGlvbnNbcGF0aENvbGxlY3Rpb25TbHVnXS5jb25maWcsXG4gICAgICAgICAgICAgICAgICBlcnJvcnMsXG4gICAgICAgICAgICAgICAgICBnbG9iYWxDb25maWc6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIG92ZXJyaWRlQWNjZXNzLFxuICAgICAgICAgICAgICAgICAgcG9saWNpZXMsXG4gICAgICAgICAgICAgICAgICByZXEsXG4gICAgICAgICAgICAgICAgICB3aGVyZToge1xuICAgICAgICAgICAgICAgICAgICBbc3ViUGF0aF06IHtcbiAgICAgICAgICAgICAgICAgICAgICBbb3BlcmF0b3JdOiB2YWwsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0pLFxuICApXG4gIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxufVxuIl0sIm5hbWVzIjpbInZhbGlkYXRlU2VhcmNoUGFyYW0iLCJjb2xsZWN0aW9uQ29uZmlnIiwiZXJyb3JzIiwiZmllbGRzIiwiZ2xvYmFsQ29uZmlnIiwib3BlcmF0b3IiLCJvdmVycmlkZUFjY2VzcyIsInBhdGgiLCJpbmNvbWluZ1BhdGgiLCJwb2xpY2llcyIsInJlcSIsInZhbCIsInZlcnNpb25GaWVsZHMiLCJzYW5pdGl6ZWRQYXRoIiwicmVwbGFjZSIsInBhdGhzIiwic2x1ZyIsImdsb2JhbHMiLCJnZXRFbnRpdHlQb2xpY2llcyIsImVudGl0eSIsIm9wZXJhdGlvbnMiLCJ0eXBlIiwiZ2V0TG9jYWxpemVkUGF0aHMiLCJjb2xsZWN0aW9uU2x1ZyIsImdsb2JhbFNsdWciLCJsb2NhbGUiLCJwYXlsb2FkIiwicHJvbWlzZXMiLCJwdXNoIiwibWFwIiwiZmllbGQiLCJpbnZhbGlkIiwiaSIsImZpZWxkQWZmZWN0c0RhdGEiLCJjb2xsZWN0aW9ucyIsImNvbmZpZyIsImluY2x1ZGVzIiwiYXV0aCIsImRpc2FibGVMb2NhbFN0cmF0ZWd5IiwiZmllbGRQYXRoIiwiZW5kc1dpdGgiLCJzbGljZSIsImxlbmd0aCIsIkFycmF5IiwiaXNBcnJheSIsInJlbGF0aW9uVG8iLCJlbnRpdHlUeXBlIiwiZW50aXR5U2x1ZyIsInNlZ21lbnRzIiwic3BsaXQiLCJmaWVsZEFjY2VzcyIsInNoaWZ0IiwiZm9yRWFjaCIsInNlZ21lbnQiLCJyZWFkIiwicGVybWlzc2lvbiIsInBhdGhzVG9RdWVyeSIsInJldmVyc2UiLCJwYXRoQ29sbGVjdGlvblNsdWciLCJzdWJQYXRoIiwicGF0aFRvUXVlcnlJbmRleCIsInZhbGlkYXRlUXVlcnlQYXRocyIsInVuZGVmaW5lZCIsIndoZXJlIiwiUHJvbWlzZSIsImFsbCJdLCJtYXBwaW5ncyI6Ijs7OzsrQkE0QnNCQTs7O2VBQUFBOzs7dUJBdEJXO21DQUNDO21DQUNBO29DQUNDO0FBbUI1QixlQUFlQSxvQkFBb0IsRUFDeENDLGdCQUFnQixFQUNoQkMsTUFBTSxFQUNOQyxNQUFNLEVBQ05DLFlBQVksRUFDWkMsUUFBUSxFQUNSQyxjQUFjLEVBQ2RDLE1BQU1DLFlBQVksRUFDbEJDLFFBQVEsRUFDUkMsR0FBRyxFQUNIQyxHQUFHLEVBQ0hDLGFBQWEsRUFDUjtJQUNMLDREQUE0RDtJQUM1RCxJQUFJQztJQUNKLElBQUlMLGlCQUFpQixPQUFPO1FBQzFCSyxnQkFBZ0I7SUFDbEIsT0FBTztRQUNMQSxnQkFBZ0JMLGFBQWFNLE9BQU8sQ0FBQyxPQUFPO0lBQzlDO0lBQ0EsSUFBSUMsUUFBdUIsRUFBRTtJQUM3QixNQUFNLEVBQUVDLElBQUksRUFBRSxHQUFHZixvQkFBb0JHO0lBRXJDLElBQUlBLGdCQUFnQixDQUFDSyxTQUFTUSxPQUFPLENBQUNELEtBQUssRUFBRTtRQUMzQyw2Q0FBNkM7UUFDN0NaLGFBQWFELE1BQU0sR0FBR0E7UUFFdEIsNkNBQTZDO1FBQzdDTSxTQUFTUSxPQUFPLENBQUNELEtBQUssR0FBRyxNQUFNRSxJQUFBQSxvQ0FBaUIsRUFBQztZQUMvQ0MsUUFBUWY7WUFDUmdCLFlBQVk7Z0JBQUM7YUFBTztZQUNwQlY7WUFDQVcsTUFBTTtRQUNSO0lBQ0Y7SUFFQSxJQUFJUixrQkFBa0IsTUFBTTtRQUMxQkUsUUFBUSxNQUFNTyxJQUFBQSxvQ0FBaUIsRUFBQztZQUM5QkMsZ0JBQWdCdEIsa0JBQWtCZTtZQUNsQ2I7WUFDQXFCLFlBQVlwQixjQUFjWTtZQUMx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