payload
Version:
Node, React and MongoDB Headless CMS and Application Framework
315 lines (314 loc) • 29.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
DocumentInfoProvider: function() {
return DocumentInfoProvider;
},
useDocumentInfo: function() {
return useDocumentInfo;
}
});
const _qs = /*#__PURE__*/ _interop_require_default(require("qs"));
const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
const _reacti18next = require("react-i18next");
const _reactrouterdom = require("react-router-dom");
const _Auth = require("../Auth");
const _Config = require("../Config");
const _Locale = require("../Locale");
const _Preferences = require("../Preferences");
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interop_require_wildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {
__proto__: null
};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
const Context = /*#__PURE__*/ (0, _react.createContext)({});
const useDocumentInfo = ()=>(0, _react.useContext)(Context);
const DocumentInfoProvider = ({ id: idFromProps, children, collection, global, idFromParams: getIDFromParams })=>{
const { id: idFromParams } = (0, _reactrouterdom.useParams)();
const id = idFromProps || (getIDFromParams ? idFromParams : null);
const { routes: { api }, serverURL } = (0, _Config.useConfig)();
const { getPreference, setPreference } = (0, _Preferences.usePreferences)();
const { i18n } = (0, _reacti18next.useTranslation)();
const { permissions } = (0, _Auth.useAuth)();
const { code } = (0, _Locale.useLocale)();
const [publishedDoc, setPublishedDoc] = (0, _react.useState)(null);
const [versions, setVersions] = (0, _react.useState)(null);
const [unpublishedVersions, setUnpublishedVersions] = (0, _react.useState)(null);
const baseURL = `${serverURL}${api}`;
let slug;
let pluralType;
let preferencesKey;
if (global) {
slug = global.slug;
pluralType = 'globals';
preferencesKey = `global-${slug}`;
}
if (collection) {
slug = collection.slug;
pluralType = 'collections';
if (id) {
preferencesKey = `collection-${slug}-${id}`;
}
}
const [docPermissions, setDocPermissions] = (0, _react.useState)(permissions[pluralType][slug]);
const getVersions = (0, _react.useCallback)(async ()=>{
let versionFetchURL;
let publishedFetchURL;
let draftsEnabled = false;
let shouldFetchVersions = false;
let unpublishedVersionJSON = null;
let versionJSON = null;
let shouldFetch = true;
const versionParams = {
depth: 0,
where: {
and: []
}
};
const publishedVersionParams = {
depth: 0,
locale: code || undefined,
where: {
and: [
{
or: [
{
_status: {
equals: 'published'
}
},
{
_status: {
exists: false
}
}
]
}
]
}
};
if (global) {
draftsEnabled = Boolean(global?.versions?.drafts);
shouldFetchVersions = Boolean(global?.versions);
versionFetchURL = `${baseURL}/globals/${global.slug}/versions`;
publishedFetchURL = `${baseURL}/globals/${global.slug}?${_qs.default.stringify(publishedVersionParams)}`;
}
if (collection) {
draftsEnabled = Boolean(collection?.versions?.drafts);
shouldFetchVersions = Boolean(collection?.versions);
versionFetchURL = `${baseURL}/${collection.slug}/versions`;
publishedVersionParams.where.and.push({
id: {
equals: id
}
});
publishedFetchURL = `${baseURL}/${collection.slug}?${_qs.default.stringify(publishedVersionParams)}`;
if (!id) {
shouldFetch = false;
}
versionParams.where.and.push({
parent: {
equals: id
}
});
}
if (shouldFetch) {
let publishedJSON;
if (draftsEnabled) {
publishedJSON = await fetch(publishedFetchURL, {
credentials: 'include',
headers: {
'Accept-Language': i18n.language
}
}).then((res)=>res.json());
if (collection) {
publishedJSON = publishedJSON?.docs?.[0];
}
}
if (shouldFetchVersions) {
versionJSON = await fetch(`${versionFetchURL}?${_qs.default.stringify(versionParams)}`, {
credentials: 'include',
headers: {
'Accept-Language': i18n.language
}
}).then((res)=>res.json());
if (publishedJSON?.updatedAt) {
const newerVersionParams = {
...versionParams,
where: {
...versionParams.where,
and: [
...versionParams.where.and,
{
updatedAt: {
greater_than: publishedJSON?.updatedAt
}
}
]
}
};
// Get any newer versions available
const newerVersionRes = await fetch(`${versionFetchURL}?${_qs.default.stringify(newerVersionParams)}`, {
credentials: 'include',
headers: {
'Accept-Language': i18n.language
}
});
if (newerVersionRes.status === 200) {
unpublishedVersionJSON = await newerVersionRes.json();
}
}
}
setPublishedDoc(publishedJSON);
setVersions(versionJSON);
setUnpublishedVersions(unpublishedVersionJSON);
}
}, [
i18n,
global,
collection,
id,
baseURL,
code
]);
const getDocPermissions = _react.default.useCallback(async ()=>{
let docAccessURL;
const params = {
locale: code || undefined
};
if (pluralType === 'globals') {
docAccessURL = `/globals/${slug}/access`;
} else if (pluralType === 'collections' && id) {
docAccessURL = `/${slug}/access/${id}`;
}
if (docAccessURL) {
const res = await fetch(`${serverURL}${api}${docAccessURL}?${_qs.default.stringify(params)}`, {
credentials: 'include',
headers: {
'Accept-Language': i18n.language
}
});
try {
const json = await res.json();
setDocPermissions(json);
} catch (e) {
console.error('Unable to fetch document permissions', e);
}
}
}, [
serverURL,
api,
pluralType,
slug,
id,
i18n.language,
code
]);
const getDocPreferences = (0, _react.useCallback)(async ()=>{
return getPreference(preferencesKey);
}, [
getPreference,
preferencesKey
]);
const setDocFieldPreferences = (0, _react.useCallback)(async (path, fieldPreferences)=>{
const allPreferences = await getDocPreferences();
if (preferencesKey) {
try {
await setPreference(preferencesKey, {
...allPreferences,
fields: {
...allPreferences?.fields || {},
[path]: {
...allPreferences?.fields?.[path],
...fieldPreferences
}
}
});
} catch (e) {
console.error(e);
}
}
}, [
setPreference,
preferencesKey,
getDocPreferences
]);
(0, _react.useEffect)(()=>{
getVersions();
}, [
getVersions
]);
(0, _react.useEffect)(()=>{
getDocPermissions();
}, [
getDocPermissions
]);
const value = {
id,
slug,
collection,
docPermissions,
getDocPermissions,
getDocPreferences,
getVersions,
global,
preferencesKey,
publishedDoc,
setDocFieldPreferences,
unpublishedVersions,
versions
};
return /*#__PURE__*/ _react.default.createElement(Context.Provider, {
value: value
}, children);
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hZG1pbi9jb21wb25lbnRzL3V0aWxpdGllcy9Eb2N1bWVudEluZm8vaW5kZXgudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBxcyBmcm9tICdxcydcbmltcG9ydCBSZWFjdCwgeyBjcmVhdGVDb250ZXh0LCB1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICdyZWFjdC1pMThuZXh0J1xuaW1wb3J0IHsgdXNlUGFyYW1zIH0gZnJvbSAncmVhY3Qtcm91dGVyLWRvbSdcblxuaW1wb3J0IHR5cGUgeyBUeXBlV2l0aFRpbWVzdGFtcHMgfSBmcm9tICcuLi8uLi8uLi8uLi9jb2xsZWN0aW9ucy9jb25maWcvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IFBhZ2luYXRlZERvY3MgfSBmcm9tICcuLi8uLi8uLi8uLi9kYXRhYmFzZS90eXBlcydcbmltcG9ydCB0eXBlIHsgVHlwZVdpdGhJRCB9IGZyb20gJy4uLy4uLy4uLy4uL2dsb2JhbHMvY29uZmlnL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBEb2N1bWVudFByZWZlcmVuY2VzIH0gZnJvbSAnLi4vLi4vLi4vLi4vcHJlZmVyZW5jZXMvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IFdoZXJlIH0gZnJvbSAnLi4vLi4vLi4vLi4vdHlwZXMnXG5pbXBvcnQgdHlwZSB7IENvbnRleHRUeXBlLCBEb2N1bWVudFBlcm1pc3Npb25zLCBQcm9wcywgVmVyc2lvbiB9IGZyb20gJy4vdHlwZXMnXG5cbmltcG9ydCB7IHVzZUF1dGggfSBmcm9tICcuLi9BdXRoJ1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi4vQ29uZmlnJ1xuaW1wb3J0IHsgdXNlTG9jYWxlIH0gZnJvbSAnLi4vTG9jYWxlJ1xuaW1wb3J0IHsgdXNlUHJlZmVyZW5jZXMgfSBmcm9tICcuLi9QcmVmZXJlbmNlcydcblxuY29uc3QgQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoe30gYXMgQ29udGV4dFR5cGUpXG5cbmV4cG9ydCBjb25zdCB1c2VEb2N1bWVudEluZm8gPSAoKTogQ29udGV4dFR5cGUgPT4gdXNlQ29udGV4dChDb250ZXh0KVxuXG5leHBvcnQgY29uc3QgRG9jdW1lbnRJbmZvUHJvdmlkZXI6IFJlYWN0LkZDPFByb3BzPiA9ICh7XG4gIGlkOiBpZEZyb21Qcm9wcyxcbiAgY2hpbGRyZW4sXG4gIGNvbGxlY3Rpb24sXG4gIGdsb2JhbCxcbiAgaWRGcm9tUGFyYW1zOiBnZXRJREZyb21QYXJhbXMsXG59KSA9PiB7XG4gIGNvbnN0IHsgaWQ6IGlkRnJvbVBhcmFtcyB9ID0gdXNlUGFyYW1zPHsgaWQ6IHN0cmluZyB9PigpXG4gIGNvbnN0IGlkID0gaWRGcm9tUHJvcHMgfHwgKGdldElERnJvbVBhcmFtcyA/IGlkRnJvbVBhcmFtcyA6IG51bGwpXG5cbiAgY29uc3Qge1xuICAgIHJvdXRlczogeyBhcGkgfSxcbiAgICBzZXJ2ZXJVUkwsXG4gIH0gPSB1c2VDb25maWcoKVxuICBjb25zdCB7IGdldFByZWZlcmVuY2UsIHNldFByZWZlcmVuY2UgfSA9IHVzZVByZWZlcmVuY2VzKClcbiAgY29uc3QgeyBpMThuIH0gPSB1c2VUcmFuc2xhdGlvbigpXG4gIGNvbnN0IHsgcGVybWlzc2lvbnMgfSA9IHVzZUF1dGgoKVxuICBjb25zdCB7IGNvZGUgfSA9IHVzZUxvY2FsZSgpXG4gIGNvbnN0IFtwdWJsaXNoZWREb2MsIHNldFB1Ymxpc2hlZERvY10gPSB1c2VTdGF0ZTxUeXBlV2l0aElEICYgVHlwZVdpdGhUaW1lc3RhbXBzPihudWxsKVxuICBjb25zdCBbdmVyc2lvbnMsIHNldFZlcnNpb25zXSA9IHVzZVN0YXRlPFBhZ2luYXRlZERvY3M8VmVyc2lvbj4+KG51bGwpXG4gIGNvbnN0IFt1bnB1Ymxpc2hlZFZlcnNpb25zLCBzZXRVbnB1Ymxpc2hlZFZlcnNpb25zXSA9IHVzZVN0YXRlPFBhZ2luYXRlZERvY3M8VmVyc2lvbj4+KG51bGwpXG5cbiAgY29uc3QgYmFzZVVSTCA9IGAke3NlcnZlclVSTH0ke2FwaX1gXG4gIGxldCBzbHVnOiBzdHJpbmdcbiAgbGV0IHBsdXJhbFR5cGU6ICdjb2xsZWN0aW9ucycgfCAnZ2xvYmFscydcbiAgbGV0IHByZWZlcmVuY2VzS2V5OiBzdHJpbmdcblxuICBpZiAoZ2xvYmFsKSB7XG4gICAgc2x1ZyA9IGdsb2JhbC5zbHVnXG4gICAgcGx1cmFsVHlwZSA9ICdnbG9iYWxzJ1xuICAgIHByZWZlcmVuY2VzS2V5ID0gYGdsb2JhbC0ke3NsdWd9YFxuICB9XG5cbiAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICBzbHVnID0gY29sbGVjdGlvbi5zbHVnXG4gICAgcGx1cmFsVHlwZSA9ICdjb2xsZWN0aW9ucydcblxuICAgIGlmIChpZCkge1xuICAgICAgcHJlZmVyZW5jZXNLZXkgPSBgY29sbGVjdGlvbi0ke3NsdWd9LSR7aWR9YFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFtkb2NQZXJtaXNzaW9ucywgc2V0RG9jUGVybWlzc2lvbnNdID0gdXNlU3RhdGU8RG9jdW1lbnRQZXJtaXNzaW9ucz4oXG4gICAgcGVybWlzc2lvbnNbcGx1cmFsVHlwZV1bc2x1Z10sXG4gIClcblxuICBjb25zdCBnZXRWZXJzaW9ucyA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBsZXQgdmVyc2lvbkZldGNoVVJMXG4gICAgbGV0IHB1Ymxpc2hlZEZldGNoVVJMXG4gICAgbGV0IGRyYWZ0c0VuYWJsZWQgPSBmYWxzZVxuICAgIGxldCBzaG91bGRGZXRjaFZlcnNpb25zID0gZmFsc2VcbiAgICBsZXQgdW5wdWJsaXNoZWRWZXJzaW9uSlNPTiA9IG51bGxcbiAgICBsZXQgdmVyc2lvbkpTT04gPSBudWxsXG4gICAgbGV0IHNob3VsZEZldGNoID0gdHJ1ZVxuXG4gICAgY29uc3QgdmVyc2lvblBhcmFtcyA9IHtcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgd2hlcmU6IHtcbiAgICAgICAgYW5kOiBbXSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgcHVibGlzaGVkVmVyc2lvblBhcmFtczogeyBkZXB0aDogbnVtYmVyOyBsb2NhbGU6IHN0cmluZzsgd2hlcmU6IFdoZXJlIH0gPSB7XG4gICAgICBkZXB0aDogMCxcbiAgICAgIGxvY2FsZTogY29kZSB8fCB1bmRlZmluZWQsXG4gICAgICB3aGVyZToge1xuICAgICAgICBhbmQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvcjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgX3N0YXR1czoge1xuICAgICAgICAgICAgICAgICAgZXF1YWxzOiAncHVibGlzaGVkJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgX3N0YXR1czoge1xuICAgICAgICAgICAgICAgICAgZXhpc3RzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICBkcmFmdHNFbmFibGVkID0gQm9vbGVhbihnbG9iYWw/LnZlcnNpb25zPy5kcmFmdHMpXG4gICAgICBzaG91bGRGZXRjaFZlcnNpb25zID0gQm9vbGVhbihnbG9iYWw/LnZlcnNpb25zKVxuICAgICAgdmVyc2lvbkZldGNoVVJMID0gYCR7YmFzZVVSTH0vZ2xvYmFscy8ke2dsb2JhbC5zbHVnfS92ZXJzaW9uc2BcbiAgICAgIHB1Ymxpc2hlZEZldGNoVVJMID0gYCR7YmFzZVVSTH0vZ2xvYmFscy8ke2dsb2JhbC5zbHVnfT8ke3FzLnN0cmluZ2lmeShcbiAgICAgICAgcHVibGlzaGVkVmVyc2lvblBhcmFtcyxcbiAgICAgICl9YFxuICAgIH1cblxuICAgIGlmIChjb2xsZWN0aW9uKSB7XG4gICAgICBkcmFmdHNFbmFibGVkID0gQm9vbGVhbihjb2xsZWN0aW9uPy52ZXJzaW9ucz8uZHJhZnRzKVxuICAgICAgc2hvdWxkRmV0Y2hWZXJzaW9ucyA9IEJvb2xlYW4oY29sbGVjdGlvbj8udmVyc2lvbnMpXG4gICAgICB2ZXJzaW9uRmV0Y2hVUkwgPSBgJHtiYXNlVVJMfS8ke2NvbGxlY3Rpb24uc2x1Z30vdmVyc2lvbnNgXG5cbiAgICAgIHB1Ymxpc2hlZFZlcnNpb25QYXJhbXMud2hlcmUuYW5kLnB1c2goe1xuICAgICAgICBpZDoge1xuICAgICAgICAgIGVxdWFsczogaWQsXG4gICAgICAgIH0sXG4gICAgICB9KVxuXG4gICAgICBwdWJsaXNoZWRGZXRjaFVSTCA9IGAke2Jhc2VVUkx9LyR7Y29sbGVjdGlvbi5zbHVnfT8ke3FzLnN0cmluZ2lmeShwdWJsaXNoZWRWZXJzaW9uUGFyYW1zKX1gXG5cbiAgICAgIGlmICghaWQpIHtcbiAgICAgICAgc2hvdWxkRmV0Y2ggPSBmYWxzZVxuICAgICAgfVxuXG4gICAgICB2ZXJzaW9uUGFyYW1zLndoZXJlLmFuZC5wdXNoKHtcbiAgICAgICAgcGFyZW50OiB7XG4gICAgICAgICAgZXF1YWxzOiBpZCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHNob3VsZEZldGNoKSB7XG4gICAgICBsZXQgcHVibGlzaGVkSlNPTlxuXG4gICAgICBpZiAoZHJhZnRzRW5hYmxlZCkge1xuICAgICAgICBwdWJsaXNoZWRKU09OID0gYXdhaXQgZmV0Y2gocHVibGlzaGVkRmV0Y2hVUkwsIHtcbiAgICAgICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOiBpMThuLmxhbmd1YWdlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLnRoZW4oKHJlcykgPT4gcmVzLmpzb24oKSlcblxuICAgICAgICBpZiAoY29sbGVjdGlvbikge1xuICAgICAgICAgIHB1Ymxpc2hlZEpTT04gPSBwdWJsaXNoZWRKU09OPy5kb2NzPy5bMF1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkRmV0Y2hWZXJzaW9ucykge1xuICAgICAgICB2ZXJzaW9uSlNPTiA9IGF3YWl0IGZldGNoKGAke3ZlcnNpb25GZXRjaFVSTH0/JHtxcy5zdHJpbmdpZnkodmVyc2lvblBhcmFtcyl9YCwge1xuICAgICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0FjY2VwdC1MYW5ndWFnZSc6IGkxOG4ubGFuZ3VhZ2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkudGhlbigocmVzKSA9PiByZXMuanNvbigpKVxuXG4gICAgICAgIGlmIChwdWJsaXNoZWRKU09OPy51cGRhdGVkQXQpIHtcbiAgICAgICAgICBjb25zdCBuZXdlclZlcnNpb25QYXJhbXMgPSB7XG4gICAgICAgICAgICAuLi52ZXJzaW9uUGFyYW1zLFxuICAgICAgICAgICAgd2hlcmU6IHtcbiAgICAgICAgICAgICAgLi4udmVyc2lvblBhcmFtcy53aGVyZSxcbiAgICAgICAgICAgICAgYW5kOiBbXG4gICAgICAgICAgICAgICAgLi4udmVyc2lvblBhcmFtcy53aGVyZS5hbmQsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdXBkYXRlZEF0OiB7XG4gICAgICAgICAgICAgICAgICAgIGdyZWF0ZXJfdGhhbjogcHVibGlzaGVkSlNPTj8udXBkYXRlZEF0LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBHZXQgYW55IG5ld2VyIHZlcnNpb25zIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnN0IG5ld2VyVmVyc2lvblJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgYCR7dmVyc2lvbkZldGNoVVJMfT8ke3FzLnN0cmluZ2lmeShuZXdlclZlcnNpb25QYXJhbXMpfWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnQWNjZXB0LUxhbmd1YWdlJzogaTE4bi5sYW5ndWFnZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgaWYgKG5ld2VyVmVyc2lvblJlcy5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgdW5wdWJsaXNoZWRWZXJzaW9uSlNPTiA9IGF3YWl0IG5ld2VyVmVyc2lvblJlcy5qc29uKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0UHVibGlzaGVkRG9jKHB1Ymxpc2hlZEpTT04pXG4gICAgICBzZXRWZXJzaW9ucyh2ZXJzaW9uSlNPTilcbiAgICAgIHNldFVucHVibGlzaGVkVmVyc2lvbnModW5wdWJsaXNoZWRWZXJzaW9uSlNPTilcbiAgICB9XG4gIH0sIFtpMThuLCBnbG9iYWwsIGNvbGxlY3Rpb24sIGlkLCBiYXNlVVJMLCBjb2RlXSlcblxuICBjb25zdCBnZXREb2NQZXJtaXNzaW9ucyA9IFJlYWN0LnVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBsZXQgZG9jQWNjZXNzVVJMOiBzdHJpbmdcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBsb2NhbGU6IGNvZGUgfHwgdW5kZWZpbmVkLFxuICAgIH1cbiAgICBpZiAocGx1cmFsVHlwZSA9PT0gJ2dsb2JhbHMnKSB7XG4gICAgICBkb2NBY2Nlc3NVUkwgPSBgL2dsb2JhbHMvJHtzbHVnfS9hY2Nlc3NgXG4gICAgfSBlbHNlIGlmIChwbHVyYWxUeXBlID09PSAnY29sbGVjdGlvbnMnICYmIGlkKSB7XG4gICAgICBkb2NBY2Nlc3NVUkwgPSBgLyR7c2x1Z30vYWNjZXNzLyR7aWR9YFxuICAgIH1cblxuICAgIGlmIChkb2NBY2Nlc3NVUkwpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke3NlcnZlclVSTH0ke2FwaX0ke2RvY0FjY2Vzc1VSTH0/JHtxcy5zdHJpbmdpZnkocGFyYW1zKX1gLCB7XG4gICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQWNjZXB0LUxhbmd1YWdlJzogaTE4bi5sYW5ndWFnZSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKVxuICAgICAgICBzZXREb2NQZXJtaXNzaW9ucyhqc29uKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdVbmFibGUgdG8gZmV0Y2ggZG9jdW1lbnQgcGVybWlzc2lvbnMnLCBlKVxuICAgICAgfVxuICAgIH1cbiAgfSwgW3NlcnZlclVSTCwgYXBpLCBwbHVyYWxUeXBlLCBzbHVnLCBpZCwgaTE4bi5sYW5ndWFnZSwgY29kZV0pXG5cbiAgY29uc3QgZ2V0RG9jUHJlZmVyZW5jZXMgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgcmV0dXJuIGdldFByZWZlcmVuY2U8RG9jdW1lbnRQcmVmZXJlbmNlcz4ocHJlZmVyZW5jZXNLZXkpXG4gIH0sIFtnZXRQcmVmZXJlbmNlLCBwcmVmZXJlbmNlc0tleV0pXG5cbiAgY29uc3Qgc2V0RG9jRmllbGRQcmVmZXJlbmNlcyA9IHVzZUNhbGxiYWNrPENvbnRleHRUeXBlWydzZXREb2NGaWVsZFByZWZlcmVuY2VzJ10+KFxuICAgIGFzeW5jIChwYXRoLCBmaWVsZFByZWZlcmVuY2VzKSA9PiB7XG4gICAgICBjb25zdCBhbGxQcmVmZXJlbmNlcyA9IGF3YWl0IGdldERvY1ByZWZlcmVuY2VzKClcblxuICAgICAgaWYgKHByZWZlcmVuY2VzS2V5KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgc2V0UHJlZmVyZW5jZShwcmVmZXJlbmNlc0tleSwge1xuICAgICAgICAgICAgLi4uYWxsUHJlZmVyZW5jZXMsXG4gICAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgICAgLi4uKGFsbFByZWZlcmVuY2VzPy5maWVsZHMgfHwge30pLFxuICAgICAgICAgICAgICBbcGF0aF06IHtcbiAgICAgICAgICAgICAgICAuLi5hbGxQcmVmZXJlbmNlcz8uZmllbGRzPy5bcGF0aF0sXG4gICAgICAgICAgICAgICAgLi4uZmllbGRQcmVmZXJlbmNlcyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW3NldFByZWZlcmVuY2UsIHByZWZlcmVuY2VzS2V5LCBnZXREb2NQcmVmZXJlbmNlc10sXG4gIClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGdldFZlcnNpb25zKClcbiAgfSwgW2dldFZlcnNpb25zXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGdldERvY1Blcm1pc3Npb25zKClcbiAgfSwgW2dldERvY1Blcm1pc3Npb25zXSlcblxuICBjb25zdCB2YWx1ZTogQ29udGV4dFR5cGUgPSB7XG4gICAgaWQsXG4gICAgc2x1ZyxcbiAgICBjb2xsZWN0aW9uLFxuICAgIGRvY1Blcm1pc3Npb25zLFxuICAgIGdldERvY1Blcm1pc3Npb25zLFxuICAgIGdldERvY1ByZWZlcmVuY2VzLFxuICAgIGdldFZlcnNpb25zLFxuICAgIGdsb2JhbCxcbiAgICBwcmVmZXJlbmNlc0tleSxcbiAgICBwdWJsaXNoZWREb2MsXG4gICAgc2V0RG9jRmllbGRQcmVmZXJlbmNlcyxcbiAgICB1bnB1Ymxpc2hlZFZlcnNpb25zLFxuICAgIHZlcnNpb25zLFxuICB9XG5cbiAgcmV0dXJuIDxDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt2YWx1ZX0+e2NoaWxkcmVufTwvQ29udGV4dC5Qcm92aWRlcj5cbn1cbiJdLCJuYW1lcyI6WyJEb2N1bWVudEluZm9Qcm92aWRlciIsInVzZURvY3VtZW50SW5mbyIsIkNvbnRleHQiLCJjcmVhdGVDb250ZXh0IiwidXNlQ29udGV4dCIsImlkIiwiaWRGcm9tUHJvcHMiLCJjaGlsZHJlbiIsImNvbGxlY3Rpb24iLCJnbG9iYWwiLCJpZEZyb21QYXJhbXMiLCJnZXRJREZyb21QYXJhbXMiLCJ1c2VQYXJhbXMiLCJyb3V0ZXMiLCJhcGkiLCJzZXJ2ZXJVUkwiLCJ1c2VDb25maWciLCJnZXRQcmVmZXJlbmNlIiwic2V0UHJlZmVyZW5jZSIsInVzZVByZWZlcmVuY2VzIiwiaTE4biIsInVzZVRyYW5zbGF0aW9uIiwicGVybWlzc2lvbnMiLCJ1c2VBdXRoIiwiY29kZSIsInVzZUxvY2FsZSIsInB1Ymxpc2hlZERvYyIsInNldFB1Ymxpc2hlZERvYyIsInVzZVN0YXRlIiwidmVyc2lvbnMiLCJzZXRWZXJzaW9ucyIsInVucHVibGlzaGVkVmVyc2lvbnMiLCJzZXRVbnB1Ymxpc2hlZFZlcnNpb25zIiwiYmFzZVVSTCIsInNsdWciLCJwbHVyYWxUeXBlIiwicHJlZmVyZW5jZXNLZXkiLCJkb2NQZXJtaXNzaW9ucyIsInNldERvY1Blcm1pc3Npb25zIiwiZ2V0VmVyc2lvbnMiLCJ1c2VDYWxsYmFjayIsInZlcnNpb25GZXRjaFVSTCIsInB1Ymxpc2hlZEZldGNoVVJMIiwiZHJhZnRzRW5hYmxlZCIsInNob3VsZEZldGNoVmVyc2lvbnMiLCJ1bnB1Ymxpc2hlZFZlcnNpb25KU09OIiwidmVyc2lvbkpTT04iLCJzaG91bGRGZXRjaCIsInZlcnNpb25QYXJhbXMiLCJkZXB0aCIsIndoZXJlIiwiYW5kIiwicHVibGlzaGVkVmVyc2lvblBhcmFtcyIsImxvY2FsZSIsInVuZGVmaW5lZCIsIm9yIiwiX3N0YXR1cyIsImVxdWFscyIsImV4aXN0cyIsIkJvb2xlYW4iLCJkcmFmdHMiLCJxcyIsInN0cmluZ2lmeSIsInB1c2giLCJwYXJlbnQiLCJwdWJsaXNoZWRKU09OIiwiZmV0Y2giLCJjcmVkZW50aWFscyIsImhlYWRlcnMiLCJsYW5ndWFnZSIsInRoZW4iLCJyZXMiLCJqc29uIiwiZG9jcyIsInVwZGF0ZWRBdCIsIm5ld2VyVmVyc2lvblBhcmFtcyIsImdyZWF0ZXJfdGhhbiIsIm5ld2VyVmVyc2lvblJlcyIsInN0YXR1cyIsImdldERvY1Blcm1pc3Npb25zIiwiUmVhY3QiLCJkb2NBY2Nlc3NVUkwiLCJwYXJhbXMiLCJlIiwiY29uc29sZSIsImVycm9yIiwiZ2V0RG9jUHJlZmVyZW5jZXMiLCJzZXREb2NGaWVsZFByZWZlcmVuY2VzIiwicGF0aCIsImZpZWxkUHJlZmVyZW5jZXMiLCJhbGxQcmVmZXJlbmNlcyIsImZpZWxkcyIsInVzZUVmZmVjdCIsInZhbHVlIiwiUHJvdmlkZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0lBcUJhQSxvQkFBb0I7ZUFBcEJBOztJQUZBQyxlQUFlO2VBQWZBOzs7MkRBbkJFOytEQUNvRTs4QkFDcEQ7Z0NBQ0w7c0JBU0Y7d0JBQ0U7d0JBQ0E7NkJBQ0s7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRS9CLE1BQU1DLHdCQUFVQyxJQUFBQSxvQkFBYSxFQUFDLENBQUM7QUFFeEIsTUFBTUYsa0JBQWtCLElBQW1CRyxJQUFBQSxpQkFBVSxFQUFDRjtBQUV0RCxNQUFNRix1QkFBd0MsQ0FBQyxFQUNwREssSUFBSUMsV0FBVyxFQUNmQyxRQUFRLEVBQ1JDLFVBQVUsRUFDVkMsTUFBTSxFQUNOQyxjQUFjQyxlQUFlLEVBQzlCO0lBQ0MsTUFBTSxFQUFFTixJQUFJSyxZQUFZLEVBQUUsR0FBR0UsSUFBQUEseUJBQVM7SUFDdEMsTUFBTVAsS0FBS0MsZUFBZ0JLLENBQUFBLGtCQUFrQkQsZUFBZSxJQUFHO0lBRS9ELE1BQU0sRUFDSkcsUUFBUSxFQUFFQyxHQUFHLEVBQUUsRUFDZkMsU0FBUyxFQUNWLEdBQUdDLElBQUFBLGlCQUFTO0lBQ2IsTUFBTSxF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