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>
277 lines • 33.7 kB
JavaScript
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
var _excluded = ["countHanzi"],
_excluded2 = ["countHanzi"];
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var s = Object.getOwnPropertySymbols(e); for (r = 0; r < s.length; r++) o = s[r], t.includes(o) || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } return t; }
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); }
function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); }
function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
import React, { Component } from "react";
import sinon from "sinon";
import { mount, render } from "enzyme";
import TestRenderer from "react-test-renderer";
import Input from "..";
import Icon from "../../icon";
var stub = sinon.stub(console, "error");
var InputMounter = function (_Component) {
function InputMounter() {
var _this;
_classCallCheck(this, InputMounter);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _callSuper(this, InputMounter, [].concat(args));
_this.state = {
value: "中文abc",
leftElement: React.createElement(Icon, {
icon: "add"
})
};
return _this;
}
_inherits(InputMounter, _Component);
return _createClass(InputMounter, [{
key: "render",
value: function render() {
var _this2 = this;
var _this$props = this.props,
countHanzi = _this$props.countHanzi,
others = _objectWithoutProperties(_this$props, _excluded);
var _this$state = this.state,
leftElement = _this$state.leftElement,
value = _this$state.value;
return React.createElement(Input, _extends({
countHanzi: countHanzi,
leftElement: leftElement,
limit: 10,
value: value,
onChange: function onChange(_ref) {
var val = _ref.target.value;
return _this2.setState({
value: val
});
}
}, others));
}
}]);
}(Component);
var TextareaMounter = function (_Component2) {
function TextareaMounter() {
var _this3;
_classCallCheck(this, TextareaMounter);
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
_this3 = _callSuper(this, TextareaMounter, [].concat(args));
_this3.state = {
value: "中文abc"
};
return _this3;
}
_inherits(TextareaMounter, _Component2);
return _createClass(TextareaMounter, [{
key: "render",
value: function render() {
var _this4 = this;
var _this$props2 = this.props,
countHanzi = _this$props2.countHanzi,
others = _objectWithoutProperties(_this$props2, _excluded2);
var value = this.state.value;
return React.createElement(Input.Textarea, _extends({
countHanzi: countHanzi,
limit: 10,
value: value,
onChange: function onChange(_ref2) {
var val = _ref2.target.value;
return _this4.setState({
value: val
});
}
}, others));
}
}]);
}(Component);
describe("Input", function () {
beforeAll(function () {
Object.defineProperty(Element.prototype, "clientWidth", {
writable: true,
configurable: true,
value: 200
});
});
it("快照验证", function () {
var wrapper = TestRenderer.create(React.createElement(Input, null));
expect(wrapper).toMatchSnapshot();
});
it("是否正确渲染文本框", function () {
var wrapper = TestRenderer.create(React.createElement(Input.Textarea, null));
expect(wrapper).toMatchSnapshot();
});
it("是否能验证 contentJustify", function () {
render(React.createElement(Input, {
contentJustify: true
}));
render(React.createElement(Input, {
contentJustify: true,
value: "111\u4E2D\u6587"
}));
expect(stub.calledOnce).toEqual(true);
stub.restore();
});
it("是否能验证 limit", function () {
render(React.createElement(Input, {
limit: 10,
rightElement: React.createElement("div", null, "string")
}));
expect(stub.calledOnce).toEqual(true);
stub.restore();
});
it("是否支持 limit 功能", function () {
var wrapper0 = mount(React.createElement(InputMounter, {
countHanzi: true
}));
var wrapper1 = mount(React.createElement(InputMounter, {
countHanzi: false
}));
wrapper0.find("input").simulate("change", {
target: {
value: "111中文"
}
});
wrapper1.find("input").simulate("change", {
target: {
value: "111中文"
}
});
expect(wrapper0.find(".adui-input-limit").text()).toEqual("4/10");
expect(wrapper1.find(".adui-input-limit").text()).toEqual("5/10");
});
it("是否显示正确的 leftElement rightElement", function () {
var wrapper = mount(React.createElement(Input, {
leftElement: React.createElement(Icon, {
icon: "search"
}),
rightElement: React.createElement(Icon, {
icon: "search"
})
}));
var left = wrapper.find(".adui-input-left");
var right = wrapper.find(".adui-input-right");
left.simulate("click");
right.simulate("click");
});
it("是否能正确处理 leftElement 宽度", function () {
var wrapper = mount(React.createElement(InputMounter, null));
wrapper.setState({
leftElement: null
});
wrapper.setProps({
rightElement: React.createElement(Icon, {
icon: "add"
})
});
wrapper.setProps({
rightElement: null
});
});
it("事件验证", function () {
var onPressEnter = jest.fn();
var onKeyDown = jest.fn();
var onBlur = jest.fn();
var onFocus = jest.fn();
var wrapper = mount(React.createElement(Input, {
onPressEnter: onPressEnter,
onKeyDown: onKeyDown,
onBlur: onBlur,
onFocus: onFocus
}));
wrapper.find("input").simulate("keydown", {
key: "enter",
keyCode: 13
});
wrapper.find("input").simulate("focus");
wrapper.find("input").simulate("blur");
expect(onPressEnter).toHaveBeenCalledTimes(1);
expect(onKeyDown).toHaveBeenCalledTimes(1);
expect(onBlur).toHaveBeenCalledTimes(1);
expect(onFocus).toHaveBeenCalledTimes(1);
});
it("验证 Cleave.js", function () {
var wrapper = mount(React.createElement(InputMounter, {
cleaveOptions: {
uppercase: true
}
}));
wrapper.setState({
value: "abc"
});
wrapper.update();
expect(wrapper.find("input").get(0).props.value).toBe("ABC");
});
it("Textarea: 快照验证", function () {
var wrapper = TestRenderer.create(React.createElement(Input.Textarea, null));
expect(wrapper).toMatchSnapshot();
});
it("Textarea: 是否能正确验证 limit", function () {
render(React.createElement(Input.Textarea, {
limit: 10,
resize: "both"
}));
expect(stub.calledOnce).toEqual(true);
});
it("Textarea: 是否支持 limit 功能", function () {
var wrapper0 = mount(React.createElement(TextareaMounter, {
countHanzi: true
}));
var wrapper1 = mount(React.createElement(TextareaMounter, {
countHanzi: false
}));
wrapper0.find("textarea").simulate("change", {
target: {
value: "111中文"
}
});
wrapper1.find("textarea").simulate("change", {
target: {
value: "111中文"
}
});
expect(wrapper0.find(".adui-input-limit").text()).toEqual("4/10");
expect(wrapper1.find(".adui-input-limit").text()).toEqual("5/10");
});
it("Textarea: 事件验证", function () {
var onPressEnter = jest.fn();
var onKeyDown = jest.fn();
var onBlur = jest.fn();
var onFocus = jest.fn();
var wrapper = mount(React.createElement(Input.Textarea, {
onPressEnter: onPressEnter,
onKeyDown: onKeyDown,
onBlur: onBlur,
onFocus: onFocus
}));
wrapper.find("textarea").simulate("keydown", {
key: "enter",
keyCode: 13
});
wrapper.find("textarea").simulate("focus");
expect(wrapper.find(".adui-input-wrapper").at(0).props().className.includes("adui-input-focused")).toBe(true);
wrapper.find("textarea").simulate("blur");
expect(wrapper.find(".adui-input-wrapper").at(0).props().className.includes("adui-input-focused")).toBe(false);
expect(onPressEnter).toHaveBeenCalledTimes(1);
expect(onKeyDown).toHaveBeenCalledTimes(1);
expect(onBlur).toHaveBeenCalledTimes(1);
expect(onFocus).toHaveBeenCalledTimes(1);
});
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkNvbXBvbmVudCIsInNpbm9uIiwibW91bnQiLCJyZW5kZXIiLCJUZXN0UmVuZGVyZXIiLCJJbnB1dCIsIkljb24iLCJzdHViIiwiY29uc29sZSIsIklucHV0TW91bnRlciIsIl9Db21wb25lbnQiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjayIsIl9sZW4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiX2NhbGxTdXBlciIsImNvbmNhdCIsInN0YXRlIiwidmFsdWUiLCJsZWZ0RWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJpY29uIiwiX2luaGVyaXRzIiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwiX3RoaXMyIiwiX3RoaXMkcHJvcHMiLCJwcm9wcyIsImNvdW50SGFuemkiLCJvdGhlcnMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJfZXhjbHVkZWQiLCJfdGhpcyRzdGF0ZSIsIl9leHRlbmRzIiwibGltaXQiLCJvbkNoYW5nZSIsIl9yZWYiLCJ2YWwiLCJ0YXJnZXQiLCJzZXRTdGF0ZSIsIlRleHRhcmVhTW91bnRlciIsIl9Db21wb25lbnQyIiwiX3RoaXMzIiwiX2xlbjIiLCJfa2V5MiIsIl90aGlzNCIsIl90aGlzJHByb3BzMiIsIl9leGNsdWRlZDIiLCJUZXh0YXJlYSIsIl9yZWYyIiwiZGVzY3JpYmUiLCJiZWZvcmVBbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsIkVsZW1lbnQiLCJwcm90b3R5cGUiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsIml0Iiwid3JhcHBlciIsImNyZWF0ZSIsImV4cGVjdCIsInRvTWF0Y2hTbmFwc2hvdCIsImNvbnRlbnRKdXN0aWZ5IiwiY2FsbGVkT25jZSIsInRvRXF1YWwiLCJyZXN0b3JlIiwicmlnaHRFbGVtZW50Iiwid3JhcHBlcjAiLCJ3cmFwcGVyMSIsImZpbmQiLCJzaW11bGF0ZSIsInRleHQiLCJsZWZ0IiwicmlnaHQiLCJzZXRQcm9wcyIsIm9uUHJlc3NFbnRlciIsImplc3QiLCJmbiIsIm9uS2V5RG93biIsIm9uQmx1ciIsIm9uRm9jdXMiLCJrZXlDb2RlIiwidG9IYXZlQmVlbkNhbGxlZFRpbWVzIiwiY2xlYXZlT3B0aW9ucyIsInVwcGVyY2FzZSIsInVwZGF0ZSIsImdldCIsInRvQmUiLCJyZXNpemUiLCJhdCIsImNsYXNzTmFtZSIsImluY2x1ZGVzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vY29tcG9uZW50cy9pbnB1dC9fX3Rlc3RzX18vaW5kZXgudGVzdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cbi8vIEB0cy1ub2NoZWNrXG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSBcInJlYWN0XCJcbmltcG9ydCBzaW5vbiBmcm9tIFwic2lub25cIlxuaW1wb3J0IHsgbW91bnQsIHJlbmRlciB9IGZyb20gXCJlbnp5bWVcIlxuaW1wb3J0IFRlc3RSZW5kZXJlciBmcm9tIFwicmVhY3QtdGVzdC1yZW5kZXJlclwiXG5pbXBvcnQgSW5wdXQgZnJvbSBcIi4uXCJcbmltcG9ydCBJY29uIGZyb20gXCIuLi8uLi9pY29uXCJcblxuY29uc3Qgc3R1YiA9IHNpbm9uLnN0dWIoY29uc29sZSwgXCJlcnJvclwiKVxuXG5jbGFzcyBJbnB1dE1vdW50ZXIgZXh0ZW5kcyBDb21wb25lbnQ8YW55LCBhbnk+IHtcbiAgc3RhdGUgPSB7XG4gICAgdmFsdWU6IFwi5Lit5paHYWJjXCIsXG4gICAgbGVmdEVsZW1lbnQ6IDxJY29uIGljb249XCJhZGRcIiAvPixcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGNvdW50SGFuemksIC4uLm90aGVycyB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgbGVmdEVsZW1lbnQsIHZhbHVlIH0gPSB0aGlzLnN0YXRlXG4gICAgcmV0dXJuIChcbiAgICAgIDxJbnB1dFxuICAgICAgICBjb3VudEhhbnppPXtjb3VudEhhbnppfVxuICAgICAgICBsZWZ0RWxlbWVudD17bGVmdEVsZW1lbnR9XG4gICAgICAgIGxpbWl0PXsxMH1cbiAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICBvbkNoYW5nZT17KHsgdGFyZ2V0OiB7IHZhbHVlOiB2YWwgfSB9KSA9PiB0aGlzLnNldFN0YXRlKHsgdmFsdWU6IHZhbCB9KX1cbiAgICAgICAgey4uLm90aGVyc31cbiAgICAgIC8+XG4gICAgKVxuICB9XG59XG5cbmNsYXNzIFRleHRhcmVhTW91bnRlciBleHRlbmRzIENvbXBvbmVudDxhbnksIGFueT4ge1xuICBzdGF0ZSA9IHtcbiAgICB2YWx1ZTogXCLkuK3mlodhYmNcIixcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGNvdW50SGFuemksIC4uLm90aGVycyB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgdmFsdWUgfSA9IHRoaXMuc3RhdGVcbiAgICByZXR1cm4gKFxuICAgICAgPElucHV0LlRleHRhcmVhXG4gICAgICAgIGNvdW50SGFuemk9e2NvdW50SGFueml9XG4gICAgICAgIGxpbWl0PXsxMH1cbiAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICBvbkNoYW5nZT17KHsgdGFyZ2V0OiB7IHZhbHVlOiB2YWwgfSB9KSA9PiB0aGlzLnNldFN0YXRlKHsgdmFsdWU6IHZhbCB9KX1cbiAgICAgICAgey4uLm90aGVyc31cbiAgICAgIC8+XG4gICAgKVxuICB9XG59XG5cbmRlc2NyaWJlKFwiSW5wdXRcIiwgKCkgPT4ge1xuICBiZWZvcmVBbGwoKCkgPT4ge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFbGVtZW50LnByb3RvdHlwZSwgXCJjbGllbnRXaWR0aFwiLCB7XG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiAyMDAsXG4gICAgfSlcbiAgfSlcblxuICBpdChcIuW/q+eFp+mqjOivgVwiLCAoKSA9PiB7XG4gICAgY29uc3Qgd3JhcHBlciA9IFRlc3RSZW5kZXJlci5jcmVhdGUoPElucHV0IC8+KVxuICAgIGV4cGVjdCh3cmFwcGVyKS50b01hdGNoU25hcHNob3QoKVxuICB9KVxuICBpdChcIuaYr+WQpuato+ehrua4suafk+aWh+acrOahhlwiLCAoKSA9PiB7XG4gICAgY29uc3Qgd3JhcHBlciA9IFRlc3RSZW5kZXJlci5jcmVhdGUoPElucHV0LlRleHRhcmVhIC8+KVxuICAgIGV4cGVjdCh3cmFwcGVyKS50b01hdGNoU25hcHNob3QoKVxuICB9KVxuICBpdChcIuaYr+WQpuiDvemqjOivgSBjb250ZW50SnVzdGlmeVwiLCAoKSA9PiB7XG4gICAgcmVuZGVyKDxJbnB1dCBjb250ZW50SnVzdGlmeSAvPilcbiAgICByZW5kZXIoPElucHV0IGNvbnRlbnRKdXN0aWZ5IHZhbHVlPVwiMTEx5Lit5paHXCIgLz4pXG4gICAgZXhwZWN0KHN0dWIuY2FsbGVkT25jZSkudG9FcXVhbCh0cnVlKVxuICAgIHN0dWIucmVzdG9yZSgpXG4gIH0pXG4gIGl0KFwi5piv5ZCm6IO96aqM6K+BIGxpbWl0XCIsICgpID0+IHtcbiAgICByZW5kZXIoPElucHV0IGxpbWl0PXsxMH0gcmlnaHRFbGVtZW50PXs8ZGl2PnN0cmluZzwvZGl2Pn0gLz4pXG4gICAgZXhwZWN0KHN0dWIuY2FsbGVkT25jZSkudG9FcXVhbCh0cnVlKVxuICAgIHN0dWIucmVzdG9yZSgpXG4gIH0pXG4gIGl0KFwi5piv5ZCm5pSv5oyBIGxpbWl0IOWKn+iDvVwiLCAoKSA9PiB7XG4gICAgY29uc3Qgd3JhcHBlcjAgPSBtb3VudCg8SW5wdXRNb3VudGVyIGNvdW50SGFuemkgLz4pXG4gICAgY29uc3Qgd3JhcHBlcjEgPSBtb3VudCg8SW5wdXRNb3VudGVyIGNvdW50SGFuemk9e2ZhbHNlfSAvPilcbiAgICB3cmFwcGVyMC5maW5kKFwiaW5wdXRcIikuc2ltdWxhdGUoXCJjaGFuZ2VcIiwgeyB0YXJnZXQ6IHsgdmFsdWU6IFwiMTEx5Lit5paHXCIgfSB9KVxuICAgIHdyYXBwZXIxLmZpbmQoXCJpbnB1dFwiKS5zaW11bGF0ZShcImNoYW5nZVwiLCB7IHRhcmdldDogeyB2YWx1ZTogXCIxMTHkuK3mlodcIiB9IH0pXG4gICAgZXhwZWN0KHdyYXBwZXIwLmZpbmQoXCIuYWR1aS1pbnB1dC1saW1pdFwiKS50ZXh0KCkpLnRvRXF1YWwoXCI0LzEwXCIpXG4gICAgZXhwZWN0KHdyYXBwZXIxLmZpbmQoXCIuYWR1aS1pbnB1dC1saW1pdFwiKS50ZXh0KCkpLnRvRXF1YWwoXCI1LzEwXCIpXG4gIH0pXG4gIGl0KFwi5piv5ZCm5pi+56S65q2j56Gu55qEIGxlZnRFbGVtZW50IHJpZ2h0RWxlbWVudFwiLCAoKSA9PiB7XG4gICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgPElucHV0XG4gICAgICAgIGxlZnRFbGVtZW50PXs8SWNvbiBpY29uPVwic2VhcmNoXCIgLz59XG4gICAgICAgIHJpZ2h0RWxlbWVudD17PEljb24gaWNvbj1cInNlYXJjaFwiIC8+fVxuICAgICAgLz5cbiAgICApXG4gICAgY29uc3QgbGVmdCA9IHdyYXBwZXIuZmluZChcIi5hZHVpLWlucHV0LWxlZnRcIilcbiAgICBjb25zdCByaWdodCA9IHdyYXBwZXIuZmluZChcIi5hZHVpLWlucHV0LXJpZ2h0XCIpXG4gICAgbGVmdC5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgcmlnaHQuc2ltdWxhdGUoXCJjbGlja1wiKVxuICB9KVxuICBpdChcIuaYr+WQpuiDveato+ehruWkhOeQhiBsZWZ0RWxlbWVudCDlrr3luqZcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudCg8SW5wdXRNb3VudGVyIC8+KVxuICAgIHdyYXBwZXIuc2V0U3RhdGUoeyBsZWZ0RWxlbWVudDogbnVsbCB9KVxuICAgIHdyYXBwZXIuc2V0UHJvcHMoeyByaWdodEVsZW1lbnQ6IDxJY29uIGljb249XCJhZGRcIiAvPiB9KVxuICAgIHdyYXBwZXIuc2V0UHJvcHMoeyByaWdodEVsZW1lbnQ6IG51bGwgfSlcbiAgfSlcbiAgaXQoXCLkuovku7bpqozor4FcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG9uUHJlc3NFbnRlciA9IGplc3QuZm4oKVxuICAgIGNvbnN0IG9uS2V5RG93biA9IGplc3QuZm4oKVxuICAgIGNvbnN0IG9uQmx1ciA9IGplc3QuZm4oKVxuICAgIGNvbnN0IG9uRm9jdXMgPSBqZXN0LmZuKClcblxuICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgIDxJbnB1dFxuICAgICAgICBvblByZXNzRW50ZXI9e29uUHJlc3NFbnRlcn1cbiAgICAgICAgb25LZXlEb3duPXtvbktleURvd259XG4gICAgICAgIG9uQmx1cj17b25CbHVyfVxuICAgICAgICBvbkZvY3VzPXtvbkZvY3VzfVxuICAgICAgLz5cbiAgICApXG4gICAgd3JhcHBlci5maW5kKFwiaW5wdXRcIikuc2ltdWxhdGUoXCJrZXlkb3duXCIsIHsga2V5OiBcImVudGVyXCIsIGtleUNvZGU6IDEzIH0pXG4gICAgd3JhcHBlci5maW5kKFwiaW5wdXRcIikuc2ltdWxhdGUoXCJmb2N1c1wiKVxuICAgIHdyYXBwZXIuZmluZChcImlucHV0XCIpLnNpbXVsYXRlKFwiYmx1clwiKVxuICAgIGV4cGVjdChvblByZXNzRW50ZXIpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChvbktleURvd24pLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChvbkJsdXIpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChvbkZvY3VzKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgfSlcbiAgaXQoXCLpqozor4EgQ2xlYXZlLmpzXCIsICgpID0+IHtcbiAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoPElucHV0TW91bnRlciBjbGVhdmVPcHRpb25zPXt7IHVwcGVyY2FzZTogdHJ1ZSB9fSAvPilcbiAgICB3cmFwcGVyLnNldFN0YXRlKHsgdmFsdWU6IFwiYWJjXCIgfSlcbiAgICB3cmFwcGVyLnVwZGF0ZSgpXG4gICAgZXhwZWN0KHdyYXBwZXIuZmluZChcImlucHV0XCIpLmdldCgwKS5wcm9wcy52YWx1ZSkudG9CZShcIkFCQ1wiKVxuICB9KVxuXG4gIGl0KFwiVGV4dGFyZWE6IOW/q+eFp+mqjOivgVwiLCAoKSA9PiB7XG4gICAgY29uc3Qgd3JhcHBlciA9IFRlc3RSZW5kZXJlci5jcmVhdGUoPElucHV0LlRleHRhcmVhIC8+KVxuICAgIGV4cGVjdCh3cmFwcGVyKS50b01hdGNoU25hcHNob3QoKVxuICB9KVxuICBpdChcIlRleHRhcmVhOiDmmK/lkKbog73mraPnoa7pqozor4EgbGltaXRcIiwgKCkgPT4ge1xuICAgIHJlbmRlcig8SW5wdXQuVGV4dGFyZWEgbGltaXQ9ezEwfSByZXNpemU9XCJib3RoXCIgLz4pXG4gICAgZXhwZWN0KHN0dWIuY2FsbGVkT25jZSkudG9FcXVhbCh0cnVlKVxuICB9KVxuICBpdChcIlRleHRhcmVhOiDmmK/lkKbmlK/mjIEgbGltaXQg5Yqf6IO9XCIsICgpID0+IHtcbiAgICBjb25zdCB3cmFwcGVyMCA9IG1vdW50KDxUZXh0YXJlYU1vdW50ZXIgY291bnRIYW56aSAvPilcbiAgICBjb25zdCB3cmFwcGVyMSA9IG1vdW50KDxUZXh0YXJlYU1vdW50ZXIgY291bnRIYW56aT17ZmFsc2V9IC8+KVxuICAgIHdyYXBwZXIwXG4gICAgICAuZmluZChcInRleHRhcmVhXCIpXG4gICAgICAuc2ltdWxhdGUoXCJjaGFuZ2VcIiwgeyB0YXJnZXQ6IHsgdmFsdWU6IFwiMTEx5Lit5paHXCIgfSB9KVxuICAgIHdyYXBwZXIxXG4gICAgICAuZmluZChcInRleHRhcmVhXCIpXG4gICAgICAuc2ltdWxhdGUoXCJjaGFuZ2VcIiwgeyB0YXJnZXQ6IHsgdmFsdWU6IFwiMTEx5Lit5paHXCIgfSB9KVxuICAgIGV4cGVjdCh3cmFwcGVyMC5maW5kKFwiLmFkdWktaW5wdXQtbGltaXRcIikudGV4dCgpKS50b0VxdWFsKFwiNC8xMFwiKVxuICAgIGV4cGVjdCh3cmFwcGVyMS5maW5kKFwiLmFkdWktaW5wdXQtbGltaXRcIikudGV4dCgpKS50b0VxdWFsKFwiNS8xMFwiKVxuICB9KVxuICBpdChcIlRleHRhcmVhOiDkuovku7bpqozor4FcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG9uUHJlc3NFbnRlciA9IGplc3QuZm4oKVxuICAgIGNvbnN0IG9uS2V5RG93biA9IGplc3QuZm4oKVxuICAgIGNvbnN0IG9uQmx1ciA9IGplc3QuZm4oKVxuICAgIGNvbnN0IG9uRm9jdXMgPSBqZXN0LmZuKClcblxuICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgIDxJbnB1dC5UZXh0YXJlYVxuICAgICAgICBvblByZXNzRW50ZXI9e29uUHJlc3NFbnRlcn1cbiAgICAgICAgb25LZXlEb3duPXtvbktleURvd259XG4gICAgICAgIG9uQmx1cj17b25CbHVyfVxuICAgICAgICBvbkZvY3VzPXtvbkZvY3VzfVxuICAgICAgLz5cbiAgICApXG4gICAgd3JhcHBlci5maW5kKFwidGV4dGFyZWFcIikuc2ltdWxhdGUoXCJrZXlkb3duXCIsIHsga2V5OiBcImVudGVyXCIsIGtleUNvZGU6IDEzIH0pXG4gICAgd3JhcHBlci5maW5kKFwidGV4dGFyZWFcIikuc2ltdWxhdGUoXCJmb2N1c1wiKVxuICAgIGV4cGVjdChcbiAgICAgIHdyYXBwZXJcbiAgICAgICAgLmZpbmQoXCIuYWR1aS1pbnB1dC13cmFwcGVyXCIpXG4gICAgICAgIC5hdCgwKVxuICAgICAgICAucHJvcHMoKVxuICAgICAgICAuY2xhc3NOYW1lLmluY2x1ZGVzKFwiYWR1aS1pbnB1dC1mb2N1c2VkXCIpXG4gICAgKS50b0JlKHRydWUpXG4gICAgd3JhcHBlci5maW5kKFwidGV4dGFyZWFcIikuc2ltdWxhdGUoXCJibHVyXCIpXG4gICAgZXhwZWN0KFxuICAgICAgd3JhcHBlclxuICAgICAgICAuZmluZChcIi5hZHVpLWlucHV0LXdyYXBwZXJcIilcbiAgICAgICAgLmF0KDApXG4gICAgICAgIC5wcm9wcygpXG4gICAgICAgIC5jbGFzc05hbWUuaW5jbHVkZXMoXCJhZHVpLWlucHV0LWZvY3VzZWRcIilcbiAgICApLnRvQmUoZmFsc2UpXG4gICAgZXhwZWN0KG9uUHJlc3NFbnRlcikudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgZXhwZWN0KG9uS2V5RG93bikudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgZXhwZWN0KG9uQmx1cikudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgZXhwZWN0KG9uRm9jdXMpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICB9KVxufSlcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsT0FBT0EsS0FBSyxJQUFJQyxTQUFTLFFBQVEsT0FBTztBQUN4QyxPQUFPQyxLQUFLLE1BQU0sT0FBTztBQUN6QixTQUFTQyxLQUFLLEVBQUVDLE1BQU0sUUFBUSxRQUFRO0FBQ3RDLE9BQU9DLFlBQVksTUFBTSxxQkFBcUI7QUFDOUMsT0FBT0MsS0FBSyxNQUFNLElBQUk7QUFDdEIsT0FBT0MsSUFBSSxNQUFNLFlBQVk7QUFFN0IsSUFBTUMsSUFBSSxHQUFHTixLQUFLLENBQUNNLElBQUksQ0FBQ0MsT0FBTyxFQUFFLE9BQU8sQ0FBQztBQUFBLElBRW5DQyxZQUFZLGFBQUFDLFVBQUE7RUFBQSxTQUFBRCxhQUFBO0lBQUEsSUFBQUUsS0FBQTtJQUFBQyxlQUFBLE9BQUFILFlBQUE7SUFBQSxTQUFBSSxJQUFBLEdBQUFDLFNBQUEsQ0FBQUMsTUFBQSxFQUFBQyxJQUFBLE9BQUFDLEtBQUEsQ0FBQUosSUFBQSxHQUFBSyxJQUFBLE1BQUFBLElBQUEsR0FBQUwsSUFBQSxFQUFBSyxJQUFBO01BQUFGLElBQUEsQ0FBQUUsSUFBQSxJQUFBSixTQUFBLENBQUFJLElBQUE7SUFBQTtJQUFBUCxLQUFBLEdBQUFRLFVBQUEsT0FBQVYsWUFBQSxLQUFBVyxNQUFBLENBQUFKLElBQUE7SUFBQUwsS0FBQSxDQUNoQlUsS0FBSyxHQUFHO01BQ05DLEtBQUssRUFBRSxPQUFPO01BQ2RDLFdBQVcsRUFBRXhCLEtBQUEsQ0FBQXlCLGFBQUEsQ0FBQ2xCLElBQUk7UUFBQ21CLElB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RSxDQUFDLENBQUM7SUFFekIsSUFBTW5CLE9BQU8sR0FBRzdELEtBQUssQ0FDbkJILEtBQUEsQ0FBQXlCLGFBQUEsQ0FBQ25CLEtBQUssQ0FBQytDLFFBQVE7TUFDYjRCLFlBQVksRUFBRUEsWUFBYTtNQUMzQkcsU0FBUyxFQUFFQSxTQUFVO01BQ3JCQyxNQUFNLEVBQUVBLE1BQU87TUFDZkMsT0FBTyxFQUFFQTtJQUFRLENBQ2xCLENBQ0gsQ0FBQztJQUNEdEIsT0FBTyxDQUFDVyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUNDLFFBQVEsQ0FBQyxTQUFTLEVBQUU7TUFBRS9DLEdBQUcsRUFBRSxPQUFPO01BQUUwRCxPQUFPLEVBQUU7SUFBRyxDQUFDLENBQUM7SUFDM0V2QixPQUFPLENBQUNXLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQ0MsUUFBUSxDQUFDLE9BQU8sQ0FBQztJQUMxQ1YsTUFBTSxDQUNKRixPQUFPLENBQ0pXLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUMzQm9CLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDTC9ELEtBQUssQ0FBQyxDQUFDLENBQ1BnRSxTQUFTLENBQUNDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FDNUMsQ0FBQyxDQUFDSixJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ1o3QixPQUFPLENBQUNXLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQ0MsUUFBUSxDQUFDLE1BQU0sQ0FBQztJQUN6Q1YsTUFBTSxDQUNKRixPQUFPLENBQ0pXLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUMzQm9CLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDTC9ELEtBQUssQ0FBQyxDQUFDLENBQ1BnRSxTQUFTLENBQUNDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FDNUMsQ0FBQyxDQUFDSixJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ2IzQixNQUFNLENBQUNlLFlBQVksQ0FBQyxDQUFDTyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7SUFDN0N0QixNQUFNLENBQUNrQixTQUFTLENBQUMsQ0FBQ0kscUJBQXFCLENBQUMsQ0FBQyxDQUFDO0lBQzFDdEIsTUFBTSxDQUFDbUIsTUFBTSxDQUFDLENBQUNHLHFCQUFxQixDQUFDLENBQUMsQ0FBQztJQUN2Q3RCLE1BQU0sQ0FBQ29CLE9BQU8sQ0FBQyxDQUFDRSxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7RUFDMUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119