@nlabs/gothamjs
Version:
Platform
155 lines (154 loc) • 21.4 kB
JavaScript
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
/**
* Copyright (c) 2025-Present, Nitrogen Labs, Inc.
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
*/ import { forwardRef, useEffect, useMemo, useRef, useState } from 'react';
import { Controller, useFormContext } from 'react-hook-form';
import { useIsMobile } from '../../hooks/useIsMobile.js';
import { getOutlineClasses } from '../../utils/colorUtils.js';
import { ErrorMessage } from '../ErrorMessage/ErrorMessage.js';
import { InputField } from '../InputField/InputField.js';
import { Label } from '../Label/Label.js';
import { DatePicker } from './DatePicker.js';
export const DateField = /*#__PURE__*/ forwardRef(({ className = 'w-full rounded-md outline-1 outline-solid focus:outline-3 px-3.5 py-2 text-black dark:text-white placeholder:text-black/50 dark:placeholder:text-white/50 sm:text-sm sm:leading-6', color = 'primary', defaultValue, disabled = false, error: externalError, label = '', labelClass = 'mb-1', labelColor = 'neutral', maxDate, minDate, name, onChange, type = 'text', value, ...props }, ref)=>{
const isMobile = useIsMobile();
const { control, formState: { errors }, clearErrors, trigger } = useFormContext();
const formError = errors?.[name];
const hasError = !!formError || !!externalError;
const [isPickerVisible, setIsPickerVisible] = useState(false);
const pickerRef = useRef(null);
const inputRef = useRef(null);
const outlineClasses = useMemo(()=>getOutlineClasses(hasError ? 'error' : color, {
hasFocus: true,
hasHover: true
}), [
color,
hasError
]);
const inputClasses = [
'bg-white/30 dark:bg-black/30',
disabled ? 'text-neutral/30 dark:text-neutral-dark/30 outline-neutral/30 dark:outline-neutral-dark/30' : outlineClasses,
className
].filter(Boolean).join(' ');
useEffect(()=>{
if (ref && typeof ref === 'object' && inputRef.current) {
ref.current = inputRef.current;
}
}, [
ref,
inputRef.current
]);
const ensureDateInRange = (timestamp)=>{
if (!timestamp) return timestamp;
if (minDate && timestamp < minDate) {
return minDate;
}
if (maxDate && timestamp > maxDate) {
return maxDate;
}
return timestamp;
};
const formatDateForInput = (timestamp)=>{
return new Date(timestamp).toISOString().split('T')[0];
};
const parseInputDate = (dateString)=>{
return new Date(dateString).getTime();
};
const isDateValid = (timestamp)=>{
if (minDate && timestamp < minDate) {
return false;
}
if (maxDate && timestamp > maxDate) {
return false;
}
return true;
};
useEffect(()=>{
const handleClickOutside = (event)=>{
if (pickerRef.current && !pickerRef.current.contains(event.target) && inputRef.current && !inputRef.current.contains(event.target)) {
setIsPickerVisible(false);
}
};
document.addEventListener('mousedown', handleClickOutside);
return ()=>{
document.removeEventListener('mousedown', handleClickOutside);
};
}, []);
return /*#__PURE__*/ _jsx(Controller, {
control: control,
name: name,
defaultValue: value || ensureDateInRange(defaultValue || new Date().getTime()),
render: ({ field })=>/*#__PURE__*/ _jsxs("div", {
className: "flex flex-col w-full",
ref: ref,
children: [
/*#__PURE__*/ _jsx(Label, {
className: labelClass,
color: labelColor,
hasError: hasError,
label: label,
name: name
}),
/*#__PURE__*/ _jsxs("div", {
className: "relative",
children: [
/*#__PURE__*/ _jsx(InputField, {
...props,
ref: inputRef,
disabled: disabled,
value: formatDateForInput(field.value),
onChange: (changeEvent)=>{
const timestamp = parseInputDate(changeEvent.target.value);
field.onChange(timestamp);
if (isDateValid(timestamp)) {
clearErrors(name);
trigger(name);
}
if (onChange) {
onChange(timestamp);
}
},
onFocus: ()=>{
if (!isMobile) {
setIsPickerVisible(true);
}
},
onBlur: ()=>{
// Validate on blur
trigger(name);
},
className: inputClasses,
type: isMobile ? 'date' : type,
min: minDate ? formatDateForInput(minDate) : undefined,
max: maxDate ? formatDateForInput(maxDate) : undefined
}),
isPickerVisible && !disabled && !isMobile && /*#__PURE__*/ _jsx("div", {
ref: pickerRef,
className: "absolute z-10 mt-1",
children: /*#__PURE__*/ _jsx(DatePicker, {
initialDate: field.value,
minDate: minDate,
maxDate: maxDate,
onDateSelect: (timestamp)=>{
field.onChange(timestamp);
if (isDateValid(timestamp)) {
clearErrors(name);
trigger(name);
}
if (onChange) {
onChange(timestamp);
}
setIsPickerVisible(false);
}
})
}),
/*#__PURE__*/ _jsx(ErrorMessage, {
message: formError?.message
})
]
})
]
})
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L2dvdGhhbWpzL3NyYy9jb21wb25lbnRzL0RhdGVGaWVsZC9EYXRlRmllbGQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI1LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2ZvcndhcmRSZWYsIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtDb250cm9sbGVyLCB1c2VGb3JtQ29udGV4dH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHt1c2VJc01vYmlsZX0gZnJvbSAnLi4vLi4vaG9va3MvdXNlSXNNb2JpbGUuanMnO1xuaW1wb3J0IHtnZXRPdXRsaW5lQ2xhc3Nlc30gZnJvbSAnLi4vLi4vdXRpbHMvY29sb3JVdGlscy5qcyc7XG5pbXBvcnQge0Vycm9yTWVzc2FnZX0gZnJvbSAnLi4vRXJyb3JNZXNzYWdlL0Vycm9yTWVzc2FnZS5qcyc7XG5pbXBvcnQge0lucHV0RmllbGQsIHR5cGUgSW5wdXRGaWVsZFByb3BzfSBmcm9tICcuLi9JbnB1dEZpZWxkL0lucHV0RmllbGQuanMnO1xuaW1wb3J0IHtMYWJlbH0gZnJvbSAnLi4vTGFiZWwvTGFiZWwuanMnO1xuaW1wb3J0IHtEYXRlUGlja2VyfSBmcm9tICcuL0RhdGVQaWNrZXIuanMnO1xuXG5pbXBvcnQgdHlwZSB7R290aGFtQ29sb3J9IGZyb20gJy4uLy4uL3V0aWxzL2NvbG9yVXRpbHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVGaWVsZFByb3BzIGV4dGVuZHMgUmVhY3QuSW5wdXRIVE1MQXR0cmlidXRlczxIVE1MSW5wdXRFbGVtZW50PiB7XG4gIHJlYWRvbmx5IGNsYXNzTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgY29sb3I/OiBHb3RoYW1Db2xvcjtcbiAgcmVhZG9ubHkgZGVmYXVsdFZhbHVlPzogbnVtYmVyO1xuICByZWFkb25seSBkaXNhYmxlZD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGxhYmVsPzogc3RyaW5nO1xuICByZWFkb25seSBsYWJlbENsYXNzPzogc3RyaW5nO1xuICByZWFkb25seSBsYWJlbENvbG9yPzogR290aGFtQ29sb3I7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZXJyb3I/OiBib29sZWFuO1xuICByZWFkb25seSBlcnJvckNvbG9yPzogR290aGFtQ29sb3I7XG4gIHJlYWRvbmx5IG1heERhdGU/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG1pbkRhdGU/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG9uQ2hhbmdlPzogKGRhdGUpID0+IHZvaWQ7XG4gIHJlYWRvbmx5IHZhbHVlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgRGF0ZUZpZWxkID0gZm9yd2FyZFJlZjxIVE1MSW5wdXRFbGVtZW50LCBEYXRlRmllbGRQcm9wcz4oKHtcbiAgY2xhc3NOYW1lID0gJ3ctZnVsbCByb3VuZGVkLW1kIG91dGxpbmUtMSBvdXRsaW5lLXNvbGlkIGZvY3VzOm91dGxpbmUtMyBweC0zLjUgcHktMiB0ZXh0LWJsYWNrIGRhcms6dGV4dC13aGl0ZSBwbGFjZWhvbGRlcjp0ZXh0LWJsYWNrLzUwIGRhcms6cGxhY2Vob2xkZXI6dGV4dC13aGl0ZS81MCBzbTp0ZXh0LXNtIHNtOmxlYWRpbmctNicsXG4gIGNvbG9yID0gJ3ByaW1hcnknLFxuICBkZWZhdWx0VmFsdWUsXG4gIGRpc2FibGVkID0gZmFsc2UsXG4gIGVycm9yOiBleHRlcm5hbEVycm9yLFxuICBsYWJlbCA9ICcnLFxuICBsYWJlbENsYXNzID0gJ21iLTEnLFxuICBsYWJlbENvbG9yID0gJ25ldXRyYWwnLFxuICBtYXhEYXRlLFxuICBtaW5EYXRlLFxuICBuYW1lLFxuICBvbkNoYW5nZSxcbiAgdHlwZSA9ICd0ZXh0JyxcbiAgdmFsdWUsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgY29uc3QgaXNNb2JpbGUgPSB1c2VJc01vYmlsZSgpO1xuICBjb25zdCB7Y29udHJvbCwgZm9ybVN0YXRlOiB7ZXJyb3JzfSwgY2xlYXJFcnJvcnMsIHRyaWdnZXJ9ID0gdXNlRm9ybUNvbnRleHQoKTtcbiAgY29uc3QgZm9ybUVycm9yID0gZXJyb3JzPy5bbmFtZV07XG4gIGNvbnN0IGhhc0Vycm9yID0gISFmb3JtRXJyb3IgfHwgISFleHRlcm5hbEVycm9yO1xuICBjb25zdCBbaXNQaWNrZXJWaXNpYmxlLCBzZXRJc1BpY2tlclZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBwaWNrZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBpbnB1dFJlZiA9IHVzZVJlZjxIVE1MSW5wdXRFbGVtZW50PihudWxsKTtcbiAgY29uc3Qgb3V0bGluZUNsYXNzZXMgPSB1c2VNZW1vKFxuICAgICgpID0+IGdldE91dGxpbmVDbGFzc2VzKGhhc0Vycm9yID8gJ2Vycm9yJyA6IGNvbG9yLCB7aGFzRm9jdXM6IHRydWUsIGhhc0hvdmVyOiB0cnVlfSksXG4gICAgW2NvbG9yLCBoYXNFcnJvcl1cbiAgKTtcbiAgY29uc3QgaW5wdXRDbGFzc2VzID0gW1xuICAgICdiZy13aGl0ZS8zMCBkYXJrOmJnLWJsYWNrLzMwJyxcbiAgICBkaXNhYmxlZCA/ICd0ZXh0LW5ldXRyYWwvMzAgZGFyazp0ZXh0LW5ldXRyYWwtZGFyay8zMCBvdXRsaW5lLW5ldXRyYWwvMzAgZGFyazpvdXRsaW5lLW5ldXRyYWwtZGFyay8zMCcgOiBvdXRsaW5lQ2xhc3NlcyxcbiAgICBjbGFzc05hbWVcbiAgXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHJlZiAmJiB0eXBlb2YgcmVmID09PSAnb2JqZWN0JyAmJiBpbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICByZWYuY3VycmVudCA9IGlucHV0UmVmLmN1cnJlbnQ7XG4gICAgfVxuICB9LCBbcmVmLCBpbnB1dFJlZi5jdXJyZW50XSk7XG5cbiAgY29uc3QgZW5zdXJlRGF0ZUluUmFuZ2UgPSAodGltZXN0YW1wOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgIGlmICghdGltZXN0YW1wKSByZXR1cm4gdGltZXN0YW1wO1xuXG4gICAgaWYgKG1pbkRhdGUgJiYgdGltZXN0YW1wIDwgbWluRGF0ZSkge1xuICAgICAgcmV0dXJuIG1pbkRhdGU7XG4gICAgfVxuXG4gICAgaWYgKG1heERhdGUgJiYgdGltZXN0YW1wID4gbWF4RGF0ZSkge1xuICAgICAgcmV0dXJuIG1heERhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRpbWVzdGFtcDtcbiAgfTtcblxuICBjb25zdCBmb3JtYXREYXRlRm9ySW5wdXQgPSAodGltZXN0YW1wOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aW1lc3RhbXApLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTtcbiAgfTtcblxuICBjb25zdCBwYXJzZUlucHV0RGF0ZSA9IChkYXRlU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlU3RyaW5nKS5nZXRUaW1lKCk7XG4gIH07XG5cbiAgY29uc3QgaXNEYXRlVmFsaWQgPSAodGltZXN0YW1wOiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICBpZiAobWluRGF0ZSAmJiB0aW1lc3RhbXAgPCBtaW5EYXRlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChtYXhEYXRlICYmIHRpbWVzdGFtcCA+IG1heERhdGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVDbGlja091dHNpZGUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgcGlja2VyUmVmLmN1cnJlbnQgJiZcbiAgICAgICAgIXBpY2tlclJlZi5jdXJyZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSAmJlxuICAgICAgICBpbnB1dFJlZi5jdXJyZW50ICYmXG4gICAgICAgICFpbnB1dFJlZi5jdXJyZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKVxuICAgICAgKSB7XG4gICAgICAgIHNldElzUGlja2VyVmlzaWJsZShmYWxzZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGhhbmRsZUNsaWNrT3V0c2lkZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGhhbmRsZUNsaWNrT3V0c2lkZSk7XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIHJldHVybiAoXG4gICAgPENvbnRyb2xsZXJcbiAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gICAgICBuYW1lPXtuYW1lfVxuICAgICAgZGVmYXVsdFZhbHVlPXt2YWx1ZSB8fCBlbnN1cmVEYXRlSW5SYW5nZShkZWZhdWx0VmFsdWUgfHwgbmV3IERhdGUoKS5nZXRUaW1lKCkpfVxuICAgICAgcmVuZGVyPXsoe2ZpZWxkfSkgPT4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgdy1mdWxsXCIgcmVmPXtyZWZ9PlxuICAgICAgICAgIDxMYWJlbFxuICAgICAgICAgICAgY2xhc3NOYW1lPXtsYWJlbENsYXNzfVxuICAgICAgICAgICAgY29sb3I9e2xhYmVsQ29sb3J9XG4gICAgICAgICAgICBoYXNFcnJvcj17aGFzRXJyb3J9XG4gICAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgICBuYW1lPXtuYW1lfSAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmVcIj5cbiAgICAgICAgICAgIDxJbnB1dEZpZWxkXG4gICAgICAgICAgICAgIHsuLi5wcm9wcyBhcyBPbWl0PElucHV0RmllbGRQcm9wcywgJ29uQ2hhbmdlJz59XG4gICAgICAgICAgICAgIHJlZj17aW5wdXRSZWZ9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgdmFsdWU9e2Zvcm1hdERhdGVGb3JJbnB1dChmaWVsZC52YWx1ZSl9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoY2hhbmdlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBwYXJzZUlucHV0RGF0ZShjaGFuZ2VFdmVudC50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgIGZpZWxkLm9uQ2hhbmdlKHRpbWVzdGFtcCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNEYXRlVmFsaWQodGltZXN0YW1wKSkge1xuICAgICAgICAgICAgICAgICAgY2xlYXJFcnJvcnMobmFtZSk7XG4gICAgICAgICAgICAgICAgICB0cmlnZ2VyKG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgb25DaGFuZ2UodGltZXN0YW1wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIG9uRm9jdXM9eygpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTW9iaWxlKSB7XG4gICAgICAgICAgICAgICAgICBzZXRJc1BpY2tlclZpc2libGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBvbkJsdXI9eygpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSBvbiBibHVyXG4gICAgICAgICAgICAgICAgdHJpZ2dlcihuYW1lKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtpbnB1dENsYXNzZXN9XG4gICAgICAgICAgICAgIHR5cGU9e2lzTW9iaWxlID8gJ2RhdGUnIDogdHlwZX1cbiAgICAgICAgICAgICAgbWluPXttaW5EYXRlID8gZm9ybWF0RGF0ZUZvcklucHV0KG1pbkRhdGUpIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICBtYXg9e21heERhdGUgPyBmb3JtYXREYXRlRm9ySW5wdXQobWF4RGF0ZSkgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAge2lzUGlja2VyVmlzaWJsZSAmJiAhZGlzYWJsZWQgJiYgIWlzTW9iaWxlICYmIChcbiAgICAgICAgICAgICAgPGRpdiByZWY9e3BpY2tlclJlZn0gY2xhc3NOYW1lPVwiYWJzb2x1dGUgei0xMCBtdC0xXCI+XG4gICAgICAgICAgICAgICAgPERhdGVQaWNrZXJcbiAgICAgICAgICAgICAgICAgIGluaXRpYWxEYXRlPXtmaWVsZC52YWx1ZX1cbiAgICAgICAgICAgICAgICAgIG1pbkRhdGU9e21pbkRhdGV9XG4gICAgICAgICAgICAgICAgICBtYXhEYXRlPXttYXhEYXRlfVxuICAgICAgICAgICAgICAgICAgb25EYXRlU2VsZWN0PXsodGltZXN0YW1wKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLm9uQ2hhbmdlKHRpbWVzdGFtcCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRGF0ZVZhbGlkKHRpbWVzdGFtcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjbGVhckVycm9ycyhuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UodGltZXN0YW1wKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZXRJc1BpY2tlclZpc2libGUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8RXJyb3JNZXNzYWdlIG1lc3NhZ2U9e2Zvcm1FcnJvcj8ubWVzc2FnZSBhcyBzdHJpbmd9IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICAvPlxuICApO1xufSk7Il0sIm5hbWVzIjpbImZvcndhcmRSZWYiLCJ1c2VFZmZlY3QiLCJ1c2VNZW1vIiwidXNlUmVmIiwidXNlU3RhdGUiLCJDb250cm9sbGVyIiwidXNlRm9ybUNvbnRleHQiLCJ1c2VJc01vYmlsZSIsImdldE91dGxpbmVDbGFzc2VzIiwiRXJyb3JNZXNzYWdlIiwiSW5wdXRGaWVsZCIsIkxhYmVsIiwiRGF0ZVBpY2tlciIsIkRhdGVGaWVsZCIsImNsYXNzTmFtZSIsImNvbG9yIiwiZGVmYXVsdFZhbHVlIiwiZGlzYWJsZWQiLCJlcnJvciIsImV4dGVybmFsRXJyb3IiLCJsYWJlbCIsImxhYmVsQ2xhc3MiLCJsYWJlbENvbG9yIiwibWF4RGF0ZSIsIm1pbkRhdGUiLCJuYW1lIiwib25DaGFuZ2UiLCJ0eXBlIiwidmFsdWUiLCJwcm9wcyIsInJlZiIsImlzTW9iaWxlIiwiY29udHJvbCIsImZvcm1TdGF0ZSIsImVycm9ycyIsImNsZWFyRXJyb3JzIiwidHJpZ2dlciIsImZvcm1FcnJvciIsImhhc0Vycm9yIiwiaXNQaWNrZXJWaXNpYmxlIiwic2V0SXNQaWNrZXJWaXNpYmxlIiwicGlja2VyUmVmIiwiaW5wdXRSZWYiLCJvdXRsaW5lQ2xhc3NlcyIsImhhc0ZvY3VzIiwiaGFzSG92ZXIiLCJpbnB1dENsYXNzZXMiLCJmaWx0ZXIiLCJCb29sZWFuIiwiam9pbiIsImN1cnJlbnQiLCJlbnN1cmVEYXRlSW5SYW5nZSIsInRpbWVzdGFtcCIsImZvcm1hdERhdGVGb3JJbnB1dCIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsInNwbGl0IiwicGFyc2VJbnB1dERhdGUiLCJkYXRlU3RyaW5nIiwiZ2V0VGltZSIsImlzRGF0ZVZhbGlkIiwiaGFuZGxlQ2xpY2tPdXRzaWRlIiwiZXZlbnQiLCJjb250YWlucyIsInRhcmdldCIsImRvY3VtZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJyZW5kZXIiLCJmaWVsZCIsImRpdiIsImNoYW5nZUV2ZW50Iiwib25Gb2N1cyIsIm9uQmx1ciIsIm1pbiIsInVuZGVmaW5lZCIsIm1heCIsImluaXRpYWxEYXRlIiwib25EYXRlU2VsZWN0IiwibWVzc2FnZSJdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLFVBQVUsRUFBRUMsU0FBUyxFQUFFQyxPQUFPLEVBQUVDLE1BQU0sRUFBRUMsUUFBUSxRQUFPLFFBQVE7QUFDdkUsU0FBUUMsVUFBVSxFQUFFQyxjQUFjLFFBQU8sa0JBQWtCO0FBRTNELFNBQVFDLFdBQVcsUUFBTyw2QkFBNkI7QUFDdkQsU0FBUUMsaUJBQWlCLFFBQU8sNEJBQTRCO0FBQzVELFNBQVFDLFlBQVksUUFBTyxrQ0FBa0M7QUFDN0QsU0FBUUMsVUFBVSxRQUE2Qiw4QkFBOEI7QUFDN0UsU0FBUUMsS0FBSyxRQUFPLG9CQUFvQjtBQUN4QyxTQUFRQyxVQUFVLFFBQU8sa0JBQWtCO0FBcUIzQyxPQUFPLE1BQU1DLDBCQUFZYixXQUE2QyxDQUFDLEVBQ3JFYyxZQUFZLG1MQUFtTCxFQUMvTEMsUUFBUSxTQUFTLEVBQ2pCQyxZQUFZLEVBQ1pDLFdBQVcsS0FBSyxFQUNoQkMsT0FBT0MsYUFBYSxFQUNwQkMsUUFBUSxFQUFFLEVBQ1ZDLGFBQWEsTUFBTSxFQUNuQkMsYUFBYSxTQUFTLEVBQ3RCQyxPQUFPLEVBQ1BDLE9BQU8sRUFDUEMsSUFBSSxFQUNKQyxRQUFRLEVBQ1JDLE9BQU8sTUFBTSxFQUNiQyxLQUFLLEVBQ0ws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