1 | ;
|
2 | /**
|
3 | * Created by user on 2018/4/16/016.
|
4 | */
|
5 | Object.defineProperty(exports, "__esModule", { value: true });
|
6 | exports.init = exports.ZhtSynonymOptimizer = void 0;
|
7 | const mod_1 = require("../mod");
|
8 | const index_1 = require("../util/index");
|
9 | const COLORS_1 = require("../mod/COLORS");
|
10 | const uni_string_1 = require("uni-string");
|
11 | /**
|
12 | * 以詞意來自動轉換 而不需要手動加入字典於 synonym.txt
|
13 | * 適用於比較容易需要人工處理的轉換
|
14 | *
|
15 | * 自動處理 `里|后`
|
16 | *
|
17 | * 建議在字典內追加人名地名等等名字 來增加準確性
|
18 | * 防止轉換錯誤
|
19 | *
|
20 | * @todo 發于余干松冲准呆只范舍涂
|
21 | */
|
22 | class ZhtSynonymOptimizer extends mod_1.SubSModuleOptimizer {
|
23 | constructor() {
|
24 | super(...arguments);
|
25 | this.name = 'ZhtSynonymOptimizer';
|
26 | }
|
27 | _cache() {
|
28 | super._cache();
|
29 | this._TABLE = this.segment.getDict('TABLE');
|
30 | this._POSTAG = this.segment.POSTAG;
|
31 | this._SYNONYM = this.segment.getDict('SYNONYM') || {};
|
32 | this._BLACKLIST = this.segment.getDict("BLACKLIST_FOR_SYNONYM" /* BLACKLIST_FOR_SYNONYM */) || {};
|
33 | }
|
34 | isSynonymBlacklist(w) {
|
35 | if (this._BLACKLIST[w]) {
|
36 | return true;
|
37 | }
|
38 | return null;
|
39 | }
|
40 | _getSynonym(w, nw) {
|
41 | const SYNONYM = this._SYNONYM;
|
42 | if (w in SYNONYM) {
|
43 | nw = SYNONYM[w];
|
44 | }
|
45 | if (nw in SYNONYM) {
|
46 | //let w = nw;
|
47 | nw = SYNONYM[nw];
|
48 | }
|
49 | return nw;
|
50 | }
|
51 | doOptimize(words) {
|
52 | const self = this;
|
53 | const POSTAG = this._POSTAG;
|
54 | const TABLE = this._TABLE;
|
55 | const SYNONYM = this._SYNONYM;
|
56 | let i = 0;
|
57 | let CLOSE_P = ['】', '」', '》', '』', ']', '’', '”', '〉'];
|
58 | let SEP_P = ['、', ',', '…'];
|
59 | while (i < words.length) {
|
60 | let w0 = words[i - 1] || null;
|
61 | let w1 = words[i];
|
62 | let w2 = words[i + 1] || null;
|
63 | if (this.isSynonymBlacklist(w1.w)) {
|
64 | i++;
|
65 | continue;
|
66 | }
|
67 | let bool;
|
68 | let w1_len = uni_string_1.default.size(w1.w);
|
69 | let new_p;
|
70 | if (w1_len == 1) {
|
71 | //console.log(w1);
|
72 | if (w1.w == '里') {
|
73 | if (w0 && (w0.w.slice(-1) == '的'
|
74 | || w0.w === '和')) {
|
75 | }
|
76 | else if (w0 && CLOSE_P.includes(w0.w)) {
|
77 | w1.ow = w1.w;
|
78 | w1.w = '裡';
|
79 | bool = true;
|
80 | }
|
81 | else if (w0 && index_1.hexAndAny(w0.p,
|
82 | // 名詞
|
83 | POSTAG.D_N,
|
84 | // 處所
|
85 | POSTAG.D_S,
|
86 | // 方位
|
87 | POSTAG.D_F,
|
88 | // 时间词
|
89 | POSTAG.D_T,
|
90 | // 动词 训练
|
91 | POSTAG.D_V)) {
|
92 | w1.ow = w1.w;
|
93 | w1.w = '裡';
|
94 | bool = true;
|
95 | }
|
96 | }
|
97 | else if (w1.w == '后') {
|
98 | if (w0 && (w0.w === '和')) {
|
99 | }
|
100 | else if (w0 && CLOSE_P.includes(w0.w)) {
|
101 | w1.ow = w1.w;
|
102 | w1.w = '後';
|
103 | bool = true;
|
104 | }
|
105 | else if (w0 && ['腰'].includes(w0.w)) {
|
106 | w1.ow = w1.w;
|
107 | w1.w = '後';
|
108 | bool = true;
|
109 | }
|
110 | // 如果前一個項目為
|
111 | else if (w0 && (w0.p && index_1.hexAndAny(w0.p,
|
112 | // 动词 離開
|
113 | POSTAG.D_V,
|
114 | // 处所词
|
115 | POSTAG.D_S,
|
116 | // 时间词
|
117 | POSTAG.D_T,
|
118 | // 名词 名语素
|
119 | POSTAG.D_N,
|
120 | // 数量词 - 几次后
|
121 | POSTAG.D_MQ, POSTAG.A_M,
|
122 | // 方位词 方位语素
|
123 | POSTAG.D_F,
|
124 | // 副词
|
125 | POSTAG.D_D, POSTAG.D_R))) {
|
126 | w1.ow = w1.w;
|
127 | w1.w = '後';
|
128 | bool = true;
|
129 | }
|
130 | else if (w2 && (w2.p && index_1.hexAndAny(w2.p, POSTAG.D_V))) {
|
131 | w1.ow = w1.w;
|
132 | w1.w = '後';
|
133 | bool = true;
|
134 | }
|
135 | else if (w2 && ((w0 && !w0.p) && (w2.p && index_1.hexAndAny(w2.p,
|
136 | // 副词
|
137 | POSTAG.D_D)))) {
|
138 | w1.ow = w1.w;
|
139 | w1.w = '後';
|
140 | bool = true;
|
141 | }
|
142 | else if (w2 && ((!w0 || !w0.p) && SEP_P.includes(w2.w))) {
|
143 | w1.ow = w1.w;
|
144 | w1.w = '後';
|
145 | bool = true;
|
146 | }
|
147 | }
|
148 | else if (w1.w == '发' || w1.w == '發') {
|
149 | let c;
|
150 | if (w0) {
|
151 | c = w0.w;
|
152 | }
|
153 | if (c && COLORS_1.COLOR_HAIR[c]) {
|
154 | let nw = '髮';
|
155 | nw = this._getSynonym(w1.w, nw);
|
156 | if (nw != w1.w) {
|
157 | w1.ow = w1.w;
|
158 | w1.w = nw;
|
159 | new_p = POSTAG.D_N;
|
160 | bool = true;
|
161 | }
|
162 | }
|
163 | if (!bool && w2 && w1.w == '发' && w2.w === '的') {
|
164 | w1.ow = w1.w;
|
165 | w1.w = '發';
|
166 | bool = true;
|
167 | }
|
168 | }
|
169 | else if (w1.w == '于') {
|
170 | if ((w0 == null || w0.p & POSTAG.D_W) && (w2 && w2.p && (w2.p & POSTAG.D_N
|
171 | || w2.p & POSTAG.D_V
|
172 | || w2.p & POSTAG.D_R
|
173 | || w2.p & POSTAG.D_D
|
174 | || w2.p & POSTAG.D_T
|
175 | || w2.p & POSTAG.A_NR
|
176 | || w2.p & POSTAG.D_S
|
177 | || w2.p & POSTAG.D_F))) {
|
178 | /**
|
179 | * 當 於 在句子開頭並且後面是名詞或動詞時
|
180 | */
|
181 | w1.ow = w1.w;
|
182 | w1.w = '於';
|
183 | new_p = POSTAG.D_P;
|
184 | w1.p = new_p;
|
185 | bool = true;
|
186 | }
|
187 | else if (w0 && w2) {
|
188 | let w3;
|
189 | if ((index_1.hexAndAny(w0.p, POSTAG.D_V, POSTAG.D_R, POSTAG.D_A, POSTAG.D_T, POSTAG.D_F) && index_1.hexAndAny(w2.p, POSTAG.D_N, POSTAG.D_V, POSTAG.D_R, POSTAG.D_S, POSTAG.A_NX, POSTAG.D_F, POSTAG.D_W))
|
190 | ||
|
191 | (index_1.hexAndAny(w0.p, POSTAG.D_N) && index_1.hexAndAny(w2.p, POSTAG.D_N))
|
192 | ||
|
193 | (index_1.hexAndAny(w0.p, POSTAG.D_V, POSTAG.D_N) && index_1.hexAndAny(w2.p, POSTAG.D_F, POSTAG.D_T, POSTAG.A_NR, POSTAG.D_R, POSTAG.D_S, POSTAG.D_W))
|
194 | ||
|
195 | (index_1.hexAndAny(w0.p, POSTAG.A_NS, POSTAG.D_T, POSTAG.D_C) && index_1.hexAndAny(w2.p, POSTAG.A_NS, POSTAG.D_T))
|
196 | ||
|
197 | (index_1.hexAndAny(w0.p, POSTAG.D_D) && index_1.hexAndAny(w2.p, POSTAG.D_N))
|
198 | /*
|
199 | ||
|
200 | (hexAndAny(w0.p,
|
201 | POSTAG.D_V,
|
202 | ) && hexAndAny(w2.p,
|
203 | POSTAG.D_D,
|
204 | ))
|
205 | */
|
206 | ||
|
207 | (index_1.hexAndAny(w0.p, POSTAG.A_NR) && index_1.hexAndAny(w2.p, POSTAG.A_NS, POSTAG.A_NT, POSTAG.D_S, POSTAG.D_N, POSTAG.D_V))
|
208 | ||
|
209 | (index_1.hexAndAny(w0.p, POSTAG.D_V) && index_1.hexAndAny(w2.p, POSTAG.D_W))
|
210 | ||
|
211 | (index_1.hexAndAny(w0.p, POSTAG.D_D) && index_1.hexAndAny(w2.p, POSTAG.D_V))
|
212 | ||
|
213 | (index_1.hexAndAny(w0.p, POSTAG.D_V) && index_1.hexAndAny(w2.p, POSTAG.D_D))
|
214 | ||
|
215 | (index_1.hexAndAny(w0.p, POSTAG.D_N) && index_1.hexAndAny(w2.p, POSTAG.D_V))) {
|
216 | w1.ow = w1.w;
|
217 | w1.w = '於';
|
218 | new_p = POSTAG.D_P;
|
219 | w1.p = new_p;
|
220 | bool = true;
|
221 | }
|
222 | else if (w3 = words[i + 2]) {
|
223 | if (w0.p & POSTAG.D_V
|
224 | && w2.p & POSTAG.D_D
|
225 | && w3.p & POSTAG.D_V) {
|
226 | w1.ow = w1.w;
|
227 | w1.w = '於';
|
228 | new_p = POSTAG.D_P;
|
229 | w1.p = new_p;
|
230 | bool = true;
|
231 | }
|
232 | }
|
233 | }
|
234 | if (!bool && w2 && w2.p && (w2.p & POSTAG.D_T)) {
|
235 | /**
|
236 | * 迫使法妮雅得于日后和杰弥尼成婚……
|
237 | */
|
238 | w1.ow = w1.w;
|
239 | w1.w = '於';
|
240 | new_p = POSTAG.D_P;
|
241 | w1.p = new_p;
|
242 | bool = true;
|
243 | }
|
244 | }
|
245 | else if (w1.w == '么') {
|
246 | if (!w2 || w2.p & POSTAG.D_W) {
|
247 | w1.ow = w1.w;
|
248 | w1.w = '麼';
|
249 | bool = true;
|
250 | }
|
251 | }
|
252 | }
|
253 | else if (w1_len > 1) {
|
254 | if (w1.w.match(/^(.+)[发發]$/)) {
|
255 | let c = RegExp.$1;
|
256 | if (COLORS_1.COLOR_HAIR[c]) {
|
257 | let nw = c + '髮';
|
258 | nw = this._getSynonym(w1.w, nw);
|
259 | if (nw != w1.w) {
|
260 | w1.ow = w1.w;
|
261 | w1.w = nw;
|
262 | bool = true;
|
263 | }
|
264 | }
|
265 | else if (w1.w === (c + '发')
|
266 | && (w1.p & POSTAG.D_MQ)) {
|
267 | // 一发、兩发、三发、四发、五发、六发——
|
268 | let nw = c + '發';
|
269 | w1.ow = w1.w;
|
270 | w1.w = nw;
|
271 | bool = true;
|
272 | }
|
273 | else if (
|
274 | // 不修正繁體的 發
|
275 | w1.w === (c + '发')
|
276 | && (!w0
|
277 | || (w0 && (w0.p === POSTAG.D_W
|
278 | //|| COLOR_HAIR[w0.w]
|
279 | )))) {
|
280 | let nw = c + '髮';
|
281 | let ow = TABLE[nw];
|
282 | if (ow && ow.s) {
|
283 | w1.ow = w1.w;
|
284 | w1.w = nw;
|
285 | new_p = ow.p;
|
286 | bool = true;
|
287 | }
|
288 | }
|
289 | }
|
290 | else if (index_1.hexAndAny(w1.p, POSTAG.D_MQ) && /^(.+)余$/.test(w1.w)) {
|
291 | let nw = RegExp.$1 + '餘';
|
292 | w1.ow = w1.w;
|
293 | w1.w = nw;
|
294 | bool = true;
|
295 | }
|
296 | // 如果項目為 量词
|
297 | else if (index_1.hexAndAny(w1.p, POSTAG.A_Q, POSTAG.D_MQ)) {
|
298 | }
|
299 | else if (w1.p & POSTAG.D_V && /^干(.)$/.test(w1.w)) {
|
300 | /**
|
301 | * @todo 需要更嚴謹的判斷方式
|
302 | */
|
303 | let c = RegExp.$1;
|
304 | let nw = '幹' + c;
|
305 | let ow = TABLE[nw];
|
306 | if (ow && index_1.hexAndAny(ow.p, POSTAG.D_V)) {
|
307 | if (w2 && index_1.hexAndAny(w2.p, POSTAG.D_R)) {
|
308 | w1.ow = w1.w;
|
309 | w1.w = nw;
|
310 | bool = true;
|
311 | }
|
312 | }
|
313 | }
|
314 | // 如果項目為 錯字
|
315 | else if (w1.p & POSTAG.BAD) {
|
316 | let nw;
|
317 | nw = w1.w
|
318 | .replace(/(.)里|里(.)/, '$1裡$2')
|
319 | .replace(/(.)后|后(.)/, '$1後$2')
|
320 | .replace(/蔘(.)/, '參$1');
|
321 | nw = this._getSynonym(w1.w, nw);
|
322 | //console.log(w1, nw);
|
323 | if (nw != w1.w) {
|
324 | w1.ow = w1.w;
|
325 | w1.w = nw;
|
326 | bool = true;
|
327 | }
|
328 | }
|
329 | // 如果項目為 方位
|
330 | else if (w1.p & POSTAG.D_F) {
|
331 | let nw = w1.w
|
332 | .replace(/(.)里|里(.)/, '$1裡$2')
|
333 | .replace(/(.)后|后(.)/, '$1後$2');
|
334 | nw = this._getSynonym(w1.w, nw);
|
335 | if (nw != w1.w) {
|
336 | w1.ow = w1.w;
|
337 | w1.w = nw;
|
338 | bool = true;
|
339 | }
|
340 | }
|
341 | // 如果項目為 處所
|
342 | else if (w1.p & POSTAG.D_S) {
|
343 | let nw = w1.w
|
344 | .replace(/(.)里$/, '$1裡');
|
345 | nw = this._getSynonym(w1.w, nw);
|
346 | if (nw != w1.w) {
|
347 | w1.ow = w1.w;
|
348 | w1.w = nw;
|
349 | bool = true;
|
350 | }
|
351 | }
|
352 | // 如果項目為 时间
|
353 | else if (w1.p & POSTAG.D_T || w1.p & POSTAG.D_V) {
|
354 | let nw = w1.w
|
355 | .replace(/(.)后|后(.)/, '$1後$2');
|
356 | nw = this._getSynonym(w1.w, nw);
|
357 | if (nw != w1.w) {
|
358 | w1.op = w1.op || w1.p;
|
359 | w1.ow = w1.w;
|
360 | w1.w = nw;
|
361 | bool = true;
|
362 | }
|
363 | }
|
364 | }
|
365 | if (bool && w1.ow && w1.ow != w1.w) {
|
366 | if (w1.w in TABLE) {
|
367 | let ow = TABLE[w1.w];
|
368 | if (typeof new_p !== 'undefined') {
|
369 | w1.op = w1.op || ow.p;
|
370 | w1.p = new_p;
|
371 | }
|
372 | else if (ow.p != w1.p) {
|
373 | w1.op = w1.op || w1.p;
|
374 | w1.p = ow.p;
|
375 | //console.log(TABLE[w1.w]);
|
376 | }
|
377 | if (ow.s !== w1.s) {
|
378 | w1.os = ('os' in w1) ? w1.os : (w1.s || false);
|
379 | w1.s = ow.s;
|
380 | }
|
381 | }
|
382 | this.debugToken(w1, {
|
383 | [this.name]: true,
|
384 | });
|
385 | }
|
386 | i++;
|
387 | }
|
388 | return words;
|
389 | }
|
390 | }
|
391 | exports.ZhtSynonymOptimizer = ZhtSynonymOptimizer;
|
392 | exports.init = ZhtSynonymOptimizer.init.bind(ZhtSynonymOptimizer);
|
393 | exports.default = ZhtSynonymOptimizer;
|
394 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWmh0U3lub255bU9wdGltaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIlpodFN5bm9ueW1PcHRpbWl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOzs7QUFFSCxnQ0FBeUQ7QUFJekQseUNBQTBDO0FBQzFDLDBDQUFzRDtBQUV0RCwyQ0FBaUM7QUFHakM7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQWEsbUJBQW9CLFNBQVEseUJBQW1CO0lBQTVEOztRQUVDLFNBQUksR0FBRyxxQkFBcUIsQ0FBQztJQW1uQjlCLENBQUM7SUE5bUJBLE1BQU07UUFFTCxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFZixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFFbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFdEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8scURBQXdDLElBQUksRUFBRSxDQUFDO0lBQ3RGLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxDQUFTO1FBRTNCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFDdEI7WUFDQyxPQUFPLElBQUksQ0FBQztTQUNaO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBRVMsV0FBVyxDQUFDLENBQVMsRUFBRSxFQUFVO1FBRTFDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFFOUIsSUFBSSxDQUFDLElBQUksT0FBTyxFQUNoQjtZQUNDLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEI7UUFFRCxJQUFJLEVBQUUsSUFBSSxPQUFPLEVBQ2pCO1lBQ0MsYUFBYTtZQUNiLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDakI7UUFFRCxPQUFPLEVBQUUsQ0FBQztJQUNYLENBQUM7SUFFRCxVQUFVLENBQXVCLEtBQVU7UUFFMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBRTlCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVWLElBQUksT0FBTyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZELElBQUksS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUU1QixPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUN2QjtZQUNDLElBQUksRUFBRSxHQUFVLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO1lBQ3JDLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQixJQUFJLEVBQUUsR0FBVSxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztZQUVyQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQ2pDO2dCQUNDLENBQUMsRUFBRSxDQUFDO2dCQUNKLFNBQVM7YUFDVDtZQUVELElBQUksSUFBYSxDQUFDO1lBRWxCLElBQUksTUFBTSxHQUFHLG9CQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVoQyxJQUFJLEtBQWEsQ0FBQztZQUVsQixJQUFJLE1BQU0sSUFBSSxDQUFDLEVBQ2Y7Z0JBQ0Msa0JBQWtCO2dCQUVsQixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUNmO29CQUNDLElBQUksRUFBRSxJQUFJLENBQ1QsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHOzJCQUNsQixFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FDZixFQUNEO3FCQUVDO3lCQUNJLElBQUksRUFBRSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUNyQzt3QkFDQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ2IsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7d0JBRVgsSUFBSSxHQUFHLElBQUksQ0FBQztxQkFDWjt5QkFDSSxJQUFJLEVBQUUsSUFBSSxpQkFBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUM1QixLQUFLO29CQUNMLE1BQU0sQ0FBQyxHQUFHO29CQUVWLEtBQUs7b0JBQ0wsTUFBTSxDQUFDLEdBQUc7b0JBRVYsS0FBSztvQkFDTCxNQUFNLENBQUMsR0FBRztvQkFFVixNQUFNO29CQUNOLE1BQU0sQ0FBQyxHQUFHO29CQUVWLFFBQVE7b0JBQ1IsTUFBTSxDQUFDLEdBQUcsQ0FDVixFQUNEO3dCQUNDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDYixFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQzt3QkFFWCxJQUFJLEdBQUcsSUFBSSxDQUFDO3FCQUNaO2lCQUNEO3FCQUNJLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQ3BCO29CQUVDLElBQUksRUFBRSxJQUFJLENBQ1QsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQ1osRUFDRDtxQkFFQzt5QkFDSSxJQUFJLEVBQUUsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFDckM7d0JBQ0MsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNiLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO3dCQUVYLElBQUksR0FBRyxJQUFJLENBQUM7cUJBQ1o7eUJBQ0ksSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUNuQzt3QkFDQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ2IsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7d0JBRVgsSUFBSSxHQUFHLElBQUksQ0FBQztxQkFDWjtvQkFDRCxXQUFXO3lCQUNOLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxpQkFBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUVyQyxRQUFRO29CQUNSLE1BQU0sQ0FBQyxHQUFHO29CQUNWLE1BQU07b0JBQ04sTUFBTSxDQUFDLEdBQUc7b0JBQ1YsTUFBTTtvQkFDTixNQUFNLENBQUMsR0FBRztvQkFDVixTQUFTO29CQUNULE1BQU0sQ0FBQyxHQUFHO29CQUNWLFlBQVk7b0JBQ1osTUFBTSxDQUFDLElBQUksRUFDWCxNQUFNLENBQUMsR0FBRztvQkFFVixXQUFXO29CQUNYLE1BQU0sQ0FBQyxHQUFHO29CQUVWLEtBQUs7b0JBQ0wsTUFBTSxDQUFDLEdBQUcsRUFFVixNQUFNLENBQUMsR0FBRyxDQUNWLENBQUMsRUFDRjt3QkFDQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ2IsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7d0JBRVgsSUFBSSxHQUFHLElBQUksQ0FBQztxQkFDWjt5QkFDSSxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksaUJBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNyQyxNQUFNLENBQUMsR0FBRyxDQUNWLENBQUMsRUFDRjt3QkFDQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ2IsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7d0JBRVgsSUFBSSxHQUFHLElBQUksQ0FBQztxQkFDWjt5QkFDSSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxpQkFBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUN2RCxLQUFLO29CQUNMLE1BQU0sQ0FBQyxHQUFHLENBQ1YsQ0FBQyxDQUFDLEVBQ0g7d0JBQ0MsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNiLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO3dCQUVYLElBQUksR0FBRyxJQUFJLENBQUM7cUJBQ1o7eUJBQ0ksSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3ZEO3dCQUNDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDYixFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQzt3QkFFWCxJQUFJLEdBQUcsSUFBSSxDQUFDO3FCQUNaO2lCQUNEO3FCQUNJLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQ25DO29CQUNDLElBQUksQ0FBUyxDQUFDO29CQUVkLElBQUksRUFBRSxFQUNOO3dCQUNDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUNUO29CQUVELElBQUksQ0FBQyxJQUFJLG1CQUFVLENBQUMsQ0FBQyxDQUFDLEVBQ3RCO3dCQUNDLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQzt3QkFFYixFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUVoQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUNkOzRCQUNDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFDYixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs0QkFFVixLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQzs0QkFFbkIsSUFBSSxHQUFHLElBQUksQ0FBQzt5QkFDWjtxQkFDRDtvQkFFRCxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFDOUM7d0JBQ0MsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNiLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO3dCQUVYLElBQUksR0FBRyxJQUFJLENBQUM7cUJBQ1o7aUJBQ0Q7cUJBQ0ksSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFDcEI7b0JBQ0MsSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN2RCxFQUFFLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHOzJCQUNkLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUc7MkJBQ2pCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUc7MkJBQ2pCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUc7MkJBQ2pCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUc7MkJBQ2pCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUk7MkJBQ2xCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUc7MkJBQ2pCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FDcEIsQ0FBQyxFQUNGO3dCQUNDOzsyQkFFRzt3QkFDSCxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ2IsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7d0JBRVgsS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7d0JBQ25CLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO3dCQUViLElBQUksR0FBRyxJQUFJLENBQUM7cUJBQ1o7eUJBQ0ksSUFBSSxFQUFFLElBQUksRUFBRSxFQUNqQjt3QkFDQyxJQUFJLEVBQVMsQ0FBQzt3QkFFZCxJQUNDLENBQUMsaUJBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNkLE1BQU0sQ0FBQyxHQUFHLEVBQ1YsTUFBTSxDQUFDLEdBQUcsRUFDVixNQUFNLENBQUMsR0FBRyxFQUNWLE1BQU0sQ0FBQyxHQUFHLEVBQ1YsTUFBTSxDQUFDLEdBQUcsQ0FDVixJQUFJLGlCQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsTUFBTSxDQUFDLEdBQUcsRUFDVixNQUFNLENBQUMsR0FBRyxFQUNWLE1BQU0sQ0FBQyxHQUFHLEVBQ1YsTUFBTSxDQUFDLEdBQUcsRUFDVixNQUFNLENBQUMsSUFBSSxFQUNYLE1BQU0sQ0FBQyxHQUFHLEVBQ1YsTUFBTSxDQUFDLEdBQUcsQ0FDVixDQUFDOztnQ0FFRixDQUFDLGlCQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDZCxNQUFNLENBQUMsR0FBRyxDQUNWLElBQUksaUJBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixNQUFNLENBQUMsR0FBRyxDQUNWLENBQUM7O2dDQUVGLENBQUMsaUJBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNkLE1BQU0sQ0FBQyxHQUFHLEVBQ1YsTUFBTSxDQUFDLEdBQUcsQ0FDVixJQUFJLGlCQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsTUFBTSxDQUFDLEdBQUcsRUFDVixNQUFNLENBQUMsR0FBRyxFQUNWLE1BQU0sQ0FBQyxJQUFJLEVBQ1gsTUFBTSxDQUFDLEdBQUcsRUFDVixNQUFNLENBQUMsR0FBRyxFQUNWLE1BQU0sQ0FBQyxHQUFHLENBQ1YsQ0FBQzs7Z0NBRUYsQ0FBQyxpQkFBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2QsTUFBTSxDQUFDLElBQUksRUFDWCxNQUFNLENBQUMsR0FBRyxFQUNWLE1BQU0sQ0FBQyxHQUFHLENBQ1YsSUFBSSxpQkFBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLE1BQU0sQ0FBQyxJQUFJLEVBQ1gsTUFBTSxDQUFDLEdBQUcsQ0FDVixDQUFDOztnQ0FFRixDQUFDLGlCQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDZCxNQUFNLENBQUMsR0FBRyxDQUNWLElBQUksaUJBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixNQUFNLENBQUMsR0FBRyxDQUNWLENBQUM7NEJBQ0Y7Ozs7Ozs7OEJBT0U7O2dDQUVGLENBQUMsaUJBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNkLE1BQU0sQ0FBQyxJQUFJLENBQ1gsSUFBSSxpQkFBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLE1BQU0sQ0FBQyxJQUFJLEVBQ1gsTUFBTSxDQUFDLElBQUksRUFDWCxNQUFNLENBQUMsR0FBRyxFQUNWLE1BQU0sQ0FBQyxHQUFHLEVBQ1YsTUFBTSxDQUFDLEdBQUcsQ0FDVixDQUFDOztnQ0FFRixDQUFDLGlCQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDZCxNQUFNLENBQUMsR0FBRyxDQUNWLElBQUksaUJBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixNQUFNLENBQUMsR0FBRyxDQUNWLENBQUM7O2dDQUVGLENBQUMsaUJBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNkLE1BQU0sQ0FBQyxHQUFHLENBQ1YsSUFBSSxpQkFBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLE1BQU0sQ0FBQyxHQUFHLENBQ1YsQ0FBQzs7Z0NBRUYsQ0FBQyxpQkFBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FDVixJQUFJLGlCQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsTUFBTSxDQUFDLEdBQUcsQ0FDVixDQUFDOztnQ0FFRixDQUFDLGlCQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDZCxNQUFNLENBQUMsR0FBRyxDQUNWLElBQUksaUJBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixNQUFNLENBQUMsR0FBRyxDQUNWLENBQUMsRUFFSDs0QkFDQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQ2IsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7NEJBRVgsS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7NEJBQ25CLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDOzRCQUViLElBQUksR0FBRyxJQUFJLENBQUM7eUJBQ1o7NkJBQ0ksSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDMUI7NEJBQ0MsSUFDQyxFQUFFLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHO21DQUNkLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUc7bUNBQ2pCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFFckI7Z0NBQ0MsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dDQUNiLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO2dDQUVYLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO2dDQUNuQixFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQ0FFYixJQUFJLEdBQUcsSUFBSSxDQUFDOzZCQUNaO3lCQUNEO3FCQUNEO29CQUVELElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFDOUM7d0JBQ0M7OzJCQUVHO3dCQUVILEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDYixFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQzt3QkFFWCxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQzt3QkFDbkIsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7d0JBRWIsSUFBSSxHQUFHLElBQUksQ0FBQztxQkFDWjtpQkFDRDtxQkFDSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUNwQjtvQkFDQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFDNUI7d0JBQ0MsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNiLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO3dCQUVYLElBQUksR0FBRyxJQUFJLENBQUM7cUJBQ1o7aUJBQ0Q7YUFDRDtpQkFDSSxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQ25CO2dCQUNDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQzVCO29CQUNDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7b0JBRWxCLElBQUksbUJBQVUsQ0FBQyxDQUFDLENBQUMsRUFDakI7d0JBQ0MsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQzt3QkFFakIsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFFaEMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFDZDs0QkFDQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQ2IsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7NEJBRVYsSUFBSSxHQUFHLElBQUksQ0FBQzt5QkFDWjtxQkFDRDt5QkFDSSxJQUNKLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDOzJCQUNmLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBRXhCO3dCQUNDLHVCQUF1Qjt3QkFFdkIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQzt3QkFFakIsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNiLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUVWLElBQUksR0FBRyxJQUFJLENBQUM7cUJBQ1o7eUJBQ0k7b0JBQ0osV0FBVztvQkFDWCxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQzsyQkFDZixDQUNGLENBQUMsRUFBRTsrQkFDQSxDQUNGLEVBQUUsSUFBSSxDQUNMLEVBQUUsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLEdBQUc7NEJBQ25CLHFCQUFxQjs2QkFDckIsQ0FDRCxDQUNELEVBRUY7d0JBQ0MsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQzt3QkFFakIsSUFBSSxFQUFFLEdBQVUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUUxQixJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUNkOzRCQUNDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFDYixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs0QkFFVixLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFFYixJQUFJLEdBQUcsSUFBSSxDQUFDO3lCQUNaO3FCQUNEO2lCQUNEO3FCQUNJLElBQUksaUJBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUN0QixNQUFNLENBQUMsSUFBSSxDQUNYLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQ3pCO29CQUNDLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO29CQUV6QixFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ2IsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBRVYsSUFBSSxHQUFHLElBQUksQ0FBQztpQkFDWjtnQkFDRCxXQUFXO3FCQUNOLElBQUksaUJBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUN0QixNQUFNLENBQUMsR0FBRyxFQUNWLE1BQU0sQ0FBQyxJQUFJLENBQ1gsRUFDRDtpQkFFQztxQkFDSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFDakQ7b0JBQ0M7O3VCQUVHO29CQUVILElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7b0JBQ2xCLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7b0JBQ2pCLElBQUksRUFBRSxHQUFVLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFFMUIsSUFBSSxFQUFFLElBQUksaUJBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUN2QixNQUFNLENBQUMsR0FBRyxDQUNWLEVBQ0Q7d0JBQ0MsSUFBSSxFQUFFLElBQUksaUJBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUN2QixNQUFNLENBQUMsR0FBRyxDQUNWLEVBQ0Q7NEJBQ0MsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDOzRCQUNiLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDOzRCQUVWLElBQUksR0FBRyxJQUFJLENBQUM7eUJBQ1o7cUJBQ0Q7aUJBQ0Q7Z0JBQ0QsV0FBVztxQkFDTixJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFDMUI7b0JBQ0MsSUFBSSxFQUFVLENBQUM7b0JBRWYsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO3lCQUNQLE9BQU8sQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDO3lCQUM3QixPQUFPLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQzt5QkFDN0IsT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FDdkI7b0JBRUQsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFFaEMsc0JBQXNCO29CQUV0QixJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUNkO3dCQUNDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDYixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFFVixJQUFJLEdBQUcsSUFBSSxDQUFDO3FCQUNaO2lCQUNEO2dCQUNELFdBQVc7cUJBQ04sSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQzFCO29CQUNDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO3lCQUNYLE9BQU8sQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDO3lCQUM3QixPQUFPLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUM5QjtvQkFFRCxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUVoQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUNkO3dCQUNDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDYixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFFVixJQUFJLEdBQUcsSUFBSSxDQUFDO3FCQUNaO2lCQUNEO2dCQUNELFdBQVc7cUJBQ04sSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQzFCO29CQUNDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO3lCQUNYLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQ3hCO29CQUVELEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBRWhDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQ2Q7d0JBQ0MsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNiLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUVWLElBQUksR0FBRyxJQUFJLENBQUM7cUJBQ1o7aUJBQ0Q7Z0JBQ0QsV0FBVztxQkFDTixJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQy9DO29CQUNDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO3lCQUNYLE9BQU8sQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQzlCO29CQUVELEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBRWhDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQ2Q7d0JBQ0MsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ3RCLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFFYixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFFVixJQUFJLEdBQUcsSUFBSSxDQUFDO3FCQUNaO2lCQUNEO2FBQ0Q7WUFFRCxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFDbEM7Z0JBQ0MsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFDakI7b0JBQ0MsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFFckIsSUFBSSxPQUFPLEtBQUssS0FBSyxXQUFXLEVBQ2hDO3dCQUNDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUN0QixFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztxQkFDYjt5QkFDSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFDckI7d0JBQ0MsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ3RCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFFWiwyQkFBMkI7cUJBQzNCO29CQUVELElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUNqQjt3QkFDQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUM7d0JBQy9DLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztxQkFDWjtpQkFDRDtnQkFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRTtvQkFDbkIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSTtpQkFDakIsQ0FBQyxDQUFDO2FBQ0g7WUFFRCxDQUFDLEVBQUUsQ0FBQztTQUNKO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZCxDQUFDO0NBQ0Q7QUFybkJELGtEQXFuQkM7QUFFWSxRQUFBLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFvQyxDQUFDO0FBRTFHLGtCQUFlLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDcmVhdGVkIGJ5IHVzZXIgb24gMjAxOC80LzE2LzAxNi5cbiAqL1xuXG5pbXBvcnQgeyBTdWJTTW9kdWxlLCBTdWJTTW9kdWxlT3B0aW1pemVyIH0gZnJvbSAnLi4vbW9kJztcbmltcG9ydCBQT1NUQUcgZnJvbSAnLi4vUE9TVEFHJztcbmltcG9ydCBTZWdtZW50LCB7IElESUNULCBJRElDVF9TWU5PTllNLCBJV29yZCB9IGZyb20gJy4uL1NlZ21lbnQnO1xuaW1wb3J0IHsgSVdvcmREZWJ1ZyB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgaGV4QW5kQW55IH0gZnJvbSAnLi4vdXRpbC9pbmRleCc7XG5pbXBvcnQgeyBDT0xPUl9BTEwsIENPTE9SX0hBSVIgfSBmcm9tICcuLi9tb2QvQ09MT1JTJztcblxuaW1wb3J0IFVTdHJpbmcgZnJvbSAndW5pLXN0cmluZyc7XG5pbXBvcnQgeyBFbnVtRGljdERhdGFiYXNlIH0gZnJvbSAnLi4vY29uc3QnO1xuXG4vKipcbiAqIOS7peipnuaEj+S+huiHquWLlei9ieaPmyDogIzkuI3pnIDopoHmiYvli5XliqDlhaXlrZflhbjmlrwgc3lub255bS50eHRcbiAqIOmBqeeUqOaWvOavlOi8g+WuueaYk+mcgOimgeS6uuW3peiZleeQhueahOi9ieaPm1xuICpcbiAqIOiHquWLleiZleeQhiBg6YeMfOWQjmBcbiAqXG4gKiDlu7rorbDlnKjlrZflhbjlhafov73liqDkurrlkI3lnLDlkI3nrYnnrYnlkI3lrZcg5L6G5aKe5Yqg5rqW56K65oCnXG4gKiDpmLLmraLovYnmj5vpjK/oqqRcbiAqXG4gKiBAdG9kbyDnmbzkuo7kvZnlubLmnb7lhrLlh4blkYblj6rojIPoiI3mtoJcbiAqL1xuZXhwb3J0IGNsYXNzIFpodFN5bm9ueW1PcHRpbWl6ZXIgZXh0ZW5kcyBTdWJTTW9kdWxlT3B0aW1pemVyXG57XG5cdG5hbWUgPSAnWmh0U3lub255bU9wdGltaXplcic7XG5cblx0cHJvdGVjdGVkIF9TWU5PTllNPzogSURJQ1RfU1lOT05ZTTtcblx0cHJvdGVjdGVkIF9UQUJMRTogSURJQ1Q8SVdvcmQ+O1xuXG5cdF9jYWNoZSgpXG5cdHtcblx0XHRzdXBlci5fY2FjaGUoKTtcblxuXHRcdHRoaXMuX1RBQkxFID0gdGhpcy5zZWdtZW50LmdldERpY3QoJ1RBQkxFJyk7XG5cdFx0dGhpcy5fUE9TVEFHID0gdGhpcy5zZWdtZW50LlBPU1RBRztcblxuXHRcdHRoaXMuX1NZTk9OWU0gPSB0aGlzLnNlZ21lbnQuZ2V0RGljdCgnU1lOT05ZTScpIHx8IHt9O1xuXG5cdFx0dGhpcy5fQkxBQ0tMSVNUID0gdGhpcy5zZWdtZW50LmdldERpY3QoRW51bURpY3REYXRhYmFzZS5CTEFDS0xJU1RfRk9SX1NZTk9OWU0pIHx8IHt9O1xuXHR9XG5cblx0aXNTeW5vbnltQmxhY2tsaXN0KHc6IHN0cmluZylcblx0e1xuXHRcdGlmICh0aGlzLl9CTEFDS0xJU1Rbd10pXG5cdFx0e1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRwcm90ZWN0ZWQgX2dldFN5bm9ueW0odzogc3RyaW5nLCBudzogc3RyaW5nKTogc3RyaW5nXG5cdHtcblx0XHRjb25zdCBTWU5PTllNID0gdGhpcy5fU1lOT05ZTTtcblxuXHRcdGlmICh3IGluIFNZTk9OWU0pXG5cdFx0e1xuXHRcdFx0bncgPSBTWU5PTllNW3ddO1xuXHRcdH1cblxuXHRcdGlmIChudyBpbiBTWU5PTllNKVxuXHRcdHtcblx0XHRcdC8vbGV0IHcgPSBudztcblx0XHRcdG53ID0gU1lOT05ZTVtud107XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG53O1xuXHR9XG5cblx0ZG9PcHRpbWl6ZTxUIGV4dGVuZHMgSVdvcmREZWJ1Zz4od29yZHM6IFRbXSk6IFRbXVxuXHR7XG5cdFx0Y29uc3Qgc2VsZiA9IHRoaXM7XG5cdFx0Y29uc3QgUE9TVEFHID0gdGhpcy5fUE9TVEFHO1xuXHRcdGNvbnN0IFRBQkxFID0gdGhpcy5fVEFCTEU7XG5cdFx0Y29uc3QgU1lOT05ZTSA9IHRoaXMuX1NZTk9OWU07XG5cblx0XHRsZXQgaSA9IDA7XG5cblx0XHRsZXQgQ0xPU0VfUCA9IFsn44CRJywgJ+OAjScsICfjgIsnLCAn44CPJywgJ++8vScsICfigJknLCAn4oCdJywgJ+OAiSddO1xuXHRcdGxldCBTRVBfUCA9IFsn44CBJywgJywnLCAn4oCmJ107XG5cblx0XHR3aGlsZSAoaSA8IHdvcmRzLmxlbmd0aClcblx0XHR7XG5cdFx0XHRsZXQgdzA6IElXb3JkID0gd29yZHNbaSAtIDFdIHx8IG51bGw7XG5cdFx0XHRsZXQgdzEgPSB3b3Jkc1tpXTtcblx0XHRcdGxldCB3MjogSVdvcmQgPSB3b3Jkc1tpICsgMV0gfHwgbnVsbDtcblxuXHRcdFx0aWYgKHRoaXMuaXNTeW5vbnltQmxhY2tsaXN0KHcxLncpKVxuXHRcdFx0e1xuXHRcdFx0XHRpKys7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgYm9vbDogYm9vbGVhbjtcblxuXHRcdFx0bGV0IHcxX2xlbiA9IFVTdHJpbmcuc2l6ZSh3MS53KTtcblxuXHRcdFx0bGV0IG5ld19wOiBudW1iZXI7XG5cblx0XHRcdGlmICh3MV9sZW4gPT0gMSlcblx0XHRcdHtcblx0XHRcdFx0Ly9jb25zb2xlLmxvZyh3MSk7XG5cblx0XHRcdFx0aWYgKHcxLncgPT0gJ+mHjCcpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodzAgJiYgKFxuXHRcdFx0XHRcdFx0dzAudy5zbGljZSgtMSkgPT0gJ+eahCdcblx0XHRcdFx0XHRcdHx8IHcwLncgPT09ICflkownXG5cdFx0XHRcdFx0KSlcblx0XHRcdFx0XHR7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSBpZiAodzAgJiYgQ0xPU0VfUC5pbmNsdWRlcyh3MC53KSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR3MS5vdyA9IHcxLnc7XG5cdFx0XHRcdFx0XHR3MS53ID0gJ+ijoSc7XG5cblx0XHRcdFx0XHRcdGJvb2wgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlIGlmICh3MCAmJiBoZXhBbmRBbnkodzAucCxcblx0XHRcdFx0XHRcdC8vIOWQjeipnlxuXHRcdFx0XHRcdFx0UE9TVEFHLkRfTixcblxuXHRcdFx0XHRcdFx0Ly8g6JmV5omAXG5cdFx0XHRcdFx0XHRQT1NUQUcuRF9TLFxuXG5cdFx0XHRcdFx0XHQvLyDmlrnkvY1cblx0XHRcdFx0XHRcdFBPU1RBRy5EX0YsXG5cblx0XHRcdFx0XHRcdC8vIOaXtumXtOivjVxuXHRcdFx0XHRcdFx0UE9TVEFHLkRfVCxcblxuXHRcdFx0XHRcdFx0Ly8g5Yqo6K+NIOiuree7g1xuXHRcdFx0XHRcdFx0UE9TVEFHLkRfVixcblx0XHRcdFx0XHQpKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHcxLm93ID0gdzEudztcblx0XHRcdFx0XHRcdHcxLncgPSAn6KOhJztcblxuXHRcdFx0XHRcdFx0Ym9vbCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYgKHcxLncgPT0gJ+WQjicpXG5cdFx0XHRcdHtcblxuXHRcdFx0XHRcdGlmICh3MCAmJiAoXG5cdFx0XHRcdFx0XHR3MC53ID09PSAn5ZKMJ1xuXHRcdFx0XHRcdCkpXG5cdFx0XHRcdFx0e1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2UgaWYgKHcwICYmIENMT1NFX1AuaW5jbHVkZXModzAudykpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dzEub3cgPSB3MS53O1xuXHRcdFx0XHRcdFx0dzEudyA9ICflvownO1xuXG5cdFx0XHRcdFx0XHRib29sID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSBpZiAodzAgJiYgWyfohbAnXS5pbmNsdWRlcyh3MC53KSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR3MS5vdyA9IHcxLnc7XG5cdFx0XHRcdFx0XHR3MS53ID0gJ+W+jCc7XG5cblx0XHRcdFx0XHRcdGJvb2wgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyDlpoLmnpzliY3kuIDlgIvpoIXnm67ngrpcblx0XHRcdFx0XHRlbHNlIGlmICh3MCAmJiAodzAucCAmJiBoZXhBbmRBbnkodzAucCxcblxuXHRcdFx0XHRcdFx0Ly8g5Yqo6K+NIOmboumWi1xuXHRcdFx0XHRcdFx0UE9TVEFHLkRfVixcblx0XHRcdFx0XHRcdC8vIOWkhOaJgOivjVxuXHRcdFx0XHRcdFx0UE9TVEFHLkRfUyxcblx0XHRcdFx0XHRcdC8vIOaXtumXtOivjVxuXHRcdFx0XHRcdFx0UE9TVEFHLkRfVCxcblx0XHRcdFx0XHRcdC8vIOWQjeivjSDlkI3or63ntKBcblx0XHRcdFx0XHRcdFBPU1RBRy5EX04sXG5cdFx0XHRcdFx0XHQvLyDmlbDph4/or40gLSDlh6DmrKHlkI5cblx0XHRcdFx0XHRcdFBPU1RBRy5EX01RLFxuXHRcdFx0XHRcdFx0UE9TVEFHLkFfTSxcblxuXHRcdFx0XHRcdFx0Ly8g5pa55L2N6K+NIOaWueS9jeivree0oFxuXHRcdFx0XHRcdFx0UE9TVEFHLkRfRixcblxuXHRcdFx0XHRcdFx0Ly8g5Ymv6K+NXG5cdFx0XHRcdFx0XHRQT1NUQUcuRF9ELFxuXG5cdFx0XHRcdFx0XHRQT1NUQUcuRF9SLFxuXHRcdFx0XHRcdCkpKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHcxLm93ID0gdzEudztcblx0XHRcdFx0XHRcdHcxLncgPSAn5b6MJztcblxuXHRcdFx0XHRcdFx0Ym9vbCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2UgaWYgKHcyICYmICh3Mi5wICYmIGhleEFuZEFueSh3Mi5wLFxuXHRcdFx0XHRcdFx0UE9TVEFHLkRfVixcblx0XHRcdFx0XHQpKSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR3MS5vdyA9IHcxLnc7XG5cdFx0XHRcdFx0XHR3MS53ID0gJ+W+jCc7XG5cblx0XHRcdFx0XHRcdGJvb2wgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlIGlmICh3MiAmJiAoKHcwICYmICF3MC5wKSAmJiAodzIucCAmJiBoZXhBbmRBbnkodzIucCxcblx0XHRcdFx0XHRcdC8vIOWJr+ivjVxuXHRcdFx0XHRcdFx0UE9TVEFHLkRfRCxcblx0XHRcdFx0XHQpKSkpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dzEub3cgPSB3MS53O1xuXHRcdFx0XHRcdFx0dzEudyA9ICflvownO1xuXG5cdFx0XHRcdFx0XHRib29sID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSBpZiAodzIgJiYgKCghdzAgfHwgIXcwLnApICYmIFNFUF9QLmluY2x1ZGVzKHcyLncpKSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR3MS5vdyA9IHcxLnc7XG5cdFx0XHRcdFx0XHR3MS53ID0gJ+W+jCc7XG5cblx0XHRcdFx0XHRcdGJvb2wgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmICh3MS53ID09ICflj5EnIHx8IHcxLncgPT0gJ+eZvCcpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgYzogc3RyaW5nO1xuXG5cdFx0XHRcdFx0aWYgKHcwKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGMgPSB3MC53O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChjICYmIENPTE9SX0hBSVJbY10pXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG53ID0gJ+mrric7XG5cblx0XHRcdFx0XHRcdG53ID0gdGhpcy5fZ2V0U3lub255bSh3MS53LCBudyk7XG5cblx0XHRcdFx0XHRcdGlmIChudyAhPSB3MS53KVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR3MS5vdyA9IHcxLnc7XG5cdFx0XHRcdFx0XHRcdHcxLncgPSBudztcblxuXHRcdFx0XHRcdFx0XHRuZXdfcCA9IFBPU1RBRy5EX047XG5cblx0XHRcdFx0XHRcdFx0Ym9vbCA9IHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCFib29sICYmIHcyICYmIHcxLncgPT0gJ+WPkScgJiYgdzIudyA9PT0gJ+eahCcpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dzEub3cgPSB3MS53O1xuXHRcdFx0XHRcdFx0dzEudyA9ICfnmbwnO1xuXG5cdFx0XHRcdFx0XHRib29sID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSBpZiAodzEudyA9PSAn5LqOJylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICgodzAgPT0gbnVsbCB8fCB3MC5wICYgUE9TVEFHLkRfVykgJiYgKHcyICYmIHcyLnAgJiYgKFxuXHRcdFx0XHRcdFx0dzIucCAmIFBPU1RBRy5EX05cblx0XHRcdFx0XHRcdHx8IHcyLnAgJiBQT1NUQUcuRF9WXG5cdFx0XHRcdFx0XHR8fCB3Mi5wICYgUE9TVEFHLkRfUlxuXHRcdFx0XHRcdFx0fHwgdzIucCAmIFBPU1RBRy5EX0Rcblx0XHRcdFx0XHRcdHx8IHcyLnAgJiBQT1NUQUcuRF9UXG5cdFx0XHRcdFx0XHR8fCB3Mi5wICYgUE9TVEFHLkFfTlJcblx0XHRcdFx0XHRcdHx8IHcyLnAgJiBQT1NUQUcuRF9TXG5cdFx0XHRcdFx0XHR8fCB3Mi5wICYgUE9TVEFHLkRfRlxuXHRcdFx0XHRcdCkpKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdFx0ICog55W2IOaWvCDlnKjlj6XlrZDplovpoK3kuKbkuJTlvozpnaLmmK/lkI3oqZ7miJbli5XoqZ7mmYJcblx0XHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdFx0dzEub3cgPSB3MS53O1xuXHRcdFx0XHRcdFx0dzEudyA9ICfmlrwnO1xuXG5cdFx0XHRcdFx0XHRuZXdfcCA9IFBPU1RBRy5EX1A7XG5cdFx0XHRcdFx0XHR3MS5wID0gbmV3X3A7XG5cblx0XHRcdFx0XHRcdGJvb2wgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlIGlmICh3MCAmJiB3Milcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgdzM6IElXb3JkO1xuXG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdChoZXhBbmRBbnkodzAucCxcblx0XHRcdFx0XHRcdFx0XHRQT1NUQUcuRF9WLFxuXHRcdFx0XHRcdFx0XHRcdFBPU1RBRy5EX1IsXG5cdFx0XHRcdFx0XHRcdFx0UE9TVEFHLkRfQSxcblx0XHRcdFx0XHRcdFx0XHRQT1NUQUcuRF9ULFxuXHRcdFx0XHRcdFx0XHRcdFBPU1RBRy5EX0YsXG5cdFx0XHRcdFx0XHRcdCkgJiYgaGV4QW5kQW55KHcyLnAsXG5cdFx0XHRcdFx0XHRcdFx0UE9TVEFHLkRfTixcblx0XHRcdFx0XHRcdFx0XHRQT1NUQUcuRF9WLFxuXHRcdFx0XHRcdFx0XHRcdFBPU1RBRy5EX1IsXG5cdFx0XHRcdFx0XHRcdFx0UE9TVEFHLkRfUyxcblx0XHRcdFx0XHRcdFx0XHRQT1NUQUcuQV9OWCxcblx0XHRcdFx0XHRcdFx0XHRQT1NUQUcuRF9GLFxuXHRcdFx0XHRcdFx0XHRcdFBPU1RBRy5EX1csXG5cdFx0XHRcdFx0XHRcdCkpXG5cdFx0XHRcdFx0XHRcdHx8XG5cdFx0XHRcdFx0XHRcdChoZXhBbmRBbnkodzAucCxcblx0XHRcdFx0XHRcdFx0XHRQT1NUQUcuRF9OLFxuXHRcdFx0XHRcdFx0XHQpICYmIGhleEFuZEFueSh3Mi5wLFxuXHRcdFx0XHRcdFx0XHRcdFBPU1RBRy5EX04sXG5cdFx0XHRcdFx0XHRcdCkpXG5cdFx0XHRcdFx0XHRcdHx8XG5cdFx0XHRcdFx0XHRcdChoZXhBbmRBbnkodzAucCxcblx0XHRcdFx0XHRcdFx0XHRQT1NUQUcuRF9WLFxuXHRcdFx0XHRcdFx0XHRcdFBPU1RBRy5EX04sXG5cdFx0XHRcdFx0XHRcdCkgJiYgaGV4QW5kQW55KHcyLnAsXG5cdFx0XHRcdFx0XHRcdFx0UE9TVEFHLkRfRixcblx0XHRcdFx0XHRcdFx0XHRQT1NUQUcuRF9ULFxuXHRcdFx0XHRcdFx0XHRcdFBPU1RBRy5BX05SLFxuXHRcdFx0XHRcdFx0XHRcdFBPU1RBRy5EX1IsXG5cdFx0XHRcdFx0XHRcdFx0UE9TVEFHLkRfUyxcblx0XHRcdFx0XHRcdFx0XHRQT1NUQUcuRF9XLFxuXHRcdFx0XHRcdFx0XHQpKVxuXHRcdFx0XHRcdFx0XHR8fFxuXHRcdFx0XHRcdFx0XHQoaGV4QW5kQW55KHcwLnAsXG5cdFx0XHRcdFx0XHRcdFx0UE9TVEFHLkFfTlMsXG5cdFx0XHRcdFx0XHRcdFx0UE9TVEFHLkRfVCxcblx0XHRcdFx0XHRcdFx0XHRQT1NUQUcuRF9DLFxuXHRcdFx0XHRcdFx0XHQpICYmIGhleEFuZEFueSh3Mi5wLFxuXHRcdFx0XHRcdFx0XHRcdFBPU1RBRy5BX05TLFxuXHRcdFx0XHRcdFx0XHRcdFBPU1RBRy5EX1QsXG5cdFx0XHRcdFx0XHRcdCkpXG5cdFx0XHRcdFx0XHRcdHx8XG5cdFx0XHRcdFx0XHRcdChoZXhBbmRBbnkodzAucCxcblx0XHRcdFx0XHRcdFx0XHRQT1NUQUcuRF9ELFxuXHRcdFx0XHRcdFx0XHQpICYmIGhleEFuZEFueSh3Mi5wLFxuXHRcdFx0XHRcdFx0XHRcdFBPU1RBRy5EX04sXG5cdFx0XHRcdFx0XHRcdCkpXG5cdFx0XHRcdFx0XHRcdC8qXG5cdFx0XHRcdFx0XHRcdHx8XG5cdFx0XHRcdFx0XHRcdChoZXhBbmRBbnkodzAucCxcblx0XHRcdFx0XHRcdFx0XHRQT1NUQUcuRF9WLFxuXHRcdFx0XHRcdFx0XHQpICYmIGhleEFuZEFueSh3Mi5wLFxuXHRcdFx0XHRcdFx0XHRcdFBPU1RBRy5EX0QsXG5cdFx0XHRcdFx0XHRcdCkpXG5cdFx0XHRcdFx0XHRcdCovXG5cdFx0XHRcdFx0XHRcdHx8XG5cdFx0XHRcdFx0XHRcdChoZXhBbmRBbnkodzAucCxcblx0XHRcdFx0XHRcdFx0XHRQT1NUQUcuQV9OUixcblx0XHRcdFx0XHRcdFx0KSAmJiBoZXhBbmRBbnkodzIucCxcblx0XHRcdFx0XHRcdFx0XHRQT1NUQUcuQV9OUyxcblx0XHRcdFx0XHRcdFx0XHRQT1NUQUcuQV9OVCxcblx0XHRcdFx0XHRcdFx0XHRQT1NUQUcuRF9TLFxuXHRcdFx0XHRcdFx0XHRcdFBPU1RBRy5EX04sXG5cdFx0XHRcdFx0XHRcdFx0UE9TVEFHLkRfVixcblx0XHRcdFx0XHRcdFx0KSlcblx0XHRcdFx0XHRcdFx0fHxcblx0XHRcdFx0XHRcdFx0KGhleEFuZEFueSh3MC5wLFxuXHRcdFx0XHRcdFx0XHRcdFBPU1RBRy5EX1YsXG5cdFx0XHRcdFx0XHRcdCkgJiYgaGV4QW5kQW55KHcyLnAsXG5cdFx0XHRcdFx0XHRcdFx0UE9TVEFHLkRfVyxcblx0XHRcdFx0XHRcdFx0KSlcblx0XHRcdFx0XHRcdFx0fHxcblx0XHRcdFx0XHRcdFx0KGhleEFuZEFueSh3MC5wLFxuXHRcdFx0XHRcdFx0XHRcdFBPU1RBRy5EX0QsXG5cdFx0XHRcdFx0XHRcdCkgJiYgaGV4QW5kQW55KHcyLnAsXG5cdFx0XHRcdFx0XHRcdFx0UE9TVEFHLkRfVixcblx0XHRcdFx0XHRcdFx0KSlcblx0XHRcdFx0XHRcdFx0fHxcblx0XHRcdFx0XHRcdFx0KGhleEFuZEFueSh3MC5wLFxuXHRcdFx0XHRcdFx0XHRcdFBPU1RBRy5EX1YsXG5cdFx0XHRcdFx0XHRcdCkgJiYgaGV4QW5kQW55KHcyLnAsXG5cdFx0XHRcdFx0XHRcdFx0UE9TVEFHLkRfRCxcblx0XHRcdFx0XHRcdFx0KSlcblx0XHRcdFx0XHRcdFx0fHxcblx0XHRcdFx0XHRcdFx0KGhleEFuZEFueSh3MC5wLFxuXHRcdFx0XHRcdFx0XHRcdFBPU1RBRy5EX04sXG5cdFx0XHRcdFx0XHRcdCkgJiYgaGV4QW5kQW55KHcyLnAsXG5cdFx0XHRcdFx0XHRcdFx0UE9TVEFHLkRfVixcblx0XHRcdFx0XHRcdFx0KSlcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dzEub3cgPSB3MS53O1xuXHRcdFx0XHRcdFx0XHR3MS53ID0gJ+aWvCc7XG5cblx0XHRcdFx0XHRcdFx0bmV3X3AgPSBQT1NUQUcuRF9QO1xuXHRcdFx0XHRcdFx0XHR3MS5wID0gbmV3X3A7XG5cblx0XHRcdFx0XHRcdFx0Ym9vbCA9IHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlIGlmICh3MyA9IHdvcmRzW2kgKyAyXSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdHcwLnAgJiBQT1NUQUcuRF9WXG5cdFx0XHRcdFx0XHRcdFx0JiYgdzIucCAmIFBPU1RBRy5EX0Rcblx0XHRcdFx0XHRcdFx0XHQmJiB3My5wICYgUE9TVEFHLkRfVlxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHR3MS5vdyA9IHcxLnc7XG5cdFx0XHRcdFx0XHRcdFx0dzEudyA9ICfmlrwnO1xuXG5cdFx0XHRcdFx0XHRcdFx0bmV3X3AgPSBQT1NUQUcuRF9QO1xuXHRcdFx0XHRcdFx0XHRcdHcxLnAgPSBuZXdfcDtcblxuXHRcdFx0XHRcdFx0XHRcdGJvb2wgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCFib29sICYmIHcyICYmIHcyLnAgJiYgKHcyLnAgJiBQT1NUQUcuRF9UKSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHRcdCAqIOi/q+S9v+azleWmrumbheW+l+S6juaXpeWQjuWSjOadsOW8peWwvOaIkOWpmuKApuKAplxuXHRcdFx0XHRcdFx0ICovXG5cblx0XHRcdFx0XHRcdHcxLm93ID0gdzEudztcblx0XHRcdFx0XHRcdHcxLncgPSAn5pa8JztcblxuXHRcdFx0XHRcdFx0bmV3X3AgPSBQT1NUQUcuRF9QO1xuXHRcdFx0XHRcdFx0dzEucCA9IG5ld19wO1xuXG5cdFx0XHRcdFx0XHRib29sID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSBpZiAodzEudyA9PSAn5LmIJylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICghdzIgfHwgdzIucCAmIFBPU1RBRy5EX1cpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dzEub3cgPSB3MS53O1xuXHRcdFx0XHRcdFx0dzEudyA9ICfpurwnO1xuXG5cdFx0XHRcdFx0XHRib29sID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKHcxX2xlbiA+IDEpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh3MS53Lm1hdGNoKC9eKC4rKVvlj5HnmbxdJC8pKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGMgPSBSZWdFeHAuJDE7XG5cblx0XHRcdFx0XHRpZiAoQ09MT1JfSEFJUltjXSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgbncgPSBjICsgJ+mrric7XG5cblx0XHRcdFx0XHRcdG53ID0gdGhpcy5fZ2V0U3lub255bSh3MS53LCBudyk7XG5cblx0XHRcdFx0XHRcdGlmIChudyAhPSB3MS53KVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR3MS5vdyA9IHcxLnc7XG5cdFx0XHRcdFx0XHRcdHcxLncgPSBudztcblxuXHRcdFx0XHRcdFx0XHRib29sID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHR3MS53ID09PSAoYyArICflj5EnKVxuXHRcdFx0XHRcdFx0JiYgKHcxLnAgJiBQT1NUQUcuRF9NUSlcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8g44CA5LiA5Y+R44CB5YWp5Y+R44CB5LiJ5Y+R44CB5Zub5Y+R44CB5LqU5Y+R44CB5YWt5Y+R4oCU4oCUXG5cblx0XHRcdFx0XHRcdGxldCBudyA9IGMgKyAn55m8JztcblxuXHRcdFx0XHRcdFx0dzEub3cgPSB3MS53O1xuXHRcdFx0XHRcdFx0dzEudyA9IG53O1xuXG5cdFx0XHRcdFx0XHRib29sID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHQvLyDkuI3kv67mraPnuYHpq5TnmoQg55m8XG5cdFx0XHRcdFx0XHR3MS53ID09PSAoYyArICflj5EnKVxuXHRcdFx0XHRcdFx0JiYgKFxuXHRcdFx0XHRcdFx0XHQhdzBcblx0XHRcdFx0XHRcdFx0fHwgKFxuXHRcdFx0XHRcdFx0XHRcdHcwICYmIChcblx0XHRcdFx0XHRcdFx0XHRcdHcwLnAgPT09IFBPU1RBRy5EX1dcblx0XHRcdFx0XHRcdFx0XHRcdC8vfHwgQ09MT1JfSEFJUlt3MC53XVxuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgbncgPSBjICsgJ+mrric7XG5cblx0XHRcdFx0XHRcdGxldCBvdzogSVdvcmQgPSBUQUJMRVtud107XG5cblx0XHRcdFx0XHRcdGlmIChvdyAmJiBvdy5zKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR3MS5vdyA9IHcxLnc7XG5cdFx0XHRcdFx0XHRcdHcxLncgPSBudztcblxuXHRcdFx0XHRcdFx0XHRuZXdfcCA9IG93LnA7XG5cblx0XHRcdFx0XHRcdFx0Ym9vbCA9IHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYgKGhleEFuZEFueSh3MS5wLFxuXHRcdFx0XHRcdFBPU1RBRy5EX01RLFxuXHRcdFx0XHQpICYmIC9eKC4rKeS9mSQvLnRlc3QodzEudykpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgbncgPSBSZWdFeHAuJDEgKyAn6aSYJztcblxuXHRcdFx0XHRcdHcxLm93ID0gdzEudztcblx0XHRcdFx0XHR3MS53ID0gbnc7XG5cblx0XHRcdFx0XHRib29sID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyDlpoLmnpzpoIXnm67ngrog6YeP6K+NXG5cdFx0XHRcdGVsc2UgaWYgKGhleEFuZEFueSh3MS5wLFxuXHRcdFx0XHRcdFBPU1RBRy5BX1EsXG5cdFx0XHRcdFx0UE9TVEFHLkRfTVEsXG5cdFx0XHRcdCkpXG5cdFx0XHRcdHtcblxuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYgKHcxLnAgJiBQT1NUQUcuRF9WICYmIC9e5bmyKC4pJC8udGVzdCh3MS53KSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIEB0b2RvIOmcgOimgeabtOWatOisueeahOWIpOaWt+aWueW8j1xuXHRcdFx0XHRcdCAqL1xuXG5cdFx0XHRcdFx0bGV0IGMgPSBSZWdFeHAuJDE7XG5cdFx0XHRcdFx0bGV0IG53ID0gJ+W5uScgKyBjO1xuXHRcdFx0XHRcdGxldCBvdzogSVdvcmQgPSBUQUJMRVtud107XG5cblx0XHRcdFx0XHRpZiAob3cgJiYgaGV4QW5kQW55KG93LnAsXG5cdFx0XHRcdFx0XHRQT1NUQUcuRF9WLFxuXHRcdFx0XHRcdCkpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHcyICYmIGhleEFuZEFueSh3Mi5wLFxuXHRcdFx0XHRcdFx0XHRQT1NUQUcuRF9SLFxuXHRcdFx0XHRcdFx0KSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dzEub3cgPSB3MS53O1xuXHRcdFx0XHRcdFx0XHR3MS53ID0gbnc7XG5cblx0XHRcdFx0XHRcdFx0Ym9vbCA9IHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIOWmguaenOmgheebrueCuiDpjK/lrZdcblx0XHRcdFx0ZWxzZSBpZiAodzEucCAmIFBPU1RBRy5CQUQpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgbnc6IHN0cmluZztcblxuXHRcdFx0XHRcdG53ID0gdzEud1xuXHRcdFx0XHRcdFx0LnJlcGxhY2UoLyguKemHjHzph4woLikvLCAnJDHoo6EkMicpXG5cdFx0XHRcdFx0XHQucmVwbGFjZSgvKC4p5ZCOfOWQjiguKS8sICckMeW+jCQyJylcblx0XHRcdFx0XHRcdC5yZXBsYWNlKC/olJgoLikvLCAn5Y+DJDEnKVxuXHRcdFx0XHRcdDtcblxuXHRcdFx0XHRcdG53ID0gdGhpcy5fZ2V0U3lub255bSh3MS53LCBudyk7XG5cblx0XHRcdFx0XHQvL2NvbnNvbGUubG9nKHcxLCBudyk7XG5cblx0XHRcdFx0XHRpZiAobncgIT0gdzEudylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR3MS5vdyA9IHcxLnc7XG5cdFx0XHRcdFx0XHR3MS53ID0gbnc7XG5cblx0XHRcdFx0XHRcdGJvb2wgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyDlpoLmnpzpoIXnm67ngrog5pa55L2NXG5cdFx0XHRcdGVsc2UgaWYgKHcxLnAgJiBQT1NUQUcuRF9GKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IG53ID0gdzEud1xuXHRcdFx0XHRcdFx0LnJlcGxhY2UoLyguKemHjHzph4woLikvLCAnJDHoo6EkMicpXG5cdFx0XHRcdFx0XHQucmVwbGFjZSgvKC4p5ZCOfOWQjiguKS8sICckMeW+jCQyJylcblx0XHRcdFx0XHQ7XG5cblx0XHRcdFx0XHRudyA9IHRoaXMuX2dldFN5bm9ueW0odzEudywgbncpO1xuXG5cdFx0XHRcdFx0aWYgKG53ICE9IHcxLncpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dzEub3cgPSB3MS53O1xuXHRcdFx0XHRcdFx0dzEudyA9IG53O1xuXG5cdFx0XHRcdFx0XHRib29sID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8g5aaC5p6c6aCF55uu54K6IOiZleaJgFxuXHRcdFx0XHRlbHNlIGlmICh3MS5wICYgUE9TVEFHLkRfUylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBudyA9IHcxLndcblx0XHRcdFx0XHRcdC5yZXBsYWNlKC8oLinph4wkLywgJyQx6KOhJylcblx0XHRcdFx0XHQ7XG5cblx0XHRcdFx0XHRudyA9IHRoaXMuX2dldFN5bm9ueW0odzEudywgbncpO1xuXG5cdFx0XHRcdFx0aWYgKG53ICE9IHcxLncpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dzEub3cgPSB3MS53O1xuXHRcdFx0XHRcdFx0dzEudyA9IG53O1xuXG5cdFx0XHRcdFx0XHRib29sID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8g5aaC5p6c6aCF55uu54K6IOaXtumXtFxuXHRcdFx0XHRlbHNlIGlmICh3MS5wICYgUE9TVEFHLkRfVCB8fCB3MS5wICYgUE9TVEFHLkRfVilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBudyA9IHcxLndcblx0XHRcdFx0XHRcdC5yZXBsYWNlKC8oLinlkI585ZCOKC4pLywgJyQx5b6MJDInKVxuXHRcdFx0XHRcdDtcblxuXHRcdFx0XHRcdG53ID0gdGhpcy5fZ2V0U3lub255bSh3MS53LCBudyk7XG5cblx0XHRcdFx0XHRpZiAobncgIT0gdzEudylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR3MS5vcCA9IHcxLm9wIHx8IHcxLnA7XG5cdFx0XHRcdFx0XHR3MS5vdyA9IHcxLnc7XG5cblx0XHRcdFx0XHRcdHcxLncgPSBudztcblxuXHRcdFx0XHRcdFx0Ym9vbCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChib29sICYmIHcxLm93ICYmIHcxLm93ICE9IHcxLncpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh3MS53IGluIFRBQkxFKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IG93ID0gVEFCTEVbdzEud107XG5cblx0XHRcdFx0XHRpZiAodHlwZW9mIG5ld19wICE9PSAndW5kZWZpbmVkJylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR3MS5vcCA9IHcxLm9wIHx8IG93LnA7XG5cdFx0XHRcdFx0XHR3MS5wID0gbmV3X3A7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2UgaWYgKG93LnAgIT0gdzEucClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR3MS5vcCA9IHcxLm9wIHx8IHcxLnA7XG5cdFx0XHRcdFx0XHR3MS5wID0gb3cucDtcblxuXHRcdFx0XHRcdFx0Ly9jb25zb2xlLmxvZyhUQUJMRVt3MS53XSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG93LnMgIT09IHcxLnMpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dzEub3MgPSAoJ29zJyBpbiB3MSkgPyB3MS5vcyA6ICh3MS5zIHx8IGZhbHNlKTtcblx0XHRcdFx0XHRcdHcxLnMgPSBvdy5zO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuZGVidWdUb2tlbih3MSwge1xuXHRcdFx0XHRcdFt0aGlzLm5hbWVdOiB0cnVlLFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aSsrO1xuXHRcdH1cblxuXHRcdHJldHVybiB3b3Jkcztcblx0fVxufVxuXG5leHBvcnQgY29uc3QgaW5pdCA9IFpodFN5bm9ueW1PcHRpbWl6ZXIuaW5pdC5iaW5kKFpodFN5bm9ueW1PcHRpbWl6ZXIpIGFzIHR5cGVvZiBaaHRTeW5vbnltT3B0aW1pemVyLmluaXQ7XG5cbmV4cG9ydCBkZWZhdWx0IFpodFN5bm9ueW1PcHRpbWl6ZXI7XG4iXX0= |
\ | No newline at end of file |