-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCindyPrint.js
624 lines (622 loc) · 302 KB
/
CindyPrint.js
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
(function(){
var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1;$jscomp.ISOLATE_POLYFILLS=!1;$jscomp.FORCE_POLYFILL_PROMISE=!1;$jscomp.FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,n){if(a==Array.prototype||a==Object.prototype)return a;a[b]=n.value;return a};
$jscomp.getGlobal=function(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var n=a[b];if(n&&n.Math==Math)return n}throw Error("Cannot find global object");};$jscomp.global=$jscomp.getGlobal(this);$jscomp.IS_SYMBOL_NATIVE="function"===typeof Symbol&&"symbol"===typeof Symbol("x");$jscomp.TRUST_ES6_POLYFILLS=!$jscomp.ISOLATE_POLYFILLS||$jscomp.IS_SYMBOL_NATIVE;$jscomp.polyfills={};
$jscomp.propertyToPolyfillSymbol={};$jscomp.POLYFILL_PREFIX="$jscp$";var $jscomp$lookupPolyfilledValue=function(a,b){var n=$jscomp.propertyToPolyfillSymbol[b];if(null==n)return a[b];n=a[n];return void 0!==n?n:a[b]};$jscomp.polyfill=function(a,b,n,d){b&&($jscomp.ISOLATE_POLYFILLS?$jscomp.polyfillIsolated(a,b,n,d):$jscomp.polyfillUnisolated(a,b,n,d))};
$jscomp.polyfillUnisolated=function(a,b,n,d){n=$jscomp.global;a=a.split(".");for(d=0;d<a.length-1;d++){var l=a[d];if(!(l in n))return;n=n[l]}a=a[a.length-1];d=n[a];b=b(d);b!=d&&null!=b&&$jscomp.defineProperty(n,a,{configurable:!0,writable:!0,value:b})};
$jscomp.polyfillIsolated=function(a,b,n,d){var l=a.split(".");a=1===l.length;d=l[0];d=!a&&d in $jscomp.polyfills?$jscomp.polyfills:$jscomp.global;for(var g=0;g<l.length-1;g++){var c=l[g];if(!(c in d))return;d=d[c]}l=l[l.length-1];n=$jscomp.IS_SYMBOL_NATIVE&&"es6"===n?d[l]:null;b=b(n);null!=b&&(a?$jscomp.defineProperty($jscomp.polyfills,l,{configurable:!0,writable:!0,value:b}):b!==n&&(void 0===$jscomp.propertyToPolyfillSymbol[l]&&(n=1E9*Math.random()>>>0,$jscomp.propertyToPolyfillSymbol[l]=$jscomp.IS_SYMBOL_NATIVE?
$jscomp.global.Symbol(l):$jscomp.POLYFILL_PREFIX+n+"$"+l),$jscomp.defineProperty(d,$jscomp.propertyToPolyfillSymbol[l],{configurable:!0,writable:!0,value:b})))};$jscomp.underscoreProtoCanBeSet=function(){var a={a:!0},b={};try{return b.__proto__=a,b.a}catch(n){}return!1};
$jscomp.setPrototypeOf=$jscomp.TRUST_ES6_POLYFILLS&&"function"==typeof Object.setPrototypeOf?Object.setPrototypeOf:$jscomp.underscoreProtoCanBeSet()?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+" is not extensible");return a}:null;$jscomp.arrayIteratorImpl=function(a){var b=0;return function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}}};$jscomp.arrayIterator=function(a){return{next:$jscomp.arrayIteratorImpl(a)}};
$jscomp.makeIterator=function(a){var b="undefined"!=typeof Symbol&&Symbol.iterator&&a[Symbol.iterator];return b?b.call(a):$jscomp.arrayIterator(a)};$jscomp.generator={};$jscomp.generator.ensureIteratorResultIsObject_=function(a){if(!(a instanceof Object))throw new TypeError("Iterator result "+a+" is not an object");};
$jscomp.generator.Context=function(){this.isRunning_=!1;this.yieldAllIterator_=null;this.yieldResult=void 0;this.nextAddress=1;this.finallyAddress_=this.catchAddress_=0;this.finallyContexts_=this.abruptCompletion_=null};$jscomp.generator.Context.prototype.start_=function(){if(this.isRunning_)throw new TypeError("Generator is already running");this.isRunning_=!0};$jscomp.generator.Context.prototype.stop_=function(){this.isRunning_=!1};
$jscomp.generator.Context.prototype.jumpToErrorHandler_=function(){this.nextAddress=this.catchAddress_||this.finallyAddress_};$jscomp.generator.Context.prototype.next_=function(a){this.yieldResult=a};$jscomp.generator.Context.prototype.throw_=function(a){this.abruptCompletion_={exception:a,isException:!0};this.jumpToErrorHandler_()};$jscomp.generator.Context.prototype.return=function(a){this.abruptCompletion_={return:a};this.nextAddress=this.finallyAddress_};
$jscomp.generator.Context.prototype.jumpThroughFinallyBlocks=function(a){this.abruptCompletion_={jumpTo:a};this.nextAddress=this.finallyAddress_};$jscomp.generator.Context.prototype.yield=function(a,b){this.nextAddress=b;return{value:a}};$jscomp.generator.Context.prototype.yieldAll=function(a,b){a=$jscomp.makeIterator(a);var n=a.next();$jscomp.generator.ensureIteratorResultIsObject_(n);if(n.done)this.yieldResult=n.value,this.nextAddress=b;else return this.yieldAllIterator_=a,this.yield(n.value,b)};
$jscomp.generator.Context.prototype.jumpTo=function(a){this.nextAddress=a};$jscomp.generator.Context.prototype.jumpToEnd=function(){this.nextAddress=0};$jscomp.generator.Context.prototype.setCatchFinallyBlocks=function(a,b){this.catchAddress_=a;void 0!=b&&(this.finallyAddress_=b)};$jscomp.generator.Context.prototype.setFinallyBlock=function(a){this.catchAddress_=0;this.finallyAddress_=a||0};$jscomp.generator.Context.prototype.leaveTryBlock=function(a,b){this.nextAddress=a;this.catchAddress_=b||0};
$jscomp.generator.Context.prototype.enterCatchBlock=function(a){this.catchAddress_=a||0;a=this.abruptCompletion_.exception;this.abruptCompletion_=null;return a};$jscomp.generator.Context.prototype.enterFinallyBlock=function(a,b,n){n?this.finallyContexts_[n]=this.abruptCompletion_:this.finallyContexts_=[this.abruptCompletion_];this.catchAddress_=a||0;this.finallyAddress_=b||0};
$jscomp.generator.Context.prototype.leaveFinallyBlock=function(a,b){b=this.finallyContexts_.splice(b||0)[0];if(b=this.abruptCompletion_=this.abruptCompletion_||b){if(b.isException)return this.jumpToErrorHandler_();void 0!=b.jumpTo&&this.finallyAddress_<b.jumpTo?(this.nextAddress=b.jumpTo,this.abruptCompletion_=null):this.nextAddress=this.finallyAddress_}else this.nextAddress=a};$jscomp.generator.Context.prototype.forIn=function(a){return new $jscomp.generator.Context.PropertyIterator(a)};
$jscomp.generator.Context.PropertyIterator=function(a){this.object_=a;this.properties_=[];for(var b in a)this.properties_.push(b);this.properties_.reverse()};$jscomp.generator.Context.PropertyIterator.prototype.getNext=function(){for(;0<this.properties_.length;){var a=this.properties_.pop();if(a in this.object_)return a}return null};$jscomp.generator.Engine_=function(a){this.context_=new $jscomp.generator.Context;this.program_=a};
$jscomp.generator.Engine_.prototype.next_=function(a){this.context_.start_();if(this.context_.yieldAllIterator_)return this.yieldAllStep_(this.context_.yieldAllIterator_.next,a,this.context_.next_);this.context_.next_(a);return this.nextStep_()};
$jscomp.generator.Engine_.prototype.return_=function(a){this.context_.start_();var b=this.context_.yieldAllIterator_;if(b)return this.yieldAllStep_("return"in b?b["return"]:function(n){return{value:n,done:!0}},a,this.context_.return);this.context_.return(a);return this.nextStep_()};
$jscomp.generator.Engine_.prototype.throw_=function(a){this.context_.start_();if(this.context_.yieldAllIterator_)return this.yieldAllStep_(this.context_.yieldAllIterator_["throw"],a,this.context_.next_);this.context_.throw_(a);return this.nextStep_()};
$jscomp.generator.Engine_.prototype.yieldAllStep_=function(a,b,n){try{var d=a.call(this.context_.yieldAllIterator_,b);$jscomp.generator.ensureIteratorResultIsObject_(d);if(!d.done)return this.context_.stop_(),d;var l=d.value}catch(g){return this.context_.yieldAllIterator_=null,this.context_.throw_(g),this.nextStep_()}this.context_.yieldAllIterator_=null;n.call(this.context_,l);return this.nextStep_()};
$jscomp.generator.Engine_.prototype.nextStep_=function(){for(;this.context_.nextAddress;)try{var a=this.program_(this.context_);if(a)return this.context_.stop_(),{value:a.value,done:!1}}catch(b){this.context_.yieldResult=void 0,this.context_.throw_(b)}this.context_.stop_();if(this.context_.abruptCompletion_){a=this.context_.abruptCompletion_;this.context_.abruptCompletion_=null;if(a.isException)throw a.exception;return{value:a.return,done:!0}}return{value:void 0,done:!0}};
$jscomp.generator.Generator_=function(a){this.next=function(b){return a.next_(b)};this.throw=function(b){return a.throw_(b)};this.return=function(b){return a.return_(b)};this[Symbol.iterator]=function(){return this}};$jscomp.generator.createGenerator=function(a,b){b=new $jscomp.generator.Generator_(new $jscomp.generator.Engine_(b));$jscomp.setPrototypeOf&&a.prototype&&$jscomp.setPrototypeOf(b,a.prototype);return b};
$jscomp.asyncExecutePromiseGenerator=function(a){function b(d){return a.next(d)}function n(d){return a.throw(d)}return new Promise(function(d,l){function g(c){c.done?d(c.value):Promise.resolve(c.value).then(b,n).then(g,l)}g(a.next())})};$jscomp.asyncExecutePromiseGeneratorFunction=function(a){return $jscomp.asyncExecutePromiseGenerator(a())};$jscomp.asyncExecutePromiseGeneratorProgram=function(a){return $jscomp.asyncExecutePromiseGenerator(new $jscomp.generator.Generator_(new $jscomp.generator.Engine_(a)))};
$jscomp.owns=function(a,b){return Object.prototype.hasOwnProperty.call(a,b)};$jscomp.polyfill("Object.entries",function(a){return a?a:function(b){var n=[],d;for(d in b)$jscomp.owns(b,d)&&n.push([d,b[d]]);return n}},"es8","es3");
let coerce={toList:function(a,b=null){return"list"!==a.ctype?(console.log("argument is not a list"),b):a.value},toHomog:function(a,b=[0,0,0,0],n=3){a=coerce.toList(a);if(null===a)return b;b=a.map(coerce.toReal);b.length>n+1&&(console.log("Coordinate vector too long."),b=b.slice(0,n+1));for(;b.length<n;)b.push(0);b.length===n&&b.push(1);return b},toDirection:function(a,b=[0,0,0]){a=coerce.toList(a);if(null===a)return b;b=a.map(coerce.toReal);3<b.length&&(console.log("Coordinate vector too long."),
b=b.slice(0,3));for(;3>b.length;)b.push(0);return b},toDirectionPoint:function(a,b=[0,0,0,0]){a=coerce.toDirection(a,b);a!==b&&(a[3]=0);return a},toColor:function(a,b=[.5,.5,.5]){if("number"===a.ctype){let n=coerce.toInterval(0,1,a);if(!isNaN(n))return[n,n,n]}a=coerce.toList(a);return null===a?b:3!=a.length?(console.log("Not an RGB color vector"),b):a.map(n=>coerce.toInterval(0,1,n))},toReal:function(a,b=Number.NaN){if("number"!==a.ctype)return console.log("argument is not a number"),b;a=a.value;
b=a.real;0!==a.imag&&console.log("complex number is not real");return b},toInt:function(a,b=Number.NaN){if("number"!==a.ctype)return console.log("argument is not a number"),b;b=a.value;a=b.real;b=b.imag;0!==b&&console.log("complex number is not real");b=Math.round(a);b!==a&&console.log("number is not an integer");return b},clamp:function(a,b,n){return n<a?a:n>b?b:n},toInterval:function(a,b,n,d=Number.NaN){return coerce.clamp(a,b,coerce.toReal(n,d))},toString:function(a,b=null){if("string"===a.ctype)return a.value;
console.log("argument is not a string");return b},toEnum:function(a,b,n=null){b=coerce.toString(b,n);if(b!==n&&-1!==a.indexOf(b))return b;console.log("argument is not one of "+a.join(", "));return n},toBool:function(a,b){if("boolean"===a.ctype)return a.value;console.log("argument is not boolean");return b}};function norm3(a){let b=a[0],n=a[1];a=a[2];return Math.sqrt(b*b+n*n+a*a)}function normalized3(a){let b=a[0],n=a[1];a=a[2];let d=1/Math.sqrt(b*b+n*n+a*a);return[d*b,d*n,d*a]}function dehom3(a){let b=1/a[3];return[b*a[0],b*a[1],b*a[2]]}function scale3(a,b){return[a*b[0],a*b[1],a*b[2]]}function transpose3(a){return[a[0],a[3],a[6],a[1],a[4],a[7],a[2],a[5],a[8]]}function transpose4(a){return[a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15]]}
function adj3(a){return[a[4]*a[8]-a[5]*a[7],a[2]*a[7]-a[1]*a[8],a[1]*a[5]-a[2]*a[4],a[5]*a[6]-a[3]*a[8],a[0]*a[8]-a[2]*a[6],a[2]*a[3]-a[0]*a[5],a[3]*a[7]-a[4]*a[6],a[1]*a[6]-a[0]*a[7],a[0]*a[4]-a[1]*a[3]]}function sub3(a,b){return[a[0]-b[0],a[1]-b[1],a[2]-b[2]]}function add3(a,b){return[a[0]+b[0],a[1]+b[1],a[2]+b[2]]}function add4(a,b){return[a[0]+b[0],a[1]+b[1],a[2]+b[2],a[3]+b[3]]}function cross3(a,b){return[a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]]}
function mul4mm(a,b){return[a[0]*b[0]+a[1]*b[4]+a[2]*b[8]+a[3]*b[12],a[0]*b[1]+a[1]*b[5]+a[2]*b[9]+a[3]*b[13],a[0]*b[2]+a[1]*b[6]+a[2]*b[10]+a[3]*b[14],a[0]*b[3]+a[1]*b[7]+a[2]*b[11]+a[3]*b[15],a[4]*b[0]+a[5]*b[4]+a[6]*b[8]+a[7]*b[12],a[4]*b[1]+a[5]*b[5]+a[6]*b[9]+a[7]*b[13],a[4]*b[2]+a[5]*b[6]+a[6]*b[10]+a[7]*b[14],a[4]*b[3]+a[5]*b[7]+a[6]*b[11]+a[7]*b[15],a[8]*b[0]+a[9]*b[4]+a[10]*b[8]+a[11]*b[12],a[8]*b[1]+a[9]*b[5]+a[10]*b[9]+a[11]*b[13],a[8]*b[2]+a[9]*b[6]+a[10]*b[10]+a[11]*b[14],a[8]*b[3]+a[9]*
b[7]+a[10]*b[11]+a[11]*b[15],a[12]*b[0]+a[13]*b[4]+a[14]*b[8]+a[15]*b[12],a[12]*b[1]+a[13]*b[5]+a[14]*b[9]+a[15]*b[13],a[12]*b[2]+a[13]*b[6]+a[14]*b[10]+a[15]*b[14],a[12]*b[3]+a[13]*b[7]+a[14]*b[11]+a[15]*b[15]]}function mul3mv(a,b){return[a[0]*b[0]+a[1]*b[1]+a[2]*b[2],a[3]*b[0]+a[4]*b[1]+a[5]*b[2],a[6]*b[0]+a[7]*b[1]+a[8]*b[2]]}
function mul4mv(a,b){return[a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3],a[4]*b[0]+a[5]*b[1]+a[6]*b[2]+a[7]*b[3],a[8]*b[0]+a[9]*b[1]+a[10]*b[2]+a[11]*b[3],a[12]*b[0]+a[13]*b[1]+a[14]*b[2]+a[15]*b[3]]}function transform4to3(a,b){let n=1/(a[12]*b[0]+a[13]*b[1]+a[14]*b[2]+a[15]*b[3]);return[(a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3])*n,(a[4]*b[0]+a[5]*b[1]+a[6]*b[2]+a[7]*b[3])*n,(a[8]*b[0]+a[9]*b[1]+a[10]*b[2]+a[11]*b[3])*n]}
function triangleNormal(a,b,n){a=dehom3(a);b=sub3(dehom3(b),a);n=sub3(dehom3(n),a);return normalized3(cross3(b,n))};function GlError(a){this.message=a}GlError.prototype.toString=function(){return this.message};
function ShaderProgram(a,b,n){this.handle=a.createProgram();a.webgl2&&(b="#version 300 es\n"+b.replace(/attribute/g,"in").replace(/varying/g,"out"),n="#version 300 es\n"+n.replace(/varying/g,"in").replace(/gl_FragColor/g,"FragColor").replace(/texture2D/g,"texture").replace(/precision highp float;/g,"precision highp float;\n#define webgl2 true\nout vec4 FragColor;"));this.vs=this.createShader(a,a.VERTEX_SHADER,b);this.fs=this.createShader(a,a.FRAGMENT_SHADER,n);this.link(a);this.detectUniforms(a)}
ShaderProgram.prototype.createShader=function(a,b,n){b=a.createShader(b);a.shaderSource(b,n);a.compileShader(b);if(!a.getShaderParameter(b,a.COMPILE_STATUS))throw console.warn(n.split("\n")),new GlError("Error compiling shader:\n"+a.getShaderInfoLog(b));a.attachShader(this.handle,b);return b};ShaderProgram.prototype.use=function(a){a.useProgram(this.handle);return this};
ShaderProgram.prototype.link=function(a){let b=this.handle;a.linkProgram(b);if(!a.getProgramParameter(b,a.LINK_STATUS))throw new GlError("Error linking shader:\n"+a.getProgramInfoLog(b));a.validateProgram(b);if(!a.getProgramParameter(b,a.VALIDATE_STATUS))throw new GlError("Error validating shader:\n"+a.getProgramInfoLog(b));};ShaderProgram.prototype.dispose=function(a){a.detachShader(this.handle,this.vs);a.deleteShader(this.vs);a.detachShader(this.handle,this.fs);a.deleteShader(this.fs);a.deleteProgram(this.handle)};
ShaderProgram.prototype.detectUniforms=function(a){this.uniform=this.detectImpl(a,!0)};ShaderProgram.prototype.detectAttributes=function(a){this.attrib=this.detectImpl(a,!1)};
ShaderProgram.prototype.detectImpl=function(a,b){let n,d,l=this.handle,g,c;var m;let h={},e;let f;d=b?a.getProgramParameter(l,a.ACTIVE_UNIFORMS):a.getProgramParameter(l,a.ACTIVE_ATTRIBUTES);for(n=0;n<d;++n)if(g=b?a.getActiveUniform(l,n):a.getActiveAttrib(l,n),null!==g&&(c=g.name.replace(/\]/g,""))){for(e=h;null!==(m=/[.\[]/.exec(c));){var k=c.substr(0,m.index);e=e.hasOwnProperty(k)?e[k]:"."===m[0]?e[k]={}:e[k]=[];c=c.substr(m.index+1)}if(1<g.size){m=g.size;f=Array(m);for(k=0;k<m;++k){var p=g.name+
"["+k+"]";p=b?this.uniformSetter(a,p,g):this.attribFactory(a,p,g);f[k]=p}e[c]=f}else p=b?this.uniformSetter(a,g.name,g):this.attribFactory(a,g.name,g),e[c]=p}return h};
ShaderProgram.prototype.uniformSetter=function(a,b,n){let d;d=a.getUniformLocation(this.handle,b);switch(n.type){case a.FLOAT:return a.uniform1fv.bind(a,d);case a.FLOAT_VEC2:return a.uniform2fv.bind(a,d);case a.FLOAT_VEC3:return a.uniform3fv.bind(a,d);case a.FLOAT_VEC4:return a.uniform4fv.bind(a,d);case a.BOOL:case a.INT:case a.SAMPLER_2D:case a.SAMPLER_CUBE:return a.uniform1iv.bind(a,d);case a.BOOL_VEC2:case a.INT_VEC2:return a.uniform2iv.bind(a,d);case a.BOOL_VEC3:case a.INT_VEC3:return a.uniform3iv.bind(a,
d);case a.BOOL_VEC4:case a.INT_VEC4:return a.uniform4iv.bind(a,d);case a.FLOAT_MAT2:return a.uniformMatrix2fv.bind(a,d,!1);case a.FLOAT_MAT3:return a.uniformMatrix3fv.bind(a,d,!1);case a.FLOAT_MAT4:return a.uniformMatrix4fv.bind(a,d,!1);default:throw new GlError("Unknown data type for uniform "+b);}};
ShaderProgram.prototype.attribFactory=function(a,b,n){let d;d=a.getAttribLocation(this.handle,b);switch(n.type){case a.FLOAT:return new VertexAttribute(a,d,a.vertexAttrib1fv.bind(a,d));case a.FLOAT_VEC2:return new VertexAttribute(a,d,a.vertexAttrib2fv.bind(a,d));case a.FLOAT_VEC3:return new VertexAttribute(a,d,a.vertexAttrib3fv.bind(a,d));case a.FLOAT_VEC4:return new VertexAttribute(a,d,a.vertexAttrib4fv.bind(a,d));default:throw new GlError("Unknown data type for vertex attribute "+b);}};
function VertexAttribute(a,b,n){this.gl=a;this.location=b;this.set=n};(function(a){"object"===typeof exports&&"undefined"!==typeof module?module.exports=a():"function"===typeof define&&define.amd?define([],a):("undefined"!==typeof window?window:"undefined"!==typeof global?global:"undefined"!==typeof self?self:this).csg=a()})(function(){return function(){function a(b,n,d){function l(m,h){if(!n[m]){if(!b[m]){var e="function"==typeof require&&require;if(!h&&e)return e(m,!0);if(g)return g(m,!0);h=Error("Cannot find module '"+m+"'");throw h.code="MODULE_NOT_FOUND",h;}h=
n[m]={exports:{}};b[m][0].call(h.exports,function(f){return l(b[m][1][f]||f)},h,h.exports,a,b,n,d)}return n[m].exports}for(var g="function"==typeof require&&require,c=0;c<d.length;c++)l(d[c]);return l}return a}()({1:[function(a,b,n){({addTransformationMethodsToPrototype:n}=a("./src/core/mutators"));let d=a("./src/core/CSG"),l=a("./src/core/CAG");const {_CSGDEBUG:g,defaultResolution2D:c,defaultResolution3D:m,EPS:h,angleEPS:e,areaEPS:f,all:k,top:p,bottom:q,left:r,right:t,front:A,back:x,staticTag:D,
getTag:u}=a("./src/core/constants");d._CSGDEBUG=g;d.defaultResolution2D=c;d.defaultResolution3D=m;d.EPS=h;d.angleEPS=e;d.areaEPS=f;d.all=k;d.top=p;d.bottom=q;d.left=r;d.right=t;d.front=A;d.back=x;d.staticTag=D;d.getTag=u;d.Vector2D=a("./src/core/math/Vector2");d.Vector3D=a("./src/core/math/Vector3");d.Vertex=a("./src/core/math/Vertex3");l.Vertex=a("./src/core/math/Vertex2");d.Plane=a("./src/core/math/Plane");d.Polygon=a("./src/core/math/Polygon3");d.Polygon2D=a("./src/core/math/Polygon2");d.Line2D=
a("./src/core/math/Line2");d.Line3D=a("./src/core/math/Line3");d.Path2D=a("./src/core/math/Path2");d.OrthoNormalBasis=a("./src/core/math/OrthoNormalBasis");d.Matrix4x4=a("./src/core/math/Matrix4");l.Side=a("./src/core/math/Side");d.Connector=a("./src/core/connectors").Connector;d.ConnectorList=a("./src/core/connectors").ConnectorList;d.Properties=a("./src/core/Properties");const {circle:v,ellipse:y,rectangle:C,roundedRectangle:w}=a("./src/api/primitives2d"),{sphere:z,cube:B,roundedCube:E,cylinder:H,
roundedCylinder:F,cylinderElliptic:G,polyhedron:I}=a("./src/api/primitives3d");d.sphere=z;d.cube=B;d.roundedCube=E;d.cylinder=H;d.roundedCylinder=F;d.cylinderElliptic=G;d.polyhedron=I;l.circle=v;l.ellipse=y;l.rectangle=C;l.roundedRectangle=w;const {fromPolygons:J,fromCompactBinary:M,fromObject:N,fromSlices:K}=a("./src/core/CSGFactories");d.fromCompactBinary=M;d.fromObject=N;d.fromSlices=K;d.fromPolygons=J;d.toPointCloud=a("./src/api/debugHelpers").toPointCloud;var L=a("./src/core/CAGFactories");l.fromSides=
L.fromSides;l.fromObject=L.fromObject;l.fromPoints=L.fromPoints;l.fromPointsNoCheck=L.fromPointsNoCheck;l.fromPath2=L.fromPath2;l.fromFakeCSG=L.fromFakeCSG;l.fromCompactBinary=L.fromCompactBinary;L=a("./src/api/optionParsers");n(d.prototype);n(d.Vector2D.prototype);n(d.Vector3D.prototype);n(d.Vertex.prototype);n(d.Plane.prototype);n(d.Polygon.prototype);n(d.Line2D.prototype);n(d.Line3D.prototype);n(d.Path2D.prototype);n(d.OrthoNormalBasis.prototype);n(d.Connector.prototype);n(l.prototype);n(l.Side.prototype);
n(l.Vertex.prototype);d.parseOptionAs2DVector=L.parseOptionAs3DVector;d.parseOptionAs3DVector=L.parseOptionAs3DVector;d.parseOptionAs3DVectorList=L.parseOptionAs3DVectorList;d.parseOptionAsBool=L.parseOptionAsBool;d.parseOptionAsFloat=L.parseOptionAsFloat;d.parseOptionAsInt=L.parseOptionAsInt;d.Polygon2D.prototype=l.prototype;const {isCAG:O,isCSG:P}=a("./src/core/utils");a=Object.assign({},{CSG:d,CAG:l},L,{isCAG:O,isCSG:P});b.exports=a},{"./src/api/debugHelpers":4,"./src/api/optionParsers":11,"./src/api/primitives2d":12,
"./src/api/primitives3d":13,"./src/core/CAG":15,"./src/core/CAGFactories":16,"./src/core/CSG":17,"./src/core/CSGFactories":18,"./src/core/Properties":22,"./src/core/connectors":23,"./src/core/constants":24,"./src/core/math/Line2":25,"./src/core/math/Line3":26,"./src/core/math/Matrix4":27,"./src/core/math/OrthoNormalBasis":28,"./src/core/math/Path2":29,"./src/core/math/Plane":30,"./src/core/math/Polygon2":31,"./src/core/math/Polygon3":32,"./src/core/math/Side":33,"./src/core/math/Vector2":34,"./src/core/math/Vector3":35,
"./src/core/math/Vertex2":36,"./src/core/math/Vertex3":37,"./src/core/mutators":40,"./src/core/utils":42}],2:[function(a,b,n){const d=a("../core/math/Path2");b.exports=function(l){let g={},c={};l.canonicalized().sides.map(function(k){let p=k.getTag();g[p]=k;k=k.vertex0.getTag();k in c||(c[k]=[]);c[k].push(p)});for(l=[];;){var m=null;for(let k in c){var h=c[k];m=h[0];h.splice(0,1);0===h.length&&delete c[k];break}if(null===m)break;h=[];var e=g[m];for(m=e.vertex0.getTag();;){h.push(e.vertex0.pos);let k=
e.vertex1.getTag();if(k===m)break;if(!(k in c))throw Error("Area is not closed!");let p=c[k],q=-1;if(1===p.length)q=0;else{var f=null;e=e.direction().angleDegrees();for(let r=0;r<p.length;r++){let t=g[p[r]].direction().angleDegrees()-e;-180>t&&(t+=360);180<=t&&(t-=360);if(0>q||t>f)q=r,f=t}}f=p[q];p.splice(q,1);0===p.length&&delete c[k];e=g[f]}0<h.length&&h.push(h.shift());h=new d(h,!0);l.push(h)}return l}},{"../core/math/Path2":29}],3:[function(a,b,n){const d=a("../core/utils/toArray");b.exports=
function(l,g){l=Object.assign({},{axes:[!0,!0,!0],center:[0,0,0]},l);const {axes:c,center:m}=l;g=d(g);l=g.map(function(h){let e=h.getBounds(),f=[0,0,0];c[0]&&(f[0]=m[0]-(e[0].x+(e[1].x-e[0].x)/2));c[1]&&(f[1]=m[1]-(e[0].y+(e[1].y-e[0].y)/2));c[2]&&(f[2]=m[2]-(e[0].z+(e[1].y-e[0].y)/2));return h.translate(f)});return 1===l.length?l[0]:l}},{"../core/utils/toArray":50}],4:[function(a,b,n){const d=a("../core/CSG"),{cube:l}=a("./primitives3d");b.exports={toPointCloud:function(g,c){g=g.reTesselated();let m=
new d,h={};g.polygons.map(function(e){e.vertices.map(function(f){h[f.getTag()]=f.pos})});for(let e in h)g=l({center:h[e],radius:c}),m=m.unionSub(g,!1,!1);return m=m.reTesselated()}}},{"../core/CSG":17,"./primitives3d":13}],5:[function(a,b,n){const d=a("../core/math/Vertex3"),l=a("../core/math/Vector3"),g=a("../core/math/Polygon3");b.exports={cagToPointsArray:c=>{let m;"sides"in c?(m=[],c.sides.forEach(h=>{m.push([h.vertex0.pos.x,h.vertex0.pos.y]);m.push([h.vertex1.pos.x,h.vertex1.pos.y])})):"points"in
c&&(m=c.points.map(h=>[h.x,h.y]));return m},clamp:function(c,m,h){return Math.min(Math.max(c,m),h)},rightMultiply1x3VectorToArray:(c,m)=>{const [h,e,f]=m;m=h*c.elements[0]+e*c.elements[1]+f*c.elements[2]+1*c.elements[3];let k=h*c.elements[4]+e*c.elements[5]+f*c.elements[6]+1*c.elements[7],p=h*c.elements[8]+e*c.elements[9]+f*c.elements[10]+1*c.elements[11];c=h*c.elements[12]+e*c.elements[13]+f*c.elements[14]+1*c.elements[15];1!==c&&(c=1/c,m*=c,k*=c,p*=c);return[m,k,p]},polygonFromPoints:c=>{c=c.map(m=>
new d(new l(m)));return new g(c)}}},{"../core/math/Polygon3":32,"../core/math/Vector3":35,"../core/math/Vertex3":37}],6:[function(a,b,n){const {isCAG:d}=a("../core/utils");b.exports={union:function(){let l={};var g={extrude2d:!1};let c=0,m=arguments;m[0].length&&(m=m[0]);"extrude2d"in m[0]&&(l=Object.assign({},g,m[0]),c++);g=m[c++];for("object"===typeof m[c]&&d(m[c])&&l.extrude2d&&(g=m[c].extrude({offset:[0,0,.1]}));c<m.length;c++){let h=m[c];"object"===typeof m[c]&&d(m[c])&&l.extrude2d&&(h=m[c].extrude({offset:[0,
0,.1]}));g=g.union(h)}return g},difference:function(){let l,g=0,c=arguments;c[0].length&&(c=c[0]);for(l=c[g++];g<c.length;g++)l=d(c[g])?l.subtract(c[g]):l.subtract(c[g].setColor(1,1,0));return l},intersection:function(){let l,g=0,c=arguments;c[0].length&&(c=c[0]);for(l=c[g++];g<c.length;g++)l=d(c[g])?l.intersect(c[g]):l.intersect(c[g].setColor(1,1,0));return l}}},{"../core/utils":42}],7:[function(a,b,n){const d=a("../core/math/Matrix4.js"),l=a("../core/math/Vector3.js"),{Connector:g}=a("../core/connectors.js"),
{fromPoints:c}=a("../core/CAGFactories"),m=a("../core/math/Vector2");b.exports={lieFlat:function(h){let e=h.getTransformationToFlatLying();return h.transform(e)},getTransformationToFlatLying:function(h){return h.getTransformationAndInverseTransformationToFlatLying()[0]},getTransformationAndInverseTransformationToFlatLying:function(h){if(0===h.polygons.length){var e=new d;return[e,e]}h=h.canonicalized();let f={};h.polygons.map(function(B){f[B.plane.getTag()]=B.plane});let k=new l(1,0,0),p=new l(0,
1,0),q=new l(0,0,1),r=new g([0,0,0],[0,0,-1],k),t=new g([0,0,0],[0,0,-1],p);var A=!0;let x=0,D=0;let u;for(e in f){var v=f[e],y=v.normal.times(v.w),C=void 0;C=v.normal.cross(k).length();var w=v.normal.cross(p).length();C>w?(C=new g(y,v.normal,k),y=C.getTransformationTo(r,!1,0),C=r.getTransformationTo(C,!1,0)):(C=new g(y,v.normal,p),y=C.getTransformationTo(t,!1,0),C=t.getTransformationTo(C,!1,0));w=h.transform(y);v=-v.normal.dot(q);let B=w.getBounds();w=B[1].z-B[0].z;A||(w<x?A=!0:w===x&&v>D&&(A=!0));
if(A){var z=new l([-.5*(B[1].x+B[0].x),-.5*(B[1].y+B[0].y),-B[0].z]);y=y.multiply(d.translation(z));C=d.translation(z.negated()).multiply(C);x=w;D=v;z=y;u=C}A=!1}return[z,u]},overCutInsideCorners:function(h,e){h=h.canonicalized();let f={};h.sides.map(function(x){x.vertex0.getTag()in f||(f[x.vertex0.getTag()]={pos:x.vertex0.pos,from:[],to:[]});f[x.vertex0.getTag()].to.push(x.vertex1.pos);x.vertex1.getTag()in f||(f[x.vertex1.getTag()]={pos:x.vertex1.pos,from:[],to:[]});f[x.vertex1.getTag()].from.push(x.vertex0.pos)});
let k=[];for(let x in f){var p=f[x];if(1===p.from.length&&1===p.to.length){var q=p.pos,r=p.to[0];p=q.minus(p.from[0]).unit();r=r.minus(q).unit();if(.001>p.cross(r)){var t=r.angleRadians()-p.angleRadians()+Math.PI;0>t?t+=2*Math.PI:t>=2*Math.PI&&(t-=2*Math.PI);r=r.minus(p).unit();var A=30/180*Math.PI;p=e/Math.cos(A/2);q=q.plus(r.times(p));r=t+r.angleRadians();t=2*(Math.PI-t);A=2*Math.ceil(t/A/2);let D=[q];for(let u=0;u<=A;u++){let v=m.fromAngleRadians(r+u/A*t).times(p).plus(q);D.push(v)}k.push(c(D))}}}return h.subtract(k)}}},
{"../core/CAGFactories":16,"../core/connectors.js":23,"../core/math/Matrix4.js":27,"../core/math/Vector2":34,"../core/math/Vector3.js":35}],8:[function(a,b,n){const {EPS:d}=a("../core/constants"),l=a("../core/math/Plane"),g=a("../core/math/Vector2"),c=a("../core/math/Vertex3"),m=a("../core/math/Polygon3"),h=a("../core/math/OrthoNormalBasis");b.exports={sectionCut:function(e,f){let k=f.plane,p=f.plane.flipped();k=new l(k.normal,k.w);p=new l(p.normal,p.w+5*d);e=e.cutByPlane(k);e=e.cutByPlane(p);return e.projectToOrthoNormalBasis(f)},
cutByPlane:function(e,f){if(0===e.polygons.length)return new (a("../core/CSG"));let k=f.normal.times(f.w),p=0;e.polygons.map(function(t){t.vertices.map(function(A){A=A.pos.distanceToSquared(k);A>p&&(p=A)})});p=Math.sqrt(p);p*=1.01;let q=[],r=new h(f);q.push(new c(r.to3D(new g(p,-p))));q.push(new c(r.to3D(new g(-p,-p))));q.push(new c(r.to3D(new g(-p,p))));q.push(new c(r.to3D(new g(p,p))));f=(new m(q,null,f.flipped())).extrude(f.normal.times(-p));f=e.intersect(f);f.properties=e.properties;return f}}},
{"../core/CSG":17,"../core/constants":24,"../core/math/OrthoNormalBasis":28,"../core/math/Plane":30,"../core/math/Polygon3":32,"../core/math/Vector2":34,"../core/math/Vertex3":37}],9:[function(a,b,n){const {EPS:d,angleEPS:l}=a("../core/constants"),g=a("../core/math/Vertex3"),c=a("../core/math/Vector2"),m=a("../core/math/Polygon3"),{fnNumberSort:h,isCSG:e}=a("../core/utils"),{fromPoints:f,fromPointsNoCheck:k}=a("../core/CAGFactories"),p=function(r,t,A){const x=a("../core/CAG");A=A||8;4>A&&(A=4);let D=
[],u={};r.canonicalized().sides.map(function(z){var B=z.vertex1.pos.minus(z.vertex0.pos),E=B.length();if(E>d)for(B=B.times(1/E),B=B.normal().times(t),B=[z.vertex1.pos.plus(B),z.vertex1.pos.minus(B),z.vertex0.pos.minus(B),z.vertex0.pos.plus(B)],B=f(B),D.push(B),B=0;2>B;B++){E=0===B?z.vertex0.pos:z.vertex1.pos;let H=0===B?z.vertex1.pos:z.vertex0.pos,F=E.x+" "+E.y;F in u||(u[F]=[]);u[F].push({p1:E,p2:H})}});for(let z in u){var v=u[z],y=void 0;r=v[0].p1;if(2===v.length){y=v[1].p2;v=v[0].p2.minus(r).angleDegrees();
y=y.minus(r).angleDegrees();y<v&&(y+=360);y>=v+360&&(y-=360);if(y<v+180){var C=y;y=v+360;v=C}v+=90;y-=90}else v=0,y=360;if(C=y>v+359.999)v=0,y=360;if(y>v+l){let B=[];C||B.push(r);let E=Math.round(A*(y-v)/360);1>E&&(E=1);for(let H=0;H<=E;H++){var w=v+H/E*(y-v);H===E&&(w=y);w=r.plus(c.fromAngleDegrees(w).times(t));(!C||0<H)&&B.push(w)}r=k(B);D.push(r)}}A=new x;return A=A.union(D)},q=function(r,t,A,x){const D=a("../core/CSG");var {fromPolygons:u}=a("../core/CSGFactories");r=r.reTesselated();let v;v=
x?r:new D;r.polygons.map(function(K){let L=K.plane.normal.unit().times(2*t);K=K.translate(L.times(-.5)).extrude(L);v=v.unionSub(K,!1,!1)});let y={};r.polygons.map(function(K){let L=K.vertices.length;var O=K.vertices[L-1],P=O.getTag();for(let Q=0;Q<L;Q++){let T=K.vertices[Q],R=T.getTag();P=R<P?R+"-"+P:P+"-"+R;P in y?O=y[P]:(O={v1:O,v2:T,planenormals:[]},y[P]=O);O.planenormals.push(K.plane.normal);P=R;O=T}});for(var C in y){var w=y[C];x=w.v1.pos;var z=w.v2.pos,B=z.minus(x).unit();let K=w.planenormals[0].unit();
B=K.cross(B);let L=[];for(var E=0;E<A;E++)L.push(E*Math.PI*2/A);for(let O=0,P=w.planenormals.length;O<P;O++){var H=w.planenormals[O];E=B.dot(H);H=K.dot(H);var F=Math.atan2(E,H);0>F&&(F+=2*Math.PI);L.push(F);F=Math.atan2(-E,-H);0>F&&(F+=2*Math.PI);L.push(F)}L=L.sort(h);w=L.length;var G=void 0,I=void 0;E=[];H=[];F=[];for(let O=-1;O<w;O++){var J=L[0>O?O+w:O],M=Math.sin(J);M=K.times(Math.cos(J)*t).plus(B.times(M*t));J=x.plus(M);M=z.plus(M);let P=!1;0<=O&&J.distanceTo(G)<d&&(P=!0);P||(0<=O&&(E.push(new g(J)),
H.push(new g(M)),G=[new g(I),new g(M),new g(J),new g(G)],G=new m(G),F.push(G)),G=J,I=M)}H.reverse();F.push(new m(E));F.push(new m(H));x=u(F);v=v.unionSub(x,!1,!1)}let N={};r.polygons.map(function(K){K.vertices.map(function(L){let O=L.getTag();O in N?L=N[O]:(L={pos:L.pos,normals:[]},N[O]=L);L.normals.push(K.plane.normal)})});for(let K in N){u=N[K];C=u.normals[0].unit();r=null;G=0;for(I=1;I<u.normals.length;I++)x=u.normals[I].unit(),z=C.cross(x).length(),.05<z&&z>G&&(G=z,r=x);r||(r=C.randomNonParallelVector());
r=C.cross(r).unit();G=r.cross(C);u=D.sphere({center:u.pos,radius:t,resolution:A,axes:[C,r,G]});v=v.unionSub(u,!1,!1)}return v};b.exports={expand:function(r,t,A){e(r)?(t=r.union(q(r,t,A)),t=t.reTesselated(),t.properties=r.properties):t=r.union(p(r,t,A));return t},contract:function(r,t,A){e(r)?(t=r.subtract(q(r,t,A)),t=t.reTesselated(),t.properties=r.properties):t=r.subtract(p(r,t,A));return t},expandedShellOfCAG:p,expandedShellOfCCSG:q}},{"../core/CAG":15,"../core/CAGFactories":16,"../core/CSG":17,
"../core/CSGFactories":18,"../core/constants":24,"../core/math/Polygon3":32,"../core/math/Vector2":34,"../core/math/Vertex3":37,"../core/utils":42}],10:[function(a,b,n){const {EPS:d,defaultResolution3D:l}=a("../core/constants"),g=a("../core/math/OrthoNormalBasis"),{parseOptionAs3DVector:c,parseOptionAsBool:m,parseOptionAsFloat:h,parseOptionAsInt:e}=a("./optionParsers"),f=a("../core/math/Vector3"),k=a("../core/math/Matrix4"),p=a("../core/math/Path2"),{Connector:q}=a("../core/connectors"),{fromPolygons:r}=
a("../core/CSGFactories"),{cagToPointsArray:t,clamp:A,rightMultiply1x3VectorToArray:x,polygonFromPoints:D}=a("./helpers"),{fromPoints:u}=a("../core/CAGFactories"),v=function(y,C,w,z){if(!(C instanceof g))throw Error("extrudeInPlane: the first parameter should be a OrthoNormalBasis");y=y.extrude({offset:[0,0,w]});m(z,"symmetrical",!1)&&(y=y.translate([0,0,-w/2]));C=C.getInverseProjectionMatrix();return y=y.transform(C)};b.exports={extrudeInOrthonormalBasis:v,extrudeInPlane:function(y,C,w,z,B){return v(y,
g.GetCartesian(C,w),z,B)},extrude:function(y,C){var w=a("../core/CSG");if(0===y.sides.length)return new w;w=c(C,"offset",[0,0,1]);let z=h(C,"twistangle",0);C=e(C,"twiststeps",l);if(0===w.z)throw Error("offset cannot be orthogonal to Z axis");if(0===z||1>C)C=1;let B=f.Create(0,1,0),E=[];E=E.concat(y._toPlanePolygons({translation:[0,0,0],normalVector:B,flipped:!(0>w.z)}));E=E.concat(y._toPlanePolygons({translation:w,normalVector:B.rotateZ(z),flipped:0>w.z}));for(let H=0;H<C;H++){let F=new q(w.times(H/
C),[0,0,w.z],B.rotateZ(H*z/C)),G=new q(w.times((H+1)/C),[0,0,w.z],B.rotateZ((H+1)*z/C));E=E.concat(y._toWallPolygons({toConnector1:F,toConnector2:G}))}return r(E)},linear_extrude:function(y,C){const {height:w,twist:z,slices:B,center:E}=Object.assign({},{height:1,slices:10,twist:0,center:!1},y);y=C.extrude({offset:[0,0,w],twistangle:z,twiststeps:B});!0===E&&(C=y.getBounds(),C=C[1].plus(C[0]).times(-.5),y=y.translate(C));return y},rotate_extrude:function(y,C){y=Object.assign({},{fn:32,startAngle:0,
angle:360,overflow:"cap"},y);let {fn:w,startAngle:z,angle:B,overflow:E}=y;if("cap"!==E)throw Error("only capping of overflowing points is supported !");2>arguments.length&&(C=y);const H=0<B;var F=H?A(z+B,0,360):A(z+B,-360,0);F=Math.max(Math.floor(Math.abs(F)/45),1,w);let G=t(C);var I=G.filter(Q=>0>Q[0]),J=G.filter(Q=>0<=Q[0]);0<I.length&&0<J.length&&"cap"===E&&(I.length>J.length?G=G.map(function(Q){return[Math.min(Q[0],0),Q[1]]}):J.length>=I.length&&(G=G.map(function(Q){return[Math.max(Q[0],0),Q[1]]})));
I=[];for(J=1;J<F+1;J++){for(var M=0;M<G.length-1;M++){var N=G[M],K=G[M+1],L=k.rotationZ((J-1)/F*B+z),O=k.rotationZ(J/F*B+z),P=x(L,[N[0],0,N[1]]);N=x(O,[N[0],0,N[1]]);L=x(L,[K[0],0,K[1]]);K=x(O,[K[0],0,K[1]]);O=!1;1E-5>Math.abs(P[0]-N[0])&&1E-5>Math.abs(L[1]-K[1])&&(O=!0);H?(I.push(D([P,L,K])),O||I.push(D([K,N,P]))):(O||I.push(D([P,N,K])),I.push(D([K,L,P])))}if(360>Math.abs(B)){P=u(G);const Q=k.rotationX(90).multiply(k.rotationZ(-z));M=P._toPlanePolygons({flipped:H}).map(R=>R.transform(Q));const T=
k.rotationX(90).multiply(k.rotationZ(-B-z));P=P._toPlanePolygons({flipped:!H}).map(R=>R.transform(T));I=I.concat(M).concat(P)}}return r(I).reTesselated().canonicalized()},rotateExtrude:function(y,C){let w=h(C,"angle",360);var z=e(C,"resolution",l);w=360<w?w%360:w;C=[0,0,0];let B=f.Create(0,1,0),E=[0,0,1],H=[];var F=new q(C,B,E);if(0<w&&360>w){var G=new q(C,B.rotateZ(-w),E);H=H.concat(y._toPlanePolygons({toConnector:F,flipped:!0}));H=H.concat(y._toPlanePolygons({toConnector:G}))}G=w/z;for(let I=G;I<=
w+d;I+=G)z=new q(C,B.rotateZ(-I),E),H=H.concat(y._toWallPolygons({toConnector1:F,toConnector2:z})),F=z;return r(H).reTesselated()},rectangular_extrude:function(y,C){const {w,h:z,fn:B,closed:E,round:H}=Object.assign({},{w:1,h:1,fn:8,closed:!1,round:!0},C);return(new p(y,E)).rectangularExtrude(w,z,B,H)}}},{"../core/CAGFactories":16,"../core/CSG":17,"../core/CSGFactories":18,"../core/connectors":23,"../core/constants":24,"../core/math/Matrix4":27,"../core/math/OrthoNormalBasis":28,"../core/math/Path2":29,
"../core/math/Vector3":35,"./helpers":5,"./optionParsers":11}],11:[function(a,b,n){const d=a("../core/math/Vector3"),l=a("../core/math/Vector2"),g=function(c,m,h){c&&m in c&&(h=c[m]);return h};b.exports={parseOption:g,parseOptionAsInt:function(c,m,h){c=g(c,m,h);c=Number(Math.floor(c));if(isNaN(c))throw Error("Parameter "+m+" should be a number");return c},parseOptionAsFloat:function(c,m,h){c=g(c,m,h);"string"===typeof c&&(c=Number(c));if(isNaN(c)||"number"!==typeof c)throw Error("Parameter "+m+" should be a number");
return c},parseOptionAsBool:function(c,m,h){c=g(c,m,h);"string"===typeof c&&("true"===c?c=!0:"false"===c?c=!1:0===c&&(c=!1));return!!c},parseOptionAs3DVector:function(c,m,h){c=g(c,m,h);return c=new d(c)},parseOptionAs2DVector:function(c,m,h){c=g(c,m,h);return c=new l(c)},parseOptionAs3DVectorList:function(c,m,h){return g(c,m,h).map(function(e){return new d(e)})}}},{"../core/math/Vector2":34,"../core/math/Vector3":35}],12:[function(a,b,n){a("../core/CAG");const {parseOptionAs2DVector:d,parseOptionAsFloat:l,
parseOptionAsInt:g}=a("./optionParsers"),{defaultResolution2D:c}=a("../core/constants"),m=a("../core/math/Vector2");a("../core/math/Vertex2");const h=a("../core/math/Path2"),{fromCompactBinary:e,fromPoints:f,fromPath2:k}=a("../core/CAGFactories"),p=function(q){q=q||{};if("corner1"in q||"corner2"in q){if("center"in q||"radius"in q)throw Error("rectangle: should either give a radius and center parameter, or a corner1 and corner2 parameter");var r=d(q,"corner1",[0,0]);q=d(q,"corner2",[1,1]);var t=r.plus(q).times(.5);
r=q.minus(r).times(.5)}else t=d(q,"center",[0,0]),r=d(q,"radius",[1,1]);r=r.abs();q=new m(r.x,-r.y);t=[t.plus(r),t.plus(q),t.minus(r),t.minus(q)];return f(t)};b.exports={circle:function(q){q=q||{};let r=d(q,"center",[0,0]),t=l(q,"radius",1);q=g(q,"resolution",c);let A=[];for(let x=0;x<q;x++){let D=m.fromAngleRadians(2*Math.PI*x/q).times(t).plus(r);A.push(D)}return f(A)},ellipse:function(q){q=q||{};let r=d(q,"center",[0,0]),t=d(q,"radius",[1,1]);t=t.abs();q=g(q,"resolution",c);let A=new h([[r.x,r.y+
t.y]]);A=A.appendArc([r.x,r.y-t.y],{xradius:t.x,yradius:t.y,xaxisrotation:0,resolution:q,clockwise:!0,large:!1});A=A.appendArc([r.x,r.y+t.y],{xradius:t.x,yradius:t.y,xaxisrotation:0,resolution:q,clockwise:!0,large:!1});A=A.close();return k(A)},rectangle:p,roundedRectangle:function(q){q=q||{};if("corner1"in q||"corner2"in q){if("center"in q||"radius"in q)throw Error("roundedRectangle: should either give a radius and center parameter, or a corner1 and corner2 parameter");var r=d(q,"corner1",[0,0]);
var t=d(q,"corner2",[1,1]);var A=r.plus(t).times(.5);t=t.minus(r).times(.5)}else A=d(q,"center",[0,0]),t=d(q,"radius",[1,1]);t=t.abs();r=l(q,"roundradius",.2);q=g(q,"resolution",c);r=Math.min(r,Math.min(t.x,t.y)-.1);r=Math.max(0,r);t=new m(t.x-r,t.y-r);A=p({center:A,radius:t});0<r&&(A=A.expand(r,q));return A},fromCompactBinary:e}},{"../core/CAG":15,"../core/CAGFactories":16,"../core/constants":24,"../core/math/Path2":29,"../core/math/Vector2":34,"../core/math/Vertex2":36,"./optionParsers":11}],13:[function(a,
b,n){const {parseOption:d,parseOptionAs3DVector:l,parseOptionAs2DVector:g,parseOptionAs3DVectorList:c,parseOptionAsFloat:m,parseOptionAsInt:h}=a("./optionParsers"),{defaultResolution3D:e,defaultResolution2D:f,EPS:k}=a("../core/constants"),p=a("../core/math/Vector3"),q=a("../core/math/Vertex3"),r=a("../core/math/Polygon3"),{Connector:t}=a("../core/connectors"),A=a("../core/Properties"),{fromPolygons:x}=a("../core/CSGFactories"),D=function(u){u=u||{};let v=l(u,"center",[0,0,0]);var y=m(u,"radius",1),
C=h(u,"resolution",e);let w,z;"axes"in u?(w=u.axes[0].unit().times(y),z=u.axes[1].unit().times(y),u=u.axes[2].unit().times(y)):(w=(new p([1,0,0])).times(y),z=(new p([0,-1,0])).times(y),u=(new p([0,0,1])).times(y));4>C&&(C=4);y=Math.round(C/4);let B,E=[];for(let G=0;G<=C;G++){var H=2*Math.PI*G/C;H=w.times(Math.cos(H)).plus(z.times(Math.sin(H)));if(0<G){var F=void 0;let I,J;for(let M=0;M<=y;M++){F=.5*Math.PI*M/y;let N=Math.cos(F),K=Math.sin(F);0<M&&(F=[],F.push(new q(v.plus(B.times(I).minus(u.times(J))))),
F.push(new q(v.plus(H.times(I).minus(u.times(J))))),M<y&&F.push(new q(v.plus(H.times(N).minus(u.times(K))))),F.push(new q(v.plus(B.times(N).minus(u.times(K))))),E.push(new r(F)),F=[],F.push(new q(v.plus(B.times(I).plus(u.times(J))))),F.push(new q(v.plus(H.times(I).plus(u.times(J))))),M<y&&F.push(new q(v.plus(H.times(N).plus(u.times(K))))),F.push(new q(v.plus(B.times(N).plus(u.times(K))))),F.reverse(),E.push(new r(F)));I=N;J=K}}B=H}C=x(E);C.properties.sphere=new A;C.properties.sphere.center=new p(v);
C.properties.sphere.facepoint=v.plus(w);return C};b.exports={cube:function(u){let v,y;u=u||{};if("corner1"in u||"corner2"in u){if("center"in u||"radius"in u)throw Error("cube: should either give a radius and center parameter, or a corner1 and corner2 parameter");var C=l(u,"corner1",[0,0,0]);u=l(u,"corner2",[1,1,1]);v=C.plus(u).times(.5);y=u.minus(C).times(.5)}else v=l(u,"center",[0,0,0]),y=l(u,"radius",[1,1,1]);y=y.abs();C=x([[[0,4,6,2],[-1,0,0]],[[1,3,7,5],[1,0,0]],[[0,1,5,4],[0,-1,0]],[[2,6,7,3],
[0,1,0]],[[0,2,3,1],[0,0,-1]],[[4,5,7,6],[0,0,1]]].map(function(w){w=w[0].map(function(z){z=new p(v.x+y.x*(2*!!(z&1)-1),v.y+y.y*(2*!!(z&2)-1),v.z+y.z*(2*!!(z&4)-1));return new q(z)});return new r(w,null)}));C.properties.cube=new A;C.properties.cube.center=new p(v);C.properties.cube.facecenters=[new t((new p([y.x,0,0])).plus(v),[1,0,0],[0,0,1]),new t((new p([-y.x,0,0])).plus(v),[-1,0,0],[0,0,1]),new t((new p([0,y.y,0])).plus(v),[0,1,0],[0,0,1]),new t((new p([0,-y.y,0])).plus(v),[0,-1,0],[0,0,1]),new t((new p([0,
0,y.z])).plus(v),[0,0,1],[1,0,0]),new t((new p([0,0,-y.z])).plus(v),[0,0,-1],[1,0,0])];return C},sphere:D,roundedCube:function(u){let v;u=u||{};if("corner1"in u||"corner2"in u){if("center"in u||"radius"in u)throw Error("roundedCube: should either give a radius and center parameter, or a corner1 and corner2 parameter");var y=l(u,"corner1",[0,0,0]);var C=l(u,"corner2",[1,1,1]);v=y.plus(C).times(.5);y=C.minus(y).times(.5)}else v=l(u,"center",[0,0,0]),y=l(u,"radius",[1,1,1]);y=y.abs();C=h(u,"resolution",
e);4>C&&(C=4);1===C%2&&8>C&&(C=8);u=l(u,"roundradius",[.2,.2,.2]);u=p.Create(Math.max(u.x,.01),Math.max(u.y,.01),Math.max(u.z,.01));let w=y.minus(u);if(0>w.x||0>w.y||0>w.z)throw Error("roundradius <= radius!");C=D({radius:1,resolution:C});C=C.scale(u);w.x>k&&(C=C.stretchAtPlane([1,0,0],[0,0,0],2*w.x));w.y>k&&(C=C.stretchAtPlane([0,1,0],[0,0,0],2*w.y));w.z>k&&(C=C.stretchAtPlane([0,0,1],[0,0,0],2*w.z));C=C.translate([-w.x+v.x,-w.y+v.y,-w.z+v.z]);C=C.reTesselated();C.properties.roundedCube=new A;C.properties.roundedCube.center=
new q(v);C.properties.roundedCube.facecenters=[new t((new p([y.x,0,0])).plus(v),[1,0,0],[0,0,1]),new t((new p([-y.x,0,0])).plus(v),[-1,0,0],[0,0,1]),new t((new p([0,y.y,0])).plus(v),[0,1,0],[0,0,1]),new t((new p([0,-y.y,0])).plus(v),[0,-1,0],[0,0,1]),new t((new p([0,0,y.z])).plus(v),[0,0,1],[1,0,0]),new t((new p([0,0,-y.z])).plus(v),[0,0,-1],[1,0,0])];return C},cylinder:function(u){function v(N,K,L){K=K*Math.PI*B/180;K=F.times(Math.cos(K)).plus(G.times(Math.sin(K)));N=y.plus(H.times(N)).plus(K.times(L));
return new q(N)}let y=l(u,"start",[0,-1,0]);var C=l(u,"end",[0,1,0]),w=m(u,"radius",1),z=m(u,"radiusEnd",w);w=m(u,"radiusStart",w);let B=m(u,"sectorAngle",360);B=360<B?B%360:B;if(0>z||0>w)throw Error("Radius should be non-negative");if(0===z&&0===w)throw Error("Either radiusStart or radiusEnd should be positive");var E=h(u,"resolution",f);let H=C.minus(y);u=H.unit();let F=u.randomNonParallelVector().unit(),G=F.cross(u).unit(),I=new q(y),J=new q(C),M=[];if(0<B){for(let N=0;N<E;N++){let K=N/E,L=(N+
1)/E;z===w?(M.push(new r([I,v(0,K,z),v(0,L,z)])),M.push(new r([v(0,L,z),v(0,K,z),v(1,K,z),v(1,L,z)])),M.push(new r([J,v(1,L,z),v(1,K,z)]))):(0<w&&(M.push(new r([I,v(0,K,w),v(0,L,w)])),M.push(new r([v(0,K,w),v(1,K,z),v(0,L,w)]))),0<z&&(M.push(new r([J,v(1,L,z),v(1,K,z)])),M.push(new r([v(1,K,z),v(1,L,z),v(0,L,w)]))))}360>B&&(M.push(new r([I,J,v(0,0,w)])),M.push(new r([v(0,0,w),J,v(1,0,z)])),M.push(new r([I,v(0,1,w),J])),M.push(new r([v(0,1,w),v(1,1,z),J])))}E=x(M);E.properties.cylinder=new A;E.properties.cylinder.start=
new t(y,u.negated(),F);E.properties.cylinder.end=new t(C,u,F);C=y.plus(H.times(.5));z=F.rotate(y,u,-B/2).times((w+z)/2);w=z.cross(u);E.properties.cylinder.facepointH=new t(C.plus(z),z,u);E.properties.cylinder.facepointH90=new t(C.plus(w),w,u);return E},roundedCylinder:function(u){let v=l(u,"start",[0,-1,0]),y=l(u,"end",[0,1,0]);var C=m(u,"radius",1),w=y.minus(v);var z=Math.abs(w.x)>Math.abs(w.y)?new p(0,1,0):new p(1,0,0);var B=l(u,"normal",z);u=h(u,"resolution",e);4>u&&(u=4);z=[];let E=Math.floor(.25*
u);if(w.length()<k)return D({center:v,radius:C,resolution:u});let H=w.unit().times(C);w=H.cross(B).unit().times(C);C=w.cross(H).unit().times(C);for(B=0;B<=u;B++){var F=2*Math.PI*B/u;F=w.times(Math.cos(F)).plus(C.times(Math.sin(F)));if(0<B){var G=[];G.push(new q(v.plus(F)));G.push(new q(v.plus(M)));G.push(new q(y.plus(M)));G.push(new q(y.plus(F)));z.push(new r(G));var I=void 0,J=void 0;for(let N=0;N<=E;N++){G=.5*Math.PI*N/E;let K=Math.cos(G),L=Math.sin(G);0<N&&(G=[],G.push(new q(v.plus(M.times(I).minus(H.times(J))))),
G.push(new q(v.plus(F.times(I).minus(H.times(J))))),N<E&&G.push(new q(v.plus(F.times(K).minus(H.times(L))))),G.push(new q(v.plus(M.times(K).minus(H.times(L))))),z.push(new r(G)),G=[],G.push(new q(y.plus(M.times(I).plus(H.times(J))))),G.push(new q(y.plus(F.times(I).plus(H.times(J))))),N<E&&G.push(new q(y.plus(F.times(K).plus(H.times(L))))),G.push(new q(y.plus(M.times(K).plus(H.times(L))))),G.reverse(),z.push(new r(G)));I=K;J=L}}var M=F}M=x(z);I=H.unit();J=w.unit();M.properties.roundedCylinder=new A;
M.properties.roundedCylinder.start=new t(v,I.negated(),J);M.properties.roundedCylinder.end=new t(y,I,J);M.properties.roundedCylinder.facepoint=v.plus(w);return M},cylinderElliptic:function(u){function v(M,N,K){N=N*Math.PI*2;K=H.times(K._x*Math.cos(N)).plus(F.times(K._y*Math.sin(N)));M=y.plus(E.times(M)).plus(K);return new q(M)}let y=l(u,"start",[0,-1,0]),C=l(u,"end",[0,1,0]);var w=g(u,"radius",[1,1]),z=g(u,"radiusEnd",w);w=g(u,"radiusStart",w);if(0>z._x||0>w._x||0>z._y||0>w._y)throw Error("Radius should be non-negative");
if(!(0!==z._x&&0!==z._y||0!==w._x&&0!==w._y))throw Error("Either radiusStart or radiusEnd should be positive");let B=h(u,"resolution",f),E=C.minus(y);u=E.unit();let H=u.randomNonParallelVector().unit(),F=H.cross(u).unit(),G=new q(y),I=new q(C),J=[];for(let M=0;M<B;M++){let N=M/B,K=(M+1)/B;z._x===w._x&&z._y===w._y?(J.push(new r([G,v(0,N,z),v(0,K,z)])),J.push(new r([v(0,K,z),v(0,N,z),v(1,N,z),v(1,K,z)])),J.push(new r([I,v(1,K,z),v(1,N,z)]))):(0<w._x&&(J.push(new r([G,v(0,N,w),v(0,K,w)])),J.push(new r([v(0,
N,w),v(1,N,z),v(0,K,w)]))),0<z._x&&(J.push(new r([I,v(1,K,z),v(1,N,z)])),J.push(new r([v(1,N,z),v(1,K,z),v(0,K,w)]))))}z=x(J);z.properties.cylinder=new A;z.properties.cylinder.start=new t(y,u.negated(),H);z.properties.cylinder.end=new t(C,u,H);z.properties.cylinder.facepoint=y.plus(H.times(w));return z},polyhedron:function(u){u=u||{};if("points"in u!=="faces"in u)throw Error("polyhedron needs 'points' and 'faces' arrays");let v=c(u,"points",[[1,1,0],[1,-1,0],[-1,-1,0],[-1,1,0],[0,0,1]]).map(function(y){return new q(y)});
u=d(u,"faces",[[0,1,4],[1,2,4],[2,3,4],[3,0,4],[1,0,3],[2,1,3]]);u.forEach(function(y){y.reverse()});u=u.map(function(y){return new r(y.map(function(C){return v[C]}))});return x(u).reTesselated()}}},{"../core/CSGFactories":18,"../core/Properties":22,"../core/connectors":23,"../core/constants":24,"../core/math/Polygon3":32,"../core/math/Vector3":35,"../core/math/Vertex3":37,"./optionParsers":11}],14:[function(a,b,n){const d=a("../core/math/Polygon3"),{fromPolygons:l}=a("../core/CSGFactories"),{fnSortByIndex:g}=
a("../core/utils"),c=function(m,h,e,f){h=h.vertices.slice(0);let k=e.vertices.slice(0);e=e.shared||null;h[0].pos.equals(h[h.length-1].pos)||h.push(h[0]);k[0].pos.equals(k[k.length-1].pos)||k.push(k[0]);f&&(h=h.reverse(),k=k.reverse());f=k.length-1;let p=h.length-1;var q=f-p;let r=0<q,t=0>q,A=[];for(q=Math.abs(q);0<q;q--)A.push({len:Infinity,index:-1});if(t)for(var x=0;x<p;x++){q=h[x].pos.distanceToSquared(h[x+1].pos);for(var D=A.length-1;0<=D;D--)if(A[D].len>q){A[D].len=q;A.index=D;break}}else if(r)for(x=
0;x<f;x++)for(q=k[x].pos.distanceToSquared(k[x+1].pos),D=A.length-1;0<=D;D--)if(A[D].len>q){A[D].len=q;A.index=D;break}A.sort(g);q=h[0];x=k[0];let u;for(let v=0,y=0,C=f+p;v+y<C;){if(A.length)if(r&&y===A[0].index){D=k[++y];m.push(new d([D,x,q],e));x=D;A.shift();continue}else if(t&&v===A[0].index){D=h[++v];m.push(new d([x,q,D],e));q=D;A.shift();continue}D=v<p?x.pos.distanceToSquared(h[v+1].pos):Infinity;u=y<f?q.pos.distanceToSquared(k[y+1].pos):Infinity;D<=u?(D=h[++v],m.push(new d([x,q,D],e)),q=D):
y<f&&(D=k[++y],m.push(new d([D,x,q],e)),x=D)}return m};b.exports=function(m,h){let e=[],f=null,k=null,p=null,q=null,r=2,t=!1,A,x=null;h&&(t=!!h.loop,h.numslices&&(r=h.numslices),h.callback&&(A=h.callback));if(!A){let D=d.createFromPoints([[0,0,0],[1,0,0],[1,1,0],[0,1,0]]);A=function(u,v){return 0===u||1===u?D.translate([0,0,u]):null}}for(let D=0,u=r-1;D<=u;D++)if(f=A.call(m,D/u,D)){if(!(f instanceof d))throw Error("Polygon.solidFromSlices callback error: Polygon expected");f.checkIfConvex();k?(null===
x&&(x=0>k.plane.signedDistanceToPoint(f.vertices[0].pos)),c(e,k,f,x)):p=f;k=f}q=f;t?p.vertices.length===q.vertices.length&&p.vertices.every(function(D,u){return D.pos.equals(q.vertices[u].pos)})||c(e,q,p,x):(e.unshift(x?p:p.flipped()),e.push(x?q.flipped():q));return l(e)}},{"../core/CSGFactories":18,"../core/math/Polygon3":32,"../core/utils":42}],15:[function(a,b,n){const {Connector:d}=a("./connectors"),l=a("./math/Vertex3"),g=a("./math/Vector2"),c=a("./math/Vector3"),m=a("./math/Polygon3"),{fromPolygons:h}=
a("./CSGFactories"),{fromSides:e,fromFakeCSG:f}=a("./CAGFactories"),k=a("./utils/canonicalize"),p=a("./utils/retesellate"),{isCAGValid:q,isSelfIntersecting:r,hasPointInside:t}=a("./utils/cagValidation"),{area:A,getBounds:x}=a("./utils/cagMeasurements"),{overCutInsideCorners:D}=a("../api/ops-cnc"),{extrudeInOrthonormalBasis:u,extrudeInPlane:v,extrude:y,rotateExtrude:C}=a("../api/ops-extrusions"),w=a("../api/cagOutlinePaths"),z=a("../api/center"),{expand:B,contract:E,expandedShellOfCAG:H}=a("../api/ops-expandContract");
a=function(){this.sides=[];this.isCanonicalized=!1};a.prototype={union:function(F){F=F instanceof Array?F:[F];let G=this._toCSGWall(-1,1);G=G.union(F.map(function(I){return I._toCSGWall(-1,1).reTesselated()}),!1,!1);return f(G).canonicalized()},subtract:function(F){F=F instanceof Array?F:[F];let G=this._toCSGWall(-1,1);F.map(function(I){G=G.subtractSub(I._toCSGWall(-1,1),!1,!1)});G=G.reTesselated();G=G.canonicalized();G=f(G);return G=G.canonicalized()},intersect:function(F){F=F instanceof Array?F:
[F];let G=this._toCSGWall(-1,1);F.map(function(I){G=G.intersectSub(I._toCSGWall(-1,1),!1,!1)});G=G.reTesselated();G=G.canonicalized();G=f(G);return G=G.canonicalized()},transform:function(F){let G=F.isMirroring();var I=this.sides.map(function(J){return J.transform(F)});I=e(I);G&&(I=I.flipped());return I},flipped:function(){let F=this.sides.map(function(G){return G.flipped()});F.reverse();return e(F)},center:function(F){return z({axes:F},[this])},expandedShell:function(F,G){return H(this,F,G)},expand:function(F,
G){return B(this,F,G)},contract:function(F,G){return E(this,F,G)},area:function(){return A(this)},getBounds:function(){return x(this)},isSelfIntersecting:function(F){return r(this,F)},extrudeInOrthonormalBasis:function(F,G,I){return u(this,F,G,I)},extrudeInPlane:function(F,G,I,J){return v(this,F,G,I,J)},extrude:function(F){return y(this,F)},rotateExtrude:function(F){return C(this,F)},check:function(){return q(this)},canonicalized:function(){return k(this)},reTesselated:function(){return p(this)},
getOutlinePaths:function(){return w(this)},overCutInsideCorners:function(F){return D(this,F)},hasPointInside:function(F){return t(this,F)},toString:function(){let F="CAG ("+this.sides.length+" sides):\n";this.sides.map(function(G){F+=" "+G.toString()+"\n"});return F},_toCSGWall:function(F,G){let I=this.sides.map(function(J){return J.toPolygon3D(F,G)});return h(I)},_toVector3DPairs:function(F){let G=this.sides.map(function(I){let J=I.vertex0.pos;I=I.vertex1.pos;return[c.Create(J.x,J.y,0),c.Create(I.x,
I.y,0)]});"undefined"!==typeof F&&(G=G.map(function(I){return I.map(function(J){return J.transform(F)})}));return G},_toPlanePolygons:function(F){F=Object.assign({},{flipped:!1},F);let {flipped:G}=F;var I=[0,0,0],J=[0,0,1],M=[0,1,0],N=new d(I,J,M);I=F.translation||I;J=F.axisVector||J;M=F.normalVector||M;F=F.toConnector||new d(I,J,M);let K=N.getTransformationTo(F,!1,0);F=this.getBounds();F[0]=F[0].minus(new g(1,1));F[1]=F[1].plus(new g(1,1));N=this._toCSGWall(-1,1);F=h([new m([new l(new c(F[0].x,F[0].y,
0)),new l(new c(F[1].x,F[0].y,0)),new l(new c(F[1].x,F[1].y,0)),new l(new c(F[0].x,F[1].y,0))])]);G&&(F=F.invert());F=F.intersectSub(N);return F.polygons.filter(function(L){return.99<Math.abs(L.plane.normal.z)}).map(function(L){return L.transform(K)})},_toWallPolygons:function(F){var G=new d([0,0,0],[0,0,1],[0,1,0]),I=F.toConnector1,J=F.toConnector2;if(!(I instanceof d&&J instanceof d))throw Error("could not parse Connector arguments toConnector1 or toConnector2");if(F.cag&&F.cag.sides.length!==this.sides.length)throw Error("target cag needs same sides count as start cag");
F=F.cag||this;I=G.getTransformationTo(I,!1,0);G=G.getTransformationTo(J,!1,0);J=this._toVector3DPairs(I);let M=F._toVector3DPairs(G),N=[];J.forEach(function(K,L){N.push(new m([new l(M[L][1]),new l(M[L][0]),new l(K[0])]));N.push(new m([new l(M[L][1]),new l(K[0]),new l(K[1])]))});return N},toPoints:function(){let F=this.sides.map(function(G){return G.vertex0.pos});0<F.length&&F.push(F.shift());return F},toCompactBinary:function(){let F=this.canonicalized(),G={},I=[],J=0,M=new Uint32Array(2*F.sides.length),
N=0;F.sides.map(function(O){[O.vertex0,O.vertex1].map(function(P){let Q=P.getTag(),T;Q in G?T=G[Q]:(T=J++,G[Q]=T,I.push(P));M[N++]=T})});let K=new Float64Array(2*J),L=0;I.map(function(O){O=O.pos;K[L++]=O._x;K[L++]=O._y});return{"class":"CAG",sideVertexIndices:M,vertexData:K}}};b.exports=a},{"../api/cagOutlinePaths":2,"../api/center":3,"../api/ops-cnc":7,"../api/ops-expandContract":9,"../api/ops-extrusions":10,"./CAGFactories":16,"./CSGFactories":18,"./connectors":23,"./math/Polygon3":32,"./math/Vector2":34,
"./math/Vector3":35,"./math/Vertex3":37,"./utils/cagMeasurements":43,"./utils/cagValidation":44,"./utils/canonicalize":45,"./utils/retesellate":49}],16:[function(a,b,n){const d=a("./math/Side"),l=a("./math/Vector2"),g=a("./math/Vertex2"),{areaEPS:c}=a("./constants"),{isSelfIntersecting:m,contains:h}=a("./utils/cagValidation"),{union:e,difference:f}=a("../api/ops-booleans"),k=function(t){let A=new (a("./CAG"));A.sides=t;return A},p=function(t){if(!t)throw Error("points parameter must be defined");
if(!Array.isArray(t))throw Error("points parameter must be an array");if(void 0!==t[0].x||"number"===typeof t[0][0])return q(t);if("object"===typeof t[0][0])return r(t);throw Error("Unsupported points list format");},q=function(t){if(3>t.length)throw Error("CAG shape needs at least 3 points");let A=[],x=new g(new l(t[t.length-1]));t.map(function(u){u=new g(new l(u));A.push(new d(x,u));x=u});t=k(A);if(m(t))throw Error("Polygon is self intersecting!");let D=t.area();if(Math.abs(D)<c)throw Error("Degenerate polygon!");
0>D&&(t=t.flipped());return t.canonicalized()},r=function(t){if(1===t.length)return p(t[0]);let A=[];t.forEach(D=>{A.push(q(D))});let x={};A.forEach((D,u)=>{A.forEach((v,y)=>{D!==v&&(x[u]||(x[u]={parents:[],isHole:!1}),x[y]||(x[y]={parents:[],isHole:!1}),h(v,D)&&(x[u].parents.push(y),x[u].isHole=!!(x[u].parents.length%2),x[y].isHole=!!(x[y].parents.length%2)))})});t=null;for(key in x)t=x[key],t.isHole&&(delete x[key],t.parents.forEach(D=>{A[D]=f(A[D],A[key])}));t=k([]);for(key in x)t=e(t,A[key]);
return t};b.exports={fromSides:k,fromObject:function(t){var A=t.sides.map(function(x){return d.fromObject(x)});A=k(A);A.isCanonicalized=t.isCanonicalized;return A},fromPoints:p,fromPointsNoCheck:function(t){let A=[],x=new l(t[t.length-1]),D=new g(x);t.map(function(u){u=new l(u);u=new g(u);let v=new d(D,u);A.push(v);D=u});return k(A)},fromPath2:function(t){if(!t.isClosed())throw Error("The path should be closed!");return p(t.getPoints())},fromFakeCSG:function(t){t=t.polygons.map(function(A){return d._fromFakePolygon(A)}).filter(function(A){return null!==
A});return k(t)},fromCompactBinary:function(t){if("CAG"!==t["class"])throw Error("Not a CAG");let A=[];var x=t.vertexData,D=x.length/2;let u=0;for(var v=0;v<D;v++){var y=x[u++],C=x[u++];y=new l(y,C);y=new g(y);A.push(y)}x=[];D=t.sideVertexIndices.length/2;u=0;for(v=0;v<D;v++)y=t.sideVertexIndices[u++],C=t.sideVertexIndices[u++],y=new d(A[y],A[C]),x.push(y);t=k(x);t.isCanonicalized=!0;return t}}},{"../api/ops-booleans":6,"./CAG":15,"./constants":24,"./math/Side":33,"./math/Vector2":34,"./math/Vertex2":36,
"./utils/cagValidation":44}],17:[function(a,b,n){const d=a("./trees"),l=a("./math/Polygon3"),g=a("./math/Plane"),c=a("./math/OrthoNormalBasis");a("./CAG");const m=a("./Properties"),{fromPolygons:h}=a("./CSGFactories"),e=a("./utils/fixTJunctions"),f=a("./utils/canonicalize"),k=a("./utils/retesellate"),{bounds:p}=a("./utils/csgMeasurements"),{projectToOrthoNormalBasis:q}=a("./utils/csgProjections"),{lieFlat:r,getTransformationToFlatLying:t,getTransformationAndInverseTransformationToFlatLying:A}=a("../api/ops-cnc"),
{sectionCut:x,cutByPlane:D}=a("../api/ops-cuts"),u=a("../api/center"),{expand:v,contract:y,expandedShellOfCCSG:C}=a("../api/ops-expandContract");a=function(){this.polygons=[];this.properties=new m;this.isRetesselated=this.isCanonicalized=!0};a.prototype={union:function(w){w instanceof Array?(w=w.slice(0),w.push(this)):w=[this,w];let z;for(z=1;z<w.length;z+=2)w.push(w[z-1].unionSub(w[z]));return w[z-1].reTesselated().canonicalized()},unionSub:function(w,z,B){if(this.mayOverlap(w)){var E=new d(this.polygons);
let H=new d(w.polygons);E.clipTo(H,!1);H.clipTo(E);H.invert();H.clipTo(E);H.invert();E=E.allPolygons().concat(H.allPolygons());E=h(E);E.properties=this.properties._merge(w.properties);z&&(E=E.reTesselated());B&&(E=E.canonicalized());return E}return this.unionForNonIntersecting(w)},unionForNonIntersecting:function(w){var z=this.polygons.concat(w.polygons);z=h(z);z.properties=this.properties._merge(w.properties);z.isCanonicalized=this.isCanonicalized&&w.isCanonicalized;z.isRetesselated=this.isRetesselated&&
w.isRetesselated;return z},subtract:function(w){w=w instanceof Array?w:[w];let z=this;for(let B=0;B<w.length;B++){let E=B===w.length-1;z=z.subtractSub(w[B],E,E)}return z},subtractSub:function(w,z,B){var E=new d(this.polygons);let H=new d(w.polygons);E.invert();E.clipTo(H);H.clipTo(E,!0);E.addPolygons(H.allPolygons());E.invert();E=h(E.allPolygons());E.properties=this.properties._merge(w.properties);z&&(E=E.reTesselated());B&&(E=E.canonicalized());return E},intersect:function(w){w=w instanceof Array?
w:[w];let z=this;for(let B=0;B<w.length;B++){let E=B===w.length-1;z=z.intersectSub(w[B],E,E)}return z},intersectSub:function(w,z,B){var E=new d(this.polygons);let H=new d(w.polygons);E.invert();H.clipTo(E);H.invert();E.clipTo(H);H.clipTo(E);E.addPolygons(H.allPolygons());E.invert();E=h(E.allPolygons());E.properties=this.properties._merge(w.properties);z&&(E=E.reTesselated());B&&(E=E.canonicalized());return E},invert:function(){let w=this.polygons.map(function(z){return z.flipped()});return h(w)},
transform1:function(w){var z=this.polygons.map(function(B){return B.transform(w)});z=h(z);z.properties=this.properties._transform(w);z.isRetesselated=this.isRetesselated;return z},transform:function(w){let z=w.isMirroring(),B={},E={};var H=this.polygons.map(function(F){var G=F.plane;var I=G.getTag();I in E?G=E[I]:(G=G.transform(w),E[I]=G);I=F.vertices.map(function(J){let M=J.getTag();M in B?J=B[M]:(J=J.transform(w),B[M]=J);return J});z&&I.reverse();return new l(I,F.shared,G)});H=h(H);H.properties=
this.properties._transform(w);H.isRetesselated=this.isRetesselated;H.isCanonicalized=this.isCanonicalized;return H},center:function(w){return u({axes:w},[this])},expand:function(w,z){return v(this,w,z)},contract:function(w,z){return y(this,w,z)},expandedShell:function(w,z,B){return C(this,w,z,B)},stretchAtPlane:function(w,z,B){w=g.fromNormalAndPoint(w,z);z=new c(w);z=this.sectionCut(z).extrudeInOrthonormalBasis(z,B);let E=this.cutByPlane(w),H=this.cutByPlane(w.flipped());return E.union([z,H.translate(w.normal.times(B))])},
canonicalized:function(){return f(this)},reTesselated:function(){return k(this)},fixTJunctions:function(){return e(h,this)},getBounds:function(){return p(this)},mayOverlap:function(w){if(0===this.polygons.length||0===w.polygons.length)return!1;let z=p(this);w=p(w);return z[1].x<w[0].x||z[0].x>w[1].x||z[1].y<w[0].y||z[0].y>w[1].y||z[1].z<w[0].z||z[0].z>w[1].z?!1:!0},cutByPlane:function(w){return D(this,w)},connectTo:function(w,z,B,E){w=w.getTransformationTo(z,B,E);return this.transform(w)},setShared:function(w){var z=
this.polygons.map(function(B){return new l(B.vertices,w,B.plane)});z=h(z);z.properties=this.properties;z.isRetesselated=this.isRetesselated;z.isCanonicalized=this.isCanonicalized;return z},setColor:function(w){let z=l.Shared.fromColor.apply(this,arguments);return this.setShared(z)},getTransformationAndInverseTransformationToFlatLying:function(){return A(this)},getTransformationToFlatLying:function(){return t(this)},lieFlat:function(){return r(this)},projectToOrthoNormalBasis:function(w){return q(this,
w)},sectionCut:function(w){return x(this,w)},getFeatures:function(w){w instanceof Array||(w=[w]);let z=this.toTriangles().map(function(B){return B.getTetraFeatures(w)}).reduce(function(B,E){return E.map(function(H,F){return H+(0===B?0:B[F])})},0);return 1===z.length?z[0]:z},toPolygons:function(){return this.polygons},toString:function(){let w="CSG solid:\n";this.polygons.map(function(z){w+=z.toString()});return w},toCompactBinary:function(){let w=this.canonicalized(),z=w.polygons.length,B=0,E=0,H=
{},F=[],G=0,I={},J=[],M=[],N={},K=0;w.polygons.map(function(S){S.vertices.map(function(V){++B;let Z=V.getTag();Z in H||(H[Z]=E++,F.push(V))});var U=S.plane.getTag();U in I||(I[U]=G++,J.push(S.plane));U=S.shared.getTag();U in N||(N[U]=K++,M.push(S.shared))});let L=new Uint32Array(z),O=new Uint32Array(z),P=new Uint32Array(B),Q=new Uint32Array(z),T=new Float64Array(3*E),R=new Float64Array(4*G),aa=0;for(let S=0;S<z;++S){var W=w.polygons[S];L[S]=W.vertices.length;W.vertices.map(function(V){V=V.getTag();
V=H[V];P[aa++]=V});let U=W.plane.getTag();Q[S]=I[U];W=W.shared.getTag();O[S]=N[W]}let Y=0;F.map(function(S){S=S.pos;T[Y++]=S._x;T[Y++]=S._y;T[Y++]=S._z});let X=0;J.map(function(S){const U=S.normal;R[X++]=U._x;R[X++]=U._y;R[X++]=U._z;R[X++]=S.w});return{"class":"CSG",numPolygons:z,numVerticesPerPolygon:L,polygonPlaneIndexes:Q,polygonSharedIndexes:O,polygonVertices:P,vertexData:T,planeData:R,shared:M}},toTriangles:function(){let w=[];this.polygons.forEach(function(z){let B=z.vertices[0];for(let E=z.vertices.length-
3;0<=E;E--)w.push(new l([B,z.vertices[E+1],z.vertices[E+2]],z.shared,z.plane))});return w}};b.exports=a},{"../api/center":3,"../api/ops-cnc":7,"../api/ops-cuts":8,"../api/ops-expandContract":9,"./CAG":15,"./CSGFactories":18,"./Properties":22,"./math/OrthoNormalBasis":28,"./math/Plane":30,"./math/Polygon3":32,"./trees":41,"./utils/canonicalize":45,"./utils/csgMeasurements":46,"./utils/csgProjections":47,"./utils/fixTJunctions":48,"./utils/retesellate":49}],18:[function(a,b,n){const d=a("./math/Vector3"),
l=a("./math/Vertex3"),g=a("./math/Plane"),c=a("./math/Polygon2"),m=a("./math/Polygon3"),h=function(e){let f=new (a("./CSG"));f.polygons=e;f.isCanonicalized=!1;f.isRetesselated=!1;return f};b.exports={fromPolygons:h,fromSlices:function(e){return c.createFromPoints([[0,0,0],[1,0,0],[1,1,0],[0,1,0]]).solidFromSlices(e)},fromObject:function(e){var f=e.polygons.map(function(k){return m.fromObject(k)});f=h(f);f.isCanonicalized=e.isCanonicalized;f.isRetesselated=e.isRetesselated;return f},fromCompactBinary:function(e){if("CSG"!==
e["class"])throw Error("Not a CSG");var f=[],k=e.planeData,p=k.length/4;let q=0;for(var r=0;r<p;r++){var t=k[q++];var A=k[q++];var x=k[q++];var D=k[q++];t=d.Create(t,A,x);t=new g(t,D);f.push(t)}k=[];p=e.vertexData;r=p.length/3;q=0;for(D=0;D<r;D++)t=p[q++],A=p[q++],x=p[q++],t=d.Create(t,A,x),t=new l(t),k.push(t);A=e.shared.map(function(C){return m.Shared.fromObject(C)});x=[];p=e.numPolygons;r=e.numVerticesPerPolygon;D=e.polygonVertices;let u=e.polygonPlaneIndexes;e=e.polygonSharedIndexes;let v;var y;
q=0;for(let C=0;C<p;C++){t=r[C];v=[];for(y=0;y<t;y++)v.push(k[D[q++]]);t=f[u[C]];y=A[e[C]];t=new m(v,y,t);x.push(t)}f=h(x);f.isCanonicalized=!0;f.isRetesselated=!0;return f}}},{"./CSG":17,"./math/Plane":30,"./math/Polygon2":31,"./math/Polygon3":32,"./math/Vector3":35,"./math/Vertex3":37}],19:[function(a,b,n){a=function(d,l){this.lookuptable={};this.multiplier=1/l};a.prototype={lookupOrCreate:function(d,l){let g="",c=this.multiplier;d.forEach(function(h){g+=Math.round(h*c)+"/"});if(g in this.lookuptable)return this.lookuptable[g];
l=l(d);let m=d.map(function(h){h=Math.floor(h*c);return[""+h+"/",""+(h+1)+"/"]});d=1<<d.length;for(let h=0;h<d;++h){let e=h;g="";m.forEach(function(f){g+=f[e&1];e>>=1});this.lookuptable[g]=l}return l}};b.exports=a},{}],20:[function(a,b,n){const d=a("./FuzzyFactory"),{EPS:l}=a("./constants"),g=a("./math/Side");a=function(){this.vertexfactory=new d(2,l)};a.prototype={getVertex:function(c){return this.vertexfactory.lookupOrCreate([c.pos._x,c.pos._y],function(m){return c})},getSide:function(c){let m=
this.getVertex(c.vertex0);c=this.getVertex(c.vertex1);return new g(m,c)}};b.exports=a},{"./FuzzyFactory":19,"./constants":24,"./math/Side":33}],21:[function(a,b,n){const {EPS:d}=a("./constants"),l=a("./math/Polygon3"),g=a("./FuzzyFactory");a=function(){this.vertexfactory=new g(3,d);this.planefactory=new g(4,d);this.polygonsharedfactory={}};a.prototype={getPolygonShared:function(c){let m=c.getHash();return m in this.polygonsharedfactory?this.polygonsharedfactory[m]:this.polygonsharedfactory[m]=c},
getVertex:function(c){return this.vertexfactory.lookupOrCreate([c.pos._x,c.pos._y,c.pos._z],function(m){return c})},getPlane:function(c){return this.planefactory.lookupOrCreate([c.normal._x,c.normal._y,c.normal._z,c.w],function(m){return c})},getPolygon:function(c){let m=this.getPlane(c.plane),h=this.getPolygonShared(c.shared),e=this;c=c.vertices.map(function(k){return e.getVertex(k)});let f=[];if(0<c.length){let k=c[c.length-1].getTag();c.forEach(function(p){let q=p.getTag();q!==k&&f.push(p);k=q})}3>
f.length&&(f=[]);return new l(f,h,m)}};b.exports=a},{"./FuzzyFactory":19,"./constants":24,"./math/Polygon3":32}],22:[function(a,b,n){const d=function(){};d.prototype={_transform:function(l){let g=new d;d.transformObj(this,g,l);return g},_merge:function(l){let g=new d;d.cloneObj(this,g);d.addFrom(g,l);return g}};d.transformObj=function(l,g,c){for(let m in l){if("_transform"===m)continue;if("_merge"===m)continue;let h=l[m],e=h;"object"===typeof h&&("transform"in h&&"function"===typeof h.transform?e=
h.transform(c):h instanceof Array?(e=[],d.transformObj(h,e,c)):h instanceof d&&(e=new d,d.transformObj(h,e,c)));g[m]=e}};d.cloneObj=function(l,g){for(let c in l){if("_transform"===c)continue;if("_merge"===c)continue;let m=l[c],h=m;if("object"===typeof m)if(m instanceof Array){h=[];for(let e=0;e<m.length;e++)h.push(m[e])}else m instanceof d&&(h=new d,d.cloneObj(m,h));g[c]=h}};d.addFrom=function(l,g){for(let c in g)"_transform"!==c&&"_merge"!==c&&(c in l&&"object"===typeof l[c]&&l[c]instanceof d&&"object"===
typeof g[c]&&g[c]instanceof d?d.addFrom(l[c],g[c]):c in l||(l[c]=g[c]))};b.exports=d},{}],23:[function(a,b,n){const d=a("./math/Vector3"),l=a("./math/Line3"),g=a("./math/Matrix4"),c=a("./math/OrthoNormalBasis"),m=a("./math/Plane"),h=function(f,k,p){this.point=new d(f);this.axisvector=(new d(k)).unit();this.normalvector=(new d(p)).unit()};h.prototype={normalized:function(){let f=this.axisvector.unit();var k=this.normalvector.cross(f).unit();k=f.cross(k);return new h(this.point,f,k)},transform:function(f){let k=
this.point.multiply4x4(f),p=this.point.plus(this.axisvector).multiply4x4(f).minus(k);f=this.point.plus(this.normalvector).multiply4x4(f).minus(k);return new h(k,p,f)},getTransformationTo:function(f,k,p){k=k?!0:!1;p=p?Number(p):0;var q=this.normalized();f=f.normalized();let r=g.translation(this.point.negated());var t=m.anyPlaneFromVector3Ds(new d(0,0,0),q.axisvector,f.axisvector);t=new c(t);var A=t.to2D(q.axisvector).angle();let x=t.to2D(f.axisvector).angle();A=180*(x-A)/Math.PI;k&&(A+=180);r=r.multiply(t.getProjectionMatrix());
r=r.multiply(g.rotationZ(A));r=r.multiply(t.getInverseProjectionMatrix());q=q.transform(r);k=m.fromNormalAndPoint(f.axisvector,new d(0,0,0));k=new c(k);A=k.to2D(q.normalvector).angle();x=k.to2D(f.normalvector).angle();A=180*(x-A)/Math.PI;A+=p;r=r.multiply(k.getProjectionMatrix());r=r.multiply(g.rotationZ(A));r=r.multiply(k.getInverseProjectionMatrix());return r=r.multiply(g.translation(f.point))},axisLine:function(){return new l(this.point,this.axisvector)},extend:function(f){f=this.point.plus(this.axisvector.unit().times(f));
return new h(f,this.axisvector,this.normalvector)}};const e=function(f){this.connectors_=f?f.slice():[]};e.defaultNormal=[0,0,1];e.fromPath2D=function(f,k,p){if(3===arguments.length)return e._fromPath2DTangents(f,k,p);if(2===arguments.length)return e._fromPath2DExplicit(f,k);throw Error("call with path2D and either 2 direction vectors, or a function returning direction vectors");};e._fromPath2DTangents=function(f,k,p){let q,r=f.points.length,t=new e([new h(f.points[0],k,e.defaultNormal)]);f.points.slice(1,
r-1).forEach(function(A,x){q=f.points[x+2].minus(f.points[x]).toVector3D(0);t.appendConnector(new h(A.toVector3D(0),q,e.defaultNormal))},this);t.appendConnector(new h(f.points[r-1],p,e.defaultNormal));t.closed=f.closed;return t};e._fromPath2DExplicit=function(f,k){let p=new e(f.points.map(function(q,r){var t=q.toVector3D(0),A=d.Create(1,0,0),x=A.rotateZ,D=k;"function"===typeof D&&(D=D(q,r));return new h(t,x.call(A,D),e.defaultNormal)},this));p.closed=f.closed;return p};e.prototype={setClosed:function(f){this.closed=
!!f},appendConnector:function(f){this.connectors_.push(f)},followWith:function(f){function k(x,D){"function"===typeof x&&(x=x(D.point,D.axisvector,D.normalvector));return x}const p=a("./CSG");this.verify();let q=[],r,t=this.connectors_[this.connectors_.length-1],A=k(f,t);this.connectors_.forEach(function(x,D){r=k(f,x);D||this.closed?q.push.apply(q,A._toWallPolygons({toConnector1:t,toConnector2:x,cag:r})):q.push.apply(q,r._toPlanePolygons({toConnector:x,flipped:!0}));D!==this.connectors_.length-1||
this.closed||q.push.apply(q,r._toPlanePolygons({toConnector:x}));A=r;t=x},this);return p.fromPolygons(q).reTesselated().canonicalized()},verify:function(){let f,k;for(let p=0;p<this.connectors_.length-1;p++){f=this.connectors_[p];k=this.connectors_[p+1];if(0>=k.point.minus(f.point).dot(f.axisvector))throw Error("Invalid ConnectorList. Each connectors position needs to be within a <90deg range of previous connectors axisvector");if(0>=f.axisvector.dot(k.axisvector))throw Error("invalid ConnectorList. No neighboring connectors axisvectors may span a >=90deg angle");
}}};b.exports={Connector:h,ConnectorList:e}},{"./CSG":17,"./math/Line3":26,"./math/Matrix4":27,"./math/OrthoNormalBasis":28,"./math/Plane":30,"./math/Vector3":35}],24:[function(a,b,n){let d=1;b.exports={_CSGDEBUG:!1,defaultResolution2D:32,defaultResolution3D:12,EPS:1E-5,angleEPS:.1,areaEPS:5E-6*1E-5*Math.sin(.1),all:0,top:1,bottom:2,left:3,right:4,front:5,back:6,staticTag:d,getTag:()=>d++}},{}],25:[function(a,b,n){const d=a("./Vector2"),{solve2Linear:l}=a("../utils"),g=function(c,m){c=new d(c);m=
parseFloat(m);let h=c.length();m*=h;this.normal=c=c.times(1/h);this.w=m};g.fromPoints=function(c,m){c=new d(c);m=new d(m);m=m.minus(c).normal().negated().unit();c=c.dot(m);return new g(m,c)};g.prototype={reverse:function(){return new g(this.normal.negated(),-this.w)},equals:function(c){return c.normal.equals(this.normal)&&c.w===this.w},origin:function(){return this.normal.times(this.w)},direction:function(){return this.normal.normal()},xAtY:function(c){return(this.w-this.normal._y*c)/this.normal.x},
absDistanceToPoint:function(c){c=new d(c);c=c.dot(this.normal);return Math.abs(c-this.w)},intersectWithLine:function(c){c=l(this.normal.x,this.normal.y,c.normal.x,c.normal.y,this.w,c.w);return c=new d(c)},transform:function(c){var m=new d(0,0);let h=this.normal.times(this.w);m=m.multiply4x4(c);m=this.normal.multiply4x4(c).minus(m);c=h.multiply4x4(c);c=m.dot(c);return new g(m,c)}};b.exports=g},{"../utils":42,"./Vector2":34}],26:[function(a,b,n){const d=a("./Vector3"),{EPS:l}=a("../constants"),{solve2Linear:g}=
a("../utils"),c=function(m,h){m=new d(m);h=new d(h);this.point=m;this.direction=h.unit()};c.fromPoints=function(m,h){m=new d(m);h=new d(h);h=h.minus(m);return new c(m,h)};c.fromPlanes=function(m,h){let e=m.normal.cross(h.normal);var f=e.length();if(f<l)throw Error("Parallel planes");e=e.times(1/f);f=Math.abs(e.x);let k=Math.abs(e.y),p=Math.abs(e.z);f>=k&&f>=p?(m=g(m.normal.y,m.normal.z,h.normal.y,h.normal.z,m.w,h.w),m=new d(0,m[0],m[1])):k>=f&&k>=p?(m=g(m.normal.x,m.normal.z,h.normal.x,h.normal.z,
m.w,h.w),m=new d(m[0],0,m[1])):(m=g(m.normal.x,m.normal.y,h.normal.x,h.normal.y,m.w,h.w),m=new d(m[0],m[1],0));return new c(m,e)};c.prototype={intersectWithPlane:function(m){m=(m.w-m.normal.dot(this.point))/m.normal.dot(this.direction);return this.point.plus(this.direction.times(m))},clone:function(m){return new c(this.point.clone(),this.direction.clone())},reverse:function(){return new c(this.point.clone(),this.direction.negated())},transform:function(m){let h=this.point.multiply4x4(m);m=this.point.plus(this.direction).multiply4x4(m).minus(h);
return new c(h,m)},closestPointOnLine:function(m){m=new d(m);m=m.minus(this.point).dot(this.direction)/this.direction.dot(this.direction);return this.point.plus(this.direction.times(m))},distanceToPoint:function(m){m=new d(m);let h=this.closestPointOnLine(m);return m.minus(h).length()},equals:function(m){return!this.direction.equals(m.direction)||this.distanceToPoint(m.point)>l?!1:!0}};b.exports=c},{"../constants":24,"../utils":42,"./Vector3":35}],27:[function(a,b,n){const d=a("./Vector3"),l=a("./Vector2"),
g=a("./OrthoNormalBasis"),c=a("./Plane"),m=function(h){this.elements=1<=arguments.length?h:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]};m.prototype={plus:function(h){for(var e=[],f=0;16>f;f++)e[f]=this.elements[f]+h.elements[f];return new m(e)},minus:function(h){for(var e=[],f=0;16>f;f++)e[f]=this.elements[f]-h.elements[f];return new m(e)},multiply:function(h){var e=this.elements[0],f=this.elements[1],k=this.elements[2],p=this.elements[3],q=this.elements[4],r=this.elements[5],t=this.elements[6],A=this.elements[7],
x=this.elements[8],D=this.elements[9],u=this.elements[10],v=this.elements[11],y=this.elements[12],C=this.elements[13],w=this.elements[14],z=this.elements[15],B=h.elements[0],E=h.elements[1],H=h.elements[2],F=h.elements[3],G=h.elements[4],I=h.elements[5],J=h.elements[6],M=h.elements[7],N=h.elements[8],K=h.elements[9],L=h.elements[10],O=h.elements[11],P=h.elements[12],Q=h.elements[13],T=h.elements[14];h=h.elements[15];var R=[];R[0]=e*B+f*G+k*N+p*P;R[1]=e*E+f*I+k*K+p*Q;R[2]=e*H+f*J+k*L+p*T;R[3]=e*F+
f*M+k*O+p*h;R[4]=q*B+r*G+t*N+A*P;R[5]=q*E+r*I+t*K+A*Q;R[6]=q*H+r*J+t*L+A*T;R[7]=q*F+r*M+t*O+A*h;R[8]=x*B+D*G+u*N+v*P;R[9]=x*E+D*I+u*K+v*Q;R[10]=x*H+D*J+u*L+v*T;R[11]=x*F+D*M+u*O+v*h;R[12]=y*B+C*G+w*N+z*P;R[13]=y*E+C*I+w*K+z*Q;R[14]=y*H+C*J+w*L+z*T;R[15]=y*F+C*M+w*O+z*h;return new m(R)},clone:function(){var h=this.elements.map(function(e){return e});return new m(h)},rightMultiply1x3Vector:function(h){var e=h._x,f=h._y,k=h._z;h=e*this.elements[0]+f*this.elements[1]+k*this.elements[2]+1*this.elements[3];
var p=e*this.elements[4]+f*this.elements[5]+k*this.elements[6]+1*this.elements[7],q=e*this.elements[8]+f*this.elements[9]+k*this.elements[10]+1*this.elements[11];e=e*this.elements[12]+f*this.elements[13]+k*this.elements[14]+1*this.elements[15];1!==e&&(e=1/e,h*=e,p*=e,q*=e);return new d(h,p,q)},leftMultiply1x3Vector:function(h){var e=h._x,f=h._y,k=h._z;h=e*this.elements[0]+f*this.elements[4]+k*this.elements[8]+1*this.elements[12];var p=e*this.elements[1]+f*this.elements[5]+k*this.elements[9]+1*this.elements[13],
q=e*this.elements[2]+f*this.elements[6]+k*this.elements[10]+1*this.elements[14];e=e*this.elements[3]+f*this.elements[7]+k*this.elements[11]+1*this.elements[15];1!==e&&(e=1/e,h*=e,p*=e,q*=e);return new d(h,p,q)},rightMultiply1x2Vector:function(h){var e=h.x,f=h.y;h=e*this.elements[0]+f*this.elements[1]+0*this.elements[2]+1*this.elements[3];var k=e*this.elements[4]+f*this.elements[5]+0*this.elements[6]+1*this.elements[7];e=e*this.elements[12]+f*this.elements[13]+0*this.elements[14]+1*this.elements[15];
1!==e&&(e=1/e,h*=e,k*=e);return new l(h,k)},leftMultiply1x2Vector:function(h){var e=h.x,f=h.y;h=e*this.elements[0]+f*this.elements[4]+0*this.elements[8]+1*this.elements[12];var k=e*this.elements[1]+f*this.elements[5]+0*this.elements[9]+1*this.elements[13];e=e*this.elements[3]+f*this.elements[7]+0*this.elements[11]+1*this.elements[15];1!==e&&(e=1/e,h*=e,k*=e);return new l(h,k)},isMirroring:function(){var h=new d(this.elements[0],this.elements[4],this.elements[8]),e=new d(this.elements[1],this.elements[5],
this.elements[9]),f=new d(this.elements[2],this.elements[6],this.elements[10]);return 0>h.cross(e).dot(f)}};m.unity=function(){return new m};m.rotationX=function(h){var e=1/180*Math.PI*h;h=Math.cos(e);e=Math.sin(e);return new m([1,0,0,0,0,h,e,0,0,-e,h,0,0,0,0,1])};m.rotationY=function(h){var e=1/180*Math.PI*h;h=Math.cos(e);e=Math.sin(e);return new m([h,0,-e,0,0,1,0,0,e,0,h,0,0,0,0,1])};m.rotationZ=function(h){var e=1/180*Math.PI*h;h=Math.cos(e);e=Math.sin(e);return new m([h,e,0,0,-e,h,0,0,0,0,1,0,
0,0,0,1])};m.rotation=function(h,e,f){h=new d(h);e=new d(e);e=c.fromNormalAndPoint(e,h);e=new g(e);var k=m.translation(h.negated());k=k.multiply(e.getProjectionMatrix());k=k.multiply(m.rotationZ(f));k=k.multiply(e.getInverseProjectionMatrix());return k=k.multiply(m.translation(h))};m.translation=function(h){h=new d(h);return new m([1,0,0,0,0,1,0,0,0,0,1,0,h.x,h.y,h.z,1])};m.mirroring=function(h){var e=h.normal.x,f=h.normal.y,k=h.normal.z;h=h.w;return new m([1-2*e*e,-2*f*e,-2*k*e,0,-2*e*f,1-2*f*f,
-2*k*f,0,-2*e*k,-2*f*k,1-2*k*k,0,2*e*h,2*f*h,2*k*h,1])};m.scaling=function(h){h=new d(h);return new m([h.x,0,0,0,0,h.y,0,0,0,0,h.z,0,0,0,0,1])};b.exports=m},{"./OrthoNormalBasis":28,"./Plane":30,"./Vector2":34,"./Vector3":35}],28:[function(a,b,n){const d=a("./Vector2"),l=a("./Vector3"),g=a("./Line2"),c=a("./Line3"),m=a("./Plane"),h=function(e,f){f=2>arguments.length?e.normal.randomNonParallelVector():new l(f);this.v=e.normal.cross(f).unit();this.u=this.v.cross(e.normal);this.plane=e;this.planeorigin=
e.normal.times(e.w)};h.GetCartesian=function(e,f){e=e+"/"+f;if("X/Y"===e)e=[0,0,1],f=[1,0,0];else if("Y/-X"===e)e=[0,0,1],f=[0,1,0];else if("-X/-Y"===e)e=[0,0,1],f=[-1,0,0];else if("-Y/X"===e)e=[0,0,1],f=[0,-1,0];else if("-X/Y"===e)e=[0,0,-1],f=[-1,0,0];else if("-Y/-X"===e)e=[0,0,-1],f=[0,-1,0];else if("X/-Y"===e)e=[0,0,-1],f=[1,0,0];else if("Y/X"===e)e=[0,0,-1],f=[0,1,0];else if("X/Z"===e)e=[0,-1,0],f=[1,0,0];else if("Z/-X"===e)e=[0,-1,0],f=[0,0,1];else if("-X/-Z"===e)e=[0,-1,0],f=[-1,0,0];else if("-Z/X"===
e)e=[0,-1,0],f=[0,0,-1];else if("-X/Z"===e)e=[0,1,0],f=[-1,0,0];else if("-Z/-X"===e)e=[0,1,0],f=[0,0,-1];else if("X/-Z"===e)e=[0,1,0],f=[1,0,0];else if("Z/X"===e)e=[0,1,0],f=[0,0,1];else if("Y/Z"===e)e=[1,0,0],f=[0,1,0];else if("Z/-Y"===e)e=[1,0,0],f=[0,0,1];else if("-Y/-Z"===e)e=[1,0,0],f=[0,-1,0];else if("-Z/Y"===e)e=[1,0,0],f=[0,0,-1];else if("-Y/Z"===e)e=[-1,0,0],f=[0,-1,0];else if("-Z/-Y"===e)e=[-1,0,0],f=[0,0,-1];else if("Y/-Z"===e)e=[-1,0,0],f=[0,1,0];else if("Z/Y"===e)e=[-1,0,0],f=[0,0,1];
else throw Error("OrthoNormalBasis.GetCartesian: invalid combination of axis identifiers. Should pass two string arguments from [X,Y,Z,-X,-Y,-Z], being two different axes.");return new h(new m(new l(e),0),new l(f))};h.Z0Plane=function(){let e=new m(new l([0,0,1]),0);return new h(e,new l([1,0,0]))};h.prototype={getProjectionMatrix:function(){return new (a("./Matrix4"))([this.u.x,this.v.x,this.plane.normal.x,0,this.u.y,this.v.y,this.plane.normal.y,0,this.u.z,this.v.z,this.plane.normal.z,0,0,0,-this.plane.w,
1])},getInverseProjectionMatrix:function(){const e=a("./Matrix4");let f=this.plane.normal.times(this.plane.w);return new e([this.u.x,this.u.y,this.u.z,0,this.v.x,this.v.y,this.v.z,0,this.plane.normal.x,this.plane.normal.y,this.plane.normal.z,0,f.x,f.y,f.z,1])},to2D:function(e){return new d(e.dot(this.u),e.dot(this.v))},to3D:function(e){return this.planeorigin.plus(this.u.times(e.x)).plus(this.v.times(e.y))},line3Dto2D:function(e){var f=e.point;e=e.direction.plus(f);f=this.to2D(f);e=this.to2D(e);return g.fromPoints(f,
e)},line2Dto3D:function(e){var f=e.origin();e=e.direction().plus(f);f=this.to3D(f);e=this.to3D(e);return c.fromPoints(f,e)},transform:function(e){let f=this.plane.transform(e);var k=this.u.transform(e);e=(new l(0,0,0)).transform(e);k=k.minus(e);return new h(f,k)}};b.exports=h},{"./Line2":25,"./Line3":26,"./Matrix4":27,"./Plane":30,"./Vector2":34,"./Vector3":35}],29:[function(a,b,n){const d=a("./Vector2"),{EPS:l,angleEPS:g}=a("../constants"),{parseOptionAs2DVector:c,parseOptionAsFloat:m,parseOptionAsInt:h,
parseOptionAsBool:e}=a("../../api/optionParsers"),{defaultResolution2D:f}=a("../constants"),k=a("./Vertex2"),p=a("./Side"),q=function(r,t){t=!!t;r=r||[];let A=null;t&&0<r.length&&(A=new d(r[r.length-1]));let x=[];r.map(function(D){D=new d(D);let u=!1;null!==A&&(u=D.distanceTo(A)<l);u||x.push(D);A=D});this.points=x;this.closed=t};q.arc=function(r){let t=c(r,"center",0),A=m(r,"radius",1),x=m(r,"startangle",0),D=m(r,"endangle",360);var u=h(r,"resolution",f);for(r=e(r,"maketangent",!1);720<=D-x;)D-=360;
for(;-720>=D-x;)D+=360;let v=[];var y=Math.abs(D-x);if(y<g){var C=d.fromAngle(x/180*Math.PI).times(A);v.push(C.plus(t))}else{u=Math.floor(u*y/360)+1;y=.5*u/y;.25<y&&(y=.25);let w=r?u+2:u;for(let z=0;z<=w;z++)C=z,r&&(C=(z-1)*(u-2*y)/u+y,0>C&&(C=0),C>u&&(C=u)),C=d.fromAngle((x+C*(D-x)/u)/180*Math.PI).times(A),v.push(C.plus(t))}return new q(v,!1)};q.prototype={concat:function(r){if(this.closed||r.closed)throw Error("Paths must not be closed");r=this.points.concat(r.points);return new q(r)},getPoints:function(){return this.points},
appendPoint:function(r){if(this.closed)throw Error("Path must not be closed");r=new d(r);r=this.points.concat([r]);return new q(r)},appendPoints:function(r){if(this.closed)throw Error("Path must not be closed");let t=this.points;r.forEach(function(A){t.push(new d(A))});return new q(t)},close:function(){return new q(this.points,!0)},isClosed:function(){return this.closed},getTurn:function(){const r=this.points;let t=0,A=r.length-1;for(let x=0;x<r.length;A=x++)t+=r[A].x*r[x].y-r[A].y*r[x].x;return 0<
t?"clockwise":0>t?"counter-clockwise":"straight"},rectangularExtrude:function(r,t,A){return this.expandToCAG(r/2,A).extrude({offset:[0,0,t]})},expandToCAG:function(r,t){const A=a("../CAG");let x=[],D=this.points.length,u=0;this.closed&&2<D&&(u=-1);for(let C=u;C<D;C++){var v=C;0>v&&(v=D-1);v=new k(this.points[v]);if(C>u){var y=new p(y,v);x.push(y)}y=v}return A.fromSides(x).expandedShell(r,t)},innerToCAG:function(){const r=a("../CAG");if(!this.closed)throw Error("The path should be closed!");return r.fromPoints(this.points)},
transform:function(r){let t=this.points.map(function(A){return A.multiply4x4(r)});return new q(t,this.closed)},appendBezier:function(r,t){2>arguments.length&&(t={});if(this.closed)throw Error("Path must not be closed");if(!(r instanceof Array))throw Error("appendBezier: should pass an array of control points");if(1>r.length)throw Error("appendBezier: need at least 1 control point");if(1>this.points.length)throw Error("appendBezier: path must already contain a point (the endpoint of the path is used as the starting point for the bezier curve)");
var A=h(t,"resolution",f);4>A&&(A=4);var x=[];let D=[];D.push(this.points[this.points.length-1]);for(var u=0;u<r.length;++u){var v=r[u];if(null===v){if(0!==u)throw Error("appendBezier: null can only be passed as the first control point");if(2>r.length)throw Error("appendBezier: null can only be passed if there is at least one more control point");if("lastBezierControlPoint"in this)v=this.lastBezierControlPoint;else{if(2>this.points.length)throw Error("appendBezier: null is passed as a control point but this requires a previous bezier curve or at least two points in the existing path");
v=this.points[this.points.length-2]}v=this.points[this.points.length-1].times(2).minus(v)}else v=new d(v);D.push(v)}let y=D.length-1;u=1;for(v=0;v<=y;++v)0<v&&(u*=v),x.push(u);let C=[];for(u=0;u<=y;++u)C.push(x[y]/(x[u]*x[y-u]));x=function(H){let F=1,G=Math.pow(1-H,y),I=1!==H?1/(1-H):1,J=new d(0,0);for(let M=0;M<=y;++M)M===y&&(G=1),J=J.plus(D[M].times(C[M]*F*G)),F*=H,G*=I;return J};u=[];v=[];var w=y+1;for(var z=0;z<w;++z){var B=z/(w-1),E=x(B);u.push(E);v.push(B)}w=1;for(A=Math.sin(2*Math.PI/A);w<
u.length-1;)if(z=u[w].minus(u[w-1]).unit(),B=u[w+1].minus(u[w]).unit(),z=z.cross(B),Math.abs(z)>A){B=v[w-1];E=v[w+1];z=B+(E-B)/3;B+=2*(E-B)/3;E=x(z);let H=x(B);u.splice(w,1,E,H);v.splice(w,1,z,B);w--;1>w&&(w=1)}else++w;u=this.points.concat(u.slice(1));x=new q(u);x.lastBezierControlPoint=D[D.length-2];return x},appendArc:function(r,t){2>arguments.length&&(t={});if(this.closed)throw Error("Path must not be closed");if(1>this.points.length)throw Error("appendArc: path must already contain a point (the endpoint of the path is used as the starting point for the arc)");
var A=h(t,"resolution",f);4>A&&(A=4);let x,D;if("xradius"in t||"yradius"in t){if("radius"in t)throw Error("Should either give an xradius and yradius parameter, or a radius parameter");x=m(t,"xradius",0);D=m(t,"yradius",0)}else D=x=m(t,"radius",0);var u=m(t,"xaxisrotation",0),v=e(t,"clockwise",!1),y=e(t,"large",!1),C=this.points[this.points.length-1];r=new d(r);x=Math.round(1E5*x)/1E5;D=Math.round(1E5*D)/1E5;r=new d(Math.round(1E5*r.x)/1E5,Math.round(1E5*r.y)/1E5);var w=!v;v=[];if(0===x||0===D)v.push(r);
else{x=Math.abs(x);D=Math.abs(D);var z=u*Math.PI/180;u=Math.cos(z);z=Math.sin(z);var B=C.minus(r).times(.5);B=new d(Math.round(1E5*(u*B.x+z*B.y))/1E5,Math.round(1E5*(-z*B.x+u*B.y))/1E5);var E=B.x*B.x/(x*x)+B.y*B.y/(D*D);1<E&&(E=Math.sqrt(E),x*=E,D*=E,x=Math.round(1E5*x)/1E5,D=Math.round(1E5*D)/1E5);E=Math.sqrt((x*x*D*D-x*x*B.y*B.y-D*D*B.x*B.x)/(x*x*B.y*B.y+D*D*B.x*B.x));w===y&&(E=-E);y=(new d(x*B.y/D,-D*B.x/x)).times(E);C=(new d(u*y.x-z*y.y,z*y.x+u*y.y)).plus(C.plus(r).times(.5));E=new d((B.x-y.x)/
x,(B.y-y.y)/D);B=new d((-B.x-y.x)/x,(-B.y-y.y)/D);y=E.angleRadians();B=(B.angleRadians()-y)%(2*Math.PI);!w&&0<B?B-=2*Math.PI:w&&0>B&&(B+=2*Math.PI);A=Math.ceil(Math.abs(B)/(2*Math.PI)*A)+1;1>A&&(A=1);for(w=1;w<=A;w++){var H=y+w/A*B;E=Math.cos(H);H=Math.sin(H);E=(new d(u*x*E-z*D*H,z*x*E+u*D*H)).plus(C);v.push(E)}}v=this.points.concat(v);return new q(v)}};b.exports=q},{"../../api/optionParsers":11,"../CAG":15,"../constants":24,"./Side":33,"./Vector2":34,"./Vertex2":36}],30:[function(a,b,n){const d=
a("./Vector3"),l=a("./Line3"),{EPS:g,getTag:c}=a("../constants"),m=function(h,e){this.normal=h;this.w=e};m.fromObject=function(h){let e=new d(h.normal);h=parseFloat(h.w);return new m(e,h)};m.fromVector3Ds=function(h,e,f){e=e.minus(h).cross(f.minus(h)).unit();return new m(e,e.dot(h))};m.anyPlaneFromVector3Ds=function(h,e,f){e=e.minus(h);f=f.minus(h);e.length()<g&&(e=f.randomNonParallelVector());f.length()<g&&(f=e.randomNonParallelVector());f=e.cross(f);f.length()<g&&(f=e.randomNonParallelVector(),
f=e.cross(f));f=f.unit();return new m(f,f.dot(h))};m.fromPoints=function(h,e,f){h=new d(h);e=new d(e);f=new d(f);return m.fromVector3Ds(h,e,f)};m.fromNormalAndPoint=function(h,e){h=new d(h);e=new d(e);h=h.unit();e=e.dot(h);return new m(h,e)};m.prototype={flipped:function(){return new m(this.normal.negated(),-this.w)},getTag:function(){let h=this.tag;h||(this.tag=h=c());return h},equals:function(h){return this.normal.equals(h.normal)&&this.w===h.w},transform:function(h){let e=h.isMirroring();var f=
this.normal.randomNonParallelVector(),k=this.normal.cross(f),p=this.normal.cross(k);f=this.normal.times(this.w);k=f.plus(k);p=f.plus(p);f=f.multiply4x4(h);k=k.multiply4x4(h);p=p.multiply4x4(h);h=m.fromVector3Ds(f,k,p);e&&(h=h.flipped());return h},splitLineBetweenPoints:function(h,e){e=e.minus(h);let f=(this.w-this.normal.dot(h))/this.normal.dot(e);isNaN(f)&&(f=0);1<f&&(f=1);0>f&&(f=0);return h.plus(e.times(f))},intersectWithLine:function(h){return h.intersectWithPlane(this)},intersectWithPlane:function(h){return l.fromPlanes(this,
h)},signedDistanceToPoint:function(h){return this.normal.dot(h)-this.w},toString:function(){return"[normal: "+this.normal.toString()+", w: "+this.w+"]"},mirrorPoint:function(h){let e=this.signedDistanceToPoint(h);return h.minus(this.normal.times(2*e))}};b.exports=m},{"../constants":24,"./Line3":26,"./Vector3":35}],31:[function(a,b,n){function d(g){this.sides=l(g).sides}n=a("../CAG");const {fromPoints:l}=a("../CAGFactories");d.prototype=n.prototype;b.exports=d},{"../CAG":15,"../CAGFactories":16}],
32:[function(a,b,n){const d=a("./Vector3"),l=a("./Vertex3"),g=a("./Matrix4"),{_CSGDEBUG:c,EPS:m,getTag:h,areaEPS:e}=a("../constants");let f=function(k,p,q){this.vertices=k;p||(p=f.defaultShared);this.shared=p;this.plane=3<=arguments.length?q:a("./Plane").fromVector3Ds(k[0].pos,k[1].pos,k[2].pos);if(c&&!this.checkIfConvex())throw Error("Not convex!");};f.prototype={checkIfConvex:function(){return f.verticesConvex(this.vertices,this.plane.normal)},setColor:function(k){this.shared=f.Shared.fromColor.apply(this,
arguments);return this},getSignedVolume:function(){let k=0;for(let p=0;p<this.vertices.length-2;p++)k+=this.vertices[0].pos.dot(this.vertices[p+1].pos.cross(this.vertices[p+2].pos));return k/6},getArea:function(){let k=0;for(let p=0;p<this.vertices.length-2;p++)k+=this.vertices[p+1].pos.minus(this.vertices[0].pos).cross(this.vertices[p+2].pos.minus(this.vertices[p+1].pos)).length();return k/2},getTetraFeatures:function(k){let p=[];k.forEach(function(q){"volume"===q?p.push(this.getSignedVolume()):
"area"===q&&p.push(this.getArea())},this);return p},extrude:function(k){const {fromPolygons:p}=a("../CSGFactories");let q=[],r=this;0<r.plane.normal.dot(k)&&(r=r.flipped());q.push(r);k=r.translate(k);let t=this.vertices.length;for(let x=0;x<t;x++){var A=[];let D=x<t-1?x+1:0;A.push(r.vertices[x].pos);A.push(k.vertices[x].pos);A.push(k.vertices[D].pos);A.push(r.vertices[D].pos);A=f.createFromPoints(A,this.shared);q.push(A)}k=k.flipped();q.push(k);return p(q)},translate:function(k){return this.transform(g.translation(k))},
boundingSphere:function(){if(!this.cachedBoundingSphere){var k=this.boundingBox();let p=k[0].plus(k[1]).times(.5);k=k[1].minus(p).length();this.cachedBoundingSphere=[p,k]}return this.cachedBoundingSphere},boundingBox:function(){if(!this.cachedBoundingBox){let k,p,q=this.vertices,r=q.length;p=k=0===r?new d(0,0,0):q[0].pos;for(let t=1;t<r;t++){let A=q[t].pos;k=k.min(A);p=p.max(A)}this.cachedBoundingBox=[k,p]}return this.cachedBoundingBox},flipped:function(){let k=this.vertices.map(function(q){return q.flipped()});
k.reverse();let p=this.plane.flipped();return new f(k,this.shared,p)},transform:function(k){let p=this.vertices.map(function(r){return r.transform(k)}),q=this.plane.transform(k);k.isMirroring()&&p.reverse();return new f(p,this.shared,q)},toString:function(){let k="Polygon plane: "+this.plane.toString()+"\n";this.vertices.map(function(p){k+=" "+p.toString()+"\n"});return k},projectToOrthoNormalBasis:function(k){const p=a("../CAG");var {fromPointsNoCheck:q}=a("../CAGFactories"),r=this.vertices.map(function(t){return k.to2D(t.pos)});
q=q(r);r=q.area();Math.abs(r)<e?q=new p:0>r&&(q=q.flipped());return q},solidFromSlices:function(k){return a("../../api/solidFromSlices")(this,k)}};f.fromObject=function(k){const p=a("./Plane");let q=k.vertices.map(function(t){return l.fromObject(t)}),r=f.Shared.fromObject(k.shared);k=p.fromObject(k.plane);return new f(q,r,k)};f.createFromPoints=function(k,p,q){let r=[];k.map(function(t){t=new d(t);t=new l(t);r.push(t)});return 3>arguments.length?new f(r,p):new f(r,p,q)};f.verticesConvex=function(k,
p){let q=k.length;if(2<q){let r=k[q-2].pos,t=k[q-1].pos;for(let A=0;A<q;A++){let x=k[A].pos;if(!f.isConvexPoint(r,t,x,p))return!1;r=t;t=x}}return!0};f.isConvexPoint=function(k,p,q,r){return 0<=p.minus(k).cross(q.minus(p)).dot(r)};f.isStrictlyConvexPoint=function(k,p,q,r){return p.minus(k).cross(q.minus(p)).dot(r)>=m};f.Shared=function(k){if(null!==k&&void 0!==k&&4!==k.length)throw Error("Expecting 4 element array");this.color=k};f.Shared.fromObject=function(k){return new f.Shared(k.color)};f.Shared.fromColor=
function(k){let p;if(1===arguments.length)p=arguments[0].slice();else{p=[];for(let q=0;q<arguments.length;q++)p.push(arguments[q])}if(3===p.length)p.push(1);else if(4!==p.length)throw Error("setColor expects either an array with 3 or 4 elements, or 3 or 4 parameters.");return new f.Shared(p)};f.Shared.prototype={getTag:function(){let k=this.tag;k||(this.tag=k=h());return k},getHash:function(){return this.color?this.color.join("/"):"null"}};f.defaultShared=new f.Shared(null);b.exports=f},{"../../api/solidFromSlices":14,
"../CAG":15,"../CAGFactories":16,"../CSGFactories":18,"../constants":24,"./Matrix4":27,"./Plane":30,"./Vector3":35,"./Vertex3":37}],33:[function(a,b,n){const d=a("./Vector2"),l=a("./Vertex2"),g=a("./Vertex3"),c=a("./Polygon3"),{getTag:m}=a("../constants"),h=function(e,f){if(!(e instanceof l))throw Error("Assertion failed");if(!(f instanceof l))throw Error("Assertion failed");this.vertex0=e;this.vertex1=f};h.fromObject=function(e){var f=l.fromObject(e.vertex0);e=l.fromObject(e.vertex1);return new h(f,
e)};h._fromFakePolygon=function(e){if(4>e.vertices.length)return null;var f=[];e=e.vertices.filter(function(p,q){return 0<p.pos.z?(f.push(q),!0):!1}).map(function(p){return new d(p.pos.x,p.pos.y)});if(2!==e.length)throw Error("Assertion failed: _fromFakePolygon: not enough points found");var k=f[1]-f[0];if(1===k||3===k)1===k&&e.reverse();else throw Error("Assertion failed: _fromFakePolygon: unknown index ordering");return new h(new l(e[0]),new l(e[1]))};h.prototype={toString:function(){return this.vertex0+
" -> "+this.vertex1},toPolygon3D:function(e,f){e=[new g(this.vertex0.pos.toVector3D(e)),new g(this.vertex1.pos.toVector3D(e)),new g(this.vertex1.pos.toVector3D(f)),new g(this.vertex0.pos.toVector3D(f))];return new c(e)},transform:function(e){var f=this.vertex0.pos.transform(e);e=this.vertex1.pos.transform(e);return new h(new l(f),new l(e))},flipped:function(){return new h(this.vertex1,this.vertex0)},direction:function(){return this.vertex1.pos.minus(this.vertex0.pos)},getTag:function(){var e=this.tag;
e||(this.tag=e=m());return e},lengthSquared:function(){let e=this.vertex1.pos.x-this.vertex0.pos.x,f=this.vertex1.pos.y-this.vertex0.pos.y;return e*e+f*f},length:function(){return Math.sqrt(this.lengthSquared())}};b.exports=h},{"../constants":24,"./Polygon3":32,"./Vector2":34,"./Vertex2":36,"./Vertex3":37}],34:[function(a,b,n){const {IsFloat:d}=a("../utils"),l=function(g,c){if(2===arguments.length)this._x=parseFloat(g),this._y=parseFloat(c);else{var m=!0;if(1===arguments.length)if("object"===typeof g)g instanceof
l?(this._x=g._x,this._y=g._y):g instanceof Array?(this._x=parseFloat(g[0]),this._y=parseFloat(g[1])):"x"in g&&"y"in g?(this._x=parseFloat(g.x),this._y=parseFloat(g.y)):m=!1;else{var h=parseFloat(g);this._y=this._x=h}else m=!1;m&&(d(this._x)&&d(this._y)||(m=!1));if(!m)throw Error("wrong arguments");}};l.fromAngle=function(g){return l.fromAngleRadians(g)};l.fromAngleDegrees=function(g){return l.fromAngleRadians(Math.PI*g/180)};l.fromAngleRadians=function(g){return l.Create(Math.cos(g),Math.sin(g))};
l.Create=function(g,c){var m=Object.create(l.prototype);m._x=g;m._y=c;return m};l.prototype={get x(){return this._x},get y(){return this._y},set x(g){throw Error("Vector2D is immutable");},set y(g){throw Error("Vector2D is immutable");},toVector3D:function(g){return new (a("./Vector3"))(this._x,this._y,g)},equals:function(g){return this._x===g._x&&this._y===g._y},clone:function(){return l.Create(this._x,this._y)},negated:function(){return l.Create(-this._x,-this._y)},plus:function(g){return l.Create(this._x+
g._x,this._y+g._y)},minus:function(g){return l.Create(this._x-g._x,this._y-g._y)},times:function(g){return l.Create(this._x*g,this._y*g)},dividedBy:function(g){return l.Create(this._x/g,this._y/g)},dot:function(g){return this._x*g._x+this._y*g._y},lerp:function(g,c){return this.plus(g.minus(this).times(c))},length:function(){return Math.sqrt(this.dot(this))},distanceTo:function(g){return this.minus(g).length()},distanceToSquared:function(g){return this.minus(g).lengthSquared()},lengthSquared:function(){return this.dot(this)},
unit:function(){return this.dividedBy(this.length())},cross:function(g){return this._x*g._y-this._y*g._x},normal:function(){return l.Create(this._y,-this._x)},multiply4x4:function(g){return g.leftMultiply1x2Vector(this)},transform:function(g){return g.leftMultiply1x2Vector(this)},angle:function(){return this.angleRadians()},angleDegrees:function(){return 180*this.angleRadians()/Math.PI},angleRadians:function(){return Math.atan2(this._y,this._x)},min:function(g){return l.Create(Math.min(this._x,g._x),
Math.min(this._y,g._y))},max:function(g){return l.Create(Math.max(this._x,g._x),Math.max(this._y,g._y))},toString:function(){return"("+this._x.toFixed(5)+", "+this._y.toFixed(5)+")"},abs:function(){return l.Create(Math.abs(this._x),Math.abs(this._y))}};b.exports=l},{"../utils":42,"./Vector3":35}],35:[function(a,b,n){const {IsFloat:d}=a("../utils"),l=a("./Vector2"),g=function(c,m,h){if(3===arguments.length)this._x=parseFloat(c),this._y=parseFloat(m),this._z=parseFloat(h);else if(2===arguments.length)this._x=
parseFloat(c),this._y=parseFloat(m),this._z=0;else{var e=!0;if(1===arguments.length)if("object"===typeof c)c instanceof g?(this._x=c._x,this._y=c._y,this._z=c._z):c instanceof l?(this._x=c._x,this._y=c._y,this._z=0):c instanceof Array?2>c.length||3<c.length?e=!1:(this._x=parseFloat(c[0]),this._y=parseFloat(c[1]),this._z=3===c.length?parseFloat(c[2]):0):"x"in c&&"y"in c?(this._x=parseFloat(c.x),this._y=parseFloat(c.y),this._z="z"in c?parseFloat(c.z):0):"_x"in c&&"_y"in c?(this._x=parseFloat(c._x),
this._y=parseFloat(c._y),this._z="_z"in c?parseFloat(c._z):0):e=!1;else{var f=parseFloat(c);this._z=this._y=this._x=f}else e=!1;if(e)d(this._x)&&d(this._y)&&d(this._z);else throw Error("wrong arguments");}};g.Create=function(c,m,h){var e=Object.create(g.prototype);e._x=c;e._y=m;e._z=h;return e};g.prototype={get x(){return this._x},get y(){return this._y},get z(){return this._z},set x(c){throw Error("Vector3D is immutable");},set y(c){throw Error("Vector3D is immutable");},set z(c){throw Error("Vector3D is immutable");
},clone:function(){return g.Create(this._x,this._y,this._z)},negated:function(){return g.Create(-this._x,-this._y,-this._z)},abs:function(){return g.Create(Math.abs(this._x),Math.abs(this._y),Math.abs(this._z))},plus:function(c){return g.Create(this._x+c._x,this._y+c._y,this._z+c._z)},minus:function(c){return g.Create(this._x-c._x,this._y-c._y,this._z-c._z)},times:function(c){return g.Create(this._x*c,this._y*c,this._z*c)},dividedBy:function(c){return g.Create(this._x/c,this._y/c,this._z/c)},dot:function(c){return this._x*
c._x+this._y*c._y+this._z*c._z},lerp:function(c,m){return this.plus(c.minus(this).times(m))},lengthSquared:function(){return this.dot(this)},length:function(){return Math.sqrt(this.lengthSquared())},unit:function(){return this.dividedBy(this.length())},cross:function(c){return g.Create(this._y*c._z-this._z*c._y,this._z*c._x-this._x*c._z,this._x*c._y-this._y*c._x)},distanceTo:function(c){return this.minus(c).length()},distanceToSquared:function(c){return this.minus(c).lengthSquared()},equals:function(c){return this._x===
c._x&&this._y===c._y&&this._z===c._z},multiply4x4:function(c){return c.leftMultiply1x3Vector(this)},transform:function(c){return c.leftMultiply1x3Vector(this)},toString:function(){return"("+this._x.toFixed(5)+", "+this._y.toFixed(5)+", "+this._z.toFixed(5)+")"},randomNonParallelVector:function(){var c=this.abs();return c._x<=c._y&&c._x<=c._z?g.Create(1,0,0):c._y<=c._x&&c._y<=c._z?g.Create(0,1,0):g.Create(0,0,1)},min:function(c){return g.Create(Math.min(this._x,c._x),Math.min(this._y,c._y),Math.min(this._z,
c._z))},max:function(c){return g.Create(Math.max(this._x,c._x),Math.max(this._y,c._y),Math.max(this._z,c._z))}};b.exports=g},{"../utils":42,"./Vector2":34}],36:[function(a,b,n){const d=a("./Vector2"),{getTag:l}=a("../constants"),g=function(c){this.pos=c};g.fromObject=function(c){return new g(new d(c.pos._x,c.pos._y))};g.prototype={toString:function(){return"("+this.pos.x.toFixed(5)+","+this.pos.y.toFixed(5)+")"},getTag:function(){var c=this.tag;c||(this.tag=c=l());return c}};b.exports=g},{"../constants":24,
"./Vector2":34}],37:[function(a,b,n){const d=a("./Vector3"),{getTag:l}=a("../constants"),g=function(c){this.pos=c};g.fromObject=function(c){c=new d(c.pos);return new g(c)};g.prototype={flipped:function(){return this},getTag:function(){var c=this.tag;c||(this.tag=c=l());return c},interpolate:function(c,m){c=this.pos.lerp(c.pos,m);return new g(c)},transform:function(c){c=this.pos.multiply4x4(c);return new g(c)},toString:function(){return this.pos.toString()}};b.exports=g},{"../constants":24,"./Vector3":35}],
38:[function(a,b,n){const {EPS:d}=a("../constants"),{solve2Linear:l}=a("../utils");b.exports={linesIntersect:function(g,c,m,h){if(c.equals(m)||h.equals(g)){if(h.minus(m).unit().plus(c.minus(g).unit()).length()<d)return!0}else{c=c.minus(g);h=h.minus(m);if(1E-9>Math.abs(c.cross(h)))return!1;g=l(-c.x,h.x,-c.y,h.y,g.x-m.x,g.y-m.y);if(1E-6<g[0]&&.999999>g[0]&&1E-5<g[1]&&.999999>g[1])return!0}return!1}}},{"../constants":24,"../utils":42}],39:[function(a,b,n){const {EPS:d}=a("../constants"),l=a("./OrthoNormalBasis"),
{interpolateBetween2DPointsForY:g,insertSorted:c,fnNumberSort:m}=a("../utils"),h=a("./Vertex3"),e=a("./Vector2"),f=a("./Line2"),k=a("./Polygon3");b.exports=function(p,q){var r=p.length;if(0<r){let F=p[0].plane,G=p[0].shared,I=new l(F),J=[],M=[],N={},K={};var t={},A=1/d*10;for(var x=0;x<r;x++){var D=p[x],u=[],v=D.vertices.length,y=-1;if(0<v){var C=void 0,w=void 0;for(var z=0;z<v;z++){var B=I.to2D(D.vertices[z].pos),E=Math.floor(B.y*A);let L;E in t?L=t[E]:E+1 in t?L=t[E+1]:E-1 in t?L=t[E-1]:(L=B.y,
t[E]=B.y);B=e.Create(B.x,L);u.push(B);B=B.y;if(0===z||B<C)C=B,y=z;if(0===z||B>w)w=B;B in K||(K[B]={});K[B][x]=!0}C>=w?(u=[],v=0,y=-1):(C in N||(N[C]=[]),N[C].push(x))}u.reverse();y=v-y-1;J.push(u);M.push(y)}p=[];for(var H in K)p.push(H);p.sort(m);H=[];A=[];for(r=0;r<p.length;r++){t=[];u=p[r];x=Number(u);D=K[u];for(v=0;v<H.length;++v)if(y=H[v],C=y.polygonindex,D[C]){C=J[C];w=C.length;B=y.leftvertexindex;for(z=y.rightvertexindex;;){E=B+1;E>=w&&(E=0);if(C[E].y!==x)break;B=E}E=z-1;0>E&&(E=w-1);C[E].y===
x&&(z=E);B!==y.leftvertexindex&&B===z?(H.splice(v,1),--v):(y.leftvertexindex=B,y.rightvertexindex=z,y.topleft=C[B],y.topright=C[z],B+=1,B>=w&&(B=0),y.bottomleft=C[B],--z,0>z&&(z=w-1),y.bottomright=C[z])}if(r>=p.length-1)H=[],D=null;else{D=Number(p[r+1]);let L=.5*(x+D);u=N[u];for(let O in u){v=u[O];y=J[v];C=y.length;for(w=z=M[v];;){B=w+1;B>=C&&(B=0);if(y[B].y!==x)break;if(B===z)break;w=B}for(;;){B=z-1;0>B&&(B=C-1);if(y[B].y!==x)break;if(B===w)break;z=B}B=w+1;B>=C&&(B=0);E=z-1;0>E&&(E=C-1);c(H,{polygonindex:v,
leftvertexindex:w,rightvertexindex:z,topleft:y[w],topright:y[z],bottomleft:y[B],bottomright:y[E]},function(P,Q){P=g(P.topleft,P.bottomleft,L);Q=g(Q.topleft,Q.bottomleft,L);return P>Q?1:P<Q?-1:0})}}for(let L in H)C=H[L],w=g(C.topleft,C.bottomleft,x),u=e.Create(w,x),w=g(C.topright,C.bottomright,x),v=e.Create(w,x),w=g(C.topleft,C.bottomleft,D),y=e.Create(w,D),w=g(C.topright,C.bottomright,D),C=e.Create(w,D),u={topleft:u,topright:v,bottomleft:y,bottomright:C,leftline:f.fromPoints(u,y),rightline:f.fromPoints(C,
v)},0<t.length&&(v=t[t.length-1],y=u.topleft.distanceTo(v.topright),C=u.bottomleft.distanceTo(v.bottomright),y<d&&C<d&&(u.topleft=v.topleft,u.leftline=v.leftline,u.bottomleft=v.bottomleft,t.splice(t.length-1,1))),t.push(u);if(0<r){x={};D={};for(u=0;u<t.length;u++)for(v=t[u],y=0;y<A.length;y++)if(!D[y]&&(C=A[y],C.bottomleft.distanceTo(v.topleft)<d&&C.bottomright.distanceTo(v.topright)<d)){D[y]=!0;w=v.leftline.direction().x-C.leftline.direction().x;E=v.rightline.direction().x-C.rightline.direction().x;
z=Math.abs(w)<d;E=(B=Math.abs(E)<d)||0<=E;(z||0<=w)&&E&&(v.outpolygon=C.outpolygon,v.leftlinecontinues=z,v.rightlinecontinues=B,x[y]=!0);break}for(D=0;D<A.length;D++)if(!x[D]){u=A[D];u.outpolygon.rightpoints.push(u.bottomright);u.bottomright.distanceTo(u.bottomleft)>d&&u.outpolygon.leftpoints.push(u.bottomleft);u.outpolygon.leftpoints.reverse();let L=[];u.outpolygon.rightpoints.concat(u.outpolygon.leftpoints).map(function(O){O=I.to3D(O);O=new h(O);L.push(O)});u=new k(L,G,F);q.push(u)}}for(A=0;A<t.length;A++)x=
t[A],x.outpolygon?(x.leftlinecontinues||x.outpolygon.leftpoints.push(x.topleft),x.rightlinecontinues||x.outpolygon.rightpoints.push(x.topright)):(x.outpolygon={leftpoints:[],rightpoints:[]},x.outpolygon.leftpoints.push(x.topleft),x.topleft.distanceTo(x.topright)>d&&x.outpolygon.rightpoints.push(x.topright));A=t}}}},{"../constants":24,"../utils":42,"./Line2":25,"./OrthoNormalBasis":28,"./Polygon3":32,"./Vector2":34,"./Vertex3":37}],40:[function(a,b,n){const d=a("./math/Matrix4"),l=a("./math/Vector3"),
g=a("./math/Plane");b.exports={addTransformationMethodsToPrototype:function(c){c.mirrored=function(m){return this.transform(d.mirroring(m))};c.mirroredX=function(){let m=new g(l.Create(1,0,0),0);return this.mirrored(m)};c.mirroredY=function(){let m=new g(l.Create(0,1,0),0);return this.mirrored(m)};c.mirroredZ=function(){let m=new g(l.Create(0,0,1),0);return this.mirrored(m)};c.translate=function(m){return this.transform(d.translation(m))};c.scale=function(m){return this.transform(d.scaling(m))};c.rotateX=
function(m){return this.transform(d.rotationX(m))};c.rotateY=function(m){return this.transform(d.rotationY(m))};c.rotateZ=function(m){return this.transform(d.rotationZ(m))};c.rotate=function(m,h,e){return this.transform(d.rotation(m,h,e))};c.rotateEulerAngles=function(m,h,e,f){f=f||[0,0,0];m=d.rotationZ(m);h=d.rotationX(h);e=d.rotationZ(e);f=d.translation(new l(f));return this.transform(e.multiply(h).multiply(m).multiply(f))}},addCenteringToPrototype:function(c,m){c.center=function(h){h=Array.prototype.map.call(arguments,
function(f){return f});h.length||(h=m.slice());let e=this.getBounds();return this.translate(m.map(function(f){return-1<h.indexOf(f)?-(e[0][f]+e[1][f])/2:0}))}}}},{"./math/Matrix4":27,"./math/Plane":30,"./math/Vector3":35}],41:[function(a,b,n){const {_CSGDEBUG:d,EPS:l}=a("./constants"),g=a("./math/Vertex3"),c=a("./math/Polygon3"),m=function(){this.parent=null;this.children=[];this.polygon=null;this.removed=!1};m.prototype={addPolygons:function(e){if(!this.isRootNode())throw Error("Assertion failed");
let f=this;e.map(function(k){f.addChild(k)})},remove:function(){if(!this.removed){this.removed=!0;if(d){if(this.isRootNode())throw Error("Assertion failed");if(this.children.length)throw Error("Assertion failed");}let e=this.parent.children,f=e.indexOf(this);if(0>f)throw Error("Assertion failed");e.splice(f,1);this.parent.recursivelyInvalidatePolygon()}},isRemoved:function(){return this.removed},isRootNode:function(){return!this.parent},invert:function(){if(!this.isRootNode())throw Error("Assertion failed");
this.invertSub()},getPolygon:function(){if(!this.polygon)throw Error("Assertion failed");return this.polygon},getPolygons:function(e){let f=[this],k=[f],p,q,r,t;for(p=0;p<k.length;++p)for(f=k[p],q=0,r=f.length;q<r;q++)t=f[q],t.polygon?e.push(t.polygon):k.push(t.children)},splitByPlane:function(e,f,k,p,q){if(this.children.length){let r=[this.children],t,A,x,D,u;for(t=0;t<r.length;t++)for(u=r[t],A=0,x=u.length;A<x;A++)D=u[A],D.children.length?r.push(D.children):D._splitByPlane(e,f,k,p,q)}else this._splitByPlane(e,
f,k,p,q)},_splitByPlane:function(e,f,k,p,q){var r=this.polygon;if(r){var t=r.boundingSphere(),A=t[1]+l;t=e.normal.dot(t[0])-e.w;if(t>A)p.push(this);else if(t<-A)q.push(this);else{A={type:null,front:null,back:null};var x=e.normal;t=r.vertices;var D=t.length;if(r.plane.equals(e))A.type=0;else{var u=e.w,v=!1,y=!1,C=[],w=-l;for(var z=0;z<D;z++){var B=x.dot(t[z].pos)-u;C.push(0>B);B>l&&(v=!0);B<w&&(y=!0)}if(v||y)if(y)if(v){A.type=4;x=[];u=[];v=C[0];for(y=0;y<D;y++)w=t[y],B=y+1,B>=D&&(B=0),z=C[B],v===z?
v?u.push(w):x.push(w):(B=e.splitLineBetweenPoints(w.pos,t[B].pos),B=new g(B),v?(u.push(w),u.push(B),x.push(B)):(x.push(w),x.push(B),u.push(B))),v=z;e=l*l;if(3<=u.length)for(t=u[u.length-1],D=0;D<u.length;D++)C=u[D],C.pos.distanceToSquared(t.pos)<e&&(u.splice(D,1),D--),t=C;if(3<=x.length)for(t=x[x.length-1],D=0;D<x.length;D++)C=x[D],C.pos.distanceToSquared(t.pos)<e&&(x.splice(D,1),D--),t=C;3<=x.length&&(A.front=new c(x,r.shared,r.plane));3<=u.length&&(A.back=new c(u,r.shared,r.plane))}else A.type=
3;else A.type=2;else r=x.dot(r.plane.normal),A.type=0<=r?0:1}r=A;switch(r.type){case 0:f.push(this);break;case 1:k.push(this);break;case 2:p.push(this);break;case 3:q.push(this);break;case 4:r.front&&(f=this.addChild(r.front),p.push(f)),r.back&&(p=this.addChild(r.back),q.push(p))}}}},addChild:function(e){let f=new m;f.parent=this;f.polygon=e;this.children.push(f);return f},invertSub:function(){let e=[this],f=[e],k,p,q,r;for(k=0;k<f.length;k++)for(e=f[k],p=0,q=e.length;p<q;p++)r=e[p],r.polygon&&(r.polygon=
r.polygon.flipped()),f.push(r.children)},recursivelyInvalidatePolygon:function(){let e=this;for(;e.polygon;)e.polygon=null,e.parent&&(e=e.parent)}};a=function(e){this.polygonTree=new m;this.rootnode=new h(null);e&&this.addPolygons(e)};a.prototype={invert:function(){this.polygonTree.invert();this.rootnode.invert()},clipTo:function(e,f){this.rootnode.clipTo(e,!!f)},allPolygons:function(){let e=[];this.polygonTree.getPolygons(e);return e},addPolygons:function(e){let f=this;e=e.map(function(k){return f.polygonTree.addChild(k)});
this.rootnode.addPolygonTreeNodes(e)}};const h=function(e){this.back=this.front=this.plane=null;this.polygontreenodes=[];this.parent=e};h.prototype={invert:function(){let e=[this],f;for(let k=0;k<e.length;k++){f=e[k];f.plane&&(f.plane=f.plane.flipped());f.front&&e.push(f.front);f.back&&e.push(f.back);let p=f.front;f.front=f.back;f.back=p}},clipPolygons:function(e,f){var k={node:this,polygontreenodes:e};let p=[];do{var q=k.node;e=k.polygontreenodes;if(q.plane){k=[];let r=[],t=f?k:r,A=q.plane,x=e.length;
for(let D=0;D<x;D++){let u=e[D];u.isRemoved()||u.splitByPlane(A,t,k,r,k)}q.front&&0<r.length&&p.push({node:q.front,polygontreenodes:r});e=k.length;if(q.back&&0<e)p.push({node:q.back,polygontreenodes:k});else for(q=0;q<e;q++)k[q].remove()}k=p.pop()}while("undefined"!==typeof k)},clipTo:function(e,f){let k=this,p=[];do 0<k.polygontreenodes.length&&e.rootnode.clipPolygons(k.polygontreenodes,f),k.front&&p.push(k.front),k.back&&p.push(k.back),k=p.pop();while("undefined"!==typeof k)},addPolygonTreeNodes:function(e){e=
{node:this,polygontreenodes:e};let f,k=[];do{f=e.node;e=e.polygontreenodes;if(0===e.length){e=k.pop();continue}let q=f;if(!f.plane){var p=e[0].getPolygon().plane;f.plane=p}p=[];let r=[];for(let t=0,A=e.length;t<A;++t)e[t].splitByPlane(q.plane,q.polygontreenodes,r,p,r);0<p.length&&(f.front||(f.front=new h(f)),k.push({node:f.front,polygontreenodes:p}));0<r.length&&(f.back||(f.back=new h(f)),k.push({node:f.back,polygontreenodes:r}));e=k.pop()}while("undefined"!==typeof e)},getParentPlaneNormals:function(e,
f){0<f&&this.parent&&(e.push(this.parent.plane.normal),this.parent.getParentPlaneNormals(e,f-1))}};b.exports=a},{"./constants":24,"./math/Polygon3":32,"./math/Vertex3":37}],42:[function(a,b,n){b.exports={fnNumberSort:function(d,l){return d-l},fnSortByIndex:function(d,l){return d.index-l.index},IsFloat:function(d){return!isNaN(d)||Infinity===d||-Infinity===d},solve2Linear:function(d,l,g,c,m,h){let e=1/(d*c-l*g);return[(m*c-l*h)*e,(-m*g+d*h)*e]},insertSorted:function(d,l,g){let c=0,m=d.length;for(;m>
c;){let h=Math.floor((c+m)/2);0<g(l,d[h])?c=h+1:m=h}d.splice(c,0,l)},interpolateBetween2DPointsForY:function(d,l,g){g-=d.y;let c=l.y-d.y;0>c&&(g=-g,c=-c);return d.x+(0>=g?0:g>=c?1:1E-10>c?.5:g/c)*(l.x-d.x)},isCAG:function(d){return"sides"in d&&"length"in d.sides?!0:!1},isCSG:function(d){return"polygons"in d&&"length"in d.polygons?!0:!1}}},{}],43:[function(a,b,n){const d=a("../math/Vector2");b.exports={area:function(l){let g=0;l.sides.map(function(c){g+=c.vertex0.pos.cross(c.vertex1.pos)});return g*=
.5},getBounds:function(l){let g,c=g=0===l.sides.length?new d(0,0):l.sides[0].vertex0.pos;l.sides.map(function(m){g=g.min(m.vertex0.pos);g=g.min(m.vertex1.pos);c=c.max(m.vertex0.pos);c=c.max(m.vertex1.pos)});return[g,c]}}},{"../math/Vector2":34}],44:[function(a,b,n){const {areaEPS:d}=a("../constants"),{linesIntersect:l}=a("../math/lineUtils"),g=function(c,m){let h=null,e=null,f=!1;c.sides.forEach(k=>{h=k.vertex0.pos;e=k.vertex1.pos;g.c1(m,h,e)&&g.c2(m,h,e)&&(f=!f)});return f};g.c1=(c,m,h)=>m.y>c.y!==
h.y>c.y;g.c2=(c,m,h)=>c.x<(h.x-m.x)*(c.y-m.y)/(h.y-m.y)+m.x;b.exports={isCAGValid:function(c){let m=[];c.isSelfIntersecting(!0)&&m.push("Self intersects");let h={};c.sides.map(function(e){function f(k){k=k.x+" "+k.y;k in h||(h[k]=0);h[k]++}f(e.vertex0.pos);f(e.vertex1.pos)});for(let e in h){let f=h[e];f&1&&m.push("Uneven number of sides ("+f+") for point "+e)}c=c.area();c<d&&m.push("Area is "+c);if(0<m.length){let e="";m.map(function(f){e+=f+"\n"});throw Error(e);}},isSelfIntersecting:function(c,
m){let h=c.sides.length;for(let e=0;e<h;e++){let f=c.sides[e];for(let k=e+1;k<h;k++){let p=c.sides[k];if(l(f.vertex0.pos,f.vertex1.pos,p.vertex0.pos,p.vertex1.pos))return m&&(console.log("side "+e+": "+f),console.log("side "+k+": "+p)),!0}}return!1},hasPointInside:g,contains:function(c,m){for(let h=0,e=m.sides.length;h<e;h++)if(!g(c,m.sides[h].vertex0.pos))return!1;return!0}}},{"../constants":24,"../math/lineUtils":38}],45:[function(a,b,n){const {EPS:d}=a("../constants"),l=a("../FuzzyFactory3d"),
g=a("../FuzzyFactory2d"),{fromPolygons:c}=a("../CSGFactories"),{fromSides:m}=a("../CAGFactories"),h=function(f,k){let p=[];k.polygons.forEach(function(q){q=f.getPolygon(q);3<=q.vertices.length&&p.push(q)});return c(p)},e=function(f,k){k=k.sides.map(function(p){return f.getSide(p)}).filter(function(p){return p.length()>d});return m(k)};b.exports=function(f,k){if(f.isCanonicalized)return f;if("sides"in f)return f.isCanonicalized||(k=new g,f=e(k,f),f.isCanonicalized=!0),f;f.isCanonicalized||(k=new l,
k=h(k,f),k.isCanonicalized=!0,k.isRetesselated=f.isRetesselated,k.properties=f.properties,f=k);return f}},{"../CAGFactories":16,"../CSGFactories":18,"../FuzzyFactory2d":20,"../FuzzyFactory3d":21,"../constants":24}],46:[function(a,b,n){const d=a("../math/Vector3");b.exports={bounds:function(l){if(!l.cachedBoundingBox){let g=new d(0,0,0),c=new d(0,0,0),m=l.polygons,h=m.length;for(let e=0;e<h;e++){let f=m[e].boundingBox();0===e?(g=f[0],c=f[1]):(g=g.min(f[0]),c=c.max(f[1]))}l.cachedBoundingBox=[g,c]}return l.cachedBoundingBox},
volume:function(l){l=l.toTriangles().map(function(g){return g.getTetraFeatures(["volume"])});console.log("volume",l)},area:function(l){l=l.toTriangles().map(function(g){return g.getTetraFeatures(["area"])});console.log("area",l)}}},{"../math/Vector3":35}],47:[function(a,b,n){const d=a("../CAG"),{EPS:l}=a("../constants");b.exports={projectToOrthoNormalBasis:function(g,c){let m=[];g.polygons.filter(function(h){return h.plane.normal.minus(c.plane.normal).lengthSquared()<l*l}).map(function(h){h=h.projectToOrthoNormalBasis(c);
0<h.sides.length&&m.push(h)});return(new d).union(m)}}},{"../CAG":15,"../constants":24}],48:[function(a,b,n){function d(h,e,f,k,p,q){let r=k.getTag(),t=p.getTag();if(r===t)throw Error("Assertion failed");let A=r+"/"+t;if(t+"/"+r in h)return l(h,e,f,p,k,null),null;k={vertex0:k,vertex1:p,polygonindex:q};A in h?h[A].push(k):h[A]=[k];r in e?e[r].push(A):e[r]=[A];t in f?f[t].push(A):f[t]=[A];return A}function l(h,e,f,k,p,q){let r=k.getTag(),t=p.getTag(),A=r+"/"+t;if(!(A in h))throw Error("Assertion failed");
let x=-1,D=h[A];for(let u=0;u<D.length;u++){let v=D[u];if(v.vertex0===k&&v.vertex1===p&&(null===q||v.polygonindex===q)){x=u;break}}if(0>x)throw Error("Assertion failed");D.splice(x,1);0===D.length&&delete h[A];x=e[r].indexOf(A);if(0>x)throw Error("Assertion failed");e[r].splice(x,1);0===e[r].length&&delete e[r];x=f[t].indexOf(A);if(0>x)throw Error("Assertion failed");f[t].splice(x,1);0===f[t].length&&delete f[t]}const {EPS:g}=a("../constants"),c=a("../math/Polygon3"),m=a("../math/Plane");b.exports=
function(h,e){e=e.canonicalized();let f={};for(var k=0;k<e.polygons.length;k++){var p=e.polygons[k],q=p.vertices.length;if(3<=q){var r=p.vertices[0],t=r.getTag();for(var A=0;A<q;A++){var x=A+1;x===q&&(x=0);x=p.vertices[x];var D=x.getTag(),u=t+"/"+D;t=D+"/"+t;t in f?(r=f[t],r.splice(-1,1),0===r.length&&delete f[t]):(r={vertex0:r,vertex1:x,polygonindex:k},u in f?f[u].push(r):f[u]=[r]);r=x;t=D}}}let v={},y={};k={};p=!0;for(let H in f)p=!1,k[H]=!0,f[H].map(function(F){let G=F.vertex0.getTag();F=F.vertex1.getTag();
G in v?v[G].push(H):v[G]=[H];F in y?y[F].push(H):y[F]=[H]});if(!p){for(p=e.polygons.slice(0);;){q=!0;for(let H in f)q=!1,k[H]=!0;if(q)break;for(r=!1;;){q=null;for(let H in k){q=H;break}if(null===q)break;u=!0;if(q in f){A=f[q];if(0===A.length)throw Error("Assertion failed");A=A[0];for(t=0;2>t;t++){var C=0===t?A.vertex0:A.vertex1;x=0===t?A.vertex1:A.vertex0;var w=C.getTag();let H=x.getTag(),F=[];0===t?w in y&&(F=y[w]):w in v&&(F=v[w]);for(let G=0;G<F.length;G++){D=f[F[G]][0];var z=0===t?D.vertex0:D.vertex1,
B=0===t?D.vertex1:D.vertex0,E=z.getTag();if(B.getTag()!==w)throw Error("Assertion failed");if(E===H){l(f,v,y,C,x,null);l(f,v,y,x,C,null);u=!1;t=2;r=!0;break}else{B=C.pos;E=x.pos;z=z.pos.minus(B);let I=E.minus(B).dot(z)/z.dot(z);if(0<I&&1>I&&B.plus(z.times(I)).distanceToSquared(E)<g*g){r=D.polygonindex;u=p[r];C=D.vertex1.getTag();t=-1;for(w=0;w<u.vertices.length;w++)if(u.vertices[w].getTag()===C){t=w;break}if(0>t)throw Error("Assertion failed");C=u.vertices.slice(0);C.splice(t,0,x);let J=new c(C,u.shared);
if(isNaN(J.plane.w)){let M=!1,N=function(K){J.vertices.forEach(function(L){M||K(L)})};N(function(K){N(function(L){N(function(O){J.plane=m.fromPoints(K.pos,L.pos,O.pos);isNaN(J.plane.w)||(M=!0)})})})}p[r]=J;l(f,v,y,D.vertex0,D.vertex1,r);u=d(f,v,y,D.vertex0,x,r);x=d(f,v,y,x,D.vertex1,r);null!==u&&(k[u]=!0);null!==x&&(k[x]=!0);u=!1;t=2;r=!0;break}}}}}u&&delete k[q]}if(!r)break}h=h(p);h.properties=e.properties;h.isCanonicalized=!0;h.isRetesselated=!0;e=h}return e}},{"../constants":24,"../math/Plane":30,
"../math/Polygon3":32}],49:[function(a,b,n){const d=a("../FuzzyFactory3d"),l=a("../math/reTesselateCoplanarPolygons"),{fromPolygons:g}=a("../CSGFactories");b.exports=function(c){if(c.isRetesselated)return c;let m={},h=c.isCanonicalized,e=new d;c.polygons.map(function(k){var p=k.plane;let q=k.shared;h||(p=e.getPlane(p),q=e.getPolygonShared(q));p=p.getTag()+"/"+q.getTag();p in m?m[p].push(k):m[p]=[k]});var f=[];for(let k in m){let p=m[k];if(2>p.length)f=f.concat(p);else{let q=[];l(p,q);f=f.concat(q)}}f=
g(f);f.isRetesselated=!0;f.properties=c.properties;return f}},{"../CSGFactories":18,"../FuzzyFactory3d":21,"../math/reTesselateCoplanarPolygons":39}],50:[function(a,b,n){b.exports=function(d){return d?d.constructor!==Array?[d]:d:[]}},{}]},{},[1])(1)});var BinaryFileWriter=function(a){this.offset=0;this.buffer=new ArrayBuffer(a);this.dataView=new DataView(this.buffer)};BinaryFileWriter.prototype.toBlob=function(){return new Blob([this.dataView],{type:"application/octet-binary"})};BinaryFileWriter.prototype.writeUint32=function(a){this.dataView.setUint32(this.offset,a,!0);this.offset+=4};BinaryFileWriter.prototype.writeUint16=function(a){this.dataView.setUint16(this.offset,a,!0);this.offset+=2};
BinaryFileWriter.prototype.writeUint8=function(a){this.dataView.setUint8(this.offset,a,!0);this.offset+=1};BinaryFileWriter.prototype.writeFloat32=function(a){this.dataView.setFloat32(this.offset,a,!0);this.offset+=4};BinaryFileWriter.prototype.writeVec3=function(a){this.writeFloat32(a.x);this.writeFloat32(a.y);this.writeFloat32(a.z)};function SphereData(a,b){this.pos=a;this.radius=b}function CylinderData(a,b,n){this.pos1=a;this.pos2=b;this.radius=n}function TriangleData(a){this.trianglePoints=a}
function generateCsgMeshFrom(a,b,n){let d=null;0<n.length&&printUiSettings.exportTriangles&&(d=cindyTrianglePointsToIndexedMesh(n[0].trianglePoints,.01),printUiSettings.extrudeSurfaces&&(d=printUiSettings.smoothEdges?createOpenSurfaceShellMeshWithNormalsAndRoundEdges(d,printUiSettings.extrusionRadius):createOpenSurfaceShellMeshWithNormals(d,printUiSettings.extrusionRadius)));setCsgResolutionSphere(printUiSettings.sphereQuality);setCsgResolutionCylinder(printUiSettings.cylinderQuality);let l=[];for(var g=
0;g<a.length;g++){var c=a[g].radius;0<n.length&&printUiSettings.extrudeSurfaces&&printUiSettings.exportTriangles&&(c+=1*printUiSettings.extrusionRadius,c*=printUiSettings.radiusFactor);l.push(createCSGSphere(a[g].pos,c))}for(g=0;g<b.length;g++)c=b[g].radius,0<n.length&&printUiSettings.extrudeSurfaces&&printUiSettings.exportTriangles&&(c+=1*printUiSettings.extrusionRadius,c*=printUiSettings.radiusFactor),l.push(createCSGCylinder(b[g].pos1,b[g].pos2,c));0<n.length&&printUiSettings.exportTriangles?0==
a.length&&0==b.length?a=d:(l=[convertTriangleMeshToCSGPolyhedron(d)].concat(l),a=mergeObjects(l)):a=mergeObjects(l);a.scale(printUiSettings.modelScale);return a};CindyJS.registerPlugin(1,"Cindy3DPrint",function(a){function b(k,p){let q,r;for(q in k)(r=p[q])?r(c(k[q])):console.log("Modifier "+q+" not supported")}function n(k){h=[];e=[];f=[];for(var p=0;p<k.spheres.count&&printUiSettings.exportSpheres;p++){var q=p*k.spheres.itemLength,r=k.spheres.dataAttribs[q+3];h.push(new SphereData([k.spheres.dataAttribs[q+0]/r,k.spheres.dataAttribs[q+1]/r,k.spheres.dataAttribs[q+2]/r],k.spheres.dataAttribs[q+11]))}for(p=0;p<k.cylinders.count&&printUiSettings.exportCylinders;p++){q=
p*k.cylinders.itemLength;r=k.cylinders.dataAttribs[q+3];var t=k.cylinders.dataAttribs[q+7];e.push(new CylinderData([k.cylinders.dataAttribs[q+0]/r,k.cylinders.dataAttribs[q+1]/r,k.cylinders.dataAttribs[q+2]/r],[k.cylinders.dataAttribs[q+4]/t,k.cylinders.dataAttribs[q+5]/t,k.cylinders.dataAttribs[q+6]/t],k.cylinders.dataAttribs[q+15]))}p=[];for(q=0;q<k.triangles.count&&printUiSettings.exportTriangles;q++)for(r=q*k.triangles.itemLength,t=0;3>t;t++){let A=r+t*k.triangles.itemLength/k.triangles.numElements,
x=k.triangles.dataAttribs[A+3];p.push([k.triangles.dataAttribs[A+0]/x,k.triangles.dataAttribs[A+1]/x,k.triangles.dataAttribs[A+2]/x])}0<p.length&&f.push(new TriangleData(p))}function d(k,p){n(CindyJS._pluginRegistry.Cindy3D.instances[k]);setWaitForMeshGeneration(!0);useWebWorkers?(k=new Worker(getCindyBaseDir()+"CindyPrintWorker.js"),setMeshCreationWorker(k),k.onmessage=function(q){q=q.data;q.__proto__=TriangleMesh.prototype;setMeshCreationWorker(null);setPreviewMesh(q);setWaitForMeshGeneration(!1);
p(q)},k.postMessage({printUiSettings,command:"generateCsgMesh",spheres:h,cylinders:e,triangles:f})):(k=generateCsgMeshFrom(h,e,f),setPreviewMesh(k),setWaitForMeshGeneration(!1),p(k))}function l(k,p,q,r){p*=printUiSettings.radiusFactor;let t=[];for(let A=0;A<k.length;A++){let x=k[A];t.push(new vec3(x.value[0].value.real,x.value[1].value.real,x.value[2].value.real))}setWaitForMeshGeneration(!0);createTubeMesh(t,p,q,A=>{A.scale(printUiSettings.modelScale);setPreviewMesh(A);setWaitForMeshGeneration(!1);
r(A)})}let g=a.nada,c=a.evaluate,m=a.defineFunction,h=[],e=[],f=[];m("savecsgmesh",1,function(k,p){let q=a.evaluate(k[0]).value,r="Cindy3D";b(p,{instancename:t=>r=coerce.toString(t,"Cindy3D")});if(getWaitForMeshGeneration()&&!useWebWorkers)return g;d(r,t=>{t.saveToFile(q)});return g});m("savetubemesh",4,function(k,p){let q=a.evaluate(k[0]).value;p=a.evaluate(k[1]).value;let r=a.evaluate(k[2]).value.real;k=a.evaluate(k[3]).value;if(getWaitForMeshGeneration())return g;l(p,r,k,t=>{t.saveToFile(q)});
return g});m("addcindy3dprintui",1,function(k,p){k=a.evaluate(k[0]).value;document.body.insertAdjacentHTML("beforeend",uiStringStyle+uiStringCindy3D(k));isPrintPreviewCanvasInitialized||initPrintPreviewCanvas();return g});m("addcindy3dprintuitubes",5,function(k,p){p=a.evaluate(k[0]).value;let q=k[1].name,r=a.evaluate(k[2]).value,t=a.evaluate(k[3]).value;k=a.evaluate(k[4]).value;document.body.insertAdjacentHTML("beforeend",uiStringStyle+uiStringTubes(p,q,r,t,k));isPrintPreviewCanvasInitialized||initPrintPreviewCanvas();
return g});m("drawprintpreview",0,function(k,p){drawPrintPreview(a);return g});m("updatepreviewcdy3d",0,function(k,p){let q="Cindy3D";b(p,{instancename:r=>q=coerce.toString(r,"Cindy3D")});if(getWaitForMeshGeneration()&&!useWebWorkers)return g;d(q,r=>{});return g});m("updatepreviewtubes",3,function(k,p){p=a.evaluate(k[0]).value;let q=a.evaluate(k[1]).value.real;k=a.evaluate(k[2]).value;if(getWaitForMeshGeneration())return g;l(p,q,k,r=>{});return g})});CindyJS.registerPlugin(1,"CindyGLPrint",function(a){function b(g,c,m,h,e,f,k,p){setWaitForMeshGeneration(!0);generateIsoMeshFromScalarFunction(h,f,e,function(q){q={ctype:"function",oper:g.name.toLowerCase()+"$1",args:[{ctype:"function",oper:"genList",modifs:{},args:[{ctype:"number",value:{real:q.x,imag:0}},{ctype:"number",value:{real:q.y,imag:0}},{ctype:"number",value:{real:q.z,imag:0}}]}],modifs:{}};return a.evaluate(q).value.real},function(q){q={ctype:"function",oper:c.name.toLowerCase()+"$1",args:[{ctype:"function",
oper:"genList",modifs:{},args:[{ctype:"number",value:{real:q.x,imag:0}},{ctype:"number",value:{real:q.y,imag:0}},{ctype:"number",value:{real:q.z,imag:0}}]}],modifs:{}};q=a.evaluate(q).value;return new vec3(q[0].value.real,q[1].value.real,q[2].value.real)},m,q=>{if(printUiSettings.clipToSphere){setCsgResolutionSphere(2*printUiSettings.sphereQuality);q=convertTriangleMeshToCSGPolyhedron(q);let r=createCSGSphere([h.x+k,h.y+k,h.z+k],k);q=intersectObjects([q,r])}q.scale(printUiSettings.modelScale);setPreviewMesh(q);
setWaitForMeshGeneration(!1);p(q)})}function n(g,c,m,h,e,f,k,p){b(c,m,h,e,f,k,p,q=>{q.saveToFile(g)})}let d=a.nada,l=a.defineFunction;l("saveisomeshtofile",7,function(g,c){c=a.evaluate(g[0]).value;let m=g[1],h=g[2],e=a.evaluate(g[3]).value.real,f=cindyscriptToVec3(a.evaluate(g[4])),k=a.evaluate(g[5]).value.real;g=a.evaluate(g[6]).value.real;let p=k*(g-1)/2;if(getWaitForMeshGeneration()&&!useWebWorkers)return d;n(c,m,h,e,f,g,k,p);return d});l("saveisomeshtofile",5,function(g,c){c=a.evaluate(g[0]).value;
let m=g[1],h=g[2],e=a.evaluate(g[3]).value.real;g=a.evaluate(g[4]).value.real;let f=new vec3(-g,-g,-g),k=printUiSettings.gridResolution+1,p=2*g/printUiSettings.gridResolution;if(getWaitForMeshGeneration()&&!useWebWorkers)return d;n(c,m,h,e,f,k,p,g);return d});l("addcindyglprintui",2,function(g,c){c=a.evaluate(g[0]).value;g=a.evaluate(g[1]).value;document.body.insertAdjacentHTML("beforeend",uiStringStyle+uiStringCindyGL(c,g));isPrintPreviewCanvasInitialized||initPrintPreviewCanvas();return d});l("drawprintpreview",
0,function(g,c){drawPrintPreview(a,previewMesh);return d});l("updatepreviewcdygl",4,function(g,c){c=g[0];let m=g[1],h=a.evaluate(g[2]).value.real;g=a.evaluate(g[3]).value.real;let e=new vec3(-g,-g,-g),f=printUiSettings.gridResolution+1,k=2*g/printUiSettings.gridResolution;if(getWaitForMeshGeneration()&&!useWebWorkers)return d;b(c,m,h,e,f,k,g,()=>{});return d});l("updatepreviewcdygl",6,function(g,c){c=g[0];let m=g[1],h=a.evaluate(g[2]).value.real,e=cindyscriptToVec3(a.evaluate(g[3])),f=a.evaluate(g[4]).value.real;
g=a.evaluate(g[5]).value.real;let k=f*(g-1)/2;if(getWaitForMeshGeneration()&&!useWebWorkers)return d;b(c,m,h,e,g,f,k,()=>{});return d})});function downloadTextFile(a,b){a=new Blob([b],{type:"text/plain;charset=utf-8"});downloadBlobAsFile(a)}function downloadBlobAsFile(a,b){var n=document.createElement("a");document.body.appendChild(n);n.download=a;n.href=URL.createObjectURL(b);n.click()};function trianglePointsToIndexedMesh(a,b,n){void 0===n&&(n=1E-5);let d=new TriangleMesh;var l=[];for(var g=0;g<a.length;g++)l.push(new IndexedPoint(a[g]));l=new KDTree;g=0;for(let c=0;c<a.length;c++){let m=a[c],h=new IndexedPoint(m),e=l.findCloseIndexedPoint(h,n);null!=e?d.indices.push(e.index):(h.index=g,l.addPoint(h),d.indices.push(g),d.vertices.push(m),void 0!==b&&d.normals.push(b[c]),g++)}return d}
function trianglePointsToIndexedMeshON2(a,b){void 0===b&&(b=1E-5);let n=new TriangleMesh;for(let g=0;g<a.length;g++){let c=-1;for(let m=0;m<n.vertices.length;m++){var d=a[g],l=n.vertices[m];if(Math.abs(d.x-l.x)<b&&Math.abs(d.y-l.y)<b&&Math.abs(d.z-l.z)<b){c=m;break}}0>c?(n.indices.push(n.vertices.length),n.vertices.push(a[g])):n.indices.push(c)}return n}function flipVertexListOrientation(a){for(let b=0;b<a.length;b+=3){let n=a[b];a[b]=a[b+2];a[b+2]=n}};function IndexedPoint(a){this.position=a;this.index=0}function KDNode(a,b){this.axis=a;this.point=b;this.right=this.left=null}function AxisAlignedBox(a,b){this.min=a;this.max=b}AxisAlignedBox.prototype.contains=function(a){return a.x>=this.min.x&&a.y>=this.min.y&&a.z>=this.min.z&&a.x<=this.max.x&&a.y<=this.max.y&&a.z<=this.max.z};function KDTree(){this.root=null}KDTree.prototype.build=function(a){this.root=this._build(a,0)};
KDTree.prototype._build=function(a,b){if(0==a.length)return null;let n=b%3;a.sort((c,m)=>0==n?c.position.x-m.position.x:1==n?c.position.y-m.position.y:c.position.z-m.position.z);let d=Math.floor(a.length/2),l=a.slice(0,d),g=a.slice(d+1,a.length);a=new KDNode(n,a[d]);a.left=this._build(l,b+1);a.right=this._build(g,b+1);return a};KDTree.prototype.addPoint=function(a){this.root=this._addPoint(this.root,0,a)};
KDTree.prototype._addPoint=function(a,b,n){let d=b%3;if(null==a)return new KDNode(d,n);0==d&&n.position.x<a.point.position.x||1==d&&n.position.y<a.point.position.y||2==d&&n.position.z<a.point.position.z?a.left=this._addPoint(a.left,b+1,n):a.right=this._addPoint(a.right,b+1,n);return a};KDTree.prototype.findPointsInAxisAlignedBox=function(a){let b=[];this._findPointsInAxisAlignedBox(a,this.root,b);return b};
KDTree.prototype._findPointsInAxisAlignedBox=function(a,b,n){null!=b&&(a.contains(b.point.position)&&n.push(b.point),(0==b.axis&&a.min.x<=b.point.position.x||1==b.axis&&a.min.y<=b.point.position.y||2==b.axis&&a.min.z<=b.point.position.z)&&this._findPointsInAxisAlignedBox(a,b.left,n),(0==b.axis&&a.max.x>=b.point.position.x||1==b.axis&&a.max.y>=b.point.position.y||2==b.axis&&a.max.z>=b.point.position.z)&&this._findPointsInAxisAlignedBox(a,b.right,n))};
KDTree.prototype.findCloseIndexedPoint=function(a,b){var n=new vec3(a.position.x-b,a.position.y-b,a.position.z-b),d=new vec3(a.position.x+b,a.position.y+b,a.position.z+b);n=new AxisAlignedBox(n,d);n=this.findPointsInAxisAlignedBox(n);d=null;let l=1E10;for(let g=0;g<n.length;g++){let c=n[g],m=vec3length(vec3sub(a.position,c.position));m<l&&m<b&&c!==a&&(d=c,l=m)}return d};function GraphNode(){this.neighbors=[];this.edges=[];this.visited=!1}function GraphEdge(a,b){this.connectedNodes=[a,b];this.meshEdgeCount=1}function MeshGraph(a,b=!0){this.nodes=[];this.edges=[];this.orderIndices=b;for(b=0;b<a.vertices.length;b++)this.nodes.push(new GraphNode);for(b=0;b<a.indices.length;b+=3){let n=a.indices[b],d=a.indices[b+1],l=a.indices[b+2];this.addEdge(n,d);this.addEdge(d,l);this.addEdge(l,n)}}
MeshGraph.prototype.addEdge=function(a,b){if(-1!==this.nodes[a].neighbors.indexOf(b))for(var n=0;n<this.nodes[a].edges.length;n++)-1!==this.nodes[a].edges[n].connectedNodes.indexOf(b)&&(this.nodes[a].edges[n].meshEdgeCount+=1);else a>b&&this.orderIndices&&(n=a,a=b,b=n),n=new GraphEdge(a,b),this.nodes[a].neighbors.push(b),this.nodes[b].neighbors.push(a),this.nodes[a].edges.push(n),this.nodes[b].edges.push(n),this.edges.push(n)};
MeshGraph.prototype.hasNoHoles=function(){for(let a=0;a<this.edges.length;a++)if(2!=this.edges[a].meshEdgeCount)return console.log(this.edges[a]),!1;return!0};
MeshGraph.prototype.isFullyConnected=function(){for(var a=0;a<this.nodes.length;a++)this.nodes[a].visited=!1;a=[0];let b=new Set;for(;0<a.length;){var n=a.shift();let d=this.nodes[n];d.visited=!0;b.add(n);for(n=0;n<d.neighbors.length;n++){let l=d.neighbors[n];b.has(l)||-1===!a.indexOf(l)||a.push(l)}}for(a=0;a<this.nodes.length;a++)if(!this.nodes[a].visited)return!1;return!0};let printPreviewInstanceName="Cindy3DPreview",isPrintPreviewCanvasInitialized=!1,isPrintPreviewGLInitialized=!1,needsRecreatePreviewRenderData=!1,previewShaderProgram=null,previewVertexBuffer=null,previewVertexPositions=null,previewVertexNormals=null,previewMesh=null,waitingForMeshCreation=!1,waitSymbolShaderProgram=null,fullscreenQuadVertexBuffer=null,useWebWorkers=!0,meshCreationWorker=null;
function initPrintPreviewCanvas(){let a=document.getElementById("Cindy3D"),b,n;if(a)b=a.width,n=a.height,a.insertAdjacentHTML("afterend",'<canvas id="'+printPreviewInstanceName+'" style="border: none;" width="'+b+'" height="'+n+'"></canvas>');else{a=document.getElementById("CSCanvas");b=self.cdy.canvas.clientWidth;n=self.cdy.canvas.clientHeight;let d=document.getElementById("CanvasWrapper");d?(d.style.display="flex",d.style["flex-wrap"]="wrap",d.insertAdjacentHTML("beforeend",'<div style="position: relative; width: '+
b+"px; height: "+n+'px;"><canvas id="'+printPreviewInstanceName+'" style="border: none;position: absolute; top: 0px; left: 0px;" width="'+b+'" height="'+n+'"></canvas></div>')):a.insertAdjacentHTML("afterend",'<div style="position: relative; width: '+b+"px; height: "+n+'px;"><canvas id="'+printPreviewInstanceName+'" style="border: none;position: absolute; top: 0px; left: 0px;" width="'+b+'" height="'+n+'"></canvas></div>')}isPrintPreviewCanvasInitialized=!0}
function initPrintPreviewGL(a){previewShaderProgram=new ShaderProgram(a,"attribute vec3 aPosition;attribute vec3 aNormal;varying vec3 fragmentPosition;varying vec3 fragmentNormal;uniform mat4 uProjectionMatrix;uniform mat4 uModelViewMatrix;uniform mat4 uModelMatrix;void main() {fragmentPosition = (uModelMatrix * vec4(aPosition, 1.0)).xyz;fragmentNormal = (uModelMatrix * vec4(aNormal, 1.0)).xyz;gl_Position = uProjectionMatrix * uModelViewMatrix * vec4(aPosition, 1.0);}","precision highp float;\nuniform vec3 cameraPosition;\nuniform vec3 lightPosition;\nuniform vec3 objectColor;\nvarying vec3 fragmentPosition;\nvarying vec3 fragmentNormal;\nvec3 light(vec3 n, vec3 l, vec3 v, float spec, vec3 color) {\nvec3 h = normalize(v + l);\nfloat kd = clamp(dot(n,l), 0.0, 1.0) * 0.4;\nfloat ks = pow(clamp(dot(n,h), 0.0, 1.0), 8.0)*spec;\nreturn vec3(kd*color + vec3(ks));}\nvoid main()\n{\nvec3 n = normalize(fragmentNormal);\nvec3 v = normalize(cameraPosition - fragmentPosition);\nfloat ka = 0.2;\nvec3 lightColor1 = light(n, normalize(vec3(5.0, -3.0, 1.0)), v, 0.2, vec3(0.3, 0.3, 0.5));\nvec3 lightColor2 = light(n, normalize(vec3(-1.2, 0.6, 1.0)), v, 0.3, vec3(0.6, 0.6, 0.6));\ngl_FragColor = vec4(lightColor1 + lightColor2 + vec3(ka), 1.0);\n}\n");
isPrintPreviewGLInitialized=!0}function setWaitForMeshGeneration(a){waitingForMeshCreation=a}function getWaitForMeshGeneration(){return waitingForMeshCreation}function setPreviewMesh(a){a!==previewMesh&&(previewMesh=a,needsRecreatePreviewRenderData=!0)}function setMeshCreationWorker(a){meshCreationWorker&&meshCreationWorker.terminate();meshCreationWorker=a}
function createPrintPreviewRenderData(a){let b=[],n=[];for(let g=0;g<previewMesh.indices.length;g+=3){var d=previewMesh.vertices[previewMesh.indices[g+0]],l=previewMesh.vertices[previewMesh.indices[g+2]];d=vec3normalize(vec3cross(vec3sub(previewMesh.vertices[previewMesh.indices[g+1]],d),vec3sub(l,d)));for(l=0;3>l;l++){let c=previewMesh.vertices[previewMesh.indices[g+l]];b.push(.1*c.x);b.push(.1*c.y);b.push(.1*c.z);n.push(d.x);n.push(d.y);n.push(d.z)}}previewVertexPositions=new Float32Array(b);previewVertexNormals=
new Float32Array(n);previewVertexBuffer=a.createBuffer();a.bindBuffer(a.ARRAY_BUFFER,previewVertexBuffer);a.bufferData(a.ARRAY_BUFFER,previewVertexPositions.byteLength+previewVertexNormals.byteLength,a.STATIC_DRAW);a.bufferSubData(a.ARRAY_BUFFER,0,previewVertexPositions);a.bufferSubData(a.ARRAY_BUFFER,previewVertexPositions.byteLength,previewVertexNormals);needsRecreatePreviewRenderData=!1;console.log("Updated preview.")}
function renderPrintPreview(a){isPrintPreviewGLInitialized||initPrintPreviewGL(a);needsRecreatePreviewRenderData&&createPrintPreviewRenderData(a);a.clearColor(.22,.22,.22,1);a.clear(a.COLOR_BUFFER_BIT|a.DEPTH_BUFFER_BIT);waitingForMeshCreation&&renderWaitSymbol(a);if(null!==previewMesh&&!waitingForMeshCreation){var b=CindyJS._pluginRegistry.Cindy3D.instances[printPreviewInstanceName].camera;previewShaderProgram.use(a);previewShaderProgram.uniform.cameraPosition([-b.mvMatrix[3],-b.mvMatrix[7],-b.mvMatrix[11],
1].slice(0,3));previewShaderProgram.uniform.uProjectionMatrix(b.projectionMatrix);previewShaderProgram.uniform.uModelViewMatrix(transpose4(b.mvMatrix));previewShaderProgram.uniform.uModelMatrix(transpose4(b.modelMatrix));b=previewVertexPositions.byteLength;var n=a.getAttribLocation(previewShaderProgram.handle,"aPosition");a.enableVertexAttribArray(n);var d=a.getAttribLocation(previewShaderProgram.handle,"aNormal");a.enableVertexAttribArray(d);a.bindBuffer(a.ARRAY_BUFFER,previewVertexBuffer);a.vertexAttribPointer(n,
3,a.FLOAT,!1,0,0);a.vertexAttribPointer(d,3,a.FLOAT,!1,0,b);a.drawArrays(a.TRIANGLES,0,previewMesh.indices.length);a.disableVertexAttribArray(n);a.disableVertexAttribArray(d)}}
function renderWaitSymbol(a){if(!fullscreenQuadVertexBuffer){waitSymbolShaderProgram=new ShaderProgram(a,"attribute vec3 aPos;attribute vec2 aTexCoord;varying vec2 iUv;void main() {iUv = aTexCoord;gl_Position = vec4(aPos, 1.0);}","precision highp float;\nvarying vec2 iUv;\nuniform float time;\n#define EPSILON 0.02\nfloat getSmoothRectangle(float x, float minval, float maxval) {\nreturn smoothstep(minval-EPSILON, minval+EPSILON, x) - smoothstep(maxval-EPSILON, maxval+EPSILON, x);\n}\n#define PI 3.14159265358979323846\nvoid main()\n{\nvec2 unitCirclePos = normalize(iUv*2.0 - vec2(1.0));\nvec2 position = (iUv*2.0 - vec2(1.0)) * 8.0;\nfloat len = length(position);\nfloat interpolationFactor = getSmoothRectangle(len, 0.8, 1.0);\nfloat angle = atan(unitCirclePos.y, unitCirclePos.x);\nvec3 color = vec3(mod(angle+PI+time, 2.0*PI)/(2.0*PI)/2.0 + 0.3);\ngl_FragColor = vec4(interpolationFactor*color, 1.0);\n}");fullscreenQuadVertexBuffer=
a.createBuffer();a.bindBuffer(a.ARRAY_BUFFER,fullscreenQuadVertexBuffer);var b=new Float32Array([-1,-1,0,1,-1,0,-1,1,0,1,1,0]),n=new Float32Array([0,0,1,0,0,1,1,1]);a.bufferData(a.ARRAY_BUFFER,48+n.byteLength,a.STATIC_DRAW);a.bufferSubData(a.ARRAY_BUFFER,0,b);a.bufferSubData(a.ARRAY_BUFFER,48,n)}waitSymbolShaderProgram.use(a);waitSymbolShaderProgram.uniform.time([Date.now()/1E3%(2*Math.PI)]);b=a.getAttribLocation(waitSymbolShaderProgram.handle,"aPos");a.enableVertexAttribArray(b);n=a.getAttribLocation(waitSymbolShaderProgram.handle,
"aTexCoord");a.enableVertexAttribArray(n);a.bindBuffer(a.ARRAY_BUFFER,fullscreenQuadVertexBuffer);a.vertexAttribPointer(b,3,a.FLOAT,!1,0,0);a.vertexAttribPointer(n,2,a.FLOAT,!1,0,48);a.drawArrays(a.TRIANGLE_STRIP,0,4);a.disableVertexAttribArray(b);a.disableVertexAttribArray(n)}
function drawPrintPreview(a){a=a.instance.evokeCS;a('begin3d(name->"'+printPreviewInstanceName+'");');a("depthrange3d(0.2, 1000.0);");CindyJS._pluginRegistry.Cindy3D.instances[printPreviewInstanceName].externalRenderHook=renderPrintPreview;a("end3d();")};var PrintUiSettings=function(){this.exportTriangles=this.exportCylinders=this.exportSpheres=!0;this.cylinderQuality=this.sphereQuality=16;this.radiusFactor=this.lineSubdivisions=1;this.modelScale=10;this.extrudeSurfaces=!0;this.extrusionRadius=.1;this.smoothEdges=!0;this.clipToSphere=!1;this.isoOffset=.01;this.gridResolution=50;this.reconstructionAlgorithm=reconstructionAlgorithms.SNAPMC;this.gamma=.1};const reconstructionAlgorithms={SNAPMC:"snapMC",MARCHINGCUBES:"marchingCubes"};
var printUiSettings=new PrintUiSettings;function cindyPrintUpdateExportSpheres(){let a=document.getElementById("exportSpheres");printUiSettings.exportSpheres=a.checked}function cindyPrintUpdateExportCylinders(){let a=document.getElementById("exportCylinders");printUiSettings.exportCylinders=a.checked}function cindyPrintUpdateExportTriangles(){let a=document.getElementById("exportTriangles");printUiSettings.exportTriangles=a.checked}
function cindyPrintUpdateSphereQuality(){let a=document.getElementById("sphereQuality");printUiSettings.sphereQuality=1*a.value}function cindyPrintUpdateCylinderQuality(){let a=document.getElementById("cylinderQuality");printUiSettings.cylinderQuality=1*a.value}function cindyPrintUpdateLineSubdivisions(){let a=document.getElementById("lineSubdivisions");printUiSettings.lineSubdivisions=a.value/50}
function cindyPrintUpdateRadiusFactor(){let a=document.getElementById("radiusFactor");printUiSettings.radiusFactor=a.value/50}function cindyPrintUpdateModelScale(){let a=document.getElementById("modelScale");printUiSettings.modelScale=1*a.value}function cindyPrintUpdateExtrudeSurfaces(){let a=document.getElementById("extrudeSurfaces");printUiSettings.extrudeSurfaces=a.checked}
function cindyPrintUpdateExtrusionRadius(){let a=document.getElementById("extrusionRadius");printUiSettings.extrusionRadius=a.value/100}function cindyPrintUpdateSmoothEdges(){let a=document.getElementById("smoothEdges");printUiSettings.smoothEdges=a.checked}function cindyPrintUpdateClipToSphere(){let a=document.getElementById("clipToSphere");printUiSettings.clipToSphere=a.checked}
function cindyPrintUpdateIsoOffset(){let a=document.getElementById("isoOffset");printUiSettings.isoOffset=a.value/100;self.cdy.evokeCS("F(p) := (fun(p.x, p.y, p.z) - "+printUiSettings.isoOffset+");")}function cindyPrintUpdateGridResolution(){let a=document.getElementById("gridResolution");printUiSettings.gridResolution=1*a.value}
function cindyPrintUpdateReconstructionAlgorithm(){switch(document.getElementById("reconstructionAlgorithm").value){case "marchingCubes":printUiSettings.reconstructionAlgorithm=reconstructionAlgorithms.MARCHINGCUBES;break;case "snapmc0.0":printUiSettings.reconstructionAlgorithm=reconstructionAlgorithms.SNAPMC;printUiSettings.gamma=0;break;case "snapmc0.1":printUiSettings.reconstructionAlgorithm=reconstructionAlgorithms.SNAPMC;printUiSettings.gamma=.1;break;case "snapmc0.2":printUiSettings.reconstructionAlgorithm=
reconstructionAlgorithms.SNAPMC;printUiSettings.gamma=.2;break;case "snapmc0.3":printUiSettings.reconstructionAlgorithm=reconstructionAlgorithms.SNAPMC;printUiSettings.gamma=.3;break;case "snapmc0.4":printUiSettings.reconstructionAlgorithm=reconstructionAlgorithms.SNAPMC;printUiSettings.gamma=.4;break;case "snapmc0.5":printUiSettings.reconstructionAlgorithm=reconstructionAlgorithms.SNAPMC,printUiSettings.gamma=.5}}self.cindyPrintUpdateExportSpheres=cindyPrintUpdateExportSpheres;
self.cindyPrintUpdateExportCylinders=cindyPrintUpdateExportCylinders;self.cindyPrintUpdateExportTriangles=cindyPrintUpdateExportTriangles;self.cindyPrintUpdateSphereQuality=cindyPrintUpdateSphereQuality;self.cindyPrintUpdateCylinderQuality=cindyPrintUpdateCylinderQuality;self.cindyPrintUpdateLineSubdivisions=cindyPrintUpdateLineSubdivisions;self.cindyPrintUpdateRadiusFactor=cindyPrintUpdateRadiusFactor;self.cindyPrintUpdateModelScale=cindyPrintUpdateModelScale;
self.cindyPrintUpdateExtrudeSurfaces=cindyPrintUpdateExtrudeSurfaces;self.cindyPrintUpdateExtrusionRadius=cindyPrintUpdateExtrusionRadius;self.cindyPrintUpdateSmoothEdges=cindyPrintUpdateSmoothEdges;self.cindyPrintUpdateClipToSphere=cindyPrintUpdateClipToSphere;self.cindyPrintUpdateIsoOffset=cindyPrintUpdateIsoOffset;self.cindyPrintUpdateGridResolution=cindyPrintUpdateGridResolution;self.cindyPrintUpdateReconstructionAlgorithm=cindyPrintUpdateReconstructionAlgorithm;
function uiStringCindy3D(a){let b=CindyJS.getBaseDir()+"images/cindyprint/";return'<input type="checkbox" id="exportSpheres" onclick="cindyPrintUpdateExportSpheres()" checked> Spheres <image class=\'smallimg\' src=\''+b+'SphereHighRes.png\'/><input type="checkbox" id="exportCylinders" onclick="cindyPrintUpdateExportCylinders()" checked> Cylinders <image class=\'smallimg\' src=\''+b+'CylinderHighRes.png\'/><input type="checkbox" id="exportTriangles" onclick="cindyPrintUpdateExportTriangles()" checked> Triangles <image class=\'smallimg\' src=\''+
b+"Triangles.png'/><br><table> <tr><th>Sphere quality</th><th><image src='"+b+'SphereLowRes.png\'/></th><th><div class="slidecontainer"><input type="range" min="8" max="64" value="16" class="slider" id="sphereQuality" oninput="cindyPrintUpdateSphereQuality()"></th><th><image src=\''+b+"SphereHighRes.png'/></th></tr> <tr><th>Cylinder quality</th><th><image src='"+b+'CylinderLowRes.png\'/></th><th><div class="slidecontainer"><input type="range" min="8" max="64" value="16" class="slider" id="cylinderQuality" oninput="cindyPrintUpdateCylinderQuality()"></th><th><image src=\''+
b+"CylinderHighRes.png'/></th></tr> <tr><th>Radius factor</th><th><image src='"+b+'SphereSmall.png\'/></th><th><div class="slidecontainer"><input type="range" min="1" max="100" value="50" class="slider" id="radiusFactor" oninput="cindyPrintUpdateRadiusFactor()"></th><th><image src=\''+b+"SphereHighRes.png'/></th></tr> <tr><th>Model scale</th><th><image src='"+b+'SizeSmall.png\'/></th><th><div class="slidecontainer"><input type="range" min="1" max="100" value="10" class="slider" id="modelScale" oninput="cindyPrintUpdateModelScale()"></th><th><image src=\''+
b+'SizeLarge.png\'/></th></tr></table><input type="checkbox" id="extrudeSurfaces" onclick="cindyPrintUpdateExtrudeSurfaces()" checked> Extrude the triangle surfaces<table> <tr><th>Extrusion radius</th><th><image src=\''+b+'ExtrudeSurfaceSmall.png\'/></th><th><div class="slidecontainer"><input type="range" min="0" max="100" value="10" class="slider" id="extrusionRadius" oninput="cindyPrintUpdateExtrusionRadius()"></th><th><image src=\''+b+'ExtrudeSurfaceLarge.png\'/></th></tr></table><input type="checkbox" id="smoothEdges" onclick="cindyPrintUpdateSmoothEdges()" checked> Smooth extrusion edges<br><button onclick="cdy.evokeCS(\'savecsgmesh("'+
a+"")');\">Export mesh</button><button onclick=\"cdy.evokeCS('updatepreviewcdy3d()');\">Update Preview</button>"}
function uiStringTubes(a,b,n,d,l){let g=CindyJS.getBaseDir()+"images/cindyprint/",c="true";l||(c="false");return"<table> <tr><th>Cylinder quality</th><th><image src='"+g+'CylinderLowRes.png\'/></th><th><div class="slidecontainer"><input type="range" min="8" max="64" value="16" class="slider" id="cylinderQuality" oninput="cindyPrintUpdateCylinderQuality()"></th><th><image src=\''+g+"CylinderHighRes.png'/></th></tr> <tr><th>Line subdivisions</th><th><image src='"+g+'LineSubdivisionLow.png\'/></th><th><div class="slidecontainer"><input type="range" min="1" max="100" value="50" class="slider" id="lineSubdivisions" oninput="cindyPrintUpdateLineSubdivisions()"></th><th><image src=\''+
g+"LineSubdivisionHigh.png'/></th></tr> <tr><th>Radius factor</th><th><image src='"+g+'TubeThin.png\'/></th><th><div class="slidecontainer"><input type="range" min="1" max="100" value="50" class="slider" id="radiusFactor" oninput="cindyPrintUpdateRadiusFactor()"></th><th><image src=\''+g+"TubeThick.png'/></th></tr> <tr><th>Model scale</th><th><image src='"+g+'SizeSmall.png\'/></th><th><div class="slidecontainer"><input type="range" min="1" max="100" value="10" class="slider" id="modelScale" oninput="cindyPrintUpdateModelScale()"></th><th><image src=\''+
g+"SizeLarge.png'/></th></tr></table><button onclick=\"cdy.evokeCS('savetubemesh(""+a+"", "+b+"(' + document.getElementById('lineSubdivisions').value/50 + '*("+n+")), "+d+"/20, "+c+");');\">Export mesh</button><button onclick=\"cdy.evokeCS('updatepreviewtubes("+b+"(' + document.getElementById('lineSubdivisions').value/50 + '*("+n+")), "+d+"/20, "+c+");');\">Update Preview</button>"}
function uiStringCindyGL(a,b){let n=CindyJS.getBaseDir()+"images/cindyprint/";return'<input type="checkbox" id="extrudeSurfaces" onclick="cindyPrintUpdateExtrudeSurfaces()" checked> Extrude the triangle surfaces<table> <tr><th>Extrusion radius</th><th><image src=\''+n+'ExtrudeSurfaceSmall.png\'/></th><th><div class="slidecontainer"><input type="range" min="0" max="100" value="10" class="slider" id="extrusionRadius" oninput="cindyPrintUpdateExtrusionRadius()"></th><th><image src=\''+n+'ExtrudeSurfaceLarge.png\'/></th></tr></table><input type="checkbox" id="smoothEdges" onclick="cindyPrintUpdateSmoothEdges()" checked> Smooth extrusion edges<input type="checkbox" id="clipToSphere" onclick="cindyPrintUpdateClipToSphere()"> Clip geometry to sphere<table> <tr><th>Sphere quality</th><th><image src=\''+
n+'SphereLowRes.png\'/></th><th><div class="slidecontainer"><input type="range" min="8" max="32" value="16" class="slider" id="sphereQuality" oninput="cindyPrintUpdateSphereQuality()"></th><th><image src=\''+n+"SphereHighRes.png'/></th></tr> <tr><th>Model scale</th><th><image src='"+n+'SizeSmall.png\'/></th><th><div class="slidecontainer"><input type="range" min="1" max="100" value="10" class="slider" id="modelScale" oninput="cindyPrintUpdateModelScale()"></th><th><image src=\''+n+"SizeLarge.png'/></th></tr> <tr><th>Iso offset</th><th><image src='"+
n+'IsoA.png\'/></th><th><div class="slidecontainer"><input type="range" min="0" max="100" value="0" class="slider" id="isoOffset" oninput="cindyPrintUpdateIsoOffset()"></th><th><image src=\''+n+"IsoB.png'/></tr> <tr><th>Grid resolution</th><th><image src='"+n+'GridResLow.png\'/></th><th><div class="slidecontainer"><input type="range" min="16" max="128" value="50" class="slider" id="gridResolution" oninput="cindyPrintUpdateGridResolution()"></th><th><image src=\''+n+'ExtrudeSurfaceSmall.png\'/></th></tr></table>Implicit surface reconstruction algorithm <select name="reconstructionAlgorithm" id="reconstructionAlgorithm" onchange="cindyPrintUpdateReconstructionAlgorithm()"> <option value="marchingCubes">Marching Cubes</option><option value="snapmc0.0">SnapMC (γ=0.0)</option><option selected value="snapmc0.1">SnapMC (γ=0.1)</option><option value="snapmc0.2">SnapMC (γ=0.2)</option><option value="snapmc0.3">SnapMC (γ=0.3)</option><option value="snapmc0.4">SnapMC (γ=0.4)</option><option value="snapmc0.5">SnapMC (γ=0.5)</option></select><br><button onclick="cdy.evokeCS(\'saveisomeshtofile("'+
a+"", "+b+");');\">Export Mesh</button><button onclick=\"cdy.evokeCS('updatepreviewcdygl("+b+")');\">Update Preview</button>"}var uiStringStyle="<style>.vertaligncontainer { display: flex;}table { border-collapse: collapse; text-align:left;}th { font-weight: normal;}/* https://www.w3schools.com/howto/howto_js_rangeslider.asp */.slidecontainer { width: 220px; display:inline-block; margin-left:10px; vertical-align: baseline;}.slider { -webkit-appearance: none; width: 100%; height: 15px; border-radius: 5px; background: #d3d3d3; outline: none; opacity: 0.7; -webkit-transition: .2s; transition: opacity .2s;}.slider:hover { opacity: 1;}.slider::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 20px; height: 20px; border-radius: 50%; background: #4CAF50; cursor: pointer;}.slider::-moz-range-thumb { width: 20px; height: 20px; border-radius: 50%; background: #4CAF50; cursor: pointer;}th > img { width: 22px; height: 22px; text-align:center; vertical-align:middle; margin-left:5px; margin-right:-8px;}.smallimg { width: 22px; height: 22px; text-align:center; vertical-align:middle; margin-left:1px; margin-right:14px;}th { display: table-cell; text-align:center; vertical-align:middle;}</style>";
let cindyBaseDir=null;function getCindyBaseDir(){if(null!==cindyBaseDir)return cindyBaseDir;for(var a=document.getElementsByTagName("script"),b=0;b<a.length;++b){var n=a[b].src;if(n){var d=/Cindy\.js$/.exec(n);if(d)return cindyBaseDir=n.substr(0,d.index)}}console.error("Could not find <script> tag for Cindy.js");return cindyBaseDir};function TriangleMesh(){this.vertices=[];this.normals=[];this.indices=[]}TriangleMesh.prototype.scale=function(a){for(let b=0;b<this.vertices.length;b++)this.vertices[b]=vec3mul(a,this.vertices[b])};
TriangleMesh.prototype.computeSmoothNormals=function(){this.normals=[];for(let n=0;n<this.vertices.length;n++){let d=new vec3(0,0,0),l=0;for(let g=0;g<this.indices.length;g+=3)if(this.indices[g]==n||this.indices[g+1]==n||this.indices[g+2]==n){var a=this.indices[g];let c=this.indices[g+2];var b=vec3sub(this.vertices[this.indices[g+1]],this.vertices[a]);a=vec3sub(this.vertices[c],this.vertices[a]);b=vec3cross(b,a);a=vec3length(b);1E-6<a&&(b=vec3mul(1/a,b));d=vec3add(d,b);l++}0==l&&alert("Error in createNormals: numTrianglesSharedBy == 0");
d=vec3mul(1/l,d);this.normals.push(d)}};TriangleMesh.prototype.saveToObjFile=function(a){let b="o printmesh\ns 1\n";for(var n=0;n<this.vertices.length;n++){var d=this.vertices[n];b=b+"v "+d.x+" "+d.y+" "+d.z+"\n";0<this.normals.length&&(d=this.normals[n],b=b+"vn "+d.x+" "+d.y+" "+d.z+"\n")}for(n=0;n<this.indices.length;n+=3){d=this.indices[n];let l=this.indices[n+1],g=this.indices[n+2];b=b+"f "+d+"//"+d+" "+l+"//"+l+" "+g+"//"+g+"\n"}downloadTextFile(a,b)};
TriangleMesh.prototype.saveToAsciiStlFile=function(a){let b="solid printmesh\n\n";for(let l=0;l<this.indices.length;l+=3){var n=this.vertices[this.indices[l]];let g=this.vertices[this.indices[l+2]];var d=vec3sub(this.vertices[this.indices[l+1]],n);n=vec3sub(g,n);d=vec3normalize(vec3cross(d,n));b=b+"facet normal "+d.x+" "+d.y+" "+d.z+"\n";b+="\touter loop\n";for(d=0;3>d;d++)n=this.vertices[this.indices[l+d]],b=b+"\t\tvertex "+n.x+" "+n.y+" "+n.z+"\n";b+="\tendloop\nendfacet\n"}downloadTextFile(a,b+
"\nendsolid printmesh\n")};
TriangleMesh.prototype.saveToBinaryStlFile=function(a){let b=new BinaryFileWriter(84+this.indices.length/3*50);for(var n=0;20>n;n++)b.writeUint32(0);b.writeUint32(this.indices.length/3);for(n=0;n<this.indices.length;n+=3){let l=this.vertices[this.indices[n]],g=this.vertices[this.indices[n+1]],c=this.vertices[this.indices[n+2]];var d=vec3sub(g,l);let m=vec3sub(c,l);d=vec3normalize(vec3cross(d,m));b.writeVec3(d);b.writeVec3(l);b.writeVec3(g);b.writeVec3(c);b.writeUint16(0)}downloadBlobAsFile(a,b.toBlob())};
TriangleMesh.prototype.saveToFile=function(a){let b=new MeshGraph(this);0>=this.vertices.length?alert("TriangleMesh.prototype.saveToFile: The mesh is empty."):(b.hasNoHoles()||alert("TriangleMesh.prototype.saveToFile: The mesh has holes or is not a closed surface."),b.isFullyConnected()||alert("TriangleMesh.prototype.saveToFile: The mesh consists of multiple components."),a.endsWith(".obj")?this.saveToObjFile(a):a.endsWith(".stl")?this.saveToBinaryStlFile(a):alert("TriangleMesh.prototype.saveToFile: Unsupported mesh format."))};function vec3(a,b,n){this.x=a;this.y=b;this.z=n}vec3.prototype.set=function(a,b,n){this.x=a;this.y=b;this.z=n};function vec3add(a,b){return new vec3(a.x+b.x,a.y+b.y,a.z+b.z)}function vec3sub(a,b){return new vec3(a.x-b.x,a.y-b.y,a.z-b.z)}function vec3mul(a,b){return new vec3(b.x*a,b.y*a,b.z*a)}function vec3div(a,b){return new vec3(b.x/a,b.y/a,b.z/a)}function vec3lengthsq(a){return a.x*a.x+a.y*a.y+a.z*a.z}function vec3length(a){return Math.sqrt(a.x*a.x+a.y*a.y+a.z*a.z)}
function vec3dot(a,b){return a.x*b.x+a.y*b.y+a.z*b.z}function vec3cross(a,b){return new vec3(a.y*b.z-a.z*b.y,a.z*b.x-a.x*b.z,a.x*b.y-a.y*b.x)}function vec3normalize(a){return vec3mul(1/vec3length(a),a)}function cindyscriptToVec3(a){return new vec3(a.value[0].value.real,a.value[1].value.real,a.value[2].value.real)}function vec3tolist(a){return[a.x,a.y,a.z]};var CSG;if("undefined"===typeof CindyJS)importScripts("csg.js"),self.CSG=self.csg.CSG,self.CAG=self.csg.CAG;else{CindyJS.loadScript("csg","csg.js",a);function a(){self.CSG=self.csg.CSG;self.CAG=self.csg.CAG}}let csgResolution=8,csgResolutionSphere=16,csgResolutionCylinder=8;function setCsgResolution(a){csgResolution=a}function setCsgResolutionSphere(a){csgResolutionSphere=a}function setCsgResolutionCylinder(a){csgResolutionCylinder=a}
function createCSGSphere(a,b){return self.CSG.sphere({center:a,radius:b,resolution:csgResolutionSphere})}function createCSGCylinder(a,b,n){return self.CSG.roundedCylinder({start:a,end:b,radius:n,resolution:csgResolutionCylinder})}function convertCindy3DTrianglesToPolyhedron(a){a=cindyTrianglePointsToIndexedMesh(a);return convertTriangleMeshToCSGPolyhedron(a)}
function convertTriangleMeshToCSGPolyhedron(a){let b=[];for(var n=0;n<a.vertices.length;n++){var d=a.vertices[n];b.push([d.x,d.y,d.z])}n=[];for(d=0;d<a.indices.length;d+=3)n.push([a.indices[d+2],a.indices[d+1],a.indices[d]]);return self.CSG.polyhedron({points:b,faces:n})}
function mergeCindy3DObjectsToMesh(a,b,n){let d=[];for(let l=0;l<a.length;l++)d.push(createCSGSphere(a[l].pos,a[l].radius));for(a=0;a<b.length;a++)d.push(createCSGCylinder(b[a].pos1,b[a].pos2,b[a].radius));for(b=0;b<n.length;b++)d.push(convertCindy3DTrianglesToPolyhedron(n[b].trianglePoints));return mergeObjects(d)}function mergeObjects(a){a=(new self.CSG).union(a);return convertCSGPolygonsToTriangleMesh(a)}
function intersectObjects(a){a=(new self.CSG).intersect(a);return convertCSGPolygonsToTriangleMesh(a)}function convertCSGPolygonsToTriangleMesh(a){a=a.toTriangles();let b=[];for(let n=0;n<a.length;n++){let d=a[n].vertices;for(let l=0;3>l;l++){let g=d[l].pos;b.push(new vec3(g._x,g._y,g._z))}}return trianglePointsToIndexedMesh(b)}function cindyTrianglePointsToIndexedMesh(a,b){a=a.map(function(n){return new vec3(n[0],n[1],n[2])});return trianglePointsToIndexedMesh(a,void 0,b)};function createOpenSurfaceShellMeshWithNormals(a,b){0==a.normals.length&&a.computeSmoothNormals();let n=[],d=[];n=a.indices.concat(a.indices.map(h=>h+a.vertices.length));d=a.vertices.concat(a.vertices);for(var l=0;l<a.indices.length;l+=3){var g=n[l];n[l]=n[l+2];n[l+2]=g}for(l=0;l<a.vertices.length;l++){g=a.vertices[l];var c=a.normals[l],m=vec3mul(b,c);c=vec3mul(-b,c);d[l]=vec3add(g,c);d[l+a.vertices.length]=vec3add(g,m)}b=new MeshGraph(a,!1);for(l=0;l<b.edges.length;l++)1==b.edges[l].meshEdgeCount&&
(m=b.edges[l].connectedNodes,g=m[0],m=m[1],c=m+a.vertices.length,n=n.concat([c,g+a.vertices.length,g,m,c,g]));b=new TriangleMesh;b.indices=n;b.vertices=d;return b}
function createOpenSurfaceShellMeshWithNormalsAndRoundEdges(a,b){0==a.normals.length&&a.computeSmoothNormals();let n=[],d=[];n=a.indices.concat(a.indices.map(m=>m+a.vertices.length));d=a.vertices.concat(a.vertices);for(var l=0;l<a.indices.length;l+=3){var g=n[l];n[l]=n[l+2];n[l+2]=g}for(l=0;l<a.vertices.length;l++){g=a.vertices[l];var c=a.normals[l];let m=vec3mul(b,c);c=vec3mul(-b,c);d[l]=vec3add(g,c);d[l+a.vertices.length]=vec3add(g,m)}addTubesOnBorderEdges(a,a.vertices,a.indices,d,n,8,b);b=new TriangleMesh;
b.indices=n;b.vertices=d;return b}
function getBorderEdgeLoops(a){let b=new Set,n=[];for(let g=0;g<a.edges.length;g++)if(1==a.edges[g].meshEdgeCount&&!b.has(a.edges[g])){b.add(a.edges[g]);var d=a.edges[g].connectedNodes,l=d[0];d=d[1];let c=l,m=[l];for(;d!=c;){let h=null;for(l=0;l<a.edges.length;l++)if(1==a.edges[l].meshEdgeCount&&-1!==a.edges[l].connectedNodes.indexOf(d)&&!b.has(a.edges[l])){h=a.edges[l];break}b.add(h);h.connectedNodes[0]==d?(l=h.connectedNodes[0],d=h.connectedNodes[1]):(l=h.connectedNodes[1],d=h.connectedNodes[0]);
m.push(l)}n.push(m)}return n}let halfCirclePointData=[];function initArcVertices(a,b,n,d){var l=d/(a-1);d=Math.tan(l);l=Math.cos(l);b=new vec3(b*Math.cos(n),b*Math.sin(n),0);halfCirclePointData=[];for(n=0;n<a;n++){halfCirclePointData.push(b);let g=new vec3(-b.y,b.x,0);b=vec3add(b,vec3mul(d,g));b=vec3mul(l,b)}}
function getTransformedCircleVertices(a,b,n){let d=vec3cross(b,n),l=[];for(let c=0;c<halfCirclePointData.length;c++){var g=halfCirclePointData[c];g=new vec3(g.x*b.x+g.y*d.x+g.z*n.x+a.x,g.x*b.y+g.y*d.y+g.z*n.y+a.y,g.x*b.z+g.y*d.z+g.z*n.z+a.z);l.push(g)}return l}
function addTubesOnBorderEdges(a,b,n,d,l,g,c){initArcVertices(g-2,c,-Math.PI/2+Math.PI/(g-1),Math.PI-2*Math.PI/(g-1));g=new MeshGraph(a,!1);n=d.length;g=getBorderEdgeLoops(g);for(c=0;c<g.length;c++)for(let q=0;q<g[c].length;q++){var m=g[c][(q-1+g[c].length)%g[c].length],h=g[c][q],e=g[c][(q+1)%g[c].length],f=b[h],k=b[e],p=vec3add(vec3sub(f,b[m]),vec3sub(k,f));k=vec3length(p);if(1E-4>k)continue;p=vec3mul(1/k,p);k=h;let r=e;h+=a.vertices.length;e+=a.vertices.length;m=vec3cross(vec3sub(d[h],d[m]),vec3sub(d[h],
d[k]));let t=vec3cross(vec3sub(d[e],d[k]),vec3sub(d[e],d[r]));m=vec3normalize(vec3add(m,t));f=getTransformedCircleVertices(f,m,p);for(p=0;p<f.length;p++)d.push(f[p]);p=[];m=[];p.push(k);m.push(r);for(k=0;k<f.length;k++)p.push(n+k),q<g[c].length-1?m.push(n+f.length+k):m.push(n-f.length*(g[c].length-1)+k);p.push(h);m.push(e);n+=f.length;for(k=0;k<p.length-1;k++)l.push(m[k+1]),l.push(p[k+1]),l.push(p[k]),l.push(m[k]),l.push(m[k+1]),l.push(p[k])}};let circlePointData=[],circlePointDataTubeRadius=0;function initCircleVertices(a,b){circlePointData=[];circlePointDataTubeRadius=b;var n=6.2831852/a;let d=Math.tan(n);n=Math.cos(n);b=new vec3(b,0,0);for(let l=0;l<a;l++){circlePointData.push(b);let g=new vec3(-b.y,b.x,0);b=vec3add(b,vec3mul(d,g));b=vec3mul(n,b)}}
function insertOrientedCirclePoints(a,b,n,d,l){var g=l;.01>vec3length(vec3cross(g,d))&&(g=new vec3(0,1,0));g=vec3normalize(vec3sub(g,vec3mul(vec3dot(g,d),d)));l.set(g.x,g.y,g.z);l=vec3cross(d,g);for(let m=0;m<circlePointData.length;m++){var c=circlePointData[m];c=new vec3(c.x*g.x+c.y*l.x+c.z*d.x+n.x,c.x*g.y+c.y*l.y+c.z*d.y+n.y,c.x*g.z+c.y*l.z+c.z*d.z+n.z);a.push(c);c=vec3normalize(vec3sub(c,n));b.push(c)}}
function createTubeMesh(a,b,n,d){return $jscomp.asyncExecutePromiseGeneratorFunction(function*(){let l=printUiSettings.cylinderQuality;circlePointData.length==l&&b==circlePointDataTubeRadius||initCircleVertices(l,b);var g=a.length;if(n&&3>g)return console.log("createClosedTubeMesh: Closed tube too short."),null;if(!n&&2>g)return console.log("createClosedTubeMesh: Open tube too short."),null;let c=new TriangleMesh,m=c.vertices,h=c.indices;var e=c.normals,f=new vec3(1,0,0),k=[];let p=0;for(var q=0;q<
g;q++){var r=vec3sub(a[(q+1)%g],a[q]);n||q!=g-1||(r=vec3sub(a[q],a[q-1]));1E-5>vec3length(r)||(r=vec3normalize(r),insertOrientedCirclePoints(m,e,a[q],r,f),k.push(new vec3(f.x,f.y,f.z)),p++)}for(e=0;e<p-1;e++)for(f=0;f<l;f++)h.push(e*l+f),h.push(e*l+(f+1)%l),h.push((e+1)%p*l+(f+1)%l),h.push(e*l+f),h.push((e+1)%p*l+(f+1)%l),h.push((e+1)%p*l+f);if(n)for(g=k[p-1],k=k[0],k=Math.atan2(vec3length(vec3cross(g,k)),vec3dot(g,k)),k=(k+2*Math.PI)%(2*Math.PI),k=Math.round(k/(2*Math.PI)*l),g=0;g<l;g++)h.push((p-
1)*l+g%l),h.push((p-1)*l+(g+1)%l),h.push(0*l+(g+1+k)%l),h.push((p-1)*l+g%l),h.push(0*l+(g+1+k)%l),h.push(0*l+(g+k)%l);else{let t=Math.ceil(l/2),A,x;e=a[0];f=vec3sub(a[0],a[1]);f=vec3normalize(f);q=k[0];r=a[g-1];g=vec3sub(a[g-1],a[g-2]);g=vec3normalize(g);let D=function(u,v,y,C){let w=vec3cross(y,v);v=vec3mul(b,v);y=vec3mul(b,y);w=vec3mul(b,w);let z=m.length-l;for(let E=1;E<=t;E++){x=.5*Math.PI*(1-E/t);for(let H=0;H<l;H++){A=-2*Math.PI*H/l;var B=new vec3(Math.cos(A)*Math.sin(x),Math.sin(A)*Math.sin(x),
Math.cos(x));B=new vec3(B.x*y.x+B.y*w.x+B.z*v.x+u.x,B.x*y.y+B.y*w.y+B.z*v.y+u.y,B.x*y.z+B.y*w.z+B.z*v.z+u.z);m.push(B);if(E==t)break}}for(u=0;u<t;u++)for(v=0;v<l;v++)C&&0==u?(h.push((2*l-v)%l+u*l),h.push((2*l-v-1)%l+u*l),h.push(z+v%l+(u+1)*l),h.push((2*l-v-1)%l+u*l),h.push(z+(v+1)%l+(u+1)*l),h.push(z+v%l+(u+1)*l)):u<t-1?(h.push(z+v%l+u*l),h.push(z+(v+1)%l+u*l),h.push(z+v%l+(u+1)*l),h.push(z+(v+1)%l+u*l),h.push(z+(v+1)%l+(u+1)*l),h.push(z+v%l+(u+1)*l)):(h.push(z+v%l+u*l),h.push(z+(v+1)%l+u*l),h.push(z+
0+(u+1)*l))};D(r,g,k[p-1],!1);D(e,f,q,!0)}d(c)})};function generateIsoMeshFromScalarFunction(a,b,n,d,l,g,c){a=constructCartesianGridScalarField(a,b,n,d,l);useWebWorkers?(b=new Worker(getCindyBaseDir()+"CindyPrintWorker.js"),setMeshCreationWorker(b),b.onmessage=function(m){m=m.data;m.__proto__=TriangleMesh.prototype;setMeshCreationWorker(null);c(m)},b.postMessage({printUiSettings,command:"generateIsoMeshFromScalarFunction",baseDir:getCindyBaseDir(),cartesianGrid:a,isoLevel:g})):generateIsoMeshFromGrid(a.gridPoints,a.gridValues,a.gridNormals,g,(m,
h)=>{m=trianglePointsToIndexedMesh(m,h,1E-6);printUiSettings.extrudeSurfaces&&(m=printUiSettings.smoothEdges?createOpenSurfaceShellMeshWithNormalsAndRoundEdges(m,printUiSettings.extrusionRadius):createOpenSurfaceShellMeshWithNormals(m,printUiSettings.extrusionRadius));c(m)})}function generateClosedIsoMeshFromScalarFunction(a,b,n,d,l){a=constructCartesianGridScalarField(a,b,n,d);return generateIsoMeshFromGrid(a.gridPoints,a.gridValues,a.gridNormals,l)}
function constructCartesianGridScalarField(a,b,n,d,l){let g=[],c=[],m=[];for(let h=0;h<n;h++){let e=[],f=[],k=[];for(let p=0;p<n;p++){let q=[],r=[],t=[];for(let A=0;A<n;A++){let x=new vec3(a.x+A*b,a.y+p*b,a.z+h*b);q.push(x);r.push(d(x));t.push(l(x))}e.push(q);f.push(r);k.push(t)}g.push(e);c.push(f);m.push(k)}return{gridPoints:g,gridValues:c,gridNormals:m}}
function constructCartesianSnapGridScalarField(a,b){let n={gridValues:[],snapBackTo:[],snapBackToNormals:[],weights:[]};n.gridValues=deepCopy(a.gridValues);for(let d=0;d<a.gridPoints.length-1;d++)for(let l=0;l<a.gridPoints[0].length-1;l++)for(let g=0;g<a.gridPoints[0][0].length-1;g++)snapAtEdge(a,n,b,d,l,g,d+1,l,g),snapAtEdge(a,n,b,d,l,g,d,l+1,g),snapAtEdge(a,n,b,d,l,g,d,l,g+1);return n}
const deepCopy=a=>{let b=[];a.forEach(n=>{Array.isArray(n)?b.push(deepCopy(n)):"object"===typeof n?b.push(deepCopyObject(n)):b.push(n)});return b},deepCopyObject=a=>{let b={};for(let [n,d]of Object.entries(a))Array.isArray(d)?b[n]=deepCopy(d):b[n]="object"===typeof d?deepCopyObject(d):d;return b};
function snapAtEdge(a,b,n,d,l,g,c,m,h){let e=printUiSettings.gamma,f=e;var k=e;if(a.gridValues[d][l][g]<n&&a.gridValues[c][m][h]>n||a.gridValues[d][l][g]>n&&a.gridValues[c][m][h]<n)k=a.gridValues[c][m][h]-a.gridValues[d][l][g],1E-5<k||-1E-5>k?(f=(a.gridValues[c][m][h]-n)/k,k=(n-a.gridValues[d][l][g])/k):k=f=.5;k<e?snapToVertex(b,a.gridPoints,a.gridNormals,n,k,d,l,g,c,m,h):f<e&&snapToVertex(b,a.gridPoints,a.gridNormals,n,f,c,m,h,d,l,g)}
function snapToVertex(a,b,n,d,l,g,c,m,h,e,f){a.gridValues[g][c][m]!=d?(a.gridValues[g][c][m]=d,createArrayIfNecessary(a.snapBackTo,g,c),createArrayIfNecessary(a.snapBackToNormals,g,c),createArrayIfNecessary(a.weights,g,c),a.snapBackTo[g][c][m]=b[h][e][f],a.snapBackToNormals[g][c][m]=n[h][e][f],a.weights[g][c][m]=l):void 0!=a.weights[g]&&void 0!=a.weights[g][c]&&void 0!=a.weights[g][c][m]&&a.weights[g][c][m]>l&&(a.snapBackTo[g][c][m]=b[h][e][f],a.snapBackToNormals[g][c][m]=n[h][e][f],a.weights[g][c][m]=
l)}function createArrayIfNecessary(a,b,n){void 0==a[b]?(a[b]=[],a[b][n]=[]):void 0==a[b][n]&&(a[b][n]=[])}function GridCell(){this.v=[];this.f=[];this.n=[];for(let a=0;8>a;a++)this.v.push(new vec3(0,0,0)),this.f.push(0),this.n.push(new vec3(0,0,0))}function vertexInterpIso(a,b,n,d,l){if(1E-5>Math.abs(a-d))return b;if(1E-5>Math.abs(a-l))return n;if(1E-5>Math.abs(d-l))return b;a=(a-d)/(l-d);d=new vec3(0,0,0);d.x=b.x+a*(n.x-b.x);d.y=b.y+a*(n.y-b.y);d.z=b.z+a*(n.z-b.z);return d}
function normalInterpIso(a,b,n,d,l){a=vertexInterpIso(a,b,n,d,l);return vec3normalize(a)}
function generateIsoMeshFromGrid(a,b,n,d,l){return $jscomp.asyncExecutePromiseGeneratorFunction(function*(){let g=a.length;if(useWebWorkers){var c=self.navigator.hardwareConcurrency||4;if(1<c){generateIsoMeshFromGridParallel(a,b,n,d,c,l);return}}let m;printUiSettings.reconstructionAlgorithm==reconstructionAlgorithms.SNAPMC&&(m=constructCartesianSnapGridScalarField({gridPoints:a,gridValues:b,gridNormals:n},d));c=new GridCell;let h=[],e=[];for(let p=0;p<g-1;p++)for(let q=0;q<g-1;q++)for(let r=0;r<g-
1;r++){for(var f=0;8>f;f++){var k=new vec3(r,q,p);if(printUiSettings.reconstructionAlgorithm==reconstructionAlgorithms.SNAPMC){if(1==f||3==f||5==f||7==f)k.x+=1;if(2==f||3==f||6==f||7==f)k.y+=1;if(4==f||5==f||6==f||7==f)k.z+=1}else{if(1==f||2==f||5==f||6==f)k.x+=1;if(4==f||5==f||6==f||7==f)k.y+=1;if(2==f||3==f||6==f||7==f)k.z+=1}c.v[f]=a[k.z][k.y][k.x];c.n[f]=n[k.z][k.y][k.x];c.f[f]=printUiSettings.reconstructionAlgorithm==reconstructionAlgorithms.SNAPMC?m.gridValues[k.z][k.y][k.x]:b[k.z][k.y][k.x]}f=
printUiSettings.reconstructionAlgorithm==reconstructionAlgorithms.SNAPMC?polygonizeGridCellSnapMC(c,d,m,p,q,r):polygonizeGridCellMarchingCubes(c,d);k=f.triangleNormals;h=h.concat(f.trianglePoints);e=e.concat(k)}l(h,e)})}function MCWorkerJob(a,b,n){this.workerID=a;this.gridCells=b;this.isoLevel=n;this.command="generateIsoMeshFromScalarFunction_PARALLEL";this.printUiSettings=self.printUiSettings}
function MCWorkerJobSnapMC(a,b,n,d,l){this.workerID=a;this.gridCells=b;this.isoLevel=n;this.snapGrid=d;this.indices=l;this.command="generateIsoMeshFromScalarFunctionSnapMC_PARALLEL";this.printUiSettings=self.printUiSettings}
function generateIsoMeshFromGridParallel(a,b,n,d,l,g){function c(r){var t=r.data.trianglePoints;let A=r.data.triangleNormals;for(var x=0;x<t.length;x++)t[x].__proto__=vec3.prototype;for(x=0;x<A.length;x++)A[x].__proto__=vec3.prototype;h=h.concat(t);e=e.concat(A);q--;if(0==q){for(t=0;t<k.length;t++)k[t].terminate();g(h,e)}0<p.length&&(r=r.data.workerID,t=p.pop(),t.workerID=r,k[r].postMessage(t))}let m=a.length,h=[],e=[],f;printUiSettings.reconstructionAlgorithm==reconstructionAlgorithms.SNAPMC&&(f=
constructCartesianSnapGridScalarField({gridPoints:a,gridValues:b,gridNormals:n},d));let k=[],p=[];for(let r=0;r<m-1;r++){let t=[],A=[];for(let x=0;x<m-1;x++)for(let D=0;D<m-1;D++){let u=new GridCell;for(let v=0;8>v;v++){let y=new vec3(D,x,r);if(printUiSettings.reconstructionAlgorithm==reconstructionAlgorithms.SNAPMC){if(1==v||3==v||5==v||7==v)y.x+=1;if(2==v||3==v||6==v||7==v)y.y+=1;if(4==v||5==v||6==v||7==v)y.z+=1}else{if(1==v||2==v||5==v||6==v)y.x+=1;if(4==v||5==v||6==v||7==v)y.y+=1;if(2==v||3==
v||6==v||7==v)y.z+=1}u.v[v]=a[y.z][y.y][y.x];u.n[v]=n[y.z][y.y][y.x];u.f[v]=printUiSettings.reconstructionAlgorithm==reconstructionAlgorithms.SNAPMC?f.gridValues[y.z][y.y][y.x]:b[y.z][y.y][y.x]}printUiSettings.reconstructionAlgorithm==reconstructionAlgorithms.SNAPMC&&A.push([r,x,D]);t.push(u)}printUiSettings.reconstructionAlgorithm==reconstructionAlgorithms.SNAPMC?p.push(new MCWorkerJobSnapMC(-1,t,d,f,A)):p.push(new MCWorkerJob(-1,t,d))}let q=p.length;for(a=0;a<l&&0<p.length;a++)b=p.pop(),b.workerID=
a,n="",n=self.baseDir?self.baseDir:getCindyBaseDir(),n=new Worker(n+"CindyPrintWorker.js"),n.onmessage=c,n.postMessage(b),k.push(n)};/*
The marching cubes look-up table and C code that is the base for the following code
was released under public domain by Cory Bloyd.
For the tables see: http://paulbourke.net/geometry/polygonise/
*/
let edgeTable=[0,265,515,778,1030,1295,1541,1804,2060,2309,2575,2822,3082,3331,3593,3840,400,153,915,666,1430,1183,1941,1692,2460,2197,2975,2710,3482,3219,3993,3728,560,825,51,314,1590,1855,1077,1340,2620,2869,2111,2358,3642,3891,3129,3376,928,681,419,170,1958,1711,1445,1196,2988,2725,2479,2214,4010,3747,3497,3232,1120,1385,1635,1898,102,367,613,876,3180,3429,3695,3942,2154,2403,2665,2912,1520,1273,2035,1786,502,255,1013,764,3580,3317,4095,3830,2554,2291,3065,2800,1616,1881,1107,1370,598,863,85,348,
3676,3925,3167,3414,2650,2899,2137,2384,1984,1737,1475,1226,966,719,453,204,4044,3781,3535,3270,3018,2755,2505,2240,2240,2505,2755,3018,3270,3535,3781,4044,204,453,719,966,1226,1475,1737,1984,2384,2137,2899,2650,3414,3167,3925,3676,348,85,863,598,1370,1107,1881,1616,2800,3065,2291,2554,3830,4095,3317,3580,764,1013,255,502,1786,2035,1273,1520,2912,2665,2403,2154,3942,3695,3429,3180,876,613,367,102,1898,1635,1385,1120,3232,3497,3747,4010,2214,2479,2725,2988,1196,1445,1711,1958,170,419,681,928,3376,
3129,3891,3642,2358,2111,2869,2620,1340,1077,1855,1590,314,51,825,560,3728,3993,3219,3482,2710,2975,2197,2460,1692,1941,1183,1430,666,915,153,400,3840,3593,3331,3082,2822,2575,2309,2060,1804,1541,1295,1030,778,515,265,0],triTable=[[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[0,8,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[0,1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[1,8,3,9,8,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[1,2,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[0,8,3,1,2,10,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1],[9,2,10,0,2,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[2,8,3,2,10,8,10,9,8,-1,-1,-1,-1,-1,-1,-1],[3,11,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[0,11,2,8,11,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[1,9,0,2,3,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[1,11,2,1,9,11,9,8,11,-1,-1,-1,-1,-1,-1,-1],[3,10,1,11,10,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[0,10,1,0,8,10,8,11,10,-1,-1,-1,-1,-1,-1,-1],[3,9,0,3,11,9,11,10,9,-1,-1,-1,-1,-1,-1,-1],[9,8,10,10,8,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[4,7,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1],[4,3,0,7,3,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[0,1,9,8,4,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[4,1,9,4,7,1,7,3,1,-1,-1,-1,-1,-1,-1,-1],[1,2,10,8,4,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[3,4,7,3,0,4,1,2,10,-1,-1,-1,-1,-1,-1,-1],[9,2,10,9,0,2,8,4,7,-1,-1,-1,-1,-1,-1,-1],[2,10,9,2,9,7,2,7,3,7,9,4,-1,-1,-1,-1],[8,4,7,3,11,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[11,4,7,11,2,4,2,0,4,-1,-1,-1,-1,-1,-1,-1],[9,0,1,8,4,7,2,3,11,-1,-1,-1,-1,-1,-1,-1],[4,7,11,9,4,11,9,11,2,9,2,1,-1,-1,-1,-1],[3,10,1,3,11,10,7,8,4,-1,
-1,-1,-1,-1,-1,-1],[1,11,10,1,4,11,1,0,4,7,11,4,-1,-1,-1,-1],[4,7,8,9,0,11,9,11,10,11,0,3,-1,-1,-1,-1],[4,7,11,4,11,9,9,11,10,-1,-1,-1,-1,-1,-1,-1],[9,5,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[9,5,4,0,8,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[0,5,4,1,5,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[8,5,4,8,3,5,3,1,5,-1,-1,-1,-1,-1,-1,-1],[1,2,10,9,5,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[3,0,8,1,2,10,4,9,5,-1,-1,-1,-1,-1,-1,-1],[5,2,10,5,4,2,4,0,2,-1,-1,-1,-1,-1,-1,-1],[2,10,5,3,2,5,3,5,4,3,4,8,-1,-1,-1,-1],[9,5,4,2,
3,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[0,11,2,0,8,11,4,9,5,-1,-1,-1,-1,-1,-1,-1],[0,5,4,0,1,5,2,3,11,-1,-1,-1,-1,-1,-1,-1],[2,1,5,2,5,8,2,8,11,4,8,5,-1,-1,-1,-1],[10,3,11,10,1,3,9,5,4,-1,-1,-1,-1,-1,-1,-1],[4,9,5,0,8,1,8,10,1,8,11,10,-1,-1,-1,-1],[5,4,0,5,0,11,5,11,10,11,0,3,-1,-1,-1,-1],[5,4,8,5,8,10,10,8,11,-1,-1,-1,-1,-1,-1,-1],[9,7,8,5,7,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[9,3,0,9,5,3,5,7,3,-1,-1,-1,-1,-1,-1,-1],[0,7,8,0,1,7,1,5,7,-1,-1,-1,-1,-1,-1,-1],[1,5,3,3,5,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[9,7,8,9,5,7,10,1,2,-1,-1,-1,-1,-1,-1,-1],[10,1,2,9,5,0,5,3,0,5,7,3,-1,-1,-1,-1],[8,0,2,8,2,5,8,5,7,10,5,2,-1,-1,-1,-1],[2,10,5,2,5,3,3,5,7,-1,-1,-1,-1,-1,-1,-1],[7,9,5,7,8,9,3,11,2,-1,-1,-1,-1,-1,-1,-1],[9,5,7,9,7,2,9,2,0,2,7,11,-1,-1,-1,-1],[2,3,11,0,1,8,1,7,8,1,5,7,-1,-1,-1,-1],[11,2,1,11,1,7,7,1,5,-1,-1,-1,-1,-1,-1,-1],[9,5,8,8,5,7,10,1,3,10,3,11,-1,-1,-1,-1],[5,7,0,5,0,9,7,11,0,1,0,10,11,10,0,-1],[11,10,0,11,0,3,10,5,0,8,0,7,5,7,0,-1],[11,10,5,7,11,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[10,6,5,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[0,8,3,5,10,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[9,0,1,5,10,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[1,8,3,1,9,8,5,10,6,-1,-1,-1,-1,-1,-1,-1],[1,6,5,2,6,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[1,6,5,1,2,6,3,0,8,-1,-1,-1,-1,-1,-1,-1],[9,6,5,9,0,6,0,2,6,-1,-1,-1,-1,-1,-1,-1],[5,9,8,5,8,2,5,2,6,3,2,8,-1,-1,-1,-1],[2,3,11,10,6,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[11,0,8,11,2,0,10,6,5,-1,-1,-1,-1,-1,-1,-1],[0,1,9,2,3,11,5,10,6,-1,-1,-1,-1,-1,-1,-1],[5,10,6,1,9,2,9,11,2,9,8,11,-1,-1,-1,
-1],[6,3,11,6,5,3,5,1,3,-1,-1,-1,-1,-1,-1,-1],[0,8,11,0,11,5,0,5,1,5,11,6,-1,-1,-1,-1],[3,11,6,0,3,6,0,6,5,0,5,9,-1,-1,-1,-1],[6,5,9,6,9,11,11,9,8,-1,-1,-1,-1,-1,-1,-1],[5,10,6,4,7,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[4,3,0,4,7,3,6,5,10,-1,-1,-1,-1,-1,-1,-1],[1,9,0,5,10,6,8,4,7,-1,-1,-1,-1,-1,-1,-1],[10,6,5,1,9,7,1,7,3,7,9,4,-1,-1,-1,-1],[6,1,2,6,5,1,4,7,8,-1,-1,-1,-1,-1,-1,-1],[1,2,5,5,2,6,3,0,4,3,4,7,-1,-1,-1,-1],[8,4,7,9,0,5,0,6,5,0,2,6,-1,-1,-1,-1],[7,3,9,7,9,4,3,2,9,5,9,6,2,6,9,-1],[3,11,2,7,8,
4,10,6,5,-1,-1,-1,-1,-1,-1,-1],[5,10,6,4,7,2,4,2,0,2,7,11,-1,-1,-1,-1],[0,1,9,4,7,8,2,3,11,5,10,6,-1,-1,-1,-1],[9,2,1,9,11,2,9,4,11,7,11,4,5,10,6,-1],[8,4,7,3,11,5,3,5,1,5,11,6,-1,-1,-1,-1],[5,1,11,5,11,6,1,0,11,7,11,4,0,4,11,-1],[0,5,9,0,6,5,0,3,6,11,6,3,8,4,7,-1],[6,5,9,6,9,11,4,7,9,7,11,9,-1,-1,-1,-1],[10,4,9,6,4,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[4,10,6,4,9,10,0,8,3,-1,-1,-1,-1,-1,-1,-1],[10,0,1,10,6,0,6,4,0,-1,-1,-1,-1,-1,-1,-1],[8,3,1,8,1,6,8,6,4,6,1,10,-1,-1,-1,-1],[1,4,9,1,2,4,2,6,4,-1,-1,
-1,-1,-1,-1,-1],[3,0,8,1,2,9,2,4,9,2,6,4,-1,-1,-1,-1],[0,2,4,4,2,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[8,3,2,8,2,4,4,2,6,-1,-1,-1,-1,-1,-1,-1],[10,4,9,10,6,4,11,2,3,-1,-1,-1,-1,-1,-1,-1],[0,8,2,2,8,11,4,9,10,4,10,6,-1,-1,-1,-1],[3,11,2,0,1,6,0,6,4,6,1,10,-1,-1,-1,-1],[6,4,1,6,1,10,4,8,1,2,1,11,8,11,1,-1],[9,6,4,9,3,6,9,1,3,11,6,3,-1,-1,-1,-1],[8,11,1,8,1,0,11,6,1,9,1,4,6,4,1,-1],[3,11,6,3,6,0,0,6,4,-1,-1,-1,-1,-1,-1,-1],[6,4,8,11,6,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[7,10,6,7,8,10,8,9,10,-1,-1,-1,-1,-1,
-1,-1],[0,7,3,0,10,7,0,9,10,6,7,10,-1,-1,-1,-1],[10,6,7,1,10,7,1,7,8,1,8,0,-1,-1,-1,-1],[10,6,7,10,7,1,1,7,3,-1,-1,-1,-1,-1,-1,-1],[1,2,6,1,6,8,1,8,9,8,6,7,-1,-1,-1,-1],[2,6,9,2,9,1,6,7,9,0,9,3,7,3,9,-1],[7,8,0,7,0,6,6,0,2,-1,-1,-1,-1,-1,-1,-1],[7,3,2,6,7,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[2,3,11,10,6,8,10,8,9,8,6,7,-1,-1,-1,-1],[2,0,7,2,7,11,0,9,7,6,7,10,9,10,7,-1],[1,8,0,1,7,8,1,10,7,6,7,10,2,3,11,-1],[11,2,1,11,1,7,10,6,1,6,7,1,-1,-1,-1,-1],[8,9,6,8,6,7,9,1,6,11,6,3,1,3,6,-1],[0,9,1,11,6,7,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1],[7,8,0,7,0,6,3,11,0,11,6,0,-1,-1,-1,-1],[7,11,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[7,6,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[3,0,8,11,7,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[0,1,9,11,7,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[8,1,9,8,3,1,11,7,6,-1,-1,-1,-1,-1,-1,-1],[10,1,2,6,11,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[1,2,10,3,0,8,6,11,7,-1,-1,-1,-1,-1,-1,-1],[2,9,0,2,10,9,6,11,7,-1,-1,-1,-1,-1,-1,-1],[6,11,7,2,10,3,10,8,3,10,9,8,-1,-1,-1,-1],[7,2,3,6,2,7,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1],[7,0,8,7,6,0,6,2,0,-1,-1,-1,-1,-1,-1,-1],[2,7,6,2,3,7,0,1,9,-1,-1,-1,-1,-1,-1,-1],[1,6,2,1,8,6,1,9,8,8,7,6,-1,-1,-1,-1],[10,7,6,10,1,7,1,3,7,-1,-1,-1,-1,-1,-1,-1],[10,7,6,1,7,10,1,8,7,1,0,8,-1,-1,-1,-1],[0,3,7,0,7,10,0,10,9,6,10,7,-1,-1,-1,-1],[7,6,10,7,10,8,8,10,9,-1,-1,-1,-1,-1,-1,-1],[6,8,4,11,8,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[3,6,11,3,0,6,0,4,6,-1,-1,-1,-1,-1,-1,-1],[8,6,11,8,4,6,9,0,1,-1,-1,-1,-1,-1,-1,-1],[9,4,6,9,6,3,9,3,1,11,3,6,-1,-1,-1,-1],[6,8,4,6,11,8,2,10,1,-1,-1,-1,-1,-1,
-1,-1],[1,2,10,3,0,11,0,6,11,0,4,6,-1,-1,-1,-1],[4,11,8,4,6,11,0,2,9,2,10,9,-1,-1,-1,-1],[10,9,3,10,3,2,9,4,3,11,3,6,4,6,3,-1],[8,2,3,8,4,2,4,6,2,-1,-1,-1,-1,-1,-1,-1],[0,4,2,4,6,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[1,9,0,2,3,4,2,4,6,4,3,8,-1,-1,-1,-1],[1,9,4,1,4,2,2,4,6,-1,-1,-1,-1,-1,-1,-1],[8,1,3,8,6,1,8,4,6,6,10,1,-1,-1,-1,-1],[10,1,0,10,0,6,6,0,4,-1,-1,-1,-1,-1,-1,-1],[4,6,3,4,3,8,6,10,3,0,3,9,10,9,3,-1],[10,9,4,6,10,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[4,9,5,7,6,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[0,8,3,4,9,5,11,7,6,-1,-1,-1,-1,-1,-1,-1],[5,0,1,5,4,0,7,6,11,-1,-1,-1,-1,-1,-1,-1],[11,7,6,8,3,4,3,5,4,3,1,5,-1,-1,-1,-1],[9,5,4,10,1,2,7,6,11,-1,-1,-1,-1,-1,-1,-1],[6,11,7,1,2,10,0,8,3,4,9,5,-1,-1,-1,-1],[7,6,11,5,4,10,4,2,10,4,0,2,-1,-1,-1,-1],[3,4,8,3,5,4,3,2,5,10,5,2,11,7,6,-1],[7,2,3,7,6,2,5,4,9,-1,-1,-1,-1,-1,-1,-1],[9,5,4,0,8,6,0,6,2,6,8,7,-1,-1,-1,-1],[3,6,2,3,7,6,1,5,0,5,4,0,-1,-1,-1,-1],[6,2,8,6,8,7,2,1,8,4,8,5,1,5,8,-1],[9,5,4,10,1,6,1,7,6,1,3,7,-1,-1,-1,-1],[1,6,10,1,7,6,1,0,7,8,7,0,
9,5,4,-1],[4,0,10,4,10,5,0,3,10,6,10,7,3,7,10,-1],[7,6,10,7,10,8,5,4,10,4,8,10,-1,-1,-1,-1],[6,9,5,6,11,9,11,8,9,-1,-1,-1,-1,-1,-1,-1],[3,6,11,0,6,3,0,5,6,0,9,5,-1,-1,-1,-1],[0,11,8,0,5,11,0,1,5,5,6,11,-1,-1,-1,-1],[6,11,3,6,3,5,5,3,1,-1,-1,-1,-1,-1,-1,-1],[1,2,10,9,5,11,9,11,8,11,5,6,-1,-1,-1,-1],[0,11,3,0,6,11,0,9,6,5,6,9,1,2,10,-1],[11,8,5,11,5,6,8,0,5,10,5,2,0,2,5,-1],[6,11,3,6,3,5,2,10,3,10,5,3,-1,-1,-1,-1],[5,8,9,5,2,8,5,6,2,3,8,2,-1,-1,-1,-1],[9,5,6,9,6,0,0,6,2,-1,-1,-1,-1,-1,-1,-1],[1,5,8,
1,8,0,5,6,8,3,8,2,6,2,8,-1],[1,5,6,2,1,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[1,3,6,1,6,10,3,8,6,5,6,9,8,9,6,-1],[10,1,0,10,0,6,9,5,0,5,6,0,-1,-1,-1,-1],[0,3,8,5,6,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[10,5,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[11,5,10,7,5,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[11,5,10,11,7,5,8,3,0,-1,-1,-1,-1,-1,-1,-1],[5,11,7,5,10,11,1,9,0,-1,-1,-1,-1,-1,-1,-1],[10,7,5,10,11,7,9,8,1,8,3,1,-1,-1,-1,-1],[11,1,2,11,7,1,7,5,1,-1,-1,-1,-1,-1,-1,-1],[0,8,3,1,2,7,1,7,5,7,2,11,-1,-1,-1,-1],[9,
7,5,9,2,7,9,0,2,2,11,7,-1,-1,-1,-1],[7,5,2,7,2,11,5,9,2,3,2,8,9,8,2,-1],[2,5,10,2,3,5,3,7,5,-1,-1,-1,-1,-1,-1,-1],[8,2,0,8,5,2,8,7,5,10,2,5,-1,-1,-1,-1],[9,0,1,5,10,3,5,3,7,3,10,2,-1,-1,-1,-1],[9,8,2,9,2,1,8,7,2,10,2,5,7,5,2,-1],[1,3,5,3,7,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[0,8,7,0,7,1,1,7,5,-1,-1,-1,-1,-1,-1,-1],[9,0,3,9,3,5,5,3,7,-1,-1,-1,-1,-1,-1,-1],[9,8,7,5,9,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[5,8,4,5,10,8,10,11,8,-1,-1,-1,-1,-1,-1,-1],[5,0,4,5,11,0,5,10,11,11,3,0,-1,-1,-1,-1],[0,1,9,8,4,10,8,
10,11,10,4,5,-1,-1,-1,-1],[10,11,4,10,4,5,11,3,4,9,4,1,3,1,4,-1],[2,5,1,2,8,5,2,11,8,4,5,8,-1,-1,-1,-1],[0,4,11,0,11,3,4,5,11,2,11,1,5,1,11,-1],[0,2,5,0,5,9,2,11,5,4,5,8,11,8,5,-1],[9,4,5,2,11,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[2,5,10,3,5,2,3,4,5,3,8,4,-1,-1,-1,-1],[5,10,2,5,2,4,4,2,0,-1,-1,-1,-1,-1,-1,-1],[3,10,2,3,5,10,3,8,5,4,5,8,0,1,9,-1],[5,10,2,5,2,4,1,9,2,9,4,2,-1,-1,-1,-1],[8,4,5,8,5,3,3,5,1,-1,-1,-1,-1,-1,-1,-1],[0,4,5,1,0,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[8,4,5,8,5,3,9,0,5,0,3,5,-1,-1,-1,
-1],[9,4,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[4,11,7,4,9,11,9,10,11,-1,-1,-1,-1,-1,-1,-1],[0,8,3,4,9,7,9,11,7,9,10,11,-1,-1,-1,-1],[1,10,11,1,11,4,1,4,0,7,4,11,-1,-1,-1,-1],[3,1,4,3,4,8,1,10,4,7,4,11,10,11,4,-1],[4,11,7,9,11,4,9,2,11,9,1,2,-1,-1,-1,-1],[9,7,4,9,11,7,9,1,11,2,11,1,0,8,3,-1],[11,7,4,11,4,2,2,4,0,-1,-1,-1,-1,-1,-1,-1],[11,7,4,11,4,2,8,3,4,3,2,4,-1,-1,-1,-1],[2,9,10,2,7,9,2,3,7,7,4,9,-1,-1,-1,-1],[9,10,7,9,7,4,10,2,7,8,7,0,2,0,7,-1],[3,7,10,3,10,2,7,4,10,1,10,0,4,0,10,-1],[1,10,
2,8,7,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[4,9,1,4,1,7,7,1,3,-1,-1,-1,-1,-1,-1,-1],[4,9,1,4,1,7,0,8,1,8,7,1,-1,-1,-1,-1],[4,0,3,7,4,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[4,8,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[9,10,8,10,11,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[3,0,9,3,9,11,11,9,10,-1,-1,-1,-1,-1,-1,-1],[0,1,10,0,10,8,8,10,11,-1,-1,-1,-1,-1,-1,-1],[3,1,10,11,3,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[1,2,11,1,11,9,9,11,8,-1,-1,-1,-1,-1,-1,-1],[3,0,9,3,9,11,1,2,9,2,11,9,-1,-1,-1,-1],[0,2,11,8,0,11,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1],[3,2,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[2,3,8,2,8,10,10,8,9,-1,-1,-1,-1,-1,-1,-1],[9,10,2,0,9,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[2,3,8,2,8,10,0,1,8,1,10,8,-1,-1,-1,-1],[1,10,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[1,3,8,9,1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[0,9,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[0,3,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]];
function polygonizeGridCellMarchingCubes(a,b){let n=0;a.f[0]<b&&(n|=1);a.f[1]<b&&(n|=2);a.f[2]<b&&(n|=4);a.f[3]<b&&(n|=8);a.f[4]<b&&(n|=16);a.f[5]<b&&(n|=32);a.f[6]<b&&(n|=64);a.f[7]<b&&(n|=128);if(0==edgeTable[n])return{trianglePoints:[],triangleNormals:[]};let d=[0,0,0,0,0,0,0,0,0,0,0,0],l=[0,0,0,0,0,0,0,0,0,0,0,0];edgeTable[n]&1&&(d[0]=vertexInterpIso(b,a.v[0],a.v[1],a.f[0],a.f[1]),l[0]=normalInterpIso(b,a.n[0],a.n[1],a.f[0],a.f[1]));edgeTable[n]&2&&(d[1]=vertexInterpIso(b,a.v[1],a.v[2],a.f[1],
a.f[2]),l[1]=normalInterpIso(b,a.n[1],a.n[2],a.f[1],a.f[2]));edgeTable[n]&4&&(d[2]=vertexInterpIso(b,a.v[2],a.v[3],a.f[2],a.f[3]),l[2]=normalInterpIso(b,a.n[2],a.n[3],a.f[2],a.f[3]));edgeTable[n]&8&&(d[3]=vertexInterpIso(b,a.v[3],a.v[0],a.f[3],a.f[0]),l[3]=normalInterpIso(b,a.n[3],a.n[0],a.f[3],a.f[0]));edgeTable[n]&16&&(d[4]=vertexInterpIso(b,a.v[4],a.v[5],a.f[4],a.f[5]),l[4]=normalInterpIso(b,a.n[4],a.n[5],a.f[4],a.f[5]));edgeTable[n]&32&&(d[5]=vertexInterpIso(b,a.v[5],a.v[6],a.f[5],a.f[6]),l[5]=
normalInterpIso(b,a.n[5],a.n[6],a.f[5],a.f[6]));edgeTable[n]&64&&(d[6]=vertexInterpIso(b,a.v[6],a.v[7],a.f[6],a.f[7]),l[6]=normalInterpIso(b,a.n[6],a.n[7],a.f[6],a.f[7]));edgeTable[n]&128&&(d[7]=vertexInterpIso(b,a.v[7],a.v[4],a.f[7],a.f[4]),l[7]=normalInterpIso(b,a.n[7],a.n[4],a.f[7],a.f[4]));edgeTable[n]&256&&(d[8]=vertexInterpIso(b,a.v[0],a.v[4],a.f[0],a.f[4]),l[8]=normalInterpIso(b,a.n[0],a.n[4],a.f[0],a.f[4]));edgeTable[n]&512&&(d[9]=vertexInterpIso(b,a.v[1],a.v[5],a.f[1],a.f[5]),l[9]=normalInterpIso(b,
a.n[1],a.n[5],a.f[1],a.f[5]));edgeTable[n]&1024&&(d[10]=vertexInterpIso(b,a.v[2],a.v[6],a.f[2],a.f[6]),l[10]=normalInterpIso(b,a.n[2],a.n[6],a.f[2],a.f[6]));edgeTable[n]&2048&&(d[11]=vertexInterpIso(b,a.v[3],a.v[7],a.f[3],a.f[7]),l[11]=normalInterpIso(b,a.n[3],a.n[7],a.f[3],a.f[7]));a=[];b=[];for(let g=0;-1!=triTable[n][g];g+=3)a.push(d[triTable[n][g]]),a.push(d[triTable[n][g+1]]),a.push(d[triTable[n][g+2]]),b.push(l[triTable[n][g]]),b.push(l[triTable[n][g+1]]),b.push(l[triTable[n][g+2]]);return{trianglePoints:a,
triangleNormals:b}};function polygonizeGridCellSnapMC(a,b,n,d,l,g){var c=!1;if(a.f[0]<b)for(var m=1;8>m;m++)a.f[m]>=b&&(c=!0);else for(m=1;8>m;m++)a.f[m]<b&&(c=!0);if(!c)return{trianglePoints:[],triangleNormals:[]};c=0;for(m=0;8>m;m++)a.f[m]>b?c+=positive[m]:a.f[m]==b&&(c+=equals[m]);m=[];let h=[];for(let k=0;k<isoTable[c].length;k++)if(8>isoTable[c][k]){var e=d;let p=l,q=g;var f=isoTable[c][k];for(let r=0;3>r;r++){if(1==f%2)switch(r){case 0:q++;break;case 1:p++;break;case 2:e++}f=Math.floor(f/2)}void 0!=n.snapBackTo&&
void 0!=n.snapBackTo[e]&&void 0!=n.snapBackTo[e][p]&&void 0!=n.snapBackTo[e][p][q]?(f=snapBack(a.v[isoTable[c][k]],n.snapBackTo[e][p][q],n.weights[e][p][q]),m.push(f),e=snapBackNormal(a.n[isoTable[c][k]],n.snapBackToNormals[e][p][q],n.weights[e][p][q])):(f=a.v[isoTable[c][k]],m.push(f),e=a.n[isoTable[c][k]]);h.push(e)}else switch(isoTable[c][k]){case 8:f=vertexInterpIsoSnapMC(b,a.v[0],a.v[1],a.f[0],a.f[1]);m.push(f);h.push(normalInterpIsoSnapMC(b,a.n[0],a.n[1],a.f[0],a.f[1]));break;case 9:f=vertexInterpIsoSnapMC(b,
a.v[0],a.v[2],a.f[0],a.f[2]);m.push(f);h.push(normalInterpIsoSnapMC(b,a.n[0],a.n[2],a.f[0],a.f[2]));break;case 10:f=vertexInterpIsoSnapMC(b,a.v[1],a.v[3],a.f[1],a.f[3]);m.push(f);h.push(normalInterpIsoSnapMC(b,a.n[1],a.n[3],a.f[1],a.f[3]));break;case 11:f=vertexInterpIsoSnapMC(b,a.v[2],a.v[3],a.f[2],a.f[3]);m.push(f);h.push(normalInterpIsoSnapMC(b,a.n[2],a.n[3],a.f[2],a.f[3]));break;case 12:f=vertexInterpIsoSnapMC(b,a.v[0],a.v[4],a.f[0],a.f[4]);m.push(f);h.push(normalInterpIsoSnapMC(b,a.n[0],a.n[4],
a.f[0],a.f[4]));break;case 13:f=vertexInterpIsoSnapMC(b,a.v[1],a.v[5],a.f[1],a.f[5]);m.push(f);h.push(normalInterpIsoSnapMC(b,a.n[1],a.n[5],a.f[1],a.f[5]));break;case 14:f=vertexInterpIsoSnapMC(b,a.v[2],a.v[6],a.f[2],a.f[6]);m.push(f);h.push(normalInterpIsoSnapMC(b,a.n[2],a.n[6],a.f[2],a.f[6]));break;case 15:f=vertexInterpIsoSnapMC(b,a.v[3],a.v[7],a.f[3],a.f[7]);m.push(f);h.push(normalInterpIsoSnapMC(b,a.n[3],a.n[7],a.f[3],a.f[7]));break;case 16:f=vertexInterpIsoSnapMC(b,a.v[4],a.v[5],a.f[4],a.f[5]);
m.push(f);h.push(normalInterpIsoSnapMC(b,a.n[4],a.n[5],a.f[4],a.f[5]));break;case 17:f=vertexInterpIsoSnapMC(b,a.v[4],a.v[6],a.f[4],a.f[6]);m.push(f);h.push(normalInterpIsoSnapMC(b,a.n[4],a.n[6],a.f[4],a.f[6]));break;case 18:f=vertexInterpIsoSnapMC(b,a.v[5],a.v[7],a.f[5],a.f[7]);m.push(f);h.push(normalInterpIsoSnapMC(b,a.n[5],a.n[7],a.f[5],a.f[7]));break;case 19:f=vertexInterpIsoSnapMC(b,a.v[6],a.v[7],a.f[6],a.f[7]),m.push(f),h.push(normalInterpIsoSnapMC(b,a.n[6],a.n[7],a.f[6],a.f[7]))}return{trianglePoints:m,
triangleNormals:h}}function snapBack(a,b,n){let d=new vec3(0,0,0);d.x=a.x+n*(b.x-a.x);d.y=a.y+n*(b.y-a.y);d.z=a.z+n*(b.z-a.z);return d}function snapBackNormal(a,b,n){a=snapBack(a,b,n);return vec3normalize(a)}function vertexInterpIsoSnapMC(a,b,n,d,l){a=(a-d)/(l-d);d=new vec3(0,0,0);d.x=b.x+a*(n.x-b.x);d.y=b.y+a*(n.y-b.y);d.z=b.z+a*(n.z-b.z);return d}function normalInterpIsoSnapMC(a,b,n,d,l){a=vertexInterpIsoSnapMC(a,b,n,d,l);return vec3normalize(a)}
let positive=[2,6,18,54,162,486,1458,4374],equals=[1,3,9,27,81,243,729,2187],isoTable=[[],[],[8,12,9],[],[],[1,12,9],[8,10,13],[0,10,13],[10,12,9,13,12,10],[],[],[2,8,12],[],[1,0,2],[1,12,2],[2,13,8,2,10,13],[0,2,13,10,13,2],[13,12,2,10,13,2],[9,14,11],[0,14,11],[11,8,12,14,11,12],[11,1,14,1,9,14],[1,14,11,1,0,14],[1,14,11,1,12,14],[11,10,13,14,11,13,14,13,9,9,13,8],[0,14,13,10,13,11,11,13,14],[10,13,11,13,14,11,13,12,14],[],[],[3,8,12,3,12,9],[],[1,0,3],[1,12,3,9,3,12],[3,13,8],[0,3,13],[9,3,12,
13,12,3],[],[2,3,0],[2,3,12,8,12,3],[2,3,1],[1,0,2,1,2,3],[1,12,3,3,12,2],[2,3,13,2,13,8],[0,2,13,3,13,2],[3,12,2,13,12,3],[3,9,14],[0,14,3],[8,12,3,14,3,12],[9,14,1,1,14,3],[1,14,3,1,0,14],[1,12,3,3,12,14],[9,13,8,14,13,9,14,3,13],[0,14,13,3,13,14],[13,14,3,13,12,14],[10,11,15],[11,15,0,0,15,10],[11,12,9,15,12,11,15,10,12,10,8,12],[1,11,15],[1,0,15,0,11,15],[1,12,15,9,11,12,11,15,12],[11,13,8,15,13,11],[0,15,13,0,11,15],[9,11,12,11,15,12,13,12,15],[2,15,10],[2,15,0,0,15,10],[2,15,12,8,12,10,10,12,
15],[2,15,1],[1,0,15,0,2,15],[1,12,15,15,12,2],[2,15,13,2,13,8],[0,2,13,15,13,2],[15,12,2,13,12,15],[10,9,14,15,10,14],[0,14,15,0,15,10],[8,12,10,10,12,15,14,15,12],[9,14,1,1,14,15],[1,14,15,1,0,14],[1,12,15,15,12,14],[9,13,8,14,13,9,14,15,13],[0,14,13,15,13,14],[13,14,15,13,12,14],[],[],[4,9,8],[],[1,4,0],[1,4,9],[4,8,10,4,10,13],[0,10,4,13,4,10],[10,4,9,13,4,10],[],[2,0,4],[2,8,4],[],[1,4,2],[1,4,2],[2,10,4,2,4,8,10,13,4],[10,4,2,13,4,10],[10,4,2,13,4,10],[4,11,9,4,14,11],[0,4,11,14,11,4],[11,8,
4,14,11,4],[14,11,4,11,1,4,1,9,4],[1,4,11,11,4,14],[1,4,11,11,4,14],[11,13,14,11,10,13,14,13,4,9,4,8],[10,13,11,13,14,11,13,4,14],[10,13,11,13,14,11,13,4,14],[],[],[3,4,9,3,8,4],[],[1,4,3,0,3,4],[1,4,3,9,3,4],[3,13,4,3,4,8],[0,3,4,13,4,3],[9,3,4,13,4,3],[],[2,3,4,0,4,3],[2,3,4,8,4,3],[2,3,4,2,4,1,1,4,3],[1,4,3,3,4,2],[1,4,3,3,4,2],[2,3,4,2,4,8,13,4,3],[3,4,2,13,4,3],[3,4,2,13,4,3],[3,4,14,3,9,4],[0,4,3,14,3,4],[8,4,3,14,3,4],[9,4,1,1,4,3,14,3,4],[1,4,3,3,4,14],[1,4,3,3,4,14],[9,4,8,13,4,3,14,3,4],
[3,4,14,13,4,3],[3,4,14,13,4,3],[4,15,10,4,10,11,4,11,15],[0,4,10,11,4,0,15,4,11,15,10,4],[10,8,4,15,10,4,15,4,11,11,4,9],[1,11,4,15,1,4,15,4,11],[1,4,15,0,11,4,11,15,4],[1,4,15,9,11,4,11,15,4],[11,4,8,15,4,11,15,13,4],[0,11,4,11,15,4,13,4,15],[9,11,4,11,15,4,13,4,15],[2,4,10,15,4,2,15,10,4],[2,15,4,0,4,10,10,4,15],[2,15,4,8,4,10,10,4,15],[2,15,4,2,4,1,1,4,15],[1,4,15,15,4,2],[1,4,15,15,4,2],[2,15,4,2,4,8,13,4,15],[15,4,2,13,4,15],[15,4,2,13,4,15],[10,9,4,15,10,4,15,4,14],[0,4,10,10,4,15,14,15,4],
[8,4,10,10,4,15,14,15,4],[9,4,1,1,4,15,14,15,4],[1,4,15,15,4,14],[1,4,15,15,4,14],[9,4,8,13,4,15,14,15,4],[13,4,15,15,4,14],[13,4,15,15,4,14],[12,16,17],[0,16,17],[16,9,8,17,9,16],[16,17,1,1,17,12],[1,16,17,1,17,0],[1,16,17,1,17,9],[16,10,13,17,10,16,17,12,10,12,8,10],[0,10,17,13,16,10,16,17,10],[13,16,10,16,17,10,10,17,9],[17,2,16,2,12,16],[2,16,17,2,0,16],[2,16,17,2,8,16],[2,12,1,2,1,16,2,16,17],[1,16,2,16,17,2],[1,16,2,16,17,2],[2,12,8,2,10,17,17,10,16,10,13,16],[10,17,2,10,16,17,13,16,10],[10,
17,2,10,16,17,13,16,10],[16,14,11,17,14,16,16,11,12,12,11,9],[0,16,11,14,16,17,14,11,16],[14,16,17,14,11,16,11,8,16],[14,11,16,14,16,17,11,1,16,1,9,12],[1,16,11,11,16,14,16,17,14],[1,16,11,11,16,14,16,17,14],[11,13,14,11,10,13,14,16,17,14,13,16,9,12,8],[10,13,11,13,14,11,13,16,14,16,17,14],[10,13,11,13,14,11,13,16,14,16,17,14],[17,3,16,17,12,3,3,12,16],[3,16,17,3,17,0,3,0,16],[3,16,17,3,17,9,3,8,16],[3,17,12,3,16,17,3,1,16,3,12,1],[1,16,3,0,3,17,16,17,3],[1,16,3,9,3,17,16,17,3],[3,17,12,3,16,17,3,
13,16,3,12,8],[0,3,17,16,17,3,13,16,3],[9,3,17,16,17,3,13,16,3],[3,16,17,3,17,2,3,2,12,3,12,16],[2,3,17,0,16,3,16,17,3],[2,3,17,8,16,3,16,17,3],[2,3,17,2,12,1,1,16,3,16,17,3],[1,16,3,3,17,2,16,17,3],[1,16,3,3,17,2,16,17,3],[2,3,17,2,12,8,13,16,3,16,17,3],[3,17,2,16,17,3,13,16,3],[3,17,2,16,17,3,13,16,3],[3,12,16,3,16,17,3,17,14,3,9,12],[0,16,3,17,3,16,14,3,17],[8,16,3,17,3,16,14,3,17],[9,12,1,1,16,3,17,3,16,14,3,17],[1,16,3,3,17,14,3,16,17],[1,16,3,3,17,14,3,16,17],[9,12,8,13,16,3,17,3,16,14,3,17],
[3,17,14,3,16,17,13,16,3],[3,17,14,3,16,17,13,16,3],[17,12,11,17,11,15,17,15,16,16,15,10,16,10,12,12,10,11],[0,16,10,15,16,17,15,17,11,11,17,0,15,10,16],[10,8,16,15,10,16,15,16,17,15,17,11,11,17,9],[1,11,12,12,11,17,15,17,11,15,16,17,15,1,16],[1,16,15,0,11,17,11,15,17,16,17,15],[1,16,15,9,11,17,16,17,15,11,15,17],[11,12,8,11,17,12,15,17,11,15,16,17,15,13,16],[0,11,17,11,15,17,16,17,15,13,16,15],[9,11,17,16,17,15,13,16,15,11,15,17],[2,12,10,15,16,17,15,17,2,15,10,16,12,16,10],[2,15,17,0,16,10,10,16,
15,16,17,15],[2,15,17,8,16,10,16,17,15,10,16,15],[2,15,17,2,12,1,1,16,15,16,17,15],[1,16,15,15,17,2,16,17,15],[1,16,15,15,17,2,16,17,15],[2,15,17,2,12,8,13,16,15,16,17,15],[15,17,2,13,16,15,16,17,15],[15,17,2,13,16,15,16,17,15],[10,9,12,10,12,16,15,10,16,15,16,17,15,17,14],[0,16,10,10,16,15,16,17,15,14,15,17],[8,16,10,16,17,15,10,16,15,14,15,17],[9,12,1,1,16,15,14,15,17,16,17,15],[1,16,15,15,17,14,16,17,15],[1,16,15,15,17,14,16,17,15],[9,12,8,13,16,15,16,17,15,14,15,17],[13,16,15,16,17,15,15,17,14],
[13,16,15,16,17,15,15,17,14],[],[],[5,9,8,5,12,9],[],[1,5,0],[1,5,9,12,9,5],[5,8,10],[0,10,5],[12,9,5,10,5,9],[],[],[2,5,12,2,8,5],[],[1,5,2,0,2,5],[1,5,2,12,2,5],[2,10,5,2,5,8],[0,2,5,10,5,2],[12,2,5,10,5,2],[5,9,14,5,11,9,5,14,11],[0,5,11,14,5,0,14,11,5],[11,8,5,14,11,5,14,5,12],[1,9,5,11,1,5,14,11,5,14,5,9],[1,5,11,0,14,5,11,5,14],[1,5,11,12,14,5,11,5,14],[9,5,8,14,5,9,14,11,5,11,10,5],[0,14,5,10,5,11,11,5,14],[12,14,5,11,5,14,10,5,11],[],[],[3,5,9,3,8,5,9,5,12],[3,5,1],[0,3,5],[9,3,5,12,9,5],
[3,5,8],[0,3,5],[9,3,5,12,9,5],[],[2,3,5,2,5,0,0,5,3],[2,3,5,2,5,12,8,5,3],[2,3,5,2,5,1],[0,2,5,3,5,2],[12,2,5,3,5,2],[2,3,5,2,5,8],[0,2,5,3,5,2],[12,2,5,3,5,2],[3,5,14,3,9,5,14,5,9],[14,5,0,14,3,5,0,5,3],[14,5,12,14,3,5,8,5,3],[9,5,1,14,5,9,14,3,5],[0,14,5,3,5,14],[12,14,5,3,5,14],[9,5,8,14,5,9,14,3,5],[0,14,5,3,5,14],[12,14,5,3,5,14],[5,10,11,5,11,15],[15,5,11,11,5,0,0,5,10],[11,15,12,11,12,9,15,5,12,10,8,5],[1,11,5,15,5,11],[0,11,5,11,15,5],[9,11,12,12,11,15,12,15,5],[11,5,8,15,5,11],[0,11,5,11,
15,5],[9,11,12,12,11,15,12,15,5],[15,5,2,2,5,10],[2,15,5,2,5,0,0,5,10],[2,15,5,2,5,12,8,5,10],[2,15,5,2,5,1],[0,2,5,15,5,2],[12,2,5,15,5,2],[2,15,5,2,5,8],[0,2,5,15,5,2],[12,2,5,15,5,2],[15,5,14,14,5,9,10,9,5],[14,5,0,14,15,5,0,5,10],[14,5,12,14,15,5,8,5,10],[9,5,1,14,5,9,14,15,5],[0,14,5,15,5,14],[12,14,5,15,5,14],[9,5,8,14,5,9,14,15,5],[0,14,5,15,5,14],[12,14,5,15,5,14],[],[4,0,5],[4,9,5,8,5,9],[4,1,5],[1,4,0,1,5,4],[1,5,9,5,4,9],[4,10,5,4,8,10],[0,10,4,5,4,10],[5,4,9,10,5,9],[],[2,5,4,2,0,5],[2,
5,4,2,8,5],[2,4,1,2,5,4,2,1,5],[1,5,2,5,4,2],[1,5,2,5,4,2],[2,4,8,2,5,4,2,10,5],[5,4,2,10,5,2],[5,4,2,10,5,2],[4,14,5,4,5,9,11,9,5,14,11,5],[11,0,5,14,11,5,14,5,4],[11,8,5,14,11,5,14,5,4],[9,4,1,11,1,5,14,11,5,14,5,4],[1,5,11,11,5,14,5,4,14],[1,5,11,11,5,14,5,4,14],[9,4,8,11,10,5,14,11,5,14,5,4],[10,5,11,11,5,14,5,4,14],[10,5,11,11,5,14,5,4,14],[],[3,4,0,3,5,4,3,0,5],[3,4,9,3,5,4,3,8,5],[3,4,1,3,5,4],[0,3,4,5,4,3],[9,3,4,5,4,3],[3,4,8,3,5,4],[0,3,4,5,4,3],[9,3,4,5,4,3],[],[2,3,4,0,5,3,5,4,3],[2,3,
4,8,5,3,5,4,3],[2,3,4,2,4,1,5,4,3],[3,4,2,5,4,3],[3,4,2,5,4,3],[2,3,4,2,4,8,5,4,3],[3,4,2,5,4,3],[3,4,2,5,4,3],[3,5,14,3,9,5,5,9,4,14,5,4],[0,5,3,5,14,3,5,4,14],[8,5,3,5,14,3,5,4,14],[9,4,1,5,14,3,5,4,14],[5,14,3,5,4,14],[5,14,3,5,4,14],[9,4,8,5,14,3,5,4,14],[5,14,3,5,4,14],[5,14,3,5,4,14],[4,15,5,4,5,10,4,10,11,4,11,15],[10,0,5,11,4,0,15,4,11,15,5,4],[10,8,5,11,4,9,15,4,11,15,5,4],[11,4,1,15,4,11,15,5,4],[0,11,4,11,15,4,5,4,15],[9,11,4,11,15,4,5,4,15],[11,4,8,15,4,11,15,5,4],[0,11,4,11,15,4,5,4,
15],[9,11,4,11,15,4,5,4,15],[5,10,4,15,5,4,15,4,2,2,4,10],[2,15,4,0,5,10,5,4,15],[2,15,4,8,5,10,5,4,15],[2,15,4,2,4,1,5,4,15],[15,4,2,5,4,15],[15,4,2,5,4,15],[2,15,4,2,4,8,5,4,15],[15,4,2,5,4,15],[15,4,2,5,4,15],[15,5,14,14,5,4,5,9,4,10,9,5],[0,5,10,5,14,15,5,4,14],[8,5,10,5,14,15,5,4,14],[9,4,1,5,14,15,5,4,14],[5,14,15,5,4,14],[5,14,15,5,4,14],[9,4,8,5,14,15,5,4,14],[5,14,15,5,4,14],[5,14,15,5,4,14],[5,17,12],[0,5,17],[8,5,9,17,9,5],[12,1,17,1,5,17],[1,5,17,1,17,0],[1,5,9,5,17,9],[12,8,10,17,12,
10,17,10,5],[0,10,17,5,17,10],[10,5,17,10,17,9],[17,2,5,2,12,5],[2,5,17,2,0,5],[2,5,17,2,8,5],[2,5,17,2,1,5,2,12,1],[1,5,2,5,17,2],[1,5,2,5,17,2],[2,5,17,2,10,5,2,12,8],[5,17,2,10,5,2],[5,17,2,10,5,2],[17,14,5,14,11,5,11,9,5,12,5,9],[11,0,5,14,11,5,14,5,17],[11,8,5,14,11,5,14,5,17],[9,12,1,11,1,5,14,11,5,14,5,17],[1,5,11,11,5,14,5,17,14],[1,5,11,11,5,14,5,17,14],[9,12,8,11,10,5,14,11,5,14,5,17],[10,5,11,11,5,14,5,17,14],[10,5,11,11,5,14,5,17,14],[17,12,3,17,3,5,3,12,5],[3,5,17,3,17,0,3,0,5],[3,5,
17,3,17,9,3,8,5],[3,5,17,3,17,12,3,12,1],[0,3,17,5,17,3],[9,3,17,5,17,3],[3,5,17,3,17,12,3,12,8],[0,3,17,5,17,3],[9,3,17,5,17,3],[3,5,17,3,17,2,3,2,12,3,12,5],[2,3,17,0,5,3,5,17,3],[2,3,17,8,5,3,5,17,3],[2,3,17,2,12,1,5,17,3],[3,17,2,5,17,3],[3,17,2,5,17,3],[2,3,17,2,12,8,5,17,3],[3,17,2,5,17,3],[3,17,2,5,17,3],[3,5,14,3,9,5,5,9,12,14,5,17],[0,5,3,5,14,3,5,17,14],[8,5,3,5,14,3,5,17,14],[9,12,1,5,14,3,5,17,14],[5,14,3,5,17,14],[5,14,3,5,17,14],[9,12,8,5,14,3,5,17,14],[5,14,3,5,17,14],[5,14,3,5,17,
14],[17,12,11,17,11,15,17,15,5,12,10,11,12,5,10],[10,0,5,15,5,17,15,17,11,11,17,0],[10,8,5,15,5,17,15,17,11,11,17,9],[15,5,17,15,17,11,11,17,12,11,12,1],[0,11,17,11,15,17,5,17,15],[9,11,17,5,17,15,11,15,17],[15,5,17,15,17,11,11,17,12,11,12,8],[0,11,17,11,15,17,5,17,15],[9,11,17,5,17,15,11,15,17],[5,10,12,15,17,2,15,5,17,2,12,10],[2,15,17,0,5,10,5,17,15],[2,15,17,8,5,10,5,17,15],[2,15,17,2,12,1,5,17,15],[15,17,2,5,17,15],[15,17,2,5,17,15],[2,15,17,2,12,8,5,17,15],[15,17,2,5,17,15],[15,17,2,5,17,15],
[15,5,17,15,17,14,10,12,5,10,9,12],[0,5,10,5,17,15,17,14,15],[8,5,10,5,17,15,17,14,15],[9,12,1,5,17,15,17,14,15],[5,17,15,17,14,15],[5,17,15,17,14,15],[9,12,8,5,17,15,17,14,15],[5,17,15,17,14,15],[5,17,15,17,14,15],[13,18,16],[16,0,18,0,13,18],[16,12,9,18,16,9,18,9,13,13,9,8],[1,18,16],[1,18,0,0,18,16],[1,18,9,12,9,16,16,9,18],[16,8,10,18,16,10],[0,10,18,0,18,16],[12,9,16,16,9,18,10,18,9],[18,16,2,18,2,13,2,16,13],[2,13,18,2,18,16,2,16,0,2,0,13],[2,13,18,2,18,16,2,16,12,2,8,13],[2,18,16,2,1,18,2,
16,1],[1,18,2,0,2,16,16,2,18],[1,18,2,12,2,16,16,2,18],[2,18,16,2,10,18,2,16,8],[0,2,16,16,2,18,10,18,2],[12,2,16,16,2,18,10,18,2],[18,11,13,18,14,11,18,16,14,16,9,14,16,13,9,13,11,9],[0,13,11,13,18,11,14,11,18,14,18,16,14,16,0],[11,8,13,11,13,18,14,11,18,14,18,16,14,16,12],[1,9,16,14,18,16,14,11,18,11,1,18,14,16,9],[1,18,11,0,14,16,11,18,14,16,14,18],[1,18,11,12,14,16,16,14,18,11,18,14],[9,16,8,14,16,9,14,18,16,14,11,18,11,10,18],[0,14,16,10,18,11,16,14,18,11,18,14],[12,14,16,16,14,18,11,18,14,10,
18,11],[18,16,3,3,16,13],[3,0,13,3,16,0,3,18,16],[3,8,13,3,18,9,18,16,9,9,16,12],[3,18,16,3,16,1],[0,3,16,16,3,18],[9,3,18,9,18,16,12,9,16],[3,18,16,3,16,8],[0,3,16,16,3,18],[9,3,18,9,18,16,12,9,16],[3,2,13,3,18,2,2,18,16,2,16,13],[2,3,18,2,18,16,2,16,0,0,13,3],[2,3,18,2,18,16,2,16,12,8,13,3],[2,3,18,2,18,16,2,16,1],[0,2,16,16,2,18,3,18,2],[12,2,16,16,2,18,3,18,2],[2,3,18,2,18,16,2,16,8],[0,2,16,16,2,18,3,18,2],[12,2,16,16,2,18,3,18,2],[3,9,13,3,18,14,14,18,16,14,16,9,13,9,16],[14,16,0,14,18,16,14,
3,18,0,13,3],[14,16,12,14,18,16,14,3,18,8,13,3],[9,16,1,14,16,9,14,18,16,14,3,18],[0,14,16,3,18,14,16,14,18],[12,14,16,16,14,18,3,18,14],[9,16,8,14,16,9,14,18,16,14,3,18],[0,14,16,3,18,14,16,14,18],[12,14,16,16,14,18,3,18,14],[16,11,15,18,16,15,16,13,11,13,10,11],[15,16,11,15,18,16,11,16,0,0,13,10],[11,15,12,11,12,9,15,18,16,15,16,12,10,8,13],[1,11,16,15,18,16,15,16,11],[0,11,16,11,15,16,16,15,18],[9,11,12,12,11,15,12,15,16,16,15,18],[15,18,16,15,16,11,11,16,8],[0,11,16,11,15,16,16,15,18],[9,11,12,
12,11,15,12,15,16,16,15,18],[15,18,2,18,16,2,2,16,13,2,13,10],[2,15,18,2,18,16,2,16,0,0,13,10],[2,15,18,2,18,16,2,16,12,8,13,10],[2,15,18,2,18,16,2,16,1],[0,2,16,18,16,2,15,18,2],[12,2,16,18,16,2,15,18,2],[2,15,18,2,18,16,2,16,8],[0,2,16,18,16,2,15,18,2],[12,2,16,18,16,2,15,18,2],[15,18,14,14,18,16,14,16,9,13,9,16,10,9,13],[14,16,0,14,18,16,14,15,18,0,13,10],[14,16,12,14,18,16,14,15,18,8,13,10],[9,16,1,14,16,9,14,18,16,14,15,18],[0,14,16,15,18,14,16,14,18],[12,14,16,16,14,18,15,18,14],[9,16,8,14,
16,9,14,18,16,14,15,18],[0,14,16,15,18,14,16,14,18],[12,14,16,16,14,18,15,18,14],[4,13,18],[4,0,18,0,13,18],[4,9,18,8,13,9,13,18,9],[4,1,18],[1,18,0,0,18,4],[1,18,9,18,4,9],[4,10,18,4,8,10],[0,10,4,18,4,10],[18,4,9,10,18,9],[4,13,2,4,2,18,2,13,18],[2,18,4,2,13,18,2,0,13],[2,18,4,2,13,18,2,8,13],[2,4,1,2,18,4,2,1,18],[1,18,2,18,4,2],[1,18,2,18,4,2],[2,4,8,2,18,4,2,10,18],[18,4,2,10,18,2],[18,4,2,10,18,2],[4,13,9,4,14,18,14,11,18,11,9,13,11,13,18],[11,0,13,11,13,18,14,11,18,14,18,4],[11,8,13,11,13,
18,14,11,18,14,18,4],[9,4,1,11,1,18,14,11,18,14,18,4],[1,18,11,11,18,14,18,4,14],[1,18,11,11,18,14,18,4,14],[9,4,8,11,10,18,14,11,18,14,18,4],[10,18,11,18,4,14,11,18,14],[10,18,11,18,4,14,11,18,14],[4,13,3,4,3,18],[3,4,0,3,18,4,3,0,13],[3,4,9,3,18,4,3,8,13],[3,4,1,3,18,4],[0,3,4,18,4,3],[9,3,4,18,4,3],[3,4,8,3,18,4],[0,3,4,18,4,3],[9,3,4,18,4,3],[3,18,2,3,2,13,18,4,2,2,4,13],[2,3,18,2,18,4,0,13,3],[2,3,18,2,18,4,8,13,3],[2,3,18,2,18,4,2,4,1],[18,4,2,3,18,2],[18,4,2,3,18,2],[2,3,18,2,18,4,2,4,8],[18,
4,2,3,18,2],[18,4,2,3,18,2],[3,18,14,3,9,13,14,18,4,13,9,4],[0,13,3,18,4,14,18,14,3],[8,13,3,18,4,14,18,14,3],[9,4,1,18,4,14,18,14,3],[18,14,3,18,4,14],[18,14,3,18,4,14],[9,4,8,18,4,14,18,14,3],[18,14,3,18,4,14],[18,14,3,18,4,14],[4,13,10,4,10,11,4,11,15,4,15,18],[10,0,13,11,4,0,15,4,11,15,18,4],[10,8,13,11,4,9,15,4,11,15,18,4],[11,4,1,15,4,11,15,18,4],[0,11,4,11,15,4,18,4,15],[9,11,4,11,15,4,18,4,15],[11,4,8,15,4,11,15,18,4],[0,11,4,11,15,4,18,4,15],[9,11,4,11,15,4,18,4,15],[15,18,4,15,4,2,2,4,10,
13,10,4],[2,15,4,0,13,10,18,4,15],[2,15,4,8,13,10,18,4,15],[2,15,4,2,4,1,18,4,15],[15,4,2,18,4,15],[15,4,2,18,4,15],[2,15,4,2,4,8,18,4,15],[15,4,2,18,4,15],[15,4,2,18,4,15],[15,18,14,14,18,4,13,9,4,10,9,13],[0,13,10,18,4,14,18,14,15],[8,13,10,18,4,14,18,14,15],[9,4,1,18,4,14,18,14,15],[18,4,14,18,14,15],[18,4,14,18,14,15],[9,4,8,18,4,14,18,14,15],[18,4,14,18,14,15],[18,4,14,18,14,15],[13,17,12,18,17,13],[0,18,17,0,13,18],[8,13,9,13,18,9,17,9,18],[12,1,17,1,18,17],[1,18,17,1,17,0],[1,18,9,18,17,9],
[12,8,10,17,12,10,17,10,18],[0,10,17,18,17,10],[10,18,17,10,17,9],[17,2,18,2,13,18,2,12,13],[2,18,17,2,13,18,2,0,13],[2,18,17,2,13,18,2,8,13],[2,18,17,2,1,18,2,12,1],[1,18,2,18,17,2],[1,18,2,18,17,2],[2,18,17,2,10,18,2,12,8],[18,17,2,10,18,2],[18,17,2,10,18,2],[17,14,18,11,13,18,14,11,18,11,9,13,12,13,9],[11,0,13,11,13,18,14,11,18,14,18,17],[11,8,13,11,13,18,14,11,18,14,18,17],[9,12,1,11,1,18,14,11,18,14,18,17],[1,18,11,11,18,14,18,17,14],[1,18,11,11,18,14,18,17,14],[9,12,8,11,10,18,14,11,18,14,18,
17],[10,18,11,18,17,14,11,18,14],[10,18,11,18,17,14,11,18,14],[17,12,3,17,3,18,3,12,13],[3,18,17,3,17,0,3,0,13],[3,18,17,3,17,9,3,8,13],[3,18,17,3,17,12,3,12,1],[0,3,17,18,17,3],[9,3,17,18,17,3],[3,18,17,3,17,12,3,12,8],[0,3,17,18,17,3],[9,3,17,18,17,3],[3,18,17,3,17,2,3,2,12,3,12,13],[2,3,17,0,13,3,18,17,3],[2,3,17,8,13,3,18,17,3],[2,3,17,2,12,1,18,17,3],[3,17,2,18,17,3],[3,17,2,18,17,3],[2,3,17,2,12,8,18,17,3],[3,17,2,18,17,3],[3,17,2,18,17,3],[3,18,14,3,9,13,14,18,17,13,9,12],[0,13,3,18,17,14,
18,14,3],[8,13,3,18,17,14,18,14,3],[9,12,1,18,17,14,18,14,3],[18,14,3,18,17,14],[18,14,3,18,17,14],[9,12,8,18,17,14,18,14,3],[18,14,3,18,17,14],[18,14,3,18,17,14],[17,12,11,17,11,15,17,15,18,12,10,11,12,13,10],[10,0,13,15,18,17,15,17,11,11,17,0],[10,8,13,15,18,17,15,17,11,11,17,9],[15,18,17,15,17,11,11,17,12,11,12,1],[0,11,17,11,15,17,18,17,15],[9,11,17,11,15,17,18,17,15],[15,18,17,15,17,11,11,17,12,11,12,8],[0,11,17,11,15,17,18,17,15],[9,11,17,11,15,17,18,17,15],[15,17,2,15,18,17,2,12,10,13,10,12],
[2,15,17,0,13,10,18,17,15],[2,15,17,8,13,10,18,17,15],[2,15,17,2,12,1,18,17,15],[15,17,2,18,17,15],[15,17,2,18,17,15],[2,15,17,2,12,8,18,17,15],[15,17,2,18,17,15],[15,17,2,18,17,15],[15,18,17,15,17,14,10,12,13,10,9,12],[0,13,10,17,14,15,18,17,15],[8,13,10,17,14,15,18,17,15],[9,12,1,17,14,15,18,17,15],[17,14,15,18,17,15],[17,14,15,18,17,15],[9,12,8,17,14,15,18,17,15],[17,14,15,18,17,15],[17,14,15,18,17,15],[],[],[6,8,12,6,9,8],[],[],[1,12,6,1,6,9],[6,13,8,6,8,10,6,10,13],[0,10,6,13,0,6,13,6,10],[10,
6,9,13,6,10,13,12,6],[],[2,0,6],[2,8,6,12,6,8],[],[1,6,2,1,0,6],[1,6,2,1,12,6],[2,10,6,2,6,8,10,13,6,13,8,6],[13,0,6,13,6,10,10,6,2],[13,12,6,13,6,10,10,6,2],[6,11,9],[0,6,11],[12,6,8,11,8,6],[11,1,6,1,9,6],[1,6,11,1,0,6],[1,6,11,1,12,6],[11,10,6,10,13,6,13,8,6,9,6,8],[13,0,6,13,6,10,10,6,11],[13,12,6,13,6,10,10,6,11],[],[],[3,6,9,3,8,6,12,6,8],[],[1,6,3,1,0,6,0,3,6],[1,6,3,1,12,6,9,3,6],[3,13,6,3,6,8,13,8,6],[13,0,6,13,6,3,0,3,6],[13,12,6,13,6,3,9,3,6],[3,2,6],[0,6,3],[8,6,3,12,6,8],[2,6,1,1,6,3],
[1,6,3,1,0,6],[1,6,3,1,12,6],[2,6,8,8,6,13,13,6,3],[13,0,6,13,6,3],[13,12,6,13,6,3],[3,9,6],[0,6,3],[8,6,3,12,6,8],[9,6,1,1,6,3],[1,6,3,1,0,6],[1,6,3,1,12,6],[8,6,13,9,6,8,13,6,3],[13,0,6,13,6,3],[13,12,6,13,6,3],[6,15,10,6,10,11],[11,6,0,0,6,10,15,10,6],[11,6,9,10,8,12,10,12,15,15,12,6],[15,1,6,1,11,6],[1,6,15,1,0,6,0,11,6],[1,6,15,1,12,6,9,11,6],[15,13,6,13,8,6,11,6,8],[13,0,6,13,6,15,0,11,6],[13,12,6,13,6,15,9,11,6],[2,6,10,15,10,6],[0,6,10,10,6,15],[8,12,10,12,15,10,12,6,15],[2,6,1,1,6,15],[1,
6,15,1,0,6],[1,6,15,1,12,6],[2,6,8,8,6,13,13,6,15],[13,0,6,13,6,15],[13,12,6,13,6,15],[10,9,6,15,10,6],[0,6,10,10,6,15],[8,12,10,12,15,10,12,6,15],[9,6,1,1,6,15],[1,6,15,1,0,6],[1,6,15,1,12,6],[8,6,13,9,6,8,13,6,15],[13,0,6,13,6,15],[13,12,6,13,6,15],[],[4,6,0],[4,6,8,9,8,6],[],[1,4,6,1,6,0],[1,4,6,1,6,9],[4,6,13,4,8,6,10,6,8,13,6,10],[10,6,0,13,6,10,13,4,6],[10,6,9,13,6,10,13,4,6],[4,6,2],[2,0,4,2,4,6],[2,8,6,6,8,4],[2,4,1,2,1,6,1,4,6],[1,6,2,1,4,6],[1,6,2,1,4,6],[2,4,8,2,10,6,10,13,6,13,4,6],[10,
6,2,13,6,10,13,4,6],[10,6,2,13,6,10,13,4,6],[4,6,11,4,11,9],[0,4,11,6,11,4],[6,8,4,11,8,6],[9,4,1,1,4,6,11,1,6],[1,6,11,1,4,6],[1,6,11,1,4,6],[9,4,8,10,13,6,11,10,6,13,4,6],[10,6,11,13,6,10,13,4,6],[10,6,11,13,6,10,13,4,6],[],[3,0,4,3,4,6,3,6,0],[3,8,4,3,4,6,3,6,9],[],[1,4,3,0,3,6,6,3,4],[1,4,3,9,3,6,6,3,4],[3,13,6,3,6,8,6,4,8,13,4,6],[0,3,6,6,3,13,6,13,4],[9,3,6,6,3,13,6,13,4],[3,2,4,3,4,6],[0,4,3,6,3,4],[8,4,3,6,3,4],[2,4,1,1,4,3,6,3,4],[1,4,3,3,4,6],[1,4,3,3,4,6],[2,4,8,6,3,13,6,13,4],[3,13,6,
13,4,6],[3,13,6,13,4,6],[3,9,4,3,4,6],[0,4,3,6,3,4],[8,4,3,6,3,4],[9,4,1,1,4,3,6,3,4],[1,4,3,3,4,6],[1,4,3,3,4,6],[9,4,8,6,3,13,6,13,4],[3,13,6,13,4,6],[3,13,6,13,4,6],[4,6,15,4,11,6,4,10,11,4,15,10],[11,6,0,10,0,4,15,10,4,15,4,6],[11,6,9,10,8,4,15,10,4,15,4,6],[6,4,11,15,4,6,15,1,4,1,11,4],[1,4,15,0,11,6,6,15,4],[1,4,15,9,11,6,6,15,4],[15,13,6,13,4,6,6,4,8,11,6,8],[0,11,6,6,15,13,6,13,4],[9,11,6,6,15,13,6,13,4],[10,2,4,15,10,4,15,4,6],[0,4,10,10,4,15,6,15,4],[8,4,10,10,4,15,6,15,4],[2,4,1,1,4,15,
6,15,4],[1,4,15,15,4,6],[1,4,15,15,4,6],[2,4,8,6,15,13,6,13,4],[15,13,6,13,4,6],[15,13,6,13,4,6],[10,9,4,15,10,4,15,4,6],[0,4,10,10,4,15,6,15,4],[8,4,10,10,4,15,6,15,4],[9,4,1,1,4,15,6,15,4],[1,4,15,15,4,6],[1,4,15,15,4,6],[9,4,8,6,15,13,6,13,4],[15,13,6,13,4,6],[15,13,6,13,4,6],[6,12,16],[0,16,6],[9,8,6,16,6,8],[16,6,1,1,6,12],[1,16,6,1,6,0],[1,16,6,1,6,9],[16,6,13,13,6,10,10,6,8,12,8,6],[10,6,0,13,6,10,13,16,6],[10,6,9,13,6,10,13,16,6],[12,16,2,2,16,6],[2,16,6,2,0,16],[2,8,6,6,8,16],[2,1,6,2,12,
1,1,16,6],[1,6,2,1,16,6],[1,6,2,1,16,6],[2,10,6,2,12,8,10,13,6,13,16,6],[10,6,2,13,6,10,13,16,6],[10,6,2,13,6,10,13,16,6],[12,11,9,16,11,12,16,6,11],[0,16,11,6,11,16],[11,16,6,11,8,16],[9,12,1,1,16,6,11,1,6],[1,6,11,1,16,6],[1,6,11,1,16,6],[9,12,8,10,13,6,11,10,6,13,16,6],[10,6,11,13,6,10,13,16,6],[10,6,11,13,6,10,13,16,6],[16,3,12,16,6,3,3,6,12],[3,16,6,3,0,16,3,6,0],[3,16,6,3,8,16,3,6,9],[3,16,6,3,1,16,3,12,1,3,6,12],[1,16,3,0,3,6,6,3,16],[1,16,3,9,3,6,6,3,16],[3,13,6,3,6,8,6,12,8,13,16,6],[0,3,
6,6,3,13,6,13,16],[9,3,6,6,3,13,6,13,16],[3,16,6,3,12,16,3,2,12],[0,16,3,6,3,16],[8,16,3,6,3,16],[2,12,1,1,16,3,6,3,16],[1,16,3,3,16,6],[1,16,3,3,16,6],[2,12,8,6,3,13,6,13,16],[3,13,6,13,16,6],[3,13,6,13,16,6],[3,16,6,3,12,16,3,9,12],[0,16,3,6,3,16],[8,16,3,6,3,16],[9,12,1,1,16,3,6,3,16],[1,16,3,3,16,6],[1,16,3,3,16,6],[9,12,8,6,3,13,6,13,16],[3,13,6,13,16,6],[3,13,6,13,16,6],[16,10,12,16,15,10,16,6,15,12,10,11,12,11,6],[11,6,0,15,16,6,15,10,16,10,0,16],[11,6,9,15,16,6,15,10,16,10,8,16],[6,12,11,
15,1,16,15,16,6,1,11,12],[1,16,15,0,11,6,6,15,16],[1,16,15,9,11,6,6,15,16],[15,16,6,15,13,16,11,6,12,11,12,8],[0,11,6,6,15,16,16,15,13],[9,11,6,6,15,16,16,15,13],[15,16,6,15,10,16,10,12,16,10,2,12],[0,16,10,10,16,15,6,15,16],[8,16,10,6,15,16,10,16,15],[2,12,1,1,16,15,6,15,16],[1,16,15,15,16,6],[1,16,15,15,16,6],[2,12,8,6,15,16,16,15,13],[15,13,16,15,16,6],[15,13,16,15,16,6],[15,16,6,15,10,16,10,12,16,10,9,12],[0,16,10,10,16,15,6,15,16],[8,16,10,6,15,16,10,16,15],[9,12,1,1,16,15,6,15,16],[1,16,15,
15,16,6],[1,16,15,15,16,6],[9,12,8,6,15,16,16,15,13],[15,13,16,15,16,6],[15,13,16,15,16,6],[],[],[5,12,6,5,6,8,9,8,6],[],[1,5,6,1,6,0,0,6,5],[1,5,6,1,6,9,12,6,5],[5,6,10,5,8,6,10,6,8],[10,6,0,10,5,6,0,6,5],[10,6,9,10,5,6,12,6,5],[],[2,0,5,2,5,6,0,6,5],[2,8,5,2,5,6,12,6,5],[],[1,5,2,0,6,5,6,2,5],[1,5,2,6,2,5,12,6,5],[2,10,6,2,6,8,6,5,8,10,5,6],[0,6,5,6,2,10,6,10,5],[6,2,10,6,10,5,12,6,5],[5,6,11,5,9,6,5,11,9],[0,6,5,11,0,5,11,5,6],[11,8,5,11,5,6,12,6,5],[6,5,9,11,5,6,11,1,5,1,9,5],[1,5,11,0,6,5,6,
11,5],[1,5,11,6,11,5,12,6,5],[11,10,6,10,5,6,6,5,8,9,6,8],[0,6,5,6,11,10,6,10,5],[6,11,10,6,10,5,12,6,5],[],[3,0,5,3,5,6,3,6,0,0,6,5],[3,8,5,3,5,6,3,6,9,12,6,5],[3,5,6,3,6,1,1,6,5],[0,6,5,0,3,6,6,3,5],[9,3,6,6,3,5,12,6,5],[3,5,6,3,6,8,8,6,5],[0,6,5,0,3,6,6,3,5],[9,3,6,6,3,5,12,6,5],[3,2,5,3,5,6,2,6,5],[6,5,0,6,3,5,0,5,3],[6,5,12,6,3,5,8,5,3],[2,6,5,2,5,1,6,3,5],[0,6,5,3,5,6],[3,5,6,12,6,5],[2,6,8,8,6,5,6,3,5],[0,6,5,3,5,6],[3,5,6,12,6,5],[3,9,5,3,5,6,9,6,5],[6,5,0,6,3,5,0,5,3],[6,5,12,6,3,5,8,5,3],
[9,5,1,9,6,5,6,3,5],[0,6,5,3,5,6],[3,5,6,12,6,5],[8,6,5,9,6,8,6,3,5],[0,6,5,3,5,6],[3,5,6,12,6,5],[5,6,15,5,10,6,11,6,10],[10,0,5,0,6,5,11,6,0,15,5,6],[10,8,5,11,6,9,12,6,5,15,5,6],[11,6,1,1,6,5,15,5,6],[0,6,5,0,11,6,6,15,5],[9,11,6,6,15,5,12,6,5],[8,6,5,11,6,8,15,5,6],[0,6,5,0,11,6,6,15,5],[9,11,6,6,15,5,12,6,5],[10,2,5,2,6,5,15,5,6],[6,5,0,6,15,5,0,5,10],[6,5,12,6,15,5,8,5,10],[2,6,5,2,5,1,6,15,5],[0,6,5,15,5,6],[15,5,6,12,6,5],[2,6,8,8,6,5,6,15,5],[0,6,5,15,5,6],[15,5,6,12,6,5],[10,9,5,9,6,5,15,
5,6],[6,5,0,6,15,5,0,5,10],[6,5,12,6,15,5,8,5,10],[9,5,1,9,6,5,6,15,5],[0,6,5,15,5,6],[15,5,6,12,6,5],[8,6,5,9,6,8,6,15,5],[0,6,5,15,5,6],[15,5,6,12,6,5],[5,6,4],[0,5,6],[8,5,6,9,8,6],[4,1,6,1,5,6],[1,5,6,1,6,0],[1,5,6,1,6,9],[4,8,6,8,10,6,10,5,6],[10,6,0,10,5,6],[10,6,9,10,5,6],[4,5,2,2,5,6],[2,5,6,2,0,5],[2,5,6,2,8,5],[2,4,1,2,5,6,2,1,5],[1,5,2,5,6,2],[1,5,2,5,6,2],[2,4,8,2,10,6,10,5,6],[10,6,2,5,6,10],[10,6,2,5,6,10],[4,5,9,9,5,11,11,5,6],[11,0,5,11,5,6],[11,8,5,11,5,6],[9,4,1,11,1,5,11,5,6],[1,
5,11,5,6,11],[1,5,11,5,6,11],[9,4,8,10,5,6,11,10,6],[10,6,11,5,6,10],[10,6,11,5,6,10],[4,5,3,4,3,6,3,5,6],[3,5,6,3,6,0,3,0,5],[3,5,6,3,6,9,3,8,5],[3,4,1,3,6,4,3,5,6],[0,3,6,5,6,3],[9,3,6,5,6,3],[3,6,8,3,5,6,8,6,4],[0,3,6,5,6,3],[9,3,6,5,6,3],[3,2,4,3,4,5,3,5,6],[0,5,3,5,6,3],[8,5,3,5,6,3],[2,4,1,5,6,3],[5,6,3],[5,6,3],[2,4,8,5,6,3],[5,6,3],[5,6,3],[3,9,5,3,5,6,9,4,5],[0,5,3,5,6,3],[8,5,3,5,6,3],[9,4,1,5,6,3],[5,6,3],[5,6,3],[9,4,8,5,6,3],[5,6,3],[5,6,3],[4,5,10,4,11,6,4,10,11,15,5,6],[15,5,6,11,6,
0,10,0,5],[15,5,6,11,6,9,10,8,5],[15,5,6,11,6,4,11,4,1],[0,11,6,5,6,15],[9,11,6,5,6,15],[11,6,8,8,6,4,15,5,6],[0,11,6,5,6,15],[9,11,6,5,6,15],[15,5,6,10,4,5,10,2,4],[0,5,10,5,6,15],[8,5,10,5,6,15],[2,4,1,5,6,15],[5,6,15],[5,6,15],[2,4,8,5,6,15],[5,6,15],[5,6,15],[10,9,5,9,4,5,15,5,6],[0,5,10,5,6,15],[8,5,10,5,6,15],[9,4,1,5,6,15],[5,6,15],[5,6,15],[9,4,8,5,6,15],[5,6,15],[5,6,15],[5,6,12],[0,5,6],[8,5,6,9,8,6],[12,1,6,1,5,6],[1,5,6,1,6,0],[1,5,6,1,6,9],[8,10,6,12,8,6,10,5,6],[10,6,0,10,5,6],[10,6,
9,10,5,6],[12,5,2,2,5,6],[2,5,6,2,0,5],[2,5,6,2,8,5],[2,5,6,2,1,5,2,12,1],[1,5,2,5,6,2],[1,5,2,5,6,2],[2,10,6,2,12,8,10,5,6],[10,6,2,5,6,10],[10,6,2,5,6,10],[12,5,9,9,5,11,11,5,6],[11,0,5,11,5,6],[11,8,5,11,5,6],[9,12,1,11,1,5,11,5,6],[1,5,11,5,6,11],[1,5,11,5,6,11],[9,12,8,10,5,6,11,10,6],[10,6,11,5,6,10],[10,6,11,5,6,10],[12,3,6,12,5,3,3,5,6],[3,5,6,3,6,0,3,0,5],[3,5,6,3,6,9,3,8,5],[3,6,12,3,12,1,3,5,6],[0,3,6,5,6,3],[9,3,6,5,6,3],[3,6,8,3,5,6,8,6,12],[0,3,6,5,6,3],[9,3,6,5,6,3],[3,12,5,3,2,12,
3,5,6],[0,5,3,5,6,3],[8,5,3,5,6,3],[2,12,1,5,6,3],[5,6,3],[5,6,3],[2,12,8,5,6,3],[5,6,3],[5,6,3],[3,9,5,3,5,6,9,12,5],[0,5,3,5,6,3],[8,5,3,5,6,3],[9,12,1,5,6,3],[5,6,3],[5,6,3],[9,12,8,5,6,3],[5,6,3],[5,6,3],[12,11,6,12,10,11,12,5,10,15,5,6],[15,5,6,11,6,0,10,0,5],[15,5,6,11,6,9,10,8,5],[15,5,6,11,12,1,11,6,12],[0,11,6,5,6,15],[9,11,6,5,6,15],[11,6,12,11,12,8,15,5,6],[0,11,6,5,6,15],[9,11,6,5,6,15],[15,5,6,10,2,12,10,12,5],[0,5,10,5,6,15],[8,5,10,5,6,15],[2,12,1,5,6,15],[5,6,15],[5,6,15],[2,12,8,
5,6,15],[5,6,15],[5,6,15],[10,12,5,10,9,12,15,5,6],[0,5,10,5,6,15],[8,5,10,5,6,15],[9,12,1,5,6,15],[5,6,15],[5,6,15],[9,12,8,5,6,15],[5,6,15],[5,6,15],[6,13,18,6,16,13],[16,0,6,0,13,6,18,6,13],[16,12,6,9,8,13,9,13,18,9,18,6],[18,6,1,1,6,16],[1,18,6,1,6,0,0,6,16],[1,18,6,1,6,9,12,6,16],[18,6,10,10,6,8,16,8,6],[10,6,0,10,18,6,0,6,16],[10,6,9,10,18,6,12,6,16],[18,2,13,18,6,2,2,6,16,13,2,16],[2,18,6,2,13,18,2,0,13,0,6,16],[2,18,6,2,13,18,2,8,13,12,6,16],[2,18,6,2,1,18,2,16,1,2,6,16],[1,18,2,0,6,16,6,
2,18],[1,18,2,6,2,18,12,6,16],[2,10,6,2,6,8,6,16,8,10,18,6],[0,6,16,6,2,10,6,10,18],[6,2,10,6,10,18,12,6,16],[18,11,13,18,6,11,13,11,9,16,13,9,16,9,6],[0,6,16,11,18,6,11,13,18,11,0,13],[11,18,6,11,13,18,11,8,13,12,6,16],[6,16,9,11,1,18,11,18,6,1,9,16],[1,18,11,0,6,16,6,11,18],[1,18,11,6,11,18,12,6,16],[11,18,6,11,10,18,9,6,16,9,16,8],[0,6,16,6,11,18,18,11,10],[6,11,18,12,6,16,18,11,10],[18,6,3,3,6,13,16,13,6],[3,18,6,3,6,0,3,0,13,0,6,16],[3,18,6,3,6,9,3,8,13,12,6,16],[3,18,6,3,6,1,1,6,16],[0,6,16,
0,3,6,6,3,18],[9,3,6,6,3,18,12,6,16],[3,18,6,3,6,8,8,6,16],[0,6,16,0,3,6,6,3,18],[9,3,6,6,3,18,12,6,16],[3,18,6,3,2,13,13,2,16,2,6,16],[6,16,0,6,3,18,0,13,3],[6,16,12,6,3,18,8,13,3],[2,6,16,2,16,1,6,3,18],[0,6,16,3,18,6],[3,18,6,12,6,16],[2,6,8,8,6,16,6,3,18],[0,6,16,3,18,6],[3,18,6,12,6,16],[3,18,6,3,9,13,13,9,16,9,6,16],[6,16,0,6,3,18,0,13,3],[6,16,12,6,3,18,8,13,3],[9,16,1,9,6,16,6,3,18],[0,6,16,3,18,6],[3,18,6,12,6,16],[9,16,8,9,6,16,6,3,18],[0,6,16,3,18,6],[3,18,6,12,6,16],[18,6,15,11,13,10,
11,16,13,11,6,16],[10,0,13,0,6,16,11,6,0,15,18,6],[10,8,13,11,6,9,12,6,16,15,18,6],[11,6,1,1,6,16,15,18,6],[0,6,16,0,11,6,6,15,18],[9,11,6,6,15,18,12,6,16],[8,6,16,11,6,8,15,18,6],[0,6,16,0,11,6,6,15,18],[9,11,6,6,15,18,12,6,16],[10,2,13,13,2,16,2,6,16,15,18,6],[6,16,0,6,15,18,0,13,10],[6,16,12,6,15,18,8,13,10],[2,6,16,2,16,1,6,15,18],[0,6,16,15,18,6],[15,18,6,12,6,16],[2,6,8,8,6,16,6,15,18],[0,6,16,15,18,6],[15,18,6,12,6,16],[10,9,13,13,9,16,9,6,16,15,18,6],[6,16,0,6,15,18,0,13,10],[6,16,12,6,15,
18,8,13,10],[9,16,1,9,6,16,6,15,18],[0,6,16,15,18,6],[15,18,6,12,6,16],[9,16,8,9,6,16,6,15,18],[0,6,16,15,18,6],[15,18,6,12,6,16],[4,13,6,18,6,13],[0,13,6,13,18,6],[9,8,13,9,13,18,9,18,6],[4,1,6,1,18,6],[1,18,6,1,6,0],[1,18,6,1,6,9],[4,8,6,8,10,6,10,18,6],[10,6,0,10,18,6],[10,6,9,10,18,6],[4,13,2,13,18,2,2,18,6],[2,18,6,2,13,18,2,0,13],[2,18,6,2,13,18,2,8,13],[2,4,1,2,18,6,2,1,18],[1,18,2,18,6,2],[1,18,2,18,6,2],[2,4,8,2,10,6,10,18,6],[10,6,2,18,6,10],[10,6,2,18,6,10],[4,13,9,9,13,11,11,18,6,13,18,
11],[11,0,13,11,13,18,11,18,6],[11,8,13,11,13,18,11,18,6],[9,4,1,11,1,18,11,18,6],[1,18,11,18,6,11],[1,18,11,18,6,11],[9,4,8,11,10,18,11,18,6],[10,18,11,18,6,11],[10,18,11,18,6,11],[4,3,6,4,13,3,3,18,6],[3,18,6,3,6,0,3,0,13],[3,18,6,3,6,9,3,8,13],[3,4,1,3,6,4,3,18,6],[0,3,6,18,6,3],[9,3,6,18,6,3],[3,6,8,3,18,6,8,6,4],[0,3,6,18,6,3],[9,3,6,18,6,3],[3,2,13,3,18,6,13,2,4],[0,13,3,18,6,3],[8,13,3,18,6,3],[2,4,1,18,6,3],[18,6,3],[18,6,3],[2,4,8,18,6,3],[18,6,3],[18,6,3],[3,9,13,3,18,6,9,4,13],[0,13,3,
18,6,3],[8,13,3,18,6,3],[9,4,1,18,6,3],[18,6,3],[18,6,3],[9,4,8,18,6,3],[18,6,3],[18,6,3],[4,11,6,4,10,11,4,13,10,15,18,6],[15,18,6,11,6,0,10,0,13],[15,18,6,11,6,9,10,8,13],[15,18,6,11,6,4,11,4,1],[0,11,6,18,6,15],[9,11,6,18,6,15],[11,6,8,8,6,4,15,18,6],[0,11,6,18,6,15],[9,11,6,18,6,15],[15,18,6,10,4,13,10,2,4],[0,13,10,18,6,15],[8,13,10,18,6,15],[2,4,1,18,6,15],[18,6,15],[18,6,15],[2,4,8,18,6,15],[18,6,15],[18,6,15],[10,9,13,9,4,13,15,18,6],[0,13,10,18,6,15],[8,13,10,18,6,15],[9,4,1,18,6,15],[18,
6,15],[18,6,15],[9,4,8,18,6,15],[18,6,15],[18,6,15],[13,6,12,18,6,13],[0,13,6,13,18,6],[9,8,13,9,13,18,9,18,6],[12,1,6,1,18,6],[1,18,6,1,6,0],[1,18,6,1,6,9],[8,10,6,12,8,6,10,18,6],[10,6,0,10,18,6],[10,6,9,10,18,6],[12,13,2,13,18,2,2,18,6],[2,18,6,2,13,18,2,0,13],[2,18,6,2,13,18,2,8,13],[2,18,6,2,1,18,2,12,1],[1,18,2,18,6,2],[1,18,2,18,6,2],[2,10,6,2,12,8,10,18,6],[10,6,2,18,6,10],[10,6,2,18,6,10],[12,13,9,13,18,11,9,13,11,11,18,6],[11,0,13,11,13,18,11,18,6],[11,8,13,11,13,18,11,18,6],[9,12,1,11,
1,18,11,18,6],[1,18,11,18,6,11],[1,18,11,18,6,11],[9,12,8,11,10,18,11,18,6],[10,18,11,18,6,11],[10,18,11,18,6,11],[12,3,6,12,13,3,3,18,6],[3,18,6,3,6,0,3,0,13],[3,18,6,3,6,9,3,8,13],[3,6,12,3,12,1,3,18,6],[0,3,6,18,6,3],[9,3,6,18,6,3],[3,6,8,3,18,6,8,6,12],[0,3,6,18,6,3],[9,3,6,18,6,3],[3,12,13,3,2,12,3,18,6],[0,13,3,18,6,3],[8,13,3,18,6,3],[2,12,1,18,6,3],[18,6,3],[18,6,3],[2,12,8,18,6,3],[18,6,3],[18,6,3],[3,9,13,3,18,6,9,12,13],[0,13,3,18,6,3],[8,13,3,18,6,3],[9,12,1,18,6,3],[18,6,3],[18,6,3],
[9,12,8,18,6,3],[18,6,3],[18,6,3],[12,11,6,12,10,11,12,13,10,15,18,6],[15,18,6,11,6,0,10,0,13],[15,18,6,11,6,9,10,8,13],[15,18,6,11,12,1,11,6,12],[0,11,6,18,6,15],[9,11,6,18,6,15],[11,6,12,11,12,8,15,18,6],[0,11,6,18,6,15],[9,11,6,18,6,15],[15,18,6,10,2,12,10,12,13],[0,13,10,18,6,15],[8,13,10,18,6,15],[2,12,1,18,6,15],[18,6,15],[18,6,15],[2,12,8,18,6,15],[18,6,15],[18,6,15],[10,12,13,10,9,12,15,18,6],[0,13,10,18,6,15],[8,13,10,18,6,15],[9,12,1,18,6,15],[18,6,15],[18,6,15],[9,12,8,18,6,15],[18,6,15],
[18,6,15],[14,17,19],[17,19,0,0,19,14],[14,9,8,19,14,8,19,8,17,17,8,12],[19,1,17,19,14,1,1,14,17],[1,19,14,1,17,19,1,0,17,1,14,0],[1,19,14,1,17,19,1,12,17,1,14,9],[19,14,10,19,10,13,19,13,17,17,13,8,17,8,14,14,8,10],[0,10,14,14,10,19,13,19,10,13,17,19,13,0,17],[10,14,9,10,19,14,13,19,10,13,17,19,13,12,17],[2,17,19],[2,0,19,0,17,19],[2,8,19,12,17,8,17,19,8],[2,17,1,2,1,19,1,17,19],[1,19,2,1,17,19,1,0,17],[1,19,2,1,17,19,1,12,17],[2,17,8,2,10,19,10,13,19,13,8,17,13,17,19],[13,0,17,13,17,19,13,19,10,
10,19,2],[13,12,17,13,17,19,13,19,10,10,19,2],[17,11,9,19,11,17],[0,19,11,0,17,19],[12,17,8,17,19,8,11,8,19],[11,1,19,1,17,19,1,9,17],[1,19,11,1,17,19,1,0,17],[1,19,11,1,17,19,1,12,17],[11,10,19,13,17,19,10,13,19,13,8,17,9,17,8],[13,0,17,13,17,19,13,19,10,10,19,11],[13,12,17,13,17,19,13,19,10,10,19,11],[19,3,17,3,14,17],[3,14,0,3,0,17,3,17,19],[3,8,19,3,14,9,12,17,8,19,8,17],[3,14,1,3,1,19,1,17,19,1,14,17],[1,19,3,1,17,19,1,0,17,0,3,14],[1,19,3,1,17,19,1,12,17,9,3,14],[3,14,8,3,13,19,13,17,19,13,
8,17,14,17,8],[13,0,17,13,17,19,13,19,3,0,3,14],[13,12,17,13,17,19,13,19,3,9,3,14],[3,17,19,3,2,17],[0,17,3,17,19,3],[8,19,3,8,17,19,12,17,8],[2,17,1,17,19,1,1,19,3],[1,19,3,1,17,19,1,0,17],[1,19,3,1,17,19,1,12,17],[2,17,8,8,17,13,17,19,13,13,19,3],[13,0,17,13,17,19,13,19,3],[13,12,17,13,17,19,13,19,3],[3,17,19,3,9,17],[0,17,3,17,19,3],[8,19,3,8,17,19,12,17,8],[9,17,1,17,19,1,1,19,3],[1,19,3,1,17,19,1,0,17],[1,19,3,1,17,19,1,12,17],[8,17,13,9,17,8,17,19,13,13,19,3],[13,0,17,13,17,19,13,19,3],[13,
12,17,13,17,19,13,19,3],[14,10,11,17,10,14,17,15,10,19,15,17],[11,14,0,0,17,10,15,10,17,15,17,19],[11,14,9,10,8,12,10,12,15,15,12,17,15,17,19],[15,1,19,19,1,17,1,14,17,1,11,14],[1,19,15,1,17,19,1,0,17,0,11,14],[1,19,15,1,17,19,1,12,17,9,11,14],[15,13,19,13,17,19,13,8,17,14,17,8,11,14,8],[13,0,17,13,17,19,13,19,15,0,11,14],[13,12,17,13,17,19,13,19,15,9,11,14],[2,17,10,15,17,19,15,10,17],[0,17,10,10,17,15,17,19,15],[8,12,10,12,15,10,12,17,15,17,19,15],[2,17,1,1,17,19,1,19,15],[1,19,15,1,17,19,1,0,17],
[1,19,15,1,17,19,1,12,17],[2,17,8,8,17,13,17,19,13,13,19,15],[13,0,17,13,17,19,13,19,15],[13,12,17,13,17,19,13,19,15],[15,17,19,15,10,17,10,9,17],[0,17,10,10,17,15,17,19,15],[8,12,10,12,15,10,12,17,15,17,19,15],[9,17,1,1,17,19,1,19,15],[1,19,15,1,17,19,1,0,17],[1,19,15,1,17,19,1,12,17],[8,17,13,9,17,8,17,19,13,13,19,15],[13,0,17,13,17,19,13,19,15],[13,12,17,13,17,19,13,19,15],[4,19,14],[4,19,0,0,19,14],[4,19,8,9,8,14,14,8,19],[4,1,14,4,19,1,1,19,14],[1,4,19,1,19,14,1,14,0],[1,4,19,1,19,14,1,14,9],
[4,8,14,4,19,13,13,19,10,10,14,8,10,19,14],[10,14,0,10,19,14,13,19,10,13,4,19],[10,14,9,10,19,14,13,19,10,13,4,19],[4,19,2],[2,0,19,0,4,19],[2,8,19,19,8,4],[2,4,1,2,1,19,1,4,19],[1,19,2,1,4,19],[1,19,2,1,4,19],[2,4,8,2,10,19,10,13,19,13,4,19],[10,19,2,13,19,10,13,4,19],[10,19,2,13,19,10,13,4,19],[4,19,11,4,11,9],[0,4,11,19,11,4],[19,8,4,11,8,19],[9,4,1,1,4,19,11,1,19],[1,19,11,1,4,19],[1,19,11,1,4,19],[9,4,8,10,13,19,11,10,19,13,4,19],[10,19,11,13,19,10,13,4,19],[10,19,11,13,19,10,13,4,19],[4,3,14,
4,19,3],[3,0,4,3,4,19,3,14,0],[3,8,4,3,4,19,3,14,9],[3,1,19,3,14,1,19,1,4,1,14,4],[1,19,3,1,4,19,0,3,14],[1,19,3,1,4,19,9,3,14],[3,13,19,3,14,8,13,4,19,14,4,8],[0,3,14,19,13,4,19,3,13],[9,3,14,19,13,4,19,3,13],[3,2,4,3,4,19],[0,4,3,19,3,4],[8,4,3,19,3,4],[2,4,1,1,4,19,1,19,3],[1,19,3,1,4,19],[1,19,3,1,4,19],[2,4,8,19,3,13,19,13,4],[3,13,19,13,4,19],[3,13,19,13,4,19],[3,9,4,3,4,19],[0,4,3,19,3,4],[8,4,3,19,3,4],[9,4,1,1,4,19,1,19,3],[1,19,3,1,4,19],[1,19,3,1,4,19],[9,4,8,19,3,13,19,13,4],[3,13,19,
13,4,19],[3,13,19,13,4,19],[4,11,14,4,10,11,4,15,10,4,19,15],[11,14,0,10,0,4,15,10,4,15,4,19],[11,14,9,10,8,4,15,10,4,15,4,19],[15,4,19,15,1,4,1,11,4,14,4,11],[1,4,15,0,11,14,19,15,4],[1,4,15,9,11,14,19,15,4],[15,13,19,13,4,19,14,4,8,11,14,8],[0,11,14,19,13,4,19,15,13],[9,11,14,19,13,4,19,15,13],[10,2,4,15,10,4,15,4,19],[0,4,10,10,4,15,19,15,4],[8,4,10,10,4,15,19,15,4],[2,4,1,1,4,15,19,15,4],[1,4,15,15,4,19],[1,4,15,15,4,19],[2,4,8,19,13,4,19,15,13],[15,13,19,13,4,19],[15,13,19,13,4,19],[10,9,4,15,
10,4,15,4,19],[0,4,10,10,4,15,19,15,4],[8,4,10,10,4,15,19,15,4],[9,4,1,1,4,15,19,15,4],[1,4,15,15,4,19],[1,4,15,15,4,19],[9,4,8,19,13,4,19,15,13],[15,13,19,13,4,19],[15,13,19,13,4,19],[14,12,16,19,14,16],[0,16,19,0,19,14],[9,8,14,14,8,19,16,19,8],[16,19,1,1,19,14,1,14,12],[1,16,19,1,19,14,1,14,0],[1,16,19,1,19,14,1,14,9],[16,19,13,10,19,14,13,19,10,10,14,8,12,8,14],[10,14,0,10,19,14,13,19,10,13,16,19],[10,14,9,10,19,14,13,19,10,13,16,19],[12,16,2,2,16,19],[2,16,19,2,0,16],[2,8,19,19,8,16],[2,1,19,
2,12,1,1,16,19],[1,19,2,1,16,19],[1,19,2,1,16,19],[2,10,19,2,12,8,10,13,19,13,16,19],[10,19,2,13,19,10,13,16,19],[10,19,2,13,19,10,13,16,19],[12,11,9,16,11,12,16,19,11],[0,16,11,19,11,16],[11,16,19,11,8,16],[9,12,1,1,16,19,11,1,19],[1,19,11,1,16,19],[1,19,11,1,16,19],[9,12,8,10,13,19,11,10,19,13,16,19],[10,19,11,13,19,10,13,16,19],[10,19,11,13,19,10,13,16,19],[16,3,12,16,19,3,3,14,12],[3,16,19,3,0,16,3,14,0],[3,16,19,3,8,16,3,14,9],[3,16,19,3,1,16,3,12,1,3,14,12],[1,16,3,0,3,14,19,3,16],[1,16,3,9,
3,14,19,3,16],[3,13,19,3,14,8,13,16,19,14,12,8],[0,3,14,19,13,16,19,3,13],[9,3,14,19,13,16,19,3,13],[3,16,19,3,12,16,3,2,12],[0,16,3,19,3,16],[8,16,3,19,3,16],[2,12,1,1,16,3,19,3,16],[1,16,3,3,16,19],[1,16,3,3,16,19],[2,12,8,19,3,13,19,13,16],[3,13,19,13,16,19],[3,13,19,13,16,19],[3,16,19,3,12,16,3,9,12],[0,16,3,19,3,16],[8,16,3,19,3,16],[9,12,1,1,16,3,19,3,16],[1,16,3,3,16,19],[1,16,3,3,16,19],[9,12,8,19,3,13,19,13,16],[3,13,19,13,16,19],[3,13,19,13,16,19],[16,10,12,16,15,10,16,19,15,12,10,11,12,
11,14],[11,14,0,15,16,19,15,10,16,10,0,16],[11,14,9,15,16,19,15,10,16,10,8,16],[15,1,16,15,16,19,1,11,12,14,12,11],[1,16,15,0,11,14,19,15,16],[1,16,15,9,11,14,19,15,16],[15,16,19,15,13,16,11,14,12,11,12,8],[0,11,14,16,15,13,19,15,16],[9,11,14,16,15,13,19,15,16],[15,16,19,15,10,16,10,12,16,10,2,12],[0,16,10,10,16,15,19,15,16],[8,16,10,10,16,15,19,15,16],[2,12,1,1,16,15,19,15,16],[1,16,15,15,16,19],[1,16,15,15,16,19],[2,12,8,16,15,13,19,15,16],[15,13,16,15,16,19],[15,13,16,15,16,19],[15,16,19,15,10,
16,10,12,16,10,9,12],[0,16,10,10,16,15,19,15,16],[8,16,10,10,16,15,19,15,16],[9,12,1,1,16,15,19,15,16],[1,16,15,15,16,19],[1,16,15,15,16,19],[9,12,8,16,15,13,19,15,16],[15,13,16,15,16,19],[15,13,16,15,16,19],[19,14,5,5,14,17],[5,19,14,5,14,0,5,0,17],[5,19,8,5,12,17,9,8,14,19,14,8],[5,1,17,5,19,1,1,19,14,1,14,17],[1,5,19,1,19,14,1,14,0,0,17,5],[1,5,19,1,19,14,1,14,9,12,17,5],[5,8,17,5,19,10,10,19,14,10,14,8,14,17,8],[10,14,0,10,19,14,10,5,19,0,17,5],[10,14,9,10,19,14,10,5,19,12,17,5],[5,2,17,5,19,
2],[2,0,5,2,5,19,0,17,5],[2,8,5,2,5,19,12,17,5],[2,1,19,2,17,1,19,1,5,1,17,5],[1,19,2,1,5,19,0,17,5],[1,19,2,1,5,19,12,17,5],[2,10,19,2,17,8,10,5,19,17,5,8],[0,17,5,19,10,5,19,2,10],[12,17,5,19,10,5,19,2,10],[5,9,17,5,11,9,5,19,11],[0,17,5,11,0,5,11,5,19],[11,8,5,11,5,19,12,17,5],[11,5,19,11,1,5,1,9,5,17,5,9],[1,5,11,0,17,5,19,11,5],[1,5,11,12,17,5,19,11,5],[11,10,19,10,5,19,17,5,8,9,17,8],[0,17,5,19,10,5,19,11,10],[12,17,5,19,10,5,19,11,10],[5,14,17,5,3,14,5,19,3],[3,0,5,3,5,19,3,14,0,0,17,5],[3,
8,5,3,5,19,3,14,9,12,17,5],[3,5,19,3,14,1,14,17,1,1,17,5],[0,17,5,0,3,14,19,3,5],[9,3,14,12,17,5,19,3,5],[3,5,19,3,14,8,8,17,5,14,17,8],[0,17,5,0,3,14,19,3,5],[9,3,14,12,17,5,19,3,5],[3,2,5,3,5,19,2,17,5],[19,3,5,0,5,3,17,5,0],[19,3,5,8,5,3,17,5,12],[2,17,1,17,5,1,19,3,5],[0,17,5,3,5,19],[3,5,19,12,17,5],[2,17,8,8,17,5,19,3,5],[0,17,5,3,5,19],[3,5,19,12,17,5],[3,9,5,3,5,19,9,17,5],[19,3,5,0,5,3,17,5,0],[19,3,5,8,5,3,17,5,12],[9,5,1,9,17,5,19,3,5],[0,17,5,3,5,19],[3,5,19,12,17,5],[8,17,5,9,17,8,19,
3,5],[0,17,5,3,5,19],[3,5,19,12,17,5],[5,10,17,5,19,15,11,14,10,17,10,14],[10,0,5,0,17,5,11,14,0,15,5,19],[10,8,5,11,14,9,12,17,5,15,5,19],[11,14,1,14,17,1,1,17,5,15,5,19],[0,17,5,0,11,14,19,15,5],[9,11,14,12,17,5,19,15,5],[8,17,5,14,17,8,11,14,8,15,5,19],[0,17,5,0,11,14,19,15,5],[9,11,14,12,17,5,19,15,5],[10,2,5,2,17,5,15,5,19],[19,15,5,0,5,10,17,5,0],[19,15,5,17,5,12,8,5,10],[2,17,1,17,5,1,19,15,5],[0,17,5,15,5,19],[15,5,19,12,17,5],[2,17,8,8,17,5,19,15,5],[0,17,5,15,5,19],[15,5,19,12,17,5],[10,
9,5,9,17,5,15,5,19],[19,15,5,0,5,10,17,5,0],[19,15,5,17,5,12,8,5,10],[9,5,1,9,17,5,19,15,5],[0,17,5,15,5,19],[15,5,19,12,17,5],[8,17,5,9,17,8,19,15,5],[0,17,5,15,5,19],[15,5,19,12,17,5],[5,19,14,5,14,4],[0,5,14,14,5,19],[8,5,19,8,19,14,9,8,14],[4,1,14,14,1,19,1,5,19],[1,5,19,1,19,14,1,14,0],[1,5,19,1,19,14,1,14,9],[4,8,14,8,10,14,14,10,19,10,5,19],[10,14,0,10,19,14,10,5,19],[10,14,9,10,19,14,10,5,19],[4,5,2,2,5,19],[2,5,19,2,0,5],[2,5,19,2,8,5],[2,4,1,2,1,19,19,1,5],[1,19,2,1,5,19],[1,19,2,1,5,19],
[2,4,8,2,10,19,10,5,19],[10,19,2,5,19,10],[10,19,2,5,19,10],[4,5,9,9,5,11,11,5,19],[11,0,5,11,5,19],[11,8,5,11,5,19],[9,4,1,11,1,5,11,5,19],[1,5,11,5,19,11],[1,5,11,5,19,11],[9,4,8,10,5,19,11,10,19],[10,19,11,5,19,10],[10,19,11,5,19,10],[4,5,3,4,3,14,3,5,19],[3,14,0,3,0,5,3,5,19],[3,14,9,3,8,5,3,5,19],[3,14,1,3,5,19,14,4,1],[0,3,14,5,19,3],[9,3,14,5,19,3],[3,14,8,3,5,19,8,14,4],[0,3,14,5,19,3],[9,3,14,5,19,3],[3,2,4,3,4,5,3,5,19],[0,5,3,5,19,3],[8,5,3,5,19,3],[2,4,1,5,19,3],[5,19,3],[5,19,3],[2,4,
8,5,19,3],[5,19,3],[5,19,3],[3,9,5,3,5,19,9,4,5],[0,5,3,5,19,3],[8,5,3,5,19,3],[9,4,1,5,19,3],[5,19,3],[5,19,3],[9,4,8,5,19,3],[5,19,3],[5,19,3],[4,5,10,4,11,14,4,10,11,15,5,19],[15,5,19,11,14,0,10,0,5],[15,5,19,11,14,9,10,8,5],[15,5,19,11,14,4,11,4,1],[0,11,14,5,19,15],[9,11,14,5,19,15],[11,14,8,8,14,4,15,5,19],[0,11,14,5,19,15],[9,11,14,5,19,15],[15,5,19,10,4,5,10,2,4],[0,5,10,5,19,15],[8,5,10,5,19,15],[2,4,1,5,19,15],[5,19,15],[5,19,15],[2,4,8,5,19,15],[5,19,15],[5,19,15],[10,9,5,9,4,5,15,5,19],
[0,5,10,5,19,15],[8,5,10,5,19,15],[9,4,1,5,19,15],[5,19,15],[5,19,15],[9,4,8,5,19,15],[5,19,15],[5,19,15],[5,19,14,5,14,12],[0,5,14,14,5,19],[8,5,19,8,19,14,9,8,14],[12,1,14,14,1,19,1,5,19],[1,5,19,1,19,14,1,14,0],[1,5,19,1,19,14,1,14,9],[8,10,14,12,8,14,14,10,19,10,5,19],[10,14,0,10,19,14,10,5,19],[10,14,9,10,19,14,10,5,19],[12,5,2,2,5,19],[2,5,19,2,0,5],[2,5,19,2,8,5],[2,1,19,2,12,1,19,1,5],[1,19,2,1,5,19],[1,19,2,1,5,19],[2,10,19,2,12,8,10,5,19],[10,19,2,5,19,10],[10,19,2,5,19,10],[12,5,9,9,5,
11,11,5,19],[11,0,5,11,5,19],[11,8,5,11,5,19],[9,12,1,11,1,5,11,5,19],[1,5,11,5,19,11],[1,5,11,5,19,11],[9,12,8,10,5,19,11,10,19],[10,19,11,5,19,10],[10,19,11,5,19,10],[12,3,14,12,5,3,3,5,19],[3,14,0,3,0,5,3,5,19],[3,14,9,3,8,5,3,5,19],[3,14,12,3,12,1,3,5,19],[0,3,14,5,19,3],[9,3,14,5,19,3],[3,14,8,3,5,19,8,14,12],[0,3,14,5,19,3],[9,3,14,5,19,3],[3,12,5,3,2,12,3,5,19],[0,5,3,5,19,3],[8,5,3,5,19,3],[2,12,1,5,19,3],[5,19,3],[5,19,3],[2,12,8,5,19,3],[5,19,3],[5,19,3],[3,9,5,3,5,19,9,12,5],[0,5,3,5,19,
3],[8,5,3,5,19,3],[9,12,1,5,19,3],[5,19,3],[5,19,3],[9,12,8,5,19,3],[5,19,3],[5,19,3],[12,11,14,12,10,11,12,5,10,15,5,19],[15,5,19,11,14,0,10,0,5],[15,5,19,11,14,9,10,8,5],[15,5,19,11,12,1,11,14,12],[0,11,14,5,19,15],[9,11,14,5,19,15],[11,14,12,11,12,8,15,5,19],[0,11,14,5,19,15],[9,11,14,5,19,15],[15,5,19,10,2,12,10,12,5],[0,5,10,5,19,15],[8,5,10,5,19,15],[2,12,1,5,19,15],[5,19,15],[5,19,15],[2,12,8,5,19,15],[5,19,15],[5,19,15],[10,12,5,10,9,12,15,5,19],[0,5,10,5,19,15],[8,5,10,5,19,15],[9,12,1,5,
19,15],[5,19,15],[5,19,15],[9,12,8,5,19,15],[5,19,15],[5,19,15],[19,14,18,18,14,13,14,16,13,17,16,14],[16,0,17,0,13,14,14,13,18,14,18,19],[16,12,17,9,8,13,9,13,14,14,18,19,14,13,18],[1,18,19,1,19,14,1,14,17,1,17,16],[1,18,19,1,19,14,1,14,0,0,17,16],[1,18,19,1,19,14,1,14,9,12,17,16],[18,19,10,10,19,14,10,14,8,14,17,8,16,8,17],[10,14,0,10,19,14,10,18,19,0,17,16],[10,14,9,10,19,14,10,18,19,12,17,16],[18,2,13,18,19,2,2,17,16,13,2,16],[2,18,19,2,13,18,2,0,13,0,17,16],[2,18,19,2,13,18,2,8,13,12,17,16],
[2,18,19,2,1,18,2,16,1,2,17,16],[1,18,2,0,17,16,19,2,18],[1,18,2,12,17,16,19,2,18],[2,10,19,2,17,8,10,18,19,17,16,8],[0,17,16,19,10,18,19,2,10],[12,17,16,19,10,18,19,2,10],[18,11,13,18,19,11,13,11,9,16,13,9,16,9,17],[0,17,16,11,18,19,11,13,18,11,0,13],[11,18,19,11,13,18,11,8,13,12,17,16],[11,1,18,11,18,19,1,9,16,17,16,9],[1,18,11,0,17,16,19,11,18],[1,18,11,12,17,16,19,11,18],[11,18,19,11,10,18,9,17,16,9,16,8],[0,17,16,18,11,10,19,11,18],[12,17,16,18,11,10,19,11,18],[18,19,3,3,14,13,14,16,13,14,17,
16],[3,18,19,3,14,0,3,0,13,0,17,16],[3,18,19,3,14,9,3,8,13,12,17,16],[3,18,19,3,14,1,14,17,1,17,16,1],[0,17,16,0,3,14,19,3,18],[9,3,14,12,17,16,19,3,18],[3,18,19,3,14,8,8,17,16,14,17,8],[0,17,16,0,3,14,19,3,18],[9,3,14,12,17,16,19,3,18],[3,18,19,3,2,13,13,2,16,2,17,16],[19,3,18,0,13,3,17,16,0],[19,3,18,8,13,3,17,16,12],[2,17,16,2,16,1,19,3,18],[0,17,16,3,18,19],[3,18,19,12,17,16],[2,17,8,8,17,16,19,3,18],[0,17,16,3,18,19],[3,18,19,12,17,16],[3,18,19,3,9,13,13,9,16,9,17,16],[19,3,18,0,13,3,17,16,0],
[19,3,18,8,13,3,17,16,12],[9,16,1,9,17,16,19,3,18],[0,17,16,3,18,19],[3,18,19,12,17,16],[9,16,8,9,17,16,19,3,18],[0,17,16,3,18,19],[3,18,19,12,17,16],[18,19,15,11,13,10,11,14,13,14,17,16,14,16,13],[10,0,13,0,17,16,11,14,0,15,18,19],[10,8,13,11,14,9,12,17,16,15,18,19],[11,14,1,14,17,1,17,16,1,15,18,19],[0,17,16,0,11,14,19,15,18],[9,11,14,12,17,16,19,15,18],[8,17,16,14,17,8,11,14,8,15,18,19],[0,17,16,0,11,14,19,15,18],[9,11,14,12,17,16,19,15,18],[10,2,13,13,2,16,2,17,16,15,18,19],[19,15,18,0,13,10,
17,16,0],[19,15,18,17,16,12,8,13,10],[2,17,16,2,16,1,19,15,18],[0,17,16,15,18,19],[15,18,19,12,17,16],[2,17,8,8,17,16,19,15,18],[0,17,16,15,18,19],[15,18,19,12,17,16],[10,9,13,13,9,16,9,17,16,15,18,19],[19,15,18,0,13,10,17,16,0],[19,15,18,17,16,12,8,13,10],[9,16,1,9,17,16,19,15,18],[0,17,16,15,18,19],[15,18,19,12,17,16],[9,16,8,9,17,16,19,15,18],[0,17,16,15,18,19],[15,18,19,12,17,16],[4,13,14,14,18,19,14,13,18],[0,13,14,14,13,18,14,18,19],[9,8,13,9,13,14,14,18,19,14,13,18],[4,1,14,14,1,19,19,1,18],
[1,18,19,1,19,14,1,14,0],[1,18,19,1,19,14,1,14,9],[4,8,14,8,10,14,14,10,19,10,18,19],[10,14,0,10,19,14,10,18,19],[10,14,9,10,19,14,10,18,19],[4,13,2,13,18,2,2,18,19],[2,18,19,2,13,18,2,0,13],[2,18,19,2,13,18,2,8,13],[2,4,1,2,18,19,2,1,18],[1,18,2,18,19,2],[1,18,2,18,19,2],[2,4,8,2,10,19,10,18,19],[10,19,2,18,19,10],[10,19,2,18,19,10],[4,13,9,9,13,11,11,18,19,13,18,11],[11,0,13,11,13,18,11,18,19],[11,8,13,11,13,18,11,18,19],[9,4,1,11,1,18,11,18,19],[1,18,11,18,19,11],[1,18,11,18,19,11],[9,4,8,11,10,
18,11,18,19],[10,18,11,18,19,11],[10,18,11,18,19,11],[4,3,14,4,13,3,3,18,19],[3,14,0,3,0,13,3,18,19],[3,14,9,3,8,13,3,18,19],[3,14,1,3,18,19,14,4,1],[0,3,14,18,19,3],[9,3,14,18,19,3],[3,14,8,3,18,19,8,14,4],[0,3,14,18,19,3],[9,3,14,18,19,3],[3,2,13,3,18,19,13,2,4],[0,13,3,18,19,3],[8,13,3,18,19,3],[2,4,1,18,19,3],[18,19,3],[18,19,3],[2,4,8,18,19,3],[18,19,3],[18,19,3],[3,9,13,3,18,19,9,4,13],[0,13,3,18,19,3],[8,13,3,18,19,3],[9,4,1,18,19,3],[18,19,3],[18,19,3],[9,4,8,18,19,3],[18,19,3],[18,19,3],
[4,11,14,4,10,11,4,13,10,15,18,19],[15,18,19,11,14,0,10,0,13],[15,18,19,11,14,9,10,8,13],[15,18,19,11,14,4,11,4,1],[0,11,14,18,19,15],[9,11,14,18,19,15],[11,14,8,8,14,4,15,18,19],[0,11,14,18,19,15],[9,11,14,18,19,15],[15,18,19,10,4,13,10,2,4],[0,13,10,18,19,15],[8,13,10,18,19,15],[2,4,1,18,19,15],[18,19,15],[18,19,15],[2,4,8,18,19,15],[18,19,15],[18,19,15],[10,9,13,9,4,13,15,18,19],[0,13,10,18,19,15],[8,13,10,18,19,15],[9,4,1,18,19,15],[18,19,15],[18,19,15],[9,4,8,18,19,15],[18,19,15],[18,19,15],
[18,19,14,13,18,14,13,14,12],[0,13,14,14,13,18,14,18,19],[9,8,13,9,13,14,14,18,19,14,13,18],[12,1,14,14,1,19,19,1,18],[1,18,19,1,19,14,1,14,0],[1,18,19,1,19,14,1,14,9],[8,10,14,12,8,14,14,10,19,10,18,19],[10,14,0,10,19,14,10,18,19],[10,14,9,10,19,14,10,18,19],[12,13,2,13,18,2,2,18,19],[2,18,19,2,13,18,2,0,13],[2,18,19,2,13,18,2,8,13],[2,18,19,2,1,18,2,12,1],[1,18,2,18,19,2],[1,18,2,18,19,2],[2,10,19,2,12,8,10,18,19],[10,19,2,18,19,10],[10,19,2,18,19,10],[12,13,9,13,18,11,9,13,11,11,18,19],[11,0,13,
11,13,18,11,18,19],[11,8,13,11,13,18,11,18,19],[9,12,1,11,1,18,11,18,19],[1,18,11,18,19,11],[1,18,11,18,19,11],[9,12,8,11,10,18,11,18,19],[10,18,11,18,19,11],[10,18,11,18,19,11],[12,3,14,12,13,3,3,18,19],[3,14,0,3,0,13,3,18,19],[3,14,9,3,8,13,3,18,19],[3,14,12,3,12,1,3,18,19],[0,3,14,18,19,3],[9,3,14,18,19,3],[3,14,8,3,18,19,8,14,12],[0,3,14,18,19,3],[9,3,14,18,19,3],[3,12,13,3,2,12,3,18,19],[0,13,3,18,19,3],[8,13,3,18,19,3],[2,12,1,18,19,3],[18,19,3],[18,19,3],[2,12,8,18,19,3],[18,19,3],[18,19,3],
[3,9,13,3,18,19,9,12,13],[0,13,3,18,19,3],[8,13,3,18,19,3],[9,12,1,18,19,3],[18,19,3],[18,19,3],[9,12,8,18,19,3],[18,19,3],[18,19,3],[12,11,14,12,10,11,12,13,10,15,18,19],[15,18,19,11,14,0,10,0,13],[15,18,19,11,14,9,10,8,13],[15,18,19,11,12,1,11,14,12],[0,11,14,18,19,15],[9,11,14,18,19,15],[11,14,12,11,12,8,15,18,19],[0,11,14,18,19,15],[9,11,14,18,19,15],[15,18,19,10,2,12,10,12,13],[0,13,10,18,19,15],[8,13,10,18,19,15],[2,12,1,18,19,15],[18,19,15],[18,19,15],[2,12,8,18,19,15],[18,19,15],[18,19,15],
[10,12,13,10,9,12,15,18,19],[0,13,10,18,19,15],[8,13,10,18,19,15],[9,12,1,18,19,15],[18,19,15],[18,19,15],[9,12,8,18,19,15],[18,19,15],[18,19,15],[],[],[7,8,12,7,9,8,7,12,9],[],[],[1,12,7,1,7,9,12,9,7],[7,13,8,7,8,10],[13,0,7,0,10,7],[13,12,7,12,9,7,10,7,9],[],[],[2,7,12,2,8,7,12,7,8],[],[1,7,2,1,0,7,0,2,7],[1,7,2,1,12,7,12,2,7],[2,10,7,2,7,8,13,8,7],[13,0,7,0,2,7,10,7,2],[12,2,7,13,12,7,10,7,2],[7,9,14,7,11,9],[14,7,0,0,7,11],[14,7,12,12,7,8,11,8,7],[11,1,7,1,9,7,14,7,9],[1,7,11,1,0,7,0,14,7],[1,
7,11,1,12,7,12,14,7],[11,10,7,9,13,8,9,14,13,14,7,13],[13,0,7,0,14,7,10,7,11],[12,14,7,13,12,7,10,7,11],[],[],[3,7,9,3,8,7,9,7,12,12,7,8],[3,7,1],[1,0,7,0,3,7],[1,12,7,9,3,7,12,9,7],[3,7,8,13,8,7],[13,0,7,0,3,7],[9,3,7,12,9,7,13,12,7],[3,2,7],[2,7,0,0,7,3],[2,7,12,8,7,3,12,7,8],[2,7,1],[1,0,7,0,2,7],[1,12,7,12,2,7],[2,7,8,8,7,13],[13,0,7,0,2,7],[12,2,7,13,12,7],[3,9,7,14,7,9],[14,7,0,0,7,3],[8,7,3,12,7,8,14,7,12],[9,7,1,14,7,9],[1,0,7,0,14,7],[1,12,7,12,14,7],[9,13,8,9,14,13,14,7,13],[13,0,7,0,14,
7],[12,14,7,13,12,7],[7,10,11],[11,7,0,0,7,10],[11,7,9,9,7,12,12,7,8,10,8,7],[1,11,7],[1,0,7,0,11,7],[1,12,7,9,11,7,12,9,7],[13,8,7,11,7,8],[13,0,7,0,11,7],[9,11,7,12,9,7,13,12,7],[2,7,10],[2,7,0,0,7,10],[2,7,12,8,7,10,12,7,8],[2,7,1],[1,0,7,0,2,7],[1,12,7,12,2,7],[2,7,8,8,7,13],[13,0,7,0,2,7],[12,2,7,13,12,7],[14,7,9,10,9,7],[14,7,0,0,7,10],[8,7,10,12,7,8,14,7,12],[9,7,1,14,7,9],[1,0,7,0,14,7],[1,12,7,12,14,7],[9,13,8,9,14,13,14,7,13],[13,0,7,0,14,7],[12,14,7,13,12,7],[],[],[4,9,7,4,7,8,9,8,7],[],
[1,4,7,1,7,0,0,7,4],[1,4,7,1,7,9,9,7,4],[4,7,13,4,8,7,10,7,8],[10,7,0,0,7,4,13,4,7],[9,7,4,10,7,9,13,4,7],[],[2,7,4,2,0,7,0,4,7],[2,7,4,2,8,7,8,4,7],[2,4,1,2,7,4,2,1,7,1,4,7],[1,7,2,1,4,7,7,4,2],[1,7,2,1,4,7,7,4,2],[2,4,8,2,7,4,2,10,7,13,4,7],[7,4,2,10,7,2,13,4,7],[7,4,2,10,7,2,13,4,7],[4,14,7,4,7,9,11,9,7],[11,0,7,0,4,7,14,7,4],[8,4,7,11,8,7,14,7,4],[9,4,1,1,4,7,11,1,7,14,7,4],[1,7,11,1,4,7,7,4,14],[1,7,11,1,4,7,7,4,14],[9,4,8,11,10,7,13,4,7,14,7,4],[10,7,11,7,4,14,13,4,7],[10,7,11,7,4,14,13,4,7],
[],[],[3,7,9,3,8,7,7,8,4,9,7,4],[3,4,1,3,7,4,1,4,7],[1,4,7,0,3,4,7,4,3],[1,4,7,7,9,3,7,4,9],[3,4,8,3,7,4,13,4,7],[0,3,4,7,4,3,13,4,7],[7,9,3,7,4,9,13,4,7],[3,2,4,3,4,7,2,7,4],[2,7,4,0,4,3,7,3,4],[2,7,4,7,3,8,7,8,4],[2,7,4,2,4,1,1,4,7],[1,4,7,7,4,2],[1,4,7,7,4,2],[2,7,4,2,4,8,13,4,7],[7,4,2,13,4,7],[7,4,2,13,4,7],[3,9,4,3,4,7,14,7,4],[0,4,3,7,3,4,14,7,4],[7,3,8,7,8,4,14,7,4],[9,4,1,1,4,7,14,7,4],[1,4,7,7,4,14],[1,4,7,7,4,14],[9,4,8,13,4,7,14,7,4],[7,4,14,13,4,7],[7,4,14,13,4,7],[4,11,7,4,7,10,4,10,
11],[7,10,4,11,7,4,11,4,0,0,4,10],[11,7,9,9,7,4,7,8,4,10,8,7],[1,4,7,11,4,1,11,7,4],[1,4,7,0,11,4,7,4,11],[1,4,7,7,9,11,7,4,9],[11,4,8,11,7,4,13,4,7],[0,11,4,7,4,11,13,4,7],[7,9,11,7,4,9,13,4,7],[2,7,4,10,2,4,10,4,7],[2,7,4,0,4,10,7,10,4],[2,7,4,7,10,8,7,8,4],[2,7,4,2,4,1,1,4,7],[1,4,7,7,4,2],[1,4,7,7,4,2],[2,7,4,2,4,8,13,4,7],[7,4,2,13,4,7],[7,4,2,13,4,7],[10,9,4,10,4,7,14,7,4],[0,4,10,7,10,4,14,7,4],[7,10,8,7,8,4,14,7,4],[9,4,1,1,4,7,14,7,4],[1,4,7,7,4,14],[1,4,7,7,4,14],[9,4,8,13,4,7,14,7,4],[7,
4,14,13,4,7],[7,4,14,13,4,7],[7,17,12,7,12,16],[17,0,7,0,16,7],[17,9,7,9,8,7,16,7,8],[16,7,1,1,7,12,17,12,7],[1,16,7,1,7,0,0,7,17],[1,16,7,1,7,9,9,7,17],[16,7,13,10,12,8,10,17,12,10,7,17],[10,7,0,0,7,17,13,16,7],[9,7,17,10,7,9,13,16,7],[17,2,7,2,12,7,16,7,12],[2,7,17,2,0,7,0,16,7],[2,7,17,2,8,7,8,16,7],[2,7,17,2,1,7,2,12,1,1,16,7],[1,7,2,1,16,7,7,17,2],[1,7,2,1,16,7,7,17,2],[2,7,17,2,10,7,2,12,8,13,16,7],[7,17,2,10,7,2,13,16,7],[7,17,2,10,7,2,13,16,7],[17,14,7,11,9,12,11,12,16,11,16,7],[11,0,7,0,
16,7,14,7,17],[8,16,7,11,8,7,14,7,17],[9,12,1,1,16,7,11,1,7,14,7,17],[1,7,11,1,16,7,7,17,14],[1,7,11,1,16,7,7,17,14],[9,12,8,11,10,7,13,16,7,14,7,17],[10,7,11,7,17,14,13,16,7],[10,7,11,7,17,14,13,16,7],[17,12,3,17,3,7,3,16,7,12,16,3],[3,7,17,3,17,0,3,0,16,3,16,7],[3,7,9,3,8,7,7,8,16,9,7,17],[3,7,17,3,17,12,3,12,1,1,16,7],[1,16,7,0,3,17,7,17,3],[1,16,7,7,9,3,7,17,9],[3,7,17,3,17,12,3,12,8,13,16,7],[0,3,17,7,17,3,13,16,7],[7,9,3,7,17,9,13,16,7],[3,16,7,3,12,16,3,2,12,2,7,17],[2,7,17,0,16,3,7,3,16],
[2,7,17,7,3,8,7,8,16],[2,7,17,2,12,1,1,16,7],[1,16,7,7,17,2],[1,16,7,7,17,2],[2,7,17,2,12,8,13,16,7],[7,17,2,13,16,7],[7,17,2,13,16,7],[3,16,7,3,12,16,3,9,12,14,7,17],[0,16,3,7,3,16,14,7,17],[7,3,8,7,8,16,14,7,17],[9,12,1,1,16,7,14,7,17],[1,16,7,7,17,14],[1,16,7,7,17,14],[9,12,8,13,16,7,14,7,17],[7,17,14,13,16,7],[7,17,14,13,16,7],[17,12,11,17,11,7,12,10,11,16,10,12,16,7,10],[7,10,16,11,17,0,11,7,17,0,16,10],[11,7,17,11,17,9,10,16,7,10,8,16],[1,16,7,11,7,17,11,17,12,11,12,1],[1,16,7,0,11,17,7,17,
11],[1,16,7,7,17,11,17,9,11],[11,7,17,11,17,12,11,12,8,13,16,7],[0,11,17,7,17,11,13,16,7],[7,17,11,13,16,7,17,9,11],[2,7,17,10,16,7,10,12,16,10,2,12],[2,7,17,0,16,10,7,10,16],[2,7,17,7,10,16,16,10,8],[2,7,17,2,12,1,1,16,7],[1,16,7,7,17,2],[1,16,7,7,17,2],[2,7,17,2,12,8,13,16,7],[7,17,2,13,16,7],[7,17,2,13,16,7],[10,16,7,10,12,16,10,9,12,14,7,17],[0,16,10,7,10,16,14,7,17],[7,10,16,14,7,17,16,10,8],[9,12,1,1,16,7,14,7,17],[1,16,7,7,17,14],[1,16,7,7,17,14],[9,12,8,13,16,7,14,7,17],[7,17,14,13,16,7],
[7,17,14,13,16,7],[],[],[5,12,7,5,7,8,9,8,7,12,9,7],[5,1,7],[1,7,0,0,7,5],[1,7,9,9,7,12,12,7,5],[5,8,7,10,7,8],[10,7,0,0,7,5],[9,7,12,10,7,9,12,7,5],[],[],[2,7,12,2,8,7,7,8,5,12,7,5],[2,5,1,2,7,5,2,1,7],[1,7,2,0,2,5,7,5,2],[1,7,2,7,12,2,7,5,12],[2,5,8,2,7,5,2,10,7],[0,2,5,7,5,2,10,7,2],[7,12,2,10,7,2,7,5,12],[5,14,7,5,7,11,5,11,9,5,9,14],[7,11,5,14,7,5,14,5,0,0,5,11],[14,7,12,12,7,5,7,8,5,11,8,7],[11,1,7,9,5,1,14,5,9,14,7,5],[1,7,11,0,14,5,7,5,14],[1,7,11,7,12,14,7,5,12],[11,10,7,9,5,8,14,5,9,14,
7,5],[0,14,5,10,7,11,7,5,14],[10,7,11,7,12,14,7,5,12],[5,3,7],[3,0,5,3,7,0,0,7,5],[3,8,5,3,7,9,9,7,12,12,7,5],[3,5,1,3,7,5],[0,7,5,0,3,7],[9,3,7,12,9,7,12,7,5],[3,7,8,7,5,8],[0,7,5,0,3,7],[9,3,7,12,9,7,12,7,5],[3,2,5,2,7,5],[2,7,5,2,5,0,0,5,3],[2,7,12,12,7,5,8,5,3],[2,7,5,2,5,1],[0,2,5,7,5,2],[7,12,2,7,5,12],[2,7,5,2,5,8],[0,2,5,7,5,2],[7,12,2,7,5,12],[3,9,5,9,14,5,14,7,5],[14,5,0,14,7,5,0,5,3],[12,7,5,14,7,12,8,5,3],[9,5,1,14,5,9,14,7,5],[0,14,5,7,5,14],[7,5,12,7,12,14],[9,5,8,14,5,9,14,7,5],[0,
14,5,7,5,14],[7,5,12,7,12,14],[5,11,7,5,10,11],[10,0,5,0,7,5,11,7,0],[10,8,5,9,7,12,11,7,9,12,7,5],[1,11,5,7,5,11],[0,7,5,0,11,7],[9,11,7,12,9,7,12,7,5],[7,5,8,11,7,8],[0,7,5,0,11,7],[9,11,7,12,9,7,12,7,5],[10,2,5,2,7,5],[2,7,5,2,5,0,0,5,10],[2,7,12,12,7,5,8,5,10],[2,7,5,2,5,1],[0,2,5,7,5,2],[7,12,2,7,5,12],[2,7,5,2,5,8],[0,2,5,7,5,2],[7,12,2,7,5,12],[10,9,5,9,14,5,14,7,5],[14,5,0,14,7,5,0,5,10],[12,7,5,14,7,12,8,5,10],[9,5,1,14,5,9,14,7,5],[0,14,5,7,5,14],[7,5,12,7,12,14],[9,5,8,14,5,9,14,7,5],[0,
14,5,7,5,14],[7,5,12,7,12,14],[5,7,4],[4,0,7,0,5,7],[4,9,7,8,5,7,9,8,7],[4,1,7],[1,7,0,0,7,4],[1,7,9,9,7,4],[4,8,7,8,10,7],[10,7,0,0,7,4],[9,7,4,10,7,9],[4,5,2,4,2,7,2,5,7],[2,7,4,2,5,7,2,0,5],[2,7,4,2,8,7,8,5,7],[2,4,1,2,7,4,2,1,7],[1,7,2,7,4,2],[1,7,2,7,4,2],[2,4,8,2,7,4,2,10,7],[7,4,2,10,7,2],[7,4,2,10,7,2],[4,5,9,4,14,7,9,5,11,11,5,7],[11,0,5,11,5,7,14,7,4],[8,5,7,11,8,7,14,7,4],[9,4,1,11,1,7,14,7,4],[1,7,11,7,4,14],[1,7,11,7,4,14],[9,4,8,11,10,7,14,7,4],[10,7,11,7,4,14],[10,7,11,7,4,14],[4,5,
3,4,3,7],[3,4,0,3,7,4,3,0,5],[3,7,9,3,8,5,9,7,4],[3,4,1,3,7,4],[0,3,4,7,4,3],[7,9,3,7,4,9],[3,4,8,3,7,4],[0,3,4,7,4,3],[7,9,3,7,4,9],[3,2,4,3,4,5,2,7,4],[2,7,4,0,5,3],[2,7,4,8,5,3],[2,7,4,2,4,1],[7,4,2],[7,4,2],[2,7,4,2,4,8],[7,4,2],[7,4,2],[3,9,5,9,4,5,14,7,4],[0,5,3,14,7,4],[8,5,3,14,7,4],[9,4,1,14,7,4],[7,4,14],[7,4,14],[9,4,8,14,7,4],[7,4,14],[7,4,14],[4,5,10,4,11,7,4,10,11],[11,7,4,11,4,0,10,0,5],[11,7,9,9,7,4,10,8,5],[11,7,4,11,4,1],[0,11,4,7,4,11],[7,4,9,7,9,11],[11,7,4,11,4,8],[0,11,4,7,4,
11],[7,4,9,7,9,11],[10,4,5,10,2,4,2,7,4],[2,7,4,0,5,10],[2,7,4,8,5,10],[2,7,4,2,4,1],[7,4,2],[7,4,2],[2,7,4,2,4,8],[7,4,2],[7,4,2],[10,9,5,9,4,5,14,7,4],[0,5,10,14,7,4],[8,5,10,14,7,4],[9,4,1,14,7,4],[7,4,14],[7,4,14],[9,4,8,14,7,4],[7,4,14],[7,4,14],[5,7,12,17,12,7],[17,0,7,0,5,7],[8,5,7,9,8,7,17,9,7],[12,1,7,17,12,7],[1,7,0,0,7,17],[1,7,9,9,7,17],[8,10,12,12,10,17,17,10,7],[10,7,0,0,7,17],[9,7,17,10,7,9],[12,5,2,2,5,7,17,2,7],[2,7,17,2,5,7,2,0,5],[2,7,17,2,8,7,8,5,7],[2,7,17,2,1,7,2,12,1],[1,7,
2,7,17,2],[1,7,2,7,17,2],[2,7,17,2,10,7,2,12,8],[7,17,2,10,7,2],[7,17,2,10,7,2],[12,5,9,9,5,11,17,14,7,11,5,7],[11,0,5,11,5,7,14,7,17],[8,5,7,11,8,7,14,7,17],[9,12,1,11,1,7,14,7,17],[1,7,11,7,17,14],[1,7,11,7,17,14],[9,12,8,11,10,7,14,7,17],[10,7,11,7,17,14],[10,7,11,7,17,14],[17,12,3,17,3,7,12,5,3],[3,7,17,3,17,0,3,0,5],[3,7,9,3,8,5,9,7,17],[3,7,17,3,17,12,3,12,1],[0,3,17,7,17,3],[7,9,3,7,17,9],[3,7,17,3,17,12,3,12,8],[0,3,17,7,17,3],[7,9,3,7,17,9],[3,12,5,3,2,12,2,7,17],[2,7,17,0,5,3],[2,7,17,8,
5,3],[2,7,17,2,12,1],[7,17,2],[7,17,2],[2,7,17,2,12,8],[7,17,2],[7,17,2],[3,9,5,14,7,17,9,12,5],[0,5,3,14,7,17],[8,5,3,14,7,17],[9,12,1,14,7,17],[7,17,14],[7,17,14],[9,12,8,14,7,17],[7,17,14],[7,17,14],[17,12,11,17,11,7,12,10,11,12,5,10],[11,17,0,11,7,17,10,0,5],[11,7,17,11,17,9,10,8,5],[11,17,12,11,7,17,11,12,1],[0,11,17,7,17,11],[7,17,11,17,9,11],[11,17,12,11,7,17,11,12,8],[0,11,17,7,17,11],[7,17,11,17,9,11],[10,2,12,10,12,5,2,7,17],[2,7,17,0,5,10],[2,7,17,8,5,10],[2,7,17,2,12,1],[7,17,2],[7,17,
2],[2,7,17,2,12,8],[7,17,2],[7,17,2],[10,12,5,10,9,12,14,7,17],[0,5,10,14,7,17],[8,5,10,14,7,17],[9,12,1,14,7,17],[7,17,14],[7,17,14],[9,12,8,14,7,17],[7,17,14],[7,17,14],[7,16,13],[16,0,7,0,13,7],[16,12,7,12,9,7,9,8,7,13,7,8],[1,7,16],[1,7,0,0,7,16],[1,7,9,9,7,12,12,7,16],[10,7,8,16,8,7],[10,7,0,0,7,16],[9,7,12,10,7,9,12,7,16],[16,13,2,16,2,7,2,13,7],[2,7,16,2,16,0,2,0,13,2,13,7],[2,7,12,2,8,7,7,8,13,12,7,16],[2,7,16,2,16,1,2,1,7],[1,7,2,0,2,16,7,16,2],[1,7,2,7,12,2,7,16,12],[2,7,16,2,16,8,2,10,
7],[0,2,16,7,16,2,10,7,2],[7,12,2,10,7,2,7,16,12],[16,13,9,16,9,14,16,14,7,13,11,9,13,7,11],[7,11,13,14,16,0,14,7,16,0,13,11],[14,7,16,14,16,12,11,13,7,11,8,13],[11,1,7,14,7,16,14,16,9,9,16,1],[1,7,11,0,14,16,7,16,14],[1,7,11,7,16,14,16,12,14],[11,10,7,14,7,16,14,16,9,9,16,8],[0,14,16,10,7,11,7,16,14],[10,7,11,7,16,14,16,12,14],[13,3,16,3,7,16],[3,7,0,3,0,13,0,7,16],[3,7,9,3,8,13,9,7,12,12,7,16],[3,7,16,3,16,1],[0,7,16,0,3,7],[9,3,7,12,9,7,12,7,16],[3,7,8,7,16,8],[0,7,16,0,3,7],[9,3,7,12,9,7,12,7,
16],[3,2,13,13,2,16,2,7,16],[2,7,16,2,16,0,0,13,3],[2,7,12,12,7,16,8,13,3],[2,7,16,2,16,1],[0,2,16,7,16,2],[7,12,2,7,16,12],[2,7,16,2,16,8],[0,2,16,7,16,2],[7,12,2,7,16,12],[3,9,13,13,9,16,14,7,16,9,14,16],[14,16,0,14,7,16,0,13,3],[14,16,12,14,7,16,8,13,3],[9,16,1,14,16,9,14,7,16],[0,14,16,7,16,14],[7,16,14,16,12,14],[9,16,8,14,16,9,14,7,16],[0,14,16,7,16,14],[7,16,14,16,12,14],[13,10,11,16,13,11,16,11,7],[10,0,13,0,7,16,11,7,0],[10,8,13,9,7,12,11,7,9,12,7,16],[1,11,16,7,16,11],[0,7,16,0,11,7],[9,
11,7,12,9,7,12,7,16],[11,7,16,11,16,8],[0,7,16,0,11,7],[9,11,7,12,9,7,12,7,16],[10,2,13,13,2,16,2,7,16],[2,7,16,2,16,0,0,13,10],[2,7,12,12,7,16,8,13,10],[2,7,16,2,16,1],[0,2,16,7,16,2],[7,12,2,7,16,12],[2,7,16,2,16,8],[0,2,16,7,16,2],[7,12,2,7,16,12],[10,9,13,13,9,16,9,14,16,14,7,16],[14,16,0,14,7,16,0,13,10],[14,16,12,14,7,16,8,13,10],[9,16,1,14,16,9,14,7,16],[0,14,16,7,16,14],[7,16,14,16,12,14],[9,16,8,14,16,9,14,7,16],[0,14,16,7,16,14],[7,16,14,16,12,14],[4,13,7],[4,0,7,0,13,7],[4,9,7,8,13,7,9,
8,7],[4,1,7],[1,7,0,0,7,4],[1,7,9,9,7,4],[4,8,7,8,10,7],[10,7,0,0,7,4],[9,7,4,10,7,9],[4,2,7,4,13,2,2,13,7],[2,7,4,2,13,7,2,0,13],[2,7,4,2,8,7,8,13,7],[2,4,1,2,7,4,2,1,7],[1,7,2,7,4,2],[1,7,2,7,4,2],[2,4,8,2,7,4,2,10,7],[7,4,2,10,7,2],[7,4,2,10,7,2],[4,14,7,4,13,9,9,13,11,11,13,7],[11,0,13,11,13,7,14,7,4],[11,8,13,11,13,7,14,7,4],[9,4,1,11,1,7,14,7,4],[1,7,11,7,4,14],[1,7,11,7,4,14],[9,4,8,11,10,7,14,7,4],[10,7,11,7,4,14],[10,7,11,7,4,14],[4,3,7,4,13,3],[3,4,0,3,7,4,3,0,13],[3,7,9,3,8,13,9,7,4],[3,
4,1,3,7,4],[0,3,4,7,4,3],[7,9,3,7,4,9],[3,4,8,3,7,4],[0,3,4,7,4,3],[7,9,3,7,4,9],[3,2,13,13,2,4,2,7,4],[2,7,4,0,13,3],[2,7,4,8,13,3],[2,7,4,2,4,1],[7,4,2],[7,4,2],[2,7,4,2,4,8],[7,4,2],[7,4,2],[3,9,13,9,4,13,14,7,4],[0,13,3,14,7,4],[8,13,3,14,7,4],[9,4,1,14,7,4],[7,4,14],[7,4,14],[9,4,8,14,7,4],[7,4,14],[7,4,14],[4,11,7,4,10,11,4,13,10],[11,7,4,11,4,0,10,0,13],[11,7,9,9,7,4,10,8,13],[11,7,4,11,4,1],[0,11,4,7,4,11],[7,4,9,7,9,11],[11,7,4,11,4,8],[0,11,4,7,4,11],[7,4,9,7,9,11],[10,4,13,10,2,4,2,7,4],
[2,7,4,0,13,10],[2,7,4,8,13,10],[2,7,4,2,4,1],[7,4,2],[7,4,2],[2,7,4,2,4,8],[7,4,2],[7,4,2],[10,9,13,9,4,13,14,7,4],[0,13,10,14,7,4],[8,13,10,14,7,4],[9,4,1,14,7,4],[7,4,14],[7,4,14],[9,4,8,14,7,4],[7,4,14],[7,4,14],[17,12,7,13,7,12],[17,0,7,0,13,7],[8,13,7,9,8,7,17,9,7],[12,1,7,17,12,7],[1,7,0,0,7,17],[1,7,9,9,7,17],[8,10,12,12,10,17,17,10,7],[10,7,0,0,7,17],[9,7,17,10,7,9],[12,13,2,2,13,7,17,2,7],[2,7,17,2,13,7,2,0,13],[2,7,17,2,8,7,8,13,7],[2,7,17,2,1,7,2,12,1],[1,7,2,7,17,2],[1,7,2,7,17,2],[2,
7,17,2,10,7,2,12,8],[7,17,2,10,7,2],[7,17,2,10,7,2],[12,13,9,11,13,7,9,13,11,17,14,7],[11,0,13,11,13,7,14,7,17],[11,8,13,11,13,7,14,7,17],[9,12,1,11,1,7,14,7,17],[1,7,11,7,17,14],[1,7,11,7,17,14],[9,12,8,11,10,7,14,7,17],[10,7,11,7,17,14],[10,7,11,7,17,14],[17,12,3,17,3,7,12,13,3],[3,7,17,3,17,0,3,0,13],[3,7,9,3,8,13,9,7,17],[3,7,17,3,17,12,3,12,1],[0,3,17,7,17,3],[7,9,3,7,17,9],[3,7,17,3,17,12,3,12,8],[0,3,17,7,17,3],[7,9,3,7,17,9],[3,12,13,3,2,12,2,7,17],[2,7,17,0,13,3],[2,7,17,8,13,3],[2,7,17,
2,12,1],[7,17,2],[7,17,2],[2,7,17,2,12,8],[7,17,2],[7,17,2],[3,9,13,9,12,13,14,7,17],[0,13,3,14,7,17],[8,13,3,14,7,17],[9,12,1,14,7,17],[7,17,14],[7,17,14],[9,12,8,14,7,17],[7,17,14],[7,17,14],[17,12,11,17,11,7,12,10,11,12,13,10],[11,17,0,11,7,17,10,0,13],[11,7,17,11,17,9,10,8,13],[11,17,12,11,7,17,11,12,1],[0,11,17,7,17,11],[7,17,11,17,9,11],[11,17,12,11,7,17,11,12,8],[0,11,17,7,17,11],[7,17,11,17,9,11],[10,2,12,10,12,13,2,7,17],[2,7,17,0,13,10],[2,7,17,8,13,10],[2,7,17,2,12,1],[7,17,2],[7,17,2],
[2,7,17,2,12,8],[7,17,2],[7,17,2],[10,12,13,10,9,12,14,7,17],[0,13,10,14,7,17],[8,13,10,14,7,17],[9,12,1,14,7,17],[7,17,14],[7,17,14],[9,12,8,14,7,17],[7,17,14],[7,17,14],[],[],[6,7,12,6,9,7,8,7,9,12,7,8],[],[],[1,12,7,1,7,9,7,6,9,12,6,7],[6,7,13,6,10,7,6,8,10,6,13,8],[7,6,10,13,6,7,13,0,6,0,10,6],[13,12,7,12,6,7,7,6,9,10,7,9],[6,7,2],[2,0,7,0,6,7],[2,8,7,8,12,7,12,6,7],[2,6,1,2,1,7,1,6,7],[1,7,2,1,6,7,1,0,6],[1,7,2,1,12,7,12,6,7],[2,6,8,2,10,7,8,6,13,13,6,7],[13,0,6,13,6,7,10,7,2],[12,6,7,13,12,
7,10,7,2],[6,7,9,11,9,7],[11,0,7,0,6,7],[8,12,7,11,8,7,12,6,7],[9,6,1,1,6,7,11,1,7],[1,7,11,1,6,7,1,0,6],[1,7,11,1,12,7,12,6,7],[9,6,8,8,6,13,11,10,7,13,6,7],[13,0,6,13,6,7,10,7,11],[12,6,7,13,12,7,10,7,11],[6,7,3],[3,6,0,3,0,7,0,6,7],[3,6,9,3,8,7,8,12,7,12,6,7],[3,6,1,1,6,7],[1,6,7,1,0,6,0,3,6],[1,12,7,12,6,7,9,3,6],[3,6,8,8,6,13,13,6,7],[13,0,6,13,6,7,0,3,6],[12,6,7,13,12,7,9,3,6],[3,2,6,3,6,7],[0,6,7,0,7,3],[8,7,3,12,7,8,12,6,7],[2,6,1,1,6,7],[1,6,7,1,0,6],[1,12,7,12,6,7],[2,6,8,8,6,13,13,6,7],
[13,0,6,13,6,7],[12,6,7,13,12,7],[3,9,7,7,9,6],[0,6,7,0,7,3],[8,7,3,12,7,8,12,6,7],[9,6,1,1,6,7],[1,6,7,1,0,6],[1,12,7,12,6,7],[8,6,13,9,6,8,13,6,7],[13,0,6,13,6,7],[12,6,7,13,12,7],[6,7,10,6,10,11],[11,6,0,0,6,7,10,0,7],[11,6,9,8,12,7,10,8,7,12,6,7],[11,6,1,1,6,7],[1,6,7,1,0,6,0,11,6],[1,12,7,12,6,7,9,11,6],[11,6,8,8,6,13,13,6,7],[13,0,6,13,6,7,0,11,6],[12,6,7,13,12,7,9,11,6],[2,6,10,7,10,6],[0,6,7,0,7,10],[8,7,10,12,7,8,12,6,7],[2,6,1,1,6,7],[1,6,7,1,0,6],[1,12,7,12,6,7],[2,6,8,8,6,13,13,6,7],[13,
0,6,13,6,7],[12,6,7,13,12,7],[7,9,6,10,9,7],[0,6,7,0,7,10],[8,7,10,12,7,8,12,6,7],[9,6,1,1,6,7],[1,6,7,1,0,6],[1,12,7,12,6,7],[8,6,13,9,6,8,13,6,7],[13,0,6,13,6,7],[12,6,7,13,12,7],[6,4,7],[4,7,0,0,7,6],[4,7,8,8,7,9,9,7,6],[4,1,6,4,7,1,1,7,6],[1,4,7,1,7,6,1,6,0],[1,4,7,1,7,9,9,7,6],[4,8,6,4,7,13,8,10,6,10,7,6],[10,6,0,10,7,6,13,4,7],[9,7,6,10,7,9,13,4,7],[4,7,2],[2,0,7,0,4,7],[2,8,7,8,4,7],[2,4,1,2,1,7,1,4,7],[1,7,2,1,4,7],[1,7,2,1,4,7],[2,4,8,2,10,7,13,4,7],[10,7,2,13,4,7],[10,7,2,13,4,7],[4,7,9,
9,7,11],[11,0,7,0,4,7],[8,4,7,11,8,7],[9,4,1,1,4,7,11,1,7],[1,7,11,1,4,7],[1,7,11,1,4,7],[9,4,8,11,10,7,13,4,7],[10,7,11,13,4,7],[10,7,11,13,4,7],[4,3,6,4,7,3],[3,0,4,3,4,7,3,6,0],[3,8,7,3,6,9,8,4,7],[3,4,1,3,6,4,1,4,7],[1,4,7,0,3,6],[1,4,7,9,3,6],[3,6,8,8,6,4,13,4,7],[0,3,6,13,4,7],[9,3,6,13,4,7],[3,2,4,3,4,7],[0,4,3,7,3,4],[7,3,8,7,8,4],[2,4,1,1,4,7],[1,4,7],[1,4,7],[2,4,8,13,4,7],[13,4,7],[13,4,7],[3,9,4,3,4,7],[0,4,3,7,3,4],[7,3,8,7,8,4],[9,4,1,1,4,7],[1,4,7],[1,4,7],[9,4,8,13,4,7],[13,4,7],[13,
4,7],[4,11,6,4,7,10,4,10,11],[10,4,7,10,0,4,11,6,0],[10,8,7,8,4,7,11,6,9],[11,6,4,11,4,1,1,4,7],[1,4,7,0,11,6],[1,4,7,9,11,6],[11,6,8,8,6,4,13,4,7],[0,11,6,13,4,7],[9,11,6,13,4,7],[10,4,7,10,2,4],[0,4,10,7,10,4],[7,8,4,7,10,8],[2,4,1,1,4,7],[1,4,7],[1,4,7],[2,4,8,13,4,7],[13,4,7],[13,4,7],[10,4,7,10,9,4],[0,4,10,7,10,4],[7,8,4,7,10,8],[9,4,1,1,4,7],[1,4,7],[1,4,7],[9,4,8,13,4,7],[13,4,7],[13,4,7],[6,12,7,16,7,12],[16,7,0,0,7,6],[8,7,9,16,7,8,9,7,6],[12,1,6,1,7,6,16,7,1],[1,16,7,1,7,6,1,6,0],[1,16,
7,1,7,9,9,7,6],[12,8,6,8,10,6,16,7,13,10,7,6],[10,6,0,10,7,6,13,16,7],[9,7,6,10,7,9,13,16,7],[12,7,2,16,7,12],[2,0,7,0,16,7],[2,8,7,8,16,7],[2,1,7,2,12,1,1,16,7],[1,7,2,1,16,7],[1,7,2,1,16,7],[2,10,7,2,12,8,13,16,7],[10,7,2,13,16,7],[10,7,2,13,16,7],[9,12,11,12,16,11,16,7,11],[11,0,7,0,16,7],[8,16,7,11,8,7],[9,12,1,1,16,7,11,1,7],[1,7,11,1,16,7],[1,7,11,1,16,7],[9,12,8,11,10,7,13,16,7],[10,7,11,13,16,7],[10,7,11,13,16,7],[16,3,12,16,7,3,12,3,6],[3,16,7,3,0,16,3,6,0],[3,8,7,3,6,9,8,16,7],[3,6,12,3,
12,1,1,16,7],[1,16,7,0,3,6],[1,16,7,9,3,6],[3,6,8,13,16,7,8,6,12],[0,3,6,13,16,7],[9,3,6,13,16,7],[3,16,7,3,12,16,3,2,12],[0,16,3,7,3,16],[7,3,8,7,8,16],[2,12,1,1,16,7],[1,16,7],[1,16,7],[2,12,8,13,16,7],[13,16,7],[13,16,7],[3,16,7,3,12,16,3,9,12],[0,16,3,7,3,16],[7,3,8,7,8,16],[9,12,1,1,16,7],[1,16,7],[1,16,7],[9,12,8,13,16,7],[13,16,7],[13,16,7],[16,10,12,16,7,10,12,11,6,12,10,11],[10,0,16,10,16,7,11,6,0],[10,16,7,10,8,16,11,6,9],[11,12,1,11,6,12,1,16,7],[1,16,7,0,11,6],[1,16,7,9,11,6],[11,6,12,
11,12,8,13,16,7],[0,11,6,13,16,7],[9,11,6,13,16,7],[10,12,16,10,16,7,10,2,12],[0,16,10,7,10,16],[7,10,16,16,10,8],[2,12,1,1,16,7],[1,16,7],[1,16,7],[2,12,8,13,16,7],[13,16,7],[13,16,7],[10,12,16,10,16,7,10,9,12],[0,16,10,7,10,16],[7,10,16,16,10,8],[9,12,1,1,16,7],[1,16,7],[1,16,7],[9,12,8,13,16,7],[13,16,7],[13,16,7],[6,5,7],[5,0,6,5,7,0,0,7,6],[5,12,6,5,7,8,8,7,9,9,7,6],[5,1,6,1,7,6],[1,7,6,1,6,0,0,6,5],[1,7,9,9,7,6,12,6,5],[5,8,6,8,10,6,10,7,6],[10,6,0,10,7,6,0,6,5],[9,7,6,10,7,9,12,6,5],[5,2,6,
5,7,2],[2,0,5,2,5,7,0,6,5],[2,8,7,8,5,7,12,6,5],[2,5,1,2,6,5,2,1,7],[1,7,2,0,6,5],[1,7,2,12,6,5],[2,6,8,2,10,7,8,6,5],[0,6,5,10,7,2],[12,6,5,10,7,2],[5,9,6,5,7,11,5,11,9],[11,5,7,11,0,5,0,6,5],[11,8,7,8,5,7,12,6,5],[9,6,5,9,5,1,11,1,7],[1,7,11,0,6,5],[1,7,11,12,6,5],[9,6,8,8,6,5,11,10,7],[0,6,5,10,7,11],[12,6,5,10,7,11],[5,3,6],[3,0,5,3,6,0,0,6,5],[3,8,5,3,6,9,12,6,5],[3,6,1,1,6,5],[0,6,5,0,3,6],[9,3,6,12,6,5],[3,6,8,8,6,5],[0,6,5,0,3,6],[9,3,6,12,6,5],[3,2,5,2,6,5],[6,5,0,0,5,3],[6,5,12,8,5,3],[2,
6,5,2,5,1],[0,6,5],[12,6,5],[2,6,8,8,6,5],[0,6,5],[12,6,5],[3,9,5,9,6,5],[6,5,0,0,5,3],[6,5,12,8,5,3],[9,5,1,9,6,5],[0,6,5],[12,6,5],[8,6,5,9,6,8],[0,6,5],[12,6,5],[5,10,6,10,11,6],[10,0,5,0,6,5,11,6,0],[10,8,5,11,6,9,12,6,5],[11,6,1,1,6,5],[0,6,5,0,11,6],[9,11,6,12,6,5],[8,6,5,11,6,8],[0,6,5,0,11,6],[9,11,6,12,6,5],[10,2,5,2,6,5],[6,5,0,0,5,10],[6,5,12,8,5,10],[2,6,5,2,5,1],[0,6,5],[12,6,5],[2,6,8,8,6,5],[0,6,5],[12,6,5],[10,9,5,9,6,5],[6,5,0,0,5,10],[6,5,12,8,5,10],[9,5,1,9,6,5],[0,6,5],[12,6,5],
[8,6,5,9,6,8],[0,6,5],[12,6,5],[5,6,4,5,7,6],[0,7,6,0,5,7],[8,5,7,9,8,7,9,7,6],[4,1,6,1,7,6],[1,7,6,1,6,0],[1,7,9,9,7,6],[4,8,6,8,10,6,10,7,6],[10,6,0,10,7,6],[9,7,6,10,7,9],[4,5,2,2,5,7],[2,5,7,2,0,5],[2,8,7,8,5,7],[2,4,1,2,1,7],[1,7,2],[1,7,2],[2,4,8,2,10,7],[10,7,2],[10,7,2],[4,5,9,9,5,11,11,5,7],[11,0,5,11,5,7],[8,5,7,11,8,7],[9,4,1,11,1,7],[1,7,11],[1,7,11],[9,4,8,11,10,7],[10,7,11],[10,7,11],[4,5,3,4,3,6],[3,6,0,3,0,5],[3,6,9,3,8,5],[3,4,1,3,6,4],[0,3,6],[9,3,6],[3,6,8,8,6,4],[0,3,6],[9,3,6],
[3,2,4,3,4,5],[0,5,3],[8,5,3],[2,4,1],[],[],[2,4,8],[],[],[3,9,5,9,4,5],[0,5,3],[8,5,3],[9,4,1],[],[],[9,4,8],[],[],[4,5,10,4,11,6,4,10,11],[11,6,0,10,0,5],[11,6,9,10,8,5],[11,6,4,11,4,1],[0,11,6],[9,11,6],[11,6,8,8,6,4],[0,11,6],[9,11,6],[10,4,5,10,2,4],[0,5,10],[8,5,10],[2,4,1],[],[],[2,4,8],[],[],[10,9,5,9,4,5],[0,5,10],[8,5,10],[9,4,1],[],[],[9,4,8],[],[],[5,7,12,7,6,12],[0,7,6,0,5,7],[8,5,7,9,8,7,9,7,6],[12,1,6,1,7,6],[1,7,6,1,6,0],[1,7,9,9,7,6],[8,10,6,12,8,6,10,7,6],[10,6,0,10,7,6],[9,7,6,
10,7,9],[12,5,2,2,5,7],[2,5,7,2,0,5],[2,8,7,8,5,7],[2,1,7,2,12,1],[1,7,2],[1,7,2],[2,10,7,2,12,8],[10,7,2],[10,7,2],[12,5,9,9,5,11,11,5,7],[11,0,5,11,5,7],[8,5,7,11,8,7],[9,12,1,11,1,7],[1,7,11],[1,7,11],[9,12,8,11,10,7],[10,7,11],[10,7,11],[12,3,6,12,5,3],[3,6,0,3,0,5],[3,6,9,3,8,5],[3,6,12,3,12,1],[0,3,6],[9,3,6],[3,6,8,8,6,12],[0,3,6],[9,3,6],[3,12,5,3,2,12],[0,5,3],[8,5,3],[2,12,1],[],[],[2,12,8],[],[],[3,9,5,9,12,5],[0,5,3],[8,5,3],[9,12,1],[],[],[9,12,8],[],[],[12,11,6,12,10,11,12,5,10],[11,
6,0,10,0,5],[11,6,9,10,8,5],[11,12,1,11,6,12],[0,11,6],[9,11,6],[11,6,12,11,12,8],[0,11,6],[9,11,6],[10,2,12,10,12,5],[0,5,10],[8,5,10],[2,12,1],[],[],[2,12,8],[],[],[10,12,5,10,9,12],[0,5,10],[8,5,10],[9,12,1],[],[],[9,12,8],[],[],[6,13,7,6,16,13],[16,0,6,0,7,6,13,7,0],[16,12,6,8,7,9,13,7,8,9,7,6],[16,1,6,1,7,6],[1,7,6,1,6,0,0,6,16],[1,7,9,9,7,6,12,6,16],[16,8,6,8,10,6,10,7,6],[10,6,0,10,7,6,0,6,16],[9,7,6,10,7,9,12,6,16],[16,13,2,16,2,6,13,7,2],[2,13,7,2,0,13,0,6,16],[2,8,7,12,6,16,8,13,7],[2,6,
16,2,16,1,2,1,7],[1,7,2,0,6,16],[1,7,2,12,6,16],[2,6,8,2,10,7,8,6,16],[0,6,16,10,7,2],[12,6,16,10,7,2],[16,13,9,16,9,6,13,11,9,13,7,11],[11,0,13,11,13,7,0,6,16],[11,13,7,11,8,13,12,6,16],[9,16,1,9,6,16,11,1,7],[1,7,11,0,6,16],[1,7,11,12,6,16],[9,6,16,9,16,8,11,10,7],[0,6,16,10,7,11],[12,6,16,10,7,11],[16,13,6,13,3,6],[3,6,0,3,0,13,0,6,16],[3,6,9,3,8,13,12,6,16],[3,6,1,1,6,16],[0,6,16,0,3,6],[9,3,6,12,6,16],[3,6,8,8,6,16],[0,6,16,0,3,6],[9,3,6,12,6,16],[3,2,13,13,2,16,2,6,16],[6,16,0,0,13,3],[6,16,
12,8,13,3],[2,6,16,2,16,1],[0,6,16],[12,6,16],[2,6,8,8,6,16],[0,6,16],[12,6,16],[3,9,13,13,9,16,9,6,16],[6,16,0,0,13,3],[6,16,12,8,13,3],[9,16,1,9,6,16],[0,6,16],[12,6,16],[9,16,8,9,6,16],[0,6,16],[12,6,16],[13,11,16,10,11,13,16,11,6],[10,0,13,0,6,16,11,6,0],[10,8,13,11,6,9,12,6,16],[11,6,1,1,6,16],[0,6,16,0,11,6],[9,11,6,12,6,16],[8,6,16,11,6,8],[0,6,16,0,11,6],[9,11,6,12,6,16],[10,2,13,13,2,16,2,6,16],[6,16,0,0,13,10],[6,16,12,8,13,10],[2,6,16,2,16,1],[0,6,16],[12,6,16],[2,6,8,8,6,16],[0,6,16],
[12,6,16],[10,9,13,13,9,16,9,6,16],[6,16,0,0,13,10],[6,16,12,8,13,10],[9,16,1,9,6,16],[0,6,16],[12,6,16],[9,16,8,9,6,16],[0,6,16],[12,6,16],[4,13,6,7,6,13],[0,7,6,0,13,7],[8,13,7,9,8,7,9,7,6],[4,1,6,1,7,6],[1,7,6,1,6,0],[1,7,9,9,7,6],[4,8,6,8,10,6,10,7,6],[10,6,0,10,7,6],[9,7,6,10,7,9],[4,13,2,2,13,7],[2,13,7,2,0,13],[2,8,7,8,13,7],[2,4,1,2,1,7],[1,7,2],[1,7,2],[2,4,8,2,10,7],[10,7,2],[10,7,2],[4,13,9,9,13,11,11,13,7],[11,0,13,11,13,7],[11,8,13,11,13,7],[9,4,1,11,1,7],[1,7,11],[1,7,11],[9,4,8,11,
10,7],[10,7,11],[10,7,11],[4,3,6,4,13,3],[3,6,0,3,0,13],[3,6,9,3,8,13],[3,4,1,3,6,4],[0,3,6],[9,3,6],[3,6,8,8,6,4],[0,3,6],[9,3,6],[3,2,13,13,2,4],[0,13,3],[8,13,3],[2,4,1],[],[],[2,4,8],[],[],[3,9,13,9,4,13],[0,13,3],[8,13,3],[9,4,1],[],[],[9,4,8],[],[],[4,11,6,4,10,11,4,13,10],[11,6,0,10,0,13],[11,6,9,10,8,13],[11,6,4,11,4,1],[0,11,6],[9,11,6],[11,6,8,8,6,4],[0,11,6],[9,11,6],[10,4,13,10,2,4],[0,13,10],[8,13,10],[2,4,1],[],[],[2,4,8],[],[],[10,9,13,9,4,13],[0,13,10],[8,13,10],[9,4,1],[],[],[9,4,
8],[],[],[7,6,12,13,7,12],[0,7,6,0,13,7],[8,13,7,9,8,7,9,7,6],[12,1,6,1,7,6],[1,7,6,1,6,0],[1,7,9,9,7,6],[8,10,6,12,8,6,10,7,6],[10,6,0,10,7,6],[9,7,6,10,7,9],[12,13,2,2,13,7],[2,13,7,2,0,13],[2,8,7,8,13,7],[2,1,7,2,12,1],[1,7,2],[1,7,2],[2,10,7,2,12,8],[10,7,2],[10,7,2],[12,13,9,11,13,7,9,13,11],[11,0,13,11,13,7],[11,8,13,11,13,7],[9,12,1,11,1,7],[1,7,11],[1,7,11],[9,12,8,11,10,7],[10,7,11],[10,7,11],[12,3,6,12,13,3],[3,6,0,3,0,13],[3,6,9,3,8,13],[3,6,12,3,12,1],[0,3,6],[9,3,6],[3,6,8,8,6,12],[0,
3,6],[9,3,6],[3,12,13,3,2,12],[0,13,3],[8,13,3],[2,12,1],[],[],[2,12,8],[],[],[3,9,13,9,12,13],[0,13,3],[8,13,3],[9,12,1],[],[],[9,12,8],[],[],[12,11,6,12,10,11,12,13,10],[11,6,0,10,0,13],[11,6,9,10,8,13],[11,12,1,11,6,12],[0,11,6],[9,11,6],[11,6,12,11,12,8],[0,11,6],[9,11,6],[10,2,12,10,12,13],[0,13,10],[8,13,10],[2,12,1],[],[],[2,12,8],[],[],[10,12,13,10,9,12],[0,13,10],[8,13,10],[9,12,1],[],[],[9,12,8],[],[],[7,14,17],[17,7,0,0,7,14],[17,7,12,12,7,8,8,7,9,14,9,7],[17,1,14,17,7,1,1,7,14],[1,17,
7,1,0,17,1,14,0,1,7,14],[1,12,7,1,7,9,7,14,9,12,17,7],[17,8,14,17,13,8,17,7,13,14,8,10,14,10,7],[7,14,10,13,0,17,13,17,7,0,10,14],[13,17,7,13,12,17,10,7,14,10,14,9],[2,17,7],[2,0,7,0,17,7],[2,8,7,8,12,7,12,17,7],[2,1,7,2,17,1,1,17,7],[1,7,2,1,17,7,1,0,17],[1,7,2,1,12,7,12,17,7],[2,10,7,2,17,8,8,17,13,13,17,7],[13,0,17,13,17,7,10,7,2],[13,12,17,13,17,7,10,7,2],[11,9,7,17,7,9],[11,0,7,0,17,7],[8,12,7,11,8,7,12,17,7],[9,17,1,1,17,7,11,1,7],[1,7,11,1,17,7,1,0,17],[1,7,11,1,12,7,12,17,7],[9,17,8,13,17,
7,8,17,13,11,10,7],[13,0,17,13,17,7,10,7,11],[13,12,17,13,17,7,10,7,11],[14,17,3,3,17,7],[3,0,7,3,14,0,0,17,7],[3,8,7,3,14,9,8,12,7,12,17,7],[3,14,1,14,17,1,1,17,7],[1,17,7,1,0,17,0,3,14],[1,12,7,12,17,7,9,3,14],[3,14,8,14,17,8,13,17,7,8,17,13],[13,0,17,13,17,7,0,3,14],[13,12,17,13,17,7,9,3,14],[3,17,7,3,2,17],[0,17,7,0,7,3],[8,7,3,12,7,8,12,17,7],[2,17,1,1,17,7],[1,17,7,1,0,17],[1,12,7,12,17,7],[2,17,8,8,17,13,13,17,7],[13,0,17,13,17,7],[13,12,17,13,17,7],[3,9,7,7,9,17],[0,17,7,0,7,3],[8,7,3,12,
7,8,12,17,7],[9,17,1,1,17,7],[1,17,7,1,0,17],[1,12,7,12,17,7],[8,17,13,9,17,8,13,17,7],[13,0,17,13,17,7],[13,12,17,13,17,7],[14,10,11,17,10,14,17,7,10],[11,14,0,0,17,7,10,0,7],[11,14,9,8,12,7,10,8,7,12,17,7],[11,14,1,14,17,1,1,17,7],[1,17,7,1,0,17,0,11,14],[1,12,7,12,17,7,9,11,14],[11,14,8,14,17,8,8,17,13,13,17,7],[13,0,17,13,17,7,0,11,14],[13,12,17,13,17,7,9,11,14],[2,17,10,7,10,17],[0,17,7,0,7,10],[8,7,10,12,7,8,12,17,7],[2,17,1,1,17,7],[1,17,7,1,0,17],[1,12,7,12,17,7],[2,17,8,8,17,13,13,17,7],
[13,0,17,13,17,7],[13,12,17,13,17,7],[10,17,7,10,9,17],[0,17,7,0,7,10],[8,7,10,12,7,8,12,17,7],[9,17,1,1,17,7],[1,17,7,1,0,17],[1,12,7,12,17,7],[8,17,13,9,17,8,13,17,7],[13,0,17,13,17,7],[13,12,17,13,17,7],[4,7,14],[4,7,0,0,7,14],[4,7,8,8,7,9,9,7,14],[4,7,1,4,1,14,1,7,14],[1,4,7,1,7,14,1,14,0],[1,4,7,1,7,9,9,7,14],[4,7,13,4,8,14,8,10,14,10,7,14],[10,14,0,10,7,14,13,4,7],[10,14,9,10,7,14,13,4,7],[4,7,2],[2,0,7,0,4,7],[2,8,7,8,4,7],[2,4,1,2,1,7,1,4,7],[1,7,2,1,4,7],[1,7,2,1,4,7],[2,4,8,2,10,7,13,4,
7],[10,7,2,13,4,7],[10,7,2,13,4,7],[4,7,9,9,7,11],[11,0,7,0,4,7],[8,4,7,11,8,7],[9,4,1,1,4,7,11,1,7],[1,7,11,1,4,7],[1,7,11,1,4,7],[9,4,8,11,10,7,13,4,7],[10,7,11,13,4,7],[10,7,11,13,4,7],[4,7,3,4,3,14],[3,0,4,3,4,7,3,14,0],[3,8,7,3,14,9,8,4,7],[3,14,1,14,4,1,1,4,7],[1,4,7,0,3,14],[1,4,7,9,3,14],[3,14,8,8,14,4,13,4,7],[0,3,14,13,4,7],[9,3,14,13,4,7],[3,2,4,3,4,7],[0,4,3,7,3,4],[7,3,8,7,8,4],[2,4,1,1,4,7],[1,4,7],[1,4,7],[2,4,8,13,4,7],[13,4,7],[13,4,7],[3,9,4,3,4,7],[0,4,3,7,3,4],[7,3,8,7,8,4],[9,
4,1,1,4,7],[1,4,7],[1,4,7],[9,4,8,13,4,7],[13,4,7],[13,4,7],[4,7,10,4,10,11,4,11,14],[10,4,7,10,0,4,11,14,0],[10,8,7,8,4,7,11,14,9],[11,14,4,11,4,1,1,4,7],[1,4,7,0,11,14],[1,4,7,9,11,14],[11,14,8,8,14,4,13,4,7],[0,11,14,13,4,7],[9,11,14,13,4,7],[10,4,7,10,2,4],[0,4,10,7,10,4],[7,8,4,7,10,8],[2,4,1,1,4,7],[1,4,7],[1,4,7],[2,4,8,13,4,7],[13,4,7],[13,4,7],[10,4,7,10,9,4],[0,4,10,7,10,4],[7,8,4,7,10,8],[9,4,1,1,4,7],[1,4,7],[1,4,7],[9,4,8,13,4,7],[13,4,7],[13,4,7],[16,7,12,14,12,7],[16,7,0,0,7,14],[8,
7,9,16,7,8,9,7,14],[12,1,14,1,7,14,16,7,1],[1,16,7,1,7,14,1,14,0],[1,16,7,1,7,9,9,7,14],[12,8,14,10,7,14,8,10,14,16,7,13],[10,14,0,10,7,14,13,16,7],[10,14,9,10,7,14,13,16,7],[12,7,2,16,7,12],[2,0,7,0,16,7],[2,8,7,8,16,7],[2,1,7,2,12,1,1,16,7],[1,7,2,1,16,7],[1,7,2,1,16,7],[2,10,7,2,12,8,13,16,7],[10,7,2,13,16,7],[10,7,2,13,16,7],[9,12,11,12,16,11,16,7,11],[11,0,7,0,16,7],[8,16,7,11,8,7],[9,12,1,1,16,7,11,1,7],[1,7,11,1,16,7],[1,7,11,1,16,7],[9,12,8,11,10,7,13,16,7],[10,7,11,13,16,7],[10,7,11,13,16,
7],[16,3,12,16,7,3,12,3,14],[3,16,7,3,0,16,3,14,0],[3,8,7,3,14,9,8,16,7],[3,14,12,3,12,1,1,16,7],[1,16,7,0,3,14],[1,16,7,9,3,14],[3,14,8,8,14,12,13,16,7],[0,3,14,13,16,7],[9,3,14,13,16,7],[3,16,7,3,12,16,3,2,12],[0,16,3,7,3,16],[7,3,8,7,8,16],[2,12,1,1,16,7],[1,16,7],[1,16,7],[2,12,8,13,16,7],[13,16,7],[13,16,7],[3,16,7,3,12,16,3,9,12],[0,16,3,7,3,16],[7,3,8,7,8,16],[9,12,1,1,16,7],[1,16,7],[1,16,7],[9,12,8,13,16,7],[13,16,7],[13,16,7],[16,10,12,16,7,10,12,11,14,12,10,11],[10,0,16,10,16,7,11,14,0],
[10,16,7,10,8,16,11,14,9],[11,12,1,11,14,12,1,16,7],[1,16,7,0,11,14],[1,16,7,9,11,14],[11,14,12,11,12,8,13,16,7],[0,11,14,13,16,7],[9,11,14,13,16,7],[10,12,16,10,16,7,10,2,12],[0,16,10,7,10,16],[7,10,16,16,10,8],[2,12,1,1,16,7],[1,16,7],[1,16,7],[2,12,8,13,16,7],[13,16,7],[13,16,7],[10,12,16,10,16,7,10,9,12],[0,16,10,7,10,16],[7,10,16,16,10,8],[9,12,1,1,16,7],[1,16,7],[1,16,7],[9,12,8,13,16,7],[13,16,7],[13,16,7],[17,5,14,5,7,14],[5,7,0,5,0,17,0,7,14],[5,7,8,5,12,17,8,7,9,9,7,14],[5,1,17,1,14,17,
1,7,14],[1,7,14,1,14,0,0,17,5],[1,7,9,9,7,14,12,17,5],[5,8,17,8,14,17,8,10,14,10,7,14],[10,14,0,10,7,14,0,17,5],[10,14,9,10,7,14,12,17,5],[5,7,2,5,2,17],[2,0,5,2,5,7,0,17,5],[2,8,7,8,5,7,12,17,5],[2,17,1,2,1,7,17,5,1],[1,7,2,0,17,5],[1,7,2,12,17,5],[2,17,8,2,10,7,8,17,5],[0,17,5,10,7,2],[12,17,5,10,7,2],[5,7,11,5,11,9,5,9,17],[11,5,7,11,0,5,0,17,5],[11,8,7,8,5,7,12,17,5],[9,17,5,9,5,1,11,1,7],[1,7,11,0,17,5],[1,7,11,12,17,5],[9,17,8,8,17,5,11,10,7],[0,17,5,10,7,11],[12,17,5,10,7,11],[5,3,14,5,14,
17],[3,0,5,3,14,0,0,17,5],[3,8,5,3,14,9,12,17,5],[3,14,1,14,17,1,1,17,5],[0,17,5,0,3,14],[9,3,14,12,17,5],[3,14,8,8,17,5,14,17,8],[0,17,5,0,3,14],[9,3,14,12,17,5],[3,2,5,2,17,5],[0,5,3,17,5,0],[8,5,3,17,5,12],[2,17,1,17,5,1],[0,17,5],[12,17,5],[2,17,8,8,17,5],[0,17,5],[12,17,5],[3,9,5,9,17,5],[0,5,3,17,5,0],[8,5,3,17,5,12],[9,5,1,9,17,5],[0,17,5],[12,17,5],[8,17,5,9,17,8],[0,17,5],[12,17,5],[5,10,17,17,10,14,10,11,14],[10,0,5,0,17,5,11,14,0],[10,8,5,11,14,9,12,17,5],[11,14,1,14,17,1,1,17,5],[0,17,
5,0,11,14],[9,11,14,12,17,5],[8,17,5,14,17,8,11,14,8],[0,17,5,0,11,14],[9,11,14,12,17,5],[10,2,5,2,17,5],[0,5,10,17,5,0],[17,5,12,8,5,10],[2,17,1,17,5,1],[0,17,5],[12,17,5],[2,17,8,8,17,5],[0,17,5],[12,17,5],[10,9,5,9,17,5],[0,5,10,17,5,0],[17,5,12,8,5,10],[9,5,1,9,17,5],[0,17,5],[12,17,5],[8,17,5,9,17,8],[0,17,5],[12,17,5],[5,7,14,5,14,4],[0,7,14,0,5,7],[8,5,7,9,8,7,9,7,14],[4,1,14,1,7,14],[1,7,14,1,14,0],[1,7,9,9,7,14],[4,8,14,8,10,14,10,7,14],[10,14,0,10,7,14],[10,14,9,10,7,14],[4,5,2,2,5,7],[2,
5,7,2,0,5],[2,8,7,8,5,7],[2,4,1,2,1,7],[1,7,2],[1,7,2],[2,4,8,2,10,7],[10,7,2],[10,7,2],[4,5,9,9,5,11,11,5,7],[11,0,5,11,5,7],[8,5,7,11,8,7],[9,4,1,11,1,7],[1,7,11],[1,7,11],[9,4,8,11,10,7],[10,7,11],[10,7,11],[4,5,3,4,3,14],[3,14,0,3,0,5],[3,14,9,3,8,5],[3,14,1,14,4,1],[0,3,14],[9,3,14],[3,14,8,8,14,4],[0,3,14],[9,3,14],[3,2,4,3,4,5],[0,5,3],[8,5,3],[2,4,1],[],[],[2,4,8],[],[],[3,9,5,9,4,5],[0,5,3],[8,5,3],[9,4,1],[],[],[9,4,8],[],[],[4,5,10,4,11,14,4,10,11],[11,14,0,10,0,5],[11,14,9,10,8,5],[11,
14,4,11,4,1],[0,11,14],[9,11,14],[11,14,8,8,14,4],[0,11,14],[9,11,14],[10,4,5,10,2,4],[0,5,10],[8,5,10],[2,4,1],[],[],[2,4,8],[],[],[10,9,5,9,4,5],[0,5,10],[8,5,10],[9,4,1],[],[],[9,4,8],[],[],[5,7,12,7,14,12],[0,7,14,0,5,7],[8,5,7,9,8,7,9,7,14],[12,1,14,1,7,14],[1,7,14,1,14,0],[1,7,9,9,7,14],[8,10,14,12,8,14,10,7,14],[10,14,0,10,7,14],[10,14,9,10,7,14],[12,5,2,2,5,7],[2,5,7,2,0,5],[2,8,7,8,5,7],[2,1,7,2,12,1],[1,7,2],[1,7,2],[2,10,7,2,12,8],[10,7,2],[10,7,2],[12,5,9,9,5,11,11,5,7],[11,0,5,11,5,7],
[8,5,7,11,8,7],[9,12,1,11,1,7],[1,7,11],[1,7,11],[9,12,8,11,10,7],[10,7,11],[10,7,11],[12,3,14,12,5,3],[3,14,0,3,0,5],[3,14,9,3,8,5],[3,14,12,3,12,1],[0,3,14],[9,3,14],[3,14,8,8,14,12],[0,3,14],[9,3,14],[3,12,5,3,2,12],[0,5,3],[8,5,3],[2,12,1],[],[],[2,12,8],[],[],[3,9,5,9,12,5],[0,5,3],[8,5,3],[9,12,1],[],[],[9,12,8],[],[],[12,11,14,12,10,11,12,5,10],[11,14,0,10,0,5],[11,14,9,10,8,5],[11,12,1,11,14,12],[0,11,14],[9,11,14],[11,14,12,11,12,8],[0,11,14],[9,11,14],[10,2,12,10,12,5],[0,5,10],[8,5,10],
[2,12,1],[],[],[2,12,8],[],[],[10,12,5,10,9,12],[0,5,10],[8,5,10],[9,12,1],[],[],[9,12,8],[],[],[16,13,14,17,16,14,14,13,7],[16,0,17,0,7,14,13,7,0],[16,12,17,8,7,9,13,7,8,9,7,14],[1,17,16,1,14,17,1,7,14],[1,7,14,1,14,0,0,17,16],[1,7,9,9,7,14,12,17,16],[16,8,17,8,14,17,8,10,14,10,7,14],[10,14,0,10,7,14,0,17,16],[10,14,9,10,7,14,12,17,16],[16,13,2,16,2,17,13,7,2],[2,13,7,2,0,13,0,17,16],[2,8,7,12,17,16,8,13,7],[2,17,16,2,16,1,2,1,7],[1,7,2,0,17,16],[1,7,2,12,17,16],[2,17,8,2,10,7,8,17,16],[0,17,16,
10,7,2],[12,17,16,10,7,2],[16,13,9,16,9,17,13,11,9,13,7,11],[11,0,13,11,13,7,0,17,16],[11,13,7,11,8,13,12,17,16],[9,16,1,9,17,16,11,1,7],[1,7,11,0,17,16],[1,7,11,12,17,16],[9,17,16,9,16,8,11,10,7],[0,17,16,10,7,11],[12,17,16,10,7,11],[13,14,16,13,3,14,16,14,17],[3,14,0,3,0,13,0,17,16],[3,14,9,3,8,13,12,17,16],[3,14,1,14,17,1,17,16,1],[0,17,16,0,3,14],[9,3,14,12,17,16],[3,14,8,8,17,16,14,17,8],[0,17,16,0,3,14],[9,3,14,12,17,16],[3,2,13,13,2,16,2,17,16],[0,13,3,17,16,0],[8,13,3,17,16,12],[2,17,16,2,
16,1],[0,17,16],[12,17,16],[2,17,8,8,17,16],[0,17,16],[12,17,16],[3,9,13,13,9,16,9,17,16],[0,13,3,17,16,0],[8,13,3,17,16,12],[9,16,1,9,17,16],[0,17,16],[12,17,16],[9,16,8,9,17,16],[0,17,16],[12,17,16],[13,14,16,13,11,14,10,11,13,16,14,17],[10,0,13,0,17,16,11,14,0],[10,8,13,11,14,9,12,17,16],[11,14,1,14,17,1,17,16,1],[0,17,16,0,11,14],[9,11,14,12,17,16],[8,17,16,14,17,8,11,14,8],[0,17,16,0,11,14],[9,11,14,12,17,16],[10,2,13,13,2,16,2,17,16],[0,13,10,17,16,0],[17,16,12,8,13,10],[2,17,16,2,16,1],[0,
17,16],[12,17,16],[2,17,8,8,17,16],[0,17,16],[12,17,16],[10,9,13,13,9,16,9,17,16],[0,13,10,17,16,0],[17,16,12,8,13,10],[9,16,1,9,17,16],[0,17,16],[12,17,16],[9,16,8,9,17,16],[0,17,16],[12,17,16],[4,13,14,7,14,13],[0,7,14,0,13,7],[8,13,7,9,8,7,9,7,14],[4,1,14,1,7,14],[1,7,14,1,14,0],[1,7,9,9,7,14],[4,8,14,8,10,14,10,7,14],[10,14,0,10,7,14],[10,14,9,10,7,14],[4,13,2,2,13,7],[2,13,7,2,0,13],[2,8,7,8,13,7],[2,4,1,2,1,7],[1,7,2],[1,7,2],[2,4,8,2,10,7],[10,7,2],[10,7,2],[4,13,9,9,13,11,11,13,7],[11,0,13,
11,13,7],[11,8,13,11,13,7],[9,4,1,11,1,7],[1,7,11],[1,7,11],[9,4,8,11,10,7],[10,7,11],[10,7,11],[4,3,14,4,13,3],[3,14,0,3,0,13],[3,14,9,3,8,13],[3,14,1,14,4,1],[0,3,14],[9,3,14],[3,14,8,8,14,4],[0,3,14],[9,3,14],[3,2,13,13,2,4],[0,13,3],[8,13,3],[2,4,1],[],[],[2,4,8],[],[],[3,9,13,9,4,13],[0,13,3],[8,13,3],[9,4,1],[],[],[9,4,8],[],[],[4,11,14,4,10,11,4,13,10],[11,14,0,10,0,13],[11,14,9,10,8,13],[11,14,4,11,4,1],[0,11,14],[9,11,14],[11,14,8,8,14,4],[0,11,14],[9,11,14],[10,4,13,10,2,4],[0,13,10],[8,
13,10],[2,4,1],[],[],[2,4,8],[],[],[10,9,13,9,4,13],[0,13,10],[8,13,10],[9,4,1],[],[],[9,4,8],[],[],[13,7,14,13,14,12],[0,7,14,0,13,7],[8,13,7,9,8,7,9,7,14],[12,1,14,1,7,14],[1,7,14,1,14,0],[1,7,9,9,7,14],[8,10,14,12,8,14,10,7,14],[10,14,0,10,7,14],[10,14,9,10,7,14],[12,13,2,2,13,7],[2,13,7,2,0,13],[2,8,7,8,13,7],[2,1,7,2,12,1],[1,7,2],[1,7,2],[2,10,7,2,12,8],[10,7,2],[10,7,2],[12,13,9,11,13,7,9,13,11],[11,0,13,11,13,7],[11,8,13,11,13,7],[9,12,1,11,1,7],[1,7,11],[1,7,11],[9,12,8,11,10,7],[10,7,11],
[10,7,11],[12,3,14,12,13,3],[3,14,0,3,0,13],[3,14,9,3,8,13],[3,14,12,3,12,1],[0,3,14],[9,3,14],[3,14,8,8,14,12],[0,3,14],[9,3,14],[3,12,13,3,2,12],[0,13,3],[8,13,3],[2,12,1],[],[],[2,12,8],[],[],[3,9,13,9,12,13],[0,13,3],[8,13,3],[9,12,1],[],[],[9,12,8],[],[],[12,11,14,12,10,11,12,13,10],[11,14,0,10,0,13],[11,14,9,10,8,13],[11,12,1,11,14,12],[0,11,14],[9,11,14],[11,14,12,11,12,8],[0,11,14],[9,11,14],[10,2,12,10,12,13],[0,13,10],[8,13,10],[2,12,1],[],[],[2,12,8],[],[],[10,12,13,10,9,12],[0,13,10],
[8,13,10],[9,12,1],[],[],[9,12,8],[],[],[15,19,18],[19,18,0,19,0,15,0,18,15],[19,9,15,19,12,9,19,18,12,18,8,12,18,15,8,15,9,8],[18,1,19,1,15,19],[1,15,0,1,0,18,18,0,19,0,15,19],[1,15,9,1,12,18,18,12,19,15,19,9,12,9,19],[15,8,10,19,8,15,19,18,8,18,13,8],[13,0,18,18,0,19,0,15,19,0,10,15],[13,12,18,18,12,19,12,9,19,15,19,9,10,15,9],[19,18,2,2,18,15],[2,0,15,2,19,0,0,19,18,0,18,15],[2,8,15,2,19,12,12,19,18,12,18,8,15,8,18],[2,1,15,2,18,1,2,19,18],[1,15,2,1,0,18,18,0,19,0,2,19],[1,15,2,1,12,18,12,2,19,
18,12,19],[2,19,8,2,10,15,13,8,18,19,18,8],[13,0,18,18,0,19,0,2,19,10,15,2],[12,2,19,18,12,19,13,12,18,10,15,2],[15,11,9,18,15,9,18,9,14,19,18,14],[14,19,0,19,18,0,0,18,15,0,15,11],[14,19,12,12,19,18,12,18,8,15,8,18,11,8,15],[11,1,15,1,9,18,14,18,9,14,19,18],[1,15,11,1,0,18,0,19,18,0,14,19],[1,15,11,1,12,18,12,14,19,18,12,19],[11,10,15,9,13,8,9,14,13,14,18,13,14,19,18],[13,0,18,0,19,18,0,14,19,10,15,11],[12,14,19,18,12,19,13,12,18,10,15,11],[3,19,18],[3,0,18,3,19,0,0,19,18],[3,8,18,3,19,9,9,19,12,
12,18,8,12,19,18],[3,19,1,1,19,18],[1,0,18,18,0,19,0,3,19],[1,12,18,9,3,19,12,9,19,18,12,19],[3,19,8,13,8,18,18,8,19],[13,0,18,18,0,19,0,3,19],[9,3,19,12,9,19,18,12,19,13,12,18],[3,2,18,2,19,18],[2,19,0,0,19,18,0,18,3],[2,19,12,8,18,3,12,18,8,12,19,18],[2,19,18,2,18,1],[1,0,18,18,0,19,0,2,19],[1,12,18,12,2,19,18,12,19],[2,19,8,8,18,13,19,18,8],[13,0,18,18,0,19,0,2,19],[12,2,19,18,12,19,13,12,18],[3,9,18,14,19,18,14,18,9],[14,19,0,19,18,0,0,18,3],[8,18,3,12,18,8,12,19,18,14,19,12],[9,18,1,14,18,9,
14,19,18],[1,0,18,0,19,18,0,14,19],[1,12,18,12,14,19,18,12,19],[9,13,8,9,14,13,14,18,13,14,19,18],[13,0,18,0,19,18,0,14,19],[12,14,19,18,12,19,13,12,18],[18,10,11,19,18,11],[11,19,0,0,19,18,0,18,10],[11,19,9,12,19,18,9,19,12,12,18,8,10,8,18],[1,11,19,1,19,18],[1,0,18,18,0,19,0,11,19],[1,12,18,9,11,19,12,9,19,18,12,19],[13,8,18,18,8,19,11,19,8],[13,0,18,18,0,19,0,11,19],[9,11,19,12,9,19,18,12,19,13,12,18],[2,18,10,2,19,18],[2,19,0,0,19,18,0,18,10],[2,19,12,8,18,10,12,18,8,12,19,18],[2,19,18,2,18,1],
[1,0,18,18,0,19,0,2,19],[1,12,18,12,2,19,18,12,19],[2,19,8,8,18,13,19,18,8],[13,0,18,18,0,19,0,2,19],[12,2,19,18,12,19,13,12,18],[14,19,18,14,18,9,10,9,18],[14,19,0,19,18,0,0,18,10],[8,18,10,12,18,8,12,19,18,14,19,12],[9,18,1,14,18,9,14,19,18],[1,0,18,0,19,18,0,14,19],[1,12,18,12,14,19,18,12,19],[9,13,8,9,14,13,14,18,13,14,19,18],[13,0,18,0,19,18,0,14,19],[12,14,19,18,12,19,13,12,18],[19,4,15,4,18,15],[4,18,0,4,0,19,0,15,19,0,18,15],[4,18,8,4,9,19,9,15,19,9,8,15,15,8,18],[4,15,19,4,1,15,4,18,1],[1,
4,18,1,15,0,15,19,0,0,19,4],[1,4,18,1,15,9,9,19,4,15,19,9],[4,8,19,4,18,13,10,15,8,19,8,15],[10,15,0,15,19,0,0,19,4,13,4,18],[9,19,4,15,19,9,10,15,9,13,4,18],[4,18,15,4,15,2,4,2,19],[2,19,4,2,0,15,15,0,18,0,4,18],[2,19,4,2,8,15,8,4,18,15,8,18],[2,4,1,2,19,4,2,1,15,1,4,18],[1,15,2,1,4,18,19,4,2],[1,15,2,1,4,18,19,4,2],[2,4,8,2,19,4,2,10,15,13,4,18],[19,4,2,10,15,2,13,4,18],[19,4,2,10,15,2,13,4,18],[4,18,9,4,14,19,11,9,15,18,15,9],[11,0,15,15,0,18,0,4,18,14,19,4],[8,4,18,15,8,18,11,8,15,14,19,4],[9,
4,1,1,4,18,11,1,15,14,19,4],[1,15,11,1,4,18,19,4,14],[1,15,11,1,4,18,19,4,14],[9,4,8,11,10,15,13,4,18,14,19,4],[10,15,11,13,4,18,19,4,14],[10,15,11,13,4,18,19,4,14],[4,18,3,4,3,19],[3,19,0,3,0,18,19,4,0,0,4,18],[3,19,9,3,8,18,9,19,4,18,8,4],[3,4,1,3,19,4,1,4,18],[1,4,18,0,19,4,0,3,19],[1,4,18,19,9,3,19,4,9],[3,4,8,3,19,4,13,4,18],[0,19,4,0,3,19,13,4,18],[19,9,3,13,4,18,19,4,9],[3,2,4,3,4,18,2,19,4],[2,19,4,0,4,18,0,18,3],[2,19,4,18,3,8,18,8,4],[2,19,4,2,4,1,1,4,18],[1,4,18,19,4,2],[1,4,18,19,4,2],
[2,19,4,2,4,8,13,4,18],[19,4,2,13,4,18],[19,4,2,13,4,18],[3,9,4,3,4,18,14,19,4],[0,4,18,0,18,3,14,19,4],[18,3,8,14,19,4,18,8,4],[9,4,1,1,4,18,14,19,4],[1,4,18,19,4,14],[1,4,18,19,4,14],[9,4,8,13,4,18,14,19,4],[13,4,18,19,4,14],[13,4,18,19,4,14],[4,18,10,4,10,11,4,11,19],[11,19,4,11,4,0,0,4,10,18,10,4],[11,19,9,9,19,4,18,8,4,10,8,18],[1,4,18,11,4,1,11,19,4],[1,4,18,0,11,4,19,4,11],[1,4,18,19,4,9,19,9,11],[11,4,8,11,19,4,13,4,18],[0,11,4,13,4,18,19,4,11],[13,4,18,19,4,9,19,9,11],[2,19,4,10,2,4,10,4,
18],[2,19,4,0,4,10,18,10,4],[2,19,4,18,8,4,18,10,8],[2,19,4,2,4,1,1,4,18],[1,4,18,19,4,2],[1,4,18,19,4,2],[2,19,4,2,4,8,13,4,18],[19,4,2,13,4,18],[19,4,2,13,4,18],[10,9,4,10,4,18,14,19,4],[0,4,10,14,19,4,18,10,4],[14,19,4,18,8,4,18,10,8],[9,4,1,1,4,18,14,19,4],[1,4,18,19,4,14],[1,4,18,19,4,14],[9,4,8,13,4,18,14,19,4],[13,4,18,19,4,14],[13,4,18,19,4,14],[19,17,15,17,12,15,15,12,16,18,15,16],[0,19,17,0,15,19,0,18,15,0,16,18],[17,9,19,9,15,19,9,8,15,15,8,18,16,18,8],[16,18,1,1,15,12,15,17,12,15,19,17],
[1,16,18,1,15,0,15,19,0,19,17,0],[1,16,18,1,15,9,9,19,17,15,19,9],[16,18,13,10,12,8,10,15,12,15,19,17,15,17,12],[10,15,0,15,19,0,19,17,0,13,16,18],[9,19,17,15,19,9,10,15,9,13,16,18],[17,2,19,2,12,15,15,12,16,15,16,18],[2,19,17,2,0,15,15,0,18,18,0,16],[2,19,17,2,8,15,8,16,18,15,8,18],[2,19,17,2,1,15,2,12,1,1,16,18],[1,15,2,1,16,18,19,17,2],[1,15,2,1,16,18,19,17,2],[2,19,17,2,10,15,2,12,8,13,16,18],[19,17,2,10,15,2,13,16,18],[19,17,2,10,15,2,13,16,18],[17,14,19,11,9,12,11,12,15,15,16,18,15,12,16],[11,
0,15,15,0,18,18,0,16,14,19,17],[8,16,18,15,8,18,11,8,15,14,19,17],[9,12,1,1,16,18,11,1,15,14,19,17],[1,15,11,1,16,18,19,17,14],[1,15,11,1,16,18,19,17,14],[9,12,8,11,10,15,13,16,18,14,19,17],[10,15,11,13,16,18,19,17,14],[10,15,11,13,16,18,19,17,14],[17,12,3,17,3,19,3,16,18,12,16,3],[3,19,17,3,17,0,3,0,16,3,16,18],[3,19,9,3,8,18,9,19,17,18,8,16],[3,19,17,3,17,12,3,12,1,1,16,18],[1,16,18,0,3,17,19,17,3],[1,16,18,19,9,3,19,17,9],[3,19,17,3,17,12,3,12,8,13,16,18],[0,3,17,19,17,3,13,16,18],[19,9,3,13,16,
18,19,17,9],[3,16,18,3,12,16,3,2,12,2,19,17],[2,19,17,0,16,3,18,3,16],[2,19,17,18,3,8,18,8,16],[2,19,17,2,12,1,1,16,18],[1,16,18,19,17,2],[1,16,18,19,17,2],[2,19,17,2,12,8,13,16,18],[19,17,2,13,16,18],[19,17,2,13,16,18],[3,16,18,3,12,16,3,9,12,14,19,17],[0,16,3,18,3,16,14,19,17],[18,3,8,14,19,17,18,8,16],[9,12,1,1,16,18,14,19,17],[1,16,18,19,17,14],[1,16,18,19,17,14],[9,12,8,13,16,18,14,19,17],[13,16,18,19,17,14],[13,16,18,19,17,14],[17,12,11,17,11,19,12,10,11,16,10,12,16,18,10],[11,17,0,11,19,17,
0,16,10,18,10,16],[11,19,17,11,17,9,10,16,18,10,8,16],[1,16,18,11,19,17,11,17,12,11,12,1],[1,16,18,0,11,17,19,17,11],[1,16,18,17,9,11,19,17,11],[11,19,17,11,17,12,11,12,8,13,16,18],[0,11,17,13,16,18,19,17,11],[13,16,18,17,9,11,19,17,11],[2,19,17,10,16,18,10,12,16,10,2,12],[2,19,17,0,16,10,18,10,16],[2,19,17,16,10,8,18,10,16],[2,19,17,2,12,1,1,16,18],[1,16,18,19,17,2],[1,16,18,19,17,2],[2,19,17,2,12,8,13,16,18],[19,17,2,13,16,18],[19,17,2,13,16,18],[10,16,18,10,12,16,10,9,12,14,19,17],[0,16,10,14,
19,17,18,10,16],[14,19,17,16,10,8,18,10,16],[9,12,1,1,16,18,14,19,17],[1,16,18,19,17,14],[1,16,18,19,17,14],[9,12,8,13,16,18,14,19,17],[13,16,18,19,17,14],[13,16,18,19,17,14],[5,15,19],[5,15,0,5,0,19,0,15,19],[5,15,8,5,12,19,12,9,19,9,8,15,9,15,19],[5,1,19,1,15,19],[1,15,0,15,19,0,0,19,5],[1,15,9,9,19,12,15,19,9,12,19,5],[5,8,19,10,15,8,15,19,8],[10,15,0,15,19,0,0,19,5],[9,19,12,15,19,9,10,15,9,12,19,5],[5,15,2,5,2,19],[2,19,0,2,0,15,19,5,0,0,5,15],[2,19,12,2,8,15,12,19,5,15,8,5],[2,5,1,2,19,5,2,
1,15],[1,15,2,0,19,5,0,2,19],[1,15,2,19,12,2,19,5,12],[2,5,8,2,19,5,2,10,15],[0,19,5,0,2,19,10,15,2],[19,12,2,10,15,2,19,5,12],[5,15,11,5,11,9,5,9,14,5,14,19],[14,19,5,14,5,0,0,5,11,15,11,5],[14,19,12,12,19,5,15,8,5,11,8,15],[11,1,15,9,5,1,14,5,9,14,19,5],[1,15,11,0,14,5,19,5,14],[1,15,11,19,5,12,19,12,14],[11,10,15,9,5,8,14,5,9,14,19,5],[0,14,5,10,15,11,19,5,14],[10,15,11,19,5,12,19,12,14],[5,3,19],[3,0,5,3,19,0,0,19,5],[3,8,5,3,19,9,9,19,12,12,19,5],[3,19,1,1,19,5],[0,19,5,0,3,19],[9,3,19,12,9,
19,12,19,5],[3,19,8,19,5,8],[0,19,5,0,3,19],[9,3,19,12,9,19,12,19,5],[3,2,5,2,19,5],[2,19,0,19,5,0,0,5,3],[2,19,12,12,19,5,8,5,3],[2,19,5,2,5,1],[0,19,5,0,2,19],[19,12,2,19,5,12],[2,19,5,2,5,8],[0,19,5,0,2,19],[19,12,2,19,5,12],[3,9,5,9,14,5,14,19,5],[14,5,0,14,19,5,0,5,3],[12,19,5,14,19,12,8,5,3],[9,5,1,14,5,9,14,19,5],[0,14,5,19,5,14],[19,12,14,19,5,12],[9,5,8,14,5,9,14,19,5],[0,14,5,19,5,14],[19,12,14,19,5,12],[5,11,19,5,10,11],[10,0,5,0,19,5,11,19,0],[10,8,5,9,19,12,11,19,9,12,19,5],[1,11,5,19,
5,11],[0,19,5,0,11,19],[9,11,19,12,9,19,12,19,5],[19,5,8,11,19,8],[0,19,5,0,11,19],[9,11,19,12,9,19,12,19,5],[10,2,5,2,19,5],[2,19,0,19,5,0,0,5,10],[2,19,12,12,19,5,8,5,10],[2,19,5,2,5,1],[0,19,5,0,2,19],[19,12,2,19,5,12],[2,19,5,2,5,8],[0,19,5,0,2,19],[19,12,2,19,5,12],[10,9,5,9,14,5,14,19,5],[14,5,0,14,19,5,0,5,10],[12,19,5,14,19,12,8,5,10],[9,5,1,14,5,9,14,19,5],[0,14,5,19,5,14],[19,12,14,19,5,12],[9,5,8,14,5,9,14,19,5],[0,14,5,19,5,14],[19,12,14,19,5,12],[5,15,4,4,15,19],[4,0,19,0,15,19,0,5,15],
[4,9,19,8,5,15,9,8,15,9,15,19],[4,15,19,4,1,15],[1,15,0,15,19,0,0,19,4],[1,15,9,9,19,4,15,19,9],[4,8,19,8,10,15,19,8,15],[10,15,0,15,19,0,0,19,4],[9,19,4,15,19,9,10,15,9],[4,5,2,4,2,19,2,5,15],[2,19,4,2,0,15,15,0,5],[2,19,4,2,8,15,8,5,15],[2,4,1,2,19,4,2,1,15],[1,15,2,19,4,2],[1,15,2,19,4,2],[2,4,8,2,19,4,2,10,15],[19,4,2,10,15,2],[19,4,2,10,15,2],[4,5,9,4,14,19,9,5,11,11,5,15],[11,0,5,11,5,15,14,19,4],[8,5,15,11,8,15,14,19,4],[9,4,1,11,1,15,14,19,4],[1,15,11,19,4,14],[1,15,11,19,4,14],[9,4,8,11,
10,15,14,19,4],[10,15,11,19,4,14],[10,15,11,19,4,14],[4,5,3,4,3,19],[3,19,0,3,0,5,19,4,0],[3,19,9,3,8,5,9,19,4],[3,4,1,3,19,4],[0,19,4,0,3,19],[19,9,3,19,4,9],[3,4,8,3,19,4],[0,19,4,0,3,19],[19,9,3,19,4,9],[3,2,4,3,4,5,2,19,4],[2,19,4,0,5,3],[2,19,4,8,5,3],[2,19,4,2,4,1],[19,4,2],[19,4,2],[2,19,4,2,4,8],[19,4,2],[19,4,2],[3,9,5,9,4,5,14,19,4],[0,5,3,14,19,4],[8,5,3,14,19,4],[9,4,1,14,19,4],[19,4,14],[19,4,14],[9,4,8,14,19,4],[19,4,14],[19,4,14],[4,5,10,4,11,19,4,10,11],[11,19,4,11,4,0,10,0,5],[11,
19,9,9,19,4,10,8,5],[11,19,4,11,4,1],[0,11,4,19,4,11],[19,9,11,19,4,9],[11,19,4,11,4,8],[0,11,4,19,4,11],[19,9,11,19,4,9],[10,4,5,10,2,4,2,19,4],[2,19,4,0,5,10],[2,19,4,8,5,10],[2,19,4,2,4,1],[19,4,2],[19,4,2],[2,19,4,2,4,8],[19,4,2],[19,4,2],[10,9,5,9,4,5,14,19,4],[0,5,10,14,19,4],[8,5,10,14,19,4],[9,4,1,14,19,4],[19,4,14],[19,4,14],[9,4,8,14,19,4],[19,4,14],[19,4,14],[5,15,12,15,19,17,15,17,12],[0,19,17,0,15,19,0,5,15],[8,5,15,9,8,15,9,15,19,17,9,19],[12,1,15,12,15,17,17,15,19],[1,15,0,15,19,0,
19,17,0],[1,15,9,9,19,17,15,19,9],[8,10,12,12,10,15,12,15,17,17,15,19],[10,15,0,15,19,0,19,17,0],[9,19,17,15,19,9,10,15,9],[12,5,2,2,5,15,17,2,19],[2,19,17,2,0,15,15,0,5],[2,19,17,2,8,15,8,5,15],[2,19,17,2,1,15,2,12,1],[1,15,2,19,17,2],[1,15,2,19,17,2],[2,19,17,2,10,15,2,12,8],[19,17,2,10,15,2],[19,17,2,10,15,2],[12,5,9,9,5,11,17,14,19,11,5,15],[11,0,5,11,5,15,14,19,17],[8,5,15,11,8,15,14,19,17],[9,12,1,11,1,15,14,19,17],[1,15,11,19,17,14],[1,15,11,19,17,14],[9,12,8,11,10,15,14,19,17],[10,15,11,19,
17,14],[10,15,11,19,17,14],[17,12,3,17,3,19,12,5,3],[3,19,17,3,17,0,3,0,5],[3,19,9,3,8,5,9,19,17],[3,19,17,3,17,12,3,12,1],[0,3,17,19,17,3],[19,9,3,19,17,9],[3,19,17,3,17,12,3,12,8],[0,3,17,19,17,3],[19,9,3,19,17,9],[3,12,5,3,2,12,2,19,17],[2,19,17,0,5,3],[2,19,17,8,5,3],[2,19,17,2,12,1],[19,17,2],[19,17,2],[2,19,17,2,12,8],[19,17,2],[19,17,2],[3,9,5,14,19,17,9,12,5],[0,5,3,14,19,17],[8,5,3,14,19,17],[9,12,1,14,19,17],[19,17,14],[19,17,14],[9,12,8,14,19,17],[19,17,14],[19,17,14],[17,12,11,17,11,19,
12,10,11,12,5,10],[11,17,0,11,19,17,10,0,5],[11,19,17,11,17,9,10,8,5],[11,17,12,11,19,17,11,12,1],[0,11,17,19,17,11],[19,17,11,17,9,11],[11,17,12,11,19,17,11,12,8],[0,11,17,19,17,11],[19,17,11,17,9,11],[10,2,12,10,12,5,2,19,17],[2,19,17,0,5,10],[2,19,17,8,5,10],[2,19,17,2,12,1],[19,17,2],[19,17,2],[2,19,17,2,12,8],[19,17,2],[19,17,2],[10,12,5,10,9,12,14,19,17],[0,5,10,14,19,17],[8,5,10,14,19,17],[9,12,1,14,19,17],[19,17,14],[19,17,14],[9,12,8,14,19,17],[19,17,14],[19,17,14],[15,16,13,19,16,15],[16,
0,19,0,15,19,0,13,15],[16,12,19,9,15,19,12,9,19,9,8,15,13,15,8],[1,19,16,1,15,19],[1,15,0,15,19,0,0,19,16],[1,15,9,9,19,12,15,19,9,12,19,16],[10,15,8,15,19,8,16,8,19],[10,15,0,15,19,0,0,19,16],[9,19,12,15,19,9,10,15,9,12,19,16],[16,13,2,16,2,19,2,13,15],[2,19,16,2,16,0,2,0,13,2,13,15],[2,19,12,2,8,15,12,19,16,15,8,13],[2,19,16,2,16,1,2,1,15],[1,15,2,0,2,16,19,16,2],[1,15,2,19,12,2,19,16,12],[2,19,16,2,16,8,2,10,15],[0,2,16,19,16,2,10,15,2],[19,12,2,10,15,2,19,16,12],[16,13,9,16,9,14,16,14,19,13,11,
9,13,15,11],[14,16,0,14,19,16,0,13,11,15,11,13],[14,19,16,14,16,12,11,13,15,11,8,13],[11,1,15,14,19,16,14,16,9,9,16,1],[1,15,11,0,14,16,19,16,14],[1,15,11,16,12,14,19,16,14],[11,10,15,14,19,16,14,16,9,9,16,8],[0,14,16,10,15,11,19,16,14],[10,15,11,16,12,14,19,16,14],[13,3,16,3,19,16],[3,19,0,3,0,13,0,19,16],[3,19,9,3,8,13,9,19,12,12,19,16],[3,19,16,3,16,1],[0,19,16,0,3,19],[9,3,19,12,9,19,12,19,16],[3,19,8,19,16,8],[0,19,16,0,3,19],[9,3,19,12,9,19,12,19,16],[3,2,13,13,2,16,2,19,16],[2,19,16,2,16,0,
0,13,3],[2,19,12,12,19,16,8,13,3],[2,19,16,2,16,1],[0,2,16,19,16,2],[19,12,2,19,16,12],[2,19,16,2,16,8],[0,2,16,19,16,2],[19,12,2,19,16,12],[3,9,13,13,9,16,14,19,16,9,14,16],[14,16,0,14,19,16,0,13,3],[14,16,12,14,19,16,8,13,3],[9,16,1,14,16,9,14,19,16],[0,14,16,19,16,14],[19,16,14,16,12,14],[9,16,8,14,16,9,14,19,16],[0,14,16,19,16,14],[19,16,14,16,12,14],[13,10,11,16,13,11,16,11,19],[10,0,13,0,19,16,11,19,0],[10,8,13,9,19,12,11,19,9,12,19,16],[1,11,16,19,16,11],[0,19,16,0,11,19],[9,11,19,12,9,19,
12,19,16],[11,19,16,11,16,8],[0,19,16,0,11,19],[9,11,19,12,9,19,12,19,16],[10,2,13,13,2,16,2,19,16],[2,19,16,2,16,0,0,13,10],[2,19,12,12,19,16,8,13,10],[2,19,16,2,16,1],[0,2,16,19,16,2],[19,12,2,19,16,12],[2,19,16,2,16,8],[0,2,16,19,16,2],[19,12,2,19,16,12],[10,9,13,13,9,16,9,14,16,14,19,16],[14,16,0,14,19,16,0,13,10],[14,16,12,14,19,16,8,13,10],[9,16,1,14,16,9,14,19,16],[0,14,16,19,16,14],[19,16,14,16,12,14],[9,16,8,14,16,9,14,19,16],[0,14,16,19,16,14],[19,16,14,16,12,14],[4,13,15,4,15,19],[4,0,
19,0,15,19,0,13,15],[4,9,19,8,13,15,9,8,15,9,15,19],[4,15,19,4,1,15],[1,15,0,15,19,0,0,19,4],[1,15,9,9,19,4,15,19,9],[4,8,19,8,10,15,19,8,15],[10,15,0,15,19,0,0,19,4],[9,19,4,15,19,9,10,15,9],[4,2,19,4,13,2,2,13,15],[2,19,4,2,13,15,2,0,13],[2,19,4,2,8,15,8,13,15],[2,4,1,2,19,4,2,1,15],[1,15,2,19,4,2],[1,15,2,19,4,2],[2,4,8,2,19,4,2,10,15],[19,4,2,10,15,2],[19,4,2,10,15,2],[4,14,19,4,13,9,9,13,11,11,13,15],[11,0,13,11,13,15,14,19,4],[11,8,13,11,13,15,14,19,4],[9,4,1,11,1,15,14,19,4],[1,15,11,19,4,
14],[1,15,11,19,4,14],[9,4,8,11,10,15,14,19,4],[10,15,11,19,4,14],[10,15,11,19,4,14],[4,3,19,4,13,3],[3,19,0,3,0,13,19,4,0],[3,19,9,3,8,13,9,19,4],[3,4,1,3,19,4],[0,19,4,0,3,19],[19,9,3,19,4,9],[3,4,8,3,19,4],[0,19,4,0,3,19],[19,9,3,19,4,9],[3,2,13,13,2,4,2,19,4],[2,19,4,0,13,3],[2,19,4,8,13,3],[2,19,4,2,4,1],[19,4,2],[19,4,2],[2,19,4,2,4,8],[19,4,2],[19,4,2],[3,9,13,9,4,13,14,19,4],[0,13,3,14,19,4],[8,13,3,14,19,4],[9,4,1,14,19,4],[19,4,14],[19,4,14],[9,4,8,14,19,4],[19,4,14],[19,4,14],[4,11,19,
4,10,11,4,13,10],[11,19,4,11,4,0,10,0,13],[11,19,9,9,19,4,10,8,13],[11,19,4,11,4,1],[0,11,4,19,4,11],[19,9,11,19,4,9],[11,19,4,11,4,8],[0,11,4,19,4,11],[19,9,11,19,4,9],[10,4,13,10,2,4,2,19,4],[2,19,4,0,13,10],[2,19,4,8,13,10],[2,19,4,2,4,1],[19,4,2],[19,4,2],[2,19,4,2,4,8],[19,4,2],[19,4,2],[10,9,13,9,4,13,14,19,4],[0,13,10,14,19,4],[8,13,10,14,19,4],[9,4,1,14,19,4],[19,4,14],[19,4,14],[9,4,8,14,19,4],[19,4,14],[19,4,14],[13,15,12,15,17,12,15,19,17],[0,19,17,0,15,19,0,13,15],[8,13,15,9,8,15,9,15,
19,17,9,19],[12,1,15,12,15,17,17,15,19],[1,15,0,15,19,0,19,17,0],[1,15,9,9,19,17,15,19,9],[8,10,12,12,10,15,12,15,17,17,15,19],[10,15,0,15,19,0,19,17,0],[9,19,17,15,19,9,10,15,9],[12,13,2,2,13,15,17,2,19],[2,19,17,2,13,15,2,0,13],[2,19,17,2,8,15,8,13,15],[2,19,17,2,1,15,2,12,1],[1,15,2,19,17,2],[1,15,2,19,17,2],[2,19,17,2,10,15,2,12,8],[19,17,2,10,15,2],[19,17,2,10,15,2],[12,13,9,11,13,15,9,13,11,17,14,19],[11,0,13,11,13,15,14,19,17],[11,8,13,11,13,15,14,19,17],[9,12,1,11,1,15,14,19,17],[1,15,11,
19,17,14],[1,15,11,19,17,14],[9,12,8,11,10,15,14,19,17],[10,15,11,19,17,14],[10,15,11,19,17,14],[17,12,3,17,3,19,12,13,3],[3,19,17,3,17,0,3,0,13],[3,19,9,3,8,13,9,19,17],[3,19,17,3,17,12,3,12,1],[0,3,17,19,17,3],[19,9,3,19,17,9],[3,19,17,3,17,12,3,12,8],[0,3,17,19,17,3],[19,9,3,19,17,9],[3,12,13,3,2,12,2,19,17],[2,19,17,0,13,3],[2,19,17,8,13,3],[2,19,17,2,12,1],[19,17,2],[19,17,2],[2,19,17,2,12,8],[19,17,2],[19,17,2],[3,9,13,9,12,13,14,19,17],[0,13,3,14,19,17],[8,13,3,14,19,17],[9,12,1,14,19,17],
[19,17,14],[19,17,14],[9,12,8,14,19,17],[19,17,14],[19,17,14],[17,12,11,17,11,19,12,10,11,12,13,10],[11,17,0,11,19,17,10,0,13],[11,19,17,11,17,9,10,8,13],[11,17,12,11,19,17,11,12,1],[0,11,17,19,17,11],[19,17,11,17,9,11],[11,17,12,11,19,17,11,12,8],[0,11,17,19,17,11],[19,17,11,17,9,11],[10,2,12,10,12,13,2,19,17],[2,19,17,0,13,10],[2,19,17,8,13,10],[2,19,17,2,12,1],[19,17,2],[19,17,2],[2,19,17,2,12,8],[19,17,2],[19,17,2],[10,12,13,10,9,12,14,19,17],[0,13,10,14,19,17],[8,13,10,14,19,17],[9,12,1,14,19,
17],[19,17,14],[19,17,14],[9,12,8,14,19,17],[19,17,14],[19,17,14],[6,18,15],[6,0,15,6,18,0,0,18,15],[6,9,15,6,18,12,12,18,8,8,15,9,8,18,15],[6,1,15,6,18,1],[1,0,18,1,15,0,18,0,6,0,15,6],[1,12,18,1,15,9,12,6,18,15,6,9],[6,10,15,6,8,10,6,13,8,6,18,13],[13,6,18,13,0,6,0,10,6,15,6,10],[13,12,18,12,6,18,15,6,9,10,15,9],[6,18,2,2,18,15],[2,0,15,15,0,18,0,6,18],[2,8,15,8,12,18,15,8,18,12,6,18],[2,6,1,2,1,15,1,6,18],[1,15,2,1,0,18,18,0,6],[1,15,2,1,12,18,12,6,18],[2,6,8,2,10,15,8,6,13,13,6,18],[13,0,6,13,
6,18,10,15,2],[12,6,18,13,12,18,10,15,2],[6,18,9,11,9,15,15,9,18],[11,0,15,15,0,18,0,6,18],[8,12,18,15,8,18,11,8,15,12,6,18],[9,6,1,1,6,18,11,1,15],[1,15,11,1,0,18,18,0,6],[1,15,11,1,12,18,12,6,18],[9,6,8,8,6,13,11,10,15,13,6,18],[13,0,6,13,6,18,10,15,11],[12,6,18,13,12,18,10,15,11],[6,18,3],[3,6,0,3,0,18,0,6,18],[3,6,9,3,8,18,8,12,18,12,6,18],[3,6,1,1,6,18],[1,0,18,18,0,6,0,3,6],[1,12,18,12,6,18,9,3,6],[3,6,8,8,6,13,13,6,18],[13,0,6,13,6,18,0,3,6],[12,6,18,13,12,18,9,3,6],[3,2,18,2,6,18],[0,6,18,
0,18,3],[8,18,3,12,18,8,12,6,18],[2,6,1,1,6,18],[1,0,18,18,0,6],[1,12,18,12,6,18],[2,6,8,8,6,13,13,6,18],[13,0,6,13,6,18],[12,6,18,13,12,18],[3,9,18,18,9,6],[0,6,18,0,18,3],[8,18,3,12,18,8,12,6,18],[9,6,1,1,6,18],[1,0,18,18,0,6],[1,12,18,12,6,18],[8,6,13,9,6,8,13,6,18],[13,0,6,13,6,18],[12,6,18,13,12,18],[6,18,10,6,10,11],[11,6,0,0,6,18,10,0,18],[11,6,9,8,12,18,10,8,18,12,6,18],[11,6,1,1,6,18],[1,0,18,18,0,6,0,11,6],[1,12,18,12,6,18,9,11,6],[11,6,8,8,6,13,13,6,18],[13,0,6,13,6,18,0,11,6],[12,6,18,
13,12,18,9,11,6],[2,6,10,18,10,6],[0,6,18,0,18,10],[8,18,10,12,18,8,12,6,18],[2,6,1,1,6,18],[1,0,18,18,0,6],[1,12,18,12,6,18],[2,6,8,8,6,13,13,6,18],[13,0,6,13,6,18],[12,6,18,13,12,18],[18,9,6,10,9,18],[0,6,18,0,18,10],[8,18,10,12,18,8,12,6,18],[9,6,1,1,6,18],[1,0,18,18,0,6],[1,12,18,12,6,18],[8,6,13,9,6,8,13,6,18],[13,0,6,13,6,18],[12,6,18,13,12,18],[6,4,15,4,18,15],[4,18,0,0,18,15,0,15,6],[4,18,8,8,15,9,8,18,15,9,15,6],[4,1,6,4,18,1,1,15,6],[1,4,18,1,15,0,15,6,0],[1,4,18,1,15,9,9,15,6],[4,8,6,4,
18,13,8,10,6,10,15,6],[10,6,0,10,15,6,13,4,18],[9,15,6,10,15,9,13,4,18],[4,18,15,4,15,2],[2,0,15,15,0,18,0,4,18],[2,8,15,8,4,18,15,8,18],[2,4,1,2,1,15,1,4,18],[1,15,2,1,4,18],[1,15,2,1,4,18],[2,4,8,2,10,15,13,4,18],[10,15,2,13,4,18],[10,15,2,13,4,18],[4,18,9,9,15,11,18,15,9],[11,0,15,15,0,18,0,4,18],[8,4,18,15,8,18,11,8,15],[9,4,1,1,4,18,11,1,15],[1,15,11,1,4,18],[1,15,11,1,4,18],[9,4,8,11,10,15,13,4,18],[10,15,11,13,4,18],[10,15,11,13,4,18],[4,3,6,4,18,3],[3,0,18,3,6,0,18,0,4],[3,8,18,3,6,9,8,4,
18],[3,4,1,3,6,4,1,4,18],[1,4,18,0,3,6],[1,4,18,9,3,6],[3,6,8,8,6,4,13,4,18],[0,3,6,13,4,18],[9,3,6,13,4,18],[3,2,4,3,4,18],[0,4,18,0,18,3],[18,3,8,18,8,4],[2,4,1,1,4,18],[1,4,18],[1,4,18],[2,4,8,13,4,18],[13,4,18],[13,4,18],[3,9,4,3,4,18],[0,4,18,0,18,3],[18,3,8,18,8,4],[9,4,1,1,4,18],[1,4,18],[1,4,18],[9,4,8,13,4,18],[13,4,18],[13,4,18],[4,11,6,4,18,10,4,10,11],[10,4,18,10,0,4,11,6,0],[10,8,18,8,4,18,11,6,9],[11,6,4,11,4,1,1,4,18],[1,4,18,0,11,6],[1,4,18,9,11,6],[11,6,8,8,6,4,13,4,18],[0,11,6,13,
4,18],[9,11,6,13,4,18],[10,4,18,10,2,4],[0,4,10,18,10,4],[18,10,8,18,8,4],[2,4,1,1,4,18],[1,4,18],[1,4,18],[2,4,8,13,4,18],[13,4,18],[13,4,18],[10,4,18,10,9,4],[0,4,10,18,10,4],[18,10,8,18,8,4],[9,4,1,1,4,18],[1,4,18],[1,4,18],[9,4,8,13,4,18],[13,4,18],[13,4,18],[6,12,15,15,16,18,15,12,16],[0,16,18,0,18,15,0,15,6],[8,15,9,8,18,15,16,18,8,9,15,6],[12,1,6,1,15,6,16,18,1],[1,16,18,1,15,0,15,6,0],[1,16,18,1,15,9,9,15,6],[12,8,6,8,10,6,16,18,13,10,15,6],[10,6,0,10,15,6,13,16,18],[9,15,6,10,15,9,13,16,
18],[12,15,2,12,16,15,16,18,15],[2,0,15,15,0,18,18,0,16],[2,8,15,8,16,18,15,8,18],[2,1,15,2,12,1,1,16,18],[1,15,2,1,16,18],[1,15,2,1,16,18],[2,10,15,2,12,8,13,16,18],[10,15,2,13,16,18],[10,15,2,13,16,18],[9,12,11,12,15,11,12,16,15,16,18,15],[11,0,15,15,0,18,18,0,16],[8,16,18,15,8,18,11,8,15],[9,12,1,1,16,18,11,1,15],[1,15,11,1,16,18],[1,15,11,1,16,18],[9,12,8,11,10,15,13,16,18],[10,15,11,13,16,18],[10,15,11,13,16,18],[16,3,12,16,18,3,12,3,6],[3,16,18,3,0,16,3,6,0],[3,8,18,3,6,9,8,16,18],[3,6,12,3,
12,1,1,16,18],[1,16,18,0,3,6],[1,16,18,9,3,6],[3,6,8,13,16,18,8,6,12],[0,3,6,13,16,18],[9,3,6,13,16,18],[3,16,18,3,12,16,3,2,12],[0,16,3,18,3,16],[18,3,8,18,8,16],[2,12,1,1,16,18],[1,16,18],[1,16,18],[2,12,8,13,16,18],[13,16,18],[13,16,18],[3,16,18,3,12,16,3,9,12],[0,16,3,18,3,16],[18,3,8,18,8,16],[9,12,1,1,16,18],[1,16,18],[1,16,18],[9,12,8,13,16,18],[13,16,18],[13,16,18],[16,10,12,16,18,10,12,11,6,12,10,11],[10,0,16,10,16,18,11,6,0],[10,16,18,10,8,16,11,6,9],[11,12,1,11,6,12,1,16,18],[1,16,18,0,
11,6],[1,16,18,9,11,6],[11,6,12,11,12,8,13,16,18],[0,11,6,13,16,18],[9,11,6,13,16,18],[10,12,16,10,16,18,10,2,12],[0,16,10,18,10,16],[18,10,16,16,10,8],[2,12,1,1,16,18],[1,16,18],[1,16,18],[2,12,8,13,16,18],[13,16,18],[13,16,18],[10,12,16,10,16,18,10,9,12],[0,16,10,18,10,16],[18,10,16,16,10,8],[9,12,1,1,16,18],[1,16,18],[1,16,18],[9,12,8,13,16,18],[13,16,18],[13,16,18],[6,5,15],[5,0,6,5,15,0,0,15,6],[5,12,6,5,15,8,8,15,9,9,15,6],[5,1,6,1,15,6],[1,15,0,15,6,0,0,6,5],[1,15,9,9,15,6,12,6,5],[5,8,6,8,
10,6,10,15,6],[10,6,0,10,15,6,0,6,5],[9,15,6,10,15,9,12,6,5],[5,2,6,5,15,2],[2,0,15,15,0,5,0,6,5],[2,8,15,8,5,15,12,6,5],[2,5,1,2,6,5,2,1,15],[1,15,2,0,6,5],[1,15,2,12,6,5],[2,6,8,2,10,15,8,6,5],[0,6,5,10,15,2],[12,6,5,10,15,2],[5,9,6,5,15,11,5,11,9],[11,5,15,11,0,5,0,6,5],[11,8,15,8,5,15,12,6,5],[9,6,5,9,5,1,11,1,15],[1,15,11,0,6,5],[1,15,11,12,6,5],[9,6,8,8,6,5,11,10,15],[0,6,5,10,15,11],[12,6,5,10,15,11],[5,3,6],[3,0,5,3,6,0,0,6,5],[3,8,5,3,6,9,12,6,5],[3,6,1,1,6,5],[0,6,5,0,3,6],[9,3,6,12,6,5],
[3,6,8,8,6,5],[0,6,5,0,3,6],[9,3,6,12,6,5],[3,2,5,2,6,5],[6,5,0,0,5,3],[6,5,12,8,5,3],[2,6,5,2,5,1],[0,6,5],[12,6,5],[2,6,8,8,6,5],[0,6,5],[12,6,5],[3,9,5,9,6,5],[6,5,0,0,5,3],[6,5,12,8,5,3],[9,5,1,9,6,5],[0,6,5],[12,6,5],[8,6,5,9,6,8],[0,6,5],[12,6,5],[5,10,6,10,11,6],[10,0,5,0,6,5,11,6,0],[10,8,5,11,6,9,12,6,5],[11,6,1,1,6,5],[0,6,5,0,11,6],[9,11,6,12,6,5],[8,6,5,11,6,8],[0,6,5,0,11,6],[9,11,6,12,6,5],[10,2,5,2,6,5],[6,5,0,0,5,10],[6,5,12,8,5,10],[2,6,5,2,5,1],[0,6,5],[12,6,5],[2,6,8,8,6,5],[0,
6,5],[12,6,5],[10,9,5,9,6,5],[6,5,0,0,5,10],[6,5,12,8,5,10],[9,5,1,9,6,5],[0,6,5],[12,6,5],[8,6,5,9,6,8],[0,6,5],[12,6,5],[5,15,4,4,15,6],[0,15,6,0,5,15],[8,5,15,9,8,15,9,15,6],[4,1,6,1,15,6],[1,15,0,15,6,0],[1,15,9,9,15,6],[4,8,6,8,10,6,10,15,6],[10,6,0,10,15,6],[9,15,6,10,15,9],[4,5,2,2,5,15],[2,0,15,15,0,5],[2,8,15,8,5,15],[2,4,1,2,1,15],[1,15,2],[1,15,2],[2,4,8,2,10,15],[10,15,2],[10,15,2],[4,5,9,9,5,11,11,5,15],[11,0,5,11,5,15],[8,5,15,11,8,15],[9,4,1,11,1,15],[1,15,11],[1,15,11],[9,4,8,11,10,
15],[10,15,11],[10,15,11],[4,5,3,4,3,6],[3,6,0,3,0,5],[3,6,9,3,8,5],[3,4,1,3,6,4],[0,3,6],[9,3,6],[3,6,8,8,6,4],[0,3,6],[9,3,6],[3,2,4,3,4,5],[0,5,3],[8,5,3],[2,4,1],[],[],[2,4,8],[],[],[3,9,5,9,4,5],[0,5,3],[8,5,3],[9,4,1],[],[],[9,4,8],[],[],[4,5,10,4,11,6,4,10,11],[11,6,0,10,0,5],[11,6,9,10,8,5],[11,6,4,11,4,1],[0,11,6],[9,11,6],[11,6,8,8,6,4],[0,11,6],[9,11,6],[10,4,5,10,2,4],[0,5,10],[8,5,10],[2,4,1],[],[],[2,4,8],[],[],[10,9,5,9,4,5],[0,5,10],[8,5,10],[9,4,1],[],[],[9,4,8],[],[],[5,15,12,15,
6,12],[0,15,6,0,5,15],[8,5,15,9,8,15,9,15,6],[12,1,6,1,15,6],[1,15,0,15,6,0],[1,15,9,9,15,6],[8,10,6,12,8,6,10,15,6],[10,6,0,10,15,6],[9,15,6,10,15,9],[12,5,2,2,5,15],[2,0,15,15,0,5],[2,8,15,8,5,15],[2,1,15,2,12,1],[1,15,2],[1,15,2],[2,10,15,2,12,8],[10,15,2],[10,15,2],[12,5,9,9,5,11,11,5,15],[11,0,5,11,5,15],[8,5,15,11,8,15],[9,12,1,11,1,15],[1,15,11],[1,15,11],[9,12,8,11,10,15],[10,15,11],[10,15,11],[12,3,6,12,5,3],[3,6,0,3,0,5],[3,6,9,3,8,5],[3,6,12,3,12,1],[0,3,6],[9,3,6],[3,6,8,8,6,12],[0,3,
6],[9,3,6],[3,12,5,3,2,12],[0,5,3],[8,5,3],[2,12,1],[],[],[2,12,8],[],[],[3,9,5,9,12,5],[0,5,3],[8,5,3],[9,12,1],[],[],[9,12,8],[],[],[12,11,6,12,10,11,12,5,10],[11,6,0,10,0,5],[11,6,9,10,8,5],[11,12,1,11,6,12],[0,11,6],[9,11,6],[11,6,12,11,12,8],[0,11,6],[9,11,6],[10,2,12,10,12,5],[0,5,10],[8,5,10],[2,12,1],[],[],[2,12,8],[],[],[10,12,5,10,9,12],[0,5,10],[8,5,10],[9,12,1],[],[],[9,12,8],[],[],[6,13,15,6,16,13],[16,0,6,0,15,6,13,15,0],[16,12,6,8,15,9,13,15,8,9,15,6],[16,1,6,1,15,6],[1,15,0,15,6,0,
0,6,16],[1,15,9,9,15,6,12,6,16],[16,8,6,8,10,6,10,15,6],[10,6,0,10,15,6,0,6,16],[9,15,6,10,15,9,12,6,16],[16,13,2,16,2,6,13,15,2],[2,13,15,2,0,13,0,6,16],[2,8,15,8,13,15,12,6,16],[2,6,16,2,16,1,2,1,15],[1,15,2,0,6,16],[1,15,2,12,6,16],[2,6,8,2,10,15,8,6,16],[0,6,16,10,15,2],[12,6,16,10,15,2],[16,13,9,16,9,6,13,11,9,13,15,11],[11,0,13,11,13,15,0,6,16],[11,13,15,11,8,13,12,6,16],[9,16,1,9,6,16,11,1,15],[1,15,11,0,6,16],[1,15,11,12,6,16],[9,6,16,9,16,8,11,10,15],[0,6,16,10,15,11],[12,6,16,10,15,11],
[16,13,6,13,3,6],[3,6,0,3,0,13,0,6,16],[3,6,9,3,8,13,12,6,16],[3,6,1,1,6,16],[0,6,16,0,3,6],[9,3,6,12,6,16],[3,6,8,8,6,16],[0,6,16,0,3,6],[9,3,6,12,6,16],[3,2,13,13,2,16,2,6,16],[6,16,0,0,13,3],[6,16,12,8,13,3],[2,6,16,2,16,1],[0,6,16],[12,6,16],[2,6,8,8,6,16],[0,6,16],[12,6,16],[3,9,13,13,9,16,9,6,16],[6,16,0,0,13,3],[6,16,12,8,13,3],[9,16,1,9,6,16],[0,6,16],[12,6,16],[9,16,8,9,6,16],[0,6,16],[12,6,16],[13,11,16,10,11,13,16,11,6],[10,0,13,0,6,16,11,6,0],[10,8,13,11,6,9,12,6,16],[11,6,1,1,6,16],[0,
6,16,0,11,6],[9,11,6,12,6,16],[8,6,16,11,6,8],[0,6,16,0,11,6],[9,11,6,12,6,16],[10,2,13,13,2,16,2,6,16],[6,16,0,0,13,10],[6,16,12,8,13,10],[2,6,16,2,16,1],[0,6,16],[12,6,16],[2,6,8,8,6,16],[0,6,16],[12,6,16],[10,9,13,13,9,16,9,6,16],[6,16,0,0,13,10],[6,16,12,8,13,10],[9,16,1,9,6,16],[0,6,16],[12,6,16],[9,16,8,9,6,16],[0,6,16],[12,6,16],[4,13,6,15,6,13],[0,15,6,0,13,15],[8,13,15,9,8,15,9,15,6],[4,1,6,1,15,6],[1,15,0,15,6,0],[1,15,9,9,15,6],[4,8,6,8,10,6,10,15,6],[10,6,0,10,15,6],[9,15,6,10,15,9],[4,
13,2,2,13,15],[2,13,15,2,0,13],[2,8,15,8,13,15],[2,4,1,2,1,15],[1,15,2],[1,15,2],[2,4,8,2,10,15],[10,15,2],[10,15,2],[4,13,9,9,13,11,11,13,15],[11,0,13,11,13,15],[11,8,13,11,13,15],[9,4,1,11,1,15],[1,15,11],[1,15,11],[9,4,8,11,10,15],[10,15,11],[10,15,11],[4,3,6,4,13,3],[3,6,0,3,0,13],[3,6,9,3,8,13],[3,4,1,3,6,4],[0,3,6],[9,3,6],[3,6,8,8,6,4],[0,3,6],[9,3,6],[3,2,13,13,2,4],[0,13,3],[8,13,3],[2,4,1],[],[],[2,4,8],[],[],[3,9,13,9,4,13],[0,13,3],[8,13,3],[9,4,1],[],[],[9,4,8],[],[],[4,11,6,4,10,11,
4,13,10],[11,6,0,10,0,13],[11,6,9,10,8,13],[11,6,4,11,4,1],[0,11,6],[9,11,6],[11,6,8,8,6,4],[0,11,6],[9,11,6],[10,4,13,10,2,4],[0,13,10],[8,13,10],[2,4,1],[],[],[2,4,8],[],[],[10,9,13,9,4,13],[0,13,10],[8,13,10],[9,4,1],[],[],[9,4,8],[],[],[15,6,12,13,15,12],[0,15,6,0,13,15],[8,13,15,9,8,15,9,15,6],[12,1,6,1,15,6],[1,15,0,15,6,0],[1,15,9,9,15,6],[8,10,6,12,8,6,10,15,6],[10,6,0,10,15,6],[9,15,6,10,15,9],[12,13,2,2,13,15],[2,13,15,2,0,13],[2,8,15,8,13,15],[2,1,15,2,12,1],[1,15,2],[1,15,2],[2,10,15,
2,12,8],[10,15,2],[10,15,2],[12,13,9,11,13,15,9,13,11],[11,0,13,11,13,15],[11,8,13,11,13,15],[9,12,1,11,1,15],[1,15,11],[1,15,11],[9,12,8,11,10,15],[10,15,11],[10,15,11],[12,3,6,12,13,3],[3,6,0,3,0,13],[3,6,9,3,8,13],[3,6,12,3,12,1],[0,3,6],[9,3,6],[3,6,8,8,6,12],[0,3,6],[9,3,6],[3,12,13,3,2,12],[0,13,3],[8,13,3],[2,12,1],[],[],[2,12,8],[],[],[3,9,13,9,12,13],[0,13,3],[8,13,3],[9,12,1],[],[],[9,12,8],[],[],[12,11,6,12,10,11,12,13,10],[11,6,0,10,0,13],[11,6,9,10,8,13],[11,12,1,11,6,12],[0,11,6],[9,
11,6],[11,6,12,11,12,8],[0,11,6],[9,11,6],[10,2,12,10,12,13],[0,13,10],[8,13,10],[2,12,1],[],[],[2,12,8],[],[],[10,12,13,10,9,12],[0,13,10],[8,13,10],[9,12,1],[],[],[9,12,8],[],[],[15,14,17,18,15,17],[17,18,0,0,18,15,0,15,14],[17,18,12,8,18,15,12,18,8,8,15,9,14,9,15],[17,1,14,17,18,1,1,15,14],[1,17,18,1,0,17,1,14,0,1,15,14],[1,12,18,1,15,9,12,17,18,15,14,9],[17,8,14,17,13,8,17,18,13,14,8,10,14,10,15],[13,0,17,13,17,18,0,10,14,15,14,10],[13,17,18,13,12,17,10,15,14,10,14,9],[2,17,18,2,18,15],[2,0,15,
15,0,18,0,17,18],[2,8,15,8,12,18,15,8,18,12,17,18],[2,1,15,2,17,1,1,17,18],[1,15,2,1,17,18,1,0,17],[1,15,2,1,12,18,12,17,18],[2,10,15,2,17,8,8,17,13,13,17,18],[13,0,17,13,17,18,10,15,2],[13,12,17,13,17,18,10,15,2],[11,9,15,15,9,18,17,18,9],[11,0,15,15,0,18,0,17,18],[8,12,18,15,8,18,11,8,15,12,17,18],[9,17,1,1,17,18,11,1,15],[1,15,11,1,17,18,1,0,17],[1,15,11,1,12,18,12,17,18],[9,17,8,13,17,18,8,17,13,11,10,15],[13,0,17,13,17,18,10,15,11],[13,12,17,13,17,18,10,15,11],[14,17,3,3,17,18],[3,0,18,3,14,
0,0,17,18],[3,8,18,3,14,9,8,12,18,12,17,18],[3,14,1,14,17,1,1,17,18],[1,17,18,1,0,17,0,3,14],[1,12,18,12,17,18,9,3,14],[3,14,8,14,17,8,13,17,18,8,17,13],[13,0,17,13,17,18,0,3,14],[13,12,17,13,17,18,9,3,14],[3,17,18,3,2,17],[0,17,18,0,18,3],[8,18,3,12,18,8,12,17,18],[2,17,1,1,17,18],[1,17,18,1,0,17],[1,12,18,12,17,18],[2,17,8,8,17,13,13,17,18],[13,0,17,13,17,18],[13,12,17,13,17,18],[3,9,18,18,9,17],[0,17,18,0,18,3],[8,18,3,12,18,8,12,17,18],[9,17,1,1,17,18],[1,17,18,1,0,17],[1,12,18,12,17,18],[8,17,
13,9,17,8,13,17,18],[13,0,17,13,17,18],[13,12,17,13,17,18],[14,10,11,17,10,14,17,18,10],[11,14,0,0,17,18,10,0,18],[11,14,9,8,12,18,10,8,18,12,17,18],[11,14,1,14,17,1,1,17,18],[1,17,18,1,0,17,0,11,14],[1,12,18,12,17,18,9,11,14],[11,14,8,14,17,8,8,17,13,13,17,18],[13,0,17,13,17,18,0,11,14],[13,12,17,13,17,18,9,11,14],[2,17,10,18,10,17],[0,17,18,0,18,10],[8,18,10,12,18,8,12,17,18],[2,17,1,1,17,18],[1,17,18,1,0,17],[1,12,18,12,17,18],[2,17,8,8,17,13,13,17,18],[13,0,17,13,17,18],[13,12,17,13,17,18],[10,
17,18,10,9,17],[0,17,18,0,18,10],[8,18,10,12,18,8,12,17,18],[9,17,1,1,17,18],[1,17,18,1,0,17],[1,12,18,12,17,18],[8,17,13,9,17,8,13,17,18],[13,0,17,13,17,18],[13,12,17,13,17,18],[4,15,14,4,18,15],[4,18,0,0,18,15,0,15,14],[4,18,8,8,15,9,8,18,15,9,15,14],[4,18,1,4,1,14,1,15,14],[1,4,18,1,15,14,1,14,0],[1,4,18,1,15,9,9,15,14],[4,18,13,4,8,14,8,10,14,10,15,14],[10,14,0,10,15,14,13,4,18],[10,14,9,10,15,14,13,4,18],[4,18,15,4,15,2],[2,0,15,15,0,18,0,4,18],[2,8,15,8,4,18,15,8,18],[2,4,1,2,1,15,1,4,18],[1,
15,2,1,4,18],[1,15,2,1,4,18],[2,4,8,2,10,15,13,4,18],[10,15,2,13,4,18],[10,15,2,13,4,18],[4,18,9,9,15,11,18,15,9],[11,0,15,15,0,18,0,4,18],[8,4,18,15,8,18,11,8,15],[9,4,1,1,4,18,11,1,15],[1,15,11,1,4,18],[1,15,11,1,4,18],[9,4,8,11,10,15,13,4,18],[10,15,11,13,4,18],[10,15,11,13,4,18],[4,18,3,4,3,14],[3,0,18,3,14,0,18,0,4],[3,8,18,3,14,9,8,4,18],[3,14,1,14,4,1,1,4,18],[1,4,18,0,3,14],[1,4,18,9,3,14],[3,14,8,8,14,4,13,4,18],[0,3,14,13,4,18],[9,3,14,13,4,18],[3,2,4,3,4,18],[0,4,18,0,18,3],[18,3,8,18,
8,4],[2,4,1,1,4,18],[1,4,18],[1,4,18],[2,4,8,13,4,18],[13,4,18],[13,4,18],[3,9,4,3,4,18],[0,4,18,0,18,3],[18,3,8,18,8,4],[9,4,1,1,4,18],[1,4,18],[1,4,18],[9,4,8,13,4,18],[13,4,18],[13,4,18],[4,18,10,4,10,11,4,11,14],[10,4,18,10,0,4,11,14,0],[10,8,18,8,4,18,11,14,9],[11,14,4,11,4,1,1,4,18],[1,4,18,0,11,14],[1,4,18,9,11,14],[11,14,8,8,14,4,13,4,18],[0,11,14,13,4,18],[9,11,14,13,4,18],[10,4,18,10,2,4],[0,4,10,18,10,4],[18,10,8,18,8,4],[2,4,1,1,4,18],[1,4,18],[1,4,18],[2,4,8,13,4,18],[13,4,18],[13,4,
18],[10,4,18,10,9,4],[0,4,10,18,10,4],[18,10,8,18,8,4],[9,4,1,1,4,18],[1,4,18],[1,4,18],[9,4,8,13,4,18],[13,4,18],[13,4,18],[14,12,15,15,12,16,15,16,18],[0,16,18,0,18,15,0,15,14],[8,15,9,8,18,15,16,18,8,9,15,14],[12,1,14,1,15,14,16,18,1],[1,16,18,1,15,14,1,14,0],[1,16,18,1,15,9,9,15,14],[12,8,14,10,15,14,8,10,14,16,18,13],[10,14,0,10,15,14,13,16,18],[10,14,9,10,15,14,13,16,18],[12,15,2,12,16,15,16,18,15],[2,0,15,15,0,18,18,0,16],[2,8,15,8,16,18,15,8,18],[2,1,15,2,12,1,1,16,18],[1,15,2,1,16,18],[1,
15,2,1,16,18],[2,10,15,2,12,8,13,16,18],[10,15,2,13,16,18],[10,15,2,13,16,18],[9,12,11,12,15,11,12,16,15,16,18,15],[11,0,15,15,0,18,18,0,16],[8,16,18,15,8,18,11,8,15],[9,12,1,1,16,18,11,1,15],[1,15,11,1,16,18],[1,15,11,1,16,18],[9,12,8,11,10,15,13,16,18],[10,15,11,13,16,18],[10,15,11,13,16,18],[16,3,12,16,18,3,12,3,14],[3,16,18,3,0,16,3,14,0],[3,8,18,3,14,9,8,16,18],[3,14,12,3,12,1,1,16,18],[1,16,18,0,3,14],[1,16,18,9,3,14],[3,14,8,8,14,12,13,16,18],[0,3,14,13,16,18],[9,3,14,13,16,18],[3,16,18,3,
12,16,3,2,12],[0,16,3,18,3,16],[18,3,8,18,8,16],[2,12,1,1,16,18],[1,16,18],[1,16,18],[2,12,8,13,16,18],[13,16,18],[13,16,18],[3,16,18,3,12,16,3,9,12],[0,16,3,18,3,16],[18,3,8,18,8,16],[9,12,1,1,16,18],[1,16,18],[1,16,18],[9,12,8,13,16,18],[13,16,18],[13,16,18],[16,10,12,16,18,10,12,11,14,12,10,11],[10,0,16,10,16,18,11,14,0],[10,16,18,10,8,16,11,14,9],[11,12,1,11,14,12,1,16,18],[1,16,18,0,11,14],[1,16,18,9,11,14],[11,14,12,11,12,8,13,16,18],[0,11,14,13,16,18],[9,11,14,13,16,18],[10,12,16,10,16,18,
10,2,12],[0,16,10,18,10,16],[18,10,16,16,10,8],[2,12,1,1,16,18],[1,16,18],[1,16,18],[2,12,8,13,16,18],[13,16,18],[13,16,18],[10,12,16,10,16,18,10,9,12],[0,16,10,18,10,16],[18,10,16,16,10,8],[9,12,1,1,16,18],[1,16,18],[1,16,18],[9,12,8,13,16,18],[13,16,18],[13,16,18],[17,5,14,5,15,14],[5,15,0,5,0,17,0,15,14],[5,15,8,5,12,17,8,15,9,9,15,14],[5,1,17,1,14,17,1,15,14],[1,15,14,1,14,0,0,17,5],[1,15,9,9,15,14,12,17,5],[5,8,17,8,14,17,8,10,14,10,15,14],[10,14,0,10,15,14,0,17,5],[10,14,9,10,15,14,12,17,5],
[5,15,2,5,2,17],[2,0,15,15,0,5,0,17,5],[2,8,15,8,5,15,12,17,5],[2,17,1,2,1,15,17,5,1],[1,15,2,0,17,5],[1,15,2,12,17,5],[2,17,8,2,10,15,8,17,5],[0,17,5,10,15,2],[12,17,5,10,15,2],[5,15,11,5,11,9,5,9,17],[11,5,15,11,0,5,0,17,5],[11,8,15,8,5,15,12,17,5],[9,17,5,9,5,1,11,1,15],[1,15,11,0,17,5],[1,15,11,12,17,5],[9,17,8,8,17,5,11,10,15],[0,17,5,10,15,11],[12,17,5,10,15,11],[5,3,14,5,14,17],[3,0,5,3,14,0,0,17,5],[3,8,5,3,14,9,12,17,5],[3,14,1,14,17,1,1,17,5],[0,17,5,0,3,14],[9,3,14,12,17,5],[3,14,8,8,17,
5,14,17,8],[0,17,5,0,3,14],[9,3,14,12,17,5],[3,2,5,2,17,5],[0,5,3,17,5,0],[8,5,3,17,5,12],[2,17,1,17,5,1],[0,17,5],[12,17,5],[2,17,8,8,17,5],[0,17,5],[12,17,5],[3,9,5,9,17,5],[0,5,3,17,5,0],[8,5,3,17,5,12],[9,5,1,9,17,5],[0,17,5],[12,17,5],[8,17,5,9,17,8],[0,17,5],[12,17,5],[5,10,17,17,10,14,10,11,14],[10,0,5,0,17,5,11,14,0],[10,8,5,11,14,9,12,17,5],[11,14,1,14,17,1,1,17,5],[0,17,5,0,11,14],[9,11,14,12,17,5],[8,17,5,14,17,8,11,14,8],[0,17,5,0,11,14],[9,11,14,12,17,5],[10,2,5,2,17,5],[0,5,10,17,5,
0],[17,5,12,8,5,10],[2,17,1,17,5,1],[0,17,5],[12,17,5],[2,17,8,8,17,5],[0,17,5],[12,17,5],[10,9,5,9,17,5],[0,5,10,17,5,0],[17,5,12,8,5,10],[9,5,1,9,17,5],[0,17,5],[12,17,5],[8,17,5,9,17,8],[0,17,5],[12,17,5],[5,15,14,5,14,4],[0,15,14,0,5,15],[8,5,15,9,8,15,9,15,14],[4,1,14,1,15,14],[1,15,14,1,14,0],[1,15,9,9,15,14],[4,8,14,8,10,14,10,15,14],[10,14,0,10,15,14],[10,14,9,10,15,14],[4,5,2,2,5,15],[2,0,15,15,0,5],[2,8,15,8,5,15],[2,4,1,2,1,15],[1,15,2],[1,15,2],[2,4,8,2,10,15],[10,15,2],[10,15,2],[4,5,
9,9,5,11,11,5,15],[11,0,5,11,5,15],[8,5,15,11,8,15],[9,4,1,11,1,15],[1,15,11],[1,15,11],[9,4,8,11,10,15],[10,15,11],[10,15,11],[4,5,3,4,3,14],[3,14,0,3,0,5],[3,14,9,3,8,5],[3,14,1,14,4,1],[0,3,14],[9,3,14],[3,14,8,8,14,4],[0,3,14],[9,3,14],[3,2,4,3,4,5],[0,5,3],[8,5,3],[2,4,1],[],[],[2,4,8],[],[],[3,9,5,9,4,5],[0,5,3],[8,5,3],[9,4,1],[],[],[9,4,8],[],[],[4,5,10,4,11,14,4,10,11],[11,14,0,10,0,5],[11,14,9,10,8,5],[11,14,4,11,4,1],[0,11,14],[9,11,14],[11,14,8,8,14,4],[0,11,14],[9,11,14],[10,4,5,10,2,
4],[0,5,10],[8,5,10],[2,4,1],[],[],[2,4,8],[],[],[10,9,5,9,4,5],[0,5,10],[8,5,10],[9,4,1],[],[],[9,4,8],[],[],[5,15,12,15,14,12],[0,15,14,0,5,15],[8,5,15,9,8,15,9,15,14],[12,1,14,1,15,14],[1,15,14,1,14,0],[1,15,9,9,15,14],[8,10,14,12,8,14,10,15,14],[10,14,0,10,15,14],[10,14,9,10,15,14],[12,5,2,2,5,15],[2,0,15,15,0,5],[2,8,15,8,5,15],[2,1,15,2,12,1],[1,15,2],[1,15,2],[2,10,15,2,12,8],[10,15,2],[10,15,2],[12,5,9,9,5,11,11,5,15],[11,0,5,11,5,15],[8,5,15,11,8,15],[9,12,1,11,1,15],[1,15,11],[1,15,11],
[9,12,8,11,10,15],[10,15,11],[10,15,11],[12,3,14,12,5,3],[3,14,0,3,0,5],[3,14,9,3,8,5],[3,14,12,3,12,1],[0,3,14],[9,3,14],[3,14,8,8,14,12],[0,3,14],[9,3,14],[3,12,5,3,2,12],[0,5,3],[8,5,3],[2,12,1],[],[],[2,12,8],[],[],[3,9,5,9,12,5],[0,5,3],[8,5,3],[9,12,1],[],[],[9,12,8],[],[],[12,11,14,12,10,11,12,5,10],[11,14,0,10,0,5],[11,14,9,10,8,5],[11,12,1,11,14,12],[0,11,14],[9,11,14],[11,14,12,11,12,8],[0,11,14],[9,11,14],[10,2,12,10,12,5],[0,5,10],[8,5,10],[2,12,1],[],[],[2,12,8],[],[],[10,12,5,10,9,12],
[0,5,10],[8,5,10],[9,12,1],[],[],[9,12,8],[],[],[16,13,14,17,16,14,14,13,15],[16,0,17,0,15,14,13,15,0],[16,12,17,8,15,9,13,15,8,9,15,14],[1,17,16,1,14,17,1,15,14],[1,15,14,1,14,0,0,17,16],[1,15,9,9,15,14,12,17,16],[16,8,17,8,14,17,8,10,14,10,15,14],[10,14,0,10,15,14,0,17,16],[10,14,9,10,15,14,12,17,16],[16,13,2,16,2,17,13,15,2],[2,13,15,2,0,13,0,17,16],[2,8,15,8,13,15,12,17,16],[2,17,16,2,16,1,2,1,15],[1,15,2,0,17,16],[1,15,2,12,17,16],[2,17,8,2,10,15,8,17,16],[0,17,16,10,15,2],[12,17,16,10,15,2],
[16,13,9,16,9,17,13,11,9,13,15,11],[11,0,13,11,13,15,0,17,16],[11,13,15,11,8,13,12,17,16],[9,16,1,9,17,16,11,1,15],[1,15,11,0,17,16],[1,15,11,12,17,16],[9,17,16,9,16,8,11,10,15],[0,17,16,10,15,11],[12,17,16,10,15,11],[13,14,16,13,3,14,16,14,17],[3,14,0,3,0,13,0,17,16],[3,14,9,3,8,13,12,17,16],[3,14,1,14,17,1,17,16,1],[0,17,16,0,3,14],[9,3,14,12,17,16],[3,14,8,8,17,16,14,17,8],[0,17,16,0,3,14],[9,3,14,12,17,16],[3,2,13,13,2,16,2,17,16],[0,13,3,17,16,0],[8,13,3,17,16,12],[2,17,16,2,16,1],[0,17,16],
[12,17,16],[2,17,8,8,17,16],[0,17,16],[12,17,16],[3,9,13,13,9,16,9,17,16],[0,13,3,17,16,0],[8,13,3,17,16,12],[9,16,1,9,17,16],[0,17,16],[12,17,16],[9,16,8,9,17,16],[0,17,16],[12,17,16],[13,14,16,13,11,14,10,11,13,16,14,17],[10,0,13,0,17,16,11,14,0],[10,8,13,11,14,9,12,17,16],[11,14,1,14,17,1,17,16,1],[0,17,16,0,11,14],[9,11,14,12,17,16],[8,17,16,14,17,8,11,14,8],[0,17,16,0,11,14],[9,11,14,12,17,16],[10,2,13,13,2,16,2,17,16],[0,13,10,17,16,0],[17,16,12,8,13,10],[2,17,16,2,16,1],[0,17,16],[12,17,16],
[2,17,8,8,17,16],[0,17,16],[12,17,16],[10,9,13,13,9,16,9,17,16],[0,13,10,17,16,0],[17,16,12,8,13,10],[9,16,1,9,17,16],[0,17,16],[12,17,16],[9,16,8,9,17,16],[0,17,16],[12,17,16],[4,13,14,15,14,13],[0,15,14,0,13,15],[8,13,15,9,8,15,9,15,14],[4,1,14,1,15,14],[1,15,14,1,14,0],[1,15,9,9,15,14],[4,8,14,8,10,14,10,15,14],[10,14,0,10,15,14],[10,14,9,10,15,14],[4,13,2,2,13,15],[2,13,15,2,0,13],[2,8,15,8,13,15],[2,4,1,2,1,15],[1,15,2],[1,15,2],[2,4,8,2,10,15],[10,15,2],[10,15,2],[4,13,9,9,13,11,11,13,15],[11,
0,13,11,13,15],[11,8,13,11,13,15],[9,4,1,11,1,15],[1,15,11],[1,15,11],[9,4,8,11,10,15],[10,15,11],[10,15,11],[4,3,14,4,13,3],[3,14,0,3,0,13],[3,14,9,3,8,13],[3,14,1,14,4,1],[0,3,14],[9,3,14],[3,14,8,8,14,4],[0,3,14],[9,3,14],[3,2,13,13,2,4],[0,13,3],[8,13,3],[2,4,1],[],[],[2,4,8],[],[],[3,9,13,9,4,13],[0,13,3],[8,13,3],[9,4,1],[],[],[9,4,8],[],[],[4,11,14,4,10,11,4,13,10],[11,14,0,10,0,13],[11,14,9,10,8,13],[11,14,4,11,4,1],[0,11,14],[9,11,14],[11,14,8,8,14,4],[0,11,14],[9,11,14],[10,4,13,10,2,4],
[0,13,10],[8,13,10],[2,4,1],[],[],[2,4,8],[],[],[10,9,13,9,4,13],[0,13,10],[8,13,10],[9,4,1],[],[],[9,4,8],[],[],[13,15,14,13,14,12],[0,15,14,0,13,15],[8,13,15,9,8,15,9,15,14],[12,1,14,1,15,14],[1,15,14,1,14,0],[1,15,9,9,15,14],[8,10,14,12,8,14,10,15,14],[10,14,0,10,15,14],[10,14,9,10,15,14],[12,13,2,2,13,15],[2,13,15,2,0,13],[2,8,15,8,13,15],[2,1,15,2,12,1],[1,15,2],[1,15,2],[2,10,15,2,12,8],[10,15,2],[10,15,2],[12,13,9,11,13,15,9,13,11],[11,0,13,11,13,15],[11,8,13,11,13,15],[9,12,1,11,1,15],[1,
15,11],[1,15,11],[9,12,8,11,10,15],[10,15,11],[10,15,11],[12,3,14,12,13,3],[3,14,0,3,0,13],[3,14,9,3,8,13],[3,14,12,3,12,1],[0,3,14],[9,3,14],[3,14,8,8,14,12],[0,3,14],[9,3,14],[3,12,13,3,2,12],[0,13,3],[8,13,3],[2,12,1],[],[],[2,12,8],[],[],[3,9,13,9,12,13],[0,13,3],[8,13,3],[9,12,1],[],[],[9,12,8],[],[],[12,11,14,12,10,11,12,13,10],[11,14,0,10,0,13],[11,14,9,10,8,13],[11,12,1,11,14,12],[0,11,14],[9,11,14],[11,14,12,11,12,8],[0,11,14],[9,11,14],[10,2,12,10,12,13],[0,13,10],[8,13,10],[2,12,1],[],
[],[2,12,8],[],[],[10,12,13,10,9,12],[0,13,10],[8,13,10],[9,12,1],[],[],[9,12,8],[],[]];
}).call(this);//# sourceMappingURL=CindyPrint.js.map