payload
Version:
Node, React and MongoDB Headless CMS and Application Framework
287 lines (286 loc) • 34.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "default", {
enumerable: true,
get: function() {
return _default;
}
});
const _crypto = /*#__PURE__*/ _interop_require_default(require("crypto"));
const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
const _util = require("util");
const _executeAccess = /*#__PURE__*/ _interop_require_default(require("../../auth/executeAccess"));
const _sendVerificationEmail = /*#__PURE__*/ _interop_require_default(require("../../auth/sendVerificationEmail"));
const _register = require("../../auth/strategies/local/register");
const _afterChange = require("../../fields/hooks/afterChange");
const _afterRead = require("../../fields/hooks/afterRead");
const _beforeChange = require("../../fields/hooks/beforeChange");
const _beforeValidate = require("../../fields/hooks/beforeValidate");
const _generateFileData = require("../../uploads/generateFileData");
const _unlinkTempFiles = require("../../uploads/unlinkTempFiles");
const _uploadFiles = require("../../uploads/uploadFiles");
const _commitTransaction = require("../../utilities/commitTransaction");
const _flattenTopLevelFields = /*#__PURE__*/ _interop_require_default(require("../../utilities/flattenTopLevelFields"));
const _initTransaction = require("../../utilities/initTransaction");
const _killTransaction = require("../../utilities/killTransaction");
const _sanitizeInternalFields = /*#__PURE__*/ _interop_require_default(require("../../utilities/sanitizeInternalFields"));
const _saveVersion = require("../../versions/saveVersion");
const _utils = require("./utils");
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const unlinkFile = (0, _util.promisify)(_fs.default.unlink);
async function create(incomingArgs) {
let args = incomingArgs;
try {
const shouldCommit = await (0, _initTransaction.initTransaction)(args.req);
// /////////////////////////////////////
// beforeOperation - Collection
// /////////////////////////////////////
await args.collection.config.hooks.beforeOperation.reduce(async (priorHook, hook)=>{
await priorHook;
args = await hook({
args,
collection: args.collection.config,
context: args.req.context,
operation: 'create',
req: args.req
}) || args;
}, Promise.resolve());
const { autosave = false, collection: { config: collectionConfig }, collection, depth, disableVerificationEmail, draft = false, overrideAccess, overwriteExistingFiles = false, req: { fallbackLocale, locale, payload, payload: { config, emailOptions } }, req, showHiddenFields } = args;
let { data } = args;
const shouldSaveDraft = Boolean(draft && collectionConfig.versions.drafts);
// /////////////////////////////////////
// Access
// /////////////////////////////////////
if (!overrideAccess) {
await (0, _executeAccess.default)({
data,
req
}, collectionConfig.access.create);
}
// /////////////////////////////////////
// Custom id
// /////////////////////////////////////
// @todo: Refactor code to store 'customId' on the collection configuration itself so we don't need to repeat flattenFields
const hasIdField = (0, _flattenTopLevelFields.default)(collectionConfig.fields).findIndex((field)=>field.name === 'id') > -1;
if (hasIdField) {
data = {
_id: data.id,
...data
};
}
// /////////////////////////////////////
// Generate data for all files and sizes
// /////////////////////////////////////
const { data: newFileData, files: filesToUpload } = await (0, _generateFileData.generateFileData)({
collection,
config,
data,
overwriteExistingFiles,
req,
throwOnMissingFile: !shouldSaveDraft && collection.config.upload.filesRequiredOnCreate !== false
});
data = newFileData;
// /////////////////////////////////////
// beforeValidate - Fields
// /////////////////////////////////////
data = await (0, _beforeValidate.beforeValidate)({
collection: collectionConfig,
context: req.context,
data,
doc: {},
global: null,
operation: 'create',
overrideAccess,
req
});
// /////////////////////////////////////
// beforeValidate - Collections
// /////////////////////////////////////
await collectionConfig.hooks.beforeValidate.reduce(async (priorHook, hook)=>{
await priorHook;
data = await hook({
collection: collectionConfig,
context: req.context,
data,
operation: 'create',
req
}) || data;
}, Promise.resolve());
// /////////////////////////////////////
// beforeChange - Collection
// /////////////////////////////////////
await collectionConfig.hooks.beforeChange.reduce(async (priorHook, hook)=>{
await priorHook;
data = await hook({
collection: collectionConfig,
context: req.context,
data,
operation: 'create',
req
}) || data;
}, Promise.resolve());
// /////////////////////////////////////
// beforeChange - Fields
// /////////////////////////////////////
const resultWithLocales = await (0, _beforeChange.beforeChange)({
collection: collectionConfig,
context: req.context,
data,
doc: {},
docWithLocales: {},
global: null,
operation: 'create',
req,
skipValidation: shouldSaveDraft
});
// /////////////////////////////////////
// Write files to local storage
// /////////////////////////////////////
if (!collectionConfig.upload.disableLocalStorage) {
await (0, _uploadFiles.uploadFiles)(payload, filesToUpload, req.t);
}
// /////////////////////////////////////
// Create
// /////////////////////////////////////
let doc;
if (collectionConfig.auth && !collectionConfig.auth.disableLocalStrategy) {
if (data.email) {
resultWithLocales.email = data.email.toLowerCase();
}
if (collectionConfig.auth.verify) {
resultWithLocales._verified = Boolean(resultWithLocales._verified) || false;
resultWithLocales._verificationToken = _crypto.default.randomBytes(20).toString('hex');
}
doc = await (0, _register.registerLocalStrategy)({
collection: collectionConfig,
doc: resultWithLocales,
password: data.password,
payload: req.payload,
req
});
} else {
doc = await payload.db.create({
collection: collectionConfig.slug,
data: resultWithLocales,
req
});
}
const verificationToken = doc._verificationToken;
let result = (0, _sanitizeInternalFields.default)(doc);
// /////////////////////////////////////
// Create version
// /////////////////////////////////////
if (collectionConfig.versions) {
await (0, _saveVersion.saveVersion)({
id: result.id,
autosave,
collection: collectionConfig,
docWithLocales: result,
payload,
req
});
}
// /////////////////////////////////////
// Send verification email if applicable
// /////////////////////////////////////
if (collectionConfig.auth && collectionConfig.auth.verify) {
// eslint-disable-next-line @typescript-eslint/no-floating-promises
(0, _sendVerificationEmail.default)({
collection: {
config: collectionConfig
},
config: payload.config,
disableEmail: disableVerificationEmail,
emailOptions,
req,
sendEmail: payload.sendEmail,
token: verificationToken,
user: result
});
}
// /////////////////////////////////////
// afterRead - Fields
// /////////////////////////////////////
result = await (0, _afterRead.afterRead)({
collection: collectionConfig,
context: req.context,
depth,
doc: result,
fallbackLocale,
global: null,
locale,
overrideAccess,
req,
showHiddenFields
});
// /////////////////////////////////////
// afterRead - Collection
// /////////////////////////////////////
await collectionConfig.hooks.afterRead.reduce(async (priorHook, hook)=>{
await priorHook;
result = await hook({
collection: collectionConfig,
context: req.context,
doc: result,
req
}) || result;
}, Promise.resolve());
// /////////////////////////////////////
// afterChange - Fields
// /////////////////////////////////////
result = await (0, _afterChange.afterChange)({
collection: collectionConfig,
context: req.context,
data,
doc: result,
global: null,
operation: 'create',
previousDoc: {},
req
});
// /////////////////////////////////////
// afterChange - Collection
// /////////////////////////////////////
await collectionConfig.hooks.afterChange.reduce(async (priorHook, hook)=>{
await priorHook;
result = await hook({
collection: collectionConfig,
context: req.context,
doc: result,
operation: 'create',
previousDoc: {},
req: args.req
}) || result;
}, Promise.resolve());
// /////////////////////////////////////
// afterOperation - Collection
// /////////////////////////////////////
result = await (0, _utils.buildAfterOperation)({
args,
collection: collectionConfig,
operation: 'create',
result
});
await (0, _unlinkTempFiles.unlinkTempFiles)({
collectionConfig,
config,
req
});
// /////////////////////////////////////
// Return results
// /////////////////////////////////////
if (shouldCommit) await (0, _commitTransaction.commitTransaction)(req);
return result;
} catch (error) {
await (0, _killTransaction.killTransaction)(args.req);
throw error;
}
}
const _default = create;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb2xsZWN0aW9ucy9vcGVyYXRpb25zL2NyZWF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE1hcmtPcHRpb25hbCB9IGZyb20gJ3RzLWVzc2VudGlhbHMnXG5cbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJ1xuaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAndXRpbCdcblxuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZWRUeXBlcyB9IGZyb20gJy4uLy4uLydcbmltcG9ydCB0eXBlIHsgUGF5bG9hZFJlcXVlc3QgfSBmcm9tICcuLi8uLi9leHByZXNzL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBEb2N1bWVudCB9IGZyb20gJy4uLy4uL3R5cGVzJ1xuaW1wb3J0IHR5cGUge1xuICBBZnRlckNoYW5nZUhvb2ssXG4gIEJlZm9yZU9wZXJhdGlvbkhvb2ssXG4gIEJlZm9yZVZhbGlkYXRlSG9vayxcbiAgQ29sbGVjdGlvbixcbn0gZnJvbSAnLi4vY29uZmlnL3R5cGVzJ1xuXG5pbXBvcnQgZXhlY3V0ZUFjY2VzcyBmcm9tICcuLi8uLi9hdXRoL2V4ZWN1dGVBY2Nlc3MnXG5pbXBvcnQgc2VuZFZlcmlmaWNhdGlvbkVtYWlsIGZyb20gJy4uLy4uL2F1dGgvc2VuZFZlcmlmaWNhdGlvbkVtYWlsJ1xuaW1wb3J0IHsgcmVnaXN0ZXJMb2NhbFN0cmF0ZWd5IH0gZnJvbSAnLi4vLi4vYXV0aC9zdHJhdGVnaWVzL2xvY2FsL3JlZ2lzdGVyJ1xuaW1wb3J0IHsgYWZ0ZXJDaGFuZ2UgfSBmcm9tICcuLi8uLi9maWVsZHMvaG9va3MvYWZ0ZXJDaGFuZ2UnXG5pbXBvcnQgeyBhZnRlclJlYWQgfSBmcm9tICcuLi8uLi9maWVsZHMvaG9va3MvYWZ0ZXJSZWFkJ1xuaW1wb3J0IHsgYmVmb3JlQ2hhbmdlIH0gZnJvbSAnLi4vLi4vZmllbGRzL2hvb2tzL2JlZm9yZUNoYW5nZSdcbmltcG9ydCB7IGJlZm9yZVZhbGlkYXRlIH0gZnJvbSAnLi4vLi4vZmllbGRzL2hvb2tzL2JlZm9yZVZhbGlkYXRlJ1xuaW1wb3J0IHsgZ2VuZXJhdGVGaWxlRGF0YSB9IGZyb20gJy4uLy4uL3VwbG9hZHMvZ2VuZXJhdGVGaWxlRGF0YSdcbmltcG9ydCB7IHVubGlua1RlbXBGaWxlcyB9IGZyb20gJy4uLy4uL3VwbG9hZHMvdW5saW5rVGVtcEZpbGVzJ1xuaW1wb3J0IHsgdXBsb2FkRmlsZXMgfSBmcm9tICcuLi8uLi91cGxvYWRzL3VwbG9hZEZpbGVzJ1xuaW1wb3J0IHsgY29tbWl0VHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvY29tbWl0VHJhbnNhY3Rpb24nXG5pbXBvcnQgZmxhdHRlbkZpZWxkcyBmcm9tICcuLi8uLi91dGlsaXRpZXMvZmxhdHRlblRvcExldmVsRmllbGRzJ1xuaW1wb3J0IHsgaW5pdFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL2luaXRUcmFuc2FjdGlvbidcbmltcG9ydCB7IGtpbGxUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9raWxsVHJhbnNhY3Rpb24nXG5pbXBvcnQgc2FuaXRpemVJbnRlcm5hbEZpZWxkcyBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2FuaXRpemVJbnRlcm5hbEZpZWxkcydcbmltcG9ydCB7IHNhdmVWZXJzaW9uIH0gZnJvbSAnLi4vLi4vdmVyc2lvbnMvc2F2ZVZlcnNpb24nXG5pbXBvcnQgeyBidWlsZEFmdGVyT3BlcmF0aW9uIH0gZnJvbSAnLi91dGlscydcblxuY29uc3QgdW5saW5rRmlsZSA9IHByb21pc2lmeShmcy51bmxpbmspXG5cbmV4cG9ydCB0eXBlIENyZWF0ZVVwZGF0ZVR5cGUgPSB7IFtmaWVsZDogbnVtYmVyIHwgc3RyaW5nIHwgc3ltYm9sXTogdW5rbm93biB9XG5cbmV4cG9ydCB0eXBlIEFyZ3VtZW50czxUIGV4dGVuZHMgQ3JlYXRlVXBkYXRlVHlwZT4gPSB7XG4gIGF1dG9zYXZlPzogYm9vbGVhblxuICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uXG4gIGRhdGE6IE1hcmtPcHRpb25hbDxULCAnY3JlYXRlZEF0JyB8ICdpZCcgfCAnc2l6ZXMnIHwgJ3VwZGF0ZWRBdCc+XG4gIGRlcHRoPzogbnVtYmVyXG4gIGRpc2FibGVWZXJpZmljYXRpb25FbWFpbD86IGJvb2xlYW5cbiAgZHJhZnQ/OiBib29sZWFuXG4gIG92ZXJyaWRlQWNjZXNzPzogYm9vbGVhblxuICBvdmVyd3JpdGVFeGlzdGluZ0ZpbGVzPzogYm9vbGVhblxuICByZXE6IFBheWxvYWRSZXF1ZXN0XG4gIHNob3dIaWRkZW5GaWVsZHM/OiBib29sZWFuXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZTxUU2x1ZyBleHRlbmRzIGtleW9mIEdlbmVyYXRlZFR5cGVzWydjb2xsZWN0aW9ucyddPihcbiAgaW5jb21pbmdBcmdzOiBBcmd1bWVudHM8R2VuZXJhdGVkVHlwZXNbJ2NvbGxlY3Rpb25zJ11bVFNsdWddPixcbik6IFByb21pc2U8R2VuZXJhdGVkVHlwZXNbJ2NvbGxlY3Rpb25zJ11bVFNsdWddPiB7XG4gIGxldCBhcmdzID0gaW5jb21pbmdBcmdzXG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzaG91bGRDb21taXQgPSBhd2FpdCBpbml0VHJhbnNhY3Rpb24oYXJncy5yZXEpXG5cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gYmVmb3JlT3BlcmF0aW9uIC0gQ29sbGVjdGlvblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIGF3YWl0IGFyZ3MuY29sbGVjdGlvbi5jb25maWcuaG9va3MuYmVmb3JlT3BlcmF0aW9uLnJlZHVjZShcbiAgICAgIGFzeW5jIChwcmlvckhvb2s6IEJlZm9yZU9wZXJhdGlvbkhvb2sgfCBQcm9taXNlPHZvaWQ+LCBob29rOiBCZWZvcmVPcGVyYXRpb25Ib29rKSA9PiB7XG4gICAgICAgIGF3YWl0IHByaW9ySG9va1xuXG4gICAgICAgIGFyZ3MgPVxuICAgICAgICAgIChhd2FpdCBob29rKHtcbiAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICBjb2xsZWN0aW9uOiBhcmdzLmNvbGxlY3Rpb24uY29uZmlnLFxuICAgICAgICAgICAgY29udGV4dDogYXJncy5yZXEuY29udGV4dCxcbiAgICAgICAgICAgIG9wZXJhdGlvbjogJ2NyZWF0ZScsXG4gICAgICAgICAgICByZXE6IGFyZ3MucmVxLFxuICAgICAgICAgIH0pKSB8fCBhcmdzXG4gICAgICB9LFxuICAgICAgUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgKVxuXG4gICAgY29uc3Qge1xuICAgICAgYXV0b3NhdmUgPSBmYWxzZSxcbiAgICAgIGNvbGxlY3Rpb246IHsgY29uZmlnOiBjb2xsZWN0aW9uQ29uZmlnIH0sXG4gICAgICBjb2xsZWN0aW9uLFxuICAgICAgZGVwdGgsXG4gICAgICBkaXNhYmxlVmVyaWZpY2F0aW9uRW1haWwsXG4gICAgICBkcmFmdCA9IGZhbHNlLFxuICAgICAgb3ZlcnJpZGVBY2Nlc3MsXG4gICAgICBvdmVyd3JpdGVFeGlzdGluZ0ZpbGVzID0gZmFsc2UsXG4gICAgICByZXE6IHtcbiAgICAgICAgZmFsbGJhY2tMb2NhbGUsXG4gICAgICAgIGxvY2FsZSxcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgcGF5bG9hZDogeyBjb25maWcsIGVtYWlsT3B0aW9ucyB9LFxuICAgICAgfSxcbiAgICAgIHJlcSxcbiAgICAgIHNob3dIaWRkZW5GaWVsZHMsXG4gICAgfSA9IGFyZ3NcblxuICAgIGxldCB7IGRhdGEgfSA9IGFyZ3NcblxuICAgIGNvbnN0IHNob3VsZFNhdmVEcmFmdCA9IEJvb2xlYW4oZHJhZnQgJiYgY29sbGVjdGlvbkNvbmZpZy52ZXJzaW9ucy5kcmFmdHMpXG5cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gQWNjZXNzXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgaWYgKCFvdmVycmlkZUFjY2Vzcykge1xuICAgICAgYXdhaXQgZXhlY3V0ZUFjY2Vzcyh7IGRhdGEsIHJlcSB9LCBjb2xsZWN0aW9uQ29uZmlnLmFjY2Vzcy5jcmVhdGUpXG4gICAgfVxuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIEN1c3RvbSBpZFxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBAdG9kbzogUmVmYWN0b3IgY29kZSB0byBzdG9yZSAnY3VzdG9tSWQnIG9uIHRoZSBjb2xsZWN0aW9uIGNvbmZpZ3VyYXRpb24gaXRzZWxmIHNvIHdlIGRvbid0IG5lZWQgdG8gcmVwZWF0IGZsYXR0ZW5GaWVsZHNcbiAgICBjb25zdCBoYXNJZEZpZWxkID1cbiAgICAgIGZsYXR0ZW5GaWVsZHMoY29sbGVjdGlvbkNvbmZpZy5maWVsZHMpLmZpbmRJbmRleCgoZmllbGQpID0+IGZpZWxkLm5hbWUgPT09ICdpZCcpID4gLTFcblxuICAgIGlmIChoYXNJZEZpZWxkKSB7XG4gICAgICBkYXRhID0ge1xuICAgICAgICBfaWQ6IGRhdGEuaWQsXG4gICAgICAgIC4uLmRhdGEsXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIEdlbmVyYXRlIGRhdGEgZm9yIGFsbCBmaWxlcyBhbmQgc2l6ZXNcbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICBjb25zdCB7IGRhdGE6IG5ld0ZpbGVEYXRhLCBmaWxlczogZmlsZXNUb1VwbG9hZCB9ID0gYXdhaXQgZ2VuZXJhdGVGaWxlRGF0YSh7XG4gICAgICBjb2xsZWN0aW9uLFxuICAgICAgY29uZmlnLFxuICAgICAgZGF0YSxcbiAgICAgIG92ZXJ3cml0ZUV4aXN0aW5nRmlsZXMsXG4gICAgICByZXEsXG4gICAgICB0aHJvd09uTWlzc2luZ0ZpbGU6XG4gICAgICAgICFzaG91bGRTYXZlRHJhZnQgJiYgY29sbGVjdGlvbi5jb25maWcudXBsb2FkLmZpbGVzUmVxdWlyZWRPbkNyZWF0ZSAhPT0gZmFsc2UsXG4gICAgfSlcblxuICAgIGRhdGEgPSBuZXdGaWxlRGF0YVxuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIGJlZm9yZVZhbGlkYXRlIC0gRmllbGRzXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgZGF0YSA9IGF3YWl0IGJlZm9yZVZhbGlkYXRlKHtcbiAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25Db25maWcsXG4gICAgICBjb250ZXh0OiByZXEuY29udGV4dCxcbiAgICAgIGRhdGEsXG4gICAgICBkb2M6IHt9LFxuICAgICAgZ2xvYmFsOiBudWxsLFxuICAgICAgb3BlcmF0aW9uOiAnY3JlYXRlJyxcbiAgICAgIG92ZXJyaWRlQWNjZXNzLFxuICAgICAgcmVxLFxuICAgIH0pXG5cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gYmVmb3JlVmFsaWRhdGUgLSBDb2xsZWN0aW9uc1xuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIGF3YWl0IGNvbGxlY3Rpb25Db25maWcuaG9va3MuYmVmb3JlVmFsaWRhdGUucmVkdWNlKFxuICAgICAgYXN5bmMgKHByaW9ySG9vazogQmVmb3JlVmFsaWRhdGVIb29rIHwgUHJvbWlzZTx2b2lkPiwgaG9vazogQmVmb3JlVmFsaWRhdGVIb29rKSA9PiB7XG4gICAgICAgIGF3YWl0IHByaW9ySG9va1xuXG4gICAgICAgIGRhdGEgPVxuICAgICAgICAgIChhd2FpdCBob29rKHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25Db25maWcsXG4gICAgICAgICAgICBjb250ZXh0OiByZXEuY29udGV4dCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBvcGVyYXRpb246ICdjcmVhdGUnLFxuICAgICAgICAgICAgcmVxLFxuICAgICAgICAgIH0pKSB8fCBkYXRhXG4gICAgICB9LFxuICAgICAgUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgKVxuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIGJlZm9yZUNoYW5nZSAtIENvbGxlY3Rpb25cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICBhd2FpdCBjb2xsZWN0aW9uQ29uZmlnLmhvb2tzLmJlZm9yZUNoYW5nZS5yZWR1Y2UoYXN5bmMgKHByaW9ySG9vaywgaG9vaykgPT4ge1xuICAgICAgYXdhaXQgcHJpb3JIb29rXG5cbiAgICAgIGRhdGEgPVxuICAgICAgICAoYXdhaXQgaG9vayh7XG4gICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbkNvbmZpZyxcbiAgICAgICAgICBjb250ZXh0OiByZXEuY29udGV4dCxcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIG9wZXJhdGlvbjogJ2NyZWF0ZScsXG4gICAgICAgICAgcmVxLFxuICAgICAgICB9KSkgfHwgZGF0YVxuICAgIH0sIFByb21pc2UucmVzb2x2ZSgpKVxuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIGJlZm9yZUNoYW5nZSAtIEZpZWxkc1xuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIGNvbnN0IHJlc3VsdFdpdGhMb2NhbGVzID0gYXdhaXQgYmVmb3JlQ2hhbmdlPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih7XG4gICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uQ29uZmlnLFxuICAgICAgY29udGV4dDogcmVxLmNvbnRleHQsXG4gICAgICBkYXRhLFxuICAgICAgZG9jOiB7fSxcbiAgICAgIGRvY1dpdGhMb2NhbGVzOiB7fSxcbiAgICAgIGdsb2JhbDogbnVsbCxcbiAgICAgIG9wZXJhdGlvbjogJ2NyZWF0ZScsXG4gICAgICByZXEsXG4gICAgICBza2lwVmFsaWRhdGlvbjogc2hvdWxkU2F2ZURyYWZ0LFxuICAgIH0pXG5cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gV3JpdGUgZmlsZXMgdG8gbG9jYWwgc3RvcmFnZVxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIGlmICghY29sbGVjdGlvbkNvbmZpZy51cGxvYWQuZGlzYWJsZUxvY2FsU3RvcmFnZSkge1xuICAgICAgYXdhaXQgdXBsb2FkRmlsZXMocGF5bG9hZCwgZmlsZXNUb1VwbG9hZCwgcmVxLnQpXG4gICAgfVxuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIENyZWF0ZVxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIGxldCBkb2NcblxuICAgIGlmIChjb2xsZWN0aW9uQ29uZmlnLmF1dGggJiYgIWNvbGxlY3Rpb25Db25maWcuYXV0aC5kaXNhYmxlTG9jYWxTdHJhdGVneSkge1xuICAgICAgaWYgKGRhdGEuZW1haWwpIHtcbiAgICAgICAgcmVzdWx0V2l0aExvY2FsZXMuZW1haWwgPSAoZGF0YS5lbWFpbCBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbGxlY3Rpb25Db25maWcuYXV0aC52ZXJpZnkpIHtcbiAgICAgICAgcmVzdWx0V2l0aExvY2FsZXMuX3ZlcmlmaWVkID0gQm9vbGVhbihyZXN1bHRXaXRoTG9jYWxlcy5fdmVyaWZpZWQpIHx8IGZhbHNlXG4gICAgICAgIHJlc3VsdFdpdGhMb2NhbGVzLl92ZXJpZmljYXRpb25Ub2tlbiA9IGNyeXB0by5yYW5kb21CeXRlcygyMCkudG9TdHJpbmcoJ2hleCcpXG4gICAgICB9XG5cbiAgICAgIGRvYyA9IGF3YWl0IHJlZ2lzdGVyTG9jYWxTdHJhdGVneSh7XG4gICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25Db25maWcsXG4gICAgICAgIGRvYzogcmVzdWx0V2l0aExvY2FsZXMsXG4gICAgICAgIHBhc3N3b3JkOiBkYXRhLnBhc3N3b3JkIGFzIHN0cmluZyxcbiAgICAgICAgcGF5bG9hZDogcmVxLnBheWxvYWQsXG4gICAgICAgIHJlcSxcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvYyA9IGF3YWl0IHBheWxvYWQuZGIuY3JlYXRlKHtcbiAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbkNvbmZpZy5zbHVnLFxuICAgICAgICBkYXRhOiByZXN1bHRXaXRoTG9jYWxlcyxcbiAgICAgICAgcmVxLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCB2ZXJpZmljYXRpb25Ub2tlbiA9IGRvYy5fdmVyaWZpY2F0aW9uVG9rZW5cbiAgICBsZXQgcmVzdWx0OiBEb2N1bWVudCA9IHNhbml0aXplSW50ZXJuYWxGaWVsZHMoZG9jKVxuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIENyZWF0ZSB2ZXJzaW9uXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgaWYgKGNvbGxlY3Rpb25Db25maWcudmVyc2lvbnMpIHtcbiAgICAgIGF3YWl0IHNhdmVWZXJzaW9uKHtcbiAgICAgICAgaWQ6IHJlc3VsdC5pZCxcbiAgICAgICAgYXV0b3NhdmUsXG4gICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25Db25maWcsXG4gICAgICAgIGRvY1dpdGhMb2NhbGVzOiByZXN1bHQsXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIHJlcSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIFNlbmQgdmVyaWZpY2F0aW9uIGVtYWlsIGlmIGFwcGxpY2FibGVcbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICBpZiAoY29sbGVjdGlvbkNvbmZpZy5hdXRoICYmIGNvbGxlY3Rpb25Db25maWcuYXV0aC52ZXJpZnkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgIHNlbmRWZXJpZmljYXRpb25FbWFpbCh7XG4gICAgICAgIGNvbGxlY3Rpb246IHsgY29uZmlnOiBjb2xsZWN0aW9uQ29uZmlnIH0sXG4gICAgICAgIGNvbmZpZzogcGF5bG9hZC5jb25maWcsXG4gICAgICAgIGRpc2FibGVFbWFpbDogZGlzYWJsZVZlcmlmaWNhdGlvbkVtYWlsLFxuICAgICAgICBlbWFpbE9wdGlvbnMsXG4gICAgICAgIHJlcSxcbiAgICAgICAgc2VuZEVtYWlsOiBwYXlsb2FkLnNlbmRFbWFpbCxcbiAgICAgICAgdG9rZW46IHZlcmlmaWNhdGlvblRva2VuLFxuICAgICAgICB1c2VyOiByZXN1bHQsXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBhZnRlclJlYWQgLSBGaWVsZHNcbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICByZXN1bHQgPSBhd2FpdCBhZnRlclJlYWQoe1xuICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbkNvbmZpZyxcbiAgICAgIGNvbnRleHQ6IHJlcS5jb250ZXh0LFxuICAgICAgZGVwdGgsXG4gICAgICBkb2M6IHJlc3VsdCxcbiAgICAgIGZhbGxiYWNrTG9jYWxlLFxuICAgICAgZ2xvYmFsOiBudWxsLFxuICAgICAgbG9jYWxlLFxuICAgICAgb3ZlcnJpZGVBY2Nlc3MsXG4gICAgICByZXEsXG4gICAgICBzaG93SGlkZGVuRmllbGRzLFxuICAgIH0pXG5cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gYWZ0ZXJSZWFkIC0gQ29sbGVjdGlvblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIGF3YWl0IGNvbGxlY3Rpb25Db25maWcuaG9va3MuYWZ0ZXJSZWFkLnJlZHVjZShhc3luYyAocHJpb3JIb29rLCBob29rKSA9PiB7XG4gICAgICBhd2FpdCBwcmlvckhvb2tcblxuICAgICAgcmVzdWx0ID1cbiAgICAgICAgKGF3YWl0IGhvb2soe1xuICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25Db25maWcsXG4gICAgICAgICAgY29udGV4dDogcmVxLmNvbnRleHQsXG4gICAgICAgICAgZG9jOiByZXN1bHQsXG4gICAgICAgICAgcmVxLFxuICAgICAgICB9KSkgfHwgcmVzdWx0XG4gICAgfSwgUHJvbWlzZS5yZXNvbHZlKCkpXG5cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gYWZ0ZXJDaGFuZ2UgLSBGaWVsZHNcbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICByZXN1bHQgPSBhd2FpdCBhZnRlckNoYW5nZSh7XG4gICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uQ29uZmlnLFxuICAgICAgY29udGV4dDogcmVxLmNvbnRleHQsXG4gICAgICBkYXRhLFxuICAgICAgZG9jOiByZXN1bHQsXG4gICAgICBnbG9iYWw6IG51bGwsXG4gICAgICBvcGVyYXRpb246ICdjcmVhdGUnLFxuICAgICAgcHJldmlvdXNEb2M6IHt9LFxuICAgICAgcmVxLFxuICAgIH0pXG5cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gYWZ0ZXJDaGFuZ2UgLSBDb2xsZWN0aW9uXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgYXdhaXQgY29sbGVjdGlvbkNvbmZpZy5ob29rcy5hZnRlckNoYW5nZS5yZWR1Y2UoXG4gICAgICBhc3luYyAocHJpb3JIb29rOiBBZnRlckNoYW5nZUhvb2sgfCBQcm9taXNlPHZvaWQ+LCBob29rOiBBZnRlckNoYW5nZUhvb2spID0+IHtcbiAgICAgICAgYXdhaXQgcHJpb3JIb29rXG5cbiAgICAgICAgcmVzdWx0ID1cbiAgICAgICAgICAoYXdhaXQgaG9vayh7XG4gICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uQ29uZmlnLFxuICAgICAgICAgICAgY29udGV4dDogcmVxLmNvbnRleHQsXG4gICAgICAgICAgICBkb2M6IHJlc3VsdCxcbiAgICAgICAgICAgIG9wZXJhdGlvbjogJ2NyZWF0ZScsXG4gICAgICAgICAgICBwcmV2aW91c0RvYzoge30sXG4gICAgICAgICAgICByZXE6IGFyZ3MucmVxLFxuICAgICAgICAgIH0pKSB8fCByZXN1bHRcbiAgICAgIH0sXG4gICAgICBQcm9taXNlLnJlc29sdmUoKSxcbiAgICApXG5cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gYWZ0ZXJPcGVyYXRpb24gLSBDb2xsZWN0aW9uXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgcmVzdWx0ID0gYXdhaXQgYnVpbGRBZnRlck9wZXJhdGlvbjxHZW5lcmF0ZWRUeXBlc1snY29sbGVjdGlvbnMnXVtUU2x1Z10+KHtcbiAgICAgIGFyZ3MsXG4gICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uQ29uZmlnLFxuICAgICAgb3BlcmF0aW9uOiAnY3JlYXRlJyxcbiAgICAgIHJlc3VsdCxcbiAgICB9KVxuXG4gICAgYXdhaXQgdW5saW5rVGVtcEZpbGVzKHsgY29sbGVjdGlvbkNvbmZpZywgY29uZmlnLCByZXEgfSlcblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBSZXR1cm4gcmVzdWx0c1xuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIGlmIChzaG91bGRDb21taXQpIGF3YWl0IGNvbW1pdFRyYW5zYWN0aW9uKHJlcSlcblxuICAgIHJldHVybiByZXN1bHRcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBhd2FpdCBraWxsVHJhbnNhY3Rpb24oYXJncy5yZXEpXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVcbiJdLCJuYW1lcyI6WyJ1bmxpbmtGaWxlIiwicHJvbWlzaWZ5IiwiZnMiLCJ1bmxpbmsiLCJjcmVhdGUiLCJpbmNvbWluZ0FyZ3MiLCJhcmdzIiwic2hvdWxkQ29tbWl0IiwiaW5pdFRyYW5zYWN0aW9uIiwicmVxIiwiY29sbGVjdGlvbiIsImNvbmZpZyIsImhvb2tzIiwiYmVmb3JlT3BlcmF0aW9uIiwicmVkdWNlIiwicHJpb3JIb29rIiwiaG9vayIsImNvbnRleHQiLCJvcGVyYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsImF1dG9zYXZlIiwiY29sbGVjdGlvbkNvbmZpZyIsImRlcHRoIiwiZGlzYWJsZVZlcmlmaWNhdGlvbkVtYWlsIiwiZHJhZnQiLCJvdmVycmlkZUFjY2VzcyIsIm92ZXJ3cml0ZUV4aXN0aW5nRmlsZXMiLCJmYWxsYmFja0xvY2FsZSIsImxvY2FsZSIsInBheWxvYWQiLCJlbWFpbE9wdGlvbnMiLCJzaG93SGlkZGVuRmllbGRzIiwiZGF0YSIsInNob3VsZFNhdmVEcmFmdCIsIkJvb2xlYW4iLCJ2ZXJzaW9ucyIsImRyYWZ0cyIsImV4ZWN1dGVBY2Nlc3MiLCJhY2Nlc3MiLCJoYXNJZEZpZWxkIiwiZmxhdHRlbkZpZWxkcyIsImZpZWxkcyIsImZpbmRJbmRleCIsImZpZWxkIiwibmFtZSIsIl9pZCIsImlkIiwibmV3RmlsZURhdGEiLCJmaWxlcyIsImZpbGVzVG9VcGxvYWQiLCJnZW5lcmF0ZUZpbGVEYXRhIiwidGhyb3dPbk1pc3NpbmdGaWxlIiwidXBsb2FkIiwiZmlsZXNSZXF1aXJlZE9uQ3JlYXRlIiwiYmVmb3JlVmFsaWRhdGUiLCJkb2MiLCJnbG9iYWwiLCJiZWZvcmVDaGFuZ2UiLCJyZXN1bHRXaXRoTG9jYWxlcyIsImRvY1dpdGhMb2NhbGVzIiwic2tpcFZhbGlkYXRpb24iLCJkaXNhYmxlTG9jYWxTdG9yYWdlIiwidXBsb2FkRmlsZXMiLCJ0IiwiYXV0aCIsImRpc2FibGVMb2NhbFN0cmF0ZWd5IiwiZW1haWwiLCJ0b0xvd2VyQ2FzZSIsInZlcmlmeSIsIl92ZXJpZmllZCIsIl92ZXJpZmljYXRpb25Ub2tlbiIsImNyeXB0byIsInJhbmRvbUJ5dGVzIiwidG9TdHJpbmciLCJyZWdpc3RlckxvY2FsU3RyYXRlZ3kiLCJwYXNzd29yZCIsImRiIiwic2x1ZyIsInZlcmlmaWNhdGlvblRva2VuIiwicmVzdWx0Iiwic2FuaXRpemVJbnRlcm5hbEZpZWxkcyIsInNhdmVWZXJzaW9uIiwic2VuZFZlcmlmaWNhdGlvbkVtYWlsIiwiZGlzYWJsZUVtYWlsIiwic2VuZEVtYWlsIiwidG9rZW4iLCJ1c2VyIiwiYWZ0ZXJSZWFkIiwiYWZ0ZXJDaGFuZ2UiLCJwcmV2aW91c0RvYyIsImJ1aWxkQWZ0ZXJPcGVyYXRpb24iLCJ1bmxpbmtUZW1wRmlsZXMiLCJjb21taXRUcmFuc2FjdGlvbiIsImVycm9yIiwia2lsbFRyYW5zYWN0aW9uIl0sIm1hcHBpbmdzIjoiOzs7OytCQTBYQTs7O2VBQUE7OzsrREF4WG1COzJEQUNKO3NCQUNXO3NFQVlBOzhFQUNROzBCQUNJOzZCQUNWOzJCQUNGOzhCQUNHO2dDQUNFO2tDQUNFO2lDQUNEOzZCQUNKO21DQUNNOzhFQUNSO2lDQUNNO2lDQUNBOytFQUNHOzZCQUNQO3VCQUNROzs7Ozs7QUFFcEMsTUFBTUEsYUFBYUMsSUFBQUEsZUFBUyxF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