diff --git a/src/compiler.ts b/src/compiler.ts index f99bd5a049..ee042d9285 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8230,39 +8230,55 @@ export class Compiler extends DiagnosticEmitter { let arrayInstance = assert(this.resolver.resolveClass(this.program.staticArrayPrototype, [ stringType ])); let segment = this.addStaticBuffer(stringType, values, arrayInstance.id); this.program.OBJECTInstance.writeField("gcInfo", 3, segment.buffer, 0); // use transparent gcinfo - let offset = i64_add(segment.offset, i64_new(this.program.totalOverhead)); + let arrayOffset = i64_add(segment.offset, i64_new(this.program.totalOverhead)); let joinInstance = assert(arrayInstance.getMethod("join")); let indexedSetInstance = assert(arrayInstance.lookupOverload(OperatorKind.IndexedSet, true)); - let stmts = new Array(2 * numExpressions + 1); - // Use one local per toString'ed subexpression, since otherwise recursion on the same - // static array would overwrite already prepared parts. Avoids a temporary array. - let temps = new Array(numExpressions); let flow = this.currentFlow; + + // Store the static array address in a tmp local so the shadow stack + // keeps it reachable. GC will visit it and all dynamic children. + let arrayLocal = flow.getTempLocal(arrayInstance.type); + let stmts = new Array(); + stmts.push(module.local_set(arrayLocal.index, module.usize(arrayOffset), true)); + + // Evaluate each expression into a temp local. + // One local per expression prevents recursion on the same static array + // from overwriting already prepared parts. + let temps = new Array(numExpressions); for (let i = 0; i < numExpressions; ++i) { - let expression = expressions[i]; + let subExpression = expressions[i]; let temp = flow.getTempLocal(stringType); temps[i] = temp; - stmts[i] = module.local_set(temp.index, - this.makeToString( - this.compileExpression(expression, stringType), - this.currentType, expression - ), - true + stmts.push( + module.local_set( + temp.index, + this.makeToString(this.compileExpression(subExpression, stringType), this.currentType, subExpression), + true + ) ); } - // Populate the static array with the toString'ed subexpressions and call .join("") + + // Populate the static array slots with the temp locals for (let i = 0; i < numExpressions; ++i) { - stmts[numExpressions + i] = this.makeCallDirect(indexedSetInstance, [ - module.usize(offset), - module.i32(expressionPositions[i]), - module.local_get(temps[i].index, stringType.toRef()) - ], expression); - } - stmts[2 * numExpressions] = this.makeCallDirect(joinInstance, [ - module.usize(offset), - this.ensureStaticString("") - ], expression); - return module.flatten(stmts, stringType.toRef()); + stmts.push( + this.makeCallDirect( + indexedSetInstance, + [ + module.local_get(arrayLocal.index, stringType.toRef()), + module.i32(expressionPositions[i]), + module.local_get(temps[i].index, stringType.toRef()), + ], + expression + )); + } + // Call join("") and return the result + stmts.push( + this.makeCallDirect( + joinInstance, + [module.local_get(arrayLocal.index, stringType.toRef()), this.ensureStaticString("")], + expression + )); + return module.block(null, stmts, stringType.toRef()); } // Try to find out whether the template function takes a full-blown TemplateStringsArray or if diff --git a/tests/compiler/std/date.debug.wat b/tests/compiler/std/date.debug.wat index f0af4387e1..29bcd6dbd5 100644 --- a/tests/compiler/std/date.debug.wat +++ b/tests/compiler/std/date.debug.wat @@ -5111,21 +5111,22 @@ (local $17 i32) (local $18 i32) (local $19 i32) + (local $20 i32) global.get $~lib/memory/__stack_pointer - i32.const 64 + i32.const 68 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 64 + i32.const 68 memory.fill local.get $this - local.set $19 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store - local.get $19 + local.get $20 call $~lib/date/Date#get:year local.set $yr local.get $yr @@ -5148,11 +5149,11 @@ else i32.const 624 end - local.set $19 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store - local.get $19 + local.get $20 local.get $yr local.tee $3 i32.const 31 @@ -5164,11 +5165,11 @@ i32.xor i32.const 6 call $~lib/date/stringify - local.set $19 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store offset=4 - local.get $19 + local.get $20 call $~lib/string/String.__concat else local.get $yr @@ -5179,11 +5180,11 @@ i32.store offset=8 global.get $~lib/memory/__stack_pointer local.get $this - local.set $19 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store - local.get $19 + local.get $20 call $~lib/date/Date#get:month i32.const 2 call $~lib/date/stringify @@ -5191,11 +5192,11 @@ i32.store offset=12 global.get $~lib/memory/__stack_pointer local.get $this - local.set $19 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store - local.get $19 + local.get $20 call $~lib/date/Date#get:day i32.const 2 call $~lib/date/stringify @@ -5203,11 +5204,11 @@ i32.store offset=16 global.get $~lib/memory/__stack_pointer local.get $this - local.set $19 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store - local.get $19 + local.get $20 call $~lib/date/Date#getUTCHours i32.const 2 call $~lib/date/stringify @@ -5215,11 +5216,11 @@ i32.store offset=20 global.get $~lib/memory/__stack_pointer local.get $this - local.set $19 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store - local.get $19 + local.get $20 call $~lib/date/Date#getUTCMinutes i32.const 2 call $~lib/date/stringify @@ -5227,11 +5228,11 @@ i32.store offset=24 global.get $~lib/memory/__stack_pointer local.get $this - local.set $19 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store - local.get $19 + local.get $20 call $~lib/date/Date#getUTCSeconds i32.const 2 call $~lib/date/stringify @@ -5239,156 +5240,160 @@ i32.store offset=28 global.get $~lib/memory/__stack_pointer local.get $this - local.set $19 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store - local.get $19 + local.get $20 call $~lib/date/Date#getUTCMilliseconds i32.const 3 call $~lib/date/stringify local.tee $ms i32.store offset=32 global.get $~lib/memory/__stack_pointer - local.get $year + i32.const 2592 local.tee $12 i32.store offset=36 global.get $~lib/memory/__stack_pointer - local.get $month + local.get $year local.tee $13 i32.store offset=40 global.get $~lib/memory/__stack_pointer - local.get $day + local.get $month local.tee $14 i32.store offset=44 global.get $~lib/memory/__stack_pointer - local.get $hours + local.get $day local.tee $15 i32.store offset=48 global.get $~lib/memory/__stack_pointer - local.get $mins + local.get $hours local.tee $16 i32.store offset=52 global.get $~lib/memory/__stack_pointer - local.get $secs + local.get $mins local.tee $17 i32.store offset=56 global.get $~lib/memory/__stack_pointer - local.get $ms + local.get $secs local.tee $18 i32.store offset=60 - i32.const 2592 - local.set $19 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $ms + local.tee $19 + i32.store offset=64 + local.get $12 + local.set $20 + global.get $~lib/memory/__stack_pointer + local.get $20 i32.store - local.get $19 + local.get $20 i32.const 0 - local.get $12 - local.set $19 + local.get $13 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store offset=4 - local.get $19 + local.get $20 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 2592 - local.set $19 + local.get $12 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store - local.get $19 + local.get $20 i32.const 2 - local.get $13 - local.set $19 + local.get $14 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store offset=4 - local.get $19 + local.get $20 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 2592 - local.set $19 + local.get $12 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store - local.get $19 + local.get $20 i32.const 4 - local.get $14 - local.set $19 + local.get $15 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store offset=4 - local.get $19 + local.get $20 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 2592 - local.set $19 + local.get $12 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store - local.get $19 + local.get $20 i32.const 6 - local.get $15 - local.set $19 + local.get $16 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store offset=4 - local.get $19 + local.get $20 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 2592 - local.set $19 + local.get $12 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store - local.get $19 + local.get $20 i32.const 8 - local.get $16 - local.set $19 + local.get $17 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store offset=4 - local.get $19 + local.get $20 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 2592 - local.set $19 + local.get $12 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store - local.get $19 + local.get $20 i32.const 10 - local.get $17 - local.set $19 + local.get $18 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store offset=4 - local.get $19 + local.get $20 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 2592 - local.set $19 + local.get $12 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store - local.get $19 + local.get $20 i32.const 12 - local.get $18 - local.set $19 - global.get $~lib/memory/__stack_pointer local.get $19 + local.set $20 + global.get $~lib/memory/__stack_pointer + local.get $20 i32.store offset=4 - local.get $19 + local.get $20 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 2592 - local.set $19 + local.get $12 + local.set $20 global.get $~lib/memory/__stack_pointer - local.get $19 + local.get $20 i32.store - local.get $19 + local.get $20 i32.const 2432 call $~lib/staticarray/StaticArray<~lib/string/String>#join - local.set $19 + local.set $20 global.get $~lib/memory/__stack_pointer - i32.const 64 + i32.const 68 i32.add global.set $~lib/memory/__stack_pointer - local.get $19 + local.get $20 return ) (func $~lib/string/String.__eq (param $left i32) (param $right i32) (result i32) @@ -5508,14 +5513,15 @@ (local $18 i32) (local $19 i32) (local $20 i32) + (local $21 i32) global.get $~lib/memory/__stack_pointer - i32.const 52 + i32.const 56 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 52 + i32.const 56 memory.fill global.get $~lib/memory/__stack_pointer i32.const 28 @@ -5532,27 +5538,27 @@ local.tee $months i32.store offset=4 local.get $this - local.set $20 + local.set $21 global.get $~lib/memory/__stack_pointer - local.get $20 + local.get $21 i32.store offset=8 - local.get $20 + local.get $21 call $~lib/date/Date#get:month local.set $mo local.get $this - local.set $20 + local.set $21 global.get $~lib/memory/__stack_pointer - local.get $20 + local.get $21 i32.store offset=8 - local.get $20 + local.get $21 call $~lib/date/Date#get:day local.set $da local.get $this - local.set $20 + local.set $21 global.get $~lib/memory/__stack_pointer - local.get $20 + local.get $21 i32.store offset=8 - local.get $20 + local.get $21 call $~lib/date/Date#get:year local.set $yr local.get $yr @@ -5576,11 +5582,11 @@ i32.store offset=12 global.get $~lib/memory/__stack_pointer local.get $months - local.set $20 + local.set $21 global.get $~lib/memory/__stack_pointer - local.get $20 + local.get $21 i32.store offset=8 - local.get $20 + local.get $21 local.get $mo i32.const 1 i32.sub @@ -5589,11 +5595,11 @@ i32.store offset=16 global.get $~lib/memory/__stack_pointer local.get $weeks - local.set $20 + local.set $21 global.get $~lib/memory/__stack_pointer - local.get $20 + local.get $21 i32.store offset=8 - local.get $20 + local.get $21 local.get $wd call $~lib/staticarray/StaticArray<~lib/string/String>#__uget local.tee $week @@ -5605,18 +5611,22 @@ local.tee $day i32.store offset=24 global.get $~lib/memory/__stack_pointer - local.get $week + i32.const 4128 local.tee $15 i32.store offset=28 global.get $~lib/memory/__stack_pointer - local.get $month + local.get $week local.tee $16 i32.store offset=32 global.get $~lib/memory/__stack_pointer - local.get $day + local.get $month local.tee $17 i32.store offset=36 global.get $~lib/memory/__stack_pointer + local.get $day + local.tee $18 + i32.store offset=40 + global.get $~lib/memory/__stack_pointer local.get $yr i32.const 0 i32.lt_s @@ -5625,96 +5635,96 @@ else i32.const 4208 end - local.tee $18 - i32.store offset=40 - global.get $~lib/memory/__stack_pointer - local.get $year local.tee $19 i32.store offset=44 - i32.const 4128 - local.set $20 global.get $~lib/memory/__stack_pointer - local.get $20 + local.get $year + local.tee $20 + i32.store offset=48 + local.get $15 + local.set $21 + global.get $~lib/memory/__stack_pointer + local.get $21 i32.store offset=8 - local.get $20 + local.get $21 i32.const 0 - local.get $15 - local.set $20 + local.get $16 + local.set $21 global.get $~lib/memory/__stack_pointer - local.get $20 - i32.store offset=48 - local.get $20 + local.get $21 + i32.store offset=52 + local.get $21 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4128 - local.set $20 + local.get $15 + local.set $21 global.get $~lib/memory/__stack_pointer - local.get $20 + local.get $21 i32.store offset=8 - local.get $20 + local.get $21 i32.const 1 - local.get $16 - local.set $20 + local.get $17 + local.set $21 global.get $~lib/memory/__stack_pointer - local.get $20 - i32.store offset=48 - local.get $20 + local.get $21 + i32.store offset=52 + local.get $21 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4128 - local.set $20 + local.get $15 + local.set $21 global.get $~lib/memory/__stack_pointer - local.get $20 + local.get $21 i32.store offset=8 - local.get $20 + local.get $21 i32.const 2 - local.get $17 - local.set $20 + local.get $18 + local.set $21 global.get $~lib/memory/__stack_pointer - local.get $20 - i32.store offset=48 - local.get $20 + local.get $21 + i32.store offset=52 + local.get $21 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4128 - local.set $20 + local.get $15 + local.set $21 global.get $~lib/memory/__stack_pointer - local.get $20 + local.get $21 i32.store offset=8 - local.get $20 + local.get $21 i32.const 3 - local.get $18 - local.set $20 + local.get $19 + local.set $21 global.get $~lib/memory/__stack_pointer - local.get $20 - i32.store offset=48 - local.get $20 + local.get $21 + i32.store offset=52 + local.get $21 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4128 - local.set $20 + local.get $15 + local.set $21 global.get $~lib/memory/__stack_pointer - local.get $20 + local.get $21 i32.store offset=8 - local.get $20 + local.get $21 i32.const 4 - local.get $19 - local.set $20 - global.get $~lib/memory/__stack_pointer - local.get $20 - i32.store offset=48 local.get $20 + local.set $21 + global.get $~lib/memory/__stack_pointer + local.get $21 + i32.store offset=52 + local.get $21 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4128 - local.set $20 + local.get $15 + local.set $21 global.get $~lib/memory/__stack_pointer - local.get $20 + local.get $21 i32.store offset=8 - local.get $20 + local.get $21 i32.const 2432 call $~lib/staticarray/StaticArray<~lib/string/String>#join - local.set $20 + local.set $21 global.get $~lib/memory/__stack_pointer - i32.const 52 + i32.const 56 i32.add global.set $~lib/memory/__stack_pointer - local.get $20 + local.get $21 return ) (func $~lib/date/Date#toTimeString (param $this i32) (result i32) @@ -5725,22 +5735,23 @@ (local $5 i32) (local $6 i32) (local $7 i32) + (local $8 i32) global.get $~lib/memory/__stack_pointer - i32.const 32 + i32.const 36 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 32 + i32.const 36 memory.fill global.get $~lib/memory/__stack_pointer local.get $this - local.set $7 + local.set $8 global.get $~lib/memory/__stack_pointer - local.get $7 + local.get $8 i32.store - local.get $7 + local.get $8 call $~lib/date/Date#getUTCHours i32.const 2 call $~lib/date/stringify @@ -5748,11 +5759,11 @@ i32.store offset=4 global.get $~lib/memory/__stack_pointer local.get $this - local.set $7 + local.set $8 global.get $~lib/memory/__stack_pointer - local.get $7 + local.get $8 i32.store - local.get $7 + local.get $8 call $~lib/date/Date#getUTCMinutes i32.const 2 call $~lib/date/stringify @@ -5760,84 +5771,88 @@ i32.store offset=8 global.get $~lib/memory/__stack_pointer local.get $this - local.set $7 + local.set $8 global.get $~lib/memory/__stack_pointer - local.get $7 + local.get $8 i32.store - local.get $7 + local.get $8 call $~lib/date/Date#getUTCSeconds i32.const 2 call $~lib/date/stringify local.tee $secs i32.store offset=12 global.get $~lib/memory/__stack_pointer - local.get $hours + i32.const 4432 local.tee $4 i32.store offset=16 global.get $~lib/memory/__stack_pointer - local.get $mins + local.get $hours local.tee $5 i32.store offset=20 global.get $~lib/memory/__stack_pointer - local.get $secs + local.get $mins local.tee $6 i32.store offset=24 - i32.const 4432 - local.set $7 global.get $~lib/memory/__stack_pointer - local.get $7 + local.get $secs + local.tee $7 + i32.store offset=28 + local.get $4 + local.set $8 + global.get $~lib/memory/__stack_pointer + local.get $8 i32.store - local.get $7 + local.get $8 i32.const 0 - local.get $4 - local.set $7 + local.get $5 + local.set $8 global.get $~lib/memory/__stack_pointer - local.get $7 - i32.store offset=28 - local.get $7 + local.get $8 + i32.store offset=32 + local.get $8 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4432 - local.set $7 + local.get $4 + local.set $8 global.get $~lib/memory/__stack_pointer - local.get $7 + local.get $8 i32.store - local.get $7 + local.get $8 i32.const 2 - local.get $5 - local.set $7 + local.get $6 + local.set $8 global.get $~lib/memory/__stack_pointer - local.get $7 - i32.store offset=28 - local.get $7 + local.get $8 + i32.store offset=32 + local.get $8 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4432 - local.set $7 + local.get $4 + local.set $8 global.get $~lib/memory/__stack_pointer - local.get $7 + local.get $8 i32.store - local.get $7 + local.get $8 i32.const 4 - local.get $6 - local.set $7 - global.get $~lib/memory/__stack_pointer - local.get $7 - i32.store offset=28 local.get $7 + local.set $8 + global.get $~lib/memory/__stack_pointer + local.get $8 + i32.store offset=32 + local.get $8 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4432 - local.set $7 + local.get $4 + local.set $8 global.get $~lib/memory/__stack_pointer - local.get $7 + local.get $8 i32.store - local.get $7 + local.get $8 i32.const 2432 call $~lib/staticarray/StaticArray<~lib/string/String>#join - local.set $7 + local.set $8 global.get $~lib/memory/__stack_pointer - i32.const 32 + i32.const 36 i32.add global.set $~lib/memory/__stack_pointer - local.get $7 + local.get $8 return ) (func $~lib/date/Date#toUTCString (param $this i32) (result i32) @@ -5867,14 +5882,15 @@ (local $24 i32) (local $25 i32) (local $26 i32) + (local $27 i32) global.get $~lib/memory/__stack_pointer - i32.const 76 + i32.const 80 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 76 + i32.const 80 memory.fill global.get $~lib/memory/__stack_pointer i32.const 28 @@ -5891,27 +5907,27 @@ local.tee $months i32.store offset=4 local.get $this - local.set $26 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 + local.get $27 i32.store offset=8 - local.get $26 + local.get $27 call $~lib/date/Date#get:month local.set $mo local.get $this - local.set $26 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 + local.get $27 i32.store offset=8 - local.get $26 + local.get $27 call $~lib/date/Date#get:day local.set $da local.get $this - local.set $26 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 + local.get $27 i32.store offset=8 - local.get $26 + local.get $27 call $~lib/date/Date#get:year local.set $yr local.get $yr @@ -5935,11 +5951,11 @@ i32.store offset=12 global.get $~lib/memory/__stack_pointer local.get $months - local.set $26 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 + local.get $27 i32.store offset=8 - local.get $26 + local.get $27 local.get $mo i32.const 1 i32.sub @@ -5948,11 +5964,11 @@ i32.store offset=16 global.get $~lib/memory/__stack_pointer local.get $weeks - local.set $26 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 + local.get $27 i32.store offset=8 - local.get $26 + local.get $27 local.get $wd call $~lib/staticarray/StaticArray<~lib/string/String>#__uget local.tee $week @@ -5965,11 +5981,11 @@ i32.store offset=24 global.get $~lib/memory/__stack_pointer local.get $this - local.set $26 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 + local.get $27 i32.store offset=8 - local.get $26 + local.get $27 call $~lib/date/Date#getUTCHours i32.const 2 call $~lib/date/stringify @@ -5977,11 +5993,11 @@ i32.store offset=28 global.get $~lib/memory/__stack_pointer local.get $this - local.set $26 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 + local.get $27 i32.store offset=8 - local.get $26 + local.get $27 call $~lib/date/Date#getUTCMinutes i32.const 2 call $~lib/date/stringify @@ -5989,29 +6005,33 @@ i32.store offset=32 global.get $~lib/memory/__stack_pointer local.get $this - local.set $26 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 + local.get $27 i32.store offset=8 - local.get $26 + local.get $27 call $~lib/date/Date#getUTCSeconds i32.const 2 call $~lib/date/stringify local.tee $secs i32.store offset=36 global.get $~lib/memory/__stack_pointer - local.get $week + i32.const 5344 local.tee $18 i32.store offset=40 global.get $~lib/memory/__stack_pointer - local.get $day + local.get $week local.tee $19 i32.store offset=44 global.get $~lib/memory/__stack_pointer - local.get $month + local.get $day local.tee $20 i32.store offset=48 global.get $~lib/memory/__stack_pointer + local.get $month + local.tee $21 + i32.store offset=52 + global.get $~lib/memory/__stack_pointer local.get $yr i32.const 0 i32.lt_s @@ -6020,150 +6040,150 @@ else i32.const 2432 end - local.tee $21 - i32.store offset=52 - global.get $~lib/memory/__stack_pointer - local.get $year local.tee $22 i32.store offset=56 global.get $~lib/memory/__stack_pointer - local.get $hours + local.get $year local.tee $23 i32.store offset=60 global.get $~lib/memory/__stack_pointer - local.get $mins + local.get $hours local.tee $24 i32.store offset=64 global.get $~lib/memory/__stack_pointer - local.get $secs + local.get $mins local.tee $25 i32.store offset=68 - i32.const 5344 - local.set $26 global.get $~lib/memory/__stack_pointer - local.get $26 + local.get $secs + local.tee $26 + i32.store offset=72 + local.get $18 + local.set $27 + global.get $~lib/memory/__stack_pointer + local.get $27 i32.store offset=8 - local.get $26 + local.get $27 i32.const 0 - local.get $18 - local.set $26 + local.get $19 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 - i32.store offset=72 - local.get $26 + local.get $27 + i32.store offset=76 + local.get $27 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 5344 - local.set $26 + local.get $18 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 + local.get $27 i32.store offset=8 - local.get $26 + local.get $27 i32.const 1 - local.get $19 - local.set $26 + local.get $20 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 - i32.store offset=72 - local.get $26 + local.get $27 + i32.store offset=76 + local.get $27 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 5344 - local.set $26 + local.get $18 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 + local.get $27 i32.store offset=8 - local.get $26 + local.get $27 i32.const 2 - local.get $20 - local.set $26 + local.get $21 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 - i32.store offset=72 - local.get $26 + local.get $27 + i32.store offset=76 + local.get $27 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 5344 - local.set $26 + local.get $18 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 + local.get $27 i32.store offset=8 - local.get $26 + local.get $27 i32.const 3 - local.get $21 - local.set $26 + local.get $22 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 - i32.store offset=72 - local.get $26 + local.get $27 + i32.store offset=76 + local.get $27 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 5344 - local.set $26 + local.get $18 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 + local.get $27 i32.store offset=8 - local.get $26 + local.get $27 i32.const 4 - local.get $22 - local.set $26 + local.get $23 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 - i32.store offset=72 - local.get $26 + local.get $27 + i32.store offset=76 + local.get $27 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 5344 - local.set $26 + local.get $18 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 + local.get $27 i32.store offset=8 - local.get $26 + local.get $27 i32.const 6 - local.get $23 - local.set $26 + local.get $24 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 - i32.store offset=72 - local.get $26 + local.get $27 + i32.store offset=76 + local.get $27 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 5344 - local.set $26 + local.get $18 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 + local.get $27 i32.store offset=8 - local.get $26 + local.get $27 i32.const 8 - local.get $24 - local.set $26 + local.get $25 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 - i32.store offset=72 - local.get $26 + local.get $27 + i32.store offset=76 + local.get $27 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 5344 - local.set $26 + local.get $18 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 + local.get $27 i32.store offset=8 - local.get $26 + local.get $27 i32.const 10 - local.get $25 - local.set $26 - global.get $~lib/memory/__stack_pointer - local.get $26 - i32.store offset=72 local.get $26 + local.set $27 + global.get $~lib/memory/__stack_pointer + local.get $27 + i32.store offset=76 + local.get $27 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 5344 - local.set $26 + local.get $18 + local.set $27 global.get $~lib/memory/__stack_pointer - local.get $26 + local.get $27 i32.store offset=8 - local.get $26 + local.get $27 i32.const 2432 call $~lib/staticarray/StaticArray<~lib/string/String>#join - local.set $26 + local.set $27 global.get $~lib/memory/__stack_pointer - i32.const 76 + i32.const 80 i32.add global.set $~lib/memory/__stack_pointer - local.get $26 + local.get $27 return ) (func $~lib/string/String#indexOf (param $this i32) (param $search i32) (param $start i32) (result i32) diff --git a/tests/compiler/std/date.release.wat b/tests/compiler/std/date.release.wat index ada5d9f64a..e6f68bade0 100644 --- a/tests/compiler/std/date.release.wat +++ b/tests/compiler/std/date.release.wat @@ -1672,8 +1672,8 @@ (local $5 i32) (local $6 i32) global.get $~lib/memory/__stack_pointer - i32.const -64 - i32.add + i32.const 68 + i32.sub global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1682,7 +1682,7 @@ br_if $folding-inner0 global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 64 + i32.const 68 memory.fill global.get $~lib/memory/__stack_pointer local.get $0 @@ -1876,27 +1876,30 @@ local.tee $0 i32.store offset=32 global.get $~lib/memory/__stack_pointer - local.get $1 + i32.const 3616 i32.store offset=36 global.get $~lib/memory/__stack_pointer - local.get $2 + local.get $1 i32.store offset=40 global.get $~lib/memory/__stack_pointer - local.get $3 + local.get $2 i32.store offset=44 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $3 i32.store offset=48 global.get $~lib/memory/__stack_pointer - local.get $5 + local.get $4 i32.store offset=52 global.get $~lib/memory/__stack_pointer - local.get $6 + local.get $5 i32.store offset=56 global.get $~lib/memory/__stack_pointer - local.get $0 + local.get $6 i32.store offset=60 global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=64 + global.get $~lib/memory/__stack_pointer i32.const 3616 i32.store global.get $~lib/memory/__stack_pointer @@ -1993,8 +1996,8 @@ i32.const 3616 call $~lib/staticarray/StaticArray<~lib/string/String>#join global.get $~lib/memory/__stack_pointer - i32.const -64 - i32.sub + i32.const 68 + i32.add global.set $~lib/memory/__stack_pointer return end @@ -4310,7 +4313,7 @@ (local $7 i32) (local $8 i32) global.get $~lib/memory/__stack_pointer - i32.const 76 + i32.const 80 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer @@ -4326,7 +4329,7 @@ end global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 76 + i32.const 80 memory.fill global.get $~lib/memory/__stack_pointer i32.const 28 @@ -4487,15 +4490,18 @@ local.tee $0 i32.store offset=36 global.get $~lib/memory/__stack_pointer - local.get $1 + i32.const 6368 i32.store offset=40 global.get $~lib/memory/__stack_pointer - local.get $2 + local.get $1 i32.store offset=44 global.get $~lib/memory/__stack_pointer - local.get $3 + local.get $2 i32.store offset=48 global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=52 + global.get $~lib/memory/__stack_pointer i32.const 1616 i32.const 3456 local.get $6 @@ -4503,25 +4509,25 @@ i32.lt_s select local.tee $6 - i32.store offset=52 + i32.store offset=56 global.get $~lib/memory/__stack_pointer local.get $7 - i32.store offset=56 + i32.store offset=60 global.get $~lib/memory/__stack_pointer local.get $4 - i32.store offset=60 + i32.store offset=64 global.get $~lib/memory/__stack_pointer local.get $5 - i32.store offset=64 + i32.store offset=68 global.get $~lib/memory/__stack_pointer local.get $0 - i32.store offset=68 + i32.store offset=72 global.get $~lib/memory/__stack_pointer i32.const 6368 i32.store offset=8 global.get $~lib/memory/__stack_pointer local.get $1 - i32.store offset=72 + i32.store offset=76 i32.const 6368 local.get $1 i32.store @@ -4534,7 +4540,7 @@ i32.store offset=8 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=72 + i32.store offset=76 i32.const 6372 local.get $2 i32.store @@ -4547,7 +4553,7 @@ i32.store offset=8 global.get $~lib/memory/__stack_pointer local.get $3 - i32.store offset=72 + i32.store offset=76 i32.const 6376 local.get $3 i32.store @@ -4560,7 +4566,7 @@ i32.store offset=8 global.get $~lib/memory/__stack_pointer local.get $6 - i32.store offset=72 + i32.store offset=76 i32.const 6380 local.get $6 i32.store @@ -4573,7 +4579,7 @@ i32.store offset=8 global.get $~lib/memory/__stack_pointer local.get $7 - i32.store offset=72 + i32.store offset=76 i32.const 6384 local.get $7 i32.store @@ -4586,7 +4592,7 @@ i32.store offset=8 global.get $~lib/memory/__stack_pointer local.get $4 - i32.store offset=72 + i32.store offset=76 i32.const 6392 local.get $4 i32.store @@ -4599,7 +4605,7 @@ i32.store offset=8 global.get $~lib/memory/__stack_pointer local.get $5 - i32.store offset=72 + i32.store offset=76 i32.const 6400 local.get $5 i32.store @@ -4612,7 +4618,7 @@ i32.store offset=8 global.get $~lib/memory/__stack_pointer local.get $0 - i32.store offset=72 + i32.store offset=76 i32.const 6408 local.get $0 i32.store @@ -4626,7 +4632,7 @@ i32.const 6368 call $~lib/staticarray/StaticArray<~lib/string/String>#join global.get $~lib/memory/__stack_pointer - i32.const 76 + i32.const 80 i32.add global.set $~lib/memory/__stack_pointer ) @@ -4639,7 +4645,7 @@ (local $6 i32) (local $7 i32) global.get $~lib/memory/__stack_pointer - i32.const 52 + i32.const 56 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer @@ -4655,7 +4661,7 @@ end global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 52 + i32.const 56 memory.fill global.get $~lib/memory/__stack_pointer i32.const 28 @@ -4786,15 +4792,18 @@ local.tee $3 i32.store offset=24 global.get $~lib/memory/__stack_pointer - local.get $2 + i32.const 5152 i32.store offset=28 global.get $~lib/memory/__stack_pointer - local.get $1 + local.get $2 i32.store offset=32 global.get $~lib/memory/__stack_pointer - local.get $3 + local.get $1 i32.store offset=36 global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=40 + global.get $~lib/memory/__stack_pointer i32.const 5200 i32.const 5232 local.get $0 @@ -4802,16 +4811,16 @@ i32.lt_s select local.tee $0 - i32.store offset=40 + i32.store offset=44 global.get $~lib/memory/__stack_pointer local.get $6 - i32.store offset=44 + i32.store offset=48 global.get $~lib/memory/__stack_pointer i32.const 5152 i32.store offset=8 global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=48 + i32.store offset=52 i32.const 5152 local.get $2 i32.store @@ -4824,7 +4833,7 @@ i32.store offset=8 global.get $~lib/memory/__stack_pointer local.get $1 - i32.store offset=48 + i32.store offset=52 i32.const 5156 local.get $1 i32.store @@ -4837,7 +4846,7 @@ i32.store offset=8 global.get $~lib/memory/__stack_pointer local.get $3 - i32.store offset=48 + i32.store offset=52 i32.const 5160 local.get $3 i32.store @@ -4850,7 +4859,7 @@ i32.store offset=8 global.get $~lib/memory/__stack_pointer local.get $0 - i32.store offset=48 + i32.store offset=52 i32.const 5164 local.get $0 i32.store @@ -4863,7 +4872,7 @@ i32.store offset=8 global.get $~lib/memory/__stack_pointer local.get $6 - i32.store offset=48 + i32.store offset=52 i32.const 5168 local.get $6 i32.store @@ -4877,7 +4886,7 @@ i32.const 5152 call $~lib/staticarray/StaticArray<~lib/string/String>#join global.get $~lib/memory/__stack_pointer - i32.const 52 + i32.const 56 i32.add global.set $~lib/memory/__stack_pointer ) @@ -5477,7 +5486,7 @@ (local $1 i32) (local $2 i32) global.get $~lib/memory/__stack_pointer - i32.const 32 + i32.const 36 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer @@ -5493,7 +5502,7 @@ end global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 32 + i32.const 36 memory.fill global.get $~lib/memory/__stack_pointer local.get $0 @@ -5526,20 +5535,23 @@ local.tee $0 i32.store offset=12 global.get $~lib/memory/__stack_pointer - local.get $1 + i32.const 5456 i32.store offset=16 global.get $~lib/memory/__stack_pointer - local.get $2 + local.get $1 i32.store offset=20 global.get $~lib/memory/__stack_pointer - local.get $0 + local.get $2 i32.store offset=24 global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=28 + global.get $~lib/memory/__stack_pointer i32.const 5456 i32.store global.get $~lib/memory/__stack_pointer local.get $1 - i32.store offset=28 + i32.store offset=32 i32.const 5456 local.get $1 i32.store @@ -5552,7 +5564,7 @@ i32.store global.get $~lib/memory/__stack_pointer local.get $2 - i32.store offset=28 + i32.store offset=32 i32.const 5464 local.get $2 i32.store @@ -5565,7 +5577,7 @@ i32.store global.get $~lib/memory/__stack_pointer local.get $0 - i32.store offset=28 + i32.store offset=32 i32.const 5472 local.get $0 i32.store @@ -5579,7 +5591,7 @@ i32.const 5456 call $~lib/staticarray/StaticArray<~lib/string/String>#join global.get $~lib/memory/__stack_pointer - i32.const 32 + i32.const 36 i32.add global.set $~lib/memory/__stack_pointer ) diff --git a/tests/compiler/templateliteral-high-pressure.debug.wat b/tests/compiler/templateliteral-high-pressure.debug.wat new file mode 100644 index 0000000000..bb2b83b81e --- /dev/null +++ b/tests/compiler/templateliteral-high-pressure.debug.wat @@ -0,0 +1,3531 @@ +(module + (type $0 (func (param i32) (result i32))) + (type $1 (func (param i32 i32))) + (type $2 (func (param i32))) + (type $3 (func)) + (type $4 (func (param i32 i32) (result i32))) + (type $5 (func (param i32 i32 i32))) + (type $6 (func (param i32 i32 i32 i32))) + (type $7 (func (param i32 i32 i64) (result i32))) + (type $8 (func (result i32))) + (type $9 (func (param i32 i64 i32))) + (type $10 (func (param i64 i32) (result i32))) + (type $11 (func (param i32 i64 i32 i32))) + (type $12 (func (param i32 i32 i32) (result i32))) + (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (global $templateliteral-high-pressure/fakeData i32 (i32.const 32)) + (global $templateliteral-high-pressure/len (mut i32) (i32.const 0)) + (global $~lib/shared/runtime/Runtime.Stub i32 (i32.const 0)) + (global $~lib/shared/runtime/Runtime.Minimal i32 (i32.const 1)) + (global $~lib/shared/runtime/Runtime.Incremental i32 (i32.const 2)) + (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/visitCount (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/pinSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) + (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) + (global $~lib/native/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) + (global $~lib/native/ASC_SHRINK_LEVEL i32 (i32.const 0)) + (global $~lib/rt/__rtti_base i32 (i32.const 32496)) + (global $~lib/memory/__data_end i32 (i32.const 32520)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 65288)) + (global $~lib/memory/__heap_base i32 (i32.const 65288)) + (memory $0 1) + (data $0 (i32.const 12) ",u\00\00\00\00\00\00\00\00\00\00\02\00\00\00\16u\00\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00\00\00\00\00\00\00") + (data $1 (i32.const 30012) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0c\00\00\00[\00T\00e\00s\00t\00]\00") + (data $2 (i32.const 30044) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\02\00\00\00-\00\00\00\00\00\00\00\00\00\00\00") + (data $3 (i32.const 30076) "<\00\00\00\03\00\00\00\00\00\00\00\04\00\00\00 \00\00\00Pu\00\00\00\00\00\00pu\00\00\00\00\00\00pu\00\00\00\00\00\00pu\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $4 (i32.const 30140) "|\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00d\00\00\00t\00o\00S\00t\00r\00i\00n\00g\00(\00)\00 \00r\00a\00d\00i\00x\00 \00a\00r\00g\00u\00m\00e\00n\00t\00 \00m\00u\00s\00t\00 \00b\00e\00 \00b\00e\00t\00w\00e\00e\00n\00 \002\00 \00a\00n\00d\00 \003\006\00\00\00\00\00\00\00\00\00") + (data $5 (i32.const 30268) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00&\00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00n\00u\00m\00b\00e\00r\00.\00t\00s\00\00\00\00\00\00\00") + (data $6 (i32.const 30332) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\02\00\00\000\00\00\00\00\00\00\00\00\00\00\00") + (data $7 (i32.const 30364) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") + (data $8 (i32.const 30428) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $9 (i32.const 30496) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $10 (i32.const 30528) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $11 (i32.const 30556) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e\00\00\00\00\00\00\00\00\00") + (data $12 (i32.const 30620) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s\00\00\00\00\00\00\00\00\00") + (data $13 (i32.const 30672) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $14 (i32.const 30700) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $15 (i32.const 30764) "0\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\00") + (data $16 (i32.const 31164) "\1c\04\00\00\00\00\00\00\00\00\00\00\02\00\00\00\00\04\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\000\00a\000\00b\000\00c\000\00d\000\00e\000\00f\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\001\00a\001\00b\001\00c\001\00d\001\00e\001\00f\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\002\00a\002\00b\002\00c\002\00d\002\00e\002\00f\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\003\00a\003\00b\003\00c\003\00d\003\00e\003\00f\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\004\00a\004\00b\004\00c\004\00d\004\00e\004\00f\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\005\00a\005\00b\005\00c\005\00d\005\00e\005\00f\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\006\00a\006\00b\006\00c\006\00d\006\00e\006\00f\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\007\00a\007\00b\007\00c\007\00d\007\00e\007\00f\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\008\00a\008\00b\008\00c\008\00d\008\00e\008\00f\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\009\00a\009\00b\009\00c\009\00d\009\00e\009\00f\00a\000\00a\001\00a\002\00a\003\00a\004\00a\005\00a\006\00a\007\00a\008\00a\009\00a\00a\00a\00b\00a\00c\00a\00d\00a\00e\00a\00f\00b\000\00b\001\00b\002\00b\003\00b\004\00b\005\00b\006\00b\007\00b\008\00b\009\00b\00a\00b\00b\00b\00c\00b\00d\00b\00e\00b\00f\00c\000\00c\001\00c\002\00c\003\00c\004\00c\005\00c\006\00c\007\00c\008\00c\009\00c\00a\00c\00b\00c\00c\00c\00d\00c\00e\00c\00f\00d\000\00d\001\00d\002\00d\003\00d\004\00d\005\00d\006\00d\007\00d\008\00d\009\00d\00a\00d\00b\00d\00c\00d\00d\00d\00e\00d\00f\00e\000\00e\001\00e\002\00e\003\00e\004\00e\005\00e\006\00e\007\00e\008\00e\009\00e\00a\00e\00b\00e\00c\00e\00d\00e\00e\00e\00f\00f\000\00f\001\00f\002\00f\003\00f\004\00f\005\00f\006\00f\007\00f\008\00f\009\00f\00a\00f\00b\00f\00c\00f\00d\00f\00e\00f\00f\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $17 (i32.const 32220) "\\\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00H\00\00\000\001\002\003\004\005\006\007\008\009\00a\00b\00c\00d\00e\00f\00g\00h\00i\00j\00k\00l\00m\00n\00o\00p\00q\00r\00s\00t\00u\00v\00w\00x\00y\00z\00\00\00\00\00") + (data $18 (i32.const 32316) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $19 (i32.const 32348) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1a\00\00\00[\00T\00e\00s\00t\00]\001\00-\001\00-\001\00-\001\00\00\00") + (data $20 (i32.const 32396) "\\\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00@\00\00\00t\00e\00m\00p\00l\00a\00t\00e\00l\00i\00t\00e\00r\00a\00l\00-\00h\00i\00g\00h\00-\00p\00r\00e\00s\00s\00u\00r\00e\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $21 (i32.const 32496) "\05\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00\04A\00\00") + (table $0 1 1 funcref) + (elem $0 (i32.const 1)) + (export "len" (global $templateliteral-high-pressure/len)) + (export "memory" (memory $0)) + (start $~start) + (func $~lib/rt/common/OBJECT#get:rtSize (param $this i32) (result i32) + local.get $this + i32.load offset=16 + ) + (func $~lib/string/String#get:length (param $this i32) (result i32) + local.get $this + i32.const 20 + i32.sub + call $~lib/rt/common/OBJECT#get:rtSize + i32.const 1 + i32.shr_u + return + ) + (func $~lib/util/number/decimalCount32 (param $value i32) (result i32) + local.get $value + i32.const 100000 + i32.lt_u + if + local.get $value + i32.const 100 + i32.lt_u + if + i32.const 1 + local.get $value + i32.const 10 + i32.ge_u + i32.add + return + else + i32.const 3 + local.get $value + i32.const 10000 + i32.ge_u + i32.add + local.get $value + i32.const 1000 + i32.ge_u + i32.add + return + end + unreachable + else + local.get $value + i32.const 10000000 + i32.lt_u + if + i32.const 6 + local.get $value + i32.const 1000000 + i32.ge_u + i32.add + return + else + i32.const 8 + local.get $value + i32.const 1000000000 + i32.ge_u + i32.add + local.get $value + i32.const 100000000 + i32.ge_u + i32.add + return + end + unreachable + end + unreachable + ) + (func $~lib/rt/itcms/Object#set:nextWithColor (param $this i32) (param $nextWithColor i32) + local.get $this + local.get $nextWithColor + i32.store offset=4 + ) + (func $~lib/rt/itcms/Object#set:prev (param $this i32) (param $prev i32) + local.get $this + local.get $prev + i32.store offset=8 + ) + (func $~lib/rt/itcms/initLazy (param $space i32) (result i32) + local.get $space + local.get $space + call $~lib/rt/itcms/Object#set:nextWithColor + local.get $space + local.get $space + call $~lib/rt/itcms/Object#set:prev + local.get $space + return + ) + (func $~lib/rt/itcms/Object#get:nextWithColor (param $this i32) (result i32) + local.get $this + i32.load offset=4 + ) + (func $~lib/rt/itcms/Object#get:next (param $this i32) (result i32) + local.get $this + call $~lib/rt/itcms/Object#get:nextWithColor + i32.const 3 + i32.const -1 + i32.xor + i32.and + return + ) + (func $~lib/rt/itcms/Object#get:color (param $this i32) (result i32) + local.get $this + call $~lib/rt/itcms/Object#get:nextWithColor + i32.const 3 + i32.and + return + ) + (func $~lib/rt/itcms/visitRoots (param $cookie i32) + (local $pn i32) + (local $iter i32) + local.get $cookie + call $~lib/rt/__visit_globals + global.get $~lib/rt/itcms/pinSpace + local.set $pn + local.get $pn + call $~lib/rt/itcms/Object#get:next + local.set $iter + loop $while-continue|0 + local.get $iter + local.get $pn + i32.ne + if + i32.const 1 + drop + local.get $iter + call $~lib/rt/itcms/Object#get:color + i32.const 3 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 30448 + i32.const 160 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $iter + i32.const 20 + i32.add + local.get $cookie + call $~lib/rt/__visit_members + local.get $iter + call $~lib/rt/itcms/Object#get:next + local.set $iter + br $while-continue|0 + end + end + ) + (func $~lib/rt/itcms/Object#set:color (param $this i32) (param $color i32) + local.get $this + local.get $this + call $~lib/rt/itcms/Object#get:nextWithColor + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.get $color + i32.or + call $~lib/rt/itcms/Object#set:nextWithColor + ) + (func $~lib/rt/itcms/Object#get:prev (param $this i32) (result i32) + local.get $this + i32.load offset=8 + ) + (func $~lib/rt/itcms/Object#set:next (param $this i32) (param $obj i32) + local.get $this + local.get $obj + local.get $this + call $~lib/rt/itcms/Object#get:nextWithColor + i32.const 3 + i32.and + i32.or + call $~lib/rt/itcms/Object#set:nextWithColor + ) + (func $~lib/rt/itcms/Object#unlink (param $this i32) + (local $next i32) + (local $prev i32) + local.get $this + call $~lib/rt/itcms/Object#get:next + local.set $next + local.get $next + i32.const 0 + i32.eq + if + i32.const 1 + drop + local.get $this + call $~lib/rt/itcms/Object#get:prev + i32.const 0 + i32.eq + if (result i32) + local.get $this + global.get $~lib/memory/__heap_base + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 30448 + i32.const 128 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + return + end + local.get $this + call $~lib/rt/itcms/Object#get:prev + local.set $prev + i32.const 1 + drop + local.get $prev + i32.eqz + if + i32.const 0 + i32.const 30448 + i32.const 132 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $next + local.get $prev + call $~lib/rt/itcms/Object#set:prev + local.get $prev + local.get $next + call $~lib/rt/itcms/Object#set:next + ) + (func $~lib/rt/itcms/Object#get:rtId (param $this i32) (result i32) + local.get $this + i32.load offset=12 + ) + (func $~lib/shared/typeinfo/Typeinfo#get:flags (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $~lib/rt/__typeinfo (param $id i32) (result i32) + (local $ptr i32) + global.get $~lib/rt/__rtti_base + local.set $ptr + local.get $id + local.get $ptr + i32.load + i32.gt_u + if + i32.const 30576 + i32.const 30640 + i32.const 21 + i32.const 28 + call $~lib/builtins/abort + unreachable + end + local.get $ptr + i32.const 4 + i32.add + local.get $id + i32.const 4 + i32.mul + i32.add + call $~lib/shared/typeinfo/Typeinfo#get:flags + return + ) + (func $~lib/rt/itcms/Object#get:isPointerfree (param $this i32) (result i32) + (local $rtId i32) + local.get $this + call $~lib/rt/itcms/Object#get:rtId + local.set $rtId + local.get $rtId + i32.const 2 + i32.le_u + if (result i32) + i32.const 1 + else + local.get $rtId + call $~lib/rt/__typeinfo + i32.const 32 + i32.and + i32.const 0 + i32.ne + end + return + ) + (func $~lib/rt/itcms/Object#linkTo (param $this i32) (param $list i32) (param $withColor i32) + (local $prev i32) + local.get $list + call $~lib/rt/itcms/Object#get:prev + local.set $prev + local.get $this + local.get $list + local.get $withColor + i32.or + call $~lib/rt/itcms/Object#set:nextWithColor + local.get $this + local.get $prev + call $~lib/rt/itcms/Object#set:prev + local.get $prev + local.get $this + call $~lib/rt/itcms/Object#set:next + local.get $list + local.get $this + call $~lib/rt/itcms/Object#set:prev + ) + (func $~lib/rt/itcms/Object#makeGray (param $this i32) + (local $1 i32) + local.get $this + global.get $~lib/rt/itcms/iter + i32.eq + if + local.get $this + call $~lib/rt/itcms/Object#get:prev + local.tee $1 + i32.eqz + if (result i32) + i32.const 0 + i32.const 30448 + i32.const 148 + i32.const 30 + call $~lib/builtins/abort + unreachable + else + local.get $1 + end + global.set $~lib/rt/itcms/iter + end + local.get $this + call $~lib/rt/itcms/Object#unlink + local.get $this + global.get $~lib/rt/itcms/toSpace + local.get $this + call $~lib/rt/itcms/Object#get:isPointerfree + if (result i32) + global.get $~lib/rt/itcms/white + i32.eqz + else + i32.const 2 + end + call $~lib/rt/itcms/Object#linkTo + ) + (func $~lib/rt/itcms/__visit (param $ptr i32) (param $cookie i32) + (local $obj i32) + local.get $ptr + i32.eqz + if + return + end + local.get $ptr + i32.const 20 + i32.sub + local.set $obj + i32.const 0 + drop + local.get $obj + call $~lib/rt/itcms/Object#get:color + global.get $~lib/rt/itcms/white + i32.eq + if + local.get $obj + call $~lib/rt/itcms/Object#makeGray + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.add + global.set $~lib/rt/itcms/visitCount + end + ) + (func $~lib/rt/itcms/visitStack (param $cookie i32) + (local $ptr i32) + global.get $~lib/memory/__stack_pointer + local.set $ptr + loop $while-continue|0 + local.get $ptr + global.get $~lib/memory/__heap_base + i32.lt_u + if + local.get $ptr + i32.load + local.get $cookie + call $~lib/rt/itcms/__visit + local.get $ptr + i32.const 4 + i32.add + local.set $ptr + br $while-continue|0 + end + end + ) + (func $~lib/rt/common/BLOCK#get:mmInfo (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $~lib/rt/itcms/Object#get:size (param $this i32) (result i32) + i32.const 4 + local.get $this + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + return + ) + (func $~lib/rt/tlsf/Root#set:flMap (param $this i32) (param $flMap i32) + local.get $this + local.get $flMap + i32.store + ) + (func $~lib/rt/common/BLOCK#set:mmInfo (param $this i32) (param $mmInfo i32) + local.get $this + local.get $mmInfo + i32.store + ) + (func $~lib/rt/tlsf/Block#set:prev (param $this i32) (param $prev i32) + local.get $this + local.get $prev + i32.store offset=4 + ) + (func $~lib/rt/tlsf/Block#set:next (param $this i32) (param $next i32) + local.get $this + local.get $next + i32.store offset=8 + ) + (func $~lib/rt/tlsf/Block#get:prev (param $this i32) (result i32) + local.get $this + i32.load offset=4 + ) + (func $~lib/rt/tlsf/Block#get:next (param $this i32) (result i32) + local.get $this + i32.load offset=8 + ) + (func $~lib/rt/tlsf/Root#get:flMap (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $~lib/rt/tlsf/removeBlock (param $root i32) (param $block i32) + (local $blockInfo i32) + (local $size i32) + (local $fl i32) + (local $sl i32) + (local $6 i32) + (local $7 i32) + (local $boundedSize i32) + (local $prev i32) + (local $next i32) + (local $root|11 i32) + (local $fl|12 i32) + (local $sl|13 i32) + (local $root|14 i32) + (local $fl|15 i32) + (local $sl|16 i32) + (local $head i32) + (local $root|18 i32) + (local $fl|19 i32) + (local $slMap i32) + (local $root|21 i32) + (local $fl|22 i32) + (local $slMap|23 i32) + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $blockInfo + i32.const 1 + drop + local.get $blockInfo + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 30720 + i32.const 268 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $blockInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.set $size + i32.const 1 + drop + local.get $size + i32.const 12 + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 30720 + i32.const 270 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $size + i32.const 256 + i32.lt_u + if + i32.const 0 + local.set $fl + local.get $size + i32.const 4 + i32.shr_u + local.set $sl + else + local.get $size + local.tee $6 + i32.const 1073741820 + local.tee $7 + local.get $6 + local.get $7 + i32.lt_u + select + local.set $boundedSize + i32.const 31 + local.get $boundedSize + i32.clz + i32.sub + local.set $fl + local.get $boundedSize + local.get $fl + i32.const 4 + i32.sub + i32.shr_u + i32.const 1 + i32.const 4 + i32.shl + i32.xor + local.set $sl + local.get $fl + i32.const 8 + i32.const 1 + i32.sub + i32.sub + local.set $fl + end + i32.const 1 + drop + local.get $fl + i32.const 23 + i32.lt_u + if (result i32) + local.get $sl + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 30720 + i32.const 284 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $block + call $~lib/rt/tlsf/Block#get:prev + local.set $prev + local.get $block + call $~lib/rt/tlsf/Block#get:next + local.set $next + local.get $prev + if + local.get $prev + local.get $next + call $~lib/rt/tlsf/Block#set:next + end + local.get $next + if + local.get $next + local.get $prev + call $~lib/rt/tlsf/Block#set:prev + end + local.get $block + block $~lib/rt/tlsf/GETHEAD|inlined.0 (result i32) + local.get $root + local.set $root|11 + local.get $fl + local.set $fl|12 + local.get $sl + local.set $sl|13 + local.get $root|11 + local.get $fl|12 + i32.const 4 + i32.shl + local.get $sl|13 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + br $~lib/rt/tlsf/GETHEAD|inlined.0 + end + i32.eq + if + local.get $root + local.set $root|14 + local.get $fl + local.set $fl|15 + local.get $sl + local.set $sl|16 + local.get $next + local.set $head + local.get $root|14 + local.get $fl|15 + i32.const 4 + i32.shl + local.get $sl|16 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $head + i32.store offset=96 + local.get $next + i32.eqz + if + block $~lib/rt/tlsf/GETSL|inlined.0 (result i32) + local.get $root + local.set $root|18 + local.get $fl + local.set $fl|19 + local.get $root|18 + local.get $fl|19 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + br $~lib/rt/tlsf/GETSL|inlined.0 + end + local.set $slMap + local.get $root + local.set $root|21 + local.get $fl + local.set $fl|22 + local.get $slMap + i32.const 1 + local.get $sl + i32.shl + i32.const -1 + i32.xor + i32.and + local.tee $slMap + local.set $slMap|23 + local.get $root|21 + local.get $fl|22 + i32.const 2 + i32.shl + i32.add + local.get $slMap|23 + i32.store offset=4 + local.get $slMap + i32.eqz + if + local.get $root + local.get $root + call $~lib/rt/tlsf/Root#get:flMap + i32.const 1 + local.get $fl + i32.shl + i32.const -1 + i32.xor + i32.and + call $~lib/rt/tlsf/Root#set:flMap + end + end + end + ) + (func $~lib/rt/tlsf/insertBlock (param $root i32) (param $block i32) + (local $blockInfo i32) + (local $block|3 i32) + (local $right i32) + (local $rightInfo i32) + (local $block|6 i32) + (local $block|7 i32) + (local $left i32) + (local $leftInfo i32) + (local $size i32) + (local $fl i32) + (local $sl i32) + (local $13 i32) + (local $14 i32) + (local $boundedSize i32) + (local $root|16 i32) + (local $fl|17 i32) + (local $sl|18 i32) + (local $head i32) + (local $root|20 i32) + (local $fl|21 i32) + (local $sl|22 i32) + (local $head|23 i32) + (local $root|24 i32) + (local $fl|25 i32) + (local $root|26 i32) + (local $fl|27 i32) + (local $slMap i32) + i32.const 1 + drop + local.get $block + i32.eqz + if + i32.const 0 + i32.const 30720 + i32.const 201 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $blockInfo + i32.const 1 + drop + local.get $blockInfo + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 30720 + i32.const 203 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + block $~lib/rt/tlsf/GETRIGHT|inlined.0 (result i32) + local.get $block + local.set $block|3 + local.get $block|3 + i32.const 4 + i32.add + local.get $block|3 + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + br $~lib/rt/tlsf/GETRIGHT|inlined.0 + end + local.set $right + local.get $right + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $rightInfo + local.get $rightInfo + i32.const 1 + i32.and + if + local.get $root + local.get $right + call $~lib/rt/tlsf/removeBlock + local.get $block + local.get $blockInfo + i32.const 4 + i32.add + local.get $rightInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.tee $blockInfo + call $~lib/rt/common/BLOCK#set:mmInfo + block $~lib/rt/tlsf/GETRIGHT|inlined.1 (result i32) + local.get $block + local.set $block|6 + local.get $block|6 + i32.const 4 + i32.add + local.get $block|6 + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + br $~lib/rt/tlsf/GETRIGHT|inlined.1 + end + local.set $right + local.get $right + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $rightInfo + end + local.get $blockInfo + i32.const 2 + i32.and + if + block $~lib/rt/tlsf/GETFREELEFT|inlined.0 (result i32) + local.get $block + local.set $block|7 + local.get $block|7 + i32.const 4 + i32.sub + i32.load + br $~lib/rt/tlsf/GETFREELEFT|inlined.0 + end + local.set $left + local.get $left + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $leftInfo + i32.const 1 + drop + local.get $leftInfo + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 30720 + i32.const 221 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $root + local.get $left + call $~lib/rt/tlsf/removeBlock + local.get $left + local.set $block + local.get $block + local.get $leftInfo + i32.const 4 + i32.add + local.get $blockInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.tee $blockInfo + call $~lib/rt/common/BLOCK#set:mmInfo + end + local.get $right + local.get $rightInfo + i32.const 2 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $blockInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.set $size + i32.const 1 + drop + local.get $size + i32.const 12 + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 30720 + i32.const 233 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + drop + local.get $block + i32.const 4 + i32.add + local.get $size + i32.add + local.get $right + i32.eq + i32.eqz + if + i32.const 0 + i32.const 30720 + i32.const 234 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $right + i32.const 4 + i32.sub + local.get $block + i32.store + local.get $size + i32.const 256 + i32.lt_u + if + i32.const 0 + local.set $fl + local.get $size + i32.const 4 + i32.shr_u + local.set $sl + else + local.get $size + local.tee $13 + i32.const 1073741820 + local.tee $14 + local.get $13 + local.get $14 + i32.lt_u + select + local.set $boundedSize + i32.const 31 + local.get $boundedSize + i32.clz + i32.sub + local.set $fl + local.get $boundedSize + local.get $fl + i32.const 4 + i32.sub + i32.shr_u + i32.const 1 + i32.const 4 + i32.shl + i32.xor + local.set $sl + local.get $fl + i32.const 8 + i32.const 1 + i32.sub + i32.sub + local.set $fl + end + i32.const 1 + drop + local.get $fl + i32.const 23 + i32.lt_u + if (result i32) + local.get $sl + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 30720 + i32.const 251 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + block $~lib/rt/tlsf/GETHEAD|inlined.1 (result i32) + local.get $root + local.set $root|16 + local.get $fl + local.set $fl|17 + local.get $sl + local.set $sl|18 + local.get $root|16 + local.get $fl|17 + i32.const 4 + i32.shl + local.get $sl|18 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + br $~lib/rt/tlsf/GETHEAD|inlined.1 + end + local.set $head + local.get $block + i32.const 0 + call $~lib/rt/tlsf/Block#set:prev + local.get $block + local.get $head + call $~lib/rt/tlsf/Block#set:next + local.get $head + if + local.get $head + local.get $block + call $~lib/rt/tlsf/Block#set:prev + end + local.get $root + local.set $root|20 + local.get $fl + local.set $fl|21 + local.get $sl + local.set $sl|22 + local.get $block + local.set $head|23 + local.get $root|20 + local.get $fl|21 + i32.const 4 + i32.shl + local.get $sl|22 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $head|23 + i32.store offset=96 + local.get $root + local.get $root + call $~lib/rt/tlsf/Root#get:flMap + i32.const 1 + local.get $fl + i32.shl + i32.or + call $~lib/rt/tlsf/Root#set:flMap + local.get $root + local.set $root|26 + local.get $fl + local.set $fl|27 + block $~lib/rt/tlsf/GETSL|inlined.1 (result i32) + local.get $root + local.set $root|24 + local.get $fl + local.set $fl|25 + local.get $root|24 + local.get $fl|25 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + br $~lib/rt/tlsf/GETSL|inlined.1 + end + i32.const 1 + local.get $sl + i32.shl + i32.or + local.set $slMap + local.get $root|26 + local.get $fl|27 + i32.const 2 + i32.shl + i32.add + local.get $slMap + i32.store offset=4 + ) + (func $~lib/rt/tlsf/addMemory (param $root i32) (param $start i32) (param $endU64 i64) (result i32) + (local $end i32) + (local $root|4 i32) + (local $tail i32) + (local $tailInfo i32) + (local $size i32) + (local $leftSize i32) + (local $left i32) + (local $root|10 i32) + (local $tail|11 i32) + local.get $endU64 + i32.wrap_i64 + local.set $end + i32.const 1 + drop + local.get $start + i64.extend_i32_u + local.get $endU64 + i64.le_u + i32.eqz + if + i32.const 0 + i32.const 30720 + i32.const 382 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $start + i32.const 4 + i32.add + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + i32.const 4 + i32.sub + local.set $start + local.get $end + i32.const 15 + i32.const -1 + i32.xor + i32.and + local.set $end + block $~lib/rt/tlsf/GETTAIL|inlined.0 (result i32) + local.get $root + local.set $root|4 + local.get $root|4 + i32.load offset=1568 + br $~lib/rt/tlsf/GETTAIL|inlined.0 + end + local.set $tail + i32.const 0 + local.set $tailInfo + local.get $tail + if + i32.const 1 + drop + local.get $start + local.get $tail + i32.const 4 + i32.add + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 30720 + i32.const 389 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $start + i32.const 16 + i32.sub + local.get $tail + i32.eq + if + local.get $start + i32.const 16 + i32.sub + local.set $start + local.get $tail + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $tailInfo + else + end + else + i32.const 1 + drop + local.get $start + local.get $root + i32.const 1572 + i32.add + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 30720 + i32.const 402 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + end + local.get $end + local.get $start + i32.sub + local.set $size + local.get $size + i32.const 4 + i32.const 12 + i32.add + i32.const 4 + i32.add + i32.lt_u + if + i32.const 0 + return + end + local.get $size + i32.const 2 + i32.const 4 + i32.mul + i32.sub + local.set $leftSize + local.get $start + local.set $left + local.get $left + local.get $leftSize + i32.const 1 + i32.or + local.get $tailInfo + i32.const 2 + i32.and + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $left + i32.const 0 + call $~lib/rt/tlsf/Block#set:prev + local.get $left + i32.const 0 + call $~lib/rt/tlsf/Block#set:next + local.get $start + i32.const 4 + i32.add + local.get $leftSize + i32.add + local.set $tail + local.get $tail + i32.const 0 + i32.const 2 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $root + local.set $root|10 + local.get $tail + local.set $tail|11 + local.get $root|10 + local.get $tail|11 + i32.store offset=1568 + local.get $root + local.get $left + call $~lib/rt/tlsf/insertBlock + i32.const 1 + return + ) + (func $~lib/rt/tlsf/initialize + (local $rootOffset i32) + (local $pagesBefore i32) + (local $pagesNeeded i32) + (local $root i32) + (local $root|4 i32) + (local $tail i32) + (local $fl i32) + (local $root|7 i32) + (local $fl|8 i32) + (local $slMap i32) + (local $sl i32) + (local $root|11 i32) + (local $fl|12 i32) + (local $sl|13 i32) + (local $head i32) + (local $memStart i32) + i32.const 0 + drop + global.get $~lib/memory/__heap_base + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + local.set $rootOffset + memory.size + local.set $pagesBefore + local.get $rootOffset + i32.const 1572 + i32.add + i32.const 65535 + i32.add + i32.const 65535 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.shr_u + local.set $pagesNeeded + local.get $pagesNeeded + local.get $pagesBefore + i32.gt_s + if (result i32) + local.get $pagesNeeded + local.get $pagesBefore + i32.sub + memory.grow + i32.const 0 + i32.lt_s + else + i32.const 0 + end + if + unreachable + end + local.get $rootOffset + local.set $root + local.get $root + i32.const 0 + call $~lib/rt/tlsf/Root#set:flMap + local.get $root + local.set $root|4 + i32.const 0 + local.set $tail + local.get $root|4 + local.get $tail + i32.store offset=1568 + i32.const 0 + local.set $fl + loop $for-loop|0 + local.get $fl + i32.const 23 + i32.lt_u + if + local.get $root + local.set $root|7 + local.get $fl + local.set $fl|8 + i32.const 0 + local.set $slMap + local.get $root|7 + local.get $fl|8 + i32.const 2 + i32.shl + i32.add + local.get $slMap + i32.store offset=4 + i32.const 0 + local.set $sl + loop $for-loop|1 + local.get $sl + i32.const 16 + i32.lt_u + if + local.get $root + local.set $root|11 + local.get $fl + local.set $fl|12 + local.get $sl + local.set $sl|13 + i32.const 0 + local.set $head + local.get $root|11 + local.get $fl|12 + i32.const 4 + i32.shl + local.get $sl|13 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $head + i32.store offset=96 + local.get $sl + i32.const 1 + i32.add + local.set $sl + br $for-loop|1 + end + end + local.get $fl + i32.const 1 + i32.add + local.set $fl + br $for-loop|0 + end + end + local.get $rootOffset + i32.const 1572 + i32.add + local.set $memStart + i32.const 0 + drop + local.get $root + local.get $memStart + memory.size + i64.extend_i32_s + i64.const 16 + i64.shl + call $~lib/rt/tlsf/addMemory + drop + local.get $root + global.set $~lib/rt/tlsf/ROOT + ) + (func $~lib/rt/tlsf/checkUsedBlock (param $ptr i32) (result i32) + (local $block i32) + local.get $ptr + i32.const 4 + i32.sub + local.set $block + local.get $ptr + i32.const 0 + i32.ne + if (result i32) + local.get $ptr + i32.const 15 + i32.and + i32.eqz + else + i32.const 0 + end + if (result i32) + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 1 + i32.and + i32.eqz + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 30720 + i32.const 562 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $block + return + ) + (func $~lib/rt/tlsf/freeBlock (param $root i32) (param $block i32) + i32.const 0 + drop + local.get $block + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 1 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $root + local.get $block + call $~lib/rt/tlsf/insertBlock + ) + (func $~lib/rt/tlsf/__free (param $ptr i32) + local.get $ptr + global.get $~lib/memory/__heap_base + i32.lt_u + if + return + end + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.get $ptr + call $~lib/rt/tlsf/checkUsedBlock + call $~lib/rt/tlsf/freeBlock + ) + (func $~lib/rt/itcms/free (param $obj i32) + local.get $obj + global.get $~lib/memory/__heap_base + i32.lt_u + if + local.get $obj + i32.const 0 + call $~lib/rt/itcms/Object#set:nextWithColor + local.get $obj + i32.const 0 + call $~lib/rt/itcms/Object#set:prev + else + global.get $~lib/rt/itcms/total + local.get $obj + call $~lib/rt/itcms/Object#get:size + i32.sub + global.set $~lib/rt/itcms/total + i32.const 0 + drop + local.get $obj + i32.const 4 + i32.add + call $~lib/rt/tlsf/__free + end + ) + (func $~lib/rt/itcms/step (result i32) + (local $obj i32) + (local $1 i32) + (local $black i32) + (local $from i32) + block $break|0 + block $case2|0 + block $case1|0 + block $case0|0 + global.get $~lib/rt/itcms/state + local.set $1 + local.get $1 + i32.const 0 + i32.eq + br_if $case0|0 + local.get $1 + i32.const 1 + i32.eq + br_if $case1|0 + local.get $1 + i32.const 2 + i32.eq + br_if $case2|0 + br $break|0 + end + i32.const 1 + global.set $~lib/rt/itcms/state + i32.const 0 + global.set $~lib/rt/itcms/visitCount + i32.const 0 + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/iter + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.mul + return + end + global.get $~lib/rt/itcms/white + i32.eqz + local.set $black + global.get $~lib/rt/itcms/iter + call $~lib/rt/itcms/Object#get:next + local.set $obj + loop $while-continue|1 + local.get $obj + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $obj + global.set $~lib/rt/itcms/iter + local.get $obj + call $~lib/rt/itcms/Object#get:color + local.get $black + i32.ne + if + local.get $obj + local.get $black + call $~lib/rt/itcms/Object#set:color + i32.const 0 + global.set $~lib/rt/itcms/visitCount + local.get $obj + i32.const 20 + i32.add + i32.const 0 + call $~lib/rt/__visit_members + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.mul + return + end + local.get $obj + call $~lib/rt/itcms/Object#get:next + local.set $obj + br $while-continue|1 + end + end + i32.const 0 + global.set $~lib/rt/itcms/visitCount + i32.const 0 + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/iter + call $~lib/rt/itcms/Object#get:next + local.set $obj + local.get $obj + global.get $~lib/rt/itcms/toSpace + i32.eq + if + i32.const 0 + call $~lib/rt/itcms/visitStack + global.get $~lib/rt/itcms/iter + call $~lib/rt/itcms/Object#get:next + local.set $obj + loop $while-continue|2 + local.get $obj + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $obj + call $~lib/rt/itcms/Object#get:color + local.get $black + i32.ne + if + local.get $obj + local.get $black + call $~lib/rt/itcms/Object#set:color + local.get $obj + i32.const 20 + i32.add + i32.const 0 + call $~lib/rt/__visit_members + end + local.get $obj + call $~lib/rt/itcms/Object#get:next + local.set $obj + br $while-continue|2 + end + end + global.get $~lib/rt/itcms/fromSpace + local.set $from + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/fromSpace + local.get $from + global.set $~lib/rt/itcms/toSpace + local.get $black + global.set $~lib/rt/itcms/white + local.get $from + call $~lib/rt/itcms/Object#get:next + global.set $~lib/rt/itcms/iter + i32.const 2 + global.set $~lib/rt/itcms/state + end + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.mul + return + end + global.get $~lib/rt/itcms/iter + local.set $obj + local.get $obj + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $obj + call $~lib/rt/itcms/Object#get:next + global.set $~lib/rt/itcms/iter + i32.const 1 + drop + local.get $obj + call $~lib/rt/itcms/Object#get:color + global.get $~lib/rt/itcms/white + i32.eqz + i32.eq + i32.eqz + if + i32.const 0 + i32.const 30448 + i32.const 229 + i32.const 20 + call $~lib/builtins/abort + unreachable + end + local.get $obj + call $~lib/rt/itcms/free + i32.const 10 + return + end + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + call $~lib/rt/itcms/Object#set:nextWithColor + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + call $~lib/rt/itcms/Object#set:prev + i32.const 0 + global.set $~lib/rt/itcms/state + br $break|0 + end + i32.const 0 + return + ) + (func $~lib/rt/itcms/interrupt + (local $budget i32) + i32.const 0 + drop + i32.const 0 + drop + i32.const 1024 + i32.const 200 + i32.mul + i32.const 100 + i32.div_u + local.set $budget + loop $do-loop|0 + local.get $budget + call $~lib/rt/itcms/step + i32.sub + local.set $budget + global.get $~lib/rt/itcms/state + i32.const 0 + i32.eq + if + i32.const 0 + drop + i32.const 200 + i32.const 100 + i32.rem_u + i32.const 0 + i32.eq + drop + global.get $~lib/rt/itcms/total + i32.const 200 + i32.const 100 + i32.div_u + i32.mul + i32.const 1024 + i32.add + global.set $~lib/rt/itcms/threshold + i32.const 0 + drop + return + end + local.get $budget + i32.const 0 + i32.gt_s + br_if $do-loop|0 + end + i32.const 0 + drop + global.get $~lib/rt/itcms/total + i32.const 1024 + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/threshold + i32.sub + i32.const 1024 + i32.lt_u + i32.mul + i32.add + global.set $~lib/rt/itcms/threshold + i32.const 0 + drop + ) + (func $~lib/rt/tlsf/computeSize (param $size i32) (result i32) + local.get $size + i32.const 12 + i32.le_u + if (result i32) + i32.const 12 + else + local.get $size + i32.const 4 + i32.add + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + i32.const 4 + i32.sub + end + return + ) + (func $~lib/rt/tlsf/prepareSize (param $size i32) (result i32) + local.get $size + i32.const 1073741820 + i32.gt_u + if + i32.const 30384 + i32.const 30720 + i32.const 461 + i32.const 29 + call $~lib/builtins/abort + unreachable + end + local.get $size + call $~lib/rt/tlsf/computeSize + return + ) + (func $~lib/rt/tlsf/roundSize (param $size i32) (result i32) + local.get $size + i32.const 536870910 + i32.lt_u + if (result i32) + local.get $size + i32.const 1 + i32.const 27 + local.get $size + i32.clz + i32.sub + i32.shl + i32.add + i32.const 1 + i32.sub + else + local.get $size + end + return + ) + (func $~lib/rt/tlsf/searchBlock (param $root i32) (param $size i32) (result i32) + (local $fl i32) + (local $sl i32) + (local $requestSize i32) + (local $root|5 i32) + (local $fl|6 i32) + (local $slMap i32) + (local $head i32) + (local $flMap i32) + (local $root|10 i32) + (local $fl|11 i32) + (local $root|12 i32) + (local $fl|13 i32) + (local $sl|14 i32) + (local $root|15 i32) + (local $fl|16 i32) + (local $sl|17 i32) + local.get $size + i32.const 256 + i32.lt_u + if + i32.const 0 + local.set $fl + local.get $size + i32.const 4 + i32.shr_u + local.set $sl + else + local.get $size + call $~lib/rt/tlsf/roundSize + local.set $requestSize + i32.const 4 + i32.const 8 + i32.mul + i32.const 1 + i32.sub + local.get $requestSize + i32.clz + i32.sub + local.set $fl + local.get $requestSize + local.get $fl + i32.const 4 + i32.sub + i32.shr_u + i32.const 1 + i32.const 4 + i32.shl + i32.xor + local.set $sl + local.get $fl + i32.const 8 + i32.const 1 + i32.sub + i32.sub + local.set $fl + end + i32.const 1 + drop + local.get $fl + i32.const 23 + i32.lt_u + if (result i32) + local.get $sl + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 30720 + i32.const 334 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + block $~lib/rt/tlsf/GETSL|inlined.2 (result i32) + local.get $root + local.set $root|5 + local.get $fl + local.set $fl|6 + local.get $root|5 + local.get $fl|6 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + br $~lib/rt/tlsf/GETSL|inlined.2 + end + i32.const 0 + i32.const -1 + i32.xor + local.get $sl + i32.shl + i32.and + local.set $slMap + i32.const 0 + local.set $head + local.get $slMap + i32.eqz + if + local.get $root + call $~lib/rt/tlsf/Root#get:flMap + i32.const 0 + i32.const -1 + i32.xor + local.get $fl + i32.const 1 + i32.add + i32.shl + i32.and + local.set $flMap + local.get $flMap + i32.eqz + if + i32.const 0 + local.set $head + else + local.get $flMap + i32.ctz + local.set $fl + block $~lib/rt/tlsf/GETSL|inlined.3 (result i32) + local.get $root + local.set $root|10 + local.get $fl + local.set $fl|11 + local.get $root|10 + local.get $fl|11 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + br $~lib/rt/tlsf/GETSL|inlined.3 + end + local.set $slMap + i32.const 1 + drop + local.get $slMap + i32.eqz + if + i32.const 0 + i32.const 30720 + i32.const 347 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + block $~lib/rt/tlsf/GETHEAD|inlined.2 (result i32) + local.get $root + local.set $root|12 + local.get $fl + local.set $fl|13 + local.get $slMap + i32.ctz + local.set $sl|14 + local.get $root|12 + local.get $fl|13 + i32.const 4 + i32.shl + local.get $sl|14 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + br $~lib/rt/tlsf/GETHEAD|inlined.2 + end + local.set $head + end + else + block $~lib/rt/tlsf/GETHEAD|inlined.3 (result i32) + local.get $root + local.set $root|15 + local.get $fl + local.set $fl|16 + local.get $slMap + i32.ctz + local.set $sl|17 + local.get $root|15 + local.get $fl|16 + i32.const 4 + i32.shl + local.get $sl|17 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + br $~lib/rt/tlsf/GETHEAD|inlined.3 + end + local.set $head + end + local.get $head + return + ) + (func $~lib/rt/tlsf/growMemory (param $root i32) (param $size i32) + (local $pagesBefore i32) + (local $root|3 i32) + (local $pagesNeeded i32) + (local $5 i32) + (local $6 i32) + (local $pagesWanted i32) + (local $pagesAfter i32) + i32.const 0 + drop + local.get $size + i32.const 256 + i32.ge_u + if + local.get $size + call $~lib/rt/tlsf/roundSize + local.set $size + end + memory.size + local.set $pagesBefore + local.get $size + i32.const 4 + local.get $pagesBefore + i32.const 16 + i32.shl + i32.const 4 + i32.sub + block $~lib/rt/tlsf/GETTAIL|inlined.1 (result i32) + local.get $root + local.set $root|3 + local.get $root|3 + i32.load offset=1568 + br $~lib/rt/tlsf/GETTAIL|inlined.1 + end + i32.ne + i32.shl + i32.add + local.set $size + local.get $size + i32.const 65535 + i32.add + i32.const 65535 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.shr_u + local.set $pagesNeeded + local.get $pagesBefore + local.tee $5 + local.get $pagesNeeded + local.tee $6 + local.get $5 + local.get $6 + i32.gt_s + select + local.set $pagesWanted + local.get $pagesWanted + memory.grow + i32.const 0 + i32.lt_s + if + local.get $pagesNeeded + memory.grow + i32.const 0 + i32.lt_s + if + unreachable + end + end + memory.size + local.set $pagesAfter + local.get $root + local.get $pagesBefore + i32.const 16 + i32.shl + local.get $pagesAfter + i64.extend_i32_s + i64.const 16 + i64.shl + call $~lib/rt/tlsf/addMemory + drop + ) + (func $~lib/rt/tlsf/prepareBlock (param $root i32) (param $block i32) (param $size i32) + (local $blockInfo i32) + (local $remaining i32) + (local $spare i32) + (local $block|6 i32) + (local $block|7 i32) + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $blockInfo + i32.const 1 + drop + local.get $size + i32.const 4 + i32.add + i32.const 15 + i32.and + i32.eqz + i32.eqz + if + i32.const 0 + i32.const 30720 + i32.const 361 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $blockInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.get $size + i32.sub + local.set $remaining + local.get $remaining + i32.const 4 + i32.const 12 + i32.add + i32.ge_u + if + local.get $block + local.get $size + local.get $blockInfo + i32.const 2 + i32.and + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $block + i32.const 4 + i32.add + local.get $size + i32.add + local.set $spare + local.get $spare + local.get $remaining + i32.const 4 + i32.sub + i32.const 1 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $root + local.get $spare + call $~lib/rt/tlsf/insertBlock + else + local.get $block + local.get $blockInfo + i32.const 1 + i32.const -1 + i32.xor + i32.and + call $~lib/rt/common/BLOCK#set:mmInfo + block $~lib/rt/tlsf/GETRIGHT|inlined.3 (result i32) + local.get $block + local.set $block|7 + local.get $block|7 + i32.const 4 + i32.add + local.get $block|7 + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + br $~lib/rt/tlsf/GETRIGHT|inlined.3 + end + block $~lib/rt/tlsf/GETRIGHT|inlined.2 (result i32) + local.get $block + local.set $block|6 + local.get $block|6 + i32.const 4 + i32.add + local.get $block|6 + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + br $~lib/rt/tlsf/GETRIGHT|inlined.2 + end + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 2 + i32.const -1 + i32.xor + i32.and + call $~lib/rt/common/BLOCK#set:mmInfo + end + ) + (func $~lib/rt/tlsf/allocateBlock (param $root i32) (param $size i32) (result i32) + (local $payloadSize i32) + (local $block i32) + local.get $size + call $~lib/rt/tlsf/prepareSize + local.set $payloadSize + local.get $root + local.get $payloadSize + call $~lib/rt/tlsf/searchBlock + local.set $block + local.get $block + i32.eqz + if + local.get $root + local.get $payloadSize + call $~lib/rt/tlsf/growMemory + local.get $root + local.get $payloadSize + call $~lib/rt/tlsf/searchBlock + local.set $block + i32.const 1 + drop + local.get $block + i32.eqz + if + i32.const 0 + i32.const 30720 + i32.const 499 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + end + i32.const 1 + drop + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.get $payloadSize + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 30720 + i32.const 501 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $root + local.get $block + call $~lib/rt/tlsf/removeBlock + local.get $root + local.get $block + local.get $payloadSize + call $~lib/rt/tlsf/prepareBlock + i32.const 0 + drop + local.get $block + return + ) + (func $~lib/rt/tlsf/__alloc (param $size i32) (result i32) + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.get $size + call $~lib/rt/tlsf/allocateBlock + i32.const 4 + i32.add + return + ) + (func $~lib/rt/itcms/Object#set:rtId (param $this i32) (param $rtId i32) + local.get $this + local.get $rtId + i32.store offset=12 + ) + (func $~lib/rt/itcms/Object#set:rtSize (param $this i32) (param $rtSize i32) + local.get $this + local.get $rtSize + i32.store offset=16 + ) + (func $~lib/rt/itcms/__new (param $size i32) (param $id i32) (result i32) + (local $obj i32) + (local $ptr i32) + local.get $size + i32.const 1073741804 + i32.ge_u + if + i32.const 30384 + i32.const 30448 + i32.const 261 + i32.const 31 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/threshold + i32.ge_u + if + call $~lib/rt/itcms/interrupt + end + i32.const 16 + local.get $size + i32.add + call $~lib/rt/tlsf/__alloc + i32.const 4 + i32.sub + local.set $obj + local.get $obj + local.get $id + call $~lib/rt/itcms/Object#set:rtId + local.get $obj + local.get $size + call $~lib/rt/itcms/Object#set:rtSize + local.get $obj + global.get $~lib/rt/itcms/fromSpace + global.get $~lib/rt/itcms/white + call $~lib/rt/itcms/Object#linkTo + global.get $~lib/rt/itcms/total + local.get $obj + call $~lib/rt/itcms/Object#get:size + i32.add + global.set $~lib/rt/itcms/total + local.get $obj + i32.const 20 + i32.add + local.set $ptr + local.get $ptr + i32.const 0 + local.get $size + memory.fill + local.get $ptr + return + ) + (func $~lib/util/number/utoa32_dec_lut (param $buffer i32) (param $num i32) (param $offset i32) + (local $t i32) + (local $r i32) + (local $d1 i32) + (local $d2 i32) + (local $digits1 i64) + (local $digits2 i64) + (local $t|9 i32) + (local $d1|10 i32) + (local $digits i32) + (local $digits|12 i32) + (local $digit i32) + loop $while-continue|0 + local.get $num + i32.const 10000 + i32.ge_u + if + local.get $num + i32.const 10000 + i32.div_u + local.set $t + local.get $num + i32.const 10000 + i32.rem_u + local.set $r + local.get $t + local.set $num + local.get $r + i32.const 100 + i32.div_u + local.set $d1 + local.get $r + i32.const 100 + i32.rem_u + local.set $d2 + i32.const 30764 + local.get $d1 + i32.const 2 + i32.shl + i32.add + i64.load32_u + local.set $digits1 + i32.const 30764 + local.get $d2 + i32.const 2 + i32.shl + i32.add + i64.load32_u + local.set $digits2 + local.get $offset + i32.const 4 + i32.sub + local.set $offset + local.get $buffer + local.get $offset + i32.const 1 + i32.shl + i32.add + local.get $digits1 + local.get $digits2 + i64.const 32 + i64.shl + i64.or + i64.store + br $while-continue|0 + end + end + local.get $num + i32.const 100 + i32.ge_u + if + local.get $num + i32.const 100 + i32.div_u + local.set $t|9 + local.get $num + i32.const 100 + i32.rem_u + local.set $d1|10 + local.get $t|9 + local.set $num + local.get $offset + i32.const 2 + i32.sub + local.set $offset + i32.const 30764 + local.get $d1|10 + i32.const 2 + i32.shl + i32.add + i32.load + local.set $digits + local.get $buffer + local.get $offset + i32.const 1 + i32.shl + i32.add + local.get $digits + i32.store + end + local.get $num + i32.const 10 + i32.ge_u + if + local.get $offset + i32.const 2 + i32.sub + local.set $offset + i32.const 30764 + local.get $num + i32.const 2 + i32.shl + i32.add + i32.load + local.set $digits|12 + local.get $buffer + local.get $offset + i32.const 1 + i32.shl + i32.add + local.get $digits|12 + i32.store + else + local.get $offset + i32.const 1 + i32.sub + local.set $offset + i32.const 48 + local.get $num + i32.add + local.set $digit + local.get $buffer + local.get $offset + i32.const 1 + i32.shl + i32.add + local.get $digit + i32.store16 + end + ) + (func $~lib/util/number/utoa_hex_lut (param $buffer i32) (param $num i64) (param $offset i32) + loop $while-continue|0 + local.get $offset + i32.const 2 + i32.ge_u + if + local.get $offset + i32.const 2 + i32.sub + local.set $offset + local.get $buffer + local.get $offset + i32.const 1 + i32.shl + i32.add + i32.const 31184 + local.get $num + i32.wrap_i64 + i32.const 255 + i32.and + i32.const 2 + i32.shl + i32.add + i32.load + i32.store + local.get $num + i64.const 8 + i64.shr_u + local.set $num + br $while-continue|0 + end + end + local.get $offset + i32.const 1 + i32.and + if + local.get $buffer + i32.const 31184 + local.get $num + i32.wrap_i64 + i32.const 6 + i32.shl + i32.add + i32.load16_u + i32.store16 + end + ) + (func $~lib/util/number/ulog_base (param $num i64) (param $base i32) (result i32) + (local $value i32) + (local $b64 i64) + (local $b i64) + (local $e i32) + block $~lib/util/number/isPowerOf2|inlined.0 (result i32) + local.get $base + local.set $value + local.get $value + i32.popcnt + i32.const 1 + i32.eq + br $~lib/util/number/isPowerOf2|inlined.0 + end + if + i32.const 63 + local.get $num + i64.clz + i32.wrap_i64 + i32.sub + i32.const 31 + local.get $base + i32.clz + i32.sub + i32.div_u + i32.const 1 + i32.add + return + end + local.get $base + i64.extend_i32_s + local.set $b64 + local.get $b64 + local.set $b + i32.const 1 + local.set $e + loop $while-continue|0 + local.get $num + local.get $b + i64.ge_u + if + local.get $num + local.get $b + i64.div_u + local.set $num + local.get $b + local.get $b + i64.mul + local.set $b + local.get $e + i32.const 1 + i32.shl + local.set $e + br $while-continue|0 + end + end + loop $while-continue|1 + local.get $num + i64.const 1 + i64.ge_u + if + local.get $num + local.get $b64 + i64.div_u + local.set $num + local.get $e + i32.const 1 + i32.add + local.set $e + br $while-continue|1 + end + end + local.get $e + i32.const 1 + i32.sub + return + ) + (func $~lib/util/number/utoa64_any_core (param $buffer i32) (param $num i64) (param $offset i32) (param $radix i32) + (local $base i64) + (local $shift i64) + (local $mask i64) + (local $q i64) + local.get $radix + i64.extend_i32_s + local.set $base + local.get $radix + local.get $radix + i32.const 1 + i32.sub + i32.and + i32.const 0 + i32.eq + if + local.get $radix + i32.ctz + i32.const 7 + i32.and + i64.extend_i32_s + local.set $shift + local.get $base + i64.const 1 + i64.sub + local.set $mask + loop $do-loop|0 + local.get $offset + i32.const 1 + i32.sub + local.set $offset + local.get $buffer + local.get $offset + i32.const 1 + i32.shl + i32.add + i32.const 32240 + local.get $num + local.get $mask + i64.and + i32.wrap_i64 + i32.const 1 + i32.shl + i32.add + i32.load16_u + i32.store16 + local.get $num + local.get $shift + i64.shr_u + local.set $num + local.get $num + i64.const 0 + i64.ne + br_if $do-loop|0 + end + else + loop $do-loop|1 + local.get $offset + i32.const 1 + i32.sub + local.set $offset + local.get $num + local.get $base + i64.div_u + local.set $q + local.get $buffer + local.get $offset + i32.const 1 + i32.shl + i32.add + i32.const 32240 + local.get $num + local.get $q + local.get $base + i64.mul + i64.sub + i32.wrap_i64 + i32.const 1 + i32.shl + i32.add + i32.load16_u + i32.store16 + local.get $q + local.set $num + local.get $num + i64.const 0 + i64.ne + br_if $do-loop|1 + end + end + ) + (func $~lib/number/I32#toString (param $this i32) (param $radix i32) (result i32) + local.get $this + local.get $radix + call $~lib/util/number/itoa32 + return + ) + (func $~lib/rt/itcms/__link (param $parentPtr i32) (param $childPtr i32) (param $expectMultiple i32) + (local $child i32) + (local $parent i32) + (local $parentColor i32) + local.get $childPtr + i32.eqz + if + return + end + i32.const 1 + drop + local.get $parentPtr + i32.eqz + if + i32.const 0 + i32.const 30448 + i32.const 295 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $childPtr + i32.const 20 + i32.sub + local.set $child + local.get $child + call $~lib/rt/itcms/Object#get:color + global.get $~lib/rt/itcms/white + i32.eq + if + local.get $parentPtr + i32.const 20 + i32.sub + local.set $parent + local.get $parent + call $~lib/rt/itcms/Object#get:color + local.set $parentColor + local.get $parentColor + global.get $~lib/rt/itcms/white + i32.eqz + i32.eq + if + local.get $expectMultiple + if + local.get $parent + call $~lib/rt/itcms/Object#makeGray + else + local.get $child + call $~lib/rt/itcms/Object#makeGray + end + else + local.get $parentColor + i32.const 3 + i32.eq + if (result i32) + global.get $~lib/rt/itcms/state + i32.const 1 + i32.eq + else + i32.const 0 + end + if + local.get $child + call $~lib/rt/itcms/Object#makeGray + end + end + end + ) + (func $~lib/staticarray/StaticArray<~lib/string/String>#__uset (param $this i32) (param $index i32) (param $value i32) + local.get $this + local.get $index + i32.const 2 + i32.shl + i32.add + local.get $value + i32.store + i32.const 1 + drop + local.get $this + local.get $value + i32.const 1 + call $~lib/rt/itcms/__link + ) + (func $~lib/staticarray/StaticArray<~lib/string/String>#get:length (param $this i32) (result i32) + local.get $this + i32.const 20 + i32.sub + call $~lib/rt/common/OBJECT#get:rtSize + i32.const 2 + i32.shr_u + return + ) + (func $start:templateliteral-high-pressure + memory.size + i32.const 16 + i32.shl + global.get $~lib/memory/__heap_base + i32.sub + i32.const 1 + i32.shr_u + global.set $~lib/rt/itcms/threshold + i32.const 30496 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/pinSpace + i32.const 30528 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/toSpace + i32.const 30672 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/fromSpace + call $templateliteral-high-pressure/test_staticarray_pressure + ) + (func $~lib/rt/__visit_globals (param $0 i32) + (local $1 i32) + global.get $templateliteral-high-pressure/fakeData + local.tee $1 + if + local.get $1 + local.get $0 + call $~lib/rt/itcms/__visit + end + i32.const 30576 + local.get $0 + call $~lib/rt/itcms/__visit + i32.const 30384 + local.get $0 + call $~lib/rt/itcms/__visit + i32.const 31184 + local.get $0 + call $~lib/rt/itcms/__visit + i32.const 32240 + local.get $0 + call $~lib/rt/itcms/__visit + ) + (func $~lib/arraybuffer/ArrayBufferView~visit (param $0 i32) (param $1 i32) + (local $2 i32) + local.get $0 + local.get $1 + call $~lib/object/Object~visit + local.get $0 + i32.load + local.get $1 + call $~lib/rt/itcms/__visit + ) + (func $~lib/object/Object~visit (param $0 i32) (param $1 i32) + ) + (func $~lib/staticarray/StaticArray<~lib/string/String>#__visit (param $this i32) (param $cookie i32) + (local $cur i32) + (local $end i32) + (local $val i32) + i32.const 1 + drop + local.get $this + local.set $cur + local.get $cur + local.get $this + i32.const 20 + i32.sub + call $~lib/rt/common/OBJECT#get:rtSize + i32.add + local.set $end + loop $while-continue|0 + local.get $cur + local.get $end + i32.lt_u + if + local.get $cur + i32.load + local.set $val + local.get $val + if + local.get $val + local.get $cookie + call $~lib/rt/itcms/__visit + end + local.get $cur + i32.const 4 + i32.add + local.set $cur + br $while-continue|0 + end + end + ) + (func $~lib/staticarray/StaticArray<~lib/string/String>~visit (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + call $~lib/object/Object~visit + local.get $0 + local.get $1 + call $~lib/staticarray/StaticArray<~lib/string/String>#__visit + ) + (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) + block $invalid + block $~lib/staticarray/StaticArray<~lib/string/String> + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + block $~lib/object/Object + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $~lib/object/Object $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $~lib/staticarray/StaticArray<~lib/string/String> $invalid + end + return + end + return + end + return + end + local.get $0 + local.get $1 + call $~lib/arraybuffer/ArrayBufferView~visit + return + end + local.get $0 + local.get $1 + call $~lib/staticarray/StaticArray<~lib/string/String>~visit + return + end + unreachable + ) + (func $~start + call $start:templateliteral-high-pressure + ) + (func $~stack_check + global.get $~lib/memory/__stack_pointer + global.get $~lib/memory/__data_end + i32.lt_s + if + i32.const 65312 + i32.const 65360 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + ) + (func $~lib/util/string/joinStringArray (param $dataStart i32) (param $length i32) (param $separator i32) (result i32) + (local $lastIndex i32) + (local $4 i32) + (local $estLen i32) + (local $value i32) + (local $i i32) + (local $offset i32) + (local $sepLen i32) + (local $result i32) + (local $i|11 i32) + (local $valueLen i32) + (local $13 i32) + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=8 + local.get $length + i32.const 1 + i32.sub + local.set $lastIndex + local.get $lastIndex + i32.const 0 + i32.lt_s + if + i32.const 32336 + local.set $13 + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $13 + return + end + local.get $lastIndex + i32.eqz + if + global.get $~lib/memory/__stack_pointer + local.get $dataStart + i32.load + local.tee $4 + i32.store + local.get $4 + if (result i32) + local.get $4 + else + i32.const 32336 + end + local.set $13 + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $13 + return + end + i32.const 0 + local.set $estLen + i32.const 0 + local.set $i + loop $for-loop|0 + local.get $i + local.get $length + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + local.get $dataStart + local.get $i + i32.const 2 + i32.shl + i32.add + i32.load + local.tee $value + i32.store offset=4 + local.get $value + i32.const 0 + i32.ne + if + local.get $estLen + local.get $value + local.set $13 + global.get $~lib/memory/__stack_pointer + local.get $13 + i32.store offset=8 + local.get $13 + call $~lib/string/String#get:length + i32.add + local.set $estLen + end + local.get $i + i32.const 1 + i32.add + local.set $i + br $for-loop|0 + end + end + i32.const 0 + local.set $offset + local.get $separator + local.set $13 + global.get $~lib/memory/__stack_pointer + local.get $13 + i32.store offset=8 + local.get $13 + call $~lib/string/String#get:length + local.set $sepLen + global.get $~lib/memory/__stack_pointer + local.get $estLen + local.get $sepLen + local.get $lastIndex + i32.mul + i32.add + i32.const 1 + i32.shl + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $result + i32.store offset=12 + i32.const 0 + local.set $i|11 + loop $for-loop|1 + local.get $i|11 + local.get $lastIndex + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + local.get $dataStart + local.get $i|11 + i32.const 2 + i32.shl + i32.add + i32.load + local.tee $value + i32.store offset=4 + local.get $value + i32.const 0 + i32.ne + if + local.get $value + local.set $13 + global.get $~lib/memory/__stack_pointer + local.get $13 + i32.store offset=8 + local.get $13 + call $~lib/string/String#get:length + local.set $valueLen + local.get $result + local.get $offset + i32.const 1 + i32.shl + i32.add + local.get $value + local.get $valueLen + i32.const 1 + i32.shl + memory.copy + local.get $offset + local.get $valueLen + i32.add + local.set $offset + end + local.get $sepLen + if + local.get $result + local.get $offset + i32.const 1 + i32.shl + i32.add + local.get $separator + local.get $sepLen + i32.const 1 + i32.shl + memory.copy + local.get $offset + local.get $sepLen + i32.add + local.set $offset + end + local.get $i|11 + i32.const 1 + i32.add + local.set $i|11 + br $for-loop|1 + end + end + global.get $~lib/memory/__stack_pointer + local.get $dataStart + local.get $lastIndex + i32.const 2 + i32.shl + i32.add + i32.load + local.tee $value + i32.store offset=4 + local.get $value + i32.const 0 + i32.ne + if + local.get $result + local.get $offset + i32.const 1 + i32.shl + i32.add + local.get $value + local.get $value + local.set $13 + global.get $~lib/memory/__stack_pointer + local.get $13 + i32.store offset=8 + local.get $13 + call $~lib/string/String#get:length + i32.const 1 + i32.shl + memory.copy + end + local.get $result + local.set $13 + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $13 + return + ) + (func $~lib/staticarray/StaticArray<~lib/string/String>#join (param $this i32) (param $separator i32) (result i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + i32.const 0 + drop + i32.const 0 + drop + i32.const 0 + drop + i32.const 0 + i32.const 1 + i32.lt_s + drop + i32.const 1 + drop + local.get $this + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + call $~lib/staticarray/StaticArray<~lib/string/String>#get:length + local.get $separator + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + call $~lib/util/string/joinStringArray + local.set $2 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + return + ) + (func $templateliteral-high-pressure/test_staticarray_pressure + (local $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $sstr i32) + (local $6 i32) + global.get $~lib/memory/__stack_pointer + i32.const 32 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 32 + memory.fill + global.get $templateliteral-high-pressure/fakeData + call $~lib/string/String#get:length + global.set $templateliteral-high-pressure/len + global.get $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 30096 + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1 + i32.const 10 + call $~lib/number/I32#toString + local.tee $1 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 1 + i32.const 10 + call $~lib/number/I32#toString + local.tee $2 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 1 + i32.const 10 + call $~lib/number/I32#toString + local.tee $3 + i32.store offset=12 + global.get $~lib/memory/__stack_pointer + i32.const 1 + i32.const 10 + call $~lib/number/I32#toString + local.tee $4 + i32.store offset=16 + local.get $0 + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=20 + local.get $6 + i32.const 1 + local.get $1 + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=24 + local.get $6 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + local.get $0 + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=20 + local.get $6 + i32.const 3 + local.get $2 + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=24 + local.get $6 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + local.get $0 + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=20 + local.get $6 + i32.const 5 + local.get $3 + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=24 + local.get $6 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + local.get $0 + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=20 + local.get $6 + i32.const 7 + local.get $4 + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=24 + local.get $6 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + local.get $0 + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=20 + local.get $6 + i32.const 32336 + call $~lib/staticarray/StaticArray<~lib/string/String>#join + local.tee $sstr + i32.store offset=28 + local.get $sstr + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=20 + local.get $6 + call $~lib/string/String#get:length + i32.const 32368 + call $~lib/string/String#get:length + i32.eq + i32.eqz + if + i32.const 0 + i32.const 32416 + i32.const 12 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 32 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/util/number/itoa32 (param $value i32) (param $radix i32) (result i32) + (local $sign i32) + (local $out i32) + (local $decimals i32) + (local $buffer i32) + (local $num i32) + (local $offset i32) + (local $decimals|8 i32) + (local $buffer|9 i32) + (local $num|10 i32) + (local $offset|11 i32) + (local $val32 i32) + (local $decimals|13 i32) + (local $14 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $radix + i32.const 2 + i32.lt_s + if (result i32) + i32.const 1 + else + local.get $radix + i32.const 36 + i32.gt_s + end + if + i32.const 30160 + i32.const 30288 + i32.const 373 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + local.get $value + i32.eqz + if + i32.const 30352 + local.set $14 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $14 + return + end + local.get $value + i32.const 31 + i32.shr_u + i32.const 1 + i32.shl + local.set $sign + local.get $sign + if + i32.const 0 + local.get $value + i32.sub + local.set $value + end + local.get $radix + i32.const 10 + i32.eq + if + local.get $value + call $~lib/util/number/decimalCount32 + local.set $decimals + global.get $~lib/memory/__stack_pointer + local.get $decimals + i32.const 1 + i32.shl + local.get $sign + i32.add + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $out + i32.store + local.get $out + local.get $sign + i32.add + local.set $buffer + local.get $value + local.set $num + local.get $decimals + local.set $offset + i32.const 0 + i32.const 1 + i32.ge_s + drop + local.get $buffer + local.get $num + local.get $offset + call $~lib/util/number/utoa32_dec_lut + else + local.get $radix + i32.const 16 + i32.eq + if + i32.const 31 + local.get $value + i32.clz + i32.sub + i32.const 2 + i32.shr_s + i32.const 1 + i32.add + local.set $decimals|8 + global.get $~lib/memory/__stack_pointer + local.get $decimals|8 + i32.const 1 + i32.shl + local.get $sign + i32.add + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $out + i32.store + local.get $out + local.get $sign + i32.add + local.set $buffer|9 + local.get $value + local.set $num|10 + local.get $decimals|8 + local.set $offset|11 + i32.const 0 + i32.const 1 + i32.ge_s + drop + local.get $buffer|9 + local.get $num|10 + i64.extend_i32_u + local.get $offset|11 + call $~lib/util/number/utoa_hex_lut + else + local.get $value + local.set $val32 + local.get $val32 + i64.extend_i32_u + local.get $radix + call $~lib/util/number/ulog_base + local.set $decimals|13 + global.get $~lib/memory/__stack_pointer + local.get $decimals|13 + i32.const 1 + i32.shl + local.get $sign + i32.add + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $out + i32.store + local.get $out + local.get $sign + i32.add + local.get $val32 + i64.extend_i32_u + local.get $decimals|13 + local.get $radix + call $~lib/util/number/utoa64_any_core + end + end + local.get $sign + if + local.get $out + i32.const 45 + i32.store16 + end + local.get $out + local.set $14 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $14 + return + ) +) diff --git a/tests/compiler/templateliteral-high-pressure.json b/tests/compiler/templateliteral-high-pressure.json new file mode 100644 index 0000000000..1bdd02b1be --- /dev/null +++ b/tests/compiler/templateliteral-high-pressure.json @@ -0,0 +1,4 @@ +{ + "asc_flags": [ + ] +} diff --git a/tests/compiler/templateliteral-high-pressure.release.wat b/tests/compiler/templateliteral-high-pressure.release.wat new file mode 100644 index 0000000000..0a338123c8 --- /dev/null +++ b/tests/compiler/templateliteral-high-pressure.release.wat @@ -0,0 +1,2195 @@ +(module + (type $0 (func (param i32))) + (type $1 (func (param i32 i32))) + (type $2 (func)) + (type $3 (func (result i32))) + (type $4 (func (param i32) (result i32))) + (type $5 (func (param i32 i32 i32 i32))) + (type $6 (func (param i32 i32) (result i32))) + (type $7 (func (param i32 i32 i64))) + (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (global $templateliteral-high-pressure/len (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/visitCount (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/pinSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) + (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 66312)) + (memory $0 2) + (data $0 (i32.const 1036) ",u") + (data $0.1 (i32.const 1048) "\02\00\00\00\16u\00\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00A\00A\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X\00X") + (data $1 (i32.const 31036) "\1c") + (data $1.1 (i32.const 31048) "\02\00\00\00\0c\00\00\00[\00T\00e\00s\00t\00]") + (data $2 (i32.const 31068) "\1c") + (data $2.1 (i32.const 31080) "\02\00\00\00\02\00\00\00-") + (data $3 (i32.const 31100) "<\00\00\00\03\00\00\00\00\00\00\00\04\00\00\00 \00\00\00Py\00\00\00\00\00\00py\00\00\00\00\00\00py\00\00\00\00\00\00py") + (data $4 (i32.const 31164) "|") + (data $4.1 (i32.const 31176) "\02\00\00\00d\00\00\00t\00o\00S\00t\00r\00i\00n\00g\00(\00)\00 \00r\00a\00d\00i\00x\00 \00a\00r\00g\00u\00m\00e\00n\00t\00 \00m\00u\00s\00t\00 \00b\00e\00 \00b\00e\00t\00w\00e\00e\00n\00 \002\00 \00a\00n\00d\00 \003\006") + (data $5 (i32.const 31292) "<") + (data $5.1 (i32.const 31304) "\02\00\00\00&\00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00n\00u\00m\00b\00e\00r\00.\00t\00s") + (data $6 (i32.const 31356) "\1c") + (data $6.1 (i32.const 31368) "\02\00\00\00\02\00\00\000") + (data $7 (i32.const 31388) "<") + (data $7.1 (i32.const 31400) "\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") + (data $8 (i32.const 31452) "<") + (data $8.1 (i32.const 31464) "\02\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s") + (data $11 (i32.const 31580) "<") + (data $11.1 (i32.const 31592) "\02\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e") + (data $12 (i32.const 31644) ",") + (data $12.1 (i32.const 31656) "\02\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") + (data $14 (i32.const 31724) "<") + (data $14.1 (i32.const 31736) "\02\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s") + (data $15 (i32.const 31788) "0\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009") + (data $16 (i32.const 32188) "\1c\04") + (data $16.1 (i32.const 32200) "\02\00\00\00\00\04\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\000\00a\000\00b\000\00c\000\00d\000\00e\000\00f\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\001\00a\001\00b\001\00c\001\00d\001\00e\001\00f\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\002\00a\002\00b\002\00c\002\00d\002\00e\002\00f\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\003\00a\003\00b\003\00c\003\00d\003\00e\003\00f\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\004\00a\004\00b\004\00c\004\00d\004\00e\004\00f\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\005\00a\005\00b\005\00c\005\00d\005\00e\005\00f\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\006\00a\006\00b\006\00c\006\00d\006\00e\006\00f\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\007\00a\007\00b\007\00c\007\00d\007\00e\007\00f\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\008\00a\008\00b\008\00c\008\00d\008\00e\008\00f\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\009\00a\009\00b\009\00c\009\00d\009\00e\009\00f\00a\000\00a\001\00a\002\00a\003\00a\004\00a\005\00a\006\00a\007\00a\008\00a\009\00a\00a\00a\00b\00a\00c\00a\00d\00a\00e\00a\00f\00b\000\00b\001\00b\002\00b\003\00b\004\00b\005\00b\006\00b\007\00b\008\00b\009\00b\00a\00b\00b\00b\00c\00b\00d\00b\00e\00b\00f\00c\000\00c\001\00c\002\00c\003\00c\004\00c\005\00c\006\00c\007\00c\008\00c\009\00c\00a\00c\00b\00c\00c\00c\00d\00c\00e\00c\00f\00d\000\00d\001\00d\002\00d\003\00d\004\00d\005\00d\006\00d\007\00d\008\00d\009\00d\00a\00d\00b\00d\00c\00d\00d\00d\00e\00d\00f\00e\000\00e\001\00e\002\00e\003\00e\004\00e\005\00e\006\00e\007\00e\008\00e\009\00e\00a\00e\00b\00e\00c\00e\00d\00e\00e\00e\00f\00f\000\00f\001\00f\002\00f\003\00f\004\00f\005\00f\006\00f\007\00f\008\00f\009\00f\00a\00f\00b\00f\00c\00f\00d\00f\00e\00f\00f") + (data $17 (i32.const 33244) "\\") + (data $17.1 (i32.const 33256) "\02\00\00\00H\00\00\000\001\002\003\004\005\006\007\008\009\00a\00b\00c\00d\00e\00f\00g\00h\00i\00j\00k\00l\00m\00n\00o\00p\00q\00r\00s\00t\00u\00v\00w\00x\00y\00z") + (data $18 (i32.const 33340) "\1c") + (data $18.1 (i32.const 33352) "\02") + (data $19 (i32.const 33372) ",") + (data $19.1 (i32.const 33384) "\02\00\00\00\1a\00\00\00[\00T\00e\00s\00t\00]\001\00-\001\00-\001\00-\001") + (data $20 (i32.const 33420) "\\") + (data $20.1 (i32.const 33432) "\02\00\00\00@\00\00\00t\00e\00m\00p\00l\00a\00t\00e\00l\00i\00t\00e\00r\00a\00l\00-\00h\00i\00g\00h\00-\00p\00r\00e\00s\00s\00u\00r\00e\00.\00t\00s") + (data $21 (i32.const 33520) "\05\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00\04A") + (export "len" (global $templateliteral-high-pressure/len)) + (export "memory" (memory $0)) + (start $~start) + (func $~lib/rt/itcms/__visit (param $0 i32) + local.get $0 + i32.eqz + if + return + end + global.get $~lib/rt/itcms/white + local.get $0 + i32.const 20 + i32.sub + local.tee $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.eq + if + local.get $0 + call $~lib/rt/itcms/Object#makeGray + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.add + global.set $~lib/rt/itcms/visitCount + end + ) + (func $~lib/staticarray/StaticArray<~lib/string/String>#__uset (param $0 i32) (param $1 i32) + local.get $0 + i32.const 2 + i32.shl + i32.const 31120 + i32.add + local.get $1 + i32.store + local.get $1 + if + global.get $~lib/rt/itcms/white + local.get $1 + i32.const 20 + i32.sub + local.tee $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.eq + if + i32.const 31104 + i32.load + i32.const 3 + i32.and + local.tee $1 + global.get $~lib/rt/itcms/white + i32.eqz + i32.eq + if + i32.const 31100 + call $~lib/rt/itcms/Object#makeGray + else + global.get $~lib/rt/itcms/state + i32.const 1 + i32.eq + local.get $1 + i32.const 3 + i32.eq + i32.and + if + local.get $0 + call $~lib/rt/itcms/Object#makeGray + end + end + end + end + ) + (func $~lib/number/I32#toString (result i32) + (local $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 33544 + i32.lt_s + if + i32.const 66336 + i32.const 66384 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + i32.const 1 + local.set $0 + i32.const 1 + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $2 + i32.store + loop $while-continue|0 + local.get $0 + i32.const 10000 + i32.ge_u + if + local.get $0 + i32.const 10000 + i32.rem_u + local.set $1 + local.get $0 + i32.const 10000 + i32.div_u + local.set $0 + local.get $2 + local.get $3 + i32.const 4 + i32.sub + local.tee $3 + i32.const 1 + i32.shl + i32.add + local.get $1 + i32.const 100 + i32.div_u + i32.const 2 + i32.shl + i32.const 31788 + i32.add + i64.load32_u + local.get $1 + i32.const 100 + i32.rem_u + i32.const 2 + i32.shl + i32.const 31788 + i32.add + i64.load32_u + i64.const 32 + i64.shl + i64.or + i64.store + br $while-continue|0 + end + end + local.get $0 + i32.const 100 + i32.ge_u + if + local.get $2 + local.get $3 + i32.const 2 + i32.sub + local.tee $3 + i32.const 1 + i32.shl + i32.add + local.get $0 + i32.const 100 + i32.rem_u + i32.const 2 + i32.shl + i32.const 31788 + i32.add + i32.load + i32.store + local.get $0 + i32.const 100 + i32.div_u + local.set $0 + end + local.get $0 + i32.const 10 + i32.ge_u + if + local.get $2 + local.get $3 + i32.const 2 + i32.sub + i32.const 1 + i32.shl + i32.add + local.get $0 + i32.const 2 + i32.shl + i32.const 31788 + i32.add + i32.load + i32.store + else + local.get $2 + local.get $3 + i32.const 1 + i32.sub + i32.const 1 + i32.shl + i32.add + local.get $0 + i32.const 48 + i32.add + i32.store16 + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + ) + (func $~lib/rt/tlsf/removeBlock (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $1 + i32.load + local.tee $3 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 31744 + i32.const 268 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $3 + i32.const -4 + i32.and + local.tee $3 + i32.const 12 + i32.lt_u + if + i32.const 0 + i32.const 31744 + i32.const 270 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $3 + i32.const 256 + i32.lt_u + if (result i32) + local.get $3 + i32.const 4 + i32.shr_u + else + i32.const 31 + i32.const 1073741820 + local.get $3 + local.get $3 + i32.const 1073741820 + i32.ge_u + select + local.tee $3 + i32.clz + i32.sub + local.tee $4 + i32.const 7 + i32.sub + local.set $2 + local.get $3 + local.get $4 + i32.const 4 + i32.sub + i32.shr_u + i32.const 16 + i32.xor + end + local.tee $3 + i32.const 16 + i32.lt_u + local.get $2 + i32.const 23 + i32.lt_u + i32.and + i32.eqz + if + i32.const 0 + i32.const 31744 + i32.const 284 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.load offset=8 + local.set $5 + local.get $1 + i32.load offset=4 + local.tee $4 + if + local.get $4 + local.get $5 + i32.store offset=8 + end + local.get $5 + if + local.get $5 + local.get $4 + i32.store offset=4 + end + local.get $1 + local.get $0 + local.get $2 + i32.const 4 + i32.shl + local.get $3 + i32.add + i32.const 2 + i32.shl + i32.add + local.tee $1 + i32.load offset=96 + i32.eq + if + local.get $1 + local.get $5 + i32.store offset=96 + local.get $5 + i32.eqz + if + local.get $0 + local.get $2 + i32.const 2 + i32.shl + i32.add + local.tee $1 + i32.load offset=4 + i32.const -2 + local.get $3 + i32.rotl + i32.and + local.set $3 + local.get $1 + local.get $3 + i32.store offset=4 + local.get $3 + i32.eqz + if + local.get $0 + local.get $0 + i32.load + i32.const -2 + local.get $2 + i32.rotl + i32.and + i32.store + end + end + end + ) + (func $~lib/rt/tlsf/insertBlock (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + local.get $1 + i32.eqz + if + i32.const 0 + i32.const 31744 + i32.const 201 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.load + local.tee $3 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 31744 + i32.const 203 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 4 + i32.add + local.get $1 + i32.load + i32.const -4 + i32.and + i32.add + local.tee $4 + i32.load + local.tee $2 + i32.const 1 + i32.and + if + local.get $0 + local.get $4 + call $~lib/rt/tlsf/removeBlock + local.get $1 + local.get $3 + i32.const 4 + i32.add + local.get $2 + i32.const -4 + i32.and + i32.add + local.tee $3 + i32.store + local.get $1 + i32.const 4 + i32.add + local.get $1 + i32.load + i32.const -4 + i32.and + i32.add + local.tee $4 + i32.load + local.set $2 + end + local.get $3 + i32.const 2 + i32.and + if + local.get $1 + i32.const 4 + i32.sub + i32.load + local.tee $1 + i32.load + local.tee $6 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 31744 + i32.const 221 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $1 + call $~lib/rt/tlsf/removeBlock + local.get $1 + local.get $6 + i32.const 4 + i32.add + local.get $3 + i32.const -4 + i32.and + i32.add + local.tee $3 + i32.store + end + local.get $4 + local.get $2 + i32.const 2 + i32.or + i32.store + local.get $3 + i32.const -4 + i32.and + local.tee $2 + i32.const 12 + i32.lt_u + if + i32.const 0 + i32.const 31744 + i32.const 233 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $4 + local.get $1 + i32.const 4 + i32.add + local.get $2 + i32.add + i32.ne + if + i32.const 0 + i32.const 31744 + i32.const 234 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $4 + i32.const 4 + i32.sub + local.get $1 + i32.store + local.get $2 + i32.const 256 + i32.lt_u + if (result i32) + local.get $2 + i32.const 4 + i32.shr_u + else + i32.const 31 + i32.const 1073741820 + local.get $2 + local.get $2 + i32.const 1073741820 + i32.ge_u + select + local.tee $2 + i32.clz + i32.sub + local.tee $3 + i32.const 7 + i32.sub + local.set $5 + local.get $2 + local.get $3 + i32.const 4 + i32.sub + i32.shr_u + i32.const 16 + i32.xor + end + local.tee $2 + i32.const 16 + i32.lt_u + local.get $5 + i32.const 23 + i32.lt_u + i32.and + i32.eqz + if + i32.const 0 + i32.const 31744 + i32.const 251 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $5 + i32.const 4 + i32.shl + local.get $2 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + local.set $3 + local.get $1 + i32.const 0 + i32.store offset=4 + local.get $1 + local.get $3 + i32.store offset=8 + local.get $3 + if + local.get $3 + local.get $1 + i32.store offset=4 + end + local.get $0 + local.get $5 + i32.const 4 + i32.shl + local.get $2 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $1 + i32.store offset=96 + local.get $0 + local.get $0 + i32.load + i32.const 1 + local.get $5 + i32.shl + i32.or + i32.store + local.get $0 + local.get $5 + i32.const 2 + i32.shl + i32.add + local.tee $0 + local.get $0 + i32.load offset=4 + i32.const 1 + local.get $2 + i32.shl + i32.or + i32.store offset=4 + ) + (func $~lib/rt/itcms/Object#makeGray (param $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + local.get $0 + global.get $~lib/rt/itcms/iter + i32.eq + if + local.get $0 + i32.load offset=8 + local.tee $1 + i32.eqz + if + i32.const 0 + i32.const 31472 + i32.const 148 + i32.const 30 + call $~lib/builtins/abort + unreachable + end + local.get $1 + global.set $~lib/rt/itcms/iter + end + block $__inlined_func$~lib/rt/itcms/Object#unlink$132 + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + local.tee $1 + i32.eqz + if + local.get $0 + i32.load offset=8 + i32.eqz + local.get $0 + i32.const 66312 + i32.lt_u + i32.and + i32.eqz + if + i32.const 0 + i32.const 31472 + i32.const 128 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + br $__inlined_func$~lib/rt/itcms/Object#unlink$132 + end + local.get $0 + i32.load offset=8 + local.tee $2 + i32.eqz + if + i32.const 0 + i32.const 31472 + i32.const 132 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $1 + local.get $2 + i32.store offset=8 + local.get $2 + local.get $1 + local.get $2 + i32.load offset=4 + i32.const 3 + i32.and + i32.or + i32.store offset=4 + end + global.get $~lib/rt/itcms/toSpace + local.set $2 + local.get $0 + i32.load offset=12 + local.tee $1 + i32.const 2 + i32.le_u + if (result i32) + i32.const 1 + else + local.get $1 + i32.const 33520 + i32.load + i32.gt_u + if + i32.const 31600 + i32.const 31664 + i32.const 21 + i32.const 28 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 2 + i32.shl + i32.const 33524 + i32.add + i32.load + i32.const 32 + i32.and + end + local.set $3 + local.get $2 + i32.load offset=8 + local.set $1 + local.get $0 + global.get $~lib/rt/itcms/white + i32.eqz + i32.const 2 + local.get $3 + select + local.get $2 + i32.or + i32.store offset=4 + local.get $0 + local.get $1 + i32.store offset=8 + local.get $1 + local.get $0 + local.get $1 + i32.load offset=4 + i32.const 3 + i32.and + i32.or + i32.store offset=4 + local.get $2 + local.get $0 + i32.store offset=8 + ) + (func $~lib/rt/__visit_members (param $0 i32) + (local $1 i32) + (local $2 i32) + block $invalid + block $~lib/staticarray/StaticArray<~lib/string/String> + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + block $~lib/object/Object + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $~lib/object/Object $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $~lib/staticarray/StaticArray<~lib/string/String> $invalid + end + return + end + return + end + return + end + local.get $0 + i32.load + call $~lib/rt/itcms/__visit + return + end + local.get $0 + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.add + local.set $1 + loop $while-continue|0 + local.get $0 + local.get $1 + i32.lt_u + if + local.get $0 + i32.load + local.tee $2 + if + local.get $2 + call $~lib/rt/itcms/__visit + end + local.get $0 + i32.const 4 + i32.add + local.set $0 + br $while-continue|0 + end + end + return + end + unreachable + ) + (func $~lib/rt/tlsf/searchBlock (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + local.get $1 + i32.const 256 + i32.lt_u + if + local.get $1 + i32.const 4 + i32.shr_u + local.set $1 + else + local.get $1 + i32.const 536870910 + i32.lt_u + if + local.get $1 + i32.const 1 + i32.const 27 + local.get $1 + i32.clz + i32.sub + i32.shl + i32.add + i32.const 1 + i32.sub + local.set $1 + end + local.get $1 + i32.const 31 + local.get $1 + i32.clz + i32.sub + local.tee $2 + i32.const 4 + i32.sub + i32.shr_u + i32.const 16 + i32.xor + local.set $1 + local.get $2 + i32.const 7 + i32.sub + local.set $2 + end + local.get $1 + i32.const 16 + i32.lt_u + local.get $2 + i32.const 23 + i32.lt_u + i32.and + i32.eqz + if + i32.const 0 + i32.const 31744 + i32.const 334 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $2 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + i32.const -1 + local.get $1 + i32.shl + i32.and + local.tee $1 + if (result i32) + local.get $0 + local.get $1 + i32.ctz + local.get $2 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + else + local.get $0 + i32.load + i32.const -1 + local.get $2 + i32.const 1 + i32.add + i32.shl + i32.and + local.tee $1 + if (result i32) + local.get $0 + local.get $1 + i32.ctz + local.tee $1 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + local.tee $2 + i32.eqz + if + i32.const 0 + i32.const 31744 + i32.const 347 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $2 + i32.ctz + local.get $1 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + else + i32.const 0 + end + end + ) + (func $~lib/rt/tlsf/initialize + (local $0 i32) + (local $1 i32) + memory.size + local.tee $1 + i32.const 2 + i32.lt_s + if (result i32) + i32.const 2 + local.get $1 + i32.sub + memory.grow + i32.const 0 + i32.lt_s + else + i32.const 0 + end + if + unreachable + end + i32.const 66320 + i32.const 0 + i32.store + i32.const 67888 + i32.const 0 + i32.store + loop $for-loop|0 + local.get $0 + i32.const 23 + i32.lt_u + if + local.get $0 + i32.const 2 + i32.shl + i32.const 66320 + i32.add + i32.const 0 + i32.store offset=4 + i32.const 0 + local.set $1 + loop $for-loop|1 + local.get $1 + i32.const 16 + i32.lt_u + if + local.get $0 + i32.const 4 + i32.shl + local.get $1 + i32.add + i32.const 2 + i32.shl + i32.const 66320 + i32.add + i32.const 0 + i32.store offset=96 + local.get $1 + i32.const 1 + i32.add + local.set $1 + br $for-loop|1 + end + end + local.get $0 + i32.const 1 + i32.add + local.set $0 + br $for-loop|0 + end + end + i32.const 66320 + i32.const 67892 + memory.size + i64.extend_i32_s + i64.const 16 + i64.shl + call $~lib/rt/tlsf/addMemory + i32.const 66320 + global.set $~lib/rt/tlsf/ROOT + ) + (func $~lib/rt/tlsf/addMemory (param $0 i32) (param $1 i32) (param $2 i64) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $2 + local.get $1 + i64.extend_i32_u + i64.lt_u + if + i32.const 0 + i32.const 31744 + i32.const 382 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 19 + i32.add + i32.const -16 + i32.and + i32.const 4 + i32.sub + local.set $1 + local.get $0 + i32.load offset=1568 + local.tee $3 + if + local.get $3 + i32.const 4 + i32.add + local.get $1 + i32.gt_u + if + i32.const 0 + i32.const 31744 + i32.const 389 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $3 + local.get $1 + i32.const 16 + i32.sub + local.tee $5 + i32.eq + if + local.get $3 + i32.load + local.set $4 + local.get $5 + local.set $1 + end + else + local.get $0 + i32.const 1572 + i32.add + local.get $1 + i32.gt_u + if + i32.const 0 + i32.const 31744 + i32.const 402 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + end + local.get $2 + i32.wrap_i64 + i32.const -16 + i32.and + local.get $1 + i32.sub + local.tee $3 + i32.const 20 + i32.lt_u + if + return + end + local.get $1 + local.get $4 + i32.const 2 + i32.and + local.get $3 + i32.const 8 + i32.sub + local.tee $3 + i32.const 1 + i32.or + i32.or + i32.store + local.get $1 + i32.const 0 + i32.store offset=4 + local.get $1 + i32.const 0 + i32.store offset=8 + local.get $1 + i32.const 4 + i32.add + local.get $3 + i32.add + local.tee $3 + i32.const 2 + i32.store + local.get $0 + local.get $3 + i32.store offset=1568 + local.get $0 + local.get $1 + call $~lib/rt/tlsf/insertBlock + ) + (func $~lib/rt/itcms/visitRoots + (local $0 i32) + (local $1 i32) + i32.const 1056 + call $~lib/rt/itcms/__visit + i32.const 31600 + call $~lib/rt/itcms/__visit + i32.const 31408 + call $~lib/rt/itcms/__visit + i32.const 32208 + call $~lib/rt/itcms/__visit + i32.const 33264 + call $~lib/rt/itcms/__visit + global.get $~lib/rt/itcms/pinSpace + local.tee $1 + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + loop $while-continue|0 + local.get $0 + local.get $1 + i32.ne + if + local.get $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.const 3 + i32.ne + if + i32.const 0 + i32.const 31472 + i32.const 160 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 20 + i32.add + call $~lib/rt/__visit_members + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + br $while-continue|0 + end + end + ) + (func $~lib/rt/itcms/__new (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $0 + i32.const 1073741804 + i32.ge_u + if + i32.const 31408 + i32.const 31472 + i32.const 261 + i32.const 31 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/threshold + i32.ge_u + if + block $__inlined_func$~lib/rt/itcms/interrupt$70 + i32.const 2048 + local.set $1 + loop $do-loop|0 + local.get $1 + call $~lib/rt/itcms/step + i32.sub + local.set $1 + global.get $~lib/rt/itcms/state + i32.eqz + if + global.get $~lib/rt/itcms/total + i32.const 1 + i32.shl + i32.const 1024 + i32.add + global.set $~lib/rt/itcms/threshold + br $__inlined_func$~lib/rt/itcms/interrupt$70 + end + local.get $1 + i32.const 0 + i32.gt_s + br_if $do-loop|0 + end + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/threshold + i32.sub + i32.const 1024 + i32.lt_u + i32.const 10 + i32.shl + i32.add + global.set $~lib/rt/itcms/threshold + end + end + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.set $3 + local.get $0 + i32.const 16 + i32.add + local.tee $1 + i32.const 1073741820 + i32.gt_u + if + i32.const 31408 + i32.const 31744 + i32.const 461 + i32.const 29 + call $~lib/builtins/abort + unreachable + end + local.get $3 + local.get $1 + i32.const 12 + i32.le_u + if (result i32) + i32.const 12 + else + local.get $1 + i32.const 19 + i32.add + i32.const -16 + i32.and + i32.const 4 + i32.sub + end + local.tee $4 + call $~lib/rt/tlsf/searchBlock + local.tee $1 + i32.eqz + if + local.get $4 + i32.const 256 + i32.ge_u + if (result i32) + local.get $4 + i32.const 536870910 + i32.lt_u + if (result i32) + local.get $4 + i32.const 1 + i32.const 27 + local.get $4 + i32.clz + i32.sub + i32.shl + i32.add + i32.const 1 + i32.sub + else + local.get $4 + end + else + local.get $4 + end + i32.const 4 + local.get $3 + i32.load offset=1568 + memory.size + local.tee $1 + i32.const 16 + i32.shl + i32.const 4 + i32.sub + i32.ne + i32.shl + i32.add + i32.const 65535 + i32.add + i32.const -65536 + i32.and + i32.const 16 + i32.shr_u + local.set $2 + local.get $1 + local.get $2 + local.get $1 + local.get $2 + i32.gt_s + select + memory.grow + i32.const 0 + i32.lt_s + if + local.get $2 + memory.grow + i32.const 0 + i32.lt_s + if + unreachable + end + end + local.get $3 + local.get $1 + i32.const 16 + i32.shl + memory.size + i64.extend_i32_s + i64.const 16 + i64.shl + call $~lib/rt/tlsf/addMemory + local.get $3 + local.get $4 + call $~lib/rt/tlsf/searchBlock + local.tee $1 + i32.eqz + if + i32.const 0 + i32.const 31744 + i32.const 499 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + end + local.get $4 + local.get $1 + i32.load + i32.const -4 + i32.and + i32.gt_u + if + i32.const 0 + i32.const 31744 + i32.const 501 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $3 + local.get $1 + call $~lib/rt/tlsf/removeBlock + local.get $1 + i32.load + local.set $5 + local.get $4 + i32.const 4 + i32.add + i32.const 15 + i32.and + if + i32.const 0 + i32.const 31744 + i32.const 361 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $5 + i32.const -4 + i32.and + local.get $4 + i32.sub + local.tee $2 + i32.const 16 + i32.ge_u + if + local.get $1 + local.get $4 + local.get $5 + i32.const 2 + i32.and + i32.or + i32.store + local.get $1 + i32.const 4 + i32.add + local.get $4 + i32.add + local.tee $4 + local.get $2 + i32.const 4 + i32.sub + i32.const 1 + i32.or + i32.store + local.get $3 + local.get $4 + call $~lib/rt/tlsf/insertBlock + else + local.get $1 + local.get $5 + i32.const -2 + i32.and + i32.store + local.get $1 + i32.const 4 + i32.add + local.get $1 + i32.load + i32.const -4 + i32.and + i32.add + local.tee $2 + local.get $2 + i32.load + i32.const -3 + i32.and + i32.store + end + local.get $1 + i32.const 2 + i32.store offset=12 + local.get $1 + local.get $0 + i32.store offset=16 + global.get $~lib/rt/itcms/fromSpace + local.tee $2 + i32.load offset=8 + local.set $3 + local.get $1 + local.get $2 + global.get $~lib/rt/itcms/white + i32.or + i32.store offset=4 + local.get $1 + local.get $3 + i32.store offset=8 + local.get $3 + local.get $1 + local.get $3 + i32.load offset=4 + i32.const 3 + i32.and + i32.or + i32.store offset=4 + local.get $2 + local.get $1 + i32.store offset=8 + global.get $~lib/rt/itcms/total + local.get $1 + i32.load + i32.const -4 + i32.and + i32.const 4 + i32.add + i32.add + global.set $~lib/rt/itcms/total + local.get $1 + i32.const 20 + i32.add + local.tee $1 + i32.const 0 + local.get $0 + memory.fill + local.get $1 + ) + (func $~start + (local $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + block $__inlined_func$start:templateliteral-high-pressure + memory.size + i32.const 16 + i32.shl + i32.const 66312 + i32.sub + i32.const 1 + i32.shr_u + global.set $~lib/rt/itcms/threshold + i32.const 31524 + i32.const 31520 + i32.store + i32.const 31528 + i32.const 31520 + i32.store + i32.const 31520 + global.set $~lib/rt/itcms/pinSpace + i32.const 31556 + i32.const 31552 + i32.store + i32.const 31560 + i32.const 31552 + i32.store + i32.const 31552 + global.set $~lib/rt/itcms/toSpace + i32.const 31700 + i32.const 31696 + i32.store + i32.const 31704 + i32.const 31696 + i32.store + i32.const 31696 + global.set $~lib/rt/itcms/fromSpace + global.get $~lib/memory/__stack_pointer + i32.const 32 + i32.sub + global.set $~lib/memory/__stack_pointer + block $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 33544 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 32 + memory.fill + i32.const 1052 + i32.load + i32.const 1 + i32.shr_u + global.set $templateliteral-high-pressure/len + global.get $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 31120 + i32.store + global.get $~lib/memory/__stack_pointer + call $~lib/number/I32#toString + local.tee $3 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + call $~lib/number/I32#toString + local.tee $4 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + call $~lib/number/I32#toString + local.tee $0 + i32.store offset=12 + global.get $~lib/memory/__stack_pointer + call $~lib/number/I32#toString + local.tee $1 + i32.store offset=16 + global.get $~lib/memory/__stack_pointer + i32.const 31120 + i32.store offset=20 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=24 + i32.const 1 + local.get $3 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 31120 + i32.store offset=20 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=24 + i32.const 3 + local.get $4 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 31120 + i32.store offset=20 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=24 + i32.const 5 + local.get $0 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 31120 + i32.store offset=20 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=24 + i32.const 7 + local.get $1 + call $~lib/staticarray/StaticArray<~lib/string/String>#__uset + global.get $~lib/memory/__stack_pointer + i32.const 31120 + i32.store offset=20 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 33544 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 31120 + i32.store offset=4 + i32.const 31116 + i32.load + i32.const 2 + i32.shr_u + global.get $~lib/memory/__stack_pointer + i32.const 33360 + i32.store + call $~lib/util/string/joinStringArray + local.set $0 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=28 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=20 + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + i32.const 33388 + i32.load + i32.const 1 + i32.shr_u + i32.ne + if + i32.const 0 + i32.const 33440 + i32.const 12 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 32 + i32.add + global.set $~lib/memory/__stack_pointer + br $__inlined_func$start:templateliteral-high-pressure + end + i32.const 66336 + i32.const 66384 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + ) + (func $~lib/util/string/joinStringArray (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 33544 + i32.lt_s + if + i32.const 66336 + i32.const 66384 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=8 + local.get $0 + i32.const 1 + i32.sub + local.tee $3 + i32.const 0 + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 33360 + return + end + local.get $3 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 31120 + i32.load + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + i32.const 33360 + local.get $0 + select + return + end + loop $for-loop|0 + local.get $0 + local.get $2 + i32.gt_s + if + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.const 2 + i32.shl + i32.const 31120 + i32.add + i32.load + local.tee $4 + i32.store offset=4 + local.get $4 + if + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=8 + local.get $1 + local.get $4 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + i32.add + local.set $1 + end + local.get $2 + i32.const 1 + i32.add + local.set $2 + br $for-loop|0 + end + end + i32.const 0 + local.set $2 + global.get $~lib/memory/__stack_pointer + i32.const 33360 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.const 33356 + i32.load + i32.const 1 + i32.shr_u + local.tee $0 + local.get $3 + i32.mul + i32.add + i32.const 1 + i32.shl + call $~lib/rt/itcms/__new + local.tee $4 + i32.store offset=12 + i32.const 0 + local.set $1 + loop $for-loop|1 + local.get $1 + local.get $3 + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.const 2 + i32.shl + i32.const 31120 + i32.add + i32.load + local.tee $5 + i32.store offset=4 + local.get $5 + if + global.get $~lib/memory/__stack_pointer + local.get $5 + i32.store offset=8 + local.get $4 + local.get $2 + i32.const 1 + i32.shl + i32.add + local.get $5 + local.get $5 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + local.tee $5 + i32.const 1 + i32.shl + memory.copy + local.get $2 + local.get $5 + i32.add + local.set $2 + end + local.get $0 + if + local.get $4 + local.get $2 + i32.const 1 + i32.shl + i32.add + i32.const 33360 + local.get $0 + i32.const 1 + i32.shl + memory.copy + local.get $0 + local.get $2 + i32.add + local.set $2 + end + local.get $1 + i32.const 1 + i32.add + local.set $1 + br $for-loop|1 + end + end + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.const 2 + i32.shl + i32.const 31120 + i32.add + i32.load + local.tee $0 + i32.store offset=4 + local.get $0 + if + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $4 + local.get $2 + i32.const 1 + i32.shl + i32.add + local.get $0 + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const -2 + i32.and + memory.copy + end + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $4 + ) + (func $~lib/rt/itcms/step (result i32) + (local $0 i32) + (local $1 i32) + (local $2 i32) + block $break|0 + block $case2|0 + block $case1|0 + block $case0|0 + global.get $~lib/rt/itcms/state + br_table $case0|0 $case1|0 $case2|0 $break|0 + end + i32.const 1 + global.set $~lib/rt/itcms/state + i32.const 0 + global.set $~lib/rt/itcms/visitCount + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/iter + global.get $~lib/rt/itcms/visitCount + return + end + global.get $~lib/rt/itcms/white + i32.eqz + local.set $1 + global.get $~lib/rt/itcms/iter + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + loop $while-continue|1 + local.get $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $0 + global.set $~lib/rt/itcms/iter + local.get $1 + local.get $0 + i32.load offset=4 + local.tee $2 + i32.const 3 + i32.and + i32.ne + if + local.get $0 + local.get $2 + i32.const -4 + i32.and + local.get $1 + i32.or + i32.store offset=4 + i32.const 0 + global.set $~lib/rt/itcms/visitCount + local.get $0 + i32.const 20 + i32.add + call $~lib/rt/__visit_members + global.get $~lib/rt/itcms/visitCount + return + end + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + br $while-continue|1 + end + end + i32.const 0 + global.set $~lib/rt/itcms/visitCount + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/iter + i32.load offset=4 + i32.const -4 + i32.and + i32.eq + if + global.get $~lib/memory/__stack_pointer + local.set $0 + loop $while-continue|0 + local.get $0 + i32.const 66312 + i32.lt_u + if + local.get $0 + i32.load + call $~lib/rt/itcms/__visit + local.get $0 + i32.const 4 + i32.add + local.set $0 + br $while-continue|0 + end + end + global.get $~lib/rt/itcms/iter + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + loop $while-continue|2 + local.get $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $1 + local.get $0 + i32.load offset=4 + local.tee $2 + i32.const 3 + i32.and + i32.ne + if + local.get $0 + local.get $2 + i32.const -4 + i32.and + local.get $1 + i32.or + i32.store offset=4 + local.get $0 + i32.const 20 + i32.add + call $~lib/rt/__visit_members + end + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + br $while-continue|2 + end + end + global.get $~lib/rt/itcms/fromSpace + local.set $0 + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/fromSpace + local.get $0 + global.set $~lib/rt/itcms/toSpace + local.get $1 + global.set $~lib/rt/itcms/white + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + global.set $~lib/rt/itcms/iter + i32.const 2 + global.set $~lib/rt/itcms/state + end + global.get $~lib/rt/itcms/visitCount + return + end + global.get $~lib/rt/itcms/iter + local.tee $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $0 + i32.load offset=4 + local.tee $1 + i32.const -4 + i32.and + global.set $~lib/rt/itcms/iter + global.get $~lib/rt/itcms/white + i32.eqz + local.get $1 + i32.const 3 + i32.and + i32.ne + if + i32.const 0 + i32.const 31472 + i32.const 229 + i32.const 20 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 66312 + i32.lt_u + if + local.get $0 + i32.const 0 + i32.store offset=4 + local.get $0 + i32.const 0 + i32.store offset=8 + else + global.get $~lib/rt/itcms/total + local.get $0 + i32.load + i32.const -4 + i32.and + i32.const 4 + i32.add + i32.sub + global.set $~lib/rt/itcms/total + local.get $0 + i32.const 4 + i32.add + local.tee $0 + i32.const 66312 + i32.ge_u + if + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.get $0 + i32.const 4 + i32.sub + local.set $2 + local.get $0 + i32.const 15 + i32.and + i32.const 1 + local.get $0 + select + if (result i32) + i32.const 1 + else + local.get $2 + i32.load + i32.const 1 + i32.and + end + if + i32.const 0 + i32.const 31744 + i32.const 562 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $2 + local.get $2 + i32.load + i32.const 1 + i32.or + i32.store + local.get $2 + call $~lib/rt/tlsf/insertBlock + end + end + i32.const 10 + return + end + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + i32.store offset=4 + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + i32.store offset=8 + i32.const 0 + global.set $~lib/rt/itcms/state + end + i32.const 0 + ) +) diff --git a/tests/compiler/templateliteral-high-pressure.ts b/tests/compiler/templateliteral-high-pressure.ts new file mode 100644 index 0000000000..1fc1cc6203 --- /dev/null +++ b/tests/compiler/templateliteral-high-pressure.ts @@ -0,0 +1,15 @@ +const fakeData: string = + "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; + +export let len = 0; +function test_staticarray_pressure(): void { + const fakeNumber = 1; + len = fakeData.length; + let sstr: string = `[Test]${fakeNumber}-${fakeNumber}-${fakeNumber}-${fakeNumber}`; + // Will trap before current fix + // String.join will crash due to rtsize dirty-written of the last itos32 object which is unpinned. + // Execution trapped due to Linear memory access out of bounds. asstr broken + assert(sstr.length == "[Test]1-1-1-1".length); +} + +test_staticarray_pressure(); diff --git a/tests/compiler/templateliteral.debug.wat b/tests/compiler/templateliteral.debug.wat index ace4b98b35..9c3b009947 100644 --- a/tests/compiler/templateliteral.debug.wat +++ b/tests/compiler/templateliteral.debug.wat @@ -4977,14 +4977,15 @@ (local $2 i32) (local $3 i32) (local $4 i32) + (local $5 i32) global.get $~lib/memory/__stack_pointer - i32.const 28 + i32.const 32 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 28 + i32.const 32 memory.fill global.get $~lib/memory/__stack_pointer i32.const 32 @@ -4995,11 +4996,11 @@ local.tee $b i32.store offset=4 local.get $a - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=8 - local.get $4 + local.get $5 i32.const 32 call $~lib/string/String.__eq i32.eqz @@ -5012,23 +5013,23 @@ unreachable end local.get $a - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=12 - local.get $4 + local.get $5 local.get $b - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=16 - local.get $4 + local.get $5 call $~lib/string/String#concat - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=8 - local.get $4 + local.get $5 i32.const 592 call $~lib/string/String.__eq i32.eqz @@ -5041,54 +5042,58 @@ unreachable end global.get $~lib/memory/__stack_pointer - local.get $a + i32.const 720 local.tee $2 i32.store offset=20 global.get $~lib/memory/__stack_pointer - local.get $b + local.get $a local.tee $3 i32.store offset=24 - i32.const 720 - local.set $4 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $b + local.tee $4 + i32.store offset=28 + local.get $2 + local.set $5 + global.get $~lib/memory/__stack_pointer + local.get $5 i32.store offset=12 - local.get $4 + local.get $5 i32.const 1 - local.get $2 - local.set $4 + local.get $3 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=16 - local.get $4 + local.get $5 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 720 - local.set $4 + local.get $2 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=12 - local.get $4 + local.get $5 i32.const 3 - local.get $3 - local.set $4 - global.get $~lib/memory/__stack_pointer local.get $4 + local.set $5 + global.get $~lib/memory/__stack_pointer + local.get $5 i32.store offset=16 - local.get $4 + local.get $5 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 720 - local.set $4 + local.get $2 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=12 - local.get $4 + local.get $5 i32.const 160 call $~lib/staticarray/StaticArray<~lib/string/String>#join - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=8 - local.get $4 + local.get $5 i32.const 768 call $~lib/string/String.__eq i32.eqz @@ -5101,7 +5106,7 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 28 + i32.const 32 i32.add global.set $~lib/memory/__stack_pointer ) @@ -5111,14 +5116,15 @@ (local $2 i32) (local $3 i32) (local $4 i32) + (local $5 i32) global.get $~lib/memory/__stack_pointer - i32.const 20 + i32.const 24 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 20 + i32.const 24 memory.fill i32.const 1 local.set $a @@ -5127,11 +5133,11 @@ local.get $a i32.const 10 call $~lib/number/I32#toString - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store - local.get $4 + local.get $5 i32.const 2592 call $~lib/string/String.__eq i32.eqz @@ -5146,25 +5152,25 @@ local.get $a i32.const 10 call $~lib/number/I32#toString - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=4 - local.get $4 + local.get $5 local.get $b i32.const 10 call $~lib/number/I32#toString - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=8 - local.get $4 + local.get $5 call $~lib/string/String#concat - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store - local.get $4 + local.get $5 i32.const 2624 call $~lib/string/String.__eq i32.eqz @@ -5177,58 +5183,62 @@ unreachable end global.get $~lib/memory/__stack_pointer - local.get $a - i32.const 10 - call $~lib/number/I32#toString + i32.const 2656 local.tee $2 i32.store offset=12 global.get $~lib/memory/__stack_pointer - local.get $b + local.get $a i32.const 10 call $~lib/number/I32#toString local.tee $3 i32.store offset=16 - i32.const 2656 - local.set $4 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $b + i32.const 10 + call $~lib/number/I32#toString + local.tee $4 + i32.store offset=20 + local.get $2 + local.set $5 + global.get $~lib/memory/__stack_pointer + local.get $5 i32.store offset=4 - local.get $4 + local.get $5 i32.const 1 - local.get $2 - local.set $4 + local.get $3 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=8 - local.get $4 + local.get $5 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 2656 - local.set $4 + local.get $2 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=4 - local.get $4 + local.get $5 i32.const 3 - local.get $3 - local.set $4 - global.get $~lib/memory/__stack_pointer local.get $4 + local.set $5 + global.get $~lib/memory/__stack_pointer + local.get $5 i32.store offset=8 - local.get $4 + local.get $5 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 2656 - local.set $4 + local.get $2 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=4 - local.get $4 + local.get $5 i32.const 160 call $~lib/staticarray/StaticArray<~lib/string/String>#join - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store - local.get $4 + local.get $5 i32.const 2704 call $~lib/string/String.__eq i32.eqz @@ -5241,7 +5251,7 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 20 + i32.const 24 i32.add global.set $~lib/memory/__stack_pointer ) @@ -5251,14 +5261,15 @@ (local $2 i32) (local $3 i32) (local $4 i32) + (local $5 i32) global.get $~lib/memory/__stack_pointer - i32.const 20 + i32.const 24 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 20 + i32.const 24 memory.fill f64.const 1 local.set $a @@ -5267,11 +5278,11 @@ local.get $a i32.const 0 call $~lib/number/F64#toString - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store - local.get $4 + local.get $5 i32.const 3888 call $~lib/string/String.__eq i32.eqz @@ -5286,25 +5297,25 @@ local.get $a i32.const 0 call $~lib/number/F64#toString - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=4 - local.get $4 + local.get $5 local.get $b i32.const 0 call $~lib/number/F64#toString - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=8 - local.get $4 + local.get $5 call $~lib/string/String#concat - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store - local.get $4 + local.get $5 i32.const 3920 call $~lib/string/String.__eq i32.eqz @@ -5317,58 +5328,62 @@ unreachable end global.get $~lib/memory/__stack_pointer - local.get $a - i32.const 0 - call $~lib/number/F64#toString + i32.const 3952 local.tee $2 i32.store offset=12 global.get $~lib/memory/__stack_pointer - local.get $b + local.get $a i32.const 0 call $~lib/number/F64#toString local.tee $3 i32.store offset=16 - i32.const 3952 - local.set $4 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $b + i32.const 0 + call $~lib/number/F64#toString + local.tee $4 + i32.store offset=20 + local.get $2 + local.set $5 + global.get $~lib/memory/__stack_pointer + local.get $5 i32.store offset=4 - local.get $4 + local.get $5 i32.const 1 - local.get $2 - local.set $4 + local.get $3 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=8 - local.get $4 + local.get $5 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 3952 - local.set $4 + local.get $2 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=4 - local.get $4 + local.get $5 i32.const 3 - local.get $3 - local.set $4 - global.get $~lib/memory/__stack_pointer local.get $4 + local.set $5 + global.get $~lib/memory/__stack_pointer + local.get $5 i32.store offset=8 - local.get $4 + local.get $5 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 3952 - local.set $4 + local.get $2 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=4 - local.get $4 + local.get $5 i32.const 160 call $~lib/staticarray/StaticArray<~lib/string/String>#join - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store - local.get $4 + local.get $5 i32.const 4000 call $~lib/string/String.__eq i32.eqz @@ -5381,7 +5396,7 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 20 + i32.const 24 i32.add global.set $~lib/memory/__stack_pointer ) @@ -5685,14 +5700,15 @@ (local $2 i32) (local $3 i32) (local $4 i32) + (local $5 i32) global.get $~lib/memory/__stack_pointer - i32.const 32 + i32.const 36 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 32 + i32.const 36 memory.fill global.get $~lib/memory/__stack_pointer i32.const 0 @@ -5707,17 +5723,17 @@ local.tee $b i32.store offset=4 local.get $a - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=12 - local.get $4 + local.get $5 call $templateliteral/Ref#toString - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=8 - local.get $4 + local.get $5 i32.const 4336 call $~lib/string/String.__eq i32.eqz @@ -5730,35 +5746,35 @@ unreachable end local.get $a - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=20 - local.get $4 + local.get $5 call $templateliteral/Ref#toString - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=12 - local.get $4 + local.get $5 local.get $b - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=20 - local.get $4 + local.get $5 call $templateliteral/Ref#toString - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=16 - local.get $4 + local.get $5 call $~lib/string/String#concat - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=8 - local.get $4 + local.get $5 i32.const 4368 call $~lib/string/String.__eq i32.eqz @@ -5771,66 +5787,70 @@ unreachable end global.get $~lib/memory/__stack_pointer + i32.const 4416 + local.tee $2 + i32.store offset=24 + global.get $~lib/memory/__stack_pointer local.get $a - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=12 - local.get $4 + local.get $5 call $templateliteral/Ref#toString - local.tee $2 - i32.store offset=24 + local.tee $3 + i32.store offset=28 global.get $~lib/memory/__stack_pointer local.get $b - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=12 - local.get $4 + local.get $5 call $templateliteral/Ref#toString - local.tee $3 - i32.store offset=28 - i32.const 4416 - local.set $4 + local.tee $4 + i32.store offset=32 + local.get $2 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=12 - local.get $4 + local.get $5 i32.const 1 - local.get $2 - local.set $4 + local.get $3 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=16 - local.get $4 + local.get $5 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4416 - local.set $4 + local.get $2 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=12 - local.get $4 + local.get $5 i32.const 3 - local.get $3 - local.set $4 - global.get $~lib/memory/__stack_pointer local.get $4 + local.set $5 + global.get $~lib/memory/__stack_pointer + local.get $5 i32.store offset=16 - local.get $4 + local.get $5 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4416 - local.set $4 + local.get $2 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=12 - local.get $4 + local.get $5 i32.const 160 call $~lib/staticarray/StaticArray<~lib/string/String>#join - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store offset=8 - local.get $4 + local.get $5 i32.const 4464 call $~lib/string/String.__eq i32.eqz @@ -5843,7 +5863,7 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 32 + i32.const 36 i32.add global.set $~lib/memory/__stack_pointer ) @@ -5854,14 +5874,15 @@ (local $3 i32) (local $4 i32) (local $5 i32) + (local $6 i32) global.get $~lib/memory/__stack_pointer - i32.const 28 + i32.const 32 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 28 + i32.const 32 memory.fill global.get $~lib/memory/__stack_pointer i32.const 0 @@ -5872,75 +5893,79 @@ i32.const 0 local.set $d global.get $~lib/memory/__stack_pointer + i32.const 4592 + local.tee $2 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer local.get $c - local.set $5 + local.set $6 global.get $~lib/memory/__stack_pointer - local.get $5 - i32.store offset=8 - local.get $5 - call $templateliteral/Ref#toString - local.tee $2 + local.get $6 i32.store offset=12 + local.get $6 + call $templateliteral/Ref#toString + local.tee $3 + i32.store offset=16 global.get $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer local.get $d - local.tee $4 - i32.store offset=16 - local.get $4 + local.tee $5 + i32.store offset=20 + local.get $5 if (result i32) - local.get $4 - local.set $5 - global.get $~lib/memory/__stack_pointer - local.get $5 - i32.store offset=8 local.get $5 + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=12 + local.get $6 call $templateliteral/Ref#toString else i32.const 4640 end - local.tee $3 - i32.store offset=20 - i32.const 4592 - local.set $5 + local.tee $4 + i32.store offset=24 + local.get $2 + local.set $6 global.get $~lib/memory/__stack_pointer - local.get $5 - i32.store offset=8 - local.get $5 + local.get $6 + i32.store offset=12 + local.get $6 i32.const 1 - local.get $2 - local.set $5 + local.get $3 + local.set $6 global.get $~lib/memory/__stack_pointer - local.get $5 - i32.store offset=24 - local.get $5 + local.get $6 + i32.store offset=28 + local.get $6 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4592 - local.set $5 + local.get $2 + local.set $6 global.get $~lib/memory/__stack_pointer - local.get $5 - i32.store offset=8 - local.get $5 + local.get $6 + i32.store offset=12 + local.get $6 i32.const 3 - local.get $3 - local.set $5 + local.get $4 + local.set $6 global.get $~lib/memory/__stack_pointer - local.get $5 - i32.store offset=24 - local.get $5 + local.get $6 + i32.store offset=28 + local.get $6 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4592 - local.set $5 + local.get $2 + local.set $6 global.get $~lib/memory/__stack_pointer - local.get $5 - i32.store offset=8 - local.get $5 + local.get $6 + i32.store offset=12 + local.get $6 i32.const 160 call $~lib/staticarray/StaticArray<~lib/string/String>#join - local.set $5 + local.set $6 global.get $~lib/memory/__stack_pointer - local.get $5 + local.get $6 i32.store offset=4 - local.get $5 + local.get $6 i32.const 4672 call $~lib/string/String.__eq i32.eqz @@ -5953,7 +5978,7 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 28 + i32.const 32 i32.add global.set $~lib/memory/__stack_pointer ) @@ -6019,22 +6044,23 @@ (local $2 i32) (local $3 i32) (local $4 i32) + (local $5 i32) global.get $~lib/memory/__stack_pointer - i32.const 20 + i32.const 24 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 20 + i32.const 24 memory.fill global.get $~lib/memory/__stack_pointer local.get $this - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store - local.get $4 + local.get $5 call $templateliteral/RecursiveObject#get:val local.tee $val i32.store offset=4 @@ -6042,82 +6068,86 @@ i32.eqz if local.get $this - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store - local.get $4 + local.get $5 call $templateliteral/RecursiveObject#get:key - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - i32.const 20 + i32.const 24 i32.add global.set $~lib/memory/__stack_pointer - local.get $4 + local.get $5 return end global.get $~lib/memory/__stack_pointer + i32.const 4800 + local.tee $2 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer local.get $this - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store - local.get $4 + local.get $5 call $templateliteral/RecursiveObject#get:key - local.tee $2 - i32.store offset=8 + local.tee $3 + i32.store offset=12 global.get $~lib/memory/__stack_pointer local.get $val - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store - local.get $4 + local.get $5 call $templateliteral/RecursiveObject#toString - local.tee $3 - i32.store offset=12 - i32.const 4800 - local.set $4 + local.tee $4 + i32.store offset=16 + local.get $2 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store - local.get $4 + local.get $5 i32.const 0 - local.get $2 - local.set $4 + local.get $3 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 - i32.store offset=16 - local.get $4 + local.get $5 + i32.store offset=20 + local.get $5 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4800 - local.set $4 + local.get $2 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store - local.get $4 + local.get $5 i32.const 2 - local.get $3 - local.set $4 - global.get $~lib/memory/__stack_pointer - local.get $4 - i32.store offset=16 local.get $4 + local.set $5 + global.get $~lib/memory/__stack_pointer + local.get $5 + i32.store offset=20 + local.get $5 call $~lib/staticarray/StaticArray<~lib/string/String>#__uset - i32.const 4800 - local.set $4 + local.get $2 + local.set $5 global.get $~lib/memory/__stack_pointer - local.get $4 + local.get $5 i32.store - local.get $4 + local.get $5 i32.const 160 call $~lib/staticarray/StaticArray<~lib/string/String>#join - local.set $4 + local.set $5 global.get $~lib/memory/__stack_pointer - i32.const 20 + i32.const 24 i32.add global.set $~lib/memory/__stack_pointer - local.get $4 + local.get $5 return ) (func $templateliteral/test_recursive diff --git a/tests/compiler/templateliteral.release.wat b/tests/compiler/templateliteral.release.wat index e99c91217f..f39f4dbee2 100644 --- a/tests/compiler/templateliteral.release.wat +++ b/tests/compiler/templateliteral.release.wat @@ -2235,7 +2235,7 @@ (func $templateliteral/RecursiveObject#toString (param $0 i32) (result i32) (local $1 i32) global.get $~lib/memory/__stack_pointer - i32.const 20 + i32.const 24 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer @@ -2251,7 +2251,7 @@ end global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 20 + i32.const 24 memory.fill global.get $~lib/memory/__stack_pointer local.get $0 @@ -2270,19 +2270,22 @@ local.get $0 i32.load global.get $~lib/memory/__stack_pointer - i32.const 20 + i32.const 24 i32.add global.set $~lib/memory/__stack_pointer return end global.get $~lib/memory/__stack_pointer + i32.const 5824 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer local.get $0 i32.load local.tee $0 - i32.store offset=8 + i32.store offset=12 global.get $~lib/memory/__stack_pointer local.get $1 i32.store @@ -2290,13 +2293,13 @@ local.get $1 call $templateliteral/RecursiveObject#toString local.tee $1 - i32.store offset=12 + i32.store offset=16 global.get $~lib/memory/__stack_pointer i32.const 5824 i32.store global.get $~lib/memory/__stack_pointer local.get $0 - i32.store offset=16 + i32.store offset=20 i32.const 5824 local.get $0 i32.store @@ -2309,7 +2312,7 @@ i32.store global.get $~lib/memory/__stack_pointer local.get $1 - i32.store offset=16 + i32.store offset=20 i32.const 5832 local.get $1 i32.store @@ -2323,7 +2326,7 @@ i32.const 5824 call $~lib/staticarray/StaticArray<~lib/string/String>#join global.get $~lib/memory/__stack_pointer - i32.const 20 + i32.const 24 i32.add global.set $~lib/memory/__stack_pointer ) @@ -3879,7 +3882,7 @@ i32.const 1504 global.set $~lib/rt/itcms/fromSpace global.get $~lib/memory/__stack_pointer - i32.const 28 + i32.const 32 i32.sub global.set $~lib/memory/__stack_pointer block $folding-inner1 @@ -3889,7 +3892,7 @@ br_if $folding-inner1 global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 28 + i32.const 32 memory.fill global.get $~lib/memory/__stack_pointer i32.const 1056 @@ -3938,12 +3941,15 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 1056 + i32.const 1744 i32.store offset=20 global.get $~lib/memory/__stack_pointer - i32.const 1088 + i32.const 1056 i32.store offset=24 global.get $~lib/memory/__stack_pointer + i32.const 1088 + i32.store offset=28 + global.get $~lib/memory/__stack_pointer i32.const 1744 i32.store offset=12 global.get $~lib/memory/__stack_pointer @@ -3991,11 +3997,11 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 28 + i32.const 32 i32.add global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 20 + i32.const 24 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer @@ -4004,7 +4010,7 @@ br_if $folding-inner1 global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 20 + i32.const 24 memory.fill i32.const 1 call $~lib/number/I32#toString @@ -4056,15 +4062,18 @@ unreachable end global.get $~lib/memory/__stack_pointer + i32.const 3680 + i32.store offset=12 + global.get $~lib/memory/__stack_pointer i32.const 1 call $~lib/number/I32#toString local.tee $0 - i32.store offset=12 + i32.store offset=16 global.get $~lib/memory/__stack_pointer i32.const 2 call $~lib/number/I32#toString local.tee $1 - i32.store offset=16 + i32.store offset=20 global.get $~lib/memory/__stack_pointer i32.const 3680 i32.store offset=4 @@ -4113,11 +4122,11 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 20 + i32.const 24 i32.add global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 20 + i32.const 24 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer @@ -4126,7 +4135,7 @@ br_if $folding-inner1 global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 20 + i32.const 24 memory.fill f64.const 1 call $~lib/number/F64#toString @@ -4178,15 +4187,18 @@ unreachable end global.get $~lib/memory/__stack_pointer + i32.const 4976 + i32.store offset=12 + global.get $~lib/memory/__stack_pointer f64.const 1 call $~lib/number/F64#toString local.tee $0 - i32.store offset=12 + i32.store offset=16 global.get $~lib/memory/__stack_pointer f64.const 2 call $~lib/number/F64#toString local.tee $1 - i32.store offset=16 + i32.store offset=20 global.get $~lib/memory/__stack_pointer i32.const 4976 i32.store offset=4 @@ -4235,7 +4247,7 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 20 + i32.const 24 i32.add global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer @@ -4415,7 +4427,7 @@ i32.add global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 32 + i32.const 36 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer @@ -4424,7 +4436,7 @@ br_if $folding-inner1 global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 32 + i32.const 36 memory.fill global.get $~lib/memory/__stack_pointer i32.const 1 @@ -4495,13 +4507,16 @@ unreachable end global.get $~lib/memory/__stack_pointer + i32.const 5440 + i32.store offset=24 + global.get $~lib/memory/__stack_pointer local.get $2 i32.store offset=12 global.get $~lib/memory/__stack_pointer local.get $2 call $templateliteral/Ref#toString local.tee $1 - i32.store offset=24 + i32.store offset=28 global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=12 @@ -4509,7 +4524,7 @@ local.get $0 call $templateliteral/Ref#toString local.tee $0 - i32.store offset=28 + i32.store offset=32 global.get $~lib/memory/__stack_pointer i32.const 5440 i32.store offset=12 @@ -4558,11 +4573,11 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 32 + i32.const 36 i32.add global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 28 + i32.const 32 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer @@ -4571,7 +4586,7 @@ br_if $folding-inner1 global.get $~lib/memory/__stack_pointer i32.const 0 - i32.const 28 + i32.const 32 memory.fill global.get $~lib/memory/__stack_pointer i32.const 3 @@ -4579,25 +4594,28 @@ local.tee $0 i32.store global.get $~lib/memory/__stack_pointer - local.get $0 + i32.const 5616 i32.store offset=8 global.get $~lib/memory/__stack_pointer local.get $0 + i32.store offset=12 + global.get $~lib/memory/__stack_pointer + local.get $0 call $templateliteral/Ref#toString local.tee $0 - i32.store offset=12 + i32.store offset=16 global.get $~lib/memory/__stack_pointer i32.const 0 - i32.store offset=16 + i32.store offset=20 global.get $~lib/memory/__stack_pointer i32.const 5664 - i32.store offset=20 + i32.store offset=24 global.get $~lib/memory/__stack_pointer i32.const 5616 - i32.store offset=8 + i32.store offset=12 global.get $~lib/memory/__stack_pointer local.get $0 - i32.store offset=24 + i32.store offset=28 i32.const 5620 local.get $0 i32.store @@ -4607,10 +4625,10 @@ call $~lib/rt/itcms/__link global.get $~lib/memory/__stack_pointer i32.const 5616 - i32.store offset=8 + i32.store offset=12 global.get $~lib/memory/__stack_pointer i32.const 5664 - i32.store offset=24 + i32.store offset=28 i32.const 5628 i32.const 5664 i32.store @@ -4620,7 +4638,7 @@ call $~lib/rt/itcms/__link global.get $~lib/memory/__stack_pointer i32.const 5616 - i32.store offset=8 + i32.store offset=12 i32.const 5616 call $~lib/staticarray/StaticArray<~lib/string/String>#join local.set $0 @@ -4640,7 +4658,7 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 28 + i32.const 32 i32.add global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer