ng2-rest 13.2.7 → 13.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +135 -135
- package/assets/shared/shared_folder_info.txt +1 -1
- package/browser/README.md +24 -24
- package/browser/esm2020/lib/content-type.mjs +12 -12
- package/browser/esm2020/lib/cookie.mjs +28 -28
- package/browser/esm2020/lib/helpers.mjs +23 -23
- package/browser/esm2020/lib/index.mjs +12 -12
- package/browser/esm2020/lib/mapping.mjs +238 -238
- package/browser/esm2020/lib/models.mjs +159 -159
- package/browser/esm2020/lib/other/simple-resource.mjs +116 -116
- package/browser/esm2020/lib/params.mjs +278 -278
- package/browser/esm2020/lib/request-cache.mjs +100 -100
- package/browser/esm2020/lib/resource.service.mjs +213 -213
- package/browser/esm2020/lib/rest-headers.mjs +128 -128
- package/browser/esm2020/lib/rest-request.mjs +321 -321
- package/browser/esm2020/lib/rest.class.mjs +115 -115
- package/browser/esm2020/ng2-rest.mjs +4 -4
- package/browser/esm2020/public-api.mjs +1 -1
- package/browser/fesm2015/ng2-rest.mjs +1677 -1677
- package/browser/fesm2020/ng2-rest.mjs +1675 -1675
- package/browser/lib/content-type.d.ts +4 -4
- package/browser/lib/cookie.d.ts +7 -7
- package/browser/lib/helpers.d.ts +10 -10
- package/browser/lib/index.d.ts +9 -9
- package/browser/lib/mapping.d.ts +12 -12
- package/browser/lib/models.d.ts +157 -157
- package/browser/lib/other/simple-resource.d.ts +29 -29
- package/browser/lib/params.d.ts +23 -23
- package/browser/lib/request-cache.d.ts +17 -17
- package/browser/lib/resource.service.d.ts +43 -43
- package/browser/lib/rest-headers.d.ts +57 -57
- package/browser/lib/rest-request.d.ts +21 -21
- package/browser/lib/rest.class.d.ts +36 -36
- package/browser/ng2-rest.d.ts +4 -4
- package/client/README.md +24 -24
- package/client/esm2020/lib/content-type.mjs +12 -12
- package/client/esm2020/lib/cookie.mjs +28 -28
- package/client/esm2020/lib/helpers.mjs +23 -23
- package/client/esm2020/lib/index.mjs +12 -12
- package/client/esm2020/lib/mapping.mjs +238 -238
- package/client/esm2020/lib/models.mjs +159 -159
- package/client/esm2020/lib/other/simple-resource.mjs +116 -116
- package/client/esm2020/lib/params.mjs +278 -278
- package/client/esm2020/lib/request-cache.mjs +100 -100
- package/client/esm2020/lib/resource.service.mjs +213 -213
- package/client/esm2020/lib/rest-headers.mjs +128 -128
- package/client/esm2020/lib/rest-request.mjs +321 -321
- package/client/esm2020/lib/rest.class.mjs +115 -115
- package/client/esm2020/ng2-rest.mjs +4 -4
- package/client/esm2020/public-api.mjs +1 -1
- package/client/fesm2015/ng2-rest.mjs +1677 -1677
- package/client/fesm2020/ng2-rest.mjs +1675 -1675
- package/client/lib/content-type.d.ts +4 -4
- package/client/lib/cookie.d.ts +7 -7
- package/client/lib/helpers.d.ts +10 -10
- package/client/lib/index.d.ts +9 -9
- package/client/lib/mapping.d.ts +12 -12
- package/client/lib/models.d.ts +157 -157
- package/client/lib/other/simple-resource.d.ts +29 -29
- package/client/lib/params.d.ts +23 -23
- package/client/lib/request-cache.d.ts +17 -17
- package/client/lib/resource.service.d.ts +43 -43
- package/client/lib/rest-headers.d.ts +57 -57
- package/client/lib/rest-request.d.ts +21 -21
- package/client/lib/rest.class.d.ts +36 -36
- package/client/ng2-rest.d.ts +4 -4
- package/client/package.json +28 -28
- package/index.d.ts +1 -1
- package/index.js.map +1 -1
- package/lib/content-type.d.ts +5 -5
- package/lib/content-type.js.map +1 -1
- package/lib/cookie.d.ts +8 -8
- package/lib/cookie.js.map +1 -1
- package/lib/helpers.d.ts +11 -11
- package/lib/helpers.js.map +1 -1
- package/lib/index.d.ts +10 -10
- package/lib/index.js.map +1 -1
- package/lib/mapping.d.ts +13 -13
- package/lib/mapping.js.map +1 -1
- package/lib/models.d.ts +158 -158
- package/lib/models.js.map +1 -1
- package/lib/other/simple-resource.d.ts +30 -30
- package/lib/other/simple-resource.js.map +1 -1
- package/lib/params.d.ts +24 -24
- package/lib/params.js.map +1 -1
- package/lib/request-cache.d.ts +18 -18
- package/lib/request-cache.js.map +1 -1
- package/lib/resource.service.d.ts +44 -44
- package/lib/resource.service.js.map +1 -1
- package/lib/rest-headers.d.ts +58 -58
- package/lib/rest-headers.js.map +1 -1
- package/lib/rest-request.d.ts +22 -22
- package/lib/rest-request.js.map +1 -1
- package/lib/rest.class.d.ts +37 -37
- package/lib/rest.class.js.map +1 -1
- package/package.json +4 -4
- package/package.json_devDependencies.json +217 -217
- package/package.json_tnp.json5 +53 -50
- package/tmp-environment.json +34 -33
- package/websql/README.md +24 -24
- package/websql/esm2020/lib/content-type.mjs +12 -12
- package/websql/esm2020/lib/cookie.mjs +28 -28
- package/websql/esm2020/lib/helpers.mjs +23 -23
- package/websql/esm2020/lib/index.mjs +12 -12
- package/websql/esm2020/lib/mapping.mjs +238 -238
- package/websql/esm2020/lib/models.mjs +159 -159
- package/websql/esm2020/lib/other/simple-resource.mjs +116 -116
- package/websql/esm2020/lib/params.mjs +278 -278
- package/websql/esm2020/lib/request-cache.mjs +100 -100
- package/websql/esm2020/lib/resource.service.mjs +213 -213
- package/websql/esm2020/lib/rest-headers.mjs +128 -128
- package/websql/esm2020/lib/rest-request.mjs +321 -321
- package/websql/esm2020/lib/rest.class.mjs +115 -115
- package/websql/esm2020/ng2-rest.mjs +4 -4
- package/websql/esm2020/public-api.mjs +1 -1
- package/websql/fesm2015/ng2-rest.mjs +1677 -1677
- package/websql/fesm2020/ng2-rest.mjs +1675 -1675
- package/websql/lib/content-type.d.ts +4 -4
- package/websql/lib/cookie.d.ts +7 -7
- package/websql/lib/helpers.d.ts +10 -10
- package/websql/lib/index.d.ts +9 -9
- package/websql/lib/mapping.d.ts +12 -12
- package/websql/lib/models.d.ts +157 -157
- package/websql/lib/other/simple-resource.d.ts +29 -29
- package/websql/lib/params.d.ts +23 -23
- package/websql/lib/request-cache.d.ts +17 -17
- package/websql/lib/resource.service.d.ts +43 -43
- package/websql/lib/rest-headers.d.ts +57 -57
- package/websql/lib/rest-request.d.ts +21 -21
- package/websql/lib/rest.class.d.ts +36 -36
- package/websql/ng2-rest.d.ts +4 -4
|
@@ -1,279 +1,279 @@
|
|
|
1
|
-
import { diffChars } from 'diff';
|
|
2
|
-
import { _ } from 'tnp-core/browser';
|
|
3
|
-
import { Log, Level } from 'ng2-logger/browser';
|
|
4
|
-
import { Helpers } from './helpers';
|
|
5
|
-
const log = Log.create('[ng2-rest] params', Level.__NOTHING);
|
|
6
|
-
/** check if string is a valid pattern */
|
|
7
|
-
export function isValid(pattern) {
|
|
8
|
-
return (new RegExp('\/:[a-zA-Z]*', 'g')).test(pattern.replace('://', ''));
|
|
9
|
-
}
|
|
10
|
-
export function check(url, pattern) {
|
|
11
|
-
if (!Helpers.checkValidUrl(url)) {
|
|
12
|
-
log.error(`Incorrect url: ${url}`);
|
|
13
|
-
return false;
|
|
14
|
-
}
|
|
15
|
-
if (url.charAt(url.length - 1) === '/')
|
|
16
|
-
url = url.slice(0, url.length - 2);
|
|
17
|
-
if (pattern.charAt(pattern.length - 1) === '/')
|
|
18
|
-
pattern = pattern.slice(0, url.length - 2);
|
|
19
|
-
pattern = pattern.replace(/\//g, '\/');
|
|
20
|
-
pattern = pattern.replace(new RegExp('\/:[a-zA-Z]*', 'g'), '.+');
|
|
21
|
-
let reg = new RegExp(pattern, 'g');
|
|
22
|
-
return reg.test(url);
|
|
23
|
-
}
|
|
24
|
-
export function getModels(pattern) {
|
|
25
|
-
let m = pattern.match(new RegExp('[a-z-A-Z]*\/:', 'g'));
|
|
26
|
-
return m.map(p => p.replace('/:', ''));
|
|
27
|
-
}
|
|
28
|
-
export function getRestPramsNames(pattern) {
|
|
29
|
-
if (pattern.charAt(pattern.length - 1) !== '/')
|
|
30
|
-
pattern = `${pattern}/`;
|
|
31
|
-
let m = pattern.match(new RegExp(':[a-zA-Z]*\/', 'g'));
|
|
32
|
-
let res = m.map(p => p.replace(':', '').replace('/', ''));
|
|
33
|
-
return res.filter(p => p.trim() !== '');
|
|
34
|
-
}
|
|
35
|
-
export function containsModels(url, models) {
|
|
36
|
-
if (url.charAt(0) !== '/')
|
|
37
|
-
url = '/' + url;
|
|
38
|
-
let res = models.filter(m => {
|
|
39
|
-
let word = '/' + m;
|
|
40
|
-
let iii = url.indexOf(word);
|
|
41
|
-
if (iii + word.length < url.length && url.charAt(iii + word.length) !== '/') {
|
|
42
|
-
return false;
|
|
43
|
-
}
|
|
44
|
-
if (iii !== -1) {
|
|
45
|
-
url = url.replace(new RegExp('\/' + m, 'g'), '');
|
|
46
|
-
return true;
|
|
47
|
-
}
|
|
48
|
-
return false;
|
|
49
|
-
}).length;
|
|
50
|
-
return res === models.length;
|
|
51
|
-
}
|
|
52
|
-
export function stars(n) {
|
|
53
|
-
let res = '';
|
|
54
|
-
for (let i = 0; i < n; i++)
|
|
55
|
-
res += '*';
|
|
56
|
-
return res;
|
|
57
|
-
}
|
|
58
|
-
export function getRestParams(url, pattern) {
|
|
59
|
-
let res = {};
|
|
60
|
-
let models = getRestPramsNames(pattern);
|
|
61
|
-
models.forEach(m => {
|
|
62
|
-
pattern = pattern.replace(`:${m}`, stars(m.length));
|
|
63
|
-
});
|
|
64
|
-
let currentModel = void 0;
|
|
65
|
-
diffChars(pattern, url).forEach(d => {
|
|
66
|
-
if (d.added) {
|
|
67
|
-
if (!isNaN(Number(d.value)))
|
|
68
|
-
res[currentModel] = Number(d.value);
|
|
69
|
-
else if (d.value.trim() === 'true')
|
|
70
|
-
res[currentModel] = true;
|
|
71
|
-
else if (d.value.trim() === 'false')
|
|
72
|
-
res[currentModel] = false;
|
|
73
|
-
else
|
|
74
|
-
res[currentModel] = decodeURIComponent(d.value);
|
|
75
|
-
currentModel = void 0;
|
|
76
|
-
}
|
|
77
|
-
let m = d.value.replace(':', "");
|
|
78
|
-
if (d.removed) {
|
|
79
|
-
currentModel = models.shift();
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
return res;
|
|
83
|
-
}
|
|
84
|
-
export const regexisPath = /[^\..]+(\.[^\..]+)+/g;
|
|
85
|
-
/**
|
|
86
|
-
* Models like books/:id
|
|
87
|
-
*/
|
|
88
|
-
function cutUrlModel(params, models, output) {
|
|
89
|
-
if (models.length === 0)
|
|
90
|
-
return output.join('\/');
|
|
91
|
-
let m = models.pop();
|
|
92
|
-
let param = m.match(/:[a-zA-Z0-9\.]+/)[0].replace(':', '');
|
|
93
|
-
const paramIsPath = regexisPath.test(param);
|
|
94
|
-
let model = m.match(/[a-zA-Z0-9]+\//)[0].replace('\/', '');
|
|
95
|
-
if (params === void 0 ||
|
|
96
|
-
(paramIsPath ? _.get(params, param) === void 0 : params[param] === void 0) ||
|
|
97
|
-
param === 'undefined') {
|
|
98
|
-
output.length = 0;
|
|
99
|
-
output.unshift(model);
|
|
100
|
-
return cutUrlModel(params, models, output);
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
if (paramIsPath) {
|
|
104
|
-
let mrep = m.replace(new RegExp(`:${param}`, 'g'), `${_.get(params, param)}`);
|
|
105
|
-
output.unshift(mrep);
|
|
106
|
-
return cutUrlModel(params, models, output);
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
let mrep = m.replace(new RegExp(`:${param}`, 'g'), `${params[param]}`);
|
|
110
|
-
output.unshift(mrep);
|
|
111
|
-
return cutUrlModel(params, models, output);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
export function interpolateParamsToUrl(params, url) {
|
|
116
|
-
const regexInt = /\[\[([^\..]+\.[^\..]+)+\]\]/g;
|
|
117
|
-
url = url.split('/').map(p => {
|
|
118
|
-
let isParam = p.startsWith(':');
|
|
119
|
-
if (isParam) {
|
|
120
|
-
let part = p.slice(1);
|
|
121
|
-
if (regexInt.test(part)) {
|
|
122
|
-
part = part.replace('[[', '');
|
|
123
|
-
part = part.replace(']]', '');
|
|
124
|
-
}
|
|
125
|
-
return `:${part}`;
|
|
126
|
-
}
|
|
127
|
-
return p;
|
|
128
|
-
}).join('/');
|
|
129
|
-
let slash = {
|
|
130
|
-
start: url.charAt(0) === '\/',
|
|
131
|
-
end: url.charAt(url.length - 1) === '\/'
|
|
132
|
-
};
|
|
133
|
-
let morePramsOnEnd = url.match(/(\/:[a-zA-Z0-9\.]+){2,10}/g);
|
|
134
|
-
if (morePramsOnEnd && (Array.isArray(morePramsOnEnd) && morePramsOnEnd.length === 1)) {
|
|
135
|
-
let m = morePramsOnEnd[0];
|
|
136
|
-
let match = m.match(/\/:[a-zA-Z0-9\.]+/g);
|
|
137
|
-
match.forEach(e => {
|
|
138
|
-
let c = e.replace('\/:', '');
|
|
139
|
-
if (regexisPath.test(c)) {
|
|
140
|
-
url = url.replace(e, `/${_.get(params, c)}`);
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
143
|
-
url = url.replace(e, `/${params[c]}`);
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
return url;
|
|
147
|
-
}
|
|
148
|
-
let nestedParams = url.match(/[a-zA-Z0-9]+\/:[a-zA-Z0-9\.]+/g);
|
|
149
|
-
if (!nestedParams || (Array.isArray(nestedParams) && nestedParams.length === 0))
|
|
150
|
-
return url;
|
|
151
|
-
if (!slash.end)
|
|
152
|
-
url = `${url}/`;
|
|
153
|
-
let addUndefinedForAlone = (!/:[a-zA-Z0-9\.]+\/$/g.test(url) && /[a-zA-Z0-9]+\/$/g.test(url));
|
|
154
|
-
let replace = (nestedParams.length > 1 ? nestedParams.join('\/') : nestedParams[0]) +
|
|
155
|
-
(addUndefinedForAlone ? '\/' + url.match(/[a-zA-Z0-9]+\/$/g)[0] : '\/');
|
|
156
|
-
let beginHref = url.replace(replace, '');
|
|
157
|
-
if (addUndefinedForAlone) {
|
|
158
|
-
url = url.replace(/\/$/g, '/:undefined');
|
|
159
|
-
nestedParams = url.match(/[a-zA-Z0-9]+\/:[a-zA-Z0-9\.]+/g);
|
|
160
|
-
url = cutUrlModel(params, nestedParams, []);
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
url = cutUrlModel(params, nestedParams, []);
|
|
164
|
-
}
|
|
165
|
-
url = beginHref + url;
|
|
166
|
-
if (url.charAt(url.length - 1) !== '/' && slash.end)
|
|
167
|
-
url = `${url}/`;
|
|
168
|
-
if (url.charAt(0) !== '\/' && slash.start)
|
|
169
|
-
url = `/${url}`;
|
|
170
|
-
return url;
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Get query params from url, like 'ex' in /api/books?ex=value
|
|
174
|
-
*/
|
|
175
|
-
export function decodeUrl(url) {
|
|
176
|
-
let regex = /[?&]([^=#]+)=([^&#]*)/g, params = {}, match;
|
|
177
|
-
while (match = regex.exec(url)) {
|
|
178
|
-
params[decodeURIComponent(match[1])] = decodeURIComponent(match[2]);
|
|
179
|
-
}
|
|
180
|
-
let paramsObject = params;
|
|
181
|
-
for (let p in paramsObject) {
|
|
182
|
-
if (paramsObject[p] === void 0) {
|
|
183
|
-
delete paramsObject[p];
|
|
184
|
-
continue;
|
|
185
|
-
}
|
|
186
|
-
if (paramsObject.hasOwnProperty(p)) {
|
|
187
|
-
let n = Number(params[p]);
|
|
188
|
-
if (!isNaN(n)) {
|
|
189
|
-
params[p] = n;
|
|
190
|
-
continue;
|
|
191
|
-
}
|
|
192
|
-
if (typeof params[p] === 'string') {
|
|
193
|
-
let json;
|
|
194
|
-
try {
|
|
195
|
-
json = JSON.parse(params[p]);
|
|
196
|
-
}
|
|
197
|
-
catch (error) { }
|
|
198
|
-
if (json !== void 0) {
|
|
199
|
-
params[p] = json;
|
|
200
|
-
continue;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
return params;
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* Create query params string for url
|
|
209
|
-
*
|
|
210
|
-
* @export
|
|
211
|
-
* @param {UrlParams[]} params
|
|
212
|
-
* @returns {string}
|
|
213
|
-
*/
|
|
214
|
-
export function getParamsUrl(params, doNotSerialize = false) {
|
|
215
|
-
let urlparts = [];
|
|
216
|
-
if (!params)
|
|
217
|
-
return '';
|
|
218
|
-
if (!(params instanceof Array))
|
|
219
|
-
return '';
|
|
220
|
-
if (params.length === 0)
|
|
221
|
-
return '';
|
|
222
|
-
params.forEach(urlparam => {
|
|
223
|
-
if (JSON.stringify(urlparam) !== '{}') {
|
|
224
|
-
let parameters = [];
|
|
225
|
-
let paramObject = urlparam;
|
|
226
|
-
for (let p in paramObject) {
|
|
227
|
-
if (paramObject[p] === void 0)
|
|
228
|
-
delete paramObject[p];
|
|
229
|
-
if (paramObject.hasOwnProperty(p) && typeof p === 'string' && p !== 'regex' && !(paramObject[p] instanceof RegExp)) {
|
|
230
|
-
if (p.length > 0 && p[0] === '/') {
|
|
231
|
-
let newName = p.slice(1, p.length - 1);
|
|
232
|
-
urlparam[newName] = urlparam[p];
|
|
233
|
-
urlparam[p] = void 0;
|
|
234
|
-
p = newName;
|
|
235
|
-
}
|
|
236
|
-
if (p.length > 0 && p[p.length - 1] === '/') {
|
|
237
|
-
let newName = p.slice(0, p.length - 2);
|
|
238
|
-
urlparam[newName] = urlparam[p];
|
|
239
|
-
urlparam[p] = void 0;
|
|
240
|
-
p = newName;
|
|
241
|
-
}
|
|
242
|
-
let v = urlparam[p];
|
|
243
|
-
if (v instanceof Object) {
|
|
244
|
-
urlparam[p] = JSON.stringify(urlparam[p]);
|
|
245
|
-
}
|
|
246
|
-
urlparam[p] = doNotSerialize ? urlparam[p] : encodeURIComponent(urlparam[p]);
|
|
247
|
-
if (urlparam.regex !== void 0 && urlparam.regex instanceof RegExp) {
|
|
248
|
-
if (!urlparam.regex.test(urlparam[p])) {
|
|
249
|
-
console.warn(`Data: ${urlparam[p]} incostistent with regex ${urlparam.regex.source}`);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
parameters.push(`${p}=${urlparam[p]}`);
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
urlparts.push(parameters.join('&'));
|
|
256
|
-
}
|
|
257
|
-
});
|
|
258
|
-
let join = urlparts.join().trim();
|
|
259
|
-
if (join.trim() === '')
|
|
260
|
-
return '';
|
|
261
|
-
return `?${urlparts.join('&')}`;
|
|
262
|
-
}
|
|
263
|
-
function transform(o) {
|
|
264
|
-
if (typeof o === 'object') {
|
|
265
|
-
return encodeURIComponent(JSON.stringify(o));
|
|
266
|
-
}
|
|
267
|
-
return o;
|
|
268
|
-
}
|
|
269
|
-
export function prepareUrlOldWay(params) {
|
|
270
|
-
if (!params)
|
|
271
|
-
return this.endpoint;
|
|
272
|
-
if (typeof params === 'object') {
|
|
273
|
-
params = transform(params);
|
|
274
|
-
}
|
|
275
|
-
return this.endpoint + '/' + params;
|
|
276
|
-
}
|
|
277
|
-
;
|
|
278
|
-
({}); // @--end-of-file-for-module=ng2-rest lib/params.ts
|
|
1
|
+
import { diffChars } from 'diff';
|
|
2
|
+
import { _ } from 'tnp-core/browser';
|
|
3
|
+
import { Log, Level } from 'ng2-logger/browser';
|
|
4
|
+
import { Helpers } from './helpers';
|
|
5
|
+
const log = Log.create('[ng2-rest] params', Level.__NOTHING);
|
|
6
|
+
/** check if string is a valid pattern */
|
|
7
|
+
export function isValid(pattern) {
|
|
8
|
+
return (new RegExp('\/:[a-zA-Z]*', 'g')).test(pattern.replace('://', ''));
|
|
9
|
+
}
|
|
10
|
+
export function check(url, pattern) {
|
|
11
|
+
if (!Helpers.checkValidUrl(url)) {
|
|
12
|
+
log.error(`Incorrect url: ${url}`);
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
if (url.charAt(url.length - 1) === '/')
|
|
16
|
+
url = url.slice(0, url.length - 2);
|
|
17
|
+
if (pattern.charAt(pattern.length - 1) === '/')
|
|
18
|
+
pattern = pattern.slice(0, url.length - 2);
|
|
19
|
+
pattern = pattern.replace(/\//g, '\/');
|
|
20
|
+
pattern = pattern.replace(new RegExp('\/:[a-zA-Z]*', 'g'), '.+');
|
|
21
|
+
let reg = new RegExp(pattern, 'g');
|
|
22
|
+
return reg.test(url);
|
|
23
|
+
}
|
|
24
|
+
export function getModels(pattern) {
|
|
25
|
+
let m = pattern.match(new RegExp('[a-z-A-Z]*\/:', 'g'));
|
|
26
|
+
return m.map(p => p.replace('/:', ''));
|
|
27
|
+
}
|
|
28
|
+
export function getRestPramsNames(pattern) {
|
|
29
|
+
if (pattern.charAt(pattern.length - 1) !== '/')
|
|
30
|
+
pattern = `${pattern}/`;
|
|
31
|
+
let m = pattern.match(new RegExp(':[a-zA-Z]*\/', 'g'));
|
|
32
|
+
let res = m.map(p => p.replace(':', '').replace('/', ''));
|
|
33
|
+
return res.filter(p => p.trim() !== '');
|
|
34
|
+
}
|
|
35
|
+
export function containsModels(url, models) {
|
|
36
|
+
if (url.charAt(0) !== '/')
|
|
37
|
+
url = '/' + url;
|
|
38
|
+
let res = models.filter(m => {
|
|
39
|
+
let word = '/' + m;
|
|
40
|
+
let iii = url.indexOf(word);
|
|
41
|
+
if (iii + word.length < url.length && url.charAt(iii + word.length) !== '/') {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
if (iii !== -1) {
|
|
45
|
+
url = url.replace(new RegExp('\/' + m, 'g'), '');
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}).length;
|
|
50
|
+
return res === models.length;
|
|
51
|
+
}
|
|
52
|
+
export function stars(n) {
|
|
53
|
+
let res = '';
|
|
54
|
+
for (let i = 0; i < n; i++)
|
|
55
|
+
res += '*';
|
|
56
|
+
return res;
|
|
57
|
+
}
|
|
58
|
+
export function getRestParams(url, pattern) {
|
|
59
|
+
let res = {};
|
|
60
|
+
let models = getRestPramsNames(pattern);
|
|
61
|
+
models.forEach(m => {
|
|
62
|
+
pattern = pattern.replace(`:${m}`, stars(m.length));
|
|
63
|
+
});
|
|
64
|
+
let currentModel = void 0;
|
|
65
|
+
diffChars(pattern, url).forEach(d => {
|
|
66
|
+
if (d.added) {
|
|
67
|
+
if (!isNaN(Number(d.value)))
|
|
68
|
+
res[currentModel] = Number(d.value);
|
|
69
|
+
else if (d.value.trim() === 'true')
|
|
70
|
+
res[currentModel] = true;
|
|
71
|
+
else if (d.value.trim() === 'false')
|
|
72
|
+
res[currentModel] = false;
|
|
73
|
+
else
|
|
74
|
+
res[currentModel] = decodeURIComponent(d.value);
|
|
75
|
+
currentModel = void 0;
|
|
76
|
+
}
|
|
77
|
+
let m = d.value.replace(':', "");
|
|
78
|
+
if (d.removed) {
|
|
79
|
+
currentModel = models.shift();
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
return res;
|
|
83
|
+
}
|
|
84
|
+
export const regexisPath = /[^\..]+(\.[^\..]+)+/g;
|
|
85
|
+
/**
|
|
86
|
+
* Models like books/:id
|
|
87
|
+
*/
|
|
88
|
+
function cutUrlModel(params, models, output) {
|
|
89
|
+
if (models.length === 0)
|
|
90
|
+
return output.join('\/');
|
|
91
|
+
let m = models.pop();
|
|
92
|
+
let param = m.match(/:[a-zA-Z0-9\.]+/)[0].replace(':', '');
|
|
93
|
+
const paramIsPath = regexisPath.test(param);
|
|
94
|
+
let model = m.match(/[a-zA-Z0-9]+\//)[0].replace('\/', '');
|
|
95
|
+
if (params === void 0 ||
|
|
96
|
+
(paramIsPath ? _.get(params, param) === void 0 : params[param] === void 0) ||
|
|
97
|
+
param === 'undefined') {
|
|
98
|
+
output.length = 0;
|
|
99
|
+
output.unshift(model);
|
|
100
|
+
return cutUrlModel(params, models, output);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
if (paramIsPath) {
|
|
104
|
+
let mrep = m.replace(new RegExp(`:${param}`, 'g'), `${_.get(params, param)}`);
|
|
105
|
+
output.unshift(mrep);
|
|
106
|
+
return cutUrlModel(params, models, output);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
let mrep = m.replace(new RegExp(`:${param}`, 'g'), `${params[param]}`);
|
|
110
|
+
output.unshift(mrep);
|
|
111
|
+
return cutUrlModel(params, models, output);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
export function interpolateParamsToUrl(params, url) {
|
|
116
|
+
const regexInt = /\[\[([^\..]+\.[^\..]+)+\]\]/g;
|
|
117
|
+
url = url.split('/').map(p => {
|
|
118
|
+
let isParam = p.startsWith(':');
|
|
119
|
+
if (isParam) {
|
|
120
|
+
let part = p.slice(1);
|
|
121
|
+
if (regexInt.test(part)) {
|
|
122
|
+
part = part.replace('[[', '');
|
|
123
|
+
part = part.replace(']]', '');
|
|
124
|
+
}
|
|
125
|
+
return `:${part}`;
|
|
126
|
+
}
|
|
127
|
+
return p;
|
|
128
|
+
}).join('/');
|
|
129
|
+
let slash = {
|
|
130
|
+
start: url.charAt(0) === '\/',
|
|
131
|
+
end: url.charAt(url.length - 1) === '\/'
|
|
132
|
+
};
|
|
133
|
+
let morePramsOnEnd = url.match(/(\/:[a-zA-Z0-9\.]+){2,10}/g);
|
|
134
|
+
if (morePramsOnEnd && (Array.isArray(morePramsOnEnd) && morePramsOnEnd.length === 1)) {
|
|
135
|
+
let m = morePramsOnEnd[0];
|
|
136
|
+
let match = m.match(/\/:[a-zA-Z0-9\.]+/g);
|
|
137
|
+
match.forEach(e => {
|
|
138
|
+
let c = e.replace('\/:', '');
|
|
139
|
+
if (regexisPath.test(c)) {
|
|
140
|
+
url = url.replace(e, `/${_.get(params, c)}`);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
url = url.replace(e, `/${params[c]}`);
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
return url;
|
|
147
|
+
}
|
|
148
|
+
let nestedParams = url.match(/[a-zA-Z0-9]+\/:[a-zA-Z0-9\.]+/g);
|
|
149
|
+
if (!nestedParams || (Array.isArray(nestedParams) && nestedParams.length === 0))
|
|
150
|
+
return url;
|
|
151
|
+
if (!slash.end)
|
|
152
|
+
url = `${url}/`;
|
|
153
|
+
let addUndefinedForAlone = (!/:[a-zA-Z0-9\.]+\/$/g.test(url) && /[a-zA-Z0-9]+\/$/g.test(url));
|
|
154
|
+
let replace = (nestedParams.length > 1 ? nestedParams.join('\/') : nestedParams[0]) +
|
|
155
|
+
(addUndefinedForAlone ? '\/' + url.match(/[a-zA-Z0-9]+\/$/g)[0] : '\/');
|
|
156
|
+
let beginHref = url.replace(replace, '');
|
|
157
|
+
if (addUndefinedForAlone) {
|
|
158
|
+
url = url.replace(/\/$/g, '/:undefined');
|
|
159
|
+
nestedParams = url.match(/[a-zA-Z0-9]+\/:[a-zA-Z0-9\.]+/g);
|
|
160
|
+
url = cutUrlModel(params, nestedParams, []);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
url = cutUrlModel(params, nestedParams, []);
|
|
164
|
+
}
|
|
165
|
+
url = beginHref + url;
|
|
166
|
+
if (url.charAt(url.length - 1) !== '/' && slash.end)
|
|
167
|
+
url = `${url}/`;
|
|
168
|
+
if (url.charAt(0) !== '\/' && slash.start)
|
|
169
|
+
url = `/${url}`;
|
|
170
|
+
return url;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get query params from url, like 'ex' in /api/books?ex=value
|
|
174
|
+
*/
|
|
175
|
+
export function decodeUrl(url) {
|
|
176
|
+
let regex = /[?&]([^=#]+)=([^&#]*)/g, params = {}, match;
|
|
177
|
+
while (match = regex.exec(url)) {
|
|
178
|
+
params[decodeURIComponent(match[1])] = decodeURIComponent(match[2]);
|
|
179
|
+
}
|
|
180
|
+
let paramsObject = params;
|
|
181
|
+
for (let p in paramsObject) {
|
|
182
|
+
if (paramsObject[p] === void 0) {
|
|
183
|
+
delete paramsObject[p];
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (paramsObject.hasOwnProperty(p)) {
|
|
187
|
+
let n = Number(params[p]);
|
|
188
|
+
if (!isNaN(n)) {
|
|
189
|
+
params[p] = n;
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (typeof params[p] === 'string') {
|
|
193
|
+
let json;
|
|
194
|
+
try {
|
|
195
|
+
json = JSON.parse(params[p]);
|
|
196
|
+
}
|
|
197
|
+
catch (error) { }
|
|
198
|
+
if (json !== void 0) {
|
|
199
|
+
params[p] = json;
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return params;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Create query params string for url
|
|
209
|
+
*
|
|
210
|
+
* @export
|
|
211
|
+
* @param {UrlParams[]} params
|
|
212
|
+
* @returns {string}
|
|
213
|
+
*/
|
|
214
|
+
export function getParamsUrl(params, doNotSerialize = false) {
|
|
215
|
+
let urlparts = [];
|
|
216
|
+
if (!params)
|
|
217
|
+
return '';
|
|
218
|
+
if (!(params instanceof Array))
|
|
219
|
+
return '';
|
|
220
|
+
if (params.length === 0)
|
|
221
|
+
return '';
|
|
222
|
+
params.forEach(urlparam => {
|
|
223
|
+
if (JSON.stringify(urlparam) !== '{}') {
|
|
224
|
+
let parameters = [];
|
|
225
|
+
let paramObject = urlparam;
|
|
226
|
+
for (let p in paramObject) {
|
|
227
|
+
if (paramObject[p] === void 0)
|
|
228
|
+
delete paramObject[p];
|
|
229
|
+
if (paramObject.hasOwnProperty(p) && typeof p === 'string' && p !== 'regex' && !(paramObject[p] instanceof RegExp)) {
|
|
230
|
+
if (p.length > 0 && p[0] === '/') {
|
|
231
|
+
let newName = p.slice(1, p.length - 1);
|
|
232
|
+
urlparam[newName] = urlparam[p];
|
|
233
|
+
urlparam[p] = void 0;
|
|
234
|
+
p = newName;
|
|
235
|
+
}
|
|
236
|
+
if (p.length > 0 && p[p.length - 1] === '/') {
|
|
237
|
+
let newName = p.slice(0, p.length - 2);
|
|
238
|
+
urlparam[newName] = urlparam[p];
|
|
239
|
+
urlparam[p] = void 0;
|
|
240
|
+
p = newName;
|
|
241
|
+
}
|
|
242
|
+
let v = urlparam[p];
|
|
243
|
+
if (v instanceof Object) {
|
|
244
|
+
urlparam[p] = JSON.stringify(urlparam[p]);
|
|
245
|
+
}
|
|
246
|
+
urlparam[p] = doNotSerialize ? urlparam[p] : encodeURIComponent(urlparam[p]);
|
|
247
|
+
if (urlparam.regex !== void 0 && urlparam.regex instanceof RegExp) {
|
|
248
|
+
if (!urlparam.regex.test(urlparam[p])) {
|
|
249
|
+
console.warn(`Data: ${urlparam[p]} incostistent with regex ${urlparam.regex.source}`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
parameters.push(`${p}=${urlparam[p]}`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
urlparts.push(parameters.join('&'));
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
let join = urlparts.join().trim();
|
|
259
|
+
if (join.trim() === '')
|
|
260
|
+
return '';
|
|
261
|
+
return `?${urlparts.join('&')}`;
|
|
262
|
+
}
|
|
263
|
+
function transform(o) {
|
|
264
|
+
if (typeof o === 'object') {
|
|
265
|
+
return encodeURIComponent(JSON.stringify(o));
|
|
266
|
+
}
|
|
267
|
+
return o;
|
|
268
|
+
}
|
|
269
|
+
export function prepareUrlOldWay(params) {
|
|
270
|
+
if (!params)
|
|
271
|
+
return this.endpoint;
|
|
272
|
+
if (typeof params === 'object') {
|
|
273
|
+
params = transform(params);
|
|
274
|
+
}
|
|
275
|
+
return this.endpoint + '/' + params;
|
|
276
|
+
}
|
|
277
|
+
;
|
|
278
|
+
({}); // @--end-of-file-for-module=ng2-rest lib/params.ts
|
|
279
279
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdG1wLWxpYnMtZm9yLWJ1bmRsZS9uZzItcmVzdC9wcm9qZWN0cy9uZzItcmVzdC9zcmMvbGliL3BhcmFtcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWhELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUE7QUFJNUQseUNBQXlDO0FBQ3pDLE1BQU0sVUFBVSxPQUFPLENBQUMsT0FBZTtJQUNyQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVELE1BQU0sVUFBVSxLQUFLLENBQUMsR0FBVyxFQUFFLE9BQWU7SUFDaEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDL0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNuQyxPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRztRQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNFLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUc7UUFBRSxPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRixPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2pFLElBQUksR0FBRyxHQUFHLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNuQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUVELE1BQU0sVUFBVSxTQUFTLENBQUMsT0FBZTtJQUN2QyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3hELE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVELE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxPQUFlO0lBQy9DLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUc7UUFBRSxPQUFPLEdBQUcsR0FBRyxPQUFPLEdBQUcsQ0FBQztJQUN4RSxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUQsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLEdBQVcsRUFBRSxNQUFnQjtJQUMxRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRztRQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBRTNDLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDMUIsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUVuQixJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxFQUFFO1lBQzNFLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNkLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDakQsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBRVYsT0FBTyxHQUFHLEtBQUssTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUMvQixDQUFDO0FBRUQsTUFBTSxVQUFVLEtBQUssQ0FBQyxDQUFTO0lBQzdCLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNiLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUN2QyxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUFDLEdBQVcsRUFBRSxPQUFlO0lBQ3hELElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNiLElBQUksTUFBTSxHQUFHLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXhDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDakIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQyxDQUFDLENBQUE7SUFFRixJQUFJLFlBQVksR0FBVyxLQUFLLENBQUMsQ0FBQztJQUNsQyxTQUFTLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUVsQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7WUFDWCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzVELElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxNQUFNO2dCQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUM7aUJBQ3hELElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxPQUFPO2dCQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxLQUFLLENBQUM7O2dCQUMxRCxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JELFlBQVksR0FBRyxLQUFLLENBQUMsQ0FBQztTQUN2QjtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUU7WUFDYixZQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQy9CO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsc0JBQXNCLENBQUM7QUFFbEQ7O0dBRUc7QUFDSCxTQUFTLFdBQVcsQ0FBQyxNQUFjLEVBQUUsTUFBZ0IsRUFBRSxNQUFnQjtJQUNyRSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsRCxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFckIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDM0QsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUUzQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMzRCxJQUFJLE1BQU0sS0FBSyxLQUFLLENBQUM7UUFDbkIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUM7UUFDMUUsS0FBSyxLQUFLLFdBQVcsRUFBRTtRQUN2QixNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNsQixNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3JCLE9BQU8sV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDNUM7U0FBTTtRQUNMLElBQUksV0FBVyxFQUFFO1lBRWYsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQzdFLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDcEIsT0FBTyxXQUFXLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztTQUM1QzthQUFNO1lBRUwsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUN0RSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ3BCLE9BQU8sV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDNUM7S0FFRjtBQUNILENBQUM7QUFHRCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsTUFBYyxFQUFFLEdBQVc7SUFFaEUsTUFBTSxRQUFRLEdBQUcsOEJBQThCLENBQUM7SUFFaEQsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBRTNCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDL0IsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXRCLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFFdkIsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFBO2dCQUM3QixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUE7YUFDOUI7WUFDRCxPQUFPLElBQUksSUFBSSxFQUFFLENBQUE7U0FDbEI7UUFDRCxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQU1iLElBQUksS0FBSyxHQUFHO1FBQ1YsS0FBSyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSTtRQUM3QixHQUFHLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUk7S0FDekMsQ0FBQTtJQUVELElBQUksY0FBYyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUM3RCxJQUFJLGNBQWMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsRUFBRTtRQUVwRixJQUFJLENBQUMsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRTFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDaEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFN0IsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN2QixHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUE7YUFDN0M7aUJBQU07Z0JBQ0wsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTthQUN0QztRQUlILENBQUMsQ0FBQyxDQUFBO1FBQ0YsT0FBTyxHQUFHLENBQUM7S0FDWjtJQUVELElBQUksWUFBWSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUMvRCxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBRzVGLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRztRQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ2hDLElBQUksb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUU5RixJQUFJLE9BQU8sR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakYsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUUsSUFBSSxTQUFTLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFFeEMsSUFBSSxvQkFBb0IsRUFBRTtRQUN4QixHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFDeEMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUMzRCxHQUFHLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUE7S0FDNUM7U0FBTTtRQUNMLEdBQUcsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQTtLQUM1QztJQUNELEdBQUcsR0FBRyxTQUFTLEdBQUcsR0FBRyxDQUFDO0lBRXRCLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRztRQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ3JFLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLEtBQUs7UUFBRSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUUzRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7RUFFRTtBQUNGLE1BQU0sVUFBVSxTQUFTLENBQUMsR0FBVztJQUNuQyxJQUFJLEtBQUssR0FBRyx3QkFBd0IsRUFDbEMsTUFBTSxHQUFHLEVBQUUsRUFDWCxLQUFLLENBQUM7SUFDUixPQUFPLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQzlCLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3JFO0lBQ0QsSUFBSSxZQUFZLEdBQVcsTUFBTSxDQUFDO0lBQ2xDLEtBQUssSUFBSSxDQUFDLElBQUksWUFBWSxFQUFFO1FBQzFCLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQzlCLE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLFNBQVM7U0FDVjtRQUNELElBQUksWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUVsQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDYixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNkLFNBQVM7YUFDVjtZQUNELElBQUksT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxFQUFFO2dCQUdqQyxJQUFJLElBQUksQ0FBQztnQkFDVCxJQUFJO29CQUNGLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM5QjtnQkFBQyxPQUFPLEtBQUssRUFBRSxHQUFHO2dCQUNuQixJQUFJLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtvQkFDbkIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztvQkFDakIsU0FBUztpQkFDVjthQVFGO1NBQ0Y7S0FDRjtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLE1BQTBCLEVBQUUsaUJBQTBCLEtBQUs7SUFDdEYsSUFBSSxRQUFRLEdBQWEsRUFBRSxDQUFDO0lBQzVCLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDdkIsSUFBSSxDQUFDLENBQUMsTUFBTSxZQUFZLEtBQUssQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzFDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFFbkMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUN4QixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBRXJDLElBQUksVUFBVSxHQUFhLEVBQUUsQ0FBQztZQUM5QixJQUFJLFdBQVcsR0FBVyxRQUFRLENBQUM7WUFHbkMsS0FBSyxJQUFJLENBQUMsSUFBSSxXQUFXLEVBQUU7Z0JBQ3pCLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQztvQkFBRSxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckQsSUFBSSxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssT0FBTyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFlBQVksTUFBTSxDQUFDLEVBQUU7b0JBQ2xILElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTt3QkFDaEMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDaEMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO3dCQUNyQixDQUFDLEdBQUcsT0FBTyxDQUFDO3FCQUNiO29CQUNELElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO3dCQUMzQyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNoQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7d0JBQ3JCLENBQUMsR0FBRyxPQUFPLENBQUM7cUJBQ2I7b0JBQ0QsSUFBSSxDQUFDLEdBQVEsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN6QixJQUFJLENBQUMsWUFBWSxNQUFNLEVBQUU7d0JBQ3ZCLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUMzQztvQkFDRCxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM3RixJQUFJLFFBQVEsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUssWUFBWSxNQUFNLEVBQUU7d0JBRWpFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTs0QkFDN0MsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsNEJBQTRCLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQzt5QkFDdkY7cUJBQ0Y7b0JBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUN4QzthQUVGO1lBRUQsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FHckM7SUFHSCxDQUFDLENBQUMsQ0FBQztJQUNILElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNsQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDbEMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUNsQyxDQUFDO0FBR0QsU0FBUyxTQUFTLENBQUMsQ0FBQztJQUNsQixJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtRQUN6QixPQUFPLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM5QztJQUNELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUdELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUE2QjtJQUM1RCxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUNsQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRTtRQUM5QixNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQzVCO0lBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUM7QUFDdEMsQ0FBQztBQUdBLENBQUM7QUFBQSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsbURBQW1EIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGlmZkNoYXJzIH0gZnJvbSAnZGlmZic7XG5pbXBvcnQgeyBfIH0gZnJvbSAndG5wLWNvcmUvYnJvd3Nlcic7XG5pbXBvcnQgeyBMb2csIExldmVsIH0gZnJvbSAnbmcyLWxvZ2dlci9icm93c2VyJztcbmltcG9ydCB7IE1vZGVscyB9IGZyb20gJy4vbW9kZWxzJztcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5jb25zdCBsb2cgPSBMb2cuY3JlYXRlKCdbbmcyLXJlc3RdIHBhcmFtcycsIExldmVsLl9fTk9USElORylcblxuXG5cbi8qKiBjaGVjayBpZiBzdHJpbmcgaXMgYSB2YWxpZCBwYXR0ZXJuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZChwYXR0ZXJuOiBzdHJpbmcpIHtcbiAgcmV0dXJuIChuZXcgUmVnRXhwKCdcXC86W2EtekEtWl0qJywgJ2cnKSkudGVzdChwYXR0ZXJuLnJlcGxhY2UoJzovLycsICcnKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVjayh1cmw6IHN0cmluZywgcGF0dGVybjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghSGVscGVycy5jaGVja1ZhbGlkVXJsKHVybCkpIHtcbiAgICBsb2cuZXJyb3IoYEluY29ycmVjdCB1cmw6ICR7dXJsfWApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodXJsLmNoYXJBdCh1cmwubGVuZ3RoIC0gMSkgPT09ICcvJykgdXJsID0gdXJsLnNsaWNlKDAsIHVybC5sZW5ndGggLSAyKTtcbiAgaWYgKHBhdHRlcm4uY2hhckF0KHBhdHRlcm4ubGVuZ3RoIC0gMSkgPT09ICcvJykgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMCwgdXJsLmxlbmd0aCAtIDIpO1xuICBwYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlKC9cXC8vZywgJ1xcLycpO1xuICBwYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcLzpbYS16QS1aXSonLCAnZycpLCAnLisnKTtcbiAgbGV0IHJlZyA9IG5ldyBSZWdFeHAocGF0dGVybiwgJ2cnKTtcbiAgcmV0dXJuIHJlZy50ZXN0KHVybCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2RlbHMocGF0dGVybjogc3RyaW5nKTogc3RyaW5nW10ge1xuICBsZXQgbSA9IHBhdHRlcm4ubWF0Y2gobmV3IFJlZ0V4cCgnW2Etei1BLVpdKlxcLzonLCAnZycpKTtcbiAgcmV0dXJuIG0ubWFwKHAgPT4gcC5yZXBsYWNlKCcvOicsICcnKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXN0UHJhbXNOYW1lcyhwYXR0ZXJuOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGlmIChwYXR0ZXJuLmNoYXJBdChwYXR0ZXJuLmxlbmd0aCAtIDEpICE9PSAnLycpIHBhdHRlcm4gPSBgJHtwYXR0ZXJufS9gO1xuICBsZXQgbSA9IHBhdHRlcm4ubWF0Y2gobmV3IFJlZ0V4cCgnOlthLXpBLVpdKlxcLycsICdnJykpO1xuICBsZXQgcmVzID0gbS5tYXAocCA9PiBwLnJlcGxhY2UoJzonLCAnJykucmVwbGFjZSgnLycsICcnKSk7XG4gIHJldHVybiByZXMuZmlsdGVyKHAgPT4gcC50cmltKCkgIT09ICcnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnRhaW5zTW9kZWxzKHVybDogc3RyaW5nLCBtb2RlbHM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGlmICh1cmwuY2hhckF0KDApICE9PSAnLycpIHVybCA9ICcvJyArIHVybDtcblxuICBsZXQgcmVzID0gbW9kZWxzLmZpbHRlcihtID0+IHtcbiAgICBsZXQgd29yZCA9ICcvJyArIG07XG5cbiAgICBsZXQgaWlpID0gdXJsLmluZGV4T2Yod29yZCk7XG5cbiAgICBpZiAoaWlpICsgd29yZC5sZW5ndGggPCB1cmwubGVuZ3RoICYmIHVybC5jaGFyQXQoaWlpICsgd29yZC5sZW5ndGgpICE9PSAnLycpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGlpaSAhPT0gLTEpIHtcbiAgICAgIHVybCA9IHVybC5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcLycgKyBtLCAnZycpLCAnJyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KS5sZW5ndGg7XG5cbiAgcmV0dXJuIHJlcyA9PT0gbW9kZWxzLmxlbmd0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJzKG46IG51bWJlcik6IHN0cmluZyB7XG4gIGxldCByZXMgPSAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHJlcyArPSAnKic7XG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXN0UGFyYW1zKHVybDogc3RyaW5nLCBwYXR0ZXJuOiBzdHJpbmcpOiBPYmplY3Qge1xuICBsZXQgcmVzID0ge307XG4gIGxldCBtb2RlbHMgPSBnZXRSZXN0UHJhbXNOYW1lcyhwYXR0ZXJuKTtcblxuICBtb2RlbHMuZm9yRWFjaChtID0+IHtcbiAgICBwYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlKGA6JHttfWAsIHN0YXJzKG0ubGVuZ3RoKSk7XG4gIH0pXG5cbiAgbGV0IGN1cnJlbnRNb2RlbDogc3RyaW5nID0gdm9pZCAwO1xuICBkaWZmQ2hhcnMocGF0dGVybiwgdXJsKS5mb3JFYWNoKGQgPT4ge1xuXG4gICAgaWYgKGQuYWRkZWQpIHtcbiAgICAgIGlmICghaXNOYU4oTnVtYmVyKGQudmFsdWUpKSkgcmVzW2N1cnJlbnRNb2RlbF0gPSBOdW1iZXIoZC52YWx1ZSk7XG4gICAgICBlbHNlIGlmIChkLnZhbHVlLnRyaW0oKSA9PT0gJ3RydWUnKSByZXNbY3VycmVudE1vZGVsXSA9IHRydWU7XG4gICAgICBlbHNlIGlmIChkLnZhbHVlLnRyaW0oKSA9PT0gJ2ZhbHNlJykgcmVzW2N1cnJlbnRNb2RlbF0gPSBmYWxzZTtcbiAgICAgIGVsc2UgcmVzW2N1cnJlbnRNb2RlbF0gPSBkZWNvZGVVUklDb21wb25lbnQoZC52YWx1ZSk7XG4gICAgICBjdXJyZW50TW9kZWwgPSB2b2lkIDA7XG4gICAgfVxuICAgIGxldCBtID0gZC52YWx1ZS5yZXBsYWNlKCc6JywgXCJcIik7XG5cbiAgICBpZiAoZC5yZW1vdmVkKSB7XG4gICAgICBjdXJyZW50TW9kZWwgPSBtb2RlbHMuc2hpZnQoKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgY29uc3QgcmVnZXhpc1BhdGggPSAvW15cXC4uXSsoXFwuW15cXC4uXSspKy9nO1xuXG4vKipcbiAqIE1vZGVscyBsaWtlIGJvb2tzLzppZFxuICovXG5mdW5jdGlvbiBjdXRVcmxNb2RlbChwYXJhbXM6IE9iamVjdCwgbW9kZWxzOiBzdHJpbmdbXSwgb3V0cHV0OiBzdHJpbmdbXSkge1xuICBpZiAobW9kZWxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG91dHB1dC5qb2luKCdcXC8nKTtcbiAgbGV0IG0gPSBtb2RlbHMucG9wKCk7XG5cbiAgbGV0IHBhcmFtID0gbS5tYXRjaCgvOlthLXpBLVowLTlcXC5dKy8pWzBdLnJlcGxhY2UoJzonLCAnJyk7XG4gIGNvbnN0IHBhcmFtSXNQYXRoID0gcmVnZXhpc1BhdGgudGVzdChwYXJhbSlcblxuICBsZXQgbW9kZWwgPSBtLm1hdGNoKC9bYS16QS1aMC05XStcXC8vKVswXS5yZXBsYWNlKCdcXC8nLCAnJyk7XG4gIGlmIChwYXJhbXMgPT09IHZvaWQgMCB8fFxuICAgIChwYXJhbUlzUGF0aCA/IF8uZ2V0KHBhcmFtcywgcGFyYW0pID09PSB2b2lkIDAgOiBwYXJhbXNbcGFyYW1dID09PSB2b2lkIDApIHx8XG4gICAgcGFyYW0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgb3V0cHV0Lmxlbmd0aCA9IDA7XG4gICAgb3V0cHV0LnVuc2hpZnQobW9kZWwpXG4gICAgcmV0dXJuIGN1dFVybE1vZGVsKHBhcmFtcywgbW9kZWxzLCBvdXRwdXQpO1xuICB9IGVsc2Uge1xuICAgIGlmIChwYXJhbUlzUGF0aCkge1xuXG4gICAgICBsZXQgbXJlcCA9IG0ucmVwbGFjZShuZXcgUmVnRXhwKGA6JHtwYXJhbX1gLCAnZycpLCBgJHtfLmdldChwYXJhbXMsIHBhcmFtKX1gKVxuICAgICAgb3V0cHV0LnVuc2hpZnQobXJlcClcbiAgICAgIHJldHVybiBjdXRVcmxNb2RlbChwYXJhbXMsIG1vZGVscywgb3V0cHV0KTtcbiAgICB9IGVsc2Uge1xuXG4gICAgICBsZXQgbXJlcCA9IG0ucmVwbGFjZShuZXcgUmVnRXhwKGA6JHtwYXJhbX1gLCAnZycpLCBgJHtwYXJhbXNbcGFyYW1dfWApXG4gICAgICBvdXRwdXQudW5zaGlmdChtcmVwKVxuICAgICAgcmV0dXJuIGN1dFVybE1vZGVsKHBhcmFtcywgbW9kZWxzLCBvdXRwdXQpO1xuICAgIH1cblxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGludGVycG9sYXRlUGFyYW1zVG9VcmwocGFyYW1zOiBPYmplY3QsIHVybDogc3RyaW5nKTogc3RyaW5nIHtcblxuICBjb25zdCByZWdleEludCA9IC9cXFtcXFsoW15cXC4uXStcXC5bXlxcLi5dKykrXFxdXFxdL2c7XG5cbiAgdXJsID0gdXJsLnNwbGl0KCcvJykubWFwKHAgPT4ge1xuXG4gICAgbGV0IGlzUGFyYW0gPSBwLnN0YXJ0c1dpdGgoJzonKVxuICAgIGlmIChpc1BhcmFtKSB7XG4gICAgICBsZXQgcGFydCA9IHAuc2xpY2UoMSk7XG5cbiAgICAgIGlmIChyZWdleEludC50ZXN0KHBhcnQpKSB7XG5cbiAgICAgICAgcGFydCA9IHBhcnQucmVwbGFjZSgnW1snLCAnJylcbiAgICAgICAgcGFydCA9IHBhcnQucmVwbGFjZSgnXV0nLCAnJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBgOiR7cGFydH1gXG4gICAgfVxuICAgIHJldHVybiBwO1xuICB9KS5qb2luKCcvJyk7XG5cblxuXG5cblxuICBsZXQgc2xhc2ggPSB7XG4gICAgc3RhcnQ6IHVybC5jaGFyQXQoMCkgPT09ICdcXC8nLFxuICAgIGVuZDogdXJsLmNoYXJBdCh1cmwubGVuZ3RoIC0gMSkgPT09ICdcXC8nXG4gIH1cblxuICBsZXQgbW9yZVByYW1zT25FbmQgPSB1cmwubWF0Y2goLyhcXC86W2EtekEtWjAtOVxcLl0rKXsyLDEwfS9nKTtcbiAgaWYgKG1vcmVQcmFtc09uRW5kICYmIChBcnJheS5pc0FycmF5KG1vcmVQcmFtc09uRW5kKSAmJiBtb3JlUHJhbXNPbkVuZC5sZW5ndGggPT09IDEpKSB7XG5cbiAgICBsZXQgbSA9IG1vcmVQcmFtc09uRW5kWzBdO1xuICAgIGxldCBtYXRjaCA9IG0ubWF0Y2goL1xcLzpbYS16QS1aMC05XFwuXSsvZyk7XG5cbiAgICBtYXRjaC5mb3JFYWNoKGUgPT4ge1xuICAgICAgbGV0IGMgPSBlLnJlcGxhY2UoJ1xcLzonLCAnJyk7XG5cbiAgICAgIGlmIChyZWdleGlzUGF0aC50ZXN0KGMpKSB7XG4gICAgICAgIHVybCA9IHVybC5yZXBsYWNlKGUsIGAvJHtfLmdldChwYXJhbXMsIGMpfWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cmwgPSB1cmwucmVwbGFjZShlLCBgLyR7cGFyYW1zW2NdfWApXG4gICAgICB9XG5cblxuXG4gICAgfSlcbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgbGV0IG5lc3RlZFBhcmFtcyA9IHVybC5tYXRjaCgvW2EtekEtWjAtOV0rXFwvOlthLXpBLVowLTlcXC5dKy9nKTtcbiAgaWYgKCFuZXN0ZWRQYXJhbXMgfHwgKEFycmF5LmlzQXJyYXkobmVzdGVkUGFyYW1zKSAmJiBuZXN0ZWRQYXJhbXMubGVuZ3RoID09PSAwKSkgcmV0dXJuIHVybDtcblxuXG4gIGlmICghc2xhc2guZW5kKSB1cmwgPSBgJHt1cmx9L2A7XG4gIGxldCBhZGRVbmRlZmluZWRGb3JBbG9uZSA9ICghLzpbYS16QS1aMC05XFwuXStcXC8kL2cudGVzdCh1cmwpICYmIC9bYS16QS1aMC05XStcXC8kL2cudGVzdCh1cmwpKTtcblxuICBsZXQgcmVwbGFjZSA9IChuZXN0ZWRQYXJhbXMubGVuZ3RoID4gMSA/IG5lc3RlZFBhcmFtcy5qb2luKCdcXC8nKSA6IG5lc3RlZFBhcmFtc1swXSkgK1xuICAgIChhZGRVbmRlZmluZWRGb3JBbG9uZSA/ICdcXC8nICsgdXJsLm1hdGNoKC9bYS16QS1aMC05XStcXC8kL2cpWzBdIDogJ1xcLycpO1xuICBsZXQgYmVnaW5IcmVmID0gdXJsLnJlcGxhY2UocmVwbGFjZSwgJycpXG5cbiAgaWYgKGFkZFVuZGVmaW5lZEZvckFsb25lKSB7XG4gICAgdXJsID0gdXJsLnJlcGxhY2UoL1xcLyQvZywgJy86dW5kZWZpbmVkJylcbiAgICBuZXN0ZWRQYXJhbXMgPSB1cmwubWF0Y2goL1thLXpBLVowLTldK1xcLzpbYS16QS1aMC05XFwuXSsvZyk7XG4gICAgdXJsID0gY3V0VXJsTW9kZWwocGFyYW1zLCBuZXN0ZWRQYXJhbXMsIFtdKVxuICB9IGVsc2Uge1xuICAgIHVybCA9IGN1dFVybE1vZGVsKHBhcmFtcywgbmVzdGVkUGFyYW1zLCBbXSlcbiAgfVxuICB1cmwgPSBiZWdpbkhyZWYgKyB1cmw7XG5cbiAgaWYgKHVybC5jaGFyQXQodXJsLmxlbmd0aCAtIDEpICE9PSAnLycgJiYgc2xhc2guZW5kKSB1cmwgPSBgJHt1cmx9L2A7XG4gIGlmICh1cmwuY2hhckF0KDApICE9PSAnXFwvJyAmJiBzbGFzaC5zdGFydCkgdXJsID0gYC8ke3VybH1gO1xuXG4gIHJldHVybiB1cmw7XG59XG5cbi8qKlxuICogR2V0IHF1ZXJ5IHBhcmFtcyBmcm9tIHVybCwgbGlrZSAnZXgnIGluIC9hcGkvYm9va3M/ZXg9dmFsdWVcbiovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlVXJsKHVybDogc3RyaW5nKTogT2JqZWN0IHtcbiAgbGV0IHJlZ2V4ID0gL1s/Jl0oW149I10rKT0oW14mI10qKS9nLFxuICAgIHBhcmFtcyA9IHt9LFxuICAgIG1hdGNoO1xuICB3aGlsZSAobWF0Y2ggPSByZWdleC5leGVjKHVybCkpIHtcbiAgICBwYXJhbXNbZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoWzFdKV0gPSBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hbMl0pO1xuICB9XG4gIGxldCBwYXJhbXNPYmplY3QgPSA8T2JqZWN0PnBhcmFtcztcbiAgZm9yIChsZXQgcCBpbiBwYXJhbXNPYmplY3QpIHtcbiAgICBpZiAocGFyYW1zT2JqZWN0W3BdID09PSB2b2lkIDApIHtcbiAgICAgIGRlbGV0ZSBwYXJhbXNPYmplY3RbcF07XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHBhcmFtc09iamVjdC5oYXNPd25Qcm9wZXJ0eShwKSkge1xuXG4gICAgICBsZXQgbiA9IE51bWJlcihwYXJhbXNbcF0pO1xuICAgICAgaWYgKCFpc05hTihuKSkge1xuICAgICAgICBwYXJhbXNbcF0gPSBuO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgcGFyYW1zW3BdID09PSAnc3RyaW5nJykge1xuXG5cbiAgICAgICAgbGV0IGpzb247XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAganNvbiA9IEpTT04ucGFyc2UocGFyYW1zW3BdKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgfVxuICAgICAgICBpZiAoanNvbiAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgcGFyYW1zW3BdID0ganNvbjtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG5cblxuXG5cblxuXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBwYXJhbXM7XG59XG5cbi8qKlxuICogQ3JlYXRlIHF1ZXJ5IHBhcmFtcyBzdHJpbmcgZm9yIHVybFxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VXJsUGFyYW1zW119IHBhcmFtc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmFtc1VybChwYXJhbXM6IE1vZGVscy5VcmxQYXJhbXNbXSwgZG9Ob3RTZXJpYWxpemU6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gIGxldCB1cmxwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgaWYgKCFwYXJhbXMpIHJldHVybiAnJztcbiAgaWYgKCEocGFyYW1zIGluc3RhbmNlb2YgQXJyYXkpKSByZXR1cm4gJyc7XG4gIGlmIChwYXJhbXMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG5cbiAgcGFyYW1zLmZvckVhY2godXJscGFyYW0gPT4ge1xuICAgIGlmIChKU09OLnN0cmluZ2lmeSh1cmxwYXJhbSkgIT09ICd7fScpIHtcblxuICAgICAgbGV0IHBhcmFtZXRlcnM6IHN0cmluZ1tdID0gW107XG4gICAgICBsZXQgcGFyYW1PYmplY3QgPSA8T2JqZWN0PnVybHBhcmFtO1xuXG5cbiAgICAgIGZvciAobGV0IHAgaW4gcGFyYW1PYmplY3QpIHtcbiAgICAgICAgaWYgKHBhcmFtT2JqZWN0W3BdID09PSB2b2lkIDApIGRlbGV0ZSBwYXJhbU9iamVjdFtwXTtcbiAgICAgICAgaWYgKHBhcmFtT2JqZWN0Lmhhc093blByb3BlcnR5KHApICYmIHR5cGVvZiBwID09PSAnc3RyaW5nJyAmJiBwICE9PSAncmVnZXgnICYmICEocGFyYW1PYmplY3RbcF0gaW5zdGFuY2VvZiBSZWdFeHApKSB7XG4gICAgICAgICAgaWYgKHAubGVuZ3RoID4gMCAmJiBwWzBdID09PSAnLycpIHtcbiAgICAgICAgICAgIGxldCBuZXdOYW1lID0gcC5zbGljZSgxLCBwLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgdXJscGFyYW1bbmV3TmFtZV0gPSB1cmxwYXJhbVtwXTtcbiAgICAgICAgICAgIHVybHBhcmFtW3BdID0gdm9pZCAwO1xuICAgICAgICAgICAgcCA9IG5ld05hbWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwLmxlbmd0aCA+IDAgJiYgcFtwLmxlbmd0aCAtIDFdID09PSAnLycpIHtcbiAgICAgICAgICAgIGxldCBuZXdOYW1lID0gcC5zbGljZSgwLCBwLmxlbmd0aCAtIDIpO1xuICAgICAgICAgICAgdXJscGFyYW1bbmV3TmFtZV0gPSB1cmxwYXJhbVtwXTtcbiAgICAgICAgICAgIHVybHBhcmFtW3BdID0gdm9pZCAwO1xuICAgICAgICAgICAgcCA9IG5ld05hbWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCB2OiBhbnkgPSB1cmxwYXJhbVtwXTtcbiAgICAgICAgICBpZiAodiBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICAgICAgdXJscGFyYW1bcF0gPSBKU09OLnN0cmluZ2lmeSh1cmxwYXJhbVtwXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHVybHBhcmFtW3BdID0gZG9Ob3RTZXJpYWxpemUgPyA8c3RyaW5nPnVybHBhcmFtW3BdIDogZW5jb2RlVVJJQ29tcG9uZW50KDxzdHJpbmc+dXJscGFyYW1bcF0pO1xuICAgICAgICAgIGlmICh1cmxwYXJhbS5yZWdleCAhPT0gdm9pZCAwICYmIHVybHBhcmFtLnJlZ2V4IGluc3RhbmNlb2YgUmVnRXhwKSB7XG5cbiAgICAgICAgICAgIGlmICghdXJscGFyYW0ucmVnZXgudGVzdCg8c3RyaW5nPnVybHBhcmFtW3BdKSkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYERhdGE6ICR7dXJscGFyYW1bcF19IGluY29zdGlzdGVudCB3aXRoIHJlZ2V4ICR7dXJscGFyYW0ucmVnZXguc291cmNlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBwYXJhbWV0ZXJzLnB1c2goYCR7cH09JHt1cmxwYXJhbVtwXX1gKTtcbiAgICAgICAgfVxuXG4gICAgICB9XG5cbiAgICAgIHVybHBhcnRzLnB1c2gocGFyYW1ldGVycy5qb2luKCcmJykpO1xuXG5cbiAgICB9XG5cblxuICB9KTtcbiAgbGV0IGpvaW4gPSB1cmxwYXJ0cy5qb2luKCkudHJpbSgpO1xuICBpZiAoam9pbi50cmltKCkgPT09ICcnKSByZXR1cm4gJyc7XG4gIHJldHVybiBgPyR7dXJscGFydHMuam9pbignJicpfWA7XG59XG5cblxuZnVuY3Rpb24gdHJhbnNmb3JtKG8pIHtcbiAgaWYgKHR5cGVvZiBvID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkobykpO1xuICB9XG4gIHJldHVybiBvO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlVXJsT2xkV2F5KHBhcmFtcz86IFRlbXBsYXRlU3RyaW5nc0FycmF5KTogc3RyaW5nIHtcbiAgaWYgKCFwYXJhbXMpIHJldHVybiB0aGlzLmVuZHBvaW50O1xuICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gJ29iamVjdCcpIHtcbiAgICBwYXJhbXMgPSB0cmFuc2Zvcm0ocGFyYW1zKTtcbiAgfVxuICByZXR1cm4gdGhpcy5lbmRwb2ludCArICcvJyArIHBhcmFtcztcbn1cblxuXG4gOyh7fSk7IC8vIEAtLWVuZC1vZi1maWxlLWZvci1tb2R1bGU9bmcyLXJlc3QgbGliL3BhcmFtcy50cyJdfQ==
|