UNPKG

53.6 kBJavaScriptView Raw
1"use strict";
2/**
3 * Created by user on 2018/4/16/016.
4 */
5Object.defineProperty(exports, "__esModule", { value: true });
6exports.init = exports.ZhtSynonymOptimizer = void 0;
7const mod_1 = require("../mod");
8const index_1 = require("../util/index");
9const COLORS_1 = require("../mod/COLORS");
10const uni_string_1 = require("uni-string");
11/**
12 * 以詞意來自動轉換 而不需要手動加入字典於 synonym.txt
13 * 適用於比較容易需要人工處理的轉換
14 *
15 * 自動處理 `里|后`
16 *
17 * 建議在字典內追加人名地名等等名字 來增加準確性
18 * 防止轉換錯誤
19 *
20 * @todo 發于余干松冲准呆只范舍涂
21 */
22class 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}
391exports.ZhtSynonymOptimizer = ZhtSynonymOptimizer;
392exports.init = ZhtSynonymOptimizer.init.bind(ZhtSynonymOptimizer);
393exports.default = ZhtSynonymOptimizer;
394//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWmh0U3lub255bU9wdGltaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIlpodFN5bm9ueW1PcHRpbWl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOzs7QUFFSCxnQ0FBeUQ7QUFJekQseUNBQTBDO0FBQzFDLDBDQUFzRDtBQUV0RCwyQ0FBaUM7QUFHakM7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQWEsbUJBQW9CLFNBQVEseUJBQW1CO0lBQTVEOztRQUVDLFNBQUksR0FBRyxxQkFBcUIsQ0FBQztJQW1uQjlCLENBQUM7SUE5bUJBLE1BQU07UUFFTCxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFZixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFFbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFdEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8scURBQXdDLElBQUksRUFBRSxDQUFDO0lBQ3RGLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxDQUFTO1FBRTNCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFDdEI7WUFDQyxPQUFPLElBQUksQ0FBQztTQUNaO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBRVMsV0FBVyxDQUFDLENBQVMsRUFBRSxFQUFVO1FBRTFDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFFOUIsSUFBSSxDQUFDLElBQUksT0FBTyxFQUNoQjtZQUNDLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEI7UUFFRCxJQUFJLEVB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bnRlbnQiOlsiLyoqXG4gKiBDcmVhdGVkIGJ5IHVzZXIgb24gMjAxOC80LzE2LzAxNi5cbiAqL1xuXG5pbXBvcnQgeyBTdWJTTW9kdWxlLCBTdWJTTW9kdWxlT3B0aW1pemVyIH0gZnJvbSAnLi4vbW9kJztcbmltcG9ydCBQT1NUQUcgZnJvbSAnLi4vUE9TVEFHJztcbmltcG9ydCBTZWdtZW50LCB7IElESUNULCBJRElDVF9TWU5PTllNLCBJV29yZCB9IGZyb20gJy4uL1NlZ21lbnQnO1xuaW1wb3J0IHsgSVdvcmREZWJ1ZyB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgaGV4QW5kQW55IH0gZnJvbSAnLi4vdXRpbC9pbmRleCc7XG5pbXBvcnQgeyBDT0xPUl9BTEwsIENPTE9SX0hBSVIgfSBmcm9tICcuLi9tb2QvQ09MT1JTJztcblxuaW1wb3J0IFVTdHJpbmcgZnJvbSAndW5pLXN0cmluZyc7XG5pbXBvcnQgeyBFbnVtRGljdERhdGFiYXNlIH0gZnJvbSAnLi4vY29uc3QnO1xuXG4vKipcbiAqIOS7peipnuaEj+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