adui
Version:
<div> <img src="https://wxa.wxs.qq.com/mpweb/delivery/legacy/wxadtouch/upload/t1/od834zef_52939fc6.png" style="margin:40px 0 0 -8px; background-color: #fcfcfc; box-shadow: none;" /> </div>
236 lines (199 loc) • 31.5 kB
JavaScript
var _excluded = ["autoFocus", "className", "countHanzi", "defaultValue", "disabled", "id", "intent", "limit", "name", "onBlur", "onChange", "onFocus", "onKeyDown", "onPressEnter", "onScroll", "placeholder", "required", "resize", "size", "theme", "type", "value"];
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
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(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
import React, { forwardRef, useContext, useImperativeHandle, useRef, useState } from "react";
import PropTypes from "prop-types";
import classNames from "classnames";
import warning from "../_util/warning";
import { ConfigContext, getComputedSize } from "../config-provider";
import "./style";
var noop = function noop() {};
var prefix = "adui-channels-input";
var Textarea = forwardRef(function (_ref, ref) {
var _classNames;
var autoFocus = _ref.autoFocus,
className = _ref.className,
countHanzi = _ref.countHanzi,
defaultValue = _ref.defaultValue,
disabled = _ref.disabled,
id = _ref.id,
intent = _ref.intent,
limit = _ref.limit,
name = _ref.name,
onBlur = _ref.onBlur,
onChange = _ref.onChange,
onFocus = _ref.onFocus,
onKeyDown = _ref.onKeyDown,
onPressEnter = _ref.onPressEnter,
onScroll = _ref.onScroll,
placeholder = _ref.placeholder,
required = _ref.required,
resize = _ref.resize,
sizeProp = _ref.size,
theme = _ref.theme,
type = _ref.type,
value = _ref.value,
otherProps = _objectWithoutProperties(_ref, _excluded);
var _useState = useState(false),
_useState2 = _slicedToArray(_useState, 2),
focused = _useState2[0],
setFocused = _useState2[1];
var textareaRef = useRef(null);
var _useContext = useContext(ConfigContext),
sizeContext = _useContext.size;
var size = getComputedSize(sizeProp, sizeContext);
var handleChange = function handleChange(e) {
if (!disabled && onChange) {
var val = e.target.value.replace(/\u0008|\u0009|\u000B|\u000C|\u000D|\u00A0|\u2028|\u2029|\uFEFF/g, "");
onChange(e, val);
}
};
var handleKeyDown = function handleKeyDown(e) {
if (e.key === "Enter" && onPressEnter) {
onPressEnter(e);
}
if (onKeyDown) {
onKeyDown(e);
}
};
var handleBlur = function handleBlur(e) {
setFocused(false);
if (onBlur) {
onBlur(e);
}
};
var handleFocus = function handleFocus(e) {
setFocused(true);
if (onFocus) {
onFocus(e);
}
};
var fixControlledValue = function fixControlledValue(val) {
if (typeof val === "undefined" || val === null) {
return "";
}
return val;
};
var getFormatStrLeng = function getFormatStrLeng(str) {
var len = str.length;
var realLength = 0;
var charCode = -1;
for (var i = 0; i < len; i += 1) {
charCode = str.charCodeAt(i);
if (charCode >= 0 && charCode <= 128) {
realLength += 0.5;
} else {
realLength += 1;
}
}
return Math.ceil(realLength);
};
useImperativeHandle(ref, function () {
return {
input: textareaRef === null || textareaRef === void 0 ? void 0 : textareaRef.current,
handleChange: handleChange,
handleKeyDown: handleKeyDown,
handleBlur: handleBlur,
handleFocus: handleFocus
};
});
var textareaProps = {
autoFocus: autoFocus,
className: "".concat(prefix, "-base"),
disabled: disabled,
id: id,
name: name,
onBlur: handleBlur,
onChange: handleChange,
onFocus: handleFocus,
onKeyDown: handleKeyDown,
onScroll: onScroll,
placeholder: placeholder,
ref: textareaRef,
required: required,
style: {
resize: resize
},
type: type
};
if (value !== null) {
textareaProps.value = fixControlledValue(value);
} else {
textareaProps.defaultValue = fixControlledValue(defaultValue);
}
var length;
if (limit) {
warning(resize === "none", "Input.Textarea", "不允许同时使用 prop `limit` 与 prop `resize`");
if (value) {
length = countHanzi ? getFormatStrLeng(value) : value.length;
} else {
warning(value !== null, "Input.Textarea", "如果要限制字数,必须从外部控制 value。");
length = 0;
}
}
var classSet = classNames(className, "".concat(prefix, "-wrapper"), "".concat(prefix, "-wrapper_textarea"), "".concat(prefix, "-").concat(size), (_classNames = {}, _defineProperty(_classNames, "".concat(prefix, "-").concat(theme), theme), _defineProperty(_classNames, "".concat(prefix, "-disabled"), disabled), _defineProperty(_classNames, "".concat(prefix, "-limited"), !!limit), _defineProperty(_classNames, "".concat(prefix, "-normal"), intent === "normal"), _defineProperty(_classNames, "".concat(prefix, "-primary"), intent === "primary"), _defineProperty(_classNames, "".concat(prefix, "-success"), intent === "success"), _defineProperty(_classNames, "".concat(prefix, "-warning"), intent === "warning"), _defineProperty(_classNames, "".concat(prefix, "-danger"), intent === "danger" || length && limit && length > limit), _defineProperty(_classNames, "".concat(prefix, "-focused"), focused), _classNames));
return React.createElement("div", _extends({
className: classSet
}, otherProps), React.createElement("textarea", textareaProps), !!limit && React.createElement("div", {
className: "".concat(prefix, "-limit")
}, React.createElement("span", null, "".concat(length, "/").concat(limit))));
});
Textarea.propTypes = {
autoFocus: PropTypes.bool,
className: PropTypes.string,
countHanzi: PropTypes.bool,
defaultValue: PropTypes.string,
disabled: PropTypes.bool,
id: PropTypes.string,
intent: PropTypes.oneOf(["normal", "primary", "success", "warning", "danger"]),
limit: PropTypes.number,
name: PropTypes.string,
onBlur: PropTypes.func,
onChange: PropTypes.func,
onFocus: PropTypes.func,
onKeyDown: PropTypes.func,
onPressEnter: PropTypes.func,
onScroll: PropTypes.func,
placeholder: PropTypes.string,
required: PropTypes.bool,
resize: PropTypes.oneOf(["none", "both", "horizontal", "vertical"]),
size: PropTypes.oneOf(["mini", "small", "medium", "large"]),
theme: PropTypes.oneOf([null, "light"]),
type: PropTypes.string,
value: PropTypes.string
};
Textarea.defaultProps = {
autoFocus: false,
className: undefined,
countHanzi: true,
defaultValue: null,
disabled: false,
id: null,
intent: "normal",
limit: null,
name: null,
onBlur: noop,
onChange: noop,
onFocus: noop,
onKeyDown: noop,
onPressEnter: noop,
onScroll: noop,
placeholder: "请输入",
required: false,
resize: "none",
size: "small",
theme: null,
type: null,
value: null
};
Textarea.displayName = "Textarea";
export default Textarea;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsImZvcndhcmRSZWYiLCJ1c2VDb250ZXh0IiwidXNlSW1wZXJhdGl2ZUhhbmRsZSIsInVzZVJlZiIsInVzZVN0YXRlIiwiUHJvcFR5cGVzIiwiY2xhc3NOYW1lcyIsIndhcm5pbmciLCJDb25maWdDb250ZXh0IiwiZ2V0Q29tcHV0ZWRTaXplIiwibm9vcCIsInByZWZpeCIsIlRleHRhcmVhIiwicmVmIiwiYXV0b0ZvY3VzIiwiY2xhc3NOYW1lIiwiY291bnRIYW56aSIsImRlZmF1bHRWYWx1ZSIsImRpc2FibGVkIiwiaWQiLCJpbnRlbnQiLCJsaW1pdCIsIm5hbWUiLCJvbkJsdXIiLCJvbkNoYW5nZSIsIm9uRm9jdXMiLCJvbktleURvd24iLCJvblByZXNzRW50ZXIiLCJvblNjcm9sbCIsInBsYWNlaG9sZGVyIiwicmVxdWlyZWQiLCJyZXNpemUiLCJzaXplUHJvcCIsInNpemUiLCJ0aGVtZSIsInR5cGUiLCJ2YWx1ZSIsIm90aGVyUHJvcHMiLCJmb2N1c2VkIiwic2V0Rm9jdXNlZCIsInRleHRhcmVhUmVmIiwic2l6ZUNvbnRleHQiLCJoYW5kbGVDaGFuZ2UiLCJlIiwidmFsIiwidGFyZ2V0IiwicmVwbGFjZSIsImhhbmRsZUtleURvd24iLCJrZXkiLCJoYW5kbGVCbHVyIiwiaGFuZGxlRm9jdXMiLCJmaXhDb250cm9sbGVkVmFsdWUiLCJnZXRGb3JtYXRTdHJMZW5nIiwic3RyIiwibGVuIiwibGVuZ3RoIiwicmVhbExlbmd0aCIsImNoYXJDb2RlIiwiaSIsImNoYXJDb2RlQXQiLCJNYXRoIiwiY2VpbCIsImlucHV0IiwiY3VycmVudCIsInRleHRhcmVhUHJvcHMiLCJzdHlsZSIsImNsYXNzU2V0IiwicHJvcFR5cGVzIiwiYm9vbCIsInN0cmluZyIsIm9uZU9mIiwibnVtYmVyIiwiZnVuYyIsImRlZmF1bHRQcm9wcyIsInVuZGVmaW5lZCIsImRpc3BsYXlOYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vY29tcG9uZW50cy9jaGFubmVscy1pbnB1dC9UZXh0YXJlYS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7XG4gIGZvcndhcmRSZWYsXG4gIHVzZUNvbnRleHQsXG4gIHVzZUltcGVyYXRpdmVIYW5kbGUsXG4gIHVzZVJlZixcbiAgdXNlU3RhdGUsXG59IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCJcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCJcbmltcG9ydCB3YXJuaW5nIGZyb20gXCIuLi9fdXRpbC93YXJuaW5nXCJcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQsIGdldENvbXB1dGVkU2l6ZSB9IGZyb20gXCIuLi9jb25maWctcHJvdmlkZXJcIlxuaW1wb3J0IFwiLi9zdHlsZVwiXG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fVxuXG5jb25zdCBwcmVmaXggPSBcImFkdWktY2hhbm5lbHMtaW5wdXRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIElUZXh0YXJlYVByb3BzIHtcbiAgW2tleTogc3RyaW5nXTogYW55XG4gIC8qKlxuICAgKiBpbnB1dCDmoIfnrb7ljp/nlJ/lsZ7mgKcgLSBhdXRvRm9jdXNcbiAgICovXG4gIGF1dG9Gb2N1cz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOmZhOWKoOexu+WQjVxuICAgKi9cbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiDmmK/lkKbmjInnhafkuIDkuKrmsYnlrZfnrpcgMiDlrZfmlbDnmoTmlrnlvI/pmZDliLbplb/luqZcbiAgICovXG4gIGNvdW50SGFuemk/OiBib29sZWFuXG4gIC8qKlxuICAgKiDpu5jorqTlgLwgLSDlhoXpg6jpqbHliqhcbiAgICovXG4gIGRlZmF1bHRWYWx1ZT86IHN0cmluZyB8IG51bGxcbiAgLyoqXG4gICAqIOaYr+WQpuemgeeUqFxuICAgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuXG4gIC8qKlxuICAgKiDovpPlhaXmoYbnmoQgaWRcbiAgICovXG4gIGlkPzogc3RyaW5nIHwgbnVsbFxuICAvKipcbiAgICog57G75Z6LXG4gICAqL1xuICBpbnRlbnQ/OiBcIm5vcm1hbFwiIHwgXCJwcmltYXJ5XCIgfCBcInN1Y2Nlc3NcIiB8IFwid2FybmluZ1wiIHwgXCJkYW5nZXJcIlxuICAvKipcbiAgICog6ZmQ5Yi26ZW/5bqmXG4gICAqL1xuICBsaW1pdD86IG51bWJlciB8IG51bGxcbiAgLyoqXG4gICAqIGlucHV0IOagh+etvuWOn+eUn+WxnuaApyAtIG5hbWVcbiAgICovXG4gIG5hbWU/OiBzdHJpbmcgfCBudWxsXG4gIC8qKlxuICAgKiBibHVyIOaXtueahCBoYW5kbGVyXG4gICAqL1xuICBvbkJsdXI/OiAoZTogUmVhY3QuRm9jdXNFdmVudDxIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4gdm9pZFxuICAvKipcbiAgICog5YC85pS55Y+Y5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uQ2hhbmdlPzogKGU6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxUZXh0QXJlYUVsZW1lbnQ+LCB2YWx1ZT86IHN0cmluZykgPT4gdm9pZFxuICAvKipcbiAgICogZm9jdXMg5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uRm9jdXM/OiAoZTogUmVhY3QuRm9jdXNFdmVudDxIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4gdm9pZFxuICAvKipcbiAgICoga2V5ZG93biDml7bnmoQgaGFuZGxlclxuICAgKi9cbiAgb25LZXlEb3duPzogKGU6IFJlYWN0LktleWJvYXJkRXZlbnQ8SFRNTFRleHRBcmVhRWxlbWVudD4pID0+IHZvaWRcbiAgLyoqXG4gICAqIGVudGVyIOaXtueahCBoYW5kbGVyXG4gICAqL1xuICBvblByZXNzRW50ZXI/OiAoZTogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4gdm9pZFxuICAvKipcbiAgICogc2Nyb2xsIOaXtueahCBoYW5kbGVyXG4gICAqL1xuICBvblNjcm9sbD86IChlOiBSZWFjdC5VSUV2ZW50PEhUTUxUZXh0QXJlYUVsZW1lbnQ+KSA9PiB2b2lkXG4gIC8qKlxuICAgKiBwbGFjZWhvbGRlclxuICAgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIGlucHV0IOagh+etvuWOn+eUn+WxnuaApyAtIHJlcXVpcmVkXG4gICAqL1xuICByZXF1aXJlZD86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOaYr+WQpuaUr+aMgeiwg+aVtOWkp+Wwj1xuICAgKi9cbiAgcmVzaXplPzogXCJub25lXCIgfCBcImJvdGhcIiB8IFwiaG9yaXpvbnRhbFwiIHwgXCJ2ZXJ0aWNhbFwiXG4gIC8qKlxuICAgKiDorr7nva7lsLrlr7hcbiAgICovXG4gIHNpemU/OiBcIm1pbmlcIiB8IFwic21hbGxcIiB8IFwibWVkaXVtXCIgfCBcImxhcmdlXCJcbiAgLyoqXG4gICAqIOiuvue9ruS4u+mimFxuICAgKi9cbiAgdGhlbWU/OiBudWxsIHwgXCJsaWdodFwiXG4gIC8qKlxuICAgKiBpbnB1dCDmoIfnrb7ljp/nlJ/lsZ7mgKcgLSB0eXBlXG4gICAqL1xuICB0eXBlPzogc3RyaW5nIHwgbnVsbFxuICAvKipcbiAgICog5YC8IC0g5aSW6YOo5o6n5Yi2XG4gICAqL1xuICB2YWx1ZT86IHN0cmluZyB8IG51bGxcbn1cblxuLyoqXG4gKiDovpPlhaXljLrln5/vvIznlKjkuo7lpJrooYznuq/mlofmnKznvJbovpHjgIJcbiAqL1xuY29uc3QgVGV4dGFyZWE6IFJlYWN0LkZvcndhcmRSZWZFeG90aWNDb21wb25lbnQ8XG4gIElUZXh0YXJlYVByb3BzICYgUmVhY3QuUmVmQXR0cmlidXRlczxhbnk+XG4+ID0gZm9yd2FyZFJlZihcbiAgKFxuICAgIHtcbiAgICAgIGF1dG9Gb2N1cyxcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGNvdW50SGFuemksXG4gICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGlkLFxuICAgICAgaW50ZW50LFxuICAgICAgbGltaXQsXG4gICAgICBuYW1lLFxuICAgICAgb25CbHVyLFxuICAgICAgb25DaGFuZ2UsXG4gICAgICBvbkZvY3VzLFxuICAgICAgb25LZXlEb3duLFxuICAgICAgb25QcmVzc0VudGVyLFxuICAgICAgb25TY3JvbGwsXG4gICAgICBwbGFjZWhvbGRlcixcbiAgICAgIHJlcXVpcmVkLFxuICAgICAgcmVzaXplLFxuICAgICAgc2l6ZTogc2l6ZVByb3AsXG4gICAgICB0aGVtZSxcbiAgICAgIHR5cGUsXG4gICAgICB2YWx1ZSxcbiAgICAgIC4uLm90aGVyUHJvcHNcbiAgICB9OiBJVGV4dGFyZWFQcm9wcyxcbiAgICByZWZcbiAgKSA9PiB7XG4gICAgY29uc3QgW2ZvY3VzZWQsIHNldEZvY3VzZWRdID0gdXNlU3RhdGUoZmFsc2UpXG5cbiAgICBjb25zdCB0ZXh0YXJlYVJlZiA9IHVzZVJlZjxIVE1MVGV4dEFyZWFFbGVtZW50PihudWxsKVxuXG4gICAgY29uc3QgeyBzaXplOiBzaXplQ29udGV4dCB9ID0gdXNlQ29udGV4dChDb25maWdDb250ZXh0KVxuXG4gICAgY29uc3Qgc2l6ZSA9IGdldENvbXB1dGVkU2l6ZShzaXplUHJvcCwgc2l6ZUNvbnRleHQpXG5cbiAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoZTogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTFRleHRBcmVhRWxlbWVudD4pID0+IHtcbiAgICAgIGlmICghZGlzYWJsZWQgJiYgb25DaGFuZ2UpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29udHJvbC1yZWdleCwgbWF4LWxlbiAqL1xuICAgICAgICAvLyAwOCBCYWNrc3BhY2UsIDA5IFRhYiwgMEIg5Z6C55u05Yi26KGo56ymLCAwQyDmjaLpobUsIDBEIOWbnui9piwgQTAg5LiN6Ze05pat56m65qC8LFxuICAgICAgICAvLyAyMDI4LzIwMjkg5YiG6ZqU56ymLCBGRWZmIOWtl+iKgumhuuW6j+agh+iusOOAglxuICAgICAgICBjb25zdCB2YWwgPSBlLnRhcmdldC52YWx1ZS5yZXBsYWNlKFxuICAgICAgICAgIC9cXHUwMDA4fFxcdTAwMDl8XFx1MDAwQnxcXHUwMDBDfFxcdTAwMER8XFx1MDBBMHxcXHUyMDI4fFxcdTIwMjl8XFx1RkVGRi9nLFxuICAgICAgICAgIFwiXCJcbiAgICAgICAgKVxuICAgICAgICBvbkNoYW5nZShlLCB2YWwpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlS2V5RG93biA9IChlOiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxUZXh0QXJlYUVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRW50ZXJcIiAmJiBvblByZXNzRW50ZXIpIHtcbiAgICAgICAgb25QcmVzc0VudGVyKGUpXG4gICAgICB9XG4gICAgICBpZiAob25LZXlEb3duKSB7XG4gICAgICAgIG9uS2V5RG93bihlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZUJsdXIgPSAoZTogUmVhY3QuRm9jdXNFdmVudDxIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4ge1xuICAgICAgc2V0Rm9jdXNlZChmYWxzZSlcbiAgICAgIGlmIChvbkJsdXIpIHtcbiAgICAgICAgb25CbHVyKGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlRm9jdXMgPSAoZTogUmVhY3QuRm9jdXNFdmVudDxIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4ge1xuICAgICAgc2V0Rm9jdXNlZCh0cnVlKVxuICAgICAgaWYgKG9uRm9jdXMpIHtcbiAgICAgICAgb25Gb2N1cyhlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZpeENvbnRyb2xsZWRWYWx1ZSA9ICh2YWw/OiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCB2YWwgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFwiXCJcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxcbiAgICB9XG5cbiAgICBjb25zdCBnZXRGb3JtYXRTdHJMZW5nID0gKHN0cjogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBsZW4gPSBzdHIubGVuZ3RoXG4gICAgICBsZXQgcmVhbExlbmd0aCA9IDBcbiAgICAgIGxldCBjaGFyQ29kZSA9IC0xXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIGNoYXJDb2RlID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICAgICAgaWYgKGNoYXJDb2RlID49IDAgJiYgY2hhckNvZGUgPD0gMTI4KSB7XG4gICAgICAgICAgcmVhbExlbmd0aCArPSAwLjVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWFsTGVuZ3RoICs9IDFcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIE1hdGguY2VpbChyZWFsTGVuZ3RoKVxuICAgIH1cblxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiAoe1xuICAgICAgaW5wdXQ6IHRleHRhcmVhUmVmPy5jdXJyZW50LFxuICAgICAgaGFuZGxlQ2hhbmdlLFxuICAgICAgaGFuZGxlS2V5RG93bixcbiAgICAgIGhhbmRsZUJsdXIsXG4gICAgICBoYW5kbGVGb2N1cyxcbiAgICB9KSlcblxuICAgIGNvbnN0IHRleHRhcmVhUHJvcHM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7XG4gICAgICBhdXRvRm9jdXMsXG4gICAgICBjbGFzc05hbWU6IGAke3ByZWZpeH0tYmFzZWAsXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIG9uQmx1cjogaGFuZGxlQmx1cixcbiAgICAgIG9uQ2hhbmdlOiBoYW5kbGVDaGFuZ2UsXG4gICAgICBvbkZvY3VzOiBoYW5kbGVGb2N1cyxcbiAgICAgIG9uS2V5RG93bjogaGFuZGxlS2V5RG93bixcbiAgICAgIG9uU2Nyb2xsLFxuICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICByZWY6IHRleHRhcmVhUmVmLFxuICAgICAgcmVxdWlyZWQsXG4gICAgICBzdHlsZTogeyByZXNpemUgfSxcbiAgICAgIHR5cGUsXG4gICAgfVxuXG4gICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0ZXh0YXJlYVByb3BzLnZhbHVlID0gZml4Q29udHJvbGxlZFZhbHVlKHZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICB0ZXh0YXJlYVByb3BzLmRlZmF1bHRWYWx1ZSA9IGZpeENvbnRyb2xsZWRWYWx1ZShkZWZhdWx0VmFsdWUpXG4gICAgfVxuXG4gICAgbGV0IGxlbmd0aFxuICAgIGlmIChsaW1pdCkge1xuICAgICAgd2FybmluZyhcbiAgICAgICAgcmVzaXplID09PSBcIm5vbmVcIixcbiAgICAgICAgXCJJbnB1dC5UZXh0YXJlYVwiLFxuICAgICAgICBcIuS4jeWFgeiuuOWQjOaXtuS9v+eUqCBwcm9wIGBsaW1pdGAg5LiOIHByb3AgYHJlc2l6ZWBcIlxuICAgICAgKVxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGxlbmd0aCA9IGNvdW50SGFuemkgPyBnZXRGb3JtYXRTdHJMZW5nKHZhbHVlKSA6IHZhbHVlLmxlbmd0aFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybmluZyhcbiAgICAgICAgICB2YWx1ZSAhPT0gbnVsbCxcbiAgICAgICAgICBcIklucHV0LlRleHRhcmVhXCIsXG4gICAgICAgICAgXCLlpoLmnpzopoHpmZDliLblrZfmlbDvvIzlv4Xpobvku47lpJbpg6jmjqfliLYgdmFsdWXjgIJcIlxuICAgICAgICApXG4gICAgICAgIGxlbmd0aCA9IDBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjbGFzc1NldCA9IGNsYXNzTmFtZXMoXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBgJHtwcmVmaXh9LXdyYXBwZXJgLFxuICAgICAgYCR7cHJlZml4fS13cmFwcGVyX3RleHRhcmVhYCxcbiAgICAgIGAke3ByZWZpeH0tJHtzaXplfWAsXG4gICAgICB7XG4gICAgICAgIFtgJHtwcmVmaXh9LSR7dGhlbWV9YF06IHRoZW1lLFxuICAgICAgICBbYCR7cHJlZml4fS1kaXNhYmxlZGBdOiBkaXNhYmxlZCxcbiAgICAgICAgW2Ake3ByZWZpeH0tbGltaXRlZGBdOiAhIWxpbWl0LFxuICAgICAgICBbYCR7cHJlZml4fS1ub3JtYWxgXTogaW50ZW50ID09PSBcIm5vcm1hbFwiLFxuICAgICAgICBbYCR7cHJlZml4fS1wcmltYXJ5YF06IGludGVudCA9PT0gXCJwcmltYXJ5XCIsXG4gICAgICAgIFtgJHtwcmVmaXh9LXN1Y2Nlc3NgXTogaW50ZW50ID09PSBcInN1Y2Nlc3NcIixcbiAgICAgICAgW2Ake3ByZWZpeH0td2FybmluZ2BdOiBpbnRlbnQgPT09IFwid2FybmluZ1wiLFxuICAgICAgICBbYCR7cHJlZml4fS1kYW5nZXJgXTpcbiAgICAgICAgICBpbnRlbnQgPT09IFwiZGFuZ2VyXCIgfHwgKGxlbmd0aCAmJiBsaW1pdCAmJiBsZW5ndGggPiBsaW1pdCksXG4gICAgICAgIFtgJHtwcmVmaXh9LWZvY3VzZWRgXTogZm9jdXNlZCxcbiAgICAgIH1cbiAgICApXG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2NsYXNzU2V0fSB7Li4ub3RoZXJQcm9wc30+XG4gICAgICAgIDx0ZXh0YXJlYSB7Li4udGV4dGFyZWFQcm9wc30gLz5cbiAgICAgICAgeyEhbGltaXQgJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LWxpbWl0YH0+XG4gICAgICAgICAgICA8c3Bhbj57YCR7bGVuZ3RofS8ke2xpbWl0fWB9PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG4pXG5cblRleHRhcmVhLnByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIGlucHV0IOagh+etvuWOn+eUn+WxnuaApyAtIGF1dG9Gb2N1c1xuICAgKi9cbiAgYXV0b0ZvY3VzOiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqXG4gICAqIOmZhOWKoOexu+WQjVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKipcbiAgICog5piv5ZCm5oyJ54Wn5LiA5Liq5rGJ5a2X566XIDIg5a2X5pWw55qE5pa55byP6ZmQ5Yi26ZW/5bqmXG4gICAqL1xuICBjb3VudEhhbnppOiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqXG4gICAqIOm7mOiupOWAvCAtIOWGhemDqOmpseWKqFxuICAgKi9cbiAgZGVmYXVsdFZhbHVlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKipcbiAgICog5piv5ZCm56aB55SoXG4gICAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG4gIC8qKlxuICAgKiDovpPlhaXmoYbnmoQgaWRcbiAgICovXG4gIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKipcbiAgICog6K6+572u57G75Z6LXG4gICAqL1xuICBpbnRlbnQ6IFByb3BUeXBlcy5vbmVPZihbXG4gICAgXCJub3JtYWxcIixcbiAgICBcInByaW1hcnlcIixcbiAgICBcInN1Y2Nlc3NcIixcbiAgICBcIndhcm5pbmdcIixcbiAgICBcImRhbmdlclwiLFxuICBdKSxcbiAgLyoqXG4gICAqIOmZkOWItumVv+W6plxuICAgKi9cbiAgbGltaXQ6IFByb3BUeXBlcy5udW1iZXIsXG4gIC8qKlxuICAgKiB0ZXh0YXJlYSDmoIfnrb7ljp/nlJ/lsZ7mgKcgLSBuYW1lXG4gICAqL1xuICBuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKipcbiAgICogYmx1ciDml7bnmoQgaGFuZGxlclxuICAgKi9cbiAgb25CbHVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqXG4gICAqIOWAvOaUueWPmOaXtueahCBoYW5kbGVyXG4gICAqL1xuICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxuICAgKiBmb2N1cyDml7bnmoQgaGFuZGxlclxuICAgKi9cbiAgb25Gb2N1czogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxuICAgKiBrZXlkb3duIOaXtueahCBoYW5kbGVyXG4gICAqL1xuICBvbktleURvd246IFByb3BUeXBlcy5mdW5jLFxuICAvKipcbiAgICogZW50ZXIg5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uUHJlc3NFbnRlcjogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxuICAgKiBzY3JvbGwg5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uU2Nyb2xsOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqXG4gICAqIHBsYWNlaG9sZGVyXG4gICAqL1xuICBwbGFjZWhvbGRlcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqXG4gICAqIGlucHV0IOagh+etvuWOn+eUn+WxnuaApyAtIHJlcXVpcmVkXG4gICAqL1xuICByZXF1aXJlZDogUHJvcFR5cGVzLmJvb2wsXG4gIC8qKlxuICAgKiDmmK/lkKbmlK/mjIHosIPmlbTlpKflsI9cbiAgICovXG4gIHJlc2l6ZTogUHJvcFR5cGVzLm9uZU9mKFtcIm5vbmVcIiwgXCJib3RoXCIsIFwiaG9yaXpvbnRhbFwiLCBcInZlcnRpY2FsXCJdKSxcbiAgLyoqXG4gICAqIOiuvue9ruWwuuWvuFxuICAgKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKFtcIm1pbmlcIiwgXCJzbWFsbFwiLCBcIm1lZGl1bVwiLCBcImxhcmdlXCJdKSxcbiAgLyoqXG4gICAqIOiuvue9ruS4u+mimFxuICAgKi9cbiAgdGhlbWU6IFByb3BUeXBlcy5vbmVPZihbbnVsbCwgXCJsaWdodFwiXSksXG4gIC8qKlxuICAgKiB0ZXh0YXJlYSDmoIfnrb7ljp/nlJ/lsZ7mgKcgLSB0eXBlXG4gICAqL1xuICB0eXBlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKipcbiAgICog5YC8IC0g5aSW6YOo5o6n5Yi2XG4gICAqL1xuICB2YWx1ZTogUHJvcFR5cGVzLnN0cmluZyxcbn1cblxuVGV4dGFyZWEuZGVmYXVsdFByb3BzID0ge1xuICBhdXRvRm9jdXM6IGZhbHNlLFxuICBjbGFzc05hbWU6IHVuZGVmaW5lZCxcbiAgY291bnRIYW56aTogdHJ1ZSxcbiAgZGVmYXVsdFZhbHVlOiBudWxsLFxuICBkaXNhYmxlZDogZmFsc2UsXG4gIGlkOiBudWxsLFxuICBpbnRlbnQ6IFwibm9ybWFsXCIsXG4gIGxpbWl0OiBudWxsLFxuICBuYW1lOiBudWxsLFxuICBvbkJsdXI6IG5vb3AsXG4gIG9uQ2hhbmdlOiBub29wLFxuICBvbkZvY3VzOiBub29wLFxuICBvbktleURvd246IG5vb3AsXG4gIG9uUHJlc3NFbnRlcjogbm9vcCxcbiAgb25TY3JvbGw6IG5vb3AsXG4gIHBsYWNlaG9sZGVyOiBcIuivt+i+k+WFpVwiLFxuICByZXF1aXJlZDogZmFsc2UsXG4gIHJlc2l6ZTogXCJub25lXCIsXG4gIHNpemU6IFwic21hbGxcIixcbiAgdGhlbWU6IG51bGwsXG4gIHR5cGU6IG51bGwsXG4gIHZhbHVlOiBudWxsLFxufVxuXG5UZXh0YXJlYS5kaXNwbGF5TmFtZSA9IFwiVGV4dGFyZWFcIlxuXG5leHBvcnQgZGVmYXVsdCBUZXh0YXJlYVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBT0EsS0FBUCxJQUNFQyxVQURGLEVBRUVDLFVBRkYsRUFHRUMsbUJBSEYsRUFJRUMsTUFKRixFQUtFQyxRQUxGLFFBTU8sT0FOUDtBQU9BLE9BQU9DLFNBQVAsTUFBc0IsWUFBdEI7QUFDQSxPQUFPQyxVQUFQLE1BQXVCLFlBQXZCO0FBQ0EsT0FBT0MsT0FBUCxNQUFvQixrQkFBcEI7QUFDQSxTQUFTQyxhQUFULEVBQXdCQyxlQUF4QixRQUErQyxvQkFBL0M7QUFDQSxPQUFPLFNBQVA7O0FBRUEsSUFBTUMsSUFBSSxHQUFHLFNBQVBBLElBQU8sR0FBTSxDQUFFLENBQXJCOztBQUVBLElBQU1DLE1BQU0sR0FBRyxxQkFBZjtBQWlHQSxJQUFNQyxRQUVMLEdBQUdaLFVBQVUsQ0FDWixnQkEwQkVhLEdBMUJGLEVBMkJLO0VBQUE7O0VBQUEsSUF6QkRDLFNBeUJDLFFBekJEQSxTQXlCQztFQUFBLElBeEJEQyxTQXdCQyxRQXhCREEsU0F3QkM7RUFBQSxJQXZCREMsVUF1QkMsUUF2QkRBLFVBdUJDO0VBQUEsSUF0QkRDLFlBc0JDLFFBdEJEQSxZQXNCQztFQUFBLElBckJEQyxRQXFC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