UNPKG

20.7 kBJavaScriptView Raw
1'use strict';
2
3var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
4
5var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
6
7var _getIterator2 = require('babel-runtime/core-js/get-iterator');
8
9var _getIterator3 = _interopRequireDefault(_getIterator2);
10
11var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
12
13var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
14
15var _createClass2 = require('babel-runtime/helpers/createClass');
16
17var _createClass3 = _interopRequireDefault(_createClass2);
18
19function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
21var ChatServiceError = require('./ChatServiceError');
22var FastMap = require('collections/fast-map');
23var Promise = require('bluebird');
24var _ = require('lodash');
25var check = require('check-types');
26
27var _require = require('./utils');
28
29var possiblyCallback = _require.possiblyCallback;
30
31// Commands arguments type and count validation.
32
33var ArgumentsValidator = function () {
34 function ArgumentsValidator(server) {
35 (0, _classCallCheck3.default)(this, ArgumentsValidator);
36
37 this.server = server;
38 this.checkers = new FastMap();
39 this.directMessagesChecker = this.server.directMessagesChecker;
40 this.roomMessagesChecker = this.server.roomMessagesChecker;
41 this.customCheckers = {
42 directMessage: [null, this.directMessagesChecker],
43 roomMessage: [null, this.roomMessagesChecker]
44 };
45 var commands = this.server.rpcRequestsNames;
46 var _iteratorNormalCompletion = true;
47 var _didIteratorError = false;
48 var _iteratorError = undefined;
49
50 try {
51 for (var _iterator = (0, _getIterator3.default)(commands), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
52 var cmd = _step.value;
53
54 this.checkers.set(cmd, this[cmd]());
55 }
56 } catch (err) {
57 _didIteratorError = true;
58 _iteratorError = err;
59 } finally {
60 try {
61 if (!_iteratorNormalCompletion && _iterator.return) {
62 _iterator.return();
63 }
64 } finally {
65 if (_didIteratorError) {
66 throw _iteratorError;
67 }
68 }
69 }
70 }
71
72 (0, _createClass3.default)(ArgumentsValidator, [{
73 key: 'checkArguments',
74 value: function checkArguments(name) {
75 var _this = this;
76
77 for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
78 args[_key - 1] = arguments[_key];
79 }
80
81 var _possiblyCallback = possiblyCallback(args);
82
83 var _possiblyCallback2 = (0, _slicedToArray3.default)(_possiblyCallback, 2);
84
85 var nargs = _possiblyCallback2[0];
86 var cb = _possiblyCallback2[1];
87
88 return Promise.try(function () {
89 var checkers = _this.checkers.get(name);
90 if (!checkers) {
91 var _error = new ChatServiceError('noCommand', name);
92 return Promise.reject(_error);
93 }
94 var error = _this.checkTypes(checkers, nargs);
95 if (error) {
96 return Promise.reject(error);
97 }
98 var customCheckers = _this.customCheckers[name] || [];
99 return Promise.each(customCheckers, function (checker, idx) {
100 if (checker) {
101 return Promise.fromCallback(function (fn) {
102 return checker(nargs[idx], fn);
103 });
104 } else {
105 return Promise.resolve();
106 }
107 }).return();
108 }).asCallback(cb);
109 }
110 }, {
111 key: 'getArgsCount',
112 value: function getArgsCount(name) {
113 var checker = this.checkers.get(name);
114 return checker ? checker.length : 0;
115 }
116 }, {
117 key: 'splitArguments',
118 value: function splitArguments(name, oargs) {
119 var nargs = this.getArgsCount(name);
120 var args = _.slice(oargs, 0, nargs);
121 var restArgs = _.slice(oargs, nargs);
122 return { args: args, restArgs: restArgs };
123 }
124 }, {
125 key: 'checkMessage',
126 value: function checkMessage(msg) {
127 return check.object(msg) && check.string(msg.textMessage) && _.keys(msg).length === 1;
128 }
129 }, {
130 key: 'checkObject',
131 value: function checkObject(obj) {
132 return check.object(obj);
133 }
134 }, {
135 key: 'checkTypes',
136 value: function checkTypes(checkers, args) {
137 if (args.length !== checkers.length) {
138 return new ChatServiceError('wrongArgumentsCount', checkers.length, args.length);
139 }
140 for (var idx = 0; idx < checkers.length; idx++) {
141 var checker = checkers[idx];
142 if (!checker(args[idx])) {
143 return new ChatServiceError('badArgument', idx, args[idx]);
144 }
145 }
146 return null;
147 }
148 }, {
149 key: 'directAddToList',
150 value: function directAddToList(listName, userNames) {
151 return [check.string, check.array.of.string];
152 }
153 }, {
154 key: 'directGetAccessList',
155 value: function directGetAccessList(listName) {
156 return [check.string];
157 }
158 }, {
159 key: 'directGetWhitelistMode',
160 value: function directGetWhitelistMode() {
161 return [];
162 }
163 }, {
164 key: 'directMessage',
165 value: function directMessage(toUser, msg) {
166 return [check.string, this.directMessagesChecker ? this.checkObject : this.checkMessage];
167 }
168 }, {
169 key: 'directRemoveFromList',
170 value: function directRemoveFromList(listName, userNames) {
171 return [check.string, check.array.of.string];
172 }
173 }, {
174 key: 'directSetWhitelistMode',
175 value: function directSetWhitelistMode(mode) {
176 return [check.boolean];
177 }
178 }, {
179 key: 'listOwnSockets',
180 value: function listOwnSockets() {
181 return [];
182 }
183 }, {
184 key: 'roomAddToList',
185 value: function roomAddToList(roomName, listName, userNames) {
186 return [check.string, check.string, check.array.of.string];
187 }
188 }, {
189 key: 'roomCreate',
190 value: function roomCreate(roomName, mode) {
191 return [check.string, check.boolean];
192 }
193 }, {
194 key: 'roomDelete',
195 value: function roomDelete(roomName) {
196 return [check.string];
197 }
198 }, {
199 key: 'roomGetAccessList',
200 value: function roomGetAccessList(roomName, listName) {
201 return [check.string, check.string];
202 }
203 }, {
204 key: 'roomGetOwner',
205 value: function roomGetOwner(roomName) {
206 return [check.string];
207 }
208 }, {
209 key: 'roomGetWhitelistMode',
210 value: function roomGetWhitelistMode(roomName) {
211 return [check.string];
212 }
213 }, {
214 key: 'roomRecentHistory',
215 value: function roomRecentHistory(roomName) {
216 return [check.string];
217 }
218 }, {
219 key: 'roomHistoryGet',
220 value: function roomHistoryGet(roomName, id, limit) {
221 return [check.string, function (str) {
222 return check.greaterOrEqual(str, 0);
223 }, function (str) {
224 return check.greaterOrEqual(str, 1);
225 }];
226 }
227 }, {
228 key: 'roomHistoryInfo',
229 value: function roomHistoryInfo(roomName) {
230 return [check.string];
231 }
232 }, {
233 key: 'roomJoin',
234 value: function roomJoin(roomName) {
235 return [check.string];
236 }
237 }, {
238 key: 'roomLeave',
239 value: function roomLeave(roomName) {
240 return [check.string];
241 }
242 }, {
243 key: 'roomMessage',
244 value: function roomMessage(roomName, msg) {
245 return [check.string, this.roomMessagesChecker ? this.checkObject : this.checkMessage];
246 }
247 }, {
248 key: 'roomNotificationsInfo',
249 value: function roomNotificationsInfo(roomName) {
250 return [check.string];
251 }
252 }, {
253 key: 'roomRemoveFromList',
254 value: function roomRemoveFromList(roomName, listName, userNames) {
255 return [check.string, check.string, check.array.of.string];
256 }
257 }, {
258 key: 'roomSetWhitelistMode',
259 value: function roomSetWhitelistMode(roomName, mode) {
260 return [check.string, check.boolean];
261 }
262 }, {
263 key: 'roomUserSeen',
264 value: function roomUserSeen(roomName, userName) {
265 return [check.string, check.string];
266 }
267 }, {
268 key: 'systemMessage',
269 value: function systemMessage(data) {
270 return [function () {
271 return true;
272 }];
273 }
274 }]);
275 return ArgumentsValidator;
276}();
277
278module.exports = ArgumentsValidator;
279//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Bcmd1bWVudHNWYWxpZGF0b3IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTSxtQkFBbUIsUUFBUSxvQkFBUixDQUF6QjtBQUNBLElBQU0sVUFBVSxRQUFRLHNCQUFSLENBQWhCO0FBQ0EsSUFBTSxVQUFVLFFBQVEsVUFBUixDQUFoQjtBQUNBLElBQU0sSUFBSSxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU0sUUFBUSxRQUFRLGFBQVIsQ0FBZDs7ZUFDNkIsUUFBUSxTQUFSLEM7O0lBQXJCLGdCLFlBQUEsZ0I7O0FBRVI7O0lBQ00sa0I7QUFFSiw4QkFBYSxNQUFiLEVBQXFCO0FBQUE7O0FBQ25CLFNBQUssTUFBTCxHQUFjLE1BQWQ7QUFDQSxTQUFLLFFBQUwsR0FBZ0IsSUFBSSxPQUFKLEVBQWhCO0FBQ0EsU0FBSyxxQkFBTCxHQUE2QixLQUFLLE1BQUwsQ0FBWSxxQkFBekM7QUFDQSxTQUFLLG1CQUFMLEdBQTJCLEtBQUssTUFBTCxDQUFZLG1CQUF2QztBQUNBLFNBQUssY0FBTCxHQUFzQjtBQUNwQixxQkFBZSxDQUFFLElBQUYsRUFBUSxLQUFLLHFCQUFiLENBREs7QUFFcEIsbUJBQWEsQ0FBRSxJQUFGLEVBQVEsS0FBSyxtQkFBYjtBQUZPLEtBQXRCO0FBSUEsUUFBSSxXQUFXLEtBQUssTUFBTCxDQUFZLGdCQUEzQjtBQVRtQjtBQUFBO0FBQUE7O0FBQUE7QUFVbkIsc0RBQWdCLFFBQWhCLDRHQUEwQjtBQUFBLFlBQWpCLEdBQWlCOztBQUN4QixhQUFLLFFBQUwsQ0FBYyxHQUFkLENBQWtCLEdBQWxCLEVBQXVCLEtBQUssR0FBTCxHQUF2QjtBQUNEO0FBWmtCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFhcEI7Ozs7bUNBRWUsSSxFQUFlO0FBQUE7O0FBQUEsd0NBQU4sSUFBTTtBQUFOLFlBQU07QUFB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QUEsZUFBTyxNQUFNLGNBQU4sQ0FBcUIsR0FBckIsRUFBMEIsQ0FBMUIsQ0FBUDtBQUFBLE9BSEssQ0FBUDtBQUtEOzs7b0NBRWdCLFEsRUFBVTtBQUN6QixhQUFPLENBQ0wsTUFBTSxNQURELENBQVA7QUFHRDs7OzZCQUVTLFEsRUFBVTtBQUNsQixhQUFPLENBQ0wsTUFBTSxNQURELENBQVA7QUFHRDs7OzhCQUVVLFEsRUFBVTtBQUNuQixhQUFPLENBQ0wsTUFBTSxNQURELENBQVA7QUFHRDs7O2dDQUVZLFEsRUFBVSxHLEVBQUs7QUFDMUIsYUFBTyxDQUNMLE1BQU0sTUFERCxFQUVMLEtBQUssbUJBQUwsR0FBMkIsS0FBSyxXQUFoQyxHQUE4QyxLQUFLLFlBRjlDLENBQVA7QUFJRDs7OzBDQUVzQixRLEVBQVU7QUFDL0IsYUFBTyxDQUNMLE1BQU0sTUFERCxDQUFQO0FBR0Q7Ozt1Q0FFbUIsUSxFQUFVLFEsRUFBVSxTLEVBQVc7QUFDakQsYUFBTyxDQUNMLE1BQU0sTUFERCxFQUVMLE1BQU0sTUFGRCxFQUdMLE1BQU0sS0FBTixDQUFZLEVBQVosQ0FBZSxNQUhWLENBQVA7QUFLRDs7O3lDQUVxQixRLEVBQVUsSSxFQUFNO0FBQ3BDLGFBQU8sQ0FDTCxNQUFNLE1BREQsRUFFTCxNQUFNLE9BRkQsQ0FBUDtBQUlEOzs7aUNBRWEsUSxFQUFVLFEsRUFBVTtBQUNoQyxhQUFPLENBQ0wsTUFBTSxNQURELEVBRUwsTUFBTSxNQUZELENBQVA7QUFJRDs7O2tDQUVjLEksRUFBTTtBQUNuQixhQUFPLENBQ0w7QUFBQSxlQUFNLElBQU47QUFBQSxPQURLLENBQVA7QUFHRDs7Ozs7QUFHSCxPQUFPLE9BQVAsR0FBaUIsa0JBQWpCIiwiZmlsZSI6IkFyZ3VtZW50c1ZhbGlkYXRvci5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBDaGF0U2VydmljZUVycm9yID0gcmVxdWlyZSgnLi9DaGF0U2VydmljZUVycm9yJylcbmNvbnN0IEZhc3RNYXAgPSByZXF1aXJlKCdjb2xsZWN0aW9ucy9mYXN0LW1hcCcpXG5jb25zdCBQcm9taXNlID0gcmVxdWlyZSgnYmx1ZWJpcmQnKVxuY29uc3QgXyA9IHJlcXVpcmUoJ2xvZGFzaCcpXG5jb25zdCBjaGVjayA9IHJlcXVpcmUoJ2NoZWNrLXR5cGVzJylcbmNvbnN0IHsgcG9zc2libHlDYWxsYmFjayB9ID0gcmVxdWlyZSgnLi91dGlscycpXG5cbi8vIENvbW1hbmRzIGFyZ3VtZW50cyB0eXBlIGFuZCBjb3VudCB2YWxpZGF0aW9uLlxuY2xhc3MgQXJndW1lbnRzVmFsaWRhdG9yIHtcblxuICBjb25zdHJ1Y3RvciAoc2VydmVyKSB7XG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXJcbiAgICB0aGlzLmNoZWNrZXJzID0gbmV3IEZhc3RNYXAoKVxuICAgIHRoaXMuZGlyZWN0TWVzc2FnZXNDaGVja2VyID0gdGhpcy5zZXJ2ZXIuZGlyZWN0TWVzc2FnZXNDaGVja2VyXG4gICAgdGhpcy5yb29tTWVzc2FnZXNDaGVja2VyID0gdGhpcy5zZXJ2ZXIucm9vbU1lc3NhZ2VzQ2hlY2tlclxuICAgIHRoaXMuY3VzdG9tQ2hlY2tlcnMgPSB7XG4gICAgICBkaXJlY3RNZXNzYWdlOiBbIG51bGwsIHRoaXMuZGlyZWN0TWVzc2FnZXNDaGVja2VyIF0sXG4gICAgICByb29tTWVzc2FnZTogWyBudWxsLCB0aGlzLnJvb21NZXNzYWdlc0NoZWNrZXIgXVxuICAgIH1cbiAgICBsZXQgY29tbWFuZHMgPSB0aGlzLnNlcnZlci5ycGNSZXF1ZXN0c05hbWVzXG4gICAgZm9yIChsZXQgY21kIG9mIGNvbW1hbmRzKSB7XG4gICAgICB0aGlzLmNoZWNrZXJzLnNldChjbWQsIHRoaXNbY21kXSgpKVxuICAgIH1cbiAgfVxuXG4gIGNoZWNrQXJndW1lbnRzIChuYW1lLCAuLi5hcmdzKSB7XG4gICAgbGV0IFtuYXJncywgY2JdID0gcG9zc2libHlDYWxsYmFjayhhcmdzKVxuICAgIHJldHVybiBQcm9taXNlLnRyeSgoKSA9PiB7XG4gICAgICBsZXQgY2hlY2tlcnMgPSB0aGlzLmNoZWNrZXJzLmdldChuYW1lKVxuICAgICAgaWYgKCFjaGVja2Vycykge1xuICAgICAgICBsZXQgZXJyb3IgPSBuZXcgQ2hhdFNlcnZpY2VFcnJvcignbm9Db21tYW5kJywgbmFtZSlcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKVxuICAgICAgfVxuICAgICAgbGV0IGVycm9yID0gdGhpcy5jaGVja1R5cGVzKGNoZWNrZXJzLCBuYXJncylcbiAgICAgIGlmIChlcnJvcikgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpIH1cbiAgICAgIGxldCBjdXN0b21DaGVja2VycyA9IHRoaXMuY3VzdG9tQ2hlY2tlcnNbbmFtZV0gfHwgW11cbiAgICAgIHJldHVybiBQcm9taXNlLmVhY2goY3VzdG9tQ2hlY2tlcnMsIChjaGVja2VyLCBpZHgpID0+IHtcbiAgICAgICAgaWYgKGNoZWNrZXIpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5mcm9tQ2FsbGJhY2soZm4gPT4gY2hlY2tlcihuYXJnc1tpZHhdLCBmbikpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pLnJldHVybigpXG4gICAgfSkuYXNDYWxsYmFjayhjYilcbiAgfVxuXG4gIGdldEFyZ3NDb3VudCAobmFtZSkge1xuICAgIGxldCBjaGVja2VyID0gdGhpcy5jaGVja2Vycy5nZXQobmFtZSlcbiAgICByZXR1cm4gY2hlY2tlciA/IGNoZWNrZXIubGVuZ3RoIDogMFxuICB9XG5cbiAgc3BsaXRBcmd1bWVudHMgKG5hbWUsIG9hcmdzKSB7XG4gICAgbGV0IG5hcmdzID0gdGhpcy5nZXRBcmdzQ291bnQobmFtZSlcbiAgICBsZXQgYXJncyA9IF8uc2xpY2Uob2FyZ3MsIDAsIG5hcmdzKVxuICAgIGxldCByZXN0QXJncyA9IF8uc2xpY2Uob2FyZ3MsIG5hcmdzKVxuICAgIHJldHVybiB7YXJncywgcmVzdEFyZ3N9XG4gIH1cblxuICBjaGVja01lc3NhZ2UgKG1zZykge1xuICAgIHJldHVybiBjaGVjay5vYmplY3QobXNnKSAmJlxuICAgICAgY2hlY2suc3RyaW5nKG1zZy50ZXh0TWVzc2FnZSkgJiZcbiAgICAgIF8ua2V5cyhtc2cpLmxlbmd0aCA9PT0gMVxuICB9XG5cbiAgY2hlY2tPYmplY3QgKG9iaikge1xuICAgIHJldHVybiBjaGVjay5vYmplY3Qob2JqKVxuICB9XG5cbiAgY2hlY2tUeXBlcyAoY2hlY2tlcnMsIGFyZ3MpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggIT09IGNoZWNrZXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG5ldyBDaGF0U2VydmljZUVycm9yKFxuICAgICAgICAnd3JvbmdBcmd1bWVudHNDb3VudCcsIGNoZWNrZXJzLmxlbmd0aCwgYXJncy5sZW5ndGgpXG4gICAgfVxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGNoZWNrZXJzLmxlbmd0aDsgaWR4KyspIHtcbiAgICAgIGxldCBjaGVja2VyID0gY2hlY2tlcnNbaWR4XVxuICAgICAgaWYgKCFjaGVja2VyKGFyZ3NbaWR4XSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGF0U2VydmljZUVycm9yKCdiYWRBcmd1bWVudCcsIGlkeCwgYXJnc1tpZHhdKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgZGlyZWN0QWRkVG9MaXN0IChsaXN0TmFtZSwgdXNlck5hbWVzKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNoZWNrLnN0cmluZyxcbiAgICAgIGNoZWNrLmFycmF5Lm9mLnN0cmluZ1xuICAgIF1cbiAgfVxuXG4gIGRpcmVjdEdldEFjY2Vzc0xpc3QgKGxpc3ROYW1lKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNoZWNrLnN0cmluZ1xuICAgIF1cbiAgfVxuXG4gIGRpcmVjdEdldFdoaXRlbGlzdE1vZGUgKCkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgZGlyZWN0TWVzc2FnZSAodG9Vc2VyLCBtc2cpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suc3RyaW5nLFxuICAgICAgdGhpcy5kaXJlY3RNZXNzYWdlc0NoZWNrZXIgPyB0aGlzLmNoZWNrT2JqZWN0IDogdGhpcy5jaGVja01lc3NhZ2VcbiAgICBdXG4gIH1cblxuICBkaXJlY3RSZW1vdmVGcm9tTGlzdCAobGlzdE5hbWUsIHVzZXJOYW1lcykge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmcsXG4gICAgICBjaGVjay5hcnJheS5vZi5zdHJpbmdcbiAgICBdXG4gIH1cblxuICBkaXJlY3RTZXRXaGl0ZWxpc3RNb2RlIChtb2RlKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNoZWNrLmJvb2xlYW5cbiAgICBdXG4gIH1cblxuICBsaXN0T3duU29ja2V0cyAoKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICByb29tQWRkVG9MaXN0IChyb29tTmFtZSwgbGlzdE5hbWUsIHVzZXJOYW1lcykge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmcsXG4gICAgICBjaGVjay5zdHJpbmcsXG4gICAgICBjaGVjay5hcnJheS5vZi5zdHJpbmdcbiAgICBdXG4gIH1cblxuICByb29tQ3JlYXRlIChyb29tTmFtZSwgbW9kZSkge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmcsXG4gICAgICBjaGVjay5ib29sZWFuXG4gICAgXVxuICB9XG5cbiAgcm9vbURlbGV0ZSAocm9vbU5hbWUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suc3RyaW5nXG4gICAgXVxuICB9XG5cbiAgcm9vbUdldEFjY2Vzc0xpc3QgKHJvb21OYW1lLCBsaXN0TmFtZSkge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmcsXG4gICAgICBjaGVjay5zdHJpbmdcbiAgICBdXG4gIH1cblxuICByb29tR2V0T3duZXIgKHJvb21OYW1lKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNoZWNrLnN0cmluZ1xuICAgIF1cbiAgfVxuXG4gIHJvb21HZXRXaGl0ZWxpc3RNb2RlIChyb29tTmFtZSkge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmdcbiAgICBdXG4gIH1cblxuICByb29tUmVjZW50SGlzdG9yeSAocm9vbU5hbWUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suc3RyaW5nXG4gICAgXVxuICB9XG5cbiAgcm9vbUhpc3RvcnlHZXQgKHJvb21OYW1lLCBpZCwgbGltaXQpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suc3RyaW5nLFxuICAgICAgc3RyID0+IGNoZWNrLmdyZWF0ZXJPckVxdWFsKHN0ciwgMCksXG4gICAgICBzdHIgPT4gY2hlY2suZ3JlYXRlck9yRXF1YWwoc3RyLCAxKVxuICAgIF1cbiAgfVxuXG4gIHJvb21IaXN0b3J5SW5mbyAocm9vbU5hbWUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suc3RyaW5nXG4gICAgXVxuICB9XG5cbiAgcm9vbUpvaW4gKHJvb21OYW1lKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNoZWNrLnN0cmluZ1xuICAgIF1cbiAgfVxuXG4gIHJvb21MZWF2ZSAocm9vbU5hbWUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suc3RyaW5nXG4gICAgXVxuICB9XG5cbiAgcm9vbU1lc3NhZ2UgKHJvb21OYW1lLCBtc2cpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suc3RyaW5nLFxuICAgICAgdGhpcy5yb29tTWVzc2FnZXNDaGVja2VyID8gdGhpcy5jaGVja09iamVjdCA6IHRoaXMuY2hlY2tNZXNzYWdlXG4gICAgXVxuICB9XG5cbiAgcm9vbU5vdGlmaWNhdGlvbnNJbmZvIChyb29tTmFtZSkge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmdcbiAgICBdXG4gIH1cblxuICByb29tUmVtb3ZlRnJvbUxpc3QgKHJvb21OYW1lLCBsaXN0TmFtZSwgdXNlck5hbWVzKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNoZWNrLnN0cmluZyxcbiAgICAgIGNoZWNrLnN0cmluZyxcbiAgICAgIGNoZWNrLmFycmF5Lm9mLnN0cmluZ1xuICAgIF1cbiAgfVxuXG4gIHJvb21TZXRXaGl0ZWxpc3RNb2RlIChyb29tTmFtZSwgbW9kZSkge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmcsXG4gICAgICBjaGVjay5ib29sZWFuXG4gICAgXVxuICB9XG5cbiAgcm9vbVVzZXJTZWVuIChyb29tTmFtZSwgdXNlck5hbWUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suc3RyaW5nLFxuICAgICAgY2hlY2suc3RyaW5nXG4gICAgXVxuICB9XG5cbiAgc3lzdGVtTWVzc2FnZSAoZGF0YSkge1xuICAgIHJldHVybiBbXG4gICAgICAoKSA9PiB0cnVlXG4gICAgXVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQXJndW1lbnRzVmFsaWRhdG9yXG4iXX0=
\No newline at end of file