merchi_product_form
Version:
A React component for Merchi product forms
238 lines (237 loc) • 33.2 kB
JavaScript
'use client';
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
import * as React from 'react';
import { useState } from 'react';
import { isBoolean, isArray } from 'lodash';
import { IconFile } from './icons';
import { allowedFileTypes } from './utils';
import DropzoneInput from './DropzoneInput';
import InputHiddenStatic from './InputHiddenStatic';
import VariationError from './VariationError';
import VariationLabel from './VariationLabel';
import Collapse from './Collapse';
import { useFieldArray } from 'react-hook-form';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faChevronDown, faChevronUp, faCircleNotch, faDownload, faTimes, faTrashAlt } from '@fortawesome/free-solid-svg-icons';
import { useMerchiFormContext } from '../context/MerchiProductFormProvider';
import { jsx as _jsx } from "react/jsx-runtime";
import { jsxs as _jsxs } from "react/jsx-runtime";
import { Fragment as _Fragment } from "react/jsx-runtime";
var LoadingIcon = function LoadingIcon() {
return /*#__PURE__*/_jsx(FontAwesomeIcon, {
icon: faCircleNotch,
spin: true
});
};
function FileListItem(_ref) {
var file = _ref.file,
disabled = _ref.disabled,
doDelete = _ref.doDelete,
loading = _ref.loading;
var _useMerchiFormContext = useMerchiFormContext(),
classNameFileListItem = _useMerchiFormContext.classNameFileListItem,
classNameFileButtonDownload = _useMerchiFormContext.classNameFileButtonDownload,
classNameFileButtonDelete = _useMerchiFormContext.classNameFileButtonDelete;
return /*#__PURE__*/_jsx("li", {
className: classNameFileListItem,
children: /*#__PURE__*/_jsxs("div", {
style: {
display: 'flex',
alignItems: 'center',
justifyContent: 'center'
},
children: [/*#__PURE__*/_jsx("span", {
className: "ml-3",
children: file.name
}), !disabled && /*#__PURE__*/_jsxs("div", {
style: {
marginLeft: 'auto'
},
children: [/*#__PURE__*/_jsx("a", {
className: classNameFileButtonDownload,
href: file.downloadUrl,
download: true,
children: /*#__PURE__*/_jsx(FontAwesomeIcon, {
icon: faDownload
})
}), doDelete && /*#__PURE__*/_jsx("button", {
className: classNameFileButtonDelete,
onClick: doDelete,
disabled: Boolean(loading),
children: loading ? /*#__PURE__*/_jsx(LoadingIcon, {}) : /*#__PURE__*/_jsx(FontAwesomeIcon, {
icon: faTrashAlt
})
})]
})]
})
});
}
function VariationFilesList(_ref2) {
var files = _ref2.files;
var _useMerchiFormContext2 = useMerchiFormContext(),
classNameFileListItemContainer = _useMerchiFormContext2.classNameFileListItemContainer;
return /*#__PURE__*/_jsx("ul", {
className: classNameFileListItemContainer,
children: files.map(function (f, i) {
return /*#__PURE__*/_jsx(FileListItem, {
file: f
}, "".concat(i, "-publicfile"));
})
});
}
function determineBoolean(value) {
return isBoolean(value) ? value : value === 'true' ? true : false;
}
function VariationFile(_ref3) {
var deleteVariationFile = _ref3.deleteVariationFile,
file = _ref3.file,
index = _ref3.index,
inputName = _ref3.inputName;
var _useMerchiFormContext3 = useMerchiFormContext(),
classNameFilePreviewContainer = _useMerchiFormContext3.classNameFilePreviewContainer,
classNameFilePreviewIconWrapper = _useMerchiFormContext3.classNameFilePreviewIconWrapper;
return /*#__PURE__*/_jsxs("div", {
className: classNameFilePreviewContainer,
onClick: function onClick() {
return deleteVariationFile(file);
},
children: [/*#__PURE__*/_jsx("div", {
className: classNameFilePreviewIconWrapper,
onClick: function onClick() {
return deleteVariationFile(file);
},
children: /*#__PURE__*/_jsx(FontAwesomeIcon, {
icon: faTimes,
className: "close-icon"
})
}), /*#__PURE__*/_jsx(IconFile, {
file: file
}), /*#__PURE__*/_jsx(InputHiddenStatic, {
name: "".concat(inputName, "[").concat(index, "].id"),
rules: {
required: true
},
value: file.id
})]
});
}
function ButtonUploadedFiles(_ref4) {
var files = _ref4.files,
isOpen = _ref4.isOpen,
onClick = _ref4.onClick;
var hasFiles = Array.isArray(files) && files.length > 0;
var text = files.length !== 1 ? "".concat(files.length, " files selected") : '1 file selected';
var icon = isOpen ? faChevronUp : faChevronDown;
var _useMerchiFormContext4 = useMerchiFormContext(),
classNameFileUploadButton = _useMerchiFormContext4.classNameFileUploadButton;
return /*#__PURE__*/_jsxs("button", {
type: "button",
className: classNameFileUploadButton,
disabled: files.length === 0,
onClick: onClick,
children: [hasFiles ? text : 'No files selected', ' ', hasFiles && /*#__PURE__*/_jsx(FontAwesomeIcon, {
icon: icon
})]
});
}
function VariationFileInput(_ref5) {
var disabled = _ref5.disabled,
name = _ref5.name,
variation = _ref5.variation;
var _useMerchiFormContext5 = useMerchiFormContext(),
classNameFileUploadContainer = _useMerchiFormContext5.classNameFileUploadContainer,
control = _useMerchiFormContext5.control;
var inputName = "".concat(name, ".variationFiles");
var variationField = variation.variationField;
var allowFileMultiple = variationField.allowFileMultiple,
placeholder = variationField.placeholder,
required = variationField.required,
showFilePreview = variationField.showFilePreview;
var _useFieldArray = useFieldArray({
control: control,
keyName: 'fileId',
name: inputName,
rules: {
required: required
}
}),
append = _useFieldArray.append,
fields = _useFieldArray.fields,
remove = _useFieldArray.remove;
var hasFiles = isArray(fields) && fields.length;
var _useState = useState(Boolean(hasFiles)),
_useState2 = _slicedToArray(_useState, 2),
isOpen = _useState2[0],
setIsOpen = _useState2[1];
var toggle = function toggle() {
return setIsOpen(!isOpen);
};
var _allowFileMultiple = determineBoolean(allowFileMultiple);
var _showFilePreview = determineBoolean(showFilePreview);
function handleUploadSuccess(fs) {
if (_allowFileMultiple) {
append(fs);
} else {
if (hasFiles) remove(0);
append(fs[0]);
}
}
return /*#__PURE__*/_jsxs("div", {
className: classNameFileUploadContainer,
children: [/*#__PURE__*/_jsx(VariationLabel, {
variationClassName: "merchi-embed-form_input-file",
name: name,
variation: variation
}), /*#__PURE__*/_jsx(DropzoneInput, {
accept: allowedFileTypes(variationField),
disabled: disabled,
multiple: allowFileMultiple,
onUploadSuccess: handleUploadSuccess,
placeholder: placeholder
}), /*#__PURE__*/_jsx(VariationError, {
name: name
}), /*#__PURE__*/_jsx("div", {
className: "uploaded-variation-files",
children: fields.map(function (file, index) {
return _showFilePreview ? /*#__PURE__*/_jsx("fieldset", {
className: "d-inline-block mr-2",
children: /*#__PURE__*/_jsx(VariationFile, {
deleteVariationFile: function deleteVariationFile() {
return remove(index);
},
file: file,
index: index,
inputName: inputName
}, "".concat(name, "-file-key-").concat(index))
}, file.fileId) : /*#__PURE__*/_jsx(InputHiddenStatic, {
name: "".concat(inputName, "[").concat(index, "].id"),
rules: {
required: true
},
value: file.id
}, "".concat(name, "-file-key-").concat(index));
})
}), !_showFilePreview && /*#__PURE__*/_jsxs(_Fragment, {
children: [/*#__PURE__*/_jsx(Collapse, {
isOpen: Boolean(isOpen),
children: /*#__PURE__*/_jsx(VariationFilesList, {
files: fields
})
}), /*#__PURE__*/_jsx("div", {
className: "clearfix mb-3",
children: /*#__PURE__*/_jsx(ButtonUploadedFiles, {
files: fields,
isOpen: isOpen,
onClick: toggle
})
})]
})]
});
}
export default VariationFileInput;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc2xpY2VkVG9BcnJheSIsImFyciIsImkiLCJfYXJyYXlXaXRoSG9sZXMiLCJfaXRlcmFibGVUb0FycmF5TGltaXQiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbm9uSXRlcmFibGVSZXN0IiwiVHlwZUVycm9yIiwibyIsIm1pbkxlbiIsIl9hcnJheUxpa2VUb0FycmF5IiwibiIsIk9iamVjdCIsInByb3RvdHlwZSIsInRvU3RyaW5nIiwiY2FsbCIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiQXJyYXkiLCJmcm9tIiwidGVzdCIsImxlbiIsImxlbmd0aCIsImFycjIiLCJyIiwibCIsInQiLCJTeW1ib2wiLCJpdGVyYXRvciIsImUiLCJ1IiwiYSIsImYiLCJuZXh0IiwiZG9uZSIsInB1c2giLCJ2YWx1ZSIsImlzQXJyYXkiLCJSZWFjdCIsInVzZVN0YXRlIiwiaXNCb29sZWFuIiwiSWNvbkZpbGUiLCJhbGxvd2VkRmlsZVR5cGVzIiwiRHJvcHpvbmVJbnB1dCIsIklucHV0SGlkZGVuU3RhdGljIiwiVmFyaWF0aW9uRXJyb3IiLCJWYXJpYXRpb25MYWJlbCIsIkNvbGxhcHNlIiwidXNlRmllbGRBcnJheSIsIkZvbnRBd2Vzb21lSWNvbiIsImZhQ2hldnJvbkRvd24iLCJmYUNoZXZyb25VcCIsImZhQ2lyY2xlTm90Y2giLCJmYURvd25sb2FkIiwiZmFUaW1lcyIsImZhVHJhc2hBbHQiLCJ1c2VNZXJjaGlGb3JtQ29udGV4dCIsImpzeCIsIl9qc3giLCJqc3hzIiwiX2pzeHMiLCJGcmFnbWVudCIsIl9GcmFnbWVudCIsIkxvYWRpbmdJY29uIiwiaWNvbiIsInNwaW4iLCJGaWxlTGlzdEl0ZW0iLCJfcmVmIiwiZmlsZSIsImRpc2FibGVkIiwiZG9EZWxldGUiLCJsb2FkaW5nIiwiX3VzZU1lcmNoaUZvcm1Db250ZXh0IiwiY2xhc3NOYW1lRmlsZUxpc3RJdGVtIiwiY2xhc3NOYW1lRmlsZUJ1dHRvbkRvd25sb2FkIiwiY2xhc3NOYW1lRmlsZUJ1dHRvbkRlbGV0ZSIsImNsYXNzTmFtZSIsImNoaWxkcmVuIiwic3R5bGUiLCJkaXNwbGF5IiwiYWxpZ25JdGVtcyIsImp1c3RpZnlDb250ZW50IiwibWFyZ2luTGVmdCIsImhyZWYiLCJkb3dubG9hZFVybCIsImRvd25sb2FkIiwib25DbGljayIsIkJvb2xlYW4iLCJWYXJpYXRpb25GaWxlc0xpc3QiLCJfcmVmMiIsImZpbGVzIiwiX3VzZU1lcmNoaUZvcm1Db250ZXh0MiIsImNsYXNzTmFtZUZpbGVMaXN0SXRlbUNvbnRhaW5lciIsIm1hcCIsImNvbmNhdCIsImRldGVybWluZUJvb2xlYW4iLCJWYXJpYXRpb25GaWxlIiwiX3JlZjMiLCJkZWxldGVWYXJpYXRpb25GaWxlIiwiaW5kZXgiLCJpbnB1dE5hbWUiLCJfdXNlTWVyY2hpRm9ybUNvbnRleHQzIiwiY2xhc3NOYW1lRmlsZVByZXZpZXdDb250YWluZXIiLCJjbGFzc05hbWVGaWxlUHJldmlld0ljb25XcmFwcGVyIiwicnVsZXMiLCJyZXF1aXJlZCIsImlkIiwiQnV0dG9uVXBsb2FkZWRGaWxlcyIsIl9yZWY0IiwiaXNPcGVuIiwiaGFzRmlsZXMiLCJ0ZXh0IiwiX3VzZU1lcmNoaUZvcm1Db250ZXh0NCIsImNsYXNzTmFtZUZpbGVVcGxvYWRCdXR0b24iLCJ0eXBlIiwiVmFyaWF0aW9uRmlsZUlucHV0IiwiX3JlZjUiLCJ2YXJpYXRpb24iLCJfdXNlTWVyY2hpRm9ybUNvbnRleHQ1IiwiY2xhc3NOYW1lRmlsZVVwbG9hZENvbnRhaW5lciIsImNvbnRyb2wiLCJ2YXJpYXRpb25GaWVsZCIsImFsbG93RmlsZU11bHRpcGxlIiwicGxhY2Vob2xkZXIiLCJzaG93RmlsZVByZXZpZXciLCJfdXNlRmllbGRBcnJheSIsImtleU5hbWUiLCJhcHBlbmQiLCJmaWVsZHMiLCJyZW1vdmUiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwic2V0SXNPcGVuIiwidG9nZ2xlIiwiX2FsbG93RmlsZU11bHRpcGxlIiwiX3Nob3dGaWxlUHJldmlldyIsImhhbmRsZVVwbG9hZFN1Y2Nlc3MiLCJmcyIsInZhcmlhdGlvbkNsYXNzTmFtZSIsImFjY2VwdCIsIm11bHRpcGxlIiwib25VcGxvYWRTdWNjZXNzIiwiZmlsZUlkIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvVmFyaWF0aW9uRmlsZUlucHV0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaXNCb29sZWFuLCBpc0FycmF5IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEljb25GaWxlIH0gZnJvbSAnLi9pY29ucyc7XG5pbXBvcnQgeyBhbGxvd2VkRmlsZVR5cGVzIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgRHJvcHpvbmVJbnB1dCBmcm9tICcuL0Ryb3B6b25lSW5wdXQnO1xuaW1wb3J0IElucHV0SGlkZGVuU3RhdGljIGZyb20gJy4vSW5wdXRIaWRkZW5TdGF0aWMnO1xuaW1wb3J0IFZhcmlhdGlvbkVycm9yIGZyb20gJy4vVmFyaWF0aW9uRXJyb3InO1xuaW1wb3J0IFZhcmlhdGlvbkxhYmVsIGZyb20gJy4vVmFyaWF0aW9uTGFiZWwnO1xuaW1wb3J0IENvbGxhcHNlIGZyb20gJy4vQ29sbGFwc2UnO1xuaW1wb3J0IHsgdXNlRmllbGRBcnJheSB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyBGb250QXdlc29tZUljb24gfSBmcm9tICdAZm9ydGF3ZXNvbWUvcmVhY3QtZm9udGF3ZXNvbWUnO1xuaW1wb3J0IHtcbiAgZmFDaGV2cm9uRG93bixcbiAgZmFDaGV2cm9uVXAsXG4gIGZhQ2lyY2xlTm90Y2gsXG4gIGZhRG93bmxvYWQsXG4gIGZhVGltZXMsXG4gIGZhVHJhc2hBbHQsXG59IGZyb20gJ0Bmb3J0YXdlc29tZS9mcmVlLXNvbGlkLXN2Zy1pY29ucyc7XG5pbXBvcnQgeyB1c2VNZXJjaGlGb3JtQ29udGV4dCB9IGZyb20gJy4uL2NvbnRleHQvTWVyY2hpUHJvZHVjdEZvcm1Qcm92aWRlcic7XG5cbmNvbnN0IExvYWRpbmdJY29uID0gKCkgPT4gPEZvbnRBd2Vzb21lSWNvbiBpY29uPXtmYUNpcmNsZU5vdGNofSBzcGluIC8+O1xuXG5pbnRlcmZhY2UgUHJvcHNGaWxlTGlzdEl0ZW0ge1xuICBmaWxlOiBhbnk7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgZG9EZWxldGU/OiAoKSA9PiB2b2lkO1xuICBsb2FkaW5nPzogYm9vbGVhbjtcbn1cblxuZnVuY3Rpb24gRmlsZUxpc3RJdGVtKHtcbiAgZmlsZSxcbiAgZGlzYWJsZWQsXG4gIGRvRGVsZXRlLFxuICBsb2FkaW5nLFxufTogUHJvcHNGaWxlTGlzdEl0ZW0pIHtcbiAgY29uc3Qge1xuICAgIGNsYXNzTmFtZUZpbGVMaXN0SXRlbSxcbiAgICBjbGFzc05hbWVGaWxlQnV0dG9uRG93bmxvYWQsXG4gICAgY2xhc3NOYW1lRmlsZUJ1dHRvbkRlbGV0ZSxcbiAgfSA9IHVzZU1lcmNoaUZvcm1Db250ZXh0KCk7XG4gIHJldHVybiAoXG4gICAgPGxpIGNsYXNzTmFtZT17Y2xhc3NOYW1lRmlsZUxpc3RJdGVtfT5cbiAgICAgIDxkaXZcbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9J21sLTMnPntmaWxlLm5hbWV9PC9zcGFuPlxuICAgICAgICB7IWRpc2FibGVkICYmIChcbiAgICAgICAgICA8ZGl2IHN0eWxlPXt7IG1hcmdpbkxlZnQ6ICdhdXRvJyB9fT5cbiAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lRmlsZUJ1dHRvbkRvd25sb2FkfVxuICAgICAgICAgICAgICBocmVmPXtmaWxlLmRvd25sb2FkVXJsfVxuICAgICAgICAgICAgICBkb3dubG9hZFxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8Rm9udEF3ZXNvbWVJY29uIGljb249e2ZhRG93bmxvYWR9IC8+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICB7ZG9EZWxldGUgJiYgKFxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVGaWxlQnV0dG9uRGVsZXRlfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2RvRGVsZXRlfVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXtCb29sZWFuKGxvYWRpbmcpfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICA8TG9hZGluZ0ljb24gLz5cbiAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgPEZvbnRBd2Vzb21lSWNvbiBpY29uPXtmYVRyYXNoQWx0fSAvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvbGk+XG4gICk7XG59XG5cbmludGVyZmFjZSBWYXJpYXRpb25GaWxlc0xpc3RQcm9wcyB7XG4gIGZpbGVzOiBBcnJheTxhbnk+O1xufVxuXG5mdW5jdGlvbiBWYXJpYXRpb25GaWxlc0xpc3QoeyBmaWxlcyB9OiBWYXJpYXRpb25GaWxlc0xpc3RQcm9wcykge1xuICBjb25zdCB7IGNsYXNzTmFtZUZpbGVMaXN0SXRlbUNvbnRhaW5lciB9ID0gdXNlTWVyY2hpRm9ybUNvbnRleHQoKTtcbiAgcmV0dXJuIChcbiAgICA8dWwgY2xhc3NOYW1lPXtjbGFzc05hbWVGaWxlTGlzdEl0ZW1Db250YWluZXJ9PlxuICAgICAge2ZpbGVzLm1hcCgoZjogYW55LCBpOiBudW1iZXIpID0+IChcbiAgICAgICAgPEZpbGVMaXN0SXRlbSBrZXk9e2Ake2l9LXB1YmxpY2ZpbGVgfSBmaWxlPXtmfSAvPlxuICAgICAgKSl9XG4gICAgPC91bD5cbiAgKTtcbn1cblxuZnVuY3Rpb24gZGV0ZXJtaW5lQm9vbGVhbih2YWx1ZTogYW55KSB7XG4gIHJldHVybiBpc0Jvb2xlYW4odmFsdWUpID8gdmFsdWUgOiB2YWx1ZSA9PT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlO1xufVxuXG5pbnRlcmZhY2UgVmFyaWF0aW9uRmlsZVByb3BzIHtcbiAgZGVsZXRlVmFyaWF0aW9uRmlsZTogKGZpbGU6IGFueSkgPT4gdm9pZDtcbiAgZmlsZTogYW55O1xuICBpbmRleDogbnVtYmVyO1xuICBpbnB1dE5hbWU6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gVmFyaWF0aW9uRmlsZSh7XG4gIGRlbGV0ZVZhcmlhdGlvbkZpbGUsXG4gIGZpbGUsXG4gIGluZGV4LFxuICBpbnB1dE5hbWUsXG59OiBWYXJpYXRpb25GaWxlUHJvcHMpIHtcbiAgY29uc3Qge1xuICAgIGNsYXNzTmFtZUZpbGVQcmV2aWV3Q29udGFpbmVyLFxuICAgIGNsYXNzTmFtZUZpbGVQcmV2aWV3SWNvbldyYXBwZXIsXG4gIH0gPSB1c2VNZXJjaGlGb3JtQ29udGV4dCgpO1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lRmlsZVByZXZpZXdDb250YWluZXJ9XG4gICAgICBvbkNsaWNrPXsoKSA9PiBkZWxldGVWYXJpYXRpb25GaWxlKGZpbGUpfVxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVGaWxlUHJldmlld0ljb25XcmFwcGVyfVxuICAgICAgICBvbkNsaWNrPXsoKSA9PiBkZWxldGVWYXJpYXRpb25GaWxlKGZpbGUpfVxuICAgICAgPlxuICAgICAgICA8Rm9udEF3ZXNvbWVJY29uIGljb249e2ZhVGltZXN9IGNsYXNzTmFtZT0nY2xvc2UtaWNvbicgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPEljb25GaWxlIGZpbGU9e2ZpbGV9IC8+XG4gICAgICA8SW5wdXRIaWRkZW5TdGF0aWNcbiAgICAgICAgbmFtZT17YCR7aW5wdXROYW1lfVske2luZGV4fV0uaWRgfVxuICAgICAgICBydWxlcz17eyByZXF1aXJlZDogdHJ1ZSB9fVxuICAgICAgICB2YWx1ZT17ZmlsZS5pZH1cbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmludGVyZmFjZSBCdXR0b25VcGxvYWRlZEZpbGVzUHJvcHMge1xuICBmaWxlczogQXJyYXk8YW55PjtcbiAgaXNPcGVuPzogYm9vbGVhbjtcbiAgb25DbGljazogKCkgPT4gdm9pZDtcbn1cblxuZnVuY3Rpb24gQnV0dG9uVXBsb2FkZWRGaWxlcyh7XG4gIGZpbGVzLFxuICBpc09wZW4sXG4gIG9uQ2xpY2ssXG59OiBCdXR0b25VcGxvYWRlZEZpbGVzUHJvcHMpIHtcbiAgY29uc3QgaGFzRmlsZXMgPSBBcnJheS5pc0FycmF5KGZpbGVzKSAmJiBmaWxlcy5sZW5ndGggPiAwO1xuICBjb25zdCB0ZXh0ID1cbiAgICBmaWxlcy5sZW5ndGggIT09IDEgPyBgJHtmaWxlcy5sZW5ndGh9IGZpbGVzIHNlbGVjdGVkYCA6ICcxIGZpbGUgc2VsZWN0ZWQnO1xuICBjb25zdCBpY29uID0gaXNPcGVuID8gZmFDaGV2cm9uVXAgOiBmYUNoZXZyb25Eb3duO1xuICBjb25zdCB7IGNsYXNzTmFtZUZpbGVVcGxvYWRCdXR0b24gfSA9IHVzZU1lcmNoaUZvcm1Db250ZXh0KCk7XG4gIHJldHVybiAoXG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT0nYnV0dG9uJ1xuICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVGaWxlVXBsb2FkQnV0dG9ufVxuICAgICAgZGlzYWJsZWQ9e2ZpbGVzLmxlbmd0aCA9PT0gMH1cbiAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgPlxuICAgICAge2hhc0ZpbGVzID8gdGV4dCA6ICdObyBmaWxlcyBzZWxlY3RlZCd9eycgJ31cbiAgICAgIHtoYXNGaWxlcyAmJiA8Rm9udEF3ZXNvbWVJY29uIGljb249e2ljb259IC8+fVxuICAgIDwvYnV0dG9uPlxuICApO1xufVxuXG5pbnRlcmZhY2UgUHJvcHMge1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIG5hbWU6IHN0cmluZztcbiAgdmFyaWF0aW9uOiBhbnk7XG59XG5cbmZ1bmN0aW9uIFZhcmlhdGlvbkZpbGVJbnB1dCh7IGRpc2FibGVkLCBuYW1lLCB2YXJpYXRpb24gfTogUHJvcHMpIHtcbiAgY29uc3QgeyBjbGFzc05hbWVGaWxlVXBsb2FkQ29udGFpbmVyLCBjb250cm9sIH0gPSB1c2VNZXJjaGlGb3JtQ29udGV4dCgpO1xuICBjb25zdCBpbnB1dE5hbWUgPSBgJHtuYW1lfS52YXJpYXRpb25GaWxlc2A7XG4gIGNvbnN0IHsgdmFyaWF0aW9uRmllbGQgfSA9IHZhcmlhdGlvbjtcbiAgY29uc3QgeyBhbGxvd0ZpbGVNdWx0aXBsZSwgcGxhY2Vob2xkZXIsIHJlcXVpcmVkLCBzaG93RmlsZVByZXZpZXcgfSA9XG4gICAgdmFyaWF0aW9uRmllbGQ7XG4gIGNvbnN0IHsgYXBwZW5kLCBmaWVsZHMsIHJlbW92ZSB9ID0gdXNlRmllbGRBcnJheSh7XG4gICAgY29udHJvbCxcbiAgICBrZXlOYW1lOiAnZmlsZUlkJyxcbiAgICBuYW1lOiBpbnB1dE5hbWUsXG4gICAgcnVsZXM6IHsgcmVxdWlyZWQgfSxcbiAgfSk7XG4gIGNvbnN0IGhhc0ZpbGVzID0gaXNBcnJheShmaWVsZHMpICYmIGZpZWxkcy5sZW5ndGg7XG4gIGNvbnN0IFtpc09wZW4sIHNldElzT3Blbl0gPSB1c2VTdGF0ZShCb29sZWFuKGhhc0ZpbGVzKSk7XG4gIGNvbnN0IHRvZ2dsZSA9ICgpID0+IHNldElzT3BlbighaXNPcGVuKTtcbiAgY29uc3QgX2FsbG93RmlsZU11bHRpcGxlID0gZGV0ZXJtaW5lQm9vbGVhbihhbGxvd0ZpbGVNdWx0aXBsZSk7XG4gIGNvbnN0IF9zaG93RmlsZVByZXZpZXcgPSBkZXRlcm1pbmVCb29sZWFuKHNob3dGaWxlUHJldmlldyk7XG4gIGZ1bmN0aW9uIGhhbmRsZVVwbG9hZFN1Y2Nlc3MoZnM6IGFueSkge1xuICAgIGlmIChfYWxsb3dGaWxlTXVsdGlwbGUpIHtcbiAgICAgIGFwcGVuZChmcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChoYXNGaWxlcykgcmVtb3ZlKDApO1xuICAgICAgYXBwZW5kKGZzWzBdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lRmlsZVVwbG9hZENvbnRhaW5lcn0+XG4gICAgICA8VmFyaWF0aW9uTGFiZWxcbiAgICAgICAgdmFyaWF0aW9uQ2xhc3NOYW1lPSdtZXJjaGktZW1iZWQtZm9ybV9pbnB1dC1maWxlJ1xuICAgICAgICBuYW1lPXtuYW1lfVxuICAgICAgICB2YXJpYXRpb249e3ZhcmlhdGlvbn1cbiAgICAgIC8+XG4gICAgICA8RHJvcHpvbmVJbnB1dFxuICAgICAgICBhY2NlcHQ9e2FsbG93ZWRGaWxlVHlwZXModmFyaWF0aW9uRmllbGQpfVxuICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgIG11bHRpcGxlPXthbGxvd0ZpbGVNdWx0aXBsZX1cbiAgICAgICAgb25VcGxvYWRTdWNjZXNzPXtoYW5kbGVVcGxvYWRTdWNjZXNzfVxuICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAvPlxuICAgICAgPFZhcmlhdGlvbkVycm9yIG5hbWU9e25hbWV9IC8+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT0ndXBsb2FkZWQtdmFyaWF0aW9uLWZpbGVzJz5cbiAgICAgICAge2ZpZWxkcy5tYXAoKGZpbGU6IGFueSwgaW5kZXg6IG51bWJlcikgPT5cbiAgICAgICAgICBfc2hvd0ZpbGVQcmV2aWV3ID8gKFxuICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzTmFtZT0nZC1pbmxpbmUtYmxvY2sgbXItMicga2V5PXtmaWxlLmZpbGVJZH0+XG4gICAgICAgICAgICAgIDxWYXJpYXRpb25GaWxlXG4gICAgICAgICAgICAgICAga2V5PXtgJHtuYW1lfS1maWxlLWtleS0ke2luZGV4fWB9XG4gICAgICAgICAgICAgICAgZGVsZXRlVmFyaWF0aW9uRmlsZT17KCkgPT4gcmVtb3ZlKGluZGV4KX1cbiAgICAgICAgICAgICAgICBmaWxlPXtmaWxlfVxuICAgICAgICAgICAgICAgIGluZGV4PXtpbmRleH1cbiAgICAgICAgICAgICAgICBpbnB1dE5hbWU9e2lucHV0TmFtZX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxJbnB1dEhpZGRlblN0YXRpY1xuICAgICAgICAgICAgICBrZXk9e2Ake25hbWV9LWZpbGUta2V5LSR7aW5kZXh9YH1cbiAgICAgICAgICAgICAgbmFtZT17YCR7aW5wdXROYW1lfVske2luZGV4fV0uaWRgfVxuICAgICAgICAgICAgICBydWxlcz17eyByZXF1aXJlZDogdHJ1ZSB9fVxuICAgICAgICAgICAgICB2YWx1ZT17ZmlsZS5pZH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKVxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgICB7IV9zaG93RmlsZVByZXZpZXcgJiYgKFxuICAgICAgICA8PlxuICAgICAgICAgIDxDb2xsYXBzZSBpc09wZW49e0Jvb2xlYW4oaXNPcGVuKX0+XG4gICAgICAgICAgICA8VmFyaWF0aW9uRmlsZXNMaXN0IGZpbGVzPXtmaWVsZHN9IC8+XG4gICAgICAgICAgPC9Db2xsYXBzZT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY2xlYXJmaXggbWItMyc+XG4gICAgICAgICAgICA8QnV0dG9uVXBsb2FkZWRGaWxlc1xuICAgICAgICAgICAgICBmaWxlcz17ZmllbGRzfVxuICAgICAgICAgICAgICBpc09wZW49e2lzT3Blbn1cbiAgICAgICAgICAgICAgb25DbGljaz17dG9nZ2xlfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC8+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBWYXJpYXRpb25GaWxlSW5wdXQ7XG4iXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7O0FBQUMsU0FBQUEsZUFBQUMsR0FBQSxFQUFBQyxDQUFBLFdBQUFDLGVBQUEsQ0FBQUYsR0FBQSxLQUFBRyxxQkFBQSxDQUFBSCxHQUFBLEVBQUFDLENBQUEsS0FBQUcsMkJBQUEsQ0FBQUosR0FBQSxFQUFBQyxDQUFBLEtBQUFJLGdCQUFBO0FBQUEsU0FBQUEsaUJBQUEsY0FBQUMsU0FBQTtBQUFBLFNBQUFGLDRCQUFBRyxDQUFBLEVBQUFDLE1BQUEsU0FBQUQsQ0FBQSxxQkFBQUEsQ0FBQSxzQkFBQUUsaUJBQUEsQ0FBQUYsQ0FBQSxFQUFBQyxNQUFBLE9BQUFFLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxTQUFBLENBQUFDLFFBQUEsQ0FBQUMsSUFBQSxDQUFBUCxDQUFBLEVBQUFRLEtBQUEsYUFBQUwsQ0FBQSxpQkFBQUgsQ0FBQSxDQUFBUyxXQUFBLEVBQUFOLENBQUEsR0FBQUgsQ0FBQSxDQUFBUyxXQUFBLENBQUFDLElBQUEsTUFBQVAsQ0FBQSxjQUFBQSxDQUFBLG1CQUFBUSxLQUFBLENBQUFDLElBQUEsQ0FBQVosQ0FBQSxPQUFBRyxDQUFBLCtEQUFBVSxJQUFBLENBQUFWLENBQUEsVUFBQUQsaUJBQUEsQ0FBQUYsQ0FBQSxFQUFBQyxNQUFBO0FBQUEsU0FBQUMsa0JBQUFULEdBQUEsRUFBQXFCLEdBQUEsUUFBQUEsR0FBQSxZQUFBQSxHQUFBLEdBQUFyQixHQUFBLENBQUFzQixNQUFBLEVBQUFELEdBQUEsR0FBQXJCLEdBQUEsQ0FBQXNCLE1BQUEsV0FBQXJCLENBQUEsTUFBQXNCLElBQUEsT0FBQUwsS0FBQSxDQUFBRyxHQUFBLEdBQUFwQixDQUFBLEdBQUFvQixHQUFBLEVBQUFwQixDQUFBLElBQUFzQixJQUFBLENBQUF0QixDQUFBLElBQUFELEdBQUEsQ0FB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