-
Notifications
You must be signed in to change notification settings - Fork 4
/
deva.sublime-workspace
682 lines (682 loc) · 89.6 KB
/
deva.sublime-workspace
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
{
"auto_complete":
{
"selected_items":
[
[
"ti",
"timer"
],
[
"c",
"create_cps\tfunction"
]
]
},
"buffers":
[
{
"file": "/Users/spark/pycharmproject/secsay/zhouyi_api.py",
"settings":
{
"buffer_size": 4110,
"encoding": "UTF-8",
"line_ending": "Unix"
},
"undo_stack":
[
]
},
{
"file": "deva/store.py",
"settings":
{
"buffer_size": 5932,
"encoding": "UTF-8",
"line_ending": "Unix"
}
},
{
"file": "deva/utils/sqlitedict.py",
"settings":
{
"buffer_size": 21658,
"line_ending": "Unix"
},
"undo_stack":
[
[
1,
1,
"revert",
null,
"AgAAAAAAAAAAAAAAAAAAAAAAAABtVAAAIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCiMgZnJvbSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCiMKIyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYXBhY2hlMi4wLnBocAojCiMgVGhpcyBjb2RlIHdhcyBpbnNwaXJlZCBieToKIyAgKiBodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy81NzY2MzgtZHJhZnQtZm9yLWFuLXNxbGl0ZTMtYmFzZWQtZGJtLwojICAqIGh0dHA6Ly9jb2RlLmFjdGl2ZXN0YXRlLmNvbS9yZWNpcGVzLzUyNjYxOC8KCiIiIgpBIGxpZ2h0d2VpZ2h0IHdyYXBwZXIgYXJvdW5kIFB5dGhvbidzIHNxbGl0ZTMgZGF0YWJhc2UsIHdpdGggYSBkaWN0LWxpa2UgaW50ZXJmYWNlCmFuZCBtdWx0aS10aHJlYWQgYWNjZXNzIHN1cHBvcnQ6OgoKPj4+IG15ZGljdCA9IFNxbGl0ZURpY3QoJ3NvbWUuZGInLCBhdXRvY29tbWl0PVRydWUpICMgdGhlIG1hcHBpbmcgd2lsbCBiZSBwZXJzaXN0ZWQgdG8gZmlsZSBgc29tZS5kYmAKPj4+IG15ZGljdFsnc29tZV9rZXknXSA9IGFueV9waWNrbGFibGVfb2JqZWN0Cj4+PiBwcmludCBteWRpY3RbJ3NvbWVfa2V5J10KPj4+IHByaW50IGxlbihteWRpY3QpICMgZXRjLi4uIGFsbCBkaWN0IGZ1bmN0aW9ucyB3b3JrCgpQaWNrbGUgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIHNlcmlhbGl6ZSB0aGUgdmFsdWVzLiBLZXlzIGFyZSBzdHJpbmdzLgoKSWYgeW91IGRvbid0IHVzZSBhdXRvY29tbWl0IChkZWZhdWx0IGlzIG5vIGF1dG9jb21taXQgZm9yIHBlcmZvcm1hbmNlKSwgdGhlbgpkb24ndCBmb3JnZXQgdG8gY2FsbCBgbXlkaWN0LmNvbW1pdCgpYCB3aGVuIGRvbmUgd2l0aCBhIHRyYW5zYWN0aW9uLgoKIiIiCgppbXBvcnQgc3FsaXRlMwppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHJhbmRvbQppbXBvcnQgbG9nZ2luZwppbXBvcnQgdHJhY2ViYWNrCmltcG9ydCBkaWxsCgpmcm9tIHRocmVhZGluZyBpbXBvcnQgVGhyZWFkCgp0cnk6CiAgICBfX3ZlcnNpb25fXyA9IF9faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMnKS5nZXRfZGlzdHJpYnV0aW9uKCdzcWxpdGVkaWN0JykudmVyc2lvbgpleGNlcHQ6CiAgICBfX3ZlcnNpb25fXyA9ICc/JwoKbWFqb3JfdmVyc2lvbiA9IHN5cy52ZXJzaW9uX2luZm9bMF0KaWYgbWFqb3JfdmVyc2lvbiA8IDM6ICAjIHB5IDw9IDIueAogICAgaWYgc3lzLnZlcnNpb25faW5mb1sxXSA8IDU6ICAjIHB5IDw9IDIuNAogICAgICAgIHJhaXNlIEltcG9ydEVycm9yKAogICAgICAgICAgICAic3FsaXRlZGljdCByZXF1aXJlcyBweXRob24gMi41IG9yIGhpZ2hlciAocHl0aG9uIDMuMyBvciBoaWdoZXIgc3VwcG9ydGVkKSIpCgogICAgIyBuZWNlc3NhcnkgdG8gdXNlIGV4ZWMoKV8gYXMgdGhpcyB3b3VsZCBiZSBhIFN5bnRheEVycm9yIGluIHB5dGhvbjMuCiAgICAjIHRoaXMgaXMgYW4gZXhhY3QgcG9ydCBvZiBzaXgucmVyYWlzZSgpOgogICAgZGVmIGV4ZWNfKF9jb2RlXywgX2dsb2JzXz1Ob25lLCBfbG9jc189Tm9uZSk6CiAgICAgICAgIiIiRXhlY3V0ZSBjb2RlIGluIGEgbmFtZXNwYWNlLiIiIgogICAgICAgIGlmIF9nbG9ic18gaXMgTm9uZToKICAgICAgICAgICAgZnJhbWUgPSBzeXMuX2dldGZyYW1lKDEpCiAgICAgICAgICAgIF9nbG9ic18gPSBmcmFtZS5mX2dsb2JhbHMKICAgICAgICAgICAgaWYgX2xvY3NfIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBfbG9jc18gPSBmcmFtZS5mX2xvY2FscwogICAgICAgICAgICBkZWwgZnJhbWUKICAgICAgICBlbGlmIF9sb2NzXyBpcyBOb25lOgogICAgICAgICAgICBfbG9jc18gPSBfZ2xvYnNfCiAgICAgICAgZXhlYygiIiJleGVjIF9jb2RlXyBpbiBfZ2xvYnNfLCBfbG9jc18iIiIpCgogICAgZXhlY18oImRlZiByZXJhaXNlKHRwLCB2YWx1ZSwgdGI9Tm9uZSk6XG4iCiAgICAgICAgICAiICAgIHJhaXNlIHRwLCB2YWx1ZSwgdGJcbiIpCmVsc2U6CiAgICBkZWYgcmVyYWlzZSh0cCwgdmFsdWUsIHRiPU5vbmUpOgogICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgIHZhbHVlID0gdHAoKQogICAgICAgIGlmIHZhbHVlLl9fdHJhY2ViYWNrX18gaXMgbm90IHRiOgogICAgICAgICAgICByYWlzZSB2YWx1ZS53aXRoX3RyYWNlYmFjayh0YikKICAgICAgICByYWlzZSB2YWx1ZQoKdHJ5OgogICAgZnJvbSBjUGlja2xlIGltcG9ydCBkdW1wcywgbG9hZHMsIEhJR0hFU1RfUFJPVE9DT0wgYXMgUElDS0xFX1BST1RPQ09MCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gcGlja2xlIGltcG9ydCBkdW1wcywgbG9hZHMsIEhJR0hFU1RfUFJPVE9DT0wgYXMgUElDS0xFX1BST1RPQ09MCgojIHNvbWUgUHl0aG9uIDMgdnMgMiBpbXBvcnRzCnRyeToKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IFVzZXJEaWN0IGFzIERpY3RDbGFzcwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIFVzZXJEaWN0IGltcG9ydCBEaWN0TWl4aW4gYXMgRGljdENsYXNzCgp0cnk6CiAgICBmcm9tIHF1ZXVlIGltcG9ydCBRdWV1ZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIFF1ZXVlIGltcG9ydCBRdWV1ZQoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmRlZiBvcGVuKCphcmdzLCAqKmt3YXJncyk6CiAgICAiIiJTZWUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgU3FsaXRlRGljdCBjbGFzcy4iIiIKICAgIHJldHVybiBTcWxpdGVEaWN0KCphcmdzLCAqKmt3YXJncykKCgpkZWYgZW5jb2RlKG9iaik6CiAgICAiIiJTZXJpYWxpemUgYW4gb2JqZWN0IHVzaW5nIHBpY2tsZSB0byBhIGJpbmFyeSBmb3JtYXQgYWNjZXB0ZWQgYnkgU1FMaXRlLiIiIgogICAgdHJ5OgogICAgICAgIHJldHVybiBkaWxsLmR1bXBzKG9iaikKICAgIGV4Y2VwdDoKICAgICAgICByZXR1cm4gc3FsaXRlMy5CaW5hcnkoZHVtcHMob2JqLCBwcm90b2NvbD1QSUNLTEVfUFJPVE9DT0wpKQoKCmRlZiBkZWNvZGUob2JqKToKICAgICIiIkRlc2VyaWFsaXplIG9iamVjdHMgcmV0cmlldmVkIGZyb20gU1FMaXRlLiIiIgogICAgdHJ5OgogICAgICAgIHJldHVybiBkaWxsLmxvYWRzKG9iaikKICAgIGV4Y2VwdDoKICAgICAgICByZXR1cm4gbG9hZHMoYnl0ZXMob2JqKSkKCgpjbGFzcyBTcWxpdGVEaWN0KERpY3RDbGFzcyk6CiAgICBWQUxJRF9GTEFHUyA9IFsnYycsICdyJywgJ3cnLCAnbiddCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lPU5vbmUsIHRhYmxlbmFtZT0ndW5uYW1lZCcsIGZsYWc9J2MnLAogICAgICAgICAgICAgICAgIGF1dG9jb21taXQ9RmFsc2UsIGpvdXJuYWxfbW9kZT0iREVMRVRFIiwgZW5jb2RlPWVuY29kZSwgZGVjb2RlPWRlY29kZSk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGl6ZSBhIHRocmVhZC1zYWZlIHNxbGl0ZS1iYWNrZWQgZGljdGlvbmFyeS4gVGhlIGRpY3Rpb25hcnkgd2lsbAogICAgICAgIGJlIGEgdGFibGUgYHRhYmxlbmFtZWAgaW4gZGF0YWJhc2UgZmlsZSBgZmlsZW5hbWVgLiBBIHNpbmdsZSBmaWxlICg9ZGF0YWJhc2UpCiAgICAgICAgbWF5IGNvbnRhaW4gbXVsdGlwbGUgdGFibGVzLgoKICAgICAgICBJZiBubyBgZmlsZW5hbWVgIGlzIGdpdmVuLCBhIHJhbmRvbSBmaWxlIGluIHRlbXAgd2lsbCBiZSB1c2VkIChhbmQgZGVsZXRlZAogICAgICAgIGZyb20gdGVtcCBvbmNlIHRoZSBkaWN0IGlzIGNsb3NlZC9kZWxldGVkKS4KCiAgICAgICAgSWYgeW91IGVuYWJsZSBgYXV0b2NvbW1pdGAsIGNoYW5nZXMgd2lsbCBiZSBjb21taXR0ZWQgYWZ0ZXIgZWFjaCBvcGVyYXRpb24KICAgICAgICAobW9yZSBpbmVmZmljaWVudCBidXQgc2FmZXIpLiBPdGhlcndpc2UsIGNoYW5nZXMgYXJlIGNvbW1pdHRlZCBvbiBgc2VsZi5jb21taXQoKWAsCiAgICAgICAgYHNlbGYuY2xlYXIoKWAgYW5kIGBzZWxmLmNsb3NlKClgLgoKICAgICAgICBTZXQgYGpvdXJuYWxfbW9kZWAgdG8gJ09GRicgaWYgeW91J3JlIGV4cGVyaWVuY2luZyBzcWxpdGUgSS9PIHByb2JsZW1zCiAgICAgICAgb3IgaWYgeW91IG5lZWQgcGVyZm9ybWFuY2UgYW5kIGRvbid0IGNhcmUgYWJvdXQgY3Jhc2gtY29uc2lzdGVuY3kuCgogICAgICAgIFRoZSBgZmxhZ2AgcGFyYW1ldGVyLiBFeGFjdGx5IG9uZSBvZjoKICAgICAgICAgICdjJzogZGVmYXVsdCBtb2RlLCBvcGVuIGZvciByZWFkL3dyaXRlLCBjcmVhdGluZyB0aGUgZGIvdGFibGUgaWYgbmVjZXNzYXJ5LgogICAgICAgICAgJ3cnOiBvcGVuIGZvciByL3csIGJ1dCBkcm9wIGB0YWJsZW5hbWVgIGNvbnRlbnRzIGZpcnN0IChzdGFydCB3aXRoIGVtcHR5IHRhYmxlKQogICAgICAgICAgJ3InOiBvcGVuIGFzIHJlYWQtb25seQogICAgICAgICAgJ24nOiBjcmVhdGUgYSBuZXcgZGF0YWJhc2UgKGVyYXNpbmcgYW55IGV4aXN0aW5nIHRhYmxlcywgbm90IGp1c3QgYHRhYmxlbmFtZWAhKS4KCiAgICAgICAgVGhlIGBlbmNvZGVgIGFuZCBgZGVjb2RlYCBwYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIGN1c3RvbWl6ZSBob3cgdGhlIHZhbHVlcwogICAgICAgIGFyZSBzZXJpYWxpemVkIGFuZCBkZXNlcmlhbGl6ZWQuCiAgICAgICAgVGhlIGBlbmNvZGVgIHBhcmFtZXRlciBtdXN0IGJlIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHNpbmdsZSBQeXRob24KICAgICAgICBvYmplY3QgYW5kIHJldHVybnMgYSBzZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uLgogICAgICAgIFRoZSBgZGVjb2RlYCBmdW5jdGlvbiBtdXN0IGJlIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgc2VyaWFsaXplZAogICAgICAgIHJlcHJlc2VudGF0aW9uIHByb2R1Y2VkIGJ5IGBlbmNvZGVgIGFuZCByZXR1cm5zIGEgZGVzZXJpYWxpemVkIFB5dGhvbgogICAgICAgIG9iamVjdC4KICAgICAgICBUaGUgZGVmYXVsdCBpcyB0byB1c2UgcGlja2xlLgoKICAgICAgICAiIiIKICAgICAgICBzZWxmLmluX3RlbXAgPSBmaWxlbmFtZSBpcyBOb25lCiAgICAgICAgaWYgc2VsZi5pbl90ZW1wOgogICAgICAgICAgICByYW5kcGFydCA9IGhleChyYW5kb20ucmFuZGludCgwLCAweGZmZmZmZikpWzI6XQogICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbih0ZW1wZmlsZS5nZXR0ZW1wZGlyKCksICdzcWxkaWN0JyArIHJhbmRwYXJ0KQoKICAgICAgICBpZiBmbGFnIG5vdCBpbiBTcWxpdGVEaWN0LlZBTElEX0ZMQUdTOgogICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlVucmVjb2duaXplZCBmbGFnOiAlcyIgJSBmbGFnKQogICAgICAgIHNlbGYuZmxhZyA9IGZsYWcKCiAgICAgICAgaWYgZmxhZyA9PSAnbic6CiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKICAgICAgICAgICAgICAgIG9zLnJlbW92ZShmaWxlbmFtZSkKCiAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShmaWxlbmFtZSkKICAgICAgICBpZiBkaXJuYW1lOgogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZGlybmFtZSk6CiAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJ0Vycm9yISBUaGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LCAlcycgJSBkaXJuYW1lKQoKICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKICAgICAgICBpZiAnIicgaW4gdGFibGVuYW1lOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdJbnZhbGlkIHRhYmxlbmFtZSAlcicgJSB0YWJsZW5hbWUpCiAgICAgICAgc2VsZi50YWJsZW5hbWUgPSB0YWJsZW5hbWUKICAgICAgICBzZWxmLmF1dG9jb21taXQgPSBhdXRvY29tbWl0CiAgICAgICAgc2VsZi5qb3VybmFsX21vZGUgPSBqb3VybmFsX21vZGUKICAgICAgICBzZWxmLmVuY29kZSA9IGVuY29kZQogICAgICAgIHNlbGYuZGVjb2RlID0gZGVjb2RlCgogICAgICAgIGxvZ2dlci5pbmZvKCJvcGVuaW5nIFNxbGl0ZSB0YWJsZSAlciBpbiAlcyIgJSAodGFibGVuYW1lLCBmaWxlbmFtZSkpCiAgICAgICAgTUFLRV9UQUJMRSA9ICdDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAiJXMiIChrZXkgVEVYVCBQUklNQVJZIEtFWSwgdmFsdWUgQkxPQiknICUgc2VsZi50YWJsZW5hbWUKICAgICAgICBzZWxmLmNvbm4gPSBzZWxmLl9uZXdfY29ubigpCiAgICAgICAgc2VsZi5jb25uLmV4ZWN1dGUoTUFLRV9UQUJMRSkKICAgICAgICBzZWxmLmNvbm4uY29tbWl0KCkKICAgICAgICBpZiBmbGFnID09ICd3JzoKICAgICAgICAgICAgc2VsZi5jbGVhcigpCgogICAgZGVmIF9uZXdfY29ubihzZWxmKToKICAgICAgICByZXR1cm4gU3FsaXRlTXVsdGl0aHJlYWQoc2VsZi5maWxlbmFtZSwgYXV0b2NvbW1pdD1zZWxmLmF1dG9jb21taXQsIGpvdXJuYWxfbW9kZT1zZWxmLmpvdXJuYWxfbW9kZSkKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICdjb25uJykgb3Igc2VsZi5jb25uIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuY29ubiA9IHNlbGYuX25ld19jb25uKCkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqZXhjX2luZm8pOgogICAgICAgIHNlbGYuY2xvc2UoKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiU3FsaXRlRGljdCglcykiICUgKHNlbGYuZmlsZW5hbWUpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikgICMgbm8gbmVlZCBvZiBzb21ldGhpbmcgY29tcGxleAoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgICMgYHNlbGVjdCBjb3VudCAoKilgIGlzIHN1cGVyIHNsb3cgaW4gc3FsaXRlIChkb2VzIGEgbGluZWFyIHNjYW4hISkKICAgICAgICAjIEFzIGEgcmVzdWx0LCBsZW4oKSBpcyB2ZXJ5IHNsb3cgdG9vIG9uY2UgdGhlIHRhYmxlIHNpemUgZ3Jvd3MgYmV5b25kIHRyaXZpYWwuCiAgICAgICAgIyBXZSBjb3VsZCBrZWVwIHRoZSB0b3RhbCBjb3VudCBvZiByb3dzIG91cnNlbHZlcywgYnkgbWVhbnMgb2YgdHJpZ2dlcnMsCiAgICAgICAgIyBidXQgdGhhdCBzZWVtcyB0b28gY29tcGxpY2F0ZWQgYW5kIHdvdWxkIHNsb3cgZG93biBub3JtYWwgb3BlcmF0aW9uCiAgICAgICAgIyAoaW5zZXJ0L2RlbGV0ZSBldGMpLgogICAgICAgIEdFVF9MRU4gPSAnU0VMRUNUIENPVU5UKCopIEZST00gIiVzIicgJSBzZWxmLnRhYmxlbmFtZQogICAgICAgIHJvd3MgPSBzZWxmLmNvbm4uc2VsZWN0X29uZShHRVRfTEVOKVswXQogICAgICAgIHJldHVybiByb3dzIGlmIHJvd3MgaXMgbm90IE5vbmUgZWxzZSAwCgogICAgZGVmIF9fYm9vbF9fKHNlbGYpOgogICAgICAgICMgTm8gZWxlbWVudHMgaXMgRmFsc2UsIG90aGVyd2lzZSBUcnVlCiAgICAgICAgR0VUX01BWCA9ICdTRUxFQ1QgTUFYKFJPV0lEKSBGUk9NICIlcyInICUgc2VsZi50YWJsZW5hbWUKICAgICAgICBtID0gc2VsZi5jb25uLnNlbGVjdF9vbmUoR0VUX01BWClbMF0KICAgICAgICAjIEV4cGxpY2l0IGJldHRlciB0aGFuIGltcGxpY2l0IGFuZCBibGEgYmxhCiAgICAgICAgcmV0dXJuIFRydWUgaWYgbSBpcyBub3QgTm9uZSBlbHNlIEZhbHNlCgogICAgZGVmIGdldHJvd2lkKHNlbGYsIGtleSk6CiAgICAgICAgR0VUX0lURU0gPSAnU0VMRUNUIHJvd2lkIEZST00gIiVzIiBXSEVSRSBrZXkgPSA/JyAlIHNlbGYudGFibGVuYW1lCiAgICAgICAgaXRlbSA9IHNlbGYuY29ubi5zZWxlY3Rfb25lKEdFVF9JVEVNLCAoa2V5LCkpCiAgICAgICAgaWYgaXRlbSBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcihrZXkpCiAgICAgICAgcmV0dXJuIGl0ZW1bMF0KCiAgICBkZWYgaXRlcmtleXMoc2VsZik6CiAgICAgICAgR0VUX0tFWVMgPSAnU0VMRUNUIGtleSBGUk9NICIlcyIgT1JERVIgQlkgcm93aWQnICUgc2VsZi50YWJsZW5hbWUKICAgICAgICBmb3Iga2V5IGluIHNlbGYuY29ubi5zZWxlY3QoR0VUX0tFWVMpOgogICAgICAgICAgICB5aWVsZCBrZXlbMF0KCiAgICBkZWYgaXRlcnZhbHVlcyhzZWxmKToKICAgICAgICBHRVRfVkFMVUVTID0gJ1NFTEVDVCB2YWx1ZSBGUk9NICIlcyIgT1JERVIgQlkgcm93aWQnICUgc2VsZi50YWJsZW5hbWUKICAgICAgICBmb3IgdmFsdWUgaW4gc2VsZi5jb25uLnNlbGVjdChHRVRfVkFMVUVTKToKICAgICAgICAgICAgeWllbGQgc2VsZi5kZWNvZGUodmFsdWVbMF0pCgogICAgZGVmIGl0ZXJpdGVtcyhzZWxmKToKICAgICAgICBHRVRfSVRFTVMgPSAnU0VMRUNUIGtleSwgdmFsdWUgRlJPTSAiJXMiIE9SREVSIEJZIHJvd2lkJyAlIHNlbGYudGFibGVuYW1lCiAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5jb25uLnNlbGVjdChHRVRfSVRFTVMpOgogICAgICAgICAgICB5aWVsZCBrZXksIHNlbGYuZGVjb2RlKHZhbHVlKQoKICAgIGRlZiBrZXlzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLml0ZXJrZXlzKCkgaWYgbWFqb3JfdmVyc2lvbiA+IDIgZWxzZSBsaXN0KHNlbGYuaXRlcmtleXMoKSkKCiAgICBkZWYgdmFsdWVzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLml0ZXJ2YWx1ZXMoKSBpZiBtYWpvcl92ZXJzaW9uID4gMiBlbHNlIGxpc3Qoc2VsZi5pdGVydmFsdWVzKCkpCgogICAgZGVmIGl0ZW1zKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLml0ZXJpdGVtcygpIGlmIG1ham9yX3ZlcnNpb24gPiAyIGVsc2UgbGlzdChzZWxmLml0ZXJpdGVtcygpKQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKICAgICAgICBIQVNfSVRFTSA9ICdTRUxFQ1QgMSBGUk9NICIlcyIgV0hFUkUga2V5ID0gPycgJSBzZWxmLnRhYmxlbmFtZQogICAgICAgIHJldHVybiBzZWxmLmNvbm4uc2VsZWN0X29uZShIQVNfSVRFTSwgKGtleSwpKSBpcyBub3QgTm9uZQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIEdFVF9JVEVNID0gJ1NFTEVDVCB2YWx1ZSBGUk9NICIlcyIgV0hFUkUga2V5ID0gPycgJSBzZWxmLnRhYmxlbmFtZQogICAgICAgIGl0ZW0gPSBzZWxmLmNvbm4uc2VsZWN0X29uZShHRVRfSVRFTSwgKGtleSwpKQogICAgICAgIGlmIGl0ZW0gaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3Ioa2V5KQogICAgICAgIHJldHVybiBzZWxmLmRlY29kZShpdGVtWzBdKQoKICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICBpZiBzZWxmLmZsYWcgPT0gJ3InOgogICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ1JlZnVzaW5nIHRvIHdyaXRlIHRvIHJlYWQtb25seSBTcWxpdGVEaWN0JykKCiAgICAgICAgQUREX0lURU0gPSAnUkVQTEFDRSBJTlRPICIlcyIgKGtleSwgdmFsdWUpIFZBTFVFUyAoPyw/KScgJSBzZWxmLnRhYmxlbmFtZQogICAgICAgIHJldHVybiBzZWxmLmNvbm4uZXhlY3V0ZShBRERfSVRFTSwgKGtleSwgc2VsZi5lbmNvZGUodmFsdWUpKSkKCiAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKICAgICAgICBpZiBzZWxmLmZsYWcgPT0gJ3InOgogICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ1JlZnVzaW5nIHRvIGRlbGV0ZSBmcm9tIHJlYWQtb25seSBTcWxpdGVEaWN0JykKCiAgICAgICAgaWYga2V5IG5vdCBpbiBzZWxmOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcihrZXkpCiAgICAgICAgREVMX0lURU0gPSAnREVMRVRFIEZST00gIiVzIiBXSEVSRSBrZXkgPSA/JyAlIHNlbGYudGFibGVuYW1lCiAgICAgICAgc2VsZi5jb25uLmV4ZWN1dGUoREVMX0lURU0sIChrZXksKSkKCiAgICBkZWYgdXBkYXRlKHNlbGYsIGl0ZW1zPSgpLCAqKmt3ZHMpOgogICAgICAgIGlmIHNlbGYuZmxhZyA9PSAncic6CiAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignUmVmdXNpbmcgdG8gdXBkYXRlIHJlYWQtb25seSBTcWxpdGVEaWN0JykKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLml0ZW1zKCkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBpdGVtcyA9IFsoaywgc2VsZi5lbmNvZGUodikpIGZvciBrLCB2IGluIGl0ZW1zXQoKICAgICAgICBVUERBVEVfSVRFTVMgPSAnUkVQTEFDRSBJTlRPICIlcyIgKGtleSwgdmFsdWUpIFZBTFVFUyAoPywgPyknICUgc2VsZi50YWJsZW5hbWUKICAgICAgICBzZWxmLmNvbm4uZXhlY3V0ZW1hbnkoVVBEQVRFX0lURU1TLCBpdGVtcykKICAgICAgICBpZiBrd2RzOgogICAgICAgICAgICBzZWxmLnVwZGF0ZShrd2RzKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5pdGVya2V5cygpCgogICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZmxhZyA9PSAncic6CiAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignUmVmdXNpbmcgdG8gY2xlYXIgcmVhZC1vbmx5IFNxbGl0ZURpY3QnKQoKICAgICAgICAjIGF2b2lkIFZBQ1VVTSwgYXMgaXQgZ2l2ZXMgIk9wZXJhdGlvbmFsRXJyb3I6IGRhdGFiYXNlIHNjaGVtYSBoYXMgY2hhbmdlZCIKICAgICAgICBDTEVBUl9BTEwgPSAnREVMRVRFIEZST00gIiVzIjsnICUgc2VsZi50YWJsZW5hbWUKICAgICAgICBzZWxmLmNvbm4uY29tbWl0KCkKICAgICAgICBzZWxmLmNvbm4uZXhlY3V0ZShDTEVBUl9BTEwpCiAgICAgICAgc2VsZi5jb25uLmNvbW1pdCgpCgogICAgZGVmIGRyb3Aoc2VsZik6CiAgICAgICAgaWYgc2VsZi5mbGFnID09ICdyJzoKICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdSZWZ1c2luZyB0byBkcm9wIHJlYWQtb25seSBTcWxpdGVEaWN0JykKCiAgICAgICAgIyBhdm9pZCBWQUNVVU0sIGFzIGl0IGdpdmVzICJPcGVyYXRpb25hbEVycm9yOiBkYXRhYmFzZSBzY2hlbWEgaGFzIGNoYW5nZWQiCiAgICAgICAgRFJPUF9UQUJMRSA9ICdEUk9QIFRBQkxFICIlcyI7JyAlIHNlbGYudGFibGVuYW1lCiAgICAgICAgc2VsZi5jb25uLmNvbW1pdCgpCiAgICAgICAgc2VsZi5jb25uLmV4ZWN1dGUoRFJPUF9UQUJMRSkKICAgICAgICBzZWxmLmNvbm4uY29tbWl0KCkKCiAgICAjIEBzdGF0aWNtZXRob2QKICAgIEBwcm9wZXJ0eQogICAgZGVmIHRhYmxlcyhzZWxmLCk6CiAgICAgICAgIiIiZ2V0IHRoZSBuYW1lcyBvZiB0aGUgdGFibGVzIGluIGFuIHNxbGl0ZSBkYiBhcyBhIGxpc3QiIiIKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoc2VsZi5maWxlbmFtZSk6CiAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ2ZpbGUgJXMgZG9lcyBub3QgZXhpc3QnICUgKHNlbGYuZmlsZW5hbWUpKQogICAgICAgIEdFVF9UQUJMRU5BTUVTID0gJ1NFTEVDVCBuYW1lIEZST00gc3FsaXRlX21hc3RlciBXSEVSRSB0eXBlPSJ0YWJsZSInCiAgICAgICAgd2l0aCBzcWxpdGUzLmNvbm5lY3Qoc2VsZi5maWxlbmFtZSkgYXMgY29ubjoKICAgICAgICAgICAgY3Vyc29yID0gY29ubi5leGVjdXRlKEdFVF9UQUJMRU5BTUVTKQogICAgICAgICAgICByZXMgPSBjdXJzb3IuZmV0Y2hhbGwoKQoKICAgICAgICByZXR1cm4gW25hbWVbMF0gZm9yIG5hbWUgaW4gcmVzXQoKICAgIGRlZiBjb21taXQoc2VsZiwgYmxvY2tpbmc9VHJ1ZSk6CiAgICAgICAgIiIiCiAgICAgICAgUGVyc2lzdCBhbGwgZGF0YSB0byBkaXNrLgoKICAgICAgICBXaGVuIGBibG9ja2luZ2AgaXMgRmFsc2UsIHRoZSBjb21taXQgY29tbWFuZCBpcyBxdWV1ZWQsIGJ1dCB0aGUgZGF0YSBpcwogICAgICAgIG5vdCBndWFyYW50ZWVkIHBlcnNpc3RlZCAoZGVmYXVsdCBpbXBsaWNhdGlvbiB3aGVuIGF1dG9jb21taXQ9VHJ1ZSkuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jb25uIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmNvbm4uY29tbWl0KGJsb2NraW5nKQoKICAgIHN5bmMgPSBjb21taXQKCiAgICBkZWYgY2xvc2Uoc2VsZiwgZG9fbG9nPVRydWUsIGZvcmNlPUZhbHNlKToKICAgICAgICBpZiBkb19sb2c6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiY2xvc2luZyAlcyIgJSBzZWxmKQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ2Nvbm4nKSBhbmQgc2VsZi5jb25uIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBzZWxmLmNvbm4uYXV0b2NvbW1pdCBhbmQgbm90IGZvcmNlOgogICAgICAgICAgICAgICAgIyB0eXBpY2FsbHkgY2FsbHMgdG8gY29tbWl0IGFyZSBub24tYmxvY2tpbmcgd2hlbiBhdXRvY29tbWl0IGlzCiAgICAgICAgICAgICAgICAjIHVzZWQuICBIb3dldmVyLCB3ZSBuZWVkIHRvIGJsb2NrIG9uIGNsb3NlKCkgdG8gZW5zdXJlIGFueQogICAgICAgICAgICAgICAgIyBhd2FpdGluZyBleGNlcHRpb25zIGFyZSBoYW5kbGVkIGFuZCB0aGF0IGFsbCBkYXRhIGlzCiAgICAgICAgICAgICAgICAjIHBlcnNpc3RlZCB0byBkaXNrIGJlZm9yZSByZXR1cm5pbmcuCiAgICAgICAgICAgICAgICBzZWxmLmNvbm4uY29tbWl0KGJsb2NraW5nPVRydWUpCiAgICAgICAgICAgIHNlbGYuY29ubi5jbG9zZShmb3JjZT1mb3JjZSkKICAgICAgICAgICAgc2VsZi5jb25uID0gTm9uZQogICAgICAgIGlmIHNlbGYuaW5fdGVtcDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3MucmVtb3ZlKHNlbGYuZmlsZW5hbWUpCiAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgdGVybWluYXRlKHNlbGYpOgogICAgICAgICIiIkRlbGV0ZSB0aGUgdW5kZXJseWluZyBkYXRhYmFzZSBmaWxlLiBVc2Ugd2l0aCBjYXJlLiIiIgogICAgICAgIGlmIHNlbGYuZmxhZyA9PSAncic6CiAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignUmVmdXNpbmcgdG8gdGVybWluYXRlIHJlYWQtb25seSBTcWxpdGVEaWN0JykKCiAgICAgICAgc2VsZi5jbG9zZSgpCgogICAgICAgIGlmIHNlbGYuZmlsZW5hbWUgPT0gJzptZW1vcnk6JzoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGxvZ2dlci5pbmZvKCJkZWxldGluZyAlcyIgJSBzZWxmLmZpbGVuYW1lKQogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoc2VsZi5maWxlbmFtZSk6CiAgICAgICAgICAgICAgICBvcy5yZW1vdmUoc2VsZi5maWxlbmFtZSkKICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCJmYWlsZWQgdG8gZGVsZXRlICVzIiAlIChzZWxmLmZpbGVuYW1lKSkKCiAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAjIGxpa2UgY2xvc2UoKSwgYnV0IGFzc3VtZSBnbG9iYWxzIGFyZSBnb25lIGJ5IG5vdyAoZG8gbm90IGxvZyEpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmNsb3NlKGRvX2xvZz1GYWxzZSwgZm9yY2U9VHJ1ZSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAjIHByZXZlbnQgZXJyb3IgbG9nIGZsb29kIGluIGNhc2Ugb2YgbXVsdGlwbGUgU3FsaXRlRGljdHMKICAgICAgICAgICAgIyBjbG9zZWQgYWZ0ZXIgY29ubmVjdGlvbiBsb3N0IChleGNlcHRpb25zIGFyZSBhbHdheXMgaWdub3JlZAogICAgICAgICAgICAjIGluIF9fZGVsX18gbWV0aG9kLgogICAgICAgICAgICBwYXNzCgoKIyBBZGRpbmcgZXh0cmEgbWV0aG9kcyBmb3IgcHl0aG9uIDIgY29tcGF0aWJpbGl0eSAoYXQgaW1wb3J0IHRpbWUpCmlmIG1ham9yX3ZlcnNpb24gPT0gMjoKICAgIFNxbGl0ZURpY3QuX19ub256ZXJvX18gPSBTcWxpdGVEaWN0Ll9fYm9vbF9fCiAgICBkZWwgU3FsaXRlRGljdC5fX2Jvb2xfXyAgIyBub3QgbmVlZGVkIGFuZCBjb25mdXNpbmcKIyBlbmRjbGFzcyBTcWxpdGVEaWN0CgoKY2xhc3MgU3FsaXRlTXVsdGl0aHJlYWQoVGhyZWFkKToKICAgICIiIgogICAgV3JhcCBzcWxpdGUgY29ubmVjdGlvbiBpbiBhIHdheSB0aGF0IGFsbG93cyBjb25jdXJyZW50IHJlcXVlc3RzIGZyb20gbXVsdGlwbGUgdGhyZWFkcy4KCiAgICBUaGlzIGlzIGRvbmUgYnkgaW50ZXJuYWxseSBxdWV1ZWluZyB0aGUgcmVxdWVzdHMgYW5kIHByb2Nlc3NpbmcgdGhlbSBzZXF1ZW50aWFsbHkKICAgIGluIGEgc2VwYXJhdGUgdGhyZWFkIChpbiB0aGUgc2FtZSBvcmRlciB0aGV5IGFycml2ZWQpLgoKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgYXV0b2NvbW1pdCwgam91cm5hbF9tb2RlKToKICAgICAgICBzdXBlcihTcWxpdGVNdWx0aXRocmVhZCwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQogICAgICAgIHNlbGYuYXV0b2NvbW1pdCA9IGF1dG9jb21taXQKICAgICAgICBzZWxmLmpvdXJuYWxfbW9kZSA9IGpvdXJuYWxfbW9kZQogICAgICAgICMgdXNlIHJlcXVlc3QgcXVldWUgb2YgdW5saW1pdGVkIHNpemUKICAgICAgICBzZWxmLnJlcXMgPSBRdWV1ZSgpCiAgICAgICAgc2VsZi5zZXREYWVtb24oVHJ1ZSkgICMgcHl0aG9uMi41LWNvbXBhdGlibGUKICAgICAgICBzZWxmLmV4Y2VwdGlvbiA9IE5vbmUKICAgICAgICBzZWxmLmxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdzcWxpdGVkaWN0LlNxbGl0ZU11bHRpdGhyZWFkJykKICAgICAgICBzZWxmLnN0YXJ0KCkKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIGlmIHNlbGYuYXV0b2NvbW1pdDoKICAgICAgICAgICAgY29ubiA9IHNxbGl0ZTMuY29ubmVjdCgKICAgICAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUsIGlzb2xhdGlvbl9sZXZlbD1Ob25lLCBjaGVja19zYW1lX3RocmVhZD1GYWxzZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb25uID0gc3FsaXRlMy5jb25uZWN0KHNlbGYuZmlsZW5hbWUsIGNoZWNrX3NhbWVfdGhyZWFkPUZhbHNlKQogICAgICAgIGNvbm4uZXhlY3V0ZSgnUFJBR01BIGpvdXJuYWxfbW9kZSA9ICVzJyAlIHNlbGYuam91cm5hbF9tb2RlKQogICAgICAgIGNvbm4udGV4dF9mYWN0b3J5ID0gc3RyCiAgICAgICAgY3Vyc29yID0gY29ubi5jdXJzb3IoKQogICAgICAgIGNvbm4uY29tbWl0KCkKICAgICAgICBjdXJzb3IuZXhlY3V0ZSgnUFJBR01BIHN5bmNocm9ub3VzPU9GRicpCgogICAgICAgIHJlcyA9IE5vbmUKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICByZXEsIGFyZywgcmVzLCBvdXRlcl9zdGFjayA9IHNlbGYucmVxcy5nZXQoKQogICAgICAgICAgICBpZiByZXEgPT0gJy0tY2xvc2UtLSc6CiAgICAgICAgICAgICAgICBhc3NlcnQgcmVzLCAoJy0tY2xvc2UtLSB3aXRob3V0IHJldHVybiBxdWV1ZScsIHJlcykKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgcmVxID09ICctLWNvbW1pdC0tJzoKICAgICAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKICAgICAgICAgICAgICAgIGlmIHJlczoKICAgICAgICAgICAgICAgICAgICByZXMucHV0KCctLW5vIG1vcmUtLScpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmV4ZWN1dGUocmVxLCBhcmcpCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGVycjoKICAgICAgICAgICAgICAgICAgICBzZWxmLmV4Y2VwdGlvbiA9IChlX3R5cGUsIGVfdmFsdWUsIGVfdGIpID0gc3lzLmV4Y19pbmZvKCkKICAgICAgICAgICAgICAgICAgICBpbm5lcl9zdGFjayA9IHRyYWNlYmFjay5leHRyYWN0X3N0YWNrKCkKCiAgICAgICAgICAgICAgICAgICAgIyBBbiBleGNlcHRpb24gb2NjdXJyZWQgaW4gb3VyIHRocmVhZCwgYnV0IHdlIG1heSBub3QKICAgICAgICAgICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGFibGUgdG8gdGhyb3cgaXQgaW4gb3VyIGNhbGxpbmcgdGhyZWFkLCBpZiBpdCBoYXMKICAgICAgICAgICAgICAgICAgICAjIG5vIHJldHVybiBgcmVzYCBxdWV1ZTogbG9nIGFzIGxldmVsIEVSUk9SIGJvdGggdGhlIGlubmVyIGFuZAogICAgICAgICAgICAgICAgICAgICMgb3V0ZXIgZXhjZXB0aW9uIGltbWVkaWF0ZWx5LgogICAgICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgICAgICAjIEFueSBpdGVyYXRpb24gb2YgcmVzLmdldCgpIG9yIGFueSBuZXh0IGNhbGwgd2lsbCBkZXRlY3QgdGhlCiAgICAgICAgICAgICAgICAgICAgIyBpbm5lciBleGNlcHRpb24gYW5kIHJlLXJhaXNlIGl0IGluIHRoZSBjYWxsaW5nIFRocmVhZDsgdGhvdWdoCiAgICAgICAgICAgICAgICAgICAgIyBpdCBtYXkgYmUgY29uZnVzaW5nIHRvIHNlZSBhbiBleGNlcHRpb24gZm9yIGFuIHVucmVsYXRlZAogICAgICAgICAgICAgICAgICAgICMgc3RhdGVtZW50LCBhbiBFUlJPUiBsb2cgc3RhdGVtZW50IGZyb20gdGhlICdzcWxpdGVkaWN0LionCiAgICAgICAgICAgICAgICAgICAgIyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIG9yaWdpbmFsIG91dGVyIHN0YWNrIGxvY2F0aW9uLgogICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCdJbm5lciBleGNlcHRpb246JykKICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiB0cmFjZWJhY2suZm9ybWF0X2xpc3QoaW5uZXJfc3RhY2spOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcihpdGVtKQogICAgICAgICAgICAgICAgICAgICMgZGVsaW5pYXRlIHRyYWNlYmFjayAmIGV4Y2VwdGlvbiB3L2JsYW5rIGxpbmUKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcignJykKICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiB0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KGVfdHlwZSwgZV92YWx1ZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKGl0ZW0pCgogICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCcnKSAgIyBleGNlcHRpb24gJiBvdXRlciBzdGFjayB3L2JsYW5rIGxpbmUKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcignT3V0ZXIgc3RhY2s6JykKICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiB0cmFjZWJhY2suZm9ybWF0X2xpc3Qob3V0ZXJfc3RhY2spOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcihpdGVtKQogICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCdFeGNlcHRpb24gd2lsbCBiZSByZS1yYWlzZWQgYXQgbmV4dCBjYWxsLicpCgogICAgICAgICAgICAgICAgaWYgcmVzOgogICAgICAgICAgICAgICAgICAgIGZvciByZWMgaW4gY3Vyc29yOgogICAgICAgICAgICAgICAgICAgICAgICByZXMucHV0KHJlYykKICAgICAgICAgICAgICAgICAgICByZXMucHV0KCctLW5vIG1vcmUtLScpCgogICAgICAgICAgICAgICAgaWYgc2VsZi5hdXRvY29tbWl0OgogICAgICAgICAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICAgICAgc2VsZi5sb2cuZGVidWcoJ3JlY2VpdmVkOiAlcywgc2VuZDogLS1ubyBtb3JlLS0nLCByZXEpCiAgICAgICAgY29ubi5jbG9zZSgpCiAgICAgICAgcmVzLnB1dCgnLS1ubyBtb3JlLS0nKQoKICAgIGRlZiBjaGVja19yYWlzZV9lcnJvcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDaGVjayBmb3IgYW5kIHJhaXNlIGV4Y2VwdGlvbiBmb3IgYW55IHByZXZpb3VzIHNxbGl0ZSBxdWVyeS4KCiAgICAgICAgRm9yIHRoZSBgZXhlY3V0ZSpgIGZhbWlseSBvZiBtZXRob2QgY2FsbHMsIHN1Y2ggY2FsbHMgYXJlIG5vbi1ibG9ja2luZyBhbmQgYW55CiAgICAgICAgZXhjZXB0aW9uIHJhaXNlZCBpbiB0aGUgdGhyZWFkIGNhbm5vdCBiZSBoYW5kbGVkIGJ5IHRoZSBjYWxsaW5nIFRocmVhZCAodXN1YWxseQogICAgICAgIE1haW5UaHJlYWQpLiAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGBjbG9zZWAsIGFuZCBwcmlvciB0byBhbnkgc3Vic2VxdWVudAogICAgICAgIGNhbGxzIHRvIHRoZSBgZXhlY3V0ZSpgIG1ldGhvZHMgdG8gY2hlY2sgZm9yIGFuZCByYWlzZSBhbiBleGNlcHRpb24gaW4gYQogICAgICAgIHByZXZpb3VzIGNhbGwgdG8gdGhlIE1haW5UaHJlYWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5leGNlcHRpb246CiAgICAgICAgICAgIGVfdHlwZSwgZV92YWx1ZSwgZV90YiA9IHNlbGYuZXhjZXB0aW9uCgogICAgICAgICAgICAjIGNsZWFyIHNlbGYuZXhjZXB0aW9uLCBpZiB0aGUgY2FsbGVyIGRlY2lkZXMgdG8gaGFuZGxlIHN1Y2gKICAgICAgICAgICAgIyBleGNlcHRpb24sIHdlIHNob3VsZCBub3QgcmVwZWF0ZWRseSByZS1yYWlzZSBpdC4KICAgICAgICAgICAgc2VsZi5leGNlcHRpb24gPSBOb25lCgogICAgICAgICAgICBzZWxmLmxvZy5lcnJvcignQW4gZXhjZXB0aW9uIG9jY3VycmVkIGZyb20gYSBwcmV2aW91cyBzdGF0ZW1lbnQsIHZpZXcgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAndGhlIGxvZ2dpbmcgbmFtZXNwYWNlICJzcWxpdGVkaWN0IiBmb3Igb3V0ZXIgc3RhY2suJykKCiAgICAgICAgICAgICMgVGhlIHRoaXJkIGFyZ3VtZW50IHRvIHJhaXNlIGlzIHRoZSB0cmFjZWJhY2sgb2JqZWN0LCBhbmQgaXQgaXMKICAgICAgICAgICAgIyBzdWJzdGl0dXRlZCBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGFzIHRoZSBwbGFjZSB3aGVyZQogICAgICAgICAgICAjIHRoZSBleGNlcHRpb24gb2NjdXJyZWQsIHRoaXMgaXMgc28gdGhhdCB3aGVuIHVzaW5nIGRlYnVnZ2VycyBzdWNoCiAgICAgICAgICAgICMgYXMgYHBkYicsIG9yIHNpbXBseSBldmFsdWF0aW5nIHRoZSBuYXR1cmFsbHkgcmFpc2VkIHRyYWNlYmFjaywgd2UKICAgICAgICAgICAgIyByZXRhaW4gdGhlIG9yaWdpbmFsIChpbm5lcikgbG9jYXRpb24gb2Ygd2hlcmUgdGhlIGV4Y2VwdGlvbgogICAgICAgICAgICAjIG9jY3VycmVkLgogICAgICAgICAgICByZXJhaXNlKGVfdHlwZSwgZV92YWx1ZSwgZV90YikKCiAgICBkZWYgZXhlY3V0ZShzZWxmLCByZXEsIGFyZz1Ob25lLCByZXM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgYGV4ZWN1dGVgIGNhbGxzIGFyZSBub24tYmxvY2tpbmc6IGp1c3QgcXVldWUgdXAgdGhlIHJlcXVlc3QgYW5kIHJldHVybiBpbW1lZGlhdGVseS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmNoZWNrX3JhaXNlX2Vycm9yKCkKCiAgICAgICAgIyBOT1RFOiBUaGlzIG1pZ2h0IGJlIGEgbG90IG9mIGluZm9ybWF0aW9uIHRvIHB1bXAgaW50byBhbiBpbnB1dAogICAgICAgICMgcXVldWUsIGFmZmVjdGluZyBwZXJmb3JtYW5jZS4gIEkndmUgYWxzbyBzZWVuIGVhcmxpZXIgdmVyc2lvbnMgb2YKICAgICAgICAjIGp5dGhvbiB0YWtlIGEgc2V2ZXJlIHBlcmZvcm1hbmNlIGltcGFjdCBmb3IgdGhyb3dpbmcgZXhjZXB0aW9ucwogICAgICAgICMgc28gb2Z0ZW4uCiAgICAgICAgc3RhY2sgPSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjaygpWzotMV0KICAgICAgICBzZWxmLnJlcXMucHV0KChyZXEsIGFyZyBvciB0dXBsZSgpLCByZXMsIHN0YWNrKSkKCiAgICBkZWYgZXhlY3V0ZW1hbnkoc2VsZiwgcmVxLCBpdGVtcyk6CiAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CiAgICAgICAgICAgIHNlbGYuZXhlY3V0ZShyZXEsIGl0ZW0pCiAgICAgICAgc2VsZi5jaGVja19yYWlzZV9lcnJvcigpCgogICAgZGVmIHNlbGVjdChzZWxmLCByZXEsIGFyZz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBVbmxpa2Ugc3FsaXRlJ3MgbmF0aXZlIHNlbGVjdCwgdGhpcyBzZWxlY3QgZG9lc24ndCBoYW5kbGUgaXRlcmF0aW9uIGVmZmljaWVudGx5LgoKICAgICAgICBUaGUgcmVzdWx0IG9mIGBzZWxlY3RgIHN0YXJ0cyBmaWxsaW5nIHVwIHdpdGggdmFsdWVzIGFzIHNvb24gYXMgdGhlCiAgICAgICAgcmVxdWVzdCBpcyBkZXF1ZXVlZCwgYW5kIGFsdGhvdWdoIHlvdSBjYW4gaXRlcmF0ZSBvdmVyIHRoZSByZXN1bHQgbm9ybWFsbHkKICAgICAgICAoYGZvciByZXMgaW4gc2VsZi5zZWxlY3QoKTogLi4uYCksIHRoZSBlbnRpcmUgcmVzdWx0IHdpbGwgYmUgaW4gbWVtb3J5LgogICAgICAgICIiIgogICAgICAgIHJlcyA9IFF1ZXVlKCkgICMgcmVzdWx0cyBvZiB0aGUgc2VsZWN0IHdpbGwgYXBwZWFyIGFzIGl0ZW1zIGluIHRoaXMgcXVldWUKICAgICAgICBzZWxmLmV4ZWN1dGUocmVxLCBhcmcsIHJlcykKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICByZWMgPSByZXMuZ2V0KCkKICAgICAgICAgICAgc2VsZi5jaGVja19yYWlzZV9lcnJvcigpCiAgICAgICAgICAgIGlmIHJlYyA9PSAnLS1ubyBtb3JlLS0nOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgeWllbGQgcmVjCgogICAgZGVmIHNlbGVjdF9vbmUoc2VsZiwgcmVxLCBhcmc9Tm9uZSk6CiAgICAgICAgIiIiUmV0dXJuIG9ubHkgdGhlIGZpcnN0IHJvdyBvZiB0aGUgU0VMRUNULCBvciBOb25lIGlmIHRoZXJlIGFyZSBubyBtYXRjaGluZyByb3dzLiIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIG5leHQoaXRlcihzZWxmLnNlbGVjdChyZXEsIGFyZykpKQogICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBjb21taXQoc2VsZiwgYmxvY2tpbmc9VHJ1ZSk6CiAgICAgICAgaWYgYmxvY2tpbmc6CiAgICAgICAgICAgICMgYnkgZGVmYXVsdCwgd2UgYXdhaXQgY29tcGxldGlvbiBvZiBjb21taXQoKSB1bmxlc3MKICAgICAgICAgICAgIyBibG9ja2luZz1GYWxzZS4gIFRoaXMgZW5zdXJlcyBhbnkgYXZhaWxhYmxlIGV4Y2VwdGlvbnMgZm9yIGFueQogICAgICAgICAgICAjIHByZXZpb3VzIHN0YXRlbWVudCBhcmUgdGhyb3duIGJlZm9yZSByZXR1cm5pbmcsIGFuZCB0aGF0IHRoZQogICAgICAgICAgICAjIGRhdGEgaGFzIGFjdHVhbGx5IHBlcnNpc3RlZCB0byBkaXNrIQogICAgICAgICAgICBzZWxmLnNlbGVjdF9vbmUoJy0tY29tbWl0LS0nKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgb3RoZXJ3aXNlLCB3ZSBmaXJlIGFuZCBmb3JnZXQgYXMgdXN1YWwuCiAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSgnLS1jb21taXQtLScpCgogICAgZGVmIGNsb3NlKHNlbGYsIGZvcmNlPUZhbHNlKToKICAgICAgICBpZiBmb3JjZToKICAgICAgICAgICAgIyBJZiBhIFNxbGl0ZURpY3QgaXMgYmVpbmcga2lsbGVkIG9yIGdhcmJhZ2UtY29sbGVjdGVkLCB0aGVuIHNlbGVjdF9vbmUoKQogICAgICAgICAgICAjIGNvdWxkIGhhbmcgZm9yZXZlciBiZWNhdXNlIHJ1bigpIG1pZ2h0IGFscmVhZHkgaGF2ZSBleGl0ZWQgYW5kIHRoZXJlZm9yZQogICAgICAgICAgICAjIGNhbid0IHByb2Nlc3MgdGhlIHJlcXVlc3QuIEluc3RlYWQsIHB1c2ggdGhlIGNsb3NlIGNvbW1hbmQgdG8gdGhlIHJlcXVlc3RzCiAgICAgICAgICAgICMgcXVldWUgZGlyZWN0bHkuIElmIHJ1bigpIGlzIHN0aWxsIGFsaXZlLCBpdCB3aWxsIGV4aXQgZ3JhY2VmdWxseS4gSWYgbm90LAogICAgICAgICAgICAjIHRoZW4gdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyBhbnl3YXkuCiAgICAgICAgICAgIHNlbGYucmVxcy5wdXQoKCctLWNsb3NlLS0nLCBOb25lLCBRdWV1ZSgpLCBOb25lKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIHdlIGFidXNlICdzZWxlY3QnIHRvICJpdGVyIiBvdmVyIGEgIi0tY2xvc2UtLSIgc3RhdGVtZW50IHNvIHRoYXQgd2UKICAgICAgICAgICAgIyBjYW4gY29uZmlybSB0aGUgY29tcGxldGlvbiBvZiBjbG9zZSBiZWZvcmUgam9pbmluZyB0aGUgdGhyZWFkIGFuZAogICAgICAgICAgICAjIHJldHVybmluZyAoYnkgc2VtYXBob3JlICctLW5vIG1vcmUtLScKICAgICAgICAgICAgc2VsZi5zZWxlY3Rfb25lKCctLWNsb3NlLS0nKQogICAgICAgICAgICBzZWxmLmpvaW4oKQojIGVuZGNsYXNzIFNxbGl0ZU11bHRpdGhyZWFkCgAAAAAAAAAAtzYAAAAAAAAAAAAA",
"AQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/"
],
[
2,
1,
"revert",
null,
"AgAAAAAAAAAAAAAAAAAAAAAAAAC9OgAAIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCiMgZnJvbSB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCiMKIyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYXBhY2hlMi4wLnBocAojCiMgVGhpcyBjb2RlIHdhcyBpbnNwaXJlZCBieToKIyAgKiBodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy81NzY2MzgtZHJhZnQtZm9yLWFuLXNxbGl0ZTMtYmFzZWQtZGJtLwojICAqIGh0dHA6Ly9jb2RlLmFjdGl2ZXN0YXRlLmNvbS9yZWNpcGVzLzUyNjYxOC8KCiIiIgpBIGxpZ2h0d2VpZ2h0IHdyYXBwZXIgYXJvdW5kIFB5dGhvbidzIHNxbGl0ZTMgZGF0YWJhc2UsIHdpdGggYSBkaWN0LWxpa2UgaW50ZXJmYWNlCmFuZCBtdWx0aS10aHJlYWQgYWNjZXNzIHN1cHBvcnQ6OgoKPj4+IG15ZGljdCA9IFNxbGl0ZURpY3QoJ3NvbWUuZGInLCBhdXRvY29tbWl0PVRydWUpICMgdGhlIG1hcHBpbmcgd2lsbCBiZSBwZXJzaXN0ZWQgdG8gZmlsZSBgc29tZS5kYmAKPj4+IG15ZGljdFsnc29tZV9rZXknXSA9IGFueV9waWNrbGFibGVfb2JqZWN0Cj4+PiBwcmludCBteWRpY3RbJ3NvbWVfa2V5J10KPj4+IHByaW50IGxlbihteWRpY3QpICMgZXRjLi4uIGFsbCBkaWN0IGZ1bmN0aW9ucyB3b3JrCgpQaWNrbGUgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIHNlcmlhbGl6ZSB0aGUgdmFsdWVzLiBLZXlzIGFyZSBzdHJpbmdzLgoKSWYgeW91IGRvbid0IHVzZSBhdXRvY29tbWl0IChkZWZhdWx0IGlzIG5vIGF1dG9jb21taXQgZm9yIHBlcmZvcm1hbmNlKSwgdGhlbgpkb24ndCBmb3JnZXQgdG8gY2FsbCBgbXlkaWN0LmNvbW1pdCgpYCB3aGVuIGRvbmUgd2l0aCBhIHRyYW5zYWN0aW9uLgoKIiIiCgppbXBvcnQgc3FsaXRlMwppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHJhbmRvbQppbXBvcnQgbG9nZ2luZwppbXBvcnQgdHJhY2ViYWNrCmltcG9ydCBkaWxsCgpmcm9tIHRocmVhZGluZyBpbXBvcnQgVGhyZWFkCgp0cnk6CiAgICBfX3ZlcnNpb25fXyA9IF9faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMnKS5nZXRfZGlzdHJpYnV0aW9uKCdzcWxpdGVkaWN0JykudmVyc2lvbgpleGNlcHQ6CiAgICBfX3ZlcnNpb25fXyA9ICc/JwoKbWFqb3JfdmVyc2lvbiA9IHN5cy52ZXJzaW9uX2luZm9bMF0KaWYgbWFqb3JfdmVyc2lvbiA8IDM6ICAjIHB5IDw9IDIueAogICAgaWYgc3lzLnZlcnNpb25faW5mb1sxXSA8IDU6ICAjIHB5IDw9IDIuNAogICAgICAgIHJhaXNlIEltcG9ydEVycm9yKAogICAgICAgICAgICAic3FsaXRlZGljdCByZXF1aXJlcyBweXRob24gMi41IG9yIGhpZ2hlciAocHl0aG9uIDMuMyBvciBoaWdoZXIgc3VwcG9ydGVkKSIpCgogICAgIyBuZWNlc3NhcnkgdG8gdXNlIGV4ZWMoKV8gYXMgdGhpcyB3b3VsZCBiZSBhIFN5bnRheEVycm9yIGluIHB5dGhvbjMuCiAgICAjIHRoaXMgaXMgYW4gZXhhY3QgcG9ydCBvZiBzaXgucmVyYWlzZSgpOgogICAgZGVmIGV4ZWNfKF9jb2RlXywgX2dsb2JzXz1Ob25lLCBfbG9jc189Tm9uZSk6CiAgICAgICAgIiIiRXhlY3V0ZSBjb2RlIGluIGEgbmFtZXNwYWNlLiIiIgogICAgICAgIGlmIF9nbG9ic18gaXMgTm9uZToKICAgICAgICAgICAgZnJhbWUgPSBzeXMuX2dldGZyYW1lKDEpCiAgICAgICAgICAgIF9nbG9ic18gPSBmcmFtZS5mX2dsb2JhbHMKICAgICAgICAgICAgaWYgX2xvY3NfIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBfbG9jc18gPSBmcmFtZS5mX2xvY2FscwogICAgICAgICAgICBkZWwgZnJhbWUKICAgICAgICBlbGlmIF9sb2NzXyBpcyBOb25lOgogICAgICAgICAgICBfbG9jc18gPSBfZ2xvYnNfCiAgICAgICAgZXhlYygiIiJleGVjIF9jb2RlXyBpbiBfZ2xvYnNfLCBfbG9jc18iIiIpCgogICAgZXhlY18oImRlZiByZXJhaXNlKHRwLCB2YWx1ZSwgdGI9Tm9uZSk6XG4iCiAgICAgICAgICAiICAgIHJhaXNlIHRwLCB2YWx1ZSwgdGJcbiIpCmVsc2U6CiAgICBkZWYgcmVyYWlzZSh0cCwgdmFsdWUsIHRiPU5vbmUpOgogICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgIHZhbHVlID0gdHAoKQogICAgICAgIGlmIHZhbHVlLl9fdHJhY2ViYWNrX18gaXMgbm90IHRiOgogICAgICAgICAgICByYWlzZSB2YWx1ZS53aXRoX3RyYWNlYmFjayh0YikKICAgICAgICByYWlzZSB2YWx1ZQoKdHJ5OgogICAgZnJvbSBjUGlja2xlIGltcG9ydCBkdW1wcywgbG9hZHMsIEhJR0hFU1RfUFJPVE9DT0wgYXMgUElDS0xFX1BST1RPQ09MICMgdHlwZTogaWdub3JlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gcGlja2xlIGltcG9ydCBkdW1wcywgbG9hZHMsIEhJR0hFU1RfUFJPVE9DT0wgYXMgUElDS0xFX1BST1RPQ09MCgojIHNvbWUgUHl0aG9uIDMgdnMgMiBpbXBvcnRzCnRyeToKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IFVzZXJEaWN0IGFzIERpY3RDbGFzcwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIFVzZXJEaWN0IGltcG9ydCBEaWN0TWl4aW4gYXMgRGljdENsYXNzICMgdHlwZTogaWdub3JlCgp0cnk6CiAgICBmcm9tIHF1ZXVlIGltcG9ydCBRdWV1ZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIFF1ZXVlIGltcG9ydCBRdWV1ZSAjIHR5cGU6IGlnbm9yZQoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmRlZiBvcGVuKCphcmdzLCAqKmt3YXJncyk6CiAgICAiIiJTZWUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgU3FsaXRlRGljdCBjbGFzcy4iIiIKICAgIHJldHVybiBTcWxpdGVEaWN0KCphcmdzLCAqKmt3YXJncykKCgpkZWYgZW5jb2RlKG9iaik6CiAgICAiIiJTZXJpYWxpemUgYW4gb2JqZWN0IHVzaW5nIHBpY2tsZSB0byBhIGJpbmFyeSBmb3JtYXQgYWNjZXB0ZWQgYnkgU1FMaXRlLiIiIgogICAgdHJ5OgogICAgICAgIHJldHVybiBkaWxsLmR1bXBzKG9iaikKICAgIGV4Y2VwdDoKICAgICAgICByZXR1cm4gc3FsaXRlMy5CaW5hcnkoZHVtcHMob2JqLCBwcm90b2NvbD1QSUNLTEVfUFJPVE9DT0wpKQoKCmRlZiBkZWNvZGUob2JqKToKICAgICIiIkRlc2VyaWFsaXplIG9iamVjdHMgcmV0cmlldmVkIGZyb20gU1FMaXRlLiIiIgogICAgdHJ5OgogICAgICAgIHJldHVybiBkaWxsLmxvYWRzKG9iaikKICAgIGV4Y2VwdDoKICAgICAgICByZXR1cm4gbG9hZHMoYnl0ZXMob2JqKSkKCgpjbGFzcyBTcWxpdGVEaWN0KERpY3RDbGFzcyk6CiAgICAiIiLln7rkuo5TUUxpdGXnmoTlrZflhbjnsbvlrp7njrAuCgogICAg5o+Q5L6b5LiA5Liq57q/56iL5a6J5YWo55qE44CB5oyB5LmF5YyW55qE5a2X5YW45a2Y5YKoLOaUr+aMgeaJgOacieagh+WHhuWtl+WFuOaTjeS9nOOAggogICAg5pWw5o2u5a2Y5YKo5ZyoU1FMaXRl5pWw5o2u5bqT5Lit55qE5LiA5Liq6KGo6YeMLOaUr+aMgeWkmuihqOWFseeUqOS4gOS4quaVsOaNruW6k+aWh+S7tuOAggoKICAgIOS4u+imgeeJueaApzoKICAgIDEuIOe6v+eoi+WuieWFqAogICAgMi4g5pWw5o2u5oyB5LmF5YyWCiAgICAzLiDmlK/mjIHoh6rliqjmj5DkuqQKICAgIDQuIOaUr+aMgeiHquWumuS5ieW6j+WIl+WMluaWueW8jwogICAgNS4g5pSv5oyB5Li05pe25paH5Lu25a2Y5YKoCgogICAg5Z+65pys55So5L6LOgogICAgLS0tLS0tLS0tCiAgICAjIOWIm+W7uuWtl+WFuOW5tuWGmeWFpeaVsOaNrgogICAgPj4+IGQgPSBTcWxpdGVEaWN0KCcuL2RiLnNxbGl0ZScsIHRhYmxlbmFtZT0ndGFibGUxJywgYXV0b2NvbW1pdD1UcnVlKQogICAgPj4+IGRbJ2tleSddID0gJ3ZhbHVlJyAgIyDoh6rliqjkv53lrZjliLDmlbDmja7lupMKICAgID4+PiBwcmludChkWydrZXknXSkKICAgICd2YWx1ZScKCiAgICAjIOS9v+eUqHdpdGjor63lj6Xoh6rliqjlhbPpl60KICAgID4+PiB3aXRoIFNxbGl0ZURpY3QoJy4vZGIuc3FsaXRlJykgYXMgZDoKICAgIC4uLiAgICAgZFsna2V5J10gPSAndmFsdWUnCiAgICAuLi4gICAgIGQuY29tbWl0KCkgICMg5omL5Yqo5o+Q5LqkCgogICAgIyDlpJrooajmk43kvZwKICAgID4+PiBkMSA9IFNxbGl0ZURpY3QoJy4vZGIuc3FsaXRlJywgdGFibGVuYW1lPSd0YWJsZTEnKQogICAgPj4+IGQyID0gU3FsaXRlRGljdCgnLi9kYi5zcWxpdGUnLCB0YWJsZW5hbWU9J3RhYmxlMicpCgogICAgIyDlj6ror7vmqKHlvI8KICAgID4+PiBkID0gU3FsaXRlRGljdCgnLi9kYi5zcWxpdGUnLCBmbGFnPSdyJykKCiAgICDlj4LmlbDor7TmmI46CiAgICAtLS0tLS0tLS0KICAgIGZpbGVuYW1lIDogc3RyLCDlj6/pgIkKICAgICAgICBTUUxpdGXmlbDmja7lupPmlofku7bot6/lvoQsTm9uZeWImeS9v+eUqOS4tOaXtuaWh+S7tgogICAgdGFibGVuYW1lIDogc3RyLCDpu5jorqQndW5uYW1lZCcKICAgICAgICDooajlkI0KICAgIGZsYWcgOiBzdHIsIOm7mOiupCdjJwogICAgICAgIOaJk+W8gOaooeW8jzoKICAgICAgICAnYyc6IOm7mOiupOaooeW8jyzlj6/or7vlhpks5LiN5a2Y5Zyo5YiZ5Yib5bu6CiAgICAgICAgJ3cnOiDlj6/or7vlhpks5YWI5riF56m66KGoCiAgICAgICAgJ3InOiDlj6ror7vmqKHlvI8KICAgICAgICAnbic6IOWIm+W7uuaWsOaVsOaNruW6kyzliKDpmaTlt7LlrZjlnKjnmoQKICAgIGF1dG9jb21taXQgOiBib29sLCDpu5jorqRGYWxzZQogICAgICAgIOaYr+WQpuiHquWKqOaPkOS6pOS/ruaUuQogICAgam91cm5hbF9tb2RlIDogc3RyLCDpu5jorqQiREVMRVRFIiAKICAgICAgICBTUUxpdGXml6Xlv5fmqKHlvI8KICAgIGVuY29kZSA6IGNhbGxhYmxlLCDlj6/pgIkKICAgICAgICDoh6rlrprkuYnluo/liJfljJblh73mlbAKICAgIGRlY29kZSA6IGNhbGxhYmxlLCDlj6/pgIkKICAgICAgICDoh6rlrprkuYnlj43luo/liJfljJblh73mlbAKICAgICIiIgoKICAgIFZBTElEX0ZMQUdTID0gWydjJywgJ3InLCAndycsICduJ10KCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWU9Tm9uZSwgdGFibGVuYW1lPSd1bm5hbWVkJywgZmxhZz0nYycsCiAgICAgICAgICAgICAgICAgYXV0b2NvbW1pdD1GYWxzZSwgam91cm5hbF9tb2RlPSJERUxFVEUiLCBlbmNvZGU9ZW5jb2RlLCBkZWNvZGU9ZGVjb2RlKToKICAgICAgICAiIiLliJ3lp4vljJZTcWxpdGVEaWN05a6e5L6LLiIiIgogICAgICAgIHNlbGYuaW5fdGVtcCA9IGZpbGVuYW1lIGlzIE5vbmUKICAgICAgICBpZiBzZWxmLmluX3RlbXA6CiAgICAgICAgICAgIHJhbmRwYXJ0ID0gaGV4KHJhbmRvbS5yYW5kaW50KDAsIDB4ZmZmZmZmKSlbMjpdCiAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKHRlbXBmaWxlLmdldHRlbXBkaXIoKSwgJ3NxbGRpY3QnICsgcmFuZHBhcnQpCgogICAgICAgIGlmIGZsYWcgbm90IGluIFNxbGl0ZURpY3QuVkFMSURfRkxBR1M6CiAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiVW5yZWNvZ25pemVkIGZsYWc6ICVzIiAlIGZsYWcpCiAgICAgICAgc2VsZi5mbGFnID0gZmxhZwoKICAgICAgICBpZiBmbGFnID09ICduJzoKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgogICAgICAgICAgICAgICAgb3MucmVtb3ZlKGZpbGVuYW1lKQoKICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKGZpbGVuYW1lKQogICAgICAgIGlmIGRpcm5hbWU6CiAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhkaXJuYW1lKToKICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKICAgICAgICAgICAgICAgICAgICAnRXJyb3IhIFRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QsICVzJyAlIGRpcm5hbWUpCgogICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQogICAgICAgIGlmICciJyBpbiB0YWJsZW5hbWU6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0ludmFsaWQgdGFibGVuYW1lICVyJyAlIHRhYmxlbmFtZSkKICAgICAgICBzZWxmLnRhYmxlbmFtZSA9IHRhYmxlbmFtZQogICAgICAgIHNlbGYuYXV0b2NvbW1pdCA9IGF1dG9jb21taXQKICAgICAgICBzZWxmLmpvdXJuYWxfbW9kZSA9IGpvdXJuYWxfbW9kZQogICAgICAgIHNlbGYuZW5jb2RlID0gZW5jb2RlCiAgICAgICAgc2VsZi5kZWNvZGUgPSBkZWNvZGUKCiAgICAgICAgbG9nZ2VyLmluZm8oIm9wZW5pbmcgU3FsaXRlIHRhYmxlICVyIGluICVzIiAlICh0YWJsZW5hbWUsIGZpbGVuYW1lKSkKICAgICAgICBNQUtFX1RBQkxFID0gJ0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICIlcyIgKGtleSBURVhUIFBSSU1BUlkgS0VZLCB2YWx1ZSBCTE9CKScgJSBzZWxmLnRhYmxlbmFtZQogICAgICAgIHNlbGYuY29ubiA9IHNlbGYuX25ld19jb25uKCkKICAgICAgICBzZWxmLmNvbm4uZXhlY3V0ZShNQUtFX1RBQkxFKQogICAgICAgIHNlbGYuY29ubi5jb21taXQoKQogICAgICAgIGlmIGZsYWcgPT0gJ3cnOgogICAgICAgICAgICBzZWxmLmNsZWFyKCkKCiMgQWRkaW5nIGV4dHJhIG1ldGhvZHMgZm9yIHB5dGhvbiAyIGNvbXBhdGliaWxpdHkgKGF0IGltcG9ydCB0aW1lKQppZiBtYWpvcl92ZXJzaW9uID09IDI6CiAgICBTcWxpdGVEaWN0Ll9fbm9uemVyb19fID0gU3FsaXRlRGljdC5fX2Jvb2xfXwogICAgZGVsIFNxbGl0ZURpY3QuX19ib29sX18gICMgbm90IG5lZWRlZCBhbmQgY29uZnVzaW5nCiMgZW5kY2xhc3MgU3FsaXRlRGljdAoKCmNsYXNzIFNxbGl0ZU11bHRpdGhyZWFkKFRocmVhZCk6CiAgICAiIiJTUUxpdGXlpJrnur/nqIvljIXoo4XnsbsuCgogICAg6YCa6L+H5YaF6YOo6Zif5YiX5py65Yi2LOWFgeiuuOWkmuS4que6v+eoi+W5tuWPkeiuv+mXrlNRTGl0Zei/nuaOpeOAggogICAg5omA5pyJ6K+35rGC5Lya5oyJ5Yiw6L6+6aG65bqP5Zyo54us56uL57q/56iL5Lit5Liy6KGM5aSE55CG44CCCgogICAg5Y+C5pWwCiAgICAtLS0tLS0tLS0tCiAgICBmaWxlbmFtZSA6IHN0cgogICAgICAgIFNRTGl0ZeaVsOaNruW6k+aWh+S7tui3r+W+hAogICAgYXV0b2NvbW1pdCA6IGJvb2wKICAgICAgICDmmK/lkKboh6rliqjmj5DkuqTkuovliqEKICAgIGpvdXJuYWxfbW9kZSA6IHN0cgogICAgICAgIOaXpeW/l+aooeW8jyzlpoInREVMRVRFJ+aIlidXQUwnCgogICAg56S65L6LCiAgICAtLS0tLS0tLQogICAgPj4+ICMg5Yib5bu65aSa57q/56iL6L+e5o6lCiAgICA+Pj4gZGIgPSBTcWxpdGVNdWx0aXRocmVhZCgndGVzdC5kYicsIGF1dG9jb21taXQ9VHJ1ZSwgam91cm5hbF9tb2RlPSdERUxFVEUnKQogICAgCiAgICA+Pj4gIyDmiafooYzmn6Xor6IKICAgID4+PiBkYi5leGVjdXRlKCdDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyB0ZXN0IChpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpJykKICAgID4+PiBkYi5leGVjdXRlKCdJTlNFUlQgSU5UTyB0ZXN0IFZBTFVFUyAoPywgPyknLCAoMSwgJ3Rlc3QgZGF0YScpKQogICAgCiAgICA+Pj4gIyDmn6Xor6LmlbDmja4KICAgID4+PiBmb3Igcm93IGluIGRiLnNlbGVjdCgnU0VMRUNUICogRlJPTSB0ZXN0Jyk6CiAgICAuLi4gICAgIHByaW50KHJvdykKICAgIAogICAgPj4+ICMg5o+Q5Lqk5LqL5YqhCiAgICA+Pj4gZGIuY29tbWl0KCkKICAgIAogICAgPj4+ICMg5YWz6Zet6L+e5o6lCiAgICA+Pj4gZGIuY2xvc2UoKQoKICAgIOazqOaEj+S6i+mhuQogICAgLS0tLS0tLS0KICAgIDEuIOaJgOacieaVsOaNruW6k+aTjeS9nOmDveWcqOeLrOeri+e6v+eoi+S4reaJp+ihjCzkuLvnur/nqIvkuI3kvJrpmLvloZ4KICAgIDIuIHNlbGVjdCgp5Lya5LiA5qyh5oCn5Yqg6L295omA5pyJ57uT5p6c5Yiw5YaF5a2YLOWkp+e7k+aenOmbhuimgeazqOaEj+WGheWtmOS9v+eUqAogICAgMy4g5byC5bi45Lya5Zyo5LiL5LiA5qyh5pWw5o2u5bqT5pON5L2c5pe25oqb5Ye6CiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGF1dG9jb21taXQsIGpvdXJuYWxfbW9kZSk6CiAgICAgICAgc3VwZXIoU3FsaXRlTXVsdGl0aHJlYWQsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKICAgICAgICBzZWxmLmF1dG9jb21taXQgPSBhdXRvY29tbWl0CiAgICAgICAgc2VsZi5qb3VybmFsX21vZGUgPSBqb3VybmFsX21vZGUKICAgICAgICAjIHVzZSByZXF1ZXN0IHF1ZXVlIG9mIHVubGltaXRlZCBzaXplCiAgICAgICAgc2VsZi5yZXFzID0gUXVldWUoKQogICAgICAgIHNlbGYuc2V0RGFlbW9uKFRydWUpICAjIHB5dGhvbjIuNS1jb21wYXRpYmxlCiAgICAgICAgc2VsZi5leGNlcHRpb24gPSBOb25lCiAgICAgICAgc2VsZi5sb2cgPSBsb2dnaW5nLmdldExvZ2dlcignc3FsaXRlZGljdC5TcWxpdGVNdWx0aXRocmVhZCcpCiAgICAgICAgc2VsZi5zdGFydCgpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBpZiBzZWxmLmF1dG9jb21taXQ6CiAgICAgICAgICAgIGNvbm4gPSBzcWxpdGUzLmNvbm5lY3QoCiAgICAgICAgICAgICAgICBzZWxmLmZpbGVuYW1lLCBpc29sYXRpb25fbGV2ZWw9Tm9uZSwgY2hlY2tfc2FtZV90aHJlYWQ9RmFsc2UpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29ubiA9IHNxbGl0ZTMuY29ubmVjdChzZWxmLmZpbGVuYW1lLCBjaGVja19zYW1lX3RocmVhZD1GYWxzZSkKICAgICAgICBjb25uLmV4ZWN1dGUoJ1BSQUdNQSBqb3VybmFsX21vZGUgPSAlcycgJSBzZWxmLmpvdXJuYWxfbW9kZSkKICAgICAgICBjb25uLnRleHRfZmFjdG9yeSA9IHN0cgogICAgICAgIGN1cnNvciA9IGNvbm4uY3Vyc29yKCkKICAgICAgICBjb25uLmNvbW1pdCgpCiAgICAgICAgY3Vyc29yLmV4ZWN1dGUoJ1BSQUdNQSBzeW5jaHJvbm91cz1PRkYnKQoKICAgICAgICByZXMgPSBOb25lCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgcmVxLCBhcmcsIHJlcywgb3V0ZXJfc3RhY2sgPSBzZWxmLnJlcXMuZ2V0KCkKICAgICAgICAgICAgaWYgcmVxID09ICctLWNsb3NlLS0nOgogICAgICAgICAgICAgICAgYXNzZXJ0IHJlcywgKCctLWNsb3NlLS0gd2l0aG91dCByZXR1cm4gcXVldWUnLCByZXMpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIHJlcSA9PSAnLS1jb21taXQtLSc6CiAgICAgICAgICAgICAgICBjb25uLmNvbW1pdCgpCiAgICAgICAgICAgICAgICBpZiByZXM6CiAgICAgICAgICAgICAgICAgICAgcmVzLnB1dCgnLS1ubyBtb3JlLS0nKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGN1cnNvci5leGVjdXRlKHJlcSwgYXJnKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlcnI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5leGNlcHRpb24gPSAoZV90eXBlLCBlX3ZhbHVlLCBlX3RiKSA9IHN5cy5leGNfaW5mbygpCiAgICAgICAgICAgICAgICAgICAgaW5uZXJfc3RhY2sgPSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjaygpCgogICAgICAgICAgICAgICAgICAgICMgQW4gZXhjZXB0aW9uIG9jY3VycmVkIGluIG91ciB0aHJlYWQsIGJ1dCB3ZSBtYXkgbm90CiAgICAgICAgICAgICAgICAgICAgIyBpbW1lZGlhdGVseSBhYmxlIHRvIHRocm93IGl0IGluIG91ciBjYWxsaW5nIHRocmVhZCwgaWYgaXQgaGFzCiAgICAgICAgICAgICAgICAgICAgIyBubyByZXR1cm4gYHJlc2AgcXVldWU6IGxvZyBhcyBsZXZlbCBFUlJPUiBib3RoIHRoZSBpbm5lciBhbmQKICAgICAgICAgICAgICAgICAgICAjIG91dGVyIGV4Y2VwdGlvbiBpbW1lZGlhdGVseS4KICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICAgICAgIyBBbnkgaXRlcmF0aW9uIG9mIHJlcy5nZXQoKSBvciBhbnkgbmV4dCBjYWxsIHdpbGwgZGV0ZWN0IHRoZQogICAgICAgICAgICAgICAgICAgICMgaW5uZXIgZXhjZXB0aW9uIGFuZCByZS1yYWlzZSBpdCBpbiB0aGUgY2FsbGluZyBUaHJlYWQ7IHRob3VnaAogICAgICAgICAgICAgICAgICAgICMgaXQgbWF5IGJlIGNvbmZ1c2luZyB0byBzZWUgYW4gZXhjZXB0aW9uIGZvciBhbiB1bnJlbGF0ZWQKICAgICAgICAgICAgICAgICAgICAjIHN0YXRlbWVudCwgYW4gRVJST1IgbG9nIHN0YXRlbWVudCBmcm9tIHRoZSAnc3FsaXRlZGljdC4qJwogICAgICAgICAgICAgICAgICAgICMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBvcmlnaW5hbCBvdXRlciBzdGFjayBsb2NhdGlvbi4KICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcignSW5uZXIgZXhjZXB0aW9uOicpCiAgICAgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gdHJhY2ViYWNrLmZvcm1hdF9saXN0KGlubmVyX3N0YWNrKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoaXRlbSkKICAgICAgICAgICAgICAgICAgICAjIGRlbGluaWF0ZSB0cmFjZWJhY2sgJiBleGNlcHRpb24gdy9ibGFuayBsaW5lCiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoJycpCiAgICAgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seShlX3R5cGUsIGVfdmFsdWUpOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcihpdGVtKQoKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcignJykgICMgZXhjZXB0aW9uICYgb3V0ZXIgc3RhY2sgdy9ibGFuayBsaW5lCiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoJ091dGVyIHN0YWNrOicpCiAgICAgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gdHJhY2ViYWNrLmZvcm1hdF9saXN0KG91dGVyX3N0YWNrKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoaXRlbSkKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcignRXhjZXB0aW9uIHdpbGwgYmUgcmUtcmFpc2VkIGF0IG5leHQgY2FsbC4nKQoKICAgICAgICAgICAgICAgIGlmIHJlczoKICAgICAgICAgICAgICAgICAgICBmb3IgcmVjIGluIGN1cnNvcjoKICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnB1dChyZWMpCiAgICAgICAgICAgICAgICAgICAgcmVzLnB1dCgnLS1ubyBtb3JlLS0nKQoKICAgICAgICAgICAgICAgIGlmIHNlbGYuYXV0b2NvbW1pdDoKICAgICAgICAgICAgICAgICAgICBjb25uLmNvbW1pdCgpCgogICAgICAgIHNlbGYubG9nLmRlYnVnKCdyZWNlaXZlZDogJXMsIHNlbmQ6IC0tbm8gbW9yZS0tJywgcmVxKQogICAgICAgIGNvbm4uY2xvc2UoKQogICAgICAgIHJlcy5wdXQoJy0tbm8gbW9yZS0tJykKCiAgICBkZWYgY2hlY2tfcmFpc2VfZXJyb3Ioc2VsZik6CiAgICAgICAgIiIi5qOA5p+l5bm25oqb5Ye65LmL5YmN55qEU1FMaXRl5p+l6K+i5byC5bi4LiIiIgogICAgICAgIGlmIHNlbGYuZXhjZXB0aW9uOgogICAgICAgICAgICBlX3R5cGUsIGVfdmFsdWUsIGVfdGIgPSBzZWxmLmV4Y2VwdGlvbgoKICAgICAgICAgICAgIyBjbGVhciBzZWxmLmV4Y2VwdGlvbiwgaWYgdGhlIGNhbGxlciBkZWNpZGVzIHRvIGhhbmRsZSBzdWNoCiAgICAgICAgICAgICMgZXhjZXB0aW9uLCB3ZSBzaG91bGQgbm90IHJlcGVhdGVkbHkgcmUtcmFpc2UgaXQuCiAgICAgICAgICAgIHNlbGYuZXhjZXB0aW9uID0gTm9uZQoKICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoJ0FuIGV4Y2VwdGlvbiBvY2N1cnJlZCBmcm9tIGEgcHJldmlvdXMgc3RhdGVtZW50LCB2aWV3ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoZSBsb2dnaW5nIG5hbWVzcGFjZSAic3FsaXRlZGljdCIgZm9yIG91dGVyIHN0YWNrLicpCgogICAgICAgICAgICAjIFRoZSB0aGlyZCBhcmd1bWVudCB0byByYWlzZSBpcyB0aGUgdHJhY2ViYWNrIG9iamVjdCwgYW5kIGl0IGlzCiAgICAgICAgICAgICMgc3Vic3RpdHV0ZWQgaW5zdGVhZCBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBhcyB0aGUgcGxhY2Ugd2hlcmUKICAgICAgICAgICAgIyB0aGUgZXhjZXB0aW9uIG9jY3VycmVkLCB0aGlzIGlzIHNvIHRoYXQgd2hlbiB1c2luZyBkZWJ1Z2dlcnMgc3VjaAogICAgICAgICAgICAjIGFzIGBwZGInLCBvciBzaW1wbHkgZXZhbHVhdGluZyB0aGUgbmF0dXJhbGx5IHJhaXNlZCB0cmFjZWJhY2ssIHdlCiAgICAgICAgICAgICMgcmV0YWluIHRoZSBvcmlnaW5hbCAoaW5uZXIpIGxvY2F0aW9uIG9mIHdoZXJlIHRoZSBleGNlcHRpb24KICAgICAgICAgICAgIyBvY2N1cnJlZC4KICAgICAgICAgICAgcmVyYWlzZShlX3R5cGUsIGVfdmFsdWUsIGVfdGIpCgogICAgZGVmIGV4ZWN1dGUoc2VsZiwgcmVxLCBhcmc9Tm9uZSwgcmVzPU5vbmUpOgogICAgICAgICIiIuaJp+ihjFNRTOivreWPpSzpnZ7pmLvloZ7mlrnlvI8uIiIiCiAgICAgICAgc2VsZi5jaGVja19yYWlzZV9lcnJvcigpCgogICAgICAgICMgTk9URTogVGhpcyBtaWdodCBiZSBhIGxvdCBvZiBpbmZvcm1hdGlvbiB0byBwdW1wIGludG8gYW4gaW5wdXQKICAgICAgICAjIHF1ZXVlLCBhZmZlY3RpbmcgcGVyZm9ybWFuY2UuICBJJ3ZlIGFsc28gc2VlbiBlYXJsaWVyIHZlcnNpb25zIG9mCiAgICAgICAgIyBqeXRob24gdGFrZSBhIHNldmVyZSBwZXJmb3JtYW5jZSBpbXBhY3QgZm9yIHRocm93aW5nIGV4Y2VwdGlvbnMKICAgICAgICAjIHNvIG9mdGVuLgogICAgICAgIHN0YWNrID0gdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2soKVs6LTFdCiAgICAgICAgc2VsZi5yZXFzLnB1dCgocmVxLCBhcmcgb3IgdHVwbGUoKSwgcmVzLCBzdGFjaykpCgogICAgZGVmIGV4ZWN1dGVtYW55KHNlbGYsIHJlcSwgaXRlbXMpOgogICAgICAgICIiIuaJuemHj+aJp+ihjFNRTOivreWPpS4iIiIKICAgICAgICBmb3IgaXRlbSBpbiBpdGVtczoKICAgICAgICAgICAgc2VsZi5leGVjdXRlKHJlcSwgaXRlbSkKICAgICAgICBzZWxmLmNoZWNrX3JhaXNlX2Vycm9yKCkKCiAgICBkZWYgc2VsZWN0KHNlbGYsIHJlcSwgYXJnPU5vbmUpOgogICAgICAgICIiIuaJp+ihjFNFTEVDVOafpeivoizov5Tlm57nu5Pmnpzpm4bov63ku6PlmaguCgogICAgICAgIOazqOaEjzrnu5PmnpzkvJrkuIDmrKHmgKfliqDovb3liLDlhoXlrZjkuK3jgIIKICAgICAgICAiIiIKICAgICAgICByZXMgPSBRdWV1ZSgpICAjIHJlc3VsdHMgb2YgdGhlIHNlbGVjdCB3aWxsIGFwcGVhciBhcyBpdGVtcyBpbiB0aGlzIHF1ZXVlCiAgICAgICAgc2VsZi5leGVjdXRlKHJlcSwgYXJnLCByZXMpCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgcmVjID0gcmVzLmdldCgpCiAgICAgICAgICAgIHNlbGYuY2hlY2tfcmFpc2VfZXJyb3IoKQogICAgICAgICAgICBpZiByZWMgPT0gJy0tbm8gbW9yZS0tJzoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHlpZWxkIHJlYwoKICAgIGRlZiBzZWxlY3Rfb25lKHNlbGYsIHJlcSwgYXJnPU5vbmUpOgogICAgICAgICIiIuaJp+ihjFNFTEVDVOafpeivoizlj6rov5Tlm57nrKzkuIDooYznu5Pmnpws5peg57uT5p6c6L+U5ZueTm9uZS4iIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBuZXh0KGl0ZXIoc2VsZi5zZWxlY3QocmVxLCBhcmcpKSkKICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgY29tbWl0KHNlbGYsIGJsb2NraW5nPVRydWUpOgogICAgICAgICIiIuaPkOS6pOS6i+WKoS4KCiAgICAgICAg5Y+C5pWwCiAgICAgICAgLS0tLQogICAgICAgIGJsb2NraW5nIDogYm9vbAogICAgICAgICAgICDmmK/lkKbpmLvloZ7nrYnlvoXmj5DkuqTlrozmiJAKICAgICAgICAiIiIKICAgICAgICBpZiBibG9ja2luZzoKICAgICAgICAgICAgIyBieSBkZWZhdWx0LCB3ZSBhd2FpdCBjb21wbGV0aW9uIG9mIGNvbW1pdCgpIHVubGVzcwogICAgICAgICAgICAjIGJsb2NraW5nPUZhbHNlLiAgVGhpcyBlbnN1cmVzIGFueSBhdmFpbGFibGUgZXhjZXB0aW9ucyBmb3IgYW55CiAgICAgICAgICAgICMgcHJldmlvdXMgc3RhdGVtZW50IGFyZSB0aHJvd24gYmVmb3JlIHJldHVybmluZywgYW5kIHRoYXQgdGhlCiAgICAgICAgICAgICMgZGF0YSBoYXMgYWN0dWFsbHkgcGVyc2lzdGVkIHRvIGRpc2shCiAgICAgICAgICAgIHNlbGYuc2VsZWN0X29uZSgnLS1jb21taXQtLScpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBvdGhlcndpc2UsIHdlIGZpcmUgYW5kIGZvcmdldCBhcyB1c3VhbC4KICAgICAgICAgICAgc2VsZi5leGVjdXRlKCctLWNvbW1pdC0tJykKCiAgICBkZWYgY2xvc2Uoc2VsZiwgZm9yY2U9RmFsc2UpOgogICAgICAgICIiIuWFs+mXreaVsOaNruW6k+i/nuaOpS4KCiAgICAgICAg5Y+C5pWwCiAgICAgICAgLS0tLQogICAgICAgIGZvcmNlIDogYm9vbAogICAgICAgICAgICDmmK/lkKblvLrliLblhbPpl60KICAgICAgICAiIiIKICAgICAgICBpZiBmb3JjZToKICAgICAgICAgICAgIyBJZiBhIFNxbGl0ZURpY3QgaXMgYmVpbmcga2lsbGVkIG9yIGdhcmJhZ2UtY29sbGVjdGVkLCB0aGVuIHNlbGVjdF9vbmUoKQogICAgICAgICAgICAjIGNvdWxkIGhhbmcgZm9yZXZlciBiZWNhdXNlIHJ1bigpIG1pZ2h0IGFscmVhZHkgaGF2ZSBleGl0ZWQgYW5kIHRoZXJlZm9yZQogICAgICAgICAgICAjIGNhbid0IHByb2Nlc3MgdGhlIHJlcXVlc3QuIEluc3RlYWQsIHB1c2ggdGhlIGNsb3NlIGNvbW1hbmQgdG8gdGhlIHJlcXVlc3RzCiAgICAgICAgICAgICMgcXVldWUgZGlyZWN0bHkuIElmIHJ1bigpIGlzIHN0aWxsIGFsaXZlLCBpdCB3aWxsIGV4aXQgZ3JhY2VmdWxseS4gSWYgbm90LAogICAgICAgICAgICAjIHRoZW4gdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyBhbnl3YXkuCiAgICAgICAgICAgIHNlbGYucmVxcy5wdXQoKCctLWNsb3NlLS0nLCBOb25lLCBRdWV1ZSgpLCBOb25lKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIHdlIGFidXNlICdzZWxlY3QnIHRvICJpdGVyIiBvdmVyIGEgIi0tY2xvc2UtLSIgc3RhdGVtZW50IHNvIHRoYXQgd2UKICAgICAgICAgICAgIyBjYW4gY29uZmlybSB0aGUgY29tcGxldGlvbiBvZiBjbG9zZSBiZWZvcmUgam9pbmluZyB0aGUgdGhyZWFkIGFuZAogICAgICAgICAgICAjIHJldHVybmluZyAoYnkgc2VtYXBob3JlICctLW5vIG1vcmUtLScKICAgICAgICAgICAgc2VsZi5zZWxlY3Rfb25lKCctLWNsb3NlLS0nKQogICAgICAgICAgICBzZWxmLmpvaW4oKQojIGVuZGNsYXNzIFNxbGl0ZU11bHRpdGhyZWFkCgAAAAAAAAAAmlQAAAAAAAAAAAAA",
"AQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/"
]
]
},
{
"file": "/Users/spark/pycharmproject/secsay/j4096.py",
"settings":
{
"buffer_size": 495049,
"encoding": "UTF-8",
"line_ending": "Unix"
},
"undo_stack":
[
[
5,
1,
"left_delete",
null,
"AQAAABK9AQAAAAAAEr0BAAAAAAADAAAA56m6",
"BwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAE70BAAAAAAATvQEAAAAAAAAAAAAAAPC/"
],
[
6,
1,
"insert",
{
"characters": "kongzhi"
},
"BwAAABK9AQAAAAAAE70BAAAAAAAAAAAAE70BAAAAAAAUvQEAAAAAAAAAAAAUvQEAAAAAABW9AQAAAAAAAAAAABW9AQAAAAAAFr0BAAAAAAAAAAAAFr0BAAAAAAAXvQEAAAAAAAAAAAAXvQEAAAAAABi9AQAAAAAAAAAAABi9AQAAAAAAGb0BAAAAAAAAAAAA",
"BwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAEr0BAAAAAAASvQEAAAAAAAAAAAAAAPC/"
],
[
7,
7,
"left_delete",
null,
"BwAAABi9AQAAAAAAGL0BAAAAAAABAAAAaRe9AQAAAAAAF70BAAAAAAABAAAAaBa9AQAAAAAAFr0BAAAAAAABAAAAehW9AQAAAAAAFb0BAAAAAAABAAAAZxS9AQAAAAAAFL0BAAAAAAABAAAAbhO9AQAAAAAAE70BAAAAAAABAAAAbxK9AQAAAAAAEr0BAAAAAAABAAAAaw",
"BwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAGb0BAAAAAAAZvQEAAAAAAAAAAAAAAPC/"
],
[
8,
1,
"",
null,
"AQAAABK9AQAAAAAAE70BAAAAAAAAAAAA",
"BwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAEr0BAAAAAAASvQEAAAAAAAAAAAAAAPC/"
],
[
9,
1,
"",
null,
"AQAAABK9AQAAAAAAFL0BAAAAAAABAAAAaw",
"BwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAE70BAAAAAAATvQEAAAAAAAAAAAAAAPC/"
],
[
10,
1,
"",
null,
"AQAAABK9AQAAAAAAFb0BAAAAAAACAAAAa28",
"BwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAFL0BAAAAAAAUvQEAAAAAAAAAAAAAAPC/"
],
[
11,
1,
"",
null,
"AQAAABK9AQAAAAAAFr0BAAAAAAADAAAAa29u",
"BwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAFb0BAAAAAAAVvQEAAAAAAAAAAAAAAPC/"
],
[
12,
1,
"",
null,
"AQAAABK9AQAAAAAAGL0BAAAAAAAEAAAAa29uZw",
"BwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAFr0BAAAAAAAWvQEAAAAAAAAAAAAAAPC/"
],
[
13,
1,
"",
null,
"AQAAABK9AQAAAAAAGb0BAAAAAAAGAAAAa29uZyB6",
"BwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAGL0BAAAAAAAYvQEAAAAAAAAAAAAAAPC/"
],
[
14,
1,
"",
null,
"AQAAABK9AQAAAAAAGr0BAAAAAAAHAAAAa29uZyB6aA",
"BwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAGb0BAAAAAAAZvQEAAAAAAAAAAAAAAPC/"
],
[
15,
1,
"",
null,
"AQAAABK9AQAAAAAAEr0BAAAAAAAIAAAAa29uZyB6aGk",
"BwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAGr0BAAAAAAAavQEAAAAAAAAAAAAAAPC/"
],
[
16,
1,
"insert",
{
"characters": "控制"
},
"AgAAABK9AQAAAAAAE70BAAAAAAAAAAAAE70BAAAAAAAUvQEAAAAAAAAAAAA",
"BwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAEr0BAAAAAAASvQEAAAAAAAAAAAAAAPC/"
],
[
17,
1,
"left_delete",
null,
"AQAAABO9AQAAAAAAE70BAAAAAAADAAAA5Yi2",
"BwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwvwAAAAABAAAAFL0BAAAAAAAUvQEAAAAAAAAAAAAAAPC/"
]
]
},
{
"file": "deva/endpoints.py",
"settings":
{
"buffer_size": 10271,
"encoding": "UTF-8",
"line_ending": "Unix"
},
"undo_stack":
[
[
1,
1,
"revert",
null,
"AgAAAAAAAAAAAAAAAAAAAAAAAAD3HgAAZnJvbSB0b3JuYWRvIGltcG9ydCBnZW4KZnJvbSB0b3JuYWRvLmh0dHBjbGllbnQgaW1wb3J0IEhUVFBSZXF1ZXN0LCBIVFRQRXJyb3IKZnJvbSB0b3JuYWRvLmh0dHBjbGllbnQgaW1wb3J0IEFzeW5jSFRUUENsaWVudAoKZnJvbSAucGlwZSBpbXBvcnQgcGFzc2VkLCBQCmZyb20gLmNvcmUgaW1wb3J0IFN0cmVhbQpmcm9tIC50b3BpYyBpbXBvcnQgUmVkaXNTdHJlYW0KZnJvbSAubmFtZXNwYWNlIGltcG9ydCBOQgpmcm9tIHB5bWF5YmUgaW1wb3J0IG1heWJlCmltcG9ydCBqc29uCgoKQFN0cmVhbS5yZWdpc3Rlcl9hcGkoKQpjbGFzcyB0b19rYWZrYShTdHJlYW0pOgogICAgIiIiIFdyaXRlcyBkYXRhIGluIHRoZSBzdHJlYW0gdG8gS2Fma2EKCiAgICBUaGlzIHN0cmVhbSBhY2NlcHRzIGEgc3RyaW5nIG9yIGJ5dGVzIG9iamVjdC4gQ2FsbCBgYGZsdXNoYGAgdG8gZW5zdXJlIGFsbAogICAgbWVzc2FnZXMgYXJlIHB1c2hlZC4gUmVzcG9uc2VzIGZyb20gS2Fma2EgYXJlIHB1c2hlZCBkb3duc3RyZWFtLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHRvcGljIDogc3RyaW5nCiAgICAgICAgVGhlIHRvcGljIHdoaWNoIHRvIHdyaXRlCiAgICBwcm9kdWNlcl9jb25maWcgOiBkaWN0CiAgICAgICAgU2V0dGluZ3MgdG8gc2V0IHVwIHRoZSBzdHJlYW0sIHNlZQogICAgICAgIGh0dHBzOi8vZG9jcy5jb25mbHVlbnQuaW8vY3VycmVudC9jbGllbnRzL2NvbmZsdWVudC1rYWZrYS1weXRob24vI2NvbmZpZ3VyYXRpb24KICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vZWRlbmhpbGwvbGlicmRrYWZrYS9ibG9iL21hc3Rlci9DT05GSUdVUkFUSU9OLm1kCiAgICAgICAgRXhhbXBsZXM6CiAgICAgICAgYm9vdHN0cmFwLnNlcnZlcnM6IENvbm5lY3Rpb24gc3RyaW5nIChob3N0OnBvcnQpIHRvIEthZmthCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gZnJvbSBzdHJlYW16IGltcG9ydCBTdHJlYW0KICAgID4+PiBBUkdTID0geydib290c3RyYXAuc2VydmVycyc6ICdsb2NhbGhvc3Q6OTA5Mid9CiAgICA+Pj4gc291cmNlID0gU3RyZWFtKCkKICAgID4+PiBrYWZrYSA9IHNvdXJjZS5tYXAobGFtYmRhIHg6IHN0cih4KSkudG9fa2Fma2EoJ3Rlc3QnLCBBUkdTKQogICAgPHRvX2thZmthPgogICAgPj4+IGZvciBpIGluIHJhbmdlKDEwKToKICAgIC4uLiAgICAgc291cmNlLmVtaXQoaSkKICAgID4+PiBrYWZrYS5mbHVzaCgpCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXBzdHJlYW0sIHRvcGljLCBwcm9kdWNlcl9jb25maWcsICoqa3dhcmdzKToKICAgICAgICBpbXBvcnQgY29uZmx1ZW50X2thZmthIGFzIGNrCgogICAgICAgIHNlbGYudG9waWMgPSB0b3BpYwogICAgICAgIHNlbGYucHJvZHVjZXIgPSBjay5Qcm9kdWNlcihwcm9kdWNlcl9jb25maWcpCgogICAgICAgIFN0cmVhbS5fX2luaXRfXyhzZWxmLCB1cHN0cmVhbSwgZW5zdXJlX2lvX2xvb3A9VHJ1ZSwgKiprd2FyZ3MpCiAgICAgICAgc2VsZi5zdG9wcGVkID0gRmFsc2UKICAgICAgICBzZWxmLnBvbGx0aW1lID0gMC4yCiAgICAgICAgc2VsZi5sb29wLmFkZF9jYWxsYmFjayhzZWxmLnBvbGwpCiAgICAgICAgc2VsZi5mdXR1cmVzID0gW10KCiAgICBAZ2VuLmNvcm91dGluZQogICAgZGVmIHBvbGwoc2VsZik6CiAgICAgICAgd2hpbGUgbm90IHNlbGYuc3RvcHBlZDoKICAgICAgICAgICAgIyBleGVjdXRlcyBjYWxsYmFja3MgZm9yIGFueSBkZWxpdmVyZWQgZGF0YSwgaW4gdGhpcyB0aHJlYWQKICAgICAgICAgICAgIyBpZiBubyBtZXNzYWdlcyB3ZXJlIHNlbnQsIG5vdGhpbmcgaGFwcGVucwogICAgICAgICAgICBzZWxmLnByb2R1Y2VyLnBvbGwoMCkKICAgICAgICAgICAgeWllbGQgZ2VuLnNsZWVwKHNlbGYucG9sbHRpbWUpCgogICAgZGVmIHVwZGF0ZShzZWxmLCB4LCB3aG89Tm9uZSk6CiAgICAgICAgZnV0dXJlID0gZ2VuLkZ1dHVyZSgpCiAgICAgICAgc2VsZi5mdXR1cmVzLmFwcGVuZChmdXR1cmUpCgogICAgICAgIEBnZW4uY29yb3V0aW5lCiAgICAgICAgZGVmIF8oKToKICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAjIHRoaXMgcnVucyBhc3luY2hyb25vdXNseSwgaW4gQy1LJ3MgdGhyZWFkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9kdWNlci5wcm9kdWNlKHNlbGYudG9waWMsIHgsIGNhbGxiYWNrPXNlbGYuY2IpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBleGNlcHQgQnVmZmVyRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgZ2VuLnNsZWVwKHNlbGYucG9sbHRpbWUpCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgZnV0dXJlLnNldF9leGNlcHRpb24oZSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5sb29wLmFkZF9jYWxsYmFjayhfKQogICAgICAgIHJldHVybiBmdXR1cmUKCiAgICBAZ2VuLmNvcm91dGluZQogICAgZGVmIGNiKHNlbGYsIGVyciwgbXNnKToKICAgICAgICBmdXR1cmUgPSBzZWxmLmZ1dHVyZXMucG9wKDApCiAgICAgICAgaWYgbXNnIGlzIG5vdCBOb25lIGFuZCBtc2cudmFsdWUoKSBpcyBub3QgTm9uZToKICAgICAgICAgICAgZnV0dXJlLnNldF9yZXN1bHQoTm9uZSkKICAgICAgICAgICAgeWllbGQgc2VsZi5fZW1pdChtc2cudmFsdWUoKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBmdXR1cmUuc2V0X2V4Y2VwdGlvbihlcnIgb3IgbXNnLmVycm9yKCkpCgogICAgZGVmIGZsdXNoKHNlbGYsIHRpbWVvdXQ9LTEpOgogICAgICAgIHNlbGYucHJvZHVjZXIuZmx1c2godGltZW91dCkKCgpAU3RyZWFtLnJlZ2lzdGVyX2FwaSgpCmNsYXNzIHRvX3JlZGlzKFN0cmVhbSk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRvcGljLCB1cHN0cmVhbT1Ob25lLCBtYXhfbGVuPTEwMCwgKiprd2FyZ3MpOgogICAgICAgIFN0cmVhbS5fX2luaXRfXyhzZWxmLCB1cHN0cmVhbT11cHN0cmVhbSwgZW5zdXJlX2lvX2xvb3A9VHJ1ZSkKICAgICAgICBzZWxmLnJzID0gUmVkaXNTdHJlYW0odG9waWM9dG9waWMsIG1heF9sZW49bWF4X2xlbikKICAgICAgICBzZWxmID4+IHNlbGYucnMKCgojIOiHquWumuS5ieacuuWZqOS6uueahOWwgeijheexuwpjbGFzcyBEdGFsayhTdHJlYW0pOgogICAgIiIi6ZKJ6ZKJ576k5py65Zmo5Lq6LiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3ZWJob29rPU5vbmUsIHNlY3JldD1Ob25lLCBsb2c9cGFzc2VkLAogICAgICAgICAgICAgICAgIG1heF9yZXRyaWVzPTMsIGFzeW5jaHJvbm91cz1UcnVlLCAqKmt3YXJncyk6CiAgICAgICAgc2VsZi5sb2cgPSBsb2cKICAgICAgICBzdXBlcihEdGFsaywgc2VsZikuX19pbml0X18oZW5zdXJlX2lvX2xvb3A9VHJ1ZSwgKiprd2FyZ3MpCgogICAgICAgIHNlbGYuY2xpZW50ID0gQXN5bmNIVFRQQ2xpZW50KCkKICAgICAgICBzZWxmLnNlY3JldCA9IHNlY3JldAogICAgICAgIHNlbGYud2ViaG9vayA9IHdlYmhvb2sKICAgICAgICBpZiBub3Qgd2ViaG9vazoKICAgICAgICAgICAgc2VsZi53ZWJob29rID0gbWF5YmUoTkIoJ2R0YWxrX2RldmEnKSlbJ3dlYmhvb2snXS5vcl9lbHNlKE5vbmUpCiAgICAgICAgICAgIHNlbGYuc2VjcmV0ID0gbWF5YmUoTkIoJ2R0YWxrX2RldmEnKSlbJ3NlY3JldCddLm9yX2Vsc2UoTm9uZSkKICAgICAgICAgICAgaWYgbm90IHNlbGYud2ViaG9vazoKICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiIiJwbGVhc2UgaW5wdXQgYSB3ZWJob29rLG9yIHNldCBhIGRlZmF1bHQgd2ViaG9vayBhbmQgc2VjcmV0IHRvIE5CKCJkdGFsayIpWyJ0ZXN0Il0gbGlrZSB0aGlzOgogICAgICAgICAgICAgICAgICAgIE5CKCdkdGFsa19kZXZhJylbJ3dlYmhvb2snXT0naHR0cHM6Ly9vYXBpLmRpbmd0YWxrLmNvbS9yb2JvdC9zZW5kP2FjY2Vzc190b2tlbj14eHgnCiAgICAgICAgICAgICAgICAgICAgTkIoJ2R0YWxrX2RldmEnKVsnc2VjcmV0J109J1NFQzA4NTcxNGMzMWN4eHh4eHh4JwogICAgICAgICAgICAgICAgICAgICIiIikKCiAgICAjIHRleHTnsbvlnosKCiAgICBkZWYgZ2V0X3NpZ25fdXJsKHNlbGYsKToKICAgICAgICBpZiBzZWxmLnNlY3JldDoKICAgICAgICAgICAgaW1wb3J0IHRpbWUKICAgICAgICAgICAgaW1wb3J0IGhtYWMKICAgICAgICAgICAgaW1wb3J0IGhhc2hsaWIKICAgICAgICAgICAgaW1wb3J0IGJhc2U2NAogICAgICAgICAgICBpbXBvcnQgdXJsbGliCiAgICAgICAgICAgIHRpbWVzdGFtcCA9IGludChyb3VuZCh0aW1lLnRpbWUoKSAqIDEwMDApKQogICAgICAgICAgICBzZWNyZXRfZW5jID0gc2VsZi5zZWNyZXQuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgIHN0cmluZ190b19zaWduID0gJ3t9XG57fScuZm9ybWF0KHRpbWVzdGFtcCwgc2VsZi5zZWNyZXQpCiAgICAgICAgICAgIHN0cmluZ190b19zaWduX2VuYyA9IHN0cmluZ190b19zaWduLmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICBobWFjX2NvZGUgPSBobWFjLm5ldyhzZWNyZXRfZW5jLCBzdHJpbmdfdG9fc2lnbl9lbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2VzdG1vZD1oYXNobGliLnNoYTI1NikuZGlnZXN0KCkKICAgICAgICAgICAgc2lnbiA9IHVybGxpYi5wYXJzZS5xdW90ZV9wbHVzKGJhc2U2NC5iNjRlbmNvZGUoaG1hY19jb2RlKSkKICAgICAgICAgICAgdXJsID0gc2VsZi53ZWJob29rICsgZicmdGltZXN0YW1wPXt0aW1lc3RhbXB9JnNpZ249e3NpZ259JwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHVybCA9IHNlbGYud2ViaG9vawoKICAgICAgICByZXR1cm4gdXJsCgogICAgQGdlbi5jb3JvdXRpbmUKICAgIGRlZiBlbWl0KHNlbGYsIG1zZzogc3RyLCBhc3luY2hyb25vdXM9RmFsc2UpOgogICAgICAgIHN1cGVyKCkuZW1pdChtc2cpCiAgICAgICAgeWllbGQgc2VsZi5wb3N0KG1zZywgc2VsZi5sb2cpCgogICAgQGdlbi5jb3JvdXRpbmUKICAgIGRlZiBwb3N0KHNlbGYsIG1zZzogc3RyLCBsb2c6IFN0cmVhbSk6CiAgICAgICAgIyDkuozov5vliLbmiJbogIVzZXTnsbvlnovnmoQs6L2s5oiQanNvbuagvOW8j+WJjemcgOimgeWFiOi9rOexu+WeiwogICAgICAgIG1zZyA9IHN0cihtc2cpCgogICAgICAgIGRhdGEgPSB7Im1zZ3R5cGUiOiAidGV4dCIsICJ0ZXh0IjogeyJjb250ZW50IjogbXNnfSwKICAgICAgICAgICAgICAgICJhdCI6IHsiYXRNb2JpbGVzIjogW10sICJpc0F0QWxsIjogJ0BhbGwnIGluIG1zZ319CgogICAgICAgIGlmIG1zZy5zdGFydHN3aXRoKCdAbWRAJyk6CiAgICAgICAgICAgICMgQG1kQOi0ouiBlOekvuaWsOmXu+axh+aAu3x0ZXh0CiAgICAgICAgICAgIGNvbnRlbnQgPSBtc2dbNDpdCiAgICAgICAgICAgIHRpdGxlLCB0ZXh0ID0gY29udGVudFs6Y29udGVudC5pbmRleCgKICAgICAgICAgICAgICAgICd8JyldLCBjb250ZW50W2NvbnRlbnQuaW5kZXgoJ3wnKSArIDE6XQogICAgICAgICAgICBkYXRhID0gewogICAgICAgICAgICAgICAgIm1zZ3R5cGUiOiAibWFya2Rvd24iLAogICAgICAgICAgICAgICAgIm1hcmtkb3duIjogeyJ0aXRsZSI6IHRpdGxlLCAidGV4dCI6IHRleHQsICJjb250ZW50IjogdGV4dH0KICAgICAgICAgICAgfQoKICAgICAgICBwb3N0X2RhdGEgPSBqc29uLkpTT05FbmNvZGVyKCkuZW5jb2RlKGRhdGEpCiAgICAgICAgIyBpbXBvcnQgdXJsbGliCiAgICAgICAgIyBwb3N0X2RhdGEgPSB1cmxsaWIucGFyc2UudXJsZW5jb2RlKGRhdGEpCgogICAgICAgIGhlYWRlcnMgPSB7J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ30KCiAgICAgICAgdXJsID0gc2VsZi5nZXRfc2lnbl91cmwoKQoKICAgICAgICByZXF1ZXN0ID0gSFRUUFJlcXVlc3QoCiAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgYm9keT1wb3N0X2RhdGEsCiAgICAgICAgICAgIG1ldGhvZD0iUE9TVCIsCiAgICAgICAgICAgIGhlYWRlcnM9aGVhZGVycywKICAgICAgICAgICAgdmFsaWRhdGVfY2VydD1GYWxzZSkKICAgICAgICAjIHZhbGlkYXRlX2NlcnQ9RmFsc2Ug5pyN5Yqh5Zmoc3Ns6Zeu6aKY6Kej5YazCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIHJlc3BvbnNlID0geWllbGQgc2VsZi5yZXRyeV9jbGllbnQuZmV0Y2gocmVxdWVzdCkKICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBzZWxmLmNsaWVudC5mZXRjaChyZXF1ZXN0KQogICAgICAgICAgICByZXN1bHQgPSBqc29uLmxvYWRzKHJlc3BvbnNlLmJvZHkuZGVjb2RlKCd1dGYtOCcpKQogICAgICAgIGV4Y2VwdCBIVFRQRXJyb3IgYXMgZToKICAgICAgICAgICAgcmVzdWx0ID0gZiJzZW5kIGR0YWxrIGVyb3IsbXNnOntkYXRhfSx7ZX0iCgogICAgICAgIHJldHVybiB7J2NsYXNzJzogJ0R0YWxrJywKICAgICAgICAgICAgICAgICdtc2cnOiBtc2csCiAgICAgICAgICAgICAgICAnd2ViaG9vayc6IHNlbGYud2ViaG9vaywKICAgICAgICAgICAgICAgICdyZXN1bHQnOiByZXN1bHQsCiAgICAgICAgICAgICAgICB9ID4+IGxvZwoKICAgIGRlZiBzZW5kKHNlbGYsIG1zZyk6CiAgICAgICAgIyDlkIzmraXnmoTlj5HpgIEKICAgICAgICBmcm9tIC5jb3JlIGltcG9ydCBzeW5jCiAgICAgICAgcmV0dXJuIHN5bmMoc2VsZi5sb29wLCBzZWxmLmVtaXQsIG1zZykKCgpAUApkZWYgbWFpbCh0bz0nemp3MDM1OEBnbWFpbC5jb20nKToKICAgIGltcG9ydCBwYW5kYXMgYXMgcGQKCiAgICAiIiIxMjM+Pm1haWwoKXxwcmludCIiIgogICAgZnJvbSBlbWFpbC5tZXNzYWdlIGltcG9ydCBFbWFpbE1lc3NhZ2UKICAgIGltcG9ydCBhaW9zbXRwbGliCiAgICBmcm9tIGVtYWlsLm1pbWUubXVsdGlwYXJ0IGltcG9ydCBNSU1FTXVsdGlwYXJ0CiAgICBmcm9tIGVtYWlsLm1pbWUudGV4dCBpbXBvcnQgTUlNRVRleHQKCiAgICBhc3luYyBkZWYgX3NlbmQoY29udGVudCk6CiAgICAgICAgdXNlcm5hbWUgPSBOQignbWFpbCcpWyd1c2VybmFtZSddCiAgICAgICAgcGFzc3dvcmQgPSBOQignbWFpbCcpWydwYXNzd29yZCddCiAgICAgICAgaG9zdG5hbWUgPSBOQignbWFpbCcpWydob3N0bmFtZSddCiAgICAgICAgaWYgaXNpbnN0YW5jZShjb250ZW50LCB0dXBsZSk6CiAgICAgICAgICAgIHN1YmplY3QgPSBjb250ZW50WzBdCiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50WzFdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3ViamVjdCA9ICdkZXZhIG1lc3NhZ2UnCgogICAgICAgIGlmIGlzaW5zdGFuY2UoY29udGVudCwgcGQuRGF0YUZyYW1lKToKICAgICAgICAgICAgbWVzc2FnZSA9IE1JTUVNdWx0aXBhcnQoImFsdGVybmF0aXZlIikKICAgICAgICAgICAgbWVzc2FnZVsiU3ViamVjdCJdID0gc3ViamVjdAogICAgICAgICAgICBtZXNzYWdlLmF0dGFjaChNSU1FVGV4dChjb250ZW50LnRvX2h0bWwoKSwgImh0bWwiLCAidXRmLTgiKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb250ZW50ID0gc3RyKGNvbnRlbnQpCiAgICAgICAgICAgIG1lc3NhZ2UgPSBFbWFpbE1lc3NhZ2UoKQogICAgICAgICAgICBtZXNzYWdlWyJTdWJqZWN0Il0gPSBzdWJqZWN0Kyc6Jytjb250ZW50WzoxMF0KICAgICAgICAgICAgbWVzc2FnZS5zZXRfY29udGVudChzdHIoY29udGVudCkpCgogICAgICAgIG1lc3NhZ2VbIlRvIl0gPSB0bwogICAgICAgIG1lc3NhZ2VbIkZyb20iXSA9IHVzZXJuYW1lCgogICAgICAgIHJldHVybiBhd2FpdCBhaW9zbXRwbGliLnNlbmQobWVzc2FnZSwgaG9zdG5hbWU9aG9zdG5hbWUsIHBvcnQ9NDY1LCB1c2VfdGxzPVRydWUsIHVzZXJuYW1lPXVzZXJuYW1lLCBwYXNzd29yZD1wYXNzd29yZCkKCiAgICBkZWYgcnVuKGNvbnRlbnQpOgogICAgICAgIHJldHVybiBfc2VuZChjb250ZW50KQoKICAgIHJldHVybiBydW4gQCBQCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIDEyMyA+PiBEdGFsaygpCgAAAAAAAAAA9CcAAAAAAAAAAAAA",
"AQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/"
],
[
2,
1,
"revert",
null,
"AgAAAAAAAAAAAAAAAAAAAAAAAACYLQAAZnJvbSB0b3JuYWRvIGltcG9ydCBnZW4KZnJvbSB0b3JuYWRvLmh0dHBjbGllbnQgaW1wb3J0IEhUVFBSZXF1ZXN0LCBIVFRQRXJyb3IKZnJvbSB0b3JuYWRvLmh0dHBjbGllbnQgaW1wb3J0IEFzeW5jSFRUUENsaWVudAoKZnJvbSAucGlwZSBpbXBvcnQgcGFzc2VkLCBQCmZyb20gLmNvcmUgaW1wb3J0IFN0cmVhbQpmcm9tIC50b3BpYyBpbXBvcnQgUmVkaXNTdHJlYW0KZnJvbSAubmFtZXNwYWNlIGltcG9ydCBOQgpmcm9tIHB5bWF5YmUgaW1wb3J0IG1heWJlCmltcG9ydCBqc29uCgoKQFN0cmVhbS5yZWdpc3Rlcl9hcGkoKQpjbGFzcyB0b19rYWZrYShTdHJlYW0pOgogICAgIiIi5bCG5pWw5o2u5rWB5YaZ5YWlS2Fma2HnmoTmtYEKCiAgICDor6XmtYHmjqXlj5flrZfnrKbkuLLmiJblrZfoioLlr7nosaHjgILosIPnlKggYGZsdXNoYCDnoa7kv53miYDmnInmtojmga/pg73ooqvmjqjpgIHjgIIKICAgIOadpeiHqkthZmth55qE5ZON5bqU5Lya6KKr5o6o6YCB5Yiw5LiL5ri444CCCgogICAg5Y+C5pWwCiAgICAtLS0tLS0tLS0tCiAgICB0b3BpYyA6IHN0cgogICAgICAgIOimgeWGmeWFpeeahEthZmth5Li76aKYCiAgICBwcm9kdWNlcl9jb25maWcgOiBkaWN0CiAgICAgICAgS2Fma2HnlJ/kuqfogIXphY3nva4s5Y+C6KeBOgogICAgICAgIGh0dHBzOi8vZG9jcy5jb25mbHVlbnQuaW8vY3VycmVudC9jbGllbnRzL2NvbmZsdWVudC1rYWZrYS1weXRob24vI2NvbmZpZ3VyYXRpb24KICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vZWRlbmhpbGwvbGlicmRrYWZrYS9ibG9iL21hc3Rlci9DT05GSUdVUkFUSU9OLm1kCiAgICAgICAgCiAgICAgICAg56S65L6L6YWN572uOgogICAgICAgIGJvb3RzdHJhcC5zZXJ2ZXJzOiBLYWZrYei/nuaOpeWtl+espuS4sihob3N0OnBvcnQpCgogICAg56S65L6LCiAgICAtLS0tLS0tLQogICAgIyDliJvlu7rmupDmtYHlkoxLYWZrYea1gQogICAgPj4+IHNvdXJjZSA9IFN0cmVhbSgpCiAgICA+Pj4gQVJHUyA9IHsnYm9vdHN0cmFwLnNlcnZlcnMnOiAnbG9jYWxob3N0OjkwOTInfQogICAgPj4+IGthZmthID0gc291cmNlLm1hcChzdHIpLnRvX2thZmthKCd0ZXN0JywgQVJHUykKICAgIAogICAgIyDlj5HpgIHmlbDmja4KICAgID4+PiBmb3IgaSBpbiByYW5nZSgxMCk6CiAgICAuLi4gICAgIHNvdXJjZS5lbWl0KGkpCiAgICAKICAgICMg5Yi35paw57yT5Yay5Yy6CiAgICA+Pj4ga2Fma2EuZmx1c2goKQogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVwc3RyZWFtLCB0b3BpYywgcHJvZHVjZXJfY29uZmlnLCAqKmt3YXJncyk6CiAgICAgICAgaW1wb3J0IGNvbmZsdWVudF9rYWZrYSBhcyBjawoKICAgICAgICBzZWxmLnRvcGljID0gdG9waWMKICAgICAgICBzZWxmLnByb2R1Y2VyID0gY2suUHJvZHVjZXIocHJvZHVjZXJfY29uZmlnKQoKICAgICAgICBTdHJlYW0uX19pbml0X18oc2VsZiwgdXBzdHJlYW0sIGVuc3VyZV9pb19sb29wPVRydWUsICoqa3dhcmdzKQogICAgICAgIHNlbGYuc3RvcHBlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5wb2xsdGltZSA9IDAuMgogICAgICAgIHNlbGYubG9vcC5hZGRfY2FsbGJhY2soc2VsZi5wb2xsKQogICAgICAgIHNlbGYuZnV0dXJlcyA9IFtdCgogICAgQGdlbi5jb3JvdXRpbmUKICAgIGRlZiBwb2xsKHNlbGYpOgogICAgICAgIHdoaWxlIG5vdCBzZWxmLnN0b3BwZWQ6CiAgICAgICAgICAgICMg5omn6KGM5bey5oqV6YCS5pWw5o2u55qE5Zue6LCDLOWcqOW9k+WJjee6v+eoi+S4rQogICAgICAgICAgICAjIOWmguaenOayoeaciea2iOaBr+WPkemAgSzliJnkuI3miafooYzku7vkvZXmk43kvZwKICAgICAgICAgICAgc2VsZi5wcm9kdWNlci5wb2xsKDApCiAgICAgICAgICAgIHlpZWxkIGdlbi5zbGVlcChzZWxmLnBvbGx0aW1lKQoKICAgIGRlZiB1cGRhdGUoc2VsZiwgeCwgd2hvPU5vbmUpOgogICAgICAgIGZ1dHVyZSA9IGdlbi5GdXR1cmUoKQogICAgICAgIHNlbGYuZnV0dXJlcy5hcHBlbmQoZnV0dXJlKQoKICAgICAgICBAZ2VuLmNvcm91dGluZQogICAgICAgIGRlZiBfKCk6CiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgIyDlvILmraXov5DooYws5ZyoY29uZmx1ZW50LWthZmth55qE57q/56iL5LitCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9kdWNlci5wcm9kdWNlKHNlbGYudG9waWMsIHgsIGNhbGxiYWNrPXNlbGYuY2IpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBleGNlcHQgQnVmZmVyRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgZ2VuLnNsZWVwKHNlbGYucG9sbHRpbWUpCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgZnV0dXJlLnNldF9leGNlcHRpb24oZSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5sb29wLmFkZF9jYWxsYmFjayhfKQogICAgICAgIHJldHVybiBmdXR1cmUKCiAgICBAZ2VuLmNvcm91dGluZQogICAgZGVmIGNiKHNlbGYsIGVyciwgbXNnKToKICAgICAgICBmdXR1cmUgPSBzZWxmLmZ1dHVyZXMucG9wKDApCiAgICAgICAgaWYgbXNnIGlzIG5vdCBOb25lIGFuZCBtc2cudmFsdWUoKSBpcyBub3QgTm9uZToKICAgICAgICAgICAgZnV0dXJlLnNldF9yZXN1bHQoTm9uZSkKICAgICAgICAgICAgeWllbGQgc2VsZi5fZW1pdChtc2cudmFsdWUoKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBmdXR1cmUuc2V0X2V4Y2VwdGlvbihlcnIgb3IgbXNnLmVycm9yKCkpCgogICAgZGVmIGZsdXNoKHNlbGYsIHRpbWVvdXQ9LTEpOgogICAgICAgICIiIuWIt+aWsOeUn+S6p+iAhee8k+WGsuWMuiznoa7kv53miYDmnInmtojmga/pg73ooqvlj5HpgIEKCiAgICAgICAg5Y+C5pWwCiAgICAgICAgLS0tLQogICAgICAgIHRpbWVvdXQgOiBpbnQsIOWPr+mAiQogICAgICAgICAgICDotoXml7bml7bpl7Qo56eSKSzpu5jorqQtMeihqOekuuaXoOmZkOetieW+hQogICAgICAgICIiIgogICAgICAgIHNlbGYucHJvZHVjZXIuZmx1c2godGltZW91dCkKCkBTdHJlYW0ucmVnaXN0ZXJfYXBpKCkKY2xhc3MgdG9fcmVkaXMoU3RyZWFtKToKICAgICIiIuWwhuS4iua4uOaVsOaNruWGmeWFpVJlZGlz5rWBCgogICAg6K+l5rWB5Lya5bCG5LiK5ri45pWw5o2u5YaZ5YWlUmVkaXPmtYHkuK3jgILmlK/mjIHorr7nva7mnIDlpKfplb/luqbpmZDliLbjgIIKCiAgICDlj4LmlbA6CiAgICAtLS0tLS0tCiAgICB0b3BpYyA6IHN0cgogICAgICAgIFJlZGlz5rWB55qE5ZCN56ewCiAgICB1cHN0cmVhbSA6IFN0cmVhbSwg5Y+v6YCJCiAgICAgICAg5LiK5ri45rWB5a+56LGhCiAgICBtYXhfbGVuIDogaW50LCDlj6/pgIkKICAgICAgICBSZWRpc+a1geeahOacgOWkp+mVv+W6pizpu5jorqQxMDAKICAgICoqa3dhcmdzIDogZGljdAogICAgICAgIOWFtuS7luWPguaVsOS8oOmAkue7mVN0cmVhbeWfuuexuwoKICAgIOekuuS+izoKICAgIC0tLS0tLS0KICAgICMg5Z+65pys55So5rOVCiAgICBzID0gU3RyZWFtKCkKICAgIHMudG9fcmVkaXMoJ215c3RyZWFtJykgPj4gcHJpbnQgICMg5YaZ5YWl5ZCN5Li6bXlzdHJlYW3nmoRSZWRpc+a1gQoKICAgICMg6ZmQ5Yi26ZW/5bqmCiAgICBzLnRvX3JlZGlzKCdteXN0cmVhbScsIG1heF9sZW49MTAwMCkgICMg6ZmQ5Yi25pyA5aSnMTAwMOadoQoKICAgICMg6ZO+5byP6LCD55SoCiAgICBzID0gU3RyZWFtKCkKICAgIHMucmF0ZV9saW1pdCgwLjEpLnRvX3JlZGlzKCdteXN0cmVhbScpICAjIOmZkOmAn+WGmeWFpQogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRvcGljLCB1cHN0cmVhbT1Ob25lLCBtYXhfbGVuPTEwMCwgKiprd2FyZ3MpOgogICAgICAgIFN0cmVhbS5fX2luaXRfXyhzZWxmLCB1cHN0cmVhbT11cHN0cmVhbSwgZW5zdXJlX2lvX2xvb3A9VHJ1ZSkKICAgICAgICBzZWxmLnJzID0gUmVkaXNTdHJlYW0odG9waWM9dG9waWMsIG1heF9sZW49bWF4X2xlbikKICAgICAgICBzZWxmID4+IHNlbGYucnMKCgojIOiHquWumuS5ieacuuWZqOS6uueahOWwgeijheexuwpjbGFzcyBEdGFsayhTdHJlYW0pOgogICAgIiIi6ZKJ6ZKJ576k5py65Zmo5Lq657G7LOeUqOS6juWPkemAgea2iOaBr+WIsOmSiemSiee+pOOAggoKICAgIOivpeexu+e7p+aJv+iHqlN0cmVhbSzmj5Dkvpvkuoblj5HpgIHmlofmnKzlkoxtYXJrZG93buagvOW8j+a2iOaBr+WIsOmSiemSiee+pOeahOWKn+iDveOAggogICAg5pSv5oyB5ZCM5q2l5ZKM5byC5q2l5Y+R6YCBLOaUr+aMgeetvuWQjemqjOivgeOAggoKICAgIOWPguaVsDoKICAgIC0tLS0tLS0KICAgIHdlYmhvb2sgOiBzdHIsIOWPr+mAiQogICAgICAgIOmSiemSieacuuWZqOS6uueahHdlYmhvb2vlnLDlnYAKICAgIHNlY3JldCA6IHN0ciwg5Y+v6YCJICAKICAgICAgICDpkonpkonmnLrlmajkurrnmoTnrb7lkI3lr4bpkqUKICAgIGxvZyA6IFN0cmVhbSwg5Y+v6YCJCiAgICAgICAg5pel5b+X5rWB5a+56LGhLOm7mOiupHBhc3NlZAogICAgbWF4X3JldHJpZXMgOiBpbnQsIOWPr+mAiQogICAgICAgIOacgOWkp+mHjeivleasoeaVsCzpu5jorqQz5qyhCiAgICBhc3luY2hyb25vdXMgOiBib29sLCDlj6/pgIkKICAgICAgICDmmK/lkKblvILmraXlj5HpgIEs6buY6K6kVHJ1ZQogICAgKiprd2FyZ3MgOiBkaWN0CiAgICAgICAg5YW25LuW5Y+C5pWw5Lyg6YCS57uZU3RyZWFt5Z+657G7CgogICAg56S65L6LOgogICAgLS0tLS0tLQogICAgIyDln7rmnKznlKjms5UKICAgIGR0YWxrID0gRHRhbGsod2ViaG9vaz0naHR0cHM6Ly9vYXBpLmRpbmd0YWxrLmNvbS9yb2JvdC9zZW5kP2FjY2Vzc190b2tlbj14eHgnKQogICAgJ0hlbGxvJyA+PiBkdGFsayAgIyDlj5HpgIHmlofmnKzmtojmga8KCiAgICAjIOS9v+eUqOm7mOiupOmFjee9rgogICAgTkIoJ2R0YWxrX2RldmEnKVsnd2ViaG9vayddID0gJ2h0dHBzOi8vb2FwaS5kaW5ndGFsay5jb20vcm9ib3Qvc2VuZD9hY2Nlc3NfdG9rZW49eHh4JwogICAgTkIoJ2R0YWxrX2RldmEnKVsnc2VjcmV0J10gPSAnU0VDMDg1NzE0YzMxY3h4eHh4eHgnCiAgICBkdGFsayA9IER0YWxrKCkgICMg5L2/55So6buY6K6k6YWN572uCgogICAgIyDlj5HpgIFtYXJrZG93bua2iOaBrwogICAgJ0BtZEDmoIfpoph85q2j5paH5YaF5a65JyA+PiBkdGFsawoKICAgICMg5ZCM5q2l5Y+R6YCBCiAgICBkdGFsay5zZW5kKCdIZWxsbycpICAjIOWQjOatpeaWueW8j+WPkemAgQogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdlYmhvb2s9Tm9uZSwgc2VjcmV0PU5vbmUsIGxvZz1wYXNzZWQsCiAgICAgICAgICAgICAgICAgbWF4X3JldHJpZXM9MywgYXN5bmNocm9ub3VzPVRydWUsICoqa3dhcmdzKToKICAgICAgICBzZWxmLmxvZyA9IGxvZwogICAgICAgIHN1cGVyKER0YWxrLCBzZWxmKS5fX2luaXRfXyhlbnN1cmVfaW9fbG9vcD1UcnVlLCAqKmt3YXJncykKCiAgICAgICAgc2VsZi5jbGllbnQgPSBBc3luY0hUVFBDbGllbnQoKQogICAgICAgIHNlbGYuc2VjcmV0ID0gc2VjcmV0CiAgICAgICAgc2VsZi53ZWJob29rID0gd2ViaG9vawogICAgICAgIGlmIG5vdCB3ZWJob29rOgogICAgICAgICAgICBzZWxmLndlYmhvb2sgPSBtYXliZShOQignZHRhbGtfZGV2YScpKVsnd2ViaG9vayddLm9yX2Vsc2UoTm9uZSkKICAgICAgICAgICAgc2VsZi5zZWNyZXQgPSBtYXliZShOQignZHRhbGtfZGV2YScpKVsnc2VjcmV0J10ub3JfZWxzZShOb25lKQogICAgICAgICAgICBpZiBub3Qgc2VsZi53ZWJob29rOgogICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCIiInBsZWFzZSBpbnB1dCBhIHdlYmhvb2ssb3Igc2V0IGEgZGVmYXVsdCB3ZWJob29rIGFuZCBzZWNyZXQgdG8gTkIoImR0YWxrIilbInRlc3QiXSBsaWtlIHRoaXM6CiAgICAgICAgICAgICAgICAgICAgTkIoJ2R0YWxrX2RldmEnKVsnd2ViaG9vayddPSdodHRwczovL29hcGkuZGluZ3RhbGsuY29tL3JvYm90L3NlbmQ/YWNjZXNzX3Rva2VuPXh4eCcKICAgICAgICAgICAgICAgICAgICBOQignZHRhbGtfZGV2YScpWydzZWNyZXQnXT0nU0VDMDg1NzE0YzMxY3h4eHh4eHgnCiAgICAgICAgICAgICAgICAgICAgIiIiKQoKICAgIGRlZiBnZXRfc2lnbl91cmwoc2VsZiwpOgogICAgICAgICIiIueUn+aIkOW4puetvuWQjeeahHdlYmhvb2sgVVJMCgogICAgICAgIOWmguaenOiuvue9ruS6hnNlY3JldCzkvJrmoLnmja7ml7bpl7TmiLPlkozlr4bpkqXnlJ/miJDnrb7lkI3jgIIKICAgICAgICDlkKbliJnnm7TmjqXov5Tlm57ljp/lp4t3ZWJob29rIFVSTOOAggoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBzdHI6IOW4puetvuWQjeeahHdlYmhvb2sgVVJMCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5zZWNyZXQ6CiAgICAgICAgICAgIGltcG9ydCB0aW1lCiAgICAgICAgICAgIGltcG9ydCBobWFjCiAgICAgICAgICAgIGltcG9ydCBoYXNobGliCiAgICAgICAgICAgIGltcG9ydCBiYXNlNjQKICAgICAgICAgICAgaW1wb3J0IHVybGxpYgogICAgICAgICAgICB0aW1lc3RhbXAgPSBpbnQocm91bmQodGltZS50aW1lKCkgKiAxMDAwKSkKICAgICAgICAgICAgc2VjcmV0X2VuYyA9IHNlbGYuc2VjcmV0LmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICBzdHJpbmdfdG9fc2lnbiA9ICd7fVxue30nLmZvcm1hdCh0aW1lc3RhbXAsIHNlbGYuc2VjcmV0KQogICAgICAgICAgICBzdHJpbmdfdG9fc2lnbl9lbmMgPSBzdHJpbmdfdG9fc2lnbi5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgaG1hY19jb2RlID0gaG1hYy5uZXcoc2VjcmV0X2VuYywgc3RyaW5nX3RvX3NpZ25fZW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdlc3Rtb2Q9aGFzaGxpYi5zaGEyNTYpLmRpZ2VzdCgpCiAgICAgICAgICAgIHNpZ24gPSB1cmxsaWIucGFyc2UucXVvdGVfcGx1cyhiYXNlNjQuYjY0ZW5jb2RlKGhtYWNfY29kZSkpCiAgICAgICAgICAgIHVybCA9IHNlbGYud2ViaG9vayArIGYnJnRpbWVzdGFtcD17dGltZXN0YW1wfSZzaWduPXtzaWdufScKICAgICAgICBlbHNlOgogICAgICAgICAgICB1cmwgPSBzZWxmLndlYmhvb2sKCiAgICAgICAgcmV0dXJuIHVybAoKICAgIEBnZW4uY29yb3V0aW5lCiAgICBkZWYgZW1pdChzZWxmLCBtc2c6IHN0ciwgYXN5bmNocm9ub3VzPUZhbHNlKToKICAgICAgICAiIiLlj5HpgIHmtojmga/nmoTlhaXlj6Pmlrnms5UKCiAgICAgICAgQXJnczoKICAgICAgICAgICAgbXNnIChzdHIpOiDopoHlj5HpgIHnmoTmtojmga/lhoXlrrkKICAgICAgICAgICAgYXN5bmNocm9ub3VzIChib29sLCBvcHRpb25hbCk6IOaYr+WQpuW8guatpeWPkemAgS4gRGVmYXVsdHMgdG8gRmFsc2UuCiAgICAgICAgIiIiCiAgICAgICAgc3VwZXIoKS5lbWl0KG1zZykKICAgICAgICB5aWVsZCBzZWxmLnBvc3QobXNnLCBzZWxmLmxvZykKCiAgICBAZ2VuLmNvcm91dGluZQogICAgZGVmIHBvc3Qoc2VsZiwgbXNnOiBzdHIsIGxvZzogU3RyZWFtKToKICAgICAgICAiIiLlrp7pmYXlj5HpgIHmtojmga/liLDpkonpkonnmoTmlrnms5UKCiAgICAgICAg5pSv5oyB5paH5pys5ZKMbWFya2Rvd27kuKTnp43moLzlvI86CiAgICAgICAgLSDmma7pgJrmlofmnKznm7TmjqXlj5HpgIEKICAgICAgICAtIG1hcmtkb3du5qC85byP6ZyA6KaB5LulQG1kQOW8gOWktCzlubbnlKh85YiG6ZqU5qCH6aKY5ZKM5q2j5paHCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIG1zZyAoc3RyKTog5raI5oGv5YaF5a65CiAgICAgICAgICAgIGxvZyAoU3RyZWFtKTog5pel5b+X5rWB5a+56LGhCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIGRpY3Q6IOWMheWQq+WPkemAgee7k+aenOeahOWtl+WFuAogICAgICAgICIiIgogICAgICAgICMg5LqM6L+b5Yi25oiW6ICFc2V057G75Z6L55qELOi9rOaIkGpzb27moLzlvI/liY3pnIDopoHlhYjovaznsbvlnosKICAgICAgICBtc2cgPSBzdHIobXNnKQoKICAgICAgICBkYXRhID0geyJtc2d0eXBlIjogInRleHQiLCAidGV4dCI6IHsiY29udGVudCI6IG1zZ30sCiAgICAgICAgICAgICAgICAiYXQiOiB7ImF0TW9iaWxlcyI6IFtdLCAiaXNBdEFsbCI6ICdAYWxsJyBpbiBtc2d9fQoKICAgICAgICBpZiBtc2cuc3RhcnRzd2l0aCgnQG1kQCcpOgogICAgICAgICAgICAjIEBtZEDotKLogZTnpL7mlrDpl7vmsYfmgLt8dGV4dAogICAgICAgICAgICBjb250ZW50ID0gbXNnWzQ6XQogICAgICAgICAgICB0aXRsZSwgdGV4dCA9IGNvbnRlbnRbOmNvbnRlbnQuaW5kZXgoCiAgICAgICAgICAgICAgICAnfCcpXSwgY29udGVudFtjb250ZW50LmluZGV4KCd8JykgKyAxOl0KICAgICAgICAgICAgZGF0YSA9IHsKICAgICAgICAgICAgICAgICJtc2d0eXBlIjogIm1hcmtkb3duIiwKICAgICAgICAgICAgICAgICJtYXJrZG93biI6IHsidGl0bGUiOiB0aXRsZSwgInRleHQiOiB0ZXh0LCAiY29udGVudCI6IHRleHR9CiAgICAgICAgICAgIH0KCiAgICAgICAgcG9zdF9kYXRhID0ganNvbi5KU09ORW5jb2RlcigpLmVuY29kZShkYXRhKQogICAgICAgICMgaW1wb3J0IHVybGxpYgogICAgICAgICMgcG9zdF9kYXRhID0gdXJsbGliLnBhcnNlLnVybGVuY29kZShkYXRhKQoKICAgICAgICBoZWFkZXJzID0geydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9CgogICAgICAgIHVybCA9IHNlbGYuZ2V0X3NpZ25fdXJsKCkKCiAgICAgICAgcmVxdWVzdCA9IEhUVFBSZXF1ZXN0KAogICAgICAgICAgICB1cmwsCiAgICAgICAgICAgIGJvZHk9cG9zdF9kYXRhLAogICAgICAgICAgICBtZXRob2Q9IlBPU1QiLAogICAgICAgICAgICBoZWFkZXJzPWhlYWRlcnMsCiAgICAgICAgICAgIHZhbGlkYXRlX2NlcnQ9RmFsc2UpCiAgICAgICAgIyB2YWxpZGF0ZV9jZXJ0PUZhbHNlIOacjeWKoeWZqHNzbOmXrumimOino+WGswogICAgICAgIHRyeToKICAgICAgICAgICAgIyByZXNwb25zZSA9IHlpZWxkIHNlbGYucmV0cnlfY2xpZW50LmZldGNoKHJlcXVlc3QpCiAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgc2VsZi5jbGllbnQuZmV0Y2gocmVxdWVzdCkKICAgICAgICAgICAgcmVzdWx0ID0ganNvbi5sb2FkcyhyZXNwb25zZS5ib2R5LmRlY29kZSgndXRmLTgnKSkKICAgICAgICBleGNlcHQgSFRUUEVycm9yIGFzIGU6CiAgICAgICAgICAgIHJlc3VsdCA9IGYic2VuZCBkdGFsayBlcm9yLG1zZzp7ZGF0YX0se2V9IgoKICAgICAgICByZXR1cm4geydjbGFzcyc6ICdEdGFsaycsCiAgICAgICAgICAgICAgICAnbXNnJzogbXNnLAogICAgICAgICAgICAgICAgJ3dlYmhvb2snOiBzZWxmLndlYmhvb2ssCiAgICAgICAgICAgICAgICAncmVzdWx0JzogcmVzdWx0LAogICAgICAgICAgICAgICAgfSA+PiBsb2cKCiAgICBkZWYgc2VuZChzZWxmLCBtc2cpOgogICAgICAgICIiIuWQjOatpeaWueW8j+WPkemAgea2iOaBrwoKICAgICAgICBBcmdzOgogICAgICAgICAgICBtc2c6IOimgeWPkemAgeeahOa2iOaBr+WGheWuuQoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICDlj5HpgIHnu5PmnpwKICAgICAgICAiIiIKICAgICAgICAjIOWQjOatpeeahOWPkemAgQogICAgICAgIGZyb20gLmNvcmUgaW1wb3J0IHN5bmMKICAgICAgICByZXR1cm4gc3luYyhzZWxmLmxvb3AsIHNlbGYuZW1pdCwgbXNnKQoKCkBQCmRlZiBtYWlsKHRvPSd6ancwMzU4QGdtYWlsLmNvbScpOgogICAgIiIi5Y+R6YCB6YKu5Lu255qE5Ye95pWw6KOF6aWw5ZmoCgogICAg6K+l5Ye95pWw55So5LqO5Y+R6YCB6YKu5Lu2LOaUr+aMgeWPkemAgeaWh+acrOWGheWuueWSjERhdGFGcmFtZeihqOagvOOAggogICAg6ZyA6KaB5ZyoTkIoJ21haWwnKeS4remFjee9rumCrueuseacjeWKoeWZqOS/oeaBr+OAggoKICAgIOWPguaVsDoKICAgIC0tLS0tLS0KICAgIHRvIDogc3RyLCDlj6/pgIkKICAgICAgICDmlLbku7bkurrpgq7nrrHlnLDlnYAs6buY6K6kJ3pqdzAzNThAZ21haWwuY29tJwoKICAgIOmFjee9ruekuuS+izoKICAgIC0tLS0tLS0KICAgIE5CKCdtYWlsJylbJ3VzZXJuYW1lJ10gPSAnc2VuZGVyQGV4YW1wbGUuY29tJyAgIyDlj5Hku7bkurrpgq7nrrEKICAgIE5CKCdtYWlsJylbJ3Bhc3N3b3JkJ10gPSAncGFzc3dvcmQnICAjIOmCrueuseWvhueggQogICAgTkIoJ21haWwnKVsnaG9zdG5hbWUnXSA9ICdzbXRwLmV4YW1wbGUuY29tJyAgIyBTTVRQ5pyN5Yqh5Zmo5Zyw5Z2ACgogICAg56S65L6LOgogICAgLS0tLS0tLQogICAgIyDlj5HpgIHnroDljZXmlofmnKwKICAgICdIZWxsbycgPj4gbWFpbCgpID4+IHByaW50ICAjIOWPkemAgeaWh+acrOWGheWuuQogICAgCiAgICAjIOWPkemAgeW4puS4u+mimAogICAgKCfkuLvpopgnLCAn5q2j5paH5YaF5a65JykgPj4gbWFpbCgncmVjaXBpZW50QGV4YW1wbGUuY29tJykKICAgIAogICAgIyDlj5HpgIFEYXRhRnJhbWUKICAgIGltcG9ydCBwYW5kYXMgYXMgcGQKICAgIGRmID0gcGQuRGF0YUZyYW1lKHsnYSc6WzEsMl0sICdiJzpbMyw0XX0pCiAgICBkZiA+PiBtYWlsKCkgICMg5Y+R6YCB6KGo5qC8CiAgICAiIiIKICAgIGltcG9ydCBwYW5kYXMgYXMgcGQKICAgIGZyb20gZW1haWwubWVzc2FnZSBpbXBvcnQgRW1haWxNZXNzYWdlCiAgICBpbXBvcnQgYWlvc210cGxpYgogICAgZnJvbSBlbWFpbC5taW1lLm11bHRpcGFydCBpbXBvcnQgTUlNRU11bHRpcGFydAogICAgZnJvbSBlbWFpbC5taW1lLnRleHQgaW1wb3J0IE1JTUVUZXh0CgogICAgYXN5bmMgZGVmIF9zZW5kKGNvbnRlbnQpOgogICAgICAgIHVzZXJuYW1lID0gTkIoJ21haWwnKVsndXNlcm5hbWUnXQogICAgICAgIHBhc3N3b3JkID0gTkIoJ21haWwnKVsncGFzc3dvcmQnXSAKICAgICAgICBob3N0bmFtZSA9IE5CKCdtYWlsJylbJ2hvc3RuYW1lJ10KICAgICAgICBpZiBpc2luc3RhbmNlKGNvbnRlbnQsIHR1cGxlKToKICAgICAgICAgICAgc3ViamVjdCA9IGNvbnRlbnRbMF0KICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnRbMV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBzdWJqZWN0ID0gJ2RldmEgbWVzc2FnZScKCiAgICAgICAgaWYgaXNpbnN0YW5jZShjb250ZW50LCBwZC5EYXRhRnJhbWUpOgogICAgICAgICAgICBtZXNzYWdlID0gTUlNRU11bHRpcGFydCgiYWx0ZXJuYXRpdmUiKQogICAgICAgICAgICBtZXNzYWdlWyJTdWJqZWN0Il0gPSBzdWJqZWN0CiAgICAgICAgICAgIG1lc3NhZ2UuYXR0YWNoKE1JTUVUZXh0KGNvbnRlbnQudG9faHRtbCgpLCAiaHRtbCIsICJ1dGYtOCIpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvbnRlbnQgPSBzdHIoY29udGVudCkKICAgICAgICAgICAgbWVzc2FnZSA9IEVtYWlsTWVzc2FnZSgpCiAgICAgICAgICAgIG1lc3NhZ2VbIlN1YmplY3QiXSA9IHN1YmplY3QrJzonK2NvbnRlbnRbOjEwXQogICAgICAgICAgICBtZXNzYWdlLnNldF9jb250ZW50KHN0cihjb250ZW50KSkKCiAgICAgICAgbWVzc2FnZVsiVG8iXSA9IHRvCiAgICAgICAgbWVzc2FnZVsiRnJvbSJdID0gdXNlcm5hbWUKCiAgICAgICAgcmV0dXJuIGF3YWl0IGFpb3NtdHBsaWIuc2VuZChtZXNzYWdlLCBob3N0bmFtZT1ob3N0bmFtZSwgcG9ydD00NjUsIHVzZV90bHM9VHJ1ZSwgdXNlcm5hbWU9dXNlcm5hbWUsIHBhc3N3b3JkPXBhc3N3b3JkKQoKICAgIGRlZiBydW4oY29udGVudCk6CiAgICAgICAgcmV0dXJuIF9zZW5kKGNvbnRlbnQpCgogICAgcmV0dXJuIHJ1biBAIFAKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAxMjMgPj4gRHRhbGsoKQoAAAAAAAAAAB8oAAAAAAAAAAAAAA",
"AQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/"
]
]
}
],
"build_system": "",
"build_system_choices":
[
[
[
[
"Packages/Python/Python.sublime-build",
""
],
[
"Packages/Python/Python.sublime-build",
"Syntax Check"
],
[
"Packages/Python 3/Python3.sublime-build",
""
],
[
"Packages/SublimeREPL/sublimerepl_build_system_hack.sublime-build",
""
]
],
[
"Packages/Python 3/Python3.sublime-build",
""
]
]
],
"build_varint": "",
"command_palette":
{
"height": 0.0,
"last_filter": "",
"selected_items":
[
[
"sspy3",
"Set Syntax: Python3"
],
[
"sspy",
"Set Syntax: Python"
],
[
"in",
"Interrupt IPython Notebook Kernel"
],
[
"pyth",
"Set Syntax: Python3"
],
[
"py",
"Package Control: Add Repository"
],
[
"ins",
"Package Control: Install Package"
],
[
"install",
"Package Control: Install Package"
]
],
"width": 0.0
},
"console":
{
"height": 136.0,
"history":
[
"import urllib.request,os,hashlib; h = '6f4c264a24d933ce70df5dedcf1dcaee' + 'ebe013ee18cced0ef93d5f746d80ef60'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)"
]
},
"distraction_free":
{
"menu_visible": true,
"show_minimap": false,
"show_open_files": false,
"show_tabs": false,
"side_bar_visible": false,
"status_bar_visible": false
},
"expanded_folders":
[
"/Users/spark/pycharmproject/deva",
"/Users/spark/pycharmproject/deva/deva",
"/Users/spark/pycharmproject/naja",
"/Users/spark/pycharmproject/naja/twitter"
],
"file_history":
[
"/Users/spark/pycharmproject/deva/deva/compute.py",
"/Users/spark/pycharmproject/deva/requirements.txt",
"/Users/spark/pycharmproject/deva/deva/core.py",
"/Users/spark/pycharmproject/deva/deva/topic.py",
"/usr/local/lib/python3.10/site-packages/aioredis/__init__.py",
"/Users/spark/pycharmproject/secsay/g64.py",
"/Users/spark/pycharmproject/secsay/dayou.py",
"/Users/spark/pycharmproject/deva/deva/pipe.py",
"/Users/spark/pycharmproject/naja/twitter/trump.py",
"/Users/spark/pycharmproject/naja/twitter/twitter.py",
"/Users/spark/pycharmproject/deva/deva/__init__.py",
"/Users/spark/pycharmproject/deva/deva/page.py",
"/Users/spark/pship/down_m3u8/index-f1-v1-a1.m3u8",
"/Users/spark/.vim/bundle/vim-gsc/plugin/gsc.vim",
"/Users/spark/pycharmproject/deva/deva/when.py",
"/Users/spark/.vimrc",
"/Users/spark/pycharmproject/deva/deva/stream.py",
"/Users/spark/pycharmproject/deva/.git/config",
"/Users/spark/pycharmproject/deva/.gitignore",
"/Users/spark/pycharmproject/easyquant/.gitignore",
"/private/etc/hosts",
"/Users/spark/pycharmproject/easyquant/stock_2468/model.py",
"/Users/spark/pship/snipte_test.py",
"/Users/spark/pycharmproject/easyquant/stream_web_server.py",
"/Users/spark/pycharmproject/easyquant/stock_2468/main.py",
"/Users/spark/pycharmproject/deva/deva/streamz/core.py",
"/Users/spark/pycharmproject/deva/deva/streamz/sources.py",
"/usr/local/lib/python3.7/site-packages/tornado/process.py",
"/Users/spark/Downloads/streamz-0.5.1/MANIFEST.in",
"/Users/spark/Downloads/streamz-0.5.1/setup.cfg",
"/Users/spark/pycharmproject/deva/setup.py",
"/Users/spark/Downloads/streamz-0.5.1/requirements.txt",
"/Users/spark/pycharmproject/deva/deva/search.py",
"/Users/spark/pship/tmp.txt"
],
"find":
{
"height": 24.0
},
"find_in_files":
{
"height": 0.0,
"where_history":
[
]
},
"find_state":
{
"case_sensitive": false,
"find_history":
[
"Thread",
"cache",
"_rule_re",
"is_werkzeug_route",
"_rule_re",
"timer",
"islice",
"head",
"detail",
"SyntasticStatuslineFlag",
"tagbar",
"核桃",
"大畜",
"pay",
"九四"
],
"highlight": true,
"in_selection": false,
"preserve_case": false,
"regex": false,
"replace_history":
[
],
"reverse": false,
"scrollbar_highlights": true,
"show_context": true,
"use_buffer2": true,
"use_gitignore": true,
"whole_word": false,
"wrap": true
},
"folders":
[
{
"path": "/Users/spark/pycharmproject/deva"
},
{
"path": "/Users/spark/pycharmproject/secsay"
},
{
"path": "/Users/spark/pycharmproject/naja"
}
],
"groups":
[
{
"sheets":
[
{
"buffer": 0,
"file": "/Users/spark/pycharmproject/secsay/zhouyi_api.py",
"selected": true,
"semi_transient": false,
"settings":
{
"buffer_size": 4110,
"regions":
{
},
"selection":
[
[
737,
737
]
],
"settings":
{
"is_init_dirty_state": false,
"origin_encoding": "UTF-8",
"syntax": "Packages/Python/Python.sublime-syntax",
"tab_size": 4,
"translate_tabs_to_spaces": true
},
"translation.x": 0.0,
"translation.y": 0.0,
"zoom_level": 1.0
},
"stack_index": 0,
"stack_multiselect": false,
"type": "text"
},
{
"buffer": 1,
"file": "deva/store.py",
"semi_transient": false,
"settings":
{
"buffer_size": 5932,
"regions":
{
},
"selection":
[
[
0,
0
]
],
"settings":
{
"is_init_dirty_state": false,
"origin_encoding": "UTF-8",
"syntax": "Packages/Python/Python.sublime-syntax",
"tab_size": 4,
"translate_tabs_to_spaces": true
},
"translation.x": 0.0,
"translation.y": 0.0,
"zoom_level": 1.0
},
"stack_index": 2,
"stack_multiselect": false,
"type": "text"
},
{
"buffer": 2,
"file": "deva/utils/sqlitedict.py",
"semi_transient": false,
"settings":
{
"buffer_size": 21658,
"regions":
{
},
"selection":
[
[
0,
0
]
],
"settings":
{
"is_init_dirty_state": false,
"origin_encoding": "ASCII",
"syntax": "Packages/Python/Python.sublime-syntax",
"tab_size": 4,
"translate_tabs_to_spaces": true
},
"translation.x": 0.0,
"translation.y": 0.0,
"zoom_level": 1.0
},
"stack_index": 1,
"stack_multiselect": false,
"type": "text"
},
{
"buffer": 3,
"file": "/Users/spark/pycharmproject/secsay/j4096.py",
"semi_transient": false,
"settings":
{
"buffer_size": 495049,
"regions":
{
},
"selection":
[
[
114334,
114334
]
],
"settings":
{
"autopep8_view_autosave": true,
"is_init_dirty_state": false,
"origin_encoding": "UTF-8",
"syntax": "Packages/Python/Python.sublime-syntax",
"tab_size": 4,
"translate_tabs_to_spaces": true
},
"translation.x": 0.0,
"translation.y": 0.0,
"zoom_level": 1.0
},
"stack_index": 4,
"stack_multiselect": false,
"type": "text"
},
{
"buffer": 4,
"file": "deva/endpoints.py",
"semi_transient": false,
"settings":
{
"buffer_size": 10271,
"regions":
{
},
"selection":
[
[
0,
0
]
],
"settings":
{
"is_init_dirty_state": false,
"origin_encoding": "UTF-8",
"syntax": "Packages/Python/Python.sublime-syntax",
"tab_size": 4,
"translate_tabs_to_spaces": true
},
"translation.x": 0.0,
"translation.y": 0.0,
"zoom_level": 1.0
},
"stack_index": 3,
"stack_multiselect": false,
"type": "text"
}
]
}
],
"incremental_find":
{
"height": 24.0
},
"input":
{
"height": 36.0
},
"layout":
{
"cells":
[
[
0,
0,
1,
1
]
],
"cols":
[
0.0,
1.0
],
"rows":
[
0.0,
1.0
]
},
"menu_visible": true,
"output.SublimeLinter":
{
"height": 0.0
},
"output.autopep8":
{
"height": 108.0
},
"output.exec":
{
"height": 108.0
},
"output.find_results":
{
"height": 0.0
},
"pinned_build_system": "",
"project": "",
"replace":
{
"height": 44.0
},
"save_all_on_build": true,
"select_file":
{
"height": 0.0,
"last_filter": "",
"selected_items":
[
[
"stre",
"deva/stream.py"
],
[
"str",
"deva/stream.py"
]
],
"width": 0.0
},
"select_project":
{
"height": 500.0,
"last_filter": "",
"selected_items":
[
[
"",
"~/pycharmproject/deva/deva.sublime-workspace"
]
],
"width": 380.0
},
"select_symbol":
{
"height": 0.0,
"last_filter": "",
"selected_items":
[
],
"width": 0.0
},
"selected_group": 0,
"settings":
{
},
"show_minimap": true,
"show_open_files": false,
"show_tabs": true,
"side_bar_visible": true,
"side_bar_width": 150.0,
"status_bar_visible": true,
"template_settings":
{
}
}