From 0921f3c66343d9235660fc930ce7e1477a02ef83 Mon Sep 17 00:00:00 2001 From: Novus Nota <68142933+novusnota@users.noreply.github.com> Date: Mon, 17 Mar 2025 03:37:34 +0100 Subject: [PATCH 1/8] fix: some past PRs that added doc comments --- src/stdlib/stdlib/std/internal/address.tact | 2 +- src/stdlib/stdlib/std/internal/cells.tact | 157 +++++++++++++++----- 2 files changed, 120 insertions(+), 39 deletions(-) diff --git a/src/stdlib/stdlib/std/internal/address.tact b/src/stdlib/stdlib/std/internal/address.tact index a0ea3a23a..695b7db2d 100644 --- a/src/stdlib/stdlib/std/internal/address.tact +++ b/src/stdlib/stdlib/std/internal/address.tact @@ -220,7 +220,7 @@ asm( -> 1 0) extends mutates fun loadAddress(self: Slice): Address { LDMSGADDR } /// } /// ``` /// -/// See: https://docs.tact-lang.org/ref/core-cells#sliceloadaddress +/// See: https://docs.tact-lang.org/ref/core-cells#sliceskipaddress /// asm extends mutates fun skipAddress(self: Slice) { LDMSGADDR NIP } diff --git a/src/stdlib/stdlib/std/internal/cells.tact b/src/stdlib/stdlib/std/internal/cells.tact index 6cf57ee0e..73d474c31 100644 --- a/src/stdlib/stdlib/std/internal/cells.tact +++ b/src/stdlib/stdlib/std/internal/cells.tact @@ -338,8 +338,7 @@ asm extends fun depth(self: Builder): Int { BDEPTH } /// } /// ``` /// -/// See: -/// * https://docs.tact-lang.org/ref/core-cells#cellbeginparse +/// See: https://docs.tact-lang.org/ref/core-cells#cellbeginparse /// asm extends fun beginParse(self: Cell): Slice { CTOS } @@ -368,6 +367,10 @@ asm extends fun beginParse(self: Cell): Slice { CTOS } /// } /// ``` /// +/// See: +/// * https://docs.tact-lang.org/ref/core-cells#sliceloadref +/// * https://docs.tact-lang.org/book/exit-codes +/// /// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8 /// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 /// @@ -395,6 +398,10 @@ asm(-> 1 0) extends mutates fun loadRef(self: Slice): Cell { LDREF } /// } /// ``` /// +/// See: +/// * https://docs.tact-lang.org/ref/core-cells#sliceskipref +/// * https://docs.tact-lang.org/book/exit-codes +/// /// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8 /// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 /// @@ -477,7 +484,7 @@ asm(-> 1 0) extends mutates fun loadMaybeRef(self: Slice): Cell? { LDOPTREF } /// ``` /// /// See: -/// * https://docs.tact-lang.org/ref/core-cells#sliceloadmayberef +/// * https://docs.tact-lang.org/ref/core-cells#sliceskipmayberef /// * https://docs.tact-lang.org/book/exit-codes /// asm extends mutates fun skipMaybeRef(self: Slice) { LDOPTREF NIP } @@ -532,6 +539,7 @@ asm extends fun preloadMaybeRef(self: Slice): Cell? { PLDOPTREF } /// /// See: /// * https://docs.tact-lang.org/ref/core-cells#sliceloadbits +/// * https://docs.tact-lang.org/book/exit-codes /// /// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5 /// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 @@ -559,6 +567,7 @@ extends mutates native loadBits(self: Slice, l: Int): Slice; /// /// See: /// * https://docs.tact-lang.org/ref/core-cells#slicepreloadbits +/// * https://docs.tact-lang.org/book/exit-codes /// /// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5 /// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 @@ -585,6 +594,7 @@ extends native preloadBits(self: Slice, l: Int): Slice; /// /// See: /// * https://docs.tact-lang.org/ref/core-cells#sliceloadint +/// * https://docs.tact-lang.org/book/exit-codes /// /// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5 /// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 @@ -612,6 +622,7 @@ extends mutates native loadInt(self: Slice, l: Int): Int; /// /// See: /// * https://docs.tact-lang.org/ref/core-cells#slicepreloadint +/// * https://docs.tact-lang.org/book/exit-codes /// /// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5 /// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 @@ -638,6 +649,7 @@ extends native preloadInt(self: Slice, l: Int): Int; /// /// See: /// * https://docs.tact-lang.org/ref/core-cells#sliceloaduint +/// * https://docs.tact-lang.org/book/exit-codes /// /// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5 /// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 @@ -665,6 +677,7 @@ extends mutates native loadUint(self: Slice, l: Int): Int; /// /// See: /// * https://docs.tact-lang.org/ref/core-cells#slicepreloaduint +/// * https://docs.tact-lang.org/book/exit-codes /// /// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5 /// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 @@ -690,6 +703,10 @@ extends native preloadUint(self: Slice, l: Int): Int; /// } /// ``` /// +/// See: +/// * https://docs.tact-lang.org/ref/core-cells#sliceloadbool +/// * https://docs.tact-lang.org/book/exit-codes +/// /// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8 /// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 /// @@ -717,6 +734,10 @@ asm(-> 1 0) extends mutates fun loadBool(self: Slice): Bool { 1 LDI } /// } /// ``` /// +/// See: +/// * https://docs.tact-lang.org/ref/core-cells#sliceskipbool +/// * https://docs.tact-lang.org/book/exit-codes +/// /// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8 /// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 /// @@ -741,9 +762,9 @@ asm(-> 1 0) extends mutates fun loadBit(self: Slice): Bool { 1 LDI } /// /// Loads and returns a serialized unsigned `Int` value in the range from 0 to 2^120 - 1 inclusive from the `Slice`. This value usually represents the amount in nanoToncoins. /// -/// Attempts to load such `Int` when `Slice` doesn't contain it throw an exception with exit code 8: `Cell overflow`. +/// Attempts to load such `Int` when `Slice` doesn't contain it throw an exception with [exit code 8]: `Cell overflow`. /// -/// Attempts to load more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`. +/// Attempts to load more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`. /// /// ```tact /// fun example() { @@ -752,7 +773,12 @@ asm(-> 1 0) extends mutates fun loadBit(self: Slice): Bool { 1 LDI } /// } /// ``` /// -/// See: https://docs.tact-lang.org/ref/core-cells#sliceloadcoins +/// See: +/// * https://docs.tact-lang.org/ref/core-cells#sliceloadcoins +/// * https://docs.tact-lang.org/book/exit-codes +/// +/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8 +/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 /// asm( -> 1 0) extends mutates fun loadCoins(self: Slice): Int { LDVARUINT16 } @@ -760,9 +786,9 @@ asm( -> 1 0) extends mutates fun loadCoins(self: Slice): Int { LDVARUINT16 } /// /// Skips a serialized unsigned `Int` value in the range from 0 to 2^120 - 1 inclusive from the `Slice`. Similar to discarding the return value of `Slice.loadCoins()`. /// -/// Attempts to skip such `Int` when `Slice` doesn't contain it throw an exception with exit code 8: `Cell overflow`. +/// Attempts to skip such `Int` when `Slice` doesn't contain it throw an exception with [exit code 8]: `Cell overflow`. /// -/// Attempts to skip more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`. +/// Attempts to skip more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`. /// /// ```tact /// fun example() { @@ -776,7 +802,12 @@ asm( -> 1 0) extends mutates fun loadCoins(self: Slice): Int { LDVARUINT16 } /// } /// ``` /// -/// See: https://docs.tact-lang.org/ref/core-cells#sliceloadcoins +/// See: +/// * https://docs.tact-lang.org/ref/core-cells#sliceskipcoins +/// * https://docs.tact-lang.org/book/exit-codes +/// +/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8 +/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 /// asm extends mutates fun skipCoins(self: Slice) { LDVARUINT16 NIP } @@ -814,8 +845,8 @@ asm( -> 1 0) extends mutates fun loadVarUint16(self: Slice): Int { LDVARUINT16 } /// ``` /// /// See: -/// * https://docs.tact-lang.org/ref/core-cells#sliceloadvaruint16 -/// * https://docs.tact-lang.org/ref/core-cells#sliceloadcoins +/// * https://docs.tact-lang.org/ref/core-cells#sliceskipvaruint16 +/// * https://docs.tact-lang.org/ref/core-cells#sliceskipcoins /// asm extends mutates fun skipVarUint16(self: Slice){ LDVARUINT16 NIP } @@ -823,9 +854,9 @@ asm extends mutates fun skipVarUint16(self: Slice){ LDVARUINT16 NIP } /// /// Similar to `Slice.loadCoins()`, but with a different `value` range: from -2^119 to 2^119 - 1 inclusive. /// -/// Attempts to load such `Int` when `Slice` doesn't contain it throw an exception with exit code 8: `Cell overflow`. +/// Attempts to load such `Int` when `Slice` doesn't contain it throw an exception with [exit code 8]: `Cell overflow`. /// -/// Attempts to load more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`. +/// Attempts to load more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`. /// /// ```tact /// fun example() { @@ -834,7 +865,12 @@ asm extends mutates fun skipVarUint16(self: Slice){ LDVARUINT16 NIP } /// } /// ``` /// -/// See: https://docs.tact-lang.org/ref/core-cells#sliceloadvarint16 +/// See: +/// * https://docs.tact-lang.org/ref/core-cells#sliceloadvarint16 +/// * https://docs.tact-lang.org/book/exit-codes +/// +/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8 +/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 /// asm( -> 1 0) extends mutates fun loadVarInt16(self: Slice): Int { LDVARINT16 } @@ -842,9 +878,9 @@ asm( -> 1 0) extends mutates fun loadVarInt16(self: Slice): Int { LDVARINT16 } /// /// Similar to `Slice.skipCoins()`, but with a different `value` range: from -2^119 to 2^119 - 1 inclusive. /// -/// Attempts to skip such `Int` when `Slice` doesn't contain it throw an exception with exit code 8: `Cell overflow`. +/// Attempts to skip such `Int` when `Slice` doesn't contain it throw an exception with [exit code 8]: `Cell overflow`. /// -/// Attempts to skip more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`. +/// Attempts to skip more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`. /// /// ```tact /// fun example() { @@ -858,7 +894,12 @@ asm( -> 1 0) extends mutates fun loadVarInt16(self: Slice): Int { LDVARINT16 } /// } /// ``` /// -/// See: https://docs.tact-lang.org/ref/core-cells#sliceloadvarint16 +/// See: +/// * https://docs.tact-lang.org/ref/core-cells#sliceskipvarint16 +/// * https://docs.tact-lang.org/book/exit-codes +/// +/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8 +/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 /// asm extends mutates fun skipVarInt16(self: Slice) { LDVARINT16 NIP } @@ -866,9 +907,9 @@ asm extends mutates fun skipVarInt16(self: Slice) { LDVARINT16 NIP } /// /// Loads and returns a serialized unsigned `Int` value in the range from 0 to 2^248 − 1 inclusive from the `Slice`. /// -/// Attempts to load such `Int` when `Slice` doesn't contain it throw an exception with exit code 8: `Cell overflow`. +/// Attempts to load such `Int` when `Slice` doesn't contain it throw an exception with [exit code 8]: `Cell overflow`. /// -/// Attempts to load more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`. +/// Attempts to load more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`. /// /// ```tact /// fun example() { @@ -877,7 +918,12 @@ asm extends mutates fun skipVarInt16(self: Slice) { LDVARINT16 NIP } /// } /// ``` /// -/// See: https://docs.tact-lang.org/ref/core-cells#sliceloadvaruint32 +/// See: +/// * https://docs.tact-lang.org/ref/core-cells#sliceloadvaruint32 +/// * https://docs.tact-lang.org/book/exit-codes +/// +/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8 +/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 /// asm( -> 1 0) extends mutates fun loadVarUint32(self: Slice): Int { LDVARUINT32 } @@ -885,9 +931,9 @@ asm( -> 1 0) extends mutates fun loadVarUint32(self: Slice): Int { LDVARUINT32 } /// /// Skips a serialized unsigned `Int` value in the range from 0 to 2^248 − 1 inclusive from the `Slice`. Similar to discarding the return value of `Slice.loadVarUint32()`. /// -/// Attempts to skip such `Int` when `Slice` doesn't contain it throw an exception with exit code 8: `Cell overflow`. +/// Attempts to skip such `Int` when `Slice` doesn't contain it throw an exception with [exit code 8]: `Cell overflow`. /// -/// Attempts to skip more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`. +/// Attempts to skip more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`. /// /// ```tact /// fun example() { @@ -901,7 +947,12 @@ asm( -> 1 0) extends mutates fun loadVarUint32(self: Slice): Int { LDVARUINT32 } /// } /// ``` /// -/// See: https://docs.tact-lang.org/ref/core-cells#sliceloadvaruint32 +/// See: +/// * https://docs.tact-lang.org/ref/core-cells#sliceskipvaruint32 +/// * https://docs.tact-lang.org/book/exit-codes +/// +/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8 +/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 /// asm extends mutates fun skipVarUint32(self: Slice) { LDVARUINT32 NIP } @@ -909,9 +960,9 @@ asm extends mutates fun skipVarUint32(self: Slice) { LDVARUINT32 NIP } /// /// Similar to `Slice.loadVarUint32()`, but with a different `value` range: from -2^247 to 2^247 - 1 inclusive. /// -/// Attempts to load such `Int` when `Slice` doesn't contain it throw an exception with exit code 8: `Cell overflow`. +/// Attempts to load such `Int` when `Slice` doesn't contain it throw an exception with [exit code 8]: `Cell overflow`. /// -/// Attempts to load more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`. +/// Attempts to load more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`. /// /// ```tact /// fun example() { @@ -920,7 +971,12 @@ asm extends mutates fun skipVarUint32(self: Slice) { LDVARUINT32 NIP } /// } /// ``` /// -/// See: https://docs.tact-lang.org/ref/core-cells#sliceloadvarint32 +/// See: +/// * https://docs.tact-lang.org/ref/core-cells#sliceloadvarint32 +/// * https://docs.tact-lang.org/book/exit-codes +/// +/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8 +/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 /// asm( -> 1 0) extends mutates fun loadVarInt32(self: Slice): Int { LDVARINT32 } @@ -928,9 +984,9 @@ asm( -> 1 0) extends mutates fun loadVarInt32(self: Slice): Int { LDVARINT32 } /// /// Similar to `Slice.skipVarUint32()`, but with a different `value` range: from -2^247 to 2^247 - 1 inclusive. /// -/// Attempts to skip such `Int` when `Slice` doesn't contain it throw an exception with exit code 8: `Cell overflow`. +/// Attempts to skip such `Int` when `Slice` doesn't contain it throw an exception with [exit code 8]: `Cell overflow`. /// -/// Attempts to skip more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`. +/// Attempts to skip more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`. /// /// ```tact /// fun example() { @@ -944,7 +1000,12 @@ asm( -> 1 0) extends mutates fun loadVarInt32(self: Slice): Int { LDVARINT32 } /// } /// ``` /// -/// See: https://docs.tact-lang.org/ref/core-cells#sliceloadvaruint32 +/// See: +/// * https://docs.tact-lang.org/ref/core-cells#sliceskipvarint32 +/// * https://docs.tact-lang.org/book/exit-codes +/// +/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8 +/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 /// asm extends mutates fun skipVarInt32(self: Slice) { LDVARINT32 NIP } @@ -966,7 +1027,9 @@ asm extends mutates fun skipVarInt32(self: Slice) { LDVARINT32 NIP } /// } /// ``` /// -/// See: https://docs.tact-lang.org/ref/core-cells#sliceskipbits +/// See: +/// * https://docs.tact-lang.org/ref/core-cells#sliceskipbits +/// * https://docs.tact-lang.org/book/exit-codes /// /// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5 /// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 @@ -990,6 +1053,10 @@ asm extends mutates fun skipBits(self: Slice, l: Int) { SDSKIPFIRST } /// } /// ``` /// +/// See: +/// * https://docs.tact-lang.org/ref/core-cells#sliceendparse +/// * https://docs.tact-lang.org/book/exit-codes +/// /// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 /// asm extends fun endParse(self: Slice) { ENDS } @@ -998,9 +1065,9 @@ asm extends fun endParse(self: Slice) { ENDS } /// /// Preloads all but the last 0 ≤ `len` ≤ 1023 bits from the `Slice`. /// -/// Attempts to specify an out-of-bounds `len` value throw an exception with exit code 5: `Integer out of expected range`. +/// Attempts to specify an out-of-bounds `len` value throw an exception with [exit code 5]: `Integer out of expected range`. /// -/// Attempts to preload more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`. +/// Attempts to preload more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`. /// /// ```tact /// fun example() { @@ -1010,7 +1077,12 @@ asm extends fun endParse(self: Slice) { ENDS } /// } /// ``` /// -/// See: https://docs.tact-lang.org/ref/core-cells#sliceskiplastbits +/// See: +/// * https://docs.tact-lang.org/ref/core-cells#sliceskiplastbits +/// * https://docs.tact-lang.org/book/exit-codes +/// +/// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5 +/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 /// asm extends fun skipLastBits(self: Slice, len: Int): Slice { SDSKIPLAST } @@ -1018,9 +1090,9 @@ asm extends fun skipLastBits(self: Slice, len: Int): Slice { SDSKIPLAST } /// /// Preloads the first 0 ≤ `len` ≤ 1023 bits from the `Slice`. /// -/// Attempts to specify an out-of-bounds `len` value throw an exception with exit code 5: `Integer out of expected range`. +/// Attempts to specify an out-of-bounds `len` value throw an exception with [exit code 5]: `Integer out of expected range`. /// -/// Attempts to preload more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`. +/// Attempts to preload more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`. /// /// ```tact /// fun example() { @@ -1034,6 +1106,10 @@ asm extends fun skipLastBits(self: Slice, len: Int): Slice { SDSKIPLAST } /// See: /// * https://docs.tact-lang.org/ref/core-cells#slicefirstbits /// * https://docs.tact-lang.org/ref/core-cells#slicepreloadbits +/// * https://docs.tact-lang.org/book/exit-codes +/// +/// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5 +/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 /// asm extends fun firstBits(self: Slice, len: Int): Slice { SDCUTFIRST } @@ -1041,9 +1117,9 @@ asm extends fun firstBits(self: Slice, len: Int): Slice { SDCUTFIRST } /// /// Preloads the last 0 ≤ `len` ≤ 1023 bits from the `Slice`. /// -/// Attempts to specify an out-of-bounds `len` value throw an exception with exit code 5: `Integer out of expected range`. +/// Attempts to specify an out-of-bounds `len` value throw an exception with [exit code 5]: `Integer out of expected range`. /// -/// Attempts to preload more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`. +/// Attempts to preload more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`. /// /// ```tact /// fun example() { @@ -1052,7 +1128,12 @@ asm extends fun firstBits(self: Slice, len: Int): Slice { SDCUTFIRST } /// } /// ``` /// -/// See: https://docs.tact-lang.org/ref/core-cells#slicelastbits +/// See: +/// * https://docs.tact-lang.org/ref/core-cells#slicelastbits +/// * https://docs.tact-lang.org/book/exit-codes +/// +/// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5 +/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 /// asm extends fun lastBits(self: Slice, len: Int): Slice { SDCUTLAST } From c9789d3be0bb3891c13144b38f6f6ae0228103f2 Mon Sep 17 00:00:00 2001 From: Novus Nota <68142933+novusnota@users.noreply.github.com> Date: Mon, 17 Mar 2025 04:16:03 +0100 Subject: [PATCH 2/8] feat(docs/stdlib): `Slice.loadBasechainAddress()` and `Slice.skipBasechainAddress()` --- docs/src/content/docs/ref/core-cells.mdx | 54 +++++++++++++++ src/stdlib/stdlib/std/internal/address.tact | 75 ++++++++++++++++++++- 2 files changed, 128 insertions(+), 1 deletion(-) diff --git a/docs/src/content/docs/ref/core-cells.mdx b/docs/src/content/docs/ref/core-cells.mdx index 728c0c54c..6ea949cfb 100644 --- a/docs/src/content/docs/ref/core-cells.mdx +++ b/docs/src/content/docs/ref/core-cells.mdx @@ -1169,6 +1169,59 @@ s1.skipAddress(); let fizz: Int = s1.loadUint(32); // 42 ``` +### Slice.loadBasechainAddress + +

+ +```tact +extends mutates fun loadBasechainAddress(self: Slice): BasechainAddress; +``` + +Extension mutation function for the [`Slice{:tact}`][slice] type. + +Loads and returns a [`BasechainAddress{:tact}`][base-addr] [struct][struct] from the [`Slice{:tact}`][slice]. + +Attempts to load such [`BasechainAddress{:tact}`][base-addr] struct when [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`. + +Attempts to load more data than [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`. + +Usage example: + +```tact +let s: Slice = beginCell() + .storeBasechainAddress(BasechainAddress{ hash: null }) + .asSlice(); +let fizz: BasechainAddress = s.loadBasechainAddress(); +``` + +### Slice.skipBasechainAddress + +

+ +```tact +extends mutates fun skipBasechainAddress(self: Slice); +``` + +Extension mutation function for the [`Slice{:tact}`][slice] type. + +Skips a [`BasechainAddress{:tact}`][base-addr] [struct][struct] from the [`Slice{:tact}`][slice]. + +Attempts to skip such [`BasechainAddress{:tact}`][base-addr] struct when [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`. + +Attempts to skip more data than [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`. + +Usage example: + +```tact +let s1: Slice = beginCell() + .storeBasechainAddress(BasechainAddress{ hash: null }) + .storeUint(42, 32) + .asSlice(); + +s1.skipBasechainAddress(); +let fizz: Int = s1.loadUint(32); // 42 +``` + ### Slice.loadRef ```tact @@ -2015,6 +2068,7 @@ fun cautiousParse(payload: Slice): TripleAxe? { [message]: /book/structs-and-messages#messages [null]: /book/optionals +[base-addr]: /ref/core-addresses#basechainaddress [std-repr]: /book/cells#cells-representation [tlb]: https://docs.ton.org/develop/data-formats/tl-b-language diff --git a/src/stdlib/stdlib/std/internal/address.tact b/src/stdlib/stdlib/std/internal/address.tact index 695b7db2d..8f7fe25e0 100644 --- a/src/stdlib/stdlib/std/internal/address.tact +++ b/src/stdlib/stdlib/std/internal/address.tact @@ -307,12 +307,15 @@ inline fun contractBasechainAddress(s: StateInit): BasechainAddress { /// /// ```tact /// fun example() { -/// let addr: BasechainAddress = newBasechainAddress(0x83dfd552e63729b472fcbcc8c45ebcc6691702558b68ec7527e1ba403a0f31a8); +/// let addr: BasechainAddress = +/// newBasechainAddress(0x83dfd552e63729b472fcbcc8c45ebcc6691702558b68ec7527e1ba403a0f31a8); /// let b: Builder = beginCell(); /// let b2: Builder = b.storeBasechainAddress(addr); /// } /// ``` /// +/// See: https://docs.tact-lang.org/ref/core-cells#builder.storebasechainaddress +/// extends fun storeBasechainAddress(self: Builder, address: BasechainAddress): Builder { if (address.hash == null) { return self.storeUint(0, 2); // 0b00 @@ -323,6 +326,76 @@ extends fun storeBasechainAddress(self: Builder, address: BasechainAddress): Bui .storeUint(address.hash!!, 256); } +/// Extension mutation function for the `Slice` type. Available since Tact 1.6.4. +/// +/// Loads and returns a `BasechainAddress` struct from the `Slice`. +/// +/// Attempts to load such `BasechainAddress` struct when `Slice` doesn't contain it throw an exception with [exit code 8]: `Cell overflow`. +/// +/// Attempts to load more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`. +/// +/// ```tact +/// fun example() { +/// let s: Slice = beginCell() +/// .storeBasechainAddress(BasechainAddress{ hash: null }) +/// .asSlice(); +/// let fizz: BasechainAddress = s.loadBasechainAddress(); +/// } +/// ``` +/// +/// See: +/// * https://docs.tact-lang.org/ref/core-cells#sliceloadbasechainaddress +/// * https://docs.tact-lang.org/book/exit-codes +/// +/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8 +/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 +/// +extends mutates fun loadBasechainAddress(self: Slice): BasechainAddress { + if (self.loadUint(2) == 0) { + return BasechainAddress{ hash: null }; + } else { + // Skip the remaining prefix + self.skipBits(9); + // Load the hash (account ID) + return BasechainAddress{ hash: self.loadUint(256) }; + } +} + +/// Extension mutation function for the `Slice` type. Available since Tact 1.6.4. +/// +/// Skips a `BasechainAddress` struct from the `Slice`. +/// +/// Attempts to skip such `BasechainAddress` struct when `Slice` doesn't contain it throw an exception with [exit code 8]: `Cell overflow`. +/// +/// Attempts to skip more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`. +/// +/// ```tact +/// fun example() { +/// let s1: Slice = beginCell() +/// .storeBasechainAddress(BasechainAddress{ hash: null }) +/// .storeUint(42, 32) +/// .asSlice(); +/// +/// s1.skipBasechainAddress(); +/// let fizz: Int = s1.loadUint(32); // 42 +/// } +/// ``` +/// +/// See: +/// * https://docs.tact-lang.org/ref/core-cells#sliceskipbasechainaddress +/// * https://docs.tact-lang.org/book/exit-codes +/// +/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8 +/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 +/// +extends mutates fun skipBasechainAddress(self: Slice) { + if (self.loadUint(2) != 0) { + // 9 bits of the remaining prefix since first 2 are loaded already + // plus 256 bits of the hash (account ID) + self.skipBits(265); + } +} + /// Global function. Available since Tact 1.6.3. /// /// Checks whether the `address` is in the basechain, i.e., its chain ID is 0. If it is not, throws an exception with exit code 138: `Not a basechain address`. From 85eb255fccfd5b32de2c0f66aba998d1da0805e2 Mon Sep 17 00:00:00 2001 From: Novus Nota <68142933+novusnota@users.noreply.github.com> Date: Tue, 18 Mar 2025 09:55:54 +0100 Subject: [PATCH 3/8] fix --- dev-docs/CHANGELOG.md | 1 + src/stdlib/stdlib/std/internal/address.tact | 17 +++++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/dev-docs/CHANGELOG.md b/dev-docs/CHANGELOG.md index c6a63d3a0..f47be2d34 100644 --- a/dev-docs/CHANGELOG.md +++ b/dev-docs/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Standard Library - Added `forceWorkchain()` function: PR [#2387](https://github.com/tact-lang/tact/pull/2387) +- Added `Slice.store` and functions: PR [#2395](https://github.com/tact-lang/tact/pull/2395) ### Docs diff --git a/src/stdlib/stdlib/std/internal/address.tact b/src/stdlib/stdlib/std/internal/address.tact index 8f7fe25e0..d44c23464 100644 --- a/src/stdlib/stdlib/std/internal/address.tact +++ b/src/stdlib/stdlib/std/internal/address.tact @@ -314,7 +314,7 @@ inline fun contractBasechainAddress(s: StateInit): BasechainAddress { /// } /// ``` /// -/// See: https://docs.tact-lang.org/ref/core-cells#builder.storebasechainaddress +/// See: https://docs.tact-lang.org/ref/core-cells#builderstorebasechainaddress /// extends fun storeBasechainAddress(self: Builder, address: BasechainAddress): Builder { if (address.hash == null) { @@ -351,14 +351,15 @@ extends fun storeBasechainAddress(self: Builder, address: BasechainAddress): Bui /// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 /// extends mutates fun loadBasechainAddress(self: Slice): BasechainAddress { + // addr_none if (self.loadUint(2) == 0) { return BasechainAddress{ hash: null }; - } else { - // Skip the remaining prefix - self.skipBits(9); - // Load the hash (account ID) - return BasechainAddress{ hash: self.loadUint(256) }; } + + // addr_std, skip the remaining prefix bits + self.skipBits(9); + // Load the hash (account ID) + return BasechainAddress{ hash: self.loadUint(256) }; } /// Extension mutation function for the `Slice` type. Available since Tact 1.6.4. @@ -389,11 +390,15 @@ extends mutates fun loadBasechainAddress(self: Slice): BasechainAddress { /// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9 /// extends mutates fun skipBasechainAddress(self: Slice) { + // addr_std if (self.loadUint(2) != 0) { // 9 bits of the remaining prefix since first 2 are loaded already // plus 256 bits of the hash (account ID) self.skipBits(265); } + + // addr_none, nothing to load since its 2 bits + // are loaded in the if statement above } /// Global function. Available since Tact 1.6.3. From 350955bd4f9ce8f8fc7fb0a61306ee1a33fe5066 Mon Sep 17 00:00:00 2001 From: Novus Nota <68142933+novusnota@users.noreply.github.com> Date: Tue, 18 Mar 2025 09:56:41 +0100 Subject: [PATCH 4/8] changelog --- dev-docs/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-docs/CHANGELOG.md b/dev-docs/CHANGELOG.md index f47be2d34..2f960eea3 100644 --- a/dev-docs/CHANGELOG.md +++ b/dev-docs/CHANGELOG.md @@ -14,7 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Standard Library - Added `forceWorkchain()` function: PR [#2387](https://github.com/tact-lang/tact/pull/2387) -- Added `Slice.store` and functions: PR [#2395](https://github.com/tact-lang/tact/pull/2395) +- Added `Slice.loadBasechainAddress()` and `Slice.skipBasechainAddress()` functions: PR [#2395](https://github.com/tact-lang/tact/pull/2395) ### Docs From 12cdac0cb194efddcd30d85f3a85e28a0040ef92 Mon Sep 17 00:00:00 2001 From: Novus Nota <68142933+novusnota@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:04:30 +0100 Subject: [PATCH 5/8] stdlib.ts --- src/stdlib/stdlib.ts | 859 +++++++++++++++++++++++-------------------- 1 file changed, 460 insertions(+), 399 deletions(-) diff --git a/src/stdlib/stdlib.ts b/src/stdlib/stdlib.ts index 37a52636a..5009f4bba 100644 --- a/src/stdlib/stdlib.ts +++ b/src/stdlib/stdlib.ts @@ -273,7 +273,7 @@ files["std/internal/address.tact"] = "eGNlcHRpb24gd2l0aCBleGl0IGNvZGUgOTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczE6" + "IFNsaWNlID0gYmVnaW5DZWxsKCkKLy8vICAgICAgICAgLnN0b3JlQWRkcmVzcyhteUFkZHJlc3MoKSkKLy8vICAgICAgICAgLnN0b3JlVWludCg0MiwgMzIpCi8vLyAg" + "ICAgICAgIC5hc1NsaWNlKCk7Ci8vLwovLy8gICAgIHMxLnNraXBBZGRyZXNzKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMxLmxvYWRVaW50KDMyKTsgLy8gNDIK" + - "Ly8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkYWRkcmVzcwovLy8KYXNtIGV4" + + "Ly8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vza2lwYWRkcmVzcwovLy8KYXNtIGV4" + "dGVuZHMgbXV0YXRlcyBmdW4gc2tpcEFkZHJlc3Moc2VsZjogU2xpY2UpIHsgTERNU0dBRERSIE5JUCB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYEJ1" + "aWxkZXJgIHR5cGUuCi8vLwovLy8gU3RvcmVzIHRoZSBgYWRkcmVzc2AgaW4gdGhlIGNvcHkgb2YgdGhlIGBCdWlsZGVyYC4gUmV0dXJucyB0aGF0IGNvcHkuCi8vLwov" + "Ly8gQXR0ZW1wdHMgdG8gc3RvcmUgYW4gYGFkZHJlc3NgIGludG8gdGhlIGBCdWlsZGVyYCBgc2VsZmAsIGlmIGBzZWxmYCBjYW5ub3QgZml0IGl0LCB0aHJvdyBhbiBl" + @@ -302,35 +302,64 @@ files["std/internal/address.tact"] = "eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBTdG9yZXMgdGhlIGJhc2VjaGFpbiBhZGRyZXNzIGluIHRoZSBjb3B5IG9mIHRoZSBCdWlsZGVy" + "IGFuZCByZXR1cm5zIHRoYXQgY29weS4KLy8vCi8vLyBJZiB0aGUgYWRkcmVzcyBoYXMgYSBgbnVsbGAgaGFzaCwgc3RvcmVzIDBiMDAgKGBhZGRyX25vbmVgKS4gT3Ro" + "ZXJ3aXNlLCBzdG9yZXMgdGhlIGZ1bGwgYWRkcmVzcwovLy8gd2l0aCBwcmVmaXggMGIxMDAgZm9sbG93ZWQgYnkgd29ya2NoYWluICgwKSBhbmQgdGhlIDI1Ni1iaXQg" + - "aGFzaC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYWRkcjogQmFzZWNoYWluQWRkcmVzcyA9IG5ld0Jhc2VjaGFpbkFkZHJl" + - "c3MoMHg4M2RmZDU1MmU2MzcyOWI0NzJmY2JjYzhjNDVlYmNjNjY5MTcwMjU1OGI2OGVjNzUyN2UxYmE0MDNhMGYzMWE4KTsKLy8vICAgICBsZXQgYjogQnVpbGRlciA9" + - "IGJlZ2luQ2VsbCgpOwovLy8gICAgIGxldCBiMjogQnVpbGRlciA9IGIuc3RvcmVCYXNlY2hhaW5BZGRyZXNzKGFkZHIpOwovLy8gfQovLy8gYGBgCi8vLwpleHRlbmRz" + + "aGFzaC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYWRkcjogQmFzZWNoYWluQWRkcmVzcyA9Ci8vLyAgICAgICAgIG5ld0Jh" + + "c2VjaGFpbkFkZHJlc3MoMHg4M2RmZDU1MmU2MzcyOWI0NzJmY2JjYzhjNDVlYmNjNjY5MTcwMjU1OGI2OGVjNzUyN2UxYmE0MDNhMGYzMWE4KTsKLy8vICAgICBsZXQg" + + "YjogQnVpbGRlciA9IGJlZ2luQ2VsbCgpOwovLy8gICAgIGxldCBiMjogQnVpbGRlciA9IGIuc3RvcmVCYXNlY2hhaW5BZGRyZXNzKGFkZHIpOwovLy8gfQovLy8gYGBg" + + "Ci8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNidWlsZGVyc3RvcmViYXNlY2hhaW5hZGRyZXNzCi8vLwpleHRlbmRz" + "IGZ1biBzdG9yZUJhc2VjaGFpbkFkZHJlc3Moc2VsZjogQnVpbGRlciwgYWRkcmVzczogQmFzZWNoYWluQWRkcmVzcyk6IEJ1aWxkZXIgewogICAgaWYgKGFkZHJlc3Mu" + "aGFzaCA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHNlbGYuc3RvcmVVaW50KDAsIDIpOyAvLyAwYjAwCiAgICB9CgogICAgcmV0dXJuIHNlbGYKICAgICAgICAuc3Rv" + - "cmVVaW50KDBiMTBfMF8wMDAwMDAwMCwgMyArIDgpCiAgICAgICAgLnN0b3JlVWludChhZGRyZXNzLmhhc2ghISwgMjU2KTsKfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4g" + - "QXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjMuCi8vLwovLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGBhZGRyZXNzYCBpcyBpbiB0aGUgYmFzZWNoYWluLCBpLmUuLCBpdHMg" + - "Y2hhaW4gSUQgaXMgMC4gSWYgaXQgaXMgbm90LCB0aHJvd3MgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDEzODogYE5vdCBhIGJhc2VjaGFpbiBhZGRyZXNzYC4K" + - "Ly8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZXMoKSB7Ci8vLyAgICAgbGV0IHNvbWVCYXNlY2hhaW5BZGRyZXNzOiBBZGRyZXNzID0KLy8vICAgICAgICAgbmV3" + - "QWRkcmVzcygwLCAweDgzZGZkNTUyZTYzNzI5YjQ3MmZjYmNjOGM0NWViY2M2NjkxNzAyNTU4YjY4ZWM3NTI3ZTFiYTQwM2EwZjMxYTgpOwovLy8KLy8vICAgICBsZXQg" + - "c29tZU1hc3RlcmNoYWluQWRkcmVzczogQWRkcmVzcyA9Ci8vLyAgICAgICAgIG5ld0FkZHJlc3MoLTEsIDB4ODNkZmQ1NTJlNjM3MjliNDcyZmNiY2M4YzQ1ZWJjYzY2" + - "OTE3MDI1NThiNjhlYzc1MjdlMWJhNDAzYTBmMzFhOCk7Ci8vLwovLy8gICAgIC8vIERvZXMgbm90IHRocm93IGJlY2F1c2UgdGhlIGNoYWluIElEIGlzIDAKLy8vICAg" + - "ICBmb3JjZUJhc2VjaGFpbihzb21lQmFzZWNoYWluQWRkcmVzcyk7Ci8vLwovLy8gICAgIHRyeSB7Ci8vLyAgICAgICAgIC8vIFRocm93cyBiZWNhdXNlIHRoZSBjaGFp" + - "biBJRCBpcyAtMSAobWFzdGVyY2hhaW4pCi8vLyAgICAgICAgIGZvcmNlQmFzZWNoYWluKHNvbWVNYXN0ZXJjaGFpbkFkZHJlc3MpOwovLy8gICAgIH0gY2F0Y2ggKGV4" + - "aXRDb2RlKSB7Ci8vLyAgICAgICAgIC8vIGV4aXRDb2RlIGlzIDEzOAovLy8gICAgIH0KLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3Qt" + - "bGFuZy5vcmcvcmVmL2NvcmUtYWRkcmVzc2VzI2ZvcmNlYmFzZWNoYWluCi8vLwphc20gZnVuIGZvcmNlQmFzZWNoYWluKGFkZHJlc3M6IEFkZHJlc3MpIHsgUkVXUklU" + - "RVNUREFERFIgRFJPUCAxMzggVEhST1dJRiB9CgovLy8gR2xvYmFsIGZ1bmN0aW9uLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuNC4KLy8vCi8vLyBDaGVja3Mgd2hl" + - "dGhlciB0aGUgYGFkZHJlc3NgIGlzIGluIHRoZSBgd29ya2NoYWluYCwgaS5lLiwgaXRzIGNoYWluIElEIGlzIGVxdWFsIHRvIGB3b3JrY2hhaW5gLiBJZiBpdCBpcyBu" + - "b3QsIHRocm93cyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgYGVycm9yQ29kZWAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGVzKCkgewovLy8gICAg" + - "IGxldCBzb21lQmFzZWNoYWluQWRkcmVzczogQWRkcmVzcyA9Ci8vLyAgICAgICAgIG5ld0FkZHJlc3MoMCwgMHg4M2RmZDU1MmU2MzcyOWI0NzJmY2JjYzhjNDVlYmNj" + - "NjY5MTcwMjU1OGI2OGVjNzUyN2UxYmE0MDNhMGYzMWE4KTsKLy8vCi8vLyAgICAgbGV0IHNvbWVNYXN0ZXJjaGFpbkFkZHJlc3M6IEFkZHJlc3MgPQovLy8gICAgICAg" + - "ICBuZXdBZGRyZXNzKC0xLCAweDgzZGZkNTUyZTYzNzI5YjQ3MmZjYmNjOGM0NWViY2M2NjkxNzAyNTU4YjY4ZWM3NTI3ZTFiYTQwM2EwZjMxYTgpOwovLy8KLy8vICAg" + - "ICAvLyBEb2VzIG5vdCB0aHJvdyBiZWNhdXNlIHRoZSBjaGFpbiBJRCBtYXRjaGVzIHdvcmtjaGFpbiBwYXJhbWV0ZXIKLy8vICAgICBmb3JjZVdvcmtjaGFpbihzb21l" + - "QmFzZWNoYWluQWRkcmVzcywgMCwgNTkzKTsKLy8vICAgICBmb3JjZVdvcmtjaGFpbihzb21lTWFzdGVyY2hhaW5BZGRyZXNzLCAtMSwgNTkzKTsKLy8vCi8vLyAgICAg" + - "dHJ5IHsKLy8vICAgICAgICAgLy8gVGhyb3dzIGJlY2F1c2UgdGhlIGNoYWluIElEIGlzIDAgd2hpY2ggZG9lc24ndCBtYXRjaCB0aGUgd29ya2NoYWluIHBhcmFtZXRl" + - "ciwgLTEKLy8vICAgICAgICAgZm9yY2VXb3JrY2hhaW4oc29tZUJhc2VjaGFpbkFkZHJlc3MsIC0xLCA1OTMpOwovLy8gICAgIH0gY2F0Y2ggKGV4aXRDb2RlKSB7Ci8v" + - "LyAgICAgICAgIC8vIGV4aXRDb2RlIGlzIDU5MwovLy8gICAgIH0KLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVm" + - "L2NvcmUtYWRkcmVzc2VzI2ZvcmNld29ya2NoYWluCi8vLwphc20oZXJyb3JDb2RlIHdvcmtjaGFpbiBhZGRyZXNzKSBmdW4gZm9yY2VXb3JrY2hhaW4oYWRkcmVzczog" + - "QWRkcmVzcywgd29ya2NoYWluOiBJbnQsIGVycm9yQ29kZTogSW50KSB7CiAgICBSRVdSSVRFU1REQUREUgogICAgRFJPUAogICAgQ01QCiAgICBUSFJPV0FOWUlGCn0K"; + "cmVVaW50KDBiMTBfMF8wMDAwMDAwMCwgMyArIDgpCiAgICAgICAgLnN0b3JlVWludChhZGRyZXNzLmhhc2ghISwgMjU2KTsKfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlv" + + "biBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjQuCi8vLwovLy8gTG9hZHMgYW5kIHJldHVybnMgYSBgQmFzZWNo" + + "YWluQWRkcmVzc2Agc3RydWN0IGZyb20gdGhlIGBTbGljZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBzdWNoIGBCYXNlY2hhaW5BZGRyZXNzYCBzdHJ1Y3Qgd2hl" + + "biBgU2xpY2VgIGRvZXNuJ3QgY29udGFpbiBpdCB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBbZXhpdCBjb2RlIDhdOiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0" + + "ZW1wdHMgdG8gbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVy" + + "Zmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkKLy8vICAgICAgICAgLnN0b3Jl" + + "QmFzZWNoYWluQWRkcmVzcyhCYXNlY2hhaW5BZGRyZXNzeyBoYXNoOiBudWxsIH0pCi8vLyAgICAgICAgIC5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEJhc2Vj" + + "aGFpbkFkZHJlc3MgPSBzLmxvYWRCYXNlY2hhaW5BZGRyZXNzKCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcu" + + "b3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlbG9hZGJhc2VjaGFpbmFkZHJlc3MKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8v" + + "LwovLy8gW2V4aXQgY29kZSA4XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzgKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9j" + + "cy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwpleHRlbmRzIG11dGF0ZXMgZnVuIGxvYWRCYXNlY2hhaW5BZGRyZXNzKHNlbGY6IFNsaWNlKTogQmFz" + + "ZWNoYWluQWRkcmVzcyB7CiAgICAvLyBhZGRyX25vbmUKICAgIGlmIChzZWxmLmxvYWRVaW50KDIpID09IDApIHsKICAgICAgICByZXR1cm4gQmFzZWNoYWluQWRkcmVz" + + "c3sgaGFzaDogbnVsbCB9OwogICAgfQoKICAgIC8vIGFkZHJfc3RkLCBza2lwIHRoZSByZW1haW5pbmcgcHJlZml4IGJpdHMKICAgIHNlbGYuc2tpcEJpdHMoOSk7CiAg" + + "ICAvLyBMb2FkIHRoZSBoYXNoIChhY2NvdW50IElEKQogICAgcmV0dXJuIEJhc2VjaGFpbkFkZHJlc3N7IGhhc2g6IHNlbGYubG9hZFVpbnQoMjU2KSB9Owp9CgovLy8g" + + "RXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuNC4KLy8vCi8vLyBTa2lwcyBhIGBC" + + "YXNlY2hhaW5BZGRyZXNzYCBzdHJ1Y3QgZnJvbSB0aGUgYFNsaWNlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBza2lwIHN1Y2ggYEJhc2VjaGFpbkFkZHJlc3NgIHN0cnVj" + + "dCB3aGVuIGBTbGljZWAgZG9lc24ndCBjb250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgOF06IGBDZWxsIG92ZXJmbG93YC4KLy8vCi8v" + + "LyBBdHRlbXB0cyB0byBza2lwIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggW2V4aXQgY29kZSA5XTogYENlbGwg" + + "dW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczE6IFNsaWNlID0gYmVnaW5DZWxsKCkKLy8vICAgICAgICAg" + + "LnN0b3JlQmFzZWNoYWluQWRkcmVzcyhCYXNlY2hhaW5BZGRyZXNzeyBoYXNoOiBudWxsIH0pCi8vLyAgICAgICAgIC5zdG9yZVVpbnQoNDIsIDMyKQovLy8gICAgICAg" + + "ICAuYXNTbGljZSgpOwovLy8KLy8vICAgICBzMS5za2lwQmFzZWNoYWluQWRkcmVzcygpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzMS5sb2FkVWludCgzMik7IC8v" + + "IDQyCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlc2tpcGJhc2VjaGFp" + + "bmFkZHJlc3MKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwovLy8gW2V4aXQgY29kZSA4XTogaHR0cHM6Ly9kb2NzLnRh" + + "Y3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzgKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8v" + + "LwpleHRlbmRzIG11dGF0ZXMgZnVuIHNraXBCYXNlY2hhaW5BZGRyZXNzKHNlbGY6IFNsaWNlKSB7CiAgICAvLyBhZGRyX3N0ZAogICAgaWYgKHNlbGYubG9hZFVpbnQo" + + "MikgIT0gMCkgewogICAgICAgIC8vIDkgYml0cyBvZiB0aGUgcmVtYWluaW5nIHByZWZpeCBzaW5jZSBmaXJzdCAyIGFyZSBsb2FkZWQgYWxyZWFkeQogICAgICAgIC8v" + + "IHBsdXMgMjU2IGJpdHMgb2YgdGhlIGhhc2ggKGFjY291bnQgSUQpCiAgICAgICAgc2VsZi5za2lwQml0cygyNjUpOwogICAgfQoKICAgIC8vIGFkZHJfbm9uZSwgbm90" + + "aGluZyB0byBsb2FkIHNpbmNlIGl0cyAyIGJpdHMKICAgIC8vIGFyZSBsb2FkZWQgaW4gdGhlIGlmIHN0YXRlbWVudCBhYm92ZQp9CgovLy8gR2xvYmFsIGZ1bmN0aW9u" + + "LiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMy4KLy8vCi8vLyBDaGVja3Mgd2hldGhlciB0aGUgYGFkZHJlc3NgIGlzIGluIHRoZSBiYXNlY2hhaW4sIGkuZS4sIGl0" + + "cyBjaGFpbiBJRCBpcyAwLiBJZiBpdCBpcyBub3QsIHRocm93cyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgMTM4OiBgTm90IGEgYmFzZWNoYWluIGFkZHJlc3Ng" + + "LgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlcygpIHsKLy8vICAgICBsZXQgc29tZUJhc2VjaGFpbkFkZHJlc3M6IEFkZHJlc3MgPQovLy8gICAgICAgICBu" + + "ZXdBZGRyZXNzKDAsIDB4ODNkZmQ1NTJlNjM3MjliNDcyZmNiY2M4YzQ1ZWJjYzY2OTE3MDI1NThiNjhlYzc1MjdlMWJhNDAzYTBmMzFhOCk7Ci8vLwovLy8gICAgIGxl" + + "dCBzb21lTWFzdGVyY2hhaW5BZGRyZXNzOiBBZGRyZXNzID0KLy8vICAgICAgICAgbmV3QWRkcmVzcygtMSwgMHg4M2RmZDU1MmU2MzcyOWI0NzJmY2JjYzhjNDVlYmNj" + + "NjY5MTcwMjU1OGI2OGVjNzUyN2UxYmE0MDNhMGYzMWE4KTsKLy8vCi8vLyAgICAgLy8gRG9lcyBub3QgdGhyb3cgYmVjYXVzZSB0aGUgY2hhaW4gSUQgaXMgMAovLy8g" + + "ICAgIGZvcmNlQmFzZWNoYWluKHNvbWVCYXNlY2hhaW5BZGRyZXNzKTsKLy8vCi8vLyAgICAgdHJ5IHsKLy8vICAgICAgICAgLy8gVGhyb3dzIGJlY2F1c2UgdGhlIGNo" + + "YWluIElEIGlzIC0xIChtYXN0ZXJjaGFpbikKLy8vICAgICAgICAgZm9yY2VCYXNlY2hhaW4oc29tZU1hc3RlcmNoYWluQWRkcmVzcyk7Ci8vLyAgICAgfSBjYXRjaCAo" + + "ZXhpdENvZGUpIHsKLy8vICAgICAgICAgLy8gZXhpdENvZGUgaXMgMTM4Ci8vLyAgICAgfQovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFj" + + "dC1sYW5nLm9yZy9yZWYvY29yZS1hZGRyZXNzZXMjZm9yY2ViYXNlY2hhaW4KLy8vCmFzbSBmdW4gZm9yY2VCYXNlY2hhaW4oYWRkcmVzczogQWRkcmVzcykgeyBSRVdS" + + "SVRFU1REQUREUiBEUk9QIDEzOCBUSFJPV0lGIH0KCi8vLyBHbG9iYWwgZnVuY3Rpb24uIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi40LgovLy8KLy8vIENoZWNrcyB3" + + "aGV0aGVyIHRoZSBgYWRkcmVzc2AgaXMgaW4gdGhlIGB3b3JrY2hhaW5gLCBpLmUuLCBpdHMgY2hhaW4gSUQgaXMgZXF1YWwgdG8gYHdvcmtjaGFpbmAuIElmIGl0IGlz" + + "IG5vdCwgdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSBgZXJyb3JDb2RlYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZXMoKSB7Ci8vLyAg" + + "ICAgbGV0IHNvbWVCYXNlY2hhaW5BZGRyZXNzOiBBZGRyZXNzID0KLy8vICAgICAgICAgbmV3QWRkcmVzcygwLCAweDgzZGZkNTUyZTYzNzI5YjQ3MmZjYmNjOGM0NWVi" + + "Y2M2NjkxNzAyNTU4YjY4ZWM3NTI3ZTFiYTQwM2EwZjMxYTgpOwovLy8KLy8vICAgICBsZXQgc29tZU1hc3RlcmNoYWluQWRkcmVzczogQWRkcmVzcyA9Ci8vLyAgICAg" + + "ICAgIG5ld0FkZHJlc3MoLTEsIDB4ODNkZmQ1NTJlNjM3MjliNDcyZmNiY2M4YzQ1ZWJjYzY2OTE3MDI1NThiNjhlYzc1MjdlMWJhNDAzYTBmMzFhOCk7Ci8vLwovLy8g" + + "ICAgIC8vIERvZXMgbm90IHRocm93IGJlY2F1c2UgdGhlIGNoYWluIElEIG1hdGNoZXMgd29ya2NoYWluIHBhcmFtZXRlcgovLy8gICAgIGZvcmNlV29ya2NoYWluKHNv" + + "bWVCYXNlY2hhaW5BZGRyZXNzLCAwLCA1OTMpOwovLy8gICAgIGZvcmNlV29ya2NoYWluKHNvbWVNYXN0ZXJjaGFpbkFkZHJlc3MsIC0xLCA1OTMpOwovLy8KLy8vICAg" + + "ICB0cnkgewovLy8gICAgICAgICAvLyBUaHJvd3MgYmVjYXVzZSB0aGUgY2hhaW4gSUQgaXMgMCB3aGljaCBkb2Vzbid0IG1hdGNoIHRoZSB3b3JrY2hhaW4gcGFyYW1l" + + "dGVyLCAtMQovLy8gICAgICAgICBmb3JjZVdvcmtjaGFpbihzb21lQmFzZWNoYWluQWRkcmVzcywgLTEsIDU5Myk7Ci8vLyAgICAgfSBjYXRjaCAoZXhpdENvZGUpIHsK" + + "Ly8vICAgICAgICAgLy8gZXhpdENvZGUgaXMgNTkzCi8vLyAgICAgfQovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9y" + + "ZWYvY29yZS1hZGRyZXNzZXMjZm9yY2V3b3JrY2hhaW4KLy8vCmFzbShlcnJvckNvZGUgd29ya2NoYWluIGFkZHJlc3MpIGZ1biBmb3JjZVdvcmtjaGFpbihhZGRyZXNz" + + "OiBBZGRyZXNzLCB3b3JrY2hhaW46IEludCwgZXJyb3JDb2RlOiBJbnQpIHsKICAgIFJFV1JJVEVTVERBRERSCiAgICBEUk9QCiAgICBDTVAKICAgIFRIUk9XQU5ZSUYK" + + "fQo="; files["std/internal/base.tact"] = "Ly8vIERlc2NyaWJlcyB0aGUgYmFzZSBsb2dpYyB0aGF0IGlzIGF2YWlsYWJsZSBpbiBhbGwgY29udHJhY3RzIGFuZCB0cmFpdHMgYnkgZGVmYXVsdC4KLy8vCi8vLyBU" + "aGlzIHRyYWl0IGlzIGltcGxpY2l0bHkgaW5oZXJpdGVkIGJ5IGV2ZXJ5IG90aGVyIGNvbnRyYWN0IGFuZCB0cmFpdC4KLy8vIEl0IGNvbnRhaW5zIGEgbnVtYmVyIG9m" + @@ -496,378 +525,410 @@ files["std/internal/cells.tact"] = "b2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjYnVpbGRlcmRlcHRoCi8vLwphc20gZXh0ZW5kcyBmdW4gZGVwdGgoc2VsZjogQnVpbGRlcik6IEludCB7IEJE" + "RVBUSCB9CgovLwovLyBTbGljZQovLwoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBDZWxsYCB0eXBlLgovLy8KLy8vIE9wZW5zIHRoZSBgQ2VsbGAgZm9y" + "IHBhcnNpbmcgYW5kIHJldHVybnMgaXQgYXMgYSBgU2xpY2VgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBjOiBDZWxsID0g" + - "YmVnaW5DZWxsKCk7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYy5iZWdpblBhcnNlKCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9j" + - "cy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2NlbGxiZWdpbnBhcnNlCi8vLwphc20gZXh0ZW5kcyBmdW4gYmVnaW5QYXJzZShzZWxmOiBDZWxsKTogU2xpY2Ug" + - "eyBDVE9TIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gTG9hZHMgdGhlIG5leHQgcmVmZXJlbmNl" + - "IGZyb20gdGhlIGBTbGljZWAgYXMgYSBgQ2VsbGAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBzdWNoIHJlZmVyZW5jZSBgQ2VsbGAgd2hlbiBgU2xpY2VgIGRvZXNu" + - "J3QgY29udGFpbiBpdCB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA4XTogYENlbGwgb3ZlcmZsb3dgLgovLy8KLy8vIEF0dGVtcHRzIHRvIGxv" + - "YWQgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucyB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA5XTogYENlbGwgdW5kZXJmbG93YC4K" + - "Ly8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczE6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVSZWYoZW1wdHlDZWxsKCkpLmFz" + - "U2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogQ2VsbCA9IHMxLmxvYWRSZWYoKTsKLy8vCi8vLyAgICAgbGV0IHMyOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAg" + - "ICAgIC5zdG9yZVJlZihlbXB0eUNlbGwoKSkKLy8vICAgICAgICAgLnN0b3JlUmVmKHMxLmFzQ2VsbCgpKQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8gICAgIGxl" + - "dCByZWYxOiBDZWxsID0gczIubG9hZFJlZigpOwovLy8gICAgIGxldCByZWYyOiBDZWxsID0gczIubG9hZFJlZigpOwovLy8gICAgIHJlZjEgPT0gcmVmMjsgLy8gZmFs" + - "c2UKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFtleGl0IGNvZGUgOF06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLyBbZXhpdCBj" + - "b2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtKC0+IDEgMCkgZXh0ZW5kcyBtdXRhdGVzIGZ1biBsb2FkUmVm" + - "KHNlbGY6IFNsaWNlKTogQ2VsbCB7IExEUkVGIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBz" + - "aW5jZSBUYWN0IDEuNi4yLgovLy8KLy8vIFNraXBzIHRoZSBuZXh0IHJlZmVyZW5jZSBmcm9tIHRoZSBgU2xpY2VgLiBTaW1pbGFyIHRvIGRpc2NhcmRpbmcgdGhlIHJl" + - "dHVybiB2YWx1ZSBvZiBgU2xpY2UubG9hZFJlZigpYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBza2lwIHN1Y2ggcmVmZXJlbmNlIGBDZWxsYCB3aGVuIGBTbGljZWAgZG9l" + - "c24ndCBjb250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDhdOiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8g" + - "c2tpcCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dg" + - "LgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzMTogU2xpY2UgPSBiZWdpbkNlbGwoKQovLy8gICAgICAgICAuc3RvcmVSZWYo" + - "ZW1wdHlDZWxsKCkpCi8vLyAgICAgICAgIC5zdG9yZVVpbnQoNDIsIDMyKQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8KLy8vICAgICBzMS5za2lwUmVmKCk7Ci8v" + - "LyAgICAgbGV0IGZpeno6IEludCA9IHMxLmxvYWRVaW50KDMyKTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFtleGl0IGNvZGUgOF06IGh0dHBzOi8vZG9jcy50" + - "YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQov" + - "Ly8KYXNtIGV4dGVuZHMgbXV0YXRlcyBmdW4gc2tpcFJlZihzZWxmOiBTbGljZSkgeyBMRFJFRiBOSVAgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBT" + - "bGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS41LjAuCi8vLwovLy8gUHJlbG9hZHMgdGhlIG5leHQgcmVmZXJlbmNlIGZyb20gdGhlIGBTbGljZWAgYXMg" + - "YSBgQ2VsbGAuIERvZXNuJ3QgbW9kaWZ5IHRoZSBvcmlnaW5hbCBgU2xpY2VgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHByZWxvYWQgc3VjaCByZWZlcmVuY2UgYENlbGxg" + - "IHdoZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDg6IGBDZWxsIG92ZXJmbG93YC4KLy8vCi8vLyBB" + - "dHRlbXB0cyB0byBwcmVsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDk6IGBDZWxsIHVu" + - "ZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGVzKCkgewovLy8gICAgIGxldCBzMTogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZVJlZihlbXB0" + - "eUNlbGwoKSkuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBDZWxsID0gczEucHJlbG9hZFJlZigpOyAvLyBkaWRuJ3QgbW9kaWZ5IHMxCi8vLwovLy8gICAgIGxl" + - "dCBzMjogU2xpY2UgPSBiZWdpbkNlbGwoKQovLy8gICAgICAgICAuc3RvcmVSZWYoZW1wdHlDZWxsKCkpCi8vLyAgICAgICAgIC5zdG9yZVJlZihzMS5hc0NlbGwoKSkK" + - "Ly8vICAgICAgICAgLmFzU2xpY2UoKTsKLy8vCi8vLyAgICAgbGV0IHJlZjE6IENlbGwgPSBzMi5wcmVsb2FkUmVmKCk7Ci8vLyAgICAgbGV0IHJlZjI6IENlbGwgPSBz" + - "Mi5wcmVsb2FkUmVmKCk7Ci8vLyAgICAgcmVmMSA9PSByZWYyOyAvLyB0cnVlCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0" + - "LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlcHJlbG9hZHJlZgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMKLy8vCmFz" + - "bSBleHRlbmRzIGZ1biBwcmVsb2FkUmVmKHNlbGY6IFNsaWNlKTogQ2VsbCB7IFBMRFJFRiB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUg" + - "YFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBMb2FkcyBhIHNpbmdsZSBiaXQgZnJvbSB0aGUgYFNsaWNlYDogaWYgaXQncyAx" + - "LCB0aGVuIHRoZSByZWZlcmVuY2VkIGBDZWxsYCBpcyBsb2FkZWQgYW5kIHJldHVybmVkLiBJZiB0aGUgbG9hZGVkIGJpdCBpcyAwLCB0aGVuIG5vdGhpbmcgZWxzZSBp" + - "cyBsb2FkZWQgYW5kIGBudWxsYCBpcyByZXR1cm5lZC4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIHN1Y2ggcmVmZXJlbmNlIGBDZWxsYCB3aGVuIGBTbGljZWAgZG9l" + - "c24ndCBjb250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA4OiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBt" + - "b3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA5OiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBg" + - "YHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzID0gbXNnLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgb3V0QWN0aW9ucyA9IHMubG9hZE1heWJlUmVm" + - "KCk7Ci8vLwovLy8gICAgIGlmIChvdXRBY3Rpb25zICE9IG51bGwpIHsKLy8vICAgICAgICAgbGV0IGFjdGlvbnMgPSBvdXRBY3Rpb25zISE7Ci8vLyAgICAgICAgIC8v" + - "IC4uLnByb2Nlc3MgYWN0aW9ucy4uLgovLy8gICAgIH0KLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVm" + - "L2NvcmUtY2VsbHMjc2xpY2Vsb2FkbWF5YmVyZWYKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwphc20oLT4gMSAwKSBl" + - "eHRlbmRzIG11dGF0ZXMgZnVuIGxvYWRNYXliZVJlZihzZWxmOiBTbGljZSk6IENlbGw/IHsgTERPUFRSRUYgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlv" + - "biBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjIuCi8vLwovLy8gU2tpcHMgYENlbGw/YCBmcm9tIHRoZSBgU2xpY2VgLiBTaW1p" + - "bGFyIHRvIGRpc2NhcmRpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBgU2xpY2UubG9hZE1heWJlUmVmKClgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNraXAgc3VjaCByZWZl" + - "cmVuY2UgYENlbGxgIHdoZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDg6IGBDZWxsIG92ZXJmbG93" + - "YC4KLy8vCi8vLyBBdHRlbXB0cyB0byBza2lwIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDk6" + - "IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHMxOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAg" + - "ICAgICAgIC5zdG9yZU1heWJlUmVmKGVtcHR5Q2VsbCgpKQovLy8gICAgICAgICAuc3RvcmVVaW50KDQyLCAzMikKLy8vICAgICAgICAgLmFzU2xpY2UoKTsKLy8vCi8v" + - "LyAgICAgczEuc2tpcE1heWJlUmVmKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMxLmxvYWRVaW50KDMyKTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNl" + - "ZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkbWF5YmVyZWYKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFu" + - "Zy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwphc20gZXh0ZW5kcyBtdXRhdGVzIGZ1biBza2lwTWF5YmVSZWYoc2VsZjogU2xpY2UpIHsgTERPUFRSRUYgTklQIH0KCi8v" + - "LyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIFByZWxvYWRzIGEgc2luZ2xl" + - "IGJpdCBmcm9tIHRoZSBgU2xpY2VgOiBpZiBpdCdzIDEsIHRoZW4gdGhlIHJlZmVyZW5jZWQgYENlbGxgIGlzIHByZWxvYWRlZCBhbmQgcmV0dXJuZWQuIElmIHRoZSBw" + - "cmVsb2FkZWQgYml0IGlzIDAsIHRoZW4gYG51bGxgIGlzIHJldHVybmVkLiBEb2Vzbid0IG1vZGlmeSB0aGUgb3JpZ2luYWwgYFNsaWNlYC4KLy8vCi8vLyBBdHRlbXB0" + - "cyB0byBwcmVsb2FkIHN1Y2ggcmVmZXJlbmNlIGBDZWxsYCB3aGVuIGBTbGljZWAgZG9lc24ndCBjb250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQg" + - "Y29kZSA4OiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gcHJlbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4" + - "Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA5OiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlcygpIHsKLy8vICAgICBsZXQgczE6" + - "IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVNYXliZVJlZihlbXB0eUNlbGwoKSkuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBDZWxsID0gczEucHJlbG9hZE1h" + - "eWJlUmVmKCk7IC8vIHJldHVybnMgZW1wdHlDZWxsKCkgYW5kIGRvZXNuJ3QgbW9kaWZ5IHMxCi8vLwovLy8gICAgIGxldCBzMjogU2xpY2UgPSBiZWdpbkNlbGwoKQov" + - "Ly8gICAgICAgICAuc3RvcmVNYXliZVJlZihudWxsKQovLy8gICAgICAgICAuc3RvcmVNYXliZVJlZihzMS5hc0NlbGwoKSkKLy8vICAgICAgICAgLmFzU2xpY2UoKTsK" + - "Ly8vCi8vLyAgICAgbGV0IHJlZjE6IENlbGwgPSBzMi5wcmVsb2FkTWF5YmVSZWYoKTsgLy8gcmV0dXJucyBudWxsIGFuZCBkb2Vzbid0IG1vZGlmeSBzMgovLy8gICAg" + - "IGxldCByZWYyOiBDZWxsID0gczIucHJlbG9hZE1heWJlUmVmKCk7IC8vIHNhbWUgZWZmZWN0Ci8vLyAgICAgcmVmMSA9PSBudWxsOyAvLyB0cnVlCi8vLyAgICAgcmVm" + - "MSA9PSByZWYyOyAvLyB0cnVlCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3Ns" + - "aWNlcHJlbG9hZG1heWJlcmVmCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcwovLy8KYXNtIGV4dGVuZHMgZnVuIHByZWxvYWRN" + - "YXliZVJlZihzZWxmOiBTbGljZSk6IENlbGw/IHsgUExET1BUUkVGIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUu" + - "Ci8vLwovLy8gTG9hZHMgMCDiiaQgYGxgIOKJpCAxMDIzIGJpdHMgZnJvbSB0aGUgYFNsaWNlYCBhbmQgcmV0dXJucyB0aGVtIGFzIGEgc2VwYXJhdGUgYFNsaWNlYC4K" + - "Ly8vCi8vLyBBdHRlbXB0cyB0byBzcGVjaWZ5IGFuIG91dC1vZi1ib3VuZHMgYGxgIHZhbHVlIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDVd" + - "OiBgSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIEF0dGVtcHRzIHRvIGxvYWQgbW9yZSBkYXRhIHRoYW4gdGhlIGBTbGljZWAgY29udGFpbnMg" + - "dGhyb3cgYW4gZXhjZXB0aW9uIHdpdGgKLy8vIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7" + - "Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogU2xpY2UgPSBzLmxvYWRC" + - "aXRzKDcpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWRiaXRz" + - "Ci8vLwovLy8gW2V4aXQgY29kZSA1XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8v" + - "ZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwpAbmFtZShsb2FkX2JpdHMpIC8vIHNwZWNpYWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGlsZXIs" + - "IHNvIG5vdCByZXBsYWNlZCB3aXRoIGFzbSAiTERTTElDRVgiCmV4dGVuZHMgbXV0YXRlcyBuYXRpdmUgbG9hZEJpdHMoc2VsZjogU2xpY2UsIGw6IEludCk6IFNsaWNl" + - "OwoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBQcmVsb2FkcyAwIOKJpCBgbGAg4omkIDEwMjMgYml0cyBmcm9tIHRo" + - "ZSBgU2xpY2VgIGFuZCByZXR1cm5zIHRoZW0gYXMgYSBzZXBhcmF0ZSBgU2xpY2VgLgovLy8gRG9lc24ndCBtb2RpZnkgdGhlIG9yaWdpbmFsIGBTbGljZWAuCi8vLwov" + - "Ly8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBhbiBvdXQtb2YtYm91bmRzIGBsYCB2YWx1ZSB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA1XTogYElu" + - "dGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBwcmVsb2FkIG1vcmUgZGF0YSB0aGFuIHRoZSBgU2xpY2VgIGNvbnRhaW5zIHRo" + - "cm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewov" + - "Ly8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQyLCA3KS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IFNsaWNlID0gcy5wcmVsb2Fk" + - "Qml0cyg3KTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VwcmVsb2Fk" + - "Yml0cwovLy8KLy8vIFtleGl0IGNvZGUgNV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRw" + - "czovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KQG5hbWUocHJlbG9hZF9iaXRzKSAvLyBzcGVjaWFsIHRyZWF0bWVudCBpbiBGdW5jIGNv" + - "bXBpbGVyLCBzbyBub3QgcmVwbGFjZWQgd2l0aCBhc20gIlBMRFNMSUNFWCIKZXh0ZW5kcyBuYXRpdmUgcHJlbG9hZEJpdHMoc2VsZjogU2xpY2UsIGw6IEludCk6IFNs" + - "aWNlOwoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBMb2FkcyBhbmQgcmV0dXJucyBhIHNpZ25lZCBg" + - "bGAtYml0IGBJbnRgIGZyb20gdGhlIGBTbGljZWAsIGZvciAwIOKJpCBsIOKJpCAyNTcuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBhbiBvdXQtb2YtYm91bmRz" + - "IGBsYCB2YWx1ZSB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA1XTogYEludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlYC4KLy8vCi8vLyBB" + - "dHRlbXB0cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIHRoZSBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDldOiBg" + - "Q2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50" + - "KDQyLCA3KS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMubG9hZEludCg3KTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6" + - "Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkaW50Ci8vLwovLy8gW2V4aXQgY29kZSA1XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5v" + - "cmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwpAbmFtZShs" + - "b2FkX2ludCkgLy8gc3BlY2lhbCB0cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJMRElYIgpleHRlbmRzIG11dGF0ZXMg" + - "bmF0aXZlIGxvYWRJbnQoc2VsZjogU2xpY2UsIGw6IEludCk6IEludDsKCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8g" + - "UHJlbG9hZHMgYW5kIHJldHVybnMgYSBzaWduZWQgYGxgLWJpdCBgSW50YCBmcm9tIHRoZSBgU2xpY2VgLCBmb3IgMCDiiaQgbCDiiaQgMjU3LgovLy8gRG9lc24ndCBt" + - "b2RpZnkgdGhlIGBTbGljZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBhbiBvdXQtb2YtYm91bmRzIGBsYCB2YWx1ZSB0aHJvdyBhbiBleGNlcHRpb24gd2l0" + - "aAovLy8gW2V4aXQgY29kZSA1XTogYEludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBwcmVsb2FkIG1vcmUgZGF0YSB0aGFu" + - "IHRoZSBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRh" + - "Y3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQyLCA3KS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0" + - "IGZpeno6IEludCA9IHMucHJlbG9hZEludCg3KTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2Nv" + - "cmUtY2VsbHMjc2xpY2VwcmVsb2FkaW50Ci8vLwovLy8gW2V4aXQgY29kZSA1XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8v" + - "IFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwpAbmFtZShwcmVsb2FkX2ludCkgLy8gc3BlY2lhbCB0" + - "cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJQTERJWCIKZXh0ZW5kcyBuYXRpdmUgcHJlbG9hZEludChzZWxmOiBTbGlj" + - "ZSwgbDogSW50KTogSW50OwoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBMb2FkcyBhbmQgcmV0dXJu" + - "cyBhbiB1bnNpZ25lZCBgbGAtYml0IGBJbnRgIGZyb20gdGhlIGBTbGljZWAsIGZvciAwIOKJpCBsIOKJpCAyNTYuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBh" + - "biBvdXQtb2YtYm91bmRzIGBsYCB2YWx1ZSB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA1XTogYEludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJh" + - "bmdlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIHRoZSBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBb" + - "ZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2lu" + - "Q2VsbCgpLnN0b3JlVWludCg0MiwgNykuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxvYWRVaW50KDcpOwovLy8gfQovLy8gYGBgCi8vLwovLy8g" + - "U2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWR1aW50Ci8vLwovLy8gW2V4aXQgY29kZSA1XTogaHR0cHM6" + - "Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1j" + - "b2RlcyM5Ci8vLwpAbmFtZShsb2FkX3VpbnQpIC8vIHNwZWNpYWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGlsZXIsIHNvIG5vdCByZXBsYWNlZCB3aXRoIGFzbSAiTERV" + - "WCIKZXh0ZW5kcyBtdXRhdGVzIG5hdGl2ZSBsb2FkVWludChzZWxmOiBTbGljZSwgbDogSW50KTogSW50OwoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBT" + - "bGljZWAgdHlwZS4KLy8vCi8vLyBQcmVsb2FkcyBhbmQgcmV0dXJucyBhbiB1bnNpZ25lZCBgbGAtYml0IGBJbnRgIGZyb20gdGhlIGBTbGljZWAsIGZvciAwIOKJpCBs" + - "IOKJpCAyNTYuCi8vLyBEb2Vzbid0IG1vZGlmeSB0aGUgYFNsaWNlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBzcGVjaWZ5IGFuIG91dC1vZi1ib3VuZHMgYGxgIHZhbHVl" + - "IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDVdOiBgSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIEF0dGVtcHRzIHRv" + - "IHByZWxvYWQgbW9yZSBkYXRhIHRoYW4gdGhlIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGgKLy8vIFtleGl0IGNvZGUgOV06IGBDZWxsIHVu" + - "ZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVVaW50KDQyLCA3" + - "KS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMucHJlbG9hZFVpbnQoNyk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8v" + - "ZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlcHJlbG9hZHVpbnQKLy8vCi8vLyBbZXhpdCBjb2RlIDVdOiBodHRwczovL2RvY3MudGFjdC1sYW5n" + - "Lm9yZy9ib29rL2V4aXQtY29kZXMjNQovLy8gW2V4aXQgY29kZSA5XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCkBuYW1l" + - "KHByZWxvYWRfdWludCkgLy8gc3BlY2lhbCB0cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJQTERVWCIKZXh0ZW5kcyBu" + - "YXRpdmUgcHJlbG9hZFVpbnQoc2VsZjogU2xpY2UsIGw6IEludCk6IEludDsKCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5" + - "cGUuCi8vLwovLy8gTG9hZHMgYSBzaW5nbGUgYml0IGFuZCByZXR1cm5zIGEgYEJvb2xgIHZhbHVlIGZyb20gdGhlIGBTbGljZWAuCi8vLyBSZWFkcyBgdHJ1ZWAgaWYg" + - "dGhlIGxvYWRlZCBiaXQgaXMgZXF1YWwgdG8gMSwgYW5kIHJlYWRzIGBmYWxzZWAgb3RoZXJ3aXNlLgovLy8KLy8vIEF0dGVtcHRzIHRvIGxvYWQgc3VjaCBgQm9vbGAg" + - "d2hlbiB0aGUgYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGgKLy8vIFtleGl0IGNvZGUgOF06IGBDZWxsIG92ZXJmbG93YC4K" + - "Ly8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIHRoZSBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBj" + - "b2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgp" + - "LnN0b3JlQm9vbCh0cnVlKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEJvb2wgPSBzLmxvYWRCb29sKCk7IC8vIHRydWUKLy8vIH0KLy8vIGBgYAovLy8KLy8v" + - "IFtleGl0IGNvZGUgOF06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFj" + - "dC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtKC0+IDEgMCkgZXh0ZW5kcyBtdXRhdGVzIGZ1biBsb2FkQm9vbChzZWxmOiBTbGljZSk6IEJvb2wgeyAx" + - "IExESSB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMi4KLy8vCi8v" + - "LyBTa2lwcyBhIHNpbmdsZSBiaXQgZnJvbSB0aGUgYFNsaWNlYC4gU2ltaWxhciB0byBkaXNjYXJkaW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgYFNsaWNlLmxvYWRCb29s" + - "KClgLgovLy8KLy8vIEF0dGVtcHRzIHRvIGxvYWQgc3VjaCBgQm9vbGAgd2hlbiB0aGUgYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cgYW4gZXhjZXB0aW9u" + - "IHdpdGgKLy8vIFtleGl0IGNvZGUgOF06IGBDZWxsIG92ZXJmbG93YC4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIHRoZSBgU2xpY2VgIGNv" + - "bnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFt" + - "cGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZUJvb2wodHJ1ZSkKLy8vICAgICAgICAgLnN0b3JlVWludCg0" + - "MiwgNykKLy8vICAgICAgICAgLmFzU2xpY2UoKTsKLy8vCi8vLyAgICAgcy5za2lwQm9vbCgpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxvYWRVaW50KDcpOyAv" + - "LyA0MgovLy8gfQovLy8gYGBgCi8vLwovLy8gW2V4aXQgY29kZSA4XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzgKLy8vIFtleGl0" + - "IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwphc20gZXh0ZW5kcyBtdXRhdGVzIGZ1biBza2lwQm9vbChzZWxm" + - "OiBTbGljZSkgeyAxIExESSBOSVAgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRh" + - "Y3QgMS41LjAuCi8vLwovLy8gQWxpYXMgdG8gYFNsaWNlLmxvYWRCb29sKClgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBz" + - "OiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlQm9vbCh0cnVlKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEJvb2wgPSBzLmxvYWRCaXQoKTsgLy8gdHJ1ZQov" + - "Ly8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWRiaXQKLy8vCmFzbSgtPiAxIDAp" + - "IGV4dGVuZHMgbXV0YXRlcyBmdW4gbG9hZEJpdChzZWxmOiBTbGljZSk6IEJvb2wgeyAxIExESSB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0" + - "aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIExvYWRzIGFuZCByZXR1cm5zIGEgc2VyaWFsaXplZCB1bnNpZ25lZCBgSW50YCB2YWx1ZSBpbiB0aGUgcmFuZ2UgZnJvbSAw" + - "IHRvIDJeMTIwIC0gMSBpbmNsdXNpdmUgZnJvbSB0aGUgYFNsaWNlYC4gVGhpcyB2YWx1ZSB1c3VhbGx5IHJlcHJlc2VudHMgdGhlIGFtb3VudCBpbiBuYW5vVG9uY29p" + - "bnMuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBzdWNoIGBJbnRgIHdoZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGgg" + - "ZXhpdCBjb2RlIDg6IGBDZWxsIG92ZXJmbG93YC4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4g" + - "ZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDk6IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6" + - "IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVDb2lucyg0MikuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxvYWRDb2lucygpOyAvLyA0MgovLy8g" + - "fQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWRjb2lucwovLy8KYXNtKCAtPiAxIDAp" + - "IGV4dGVuZHMgbXV0YXRlcyBmdW4gbG9hZENvaW5zKHNlbGY6IFNsaWNlKTogSW50IHsgTERWQVJVSU5UMTYgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlv" + + "YmVnaW5DZWxsKCk7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYy5iZWdpblBhcnNlKCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0" + + "LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2NlbGxiZWdpbnBhcnNlCi8vLwphc20gZXh0ZW5kcyBmdW4gYmVnaW5QYXJzZShzZWxmOiBDZWxsKTogU2xpY2UgeyBDVE9T" + + "IH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gTG9hZHMgdGhlIG5leHQgcmVmZXJlbmNlIGZyb20g" + + "dGhlIGBTbGljZWAgYXMgYSBgQ2VsbGAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBzdWNoIHJlZmVyZW5jZSBgQ2VsbGAgd2hlbiBgU2xpY2VgIGRvZXNuJ3QgY29u" + + "dGFpbiBpdCB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA4XTogYENlbGwgb3ZlcmZsb3dgLgovLy8KLy8vIEF0dGVtcHRzIHRvIGxvYWQgbW9y" + + "ZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucyB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA5XTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8v" + + "LyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczE6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVSZWYoZW1wdHlDZWxsKCkpLmFzU2xpY2Uo" + + "KTsKLy8vICAgICBsZXQgZml6ejogQ2VsbCA9IHMxLmxvYWRSZWYoKTsKLy8vCi8vLyAgICAgbGV0IHMyOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5z" + + "dG9yZVJlZihlbXB0eUNlbGwoKSkKLy8vICAgICAgICAgLnN0b3JlUmVmKHMxLmFzQ2VsbCgpKQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8gICAgIGxldCByZWYx" + + "OiBDZWxsID0gczIubG9hZFJlZigpOwovLy8gICAgIGxldCByZWYyOiBDZWxsID0gczIubG9hZFJlZigpOwovLy8gICAgIHJlZjEgPT0gcmVmMjsgLy8gZmFsc2UKLy8v" + + "IH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkcmVmCi8vLyAqIGh0dHBz" + + "Oi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcwovLy8KLy8vIFtleGl0IGNvZGUgOF06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhp" + + "dC1jb2RlcyM4Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtKC0+IDEgMCkgZXh0ZW5k" + + "cyBtdXRhdGVzIGZ1biBsb2FkUmVmKHNlbGY6IFNsaWNlKTogQ2VsbCB7IExEUkVGIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xp" + + "Y2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4yLgovLy8KLy8vIFNraXBzIHRoZSBuZXh0IHJlZmVyZW5jZSBmcm9tIHRoZSBgU2xpY2VgLiBTaW1pbGFy" + + "IHRvIGRpc2NhcmRpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBgU2xpY2UubG9hZFJlZigpYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBza2lwIHN1Y2ggcmVmZXJlbmNlIGBD" + + "ZWxsYCB3aGVuIGBTbGljZWAgZG9lc24ndCBjb250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDhdOiBgQ2VsbCBvdmVyZmxvd2Au" + + "Ci8vLwovLy8gQXR0ZW1wdHMgdG8gc2tpcCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2Rl" + + "IDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzMTogU2xpY2UgPSBiZWdpbkNlbGwoKQov" + + "Ly8gICAgICAgICAuc3RvcmVSZWYoZW1wdHlDZWxsKCkpCi8vLyAgICAgICAgIC5zdG9yZVVpbnQoNDIsIDMyKQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8KLy8v" + + "ICAgICBzMS5za2lwUmVmKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMxLmxvYWRVaW50KDMyKTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8v" + + "ICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vza2lwcmVmCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2sv" + + "ZXhpdC1jb2RlcwovLy8KLy8vIFtleGl0IGNvZGUgOF06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLyBbZXhpdCBjb2RlIDld" + + "OiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4dGVuZHMgbXV0YXRlcyBmdW4gc2tpcFJlZihzZWxmOiBTbGljZSkg" + + "eyBMRFJFRiBOSVAgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS41LjAuCi8vLwovLy8g" + + "UHJlbG9hZHMgdGhlIG5leHQgcmVmZXJlbmNlIGZyb20gdGhlIGBTbGljZWAgYXMgYSBgQ2VsbGAuIERvZXNuJ3QgbW9kaWZ5IHRoZSBvcmlnaW5hbCBgU2xpY2VgLgov" + + "Ly8KLy8vIEF0dGVtcHRzIHRvIHByZWxvYWQgc3VjaCByZWZlcmVuY2UgYENlbGxgIHdoZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cgYW4gZXhjZXB0" + + "aW9uIHdpdGggZXhpdCBjb2RlIDg6IGBDZWxsIG92ZXJmbG93YC4KLy8vCi8vLyBBdHRlbXB0cyB0byBwcmVsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFp" + + "bnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDk6IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGVzKCkgewov" + + "Ly8gICAgIGxldCBzMTogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZVJlZihlbXB0eUNlbGwoKSkuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBDZWxsID0gczEu" + + "cHJlbG9hZFJlZigpOyAvLyBkaWRuJ3QgbW9kaWZ5IHMxCi8vLwovLy8gICAgIGxldCBzMjogU2xpY2UgPSBiZWdpbkNlbGwoKQovLy8gICAgICAgICAuc3RvcmVSZWYo" + + "ZW1wdHlDZWxsKCkpCi8vLyAgICAgICAgIC5zdG9yZVJlZihzMS5hc0NlbGwoKSkKLy8vICAgICAgICAgLmFzU2xpY2UoKTsKLy8vCi8vLyAgICAgbGV0IHJlZjE6IENl" + + "bGwgPSBzMi5wcmVsb2FkUmVmKCk7Ci8vLyAgICAgbGV0IHJlZjI6IENlbGwgPSBzMi5wcmVsb2FkUmVmKCk7Ci8vLyAgICAgcmVmMSA9PSByZWYyOyAvLyB0cnVlCi8v" + + "LyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlcHJlbG9hZHJlZgovLy8gKiBo" + + "dHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMKLy8vCmFzbSBleHRlbmRzIGZ1biBwcmVsb2FkUmVmKHNlbGY6IFNsaWNlKTogQ2VsbCB7IFBM" + + "RFJFRiB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8v" + + "LyBMb2FkcyBhIHNpbmdsZSBiaXQgZnJvbSB0aGUgYFNsaWNlYDogaWYgaXQncyAxLCB0aGVuIHRoZSByZWZlcmVuY2VkIGBDZWxsYCBpcyBsb2FkZWQgYW5kIHJldHVy" + + "bmVkLiBJZiB0aGUgbG9hZGVkIGJpdCBpcyAwLCB0aGVuIG5vdGhpbmcgZWxzZSBpcyBsb2FkZWQgYW5kIGBudWxsYCBpcyByZXR1cm5lZC4KLy8vCi8vLyBBdHRlbXB0" + + "cyB0byBsb2FkIHN1Y2ggcmVmZXJlbmNlIGBDZWxsYCB3aGVuIGBTbGljZWAgZG9lc24ndCBjb250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29k" + + "ZSA4OiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlv" + + "biB3aXRoIGV4aXQgY29kZSA5OiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzID0gbXNnLmFz" + + "U2xpY2UoKTsKLy8vICAgICBsZXQgb3V0QWN0aW9ucyA9IHMubG9hZE1heWJlUmVmKCk7Ci8vLwovLy8gICAgIGlmIChvdXRBY3Rpb25zICE9IG51bGwpIHsKLy8vICAg" + + "ICAgICAgbGV0IGFjdGlvbnMgPSBvdXRBY3Rpb25zISE7Ci8vLyAgICAgICAgIC8vIC4uLnByb2Nlc3MgYWN0aW9ucy4uLgovLy8gICAgIH0KLy8vIH0KLy8vIGBgYAov" + + "Ly8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkbWF5YmVyZWYKLy8vICogaHR0cHM6Ly9kb2Nz" + + "LnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwphc20oLT4gMSAwKSBleHRlbmRzIG11dGF0ZXMgZnVuIGxvYWRNYXliZVJlZihzZWxmOiBTbGljZSk6IENl" + + "bGw/IHsgTERPUFRSRUYgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42" + + "LjIuCi8vLwovLy8gU2tpcHMgYENlbGw/YCBmcm9tIHRoZSBgU2xpY2VgLiBTaW1pbGFyIHRvIGRpc2NhcmRpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBgU2xpY2UubG9h" + + "ZE1heWJlUmVmKClgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNraXAgc3VjaCByZWZlcmVuY2UgYENlbGxgIHdoZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhy" + + "b3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDg6IGBDZWxsIG92ZXJmbG93YC4KLy8vCi8vLyBBdHRlbXB0cyB0byBza2lwIG1vcmUgZGF0YSB0aGFuIGBTbGlj" + + "ZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDk6IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1w" + + "bGUoKSB7Ci8vLyAgICAgbGV0IHMxOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZU1heWJlUmVmKGVtcHR5Q2VsbCgpKQovLy8gICAgICAgICAu" + + "c3RvcmVVaW50KDQyLCAzMikKLy8vICAgICAgICAgLmFzU2xpY2UoKTsKLy8vCi8vLyAgICAgczEuc2tpcE1heWJlUmVmKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9" + + "IHMxLmxvYWRVaW50KDMyKTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2Vs" + + "bHMjc2xpY2Vza2lwbWF5YmVyZWYKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwphc20gZXh0ZW5kcyBtdXRhdGVzIGZ1" + + "biBza2lwTWF5YmVSZWYoc2VsZjogU2xpY2UpIHsgTERPUFRSRUYgTklQIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWls" + + "YWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIFByZWxvYWRzIGEgc2luZ2xlIGJpdCBmcm9tIHRoZSBgU2xpY2VgOiBpZiBpdCdzIDEsIHRoZW4gdGhlIHJlZmVy" + + "ZW5jZWQgYENlbGxgIGlzIHByZWxvYWRlZCBhbmQgcmV0dXJuZWQuIElmIHRoZSBwcmVsb2FkZWQgYml0IGlzIDAsIHRoZW4gYG51bGxgIGlzIHJldHVybmVkLiBEb2Vz" + + "bid0IG1vZGlmeSB0aGUgb3JpZ2luYWwgYFNsaWNlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBwcmVsb2FkIHN1Y2ggcmVmZXJlbmNlIGBDZWxsYCB3aGVuIGBTbGljZWAg" + + "ZG9lc24ndCBjb250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA4OiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gcHJl" + + "bG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA5OiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8K" + + "Ly8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlcygpIHsKLy8vICAgICBsZXQgczE6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVNYXliZVJlZihlbXB0eUNlbGwoKSku" + + "YXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBDZWxsID0gczEucHJlbG9hZE1heWJlUmVmKCk7IC8vIHJldHVybnMgZW1wdHlDZWxsKCkgYW5kIGRvZXNuJ3QgbW9k" + + "aWZ5IHMxCi8vLwovLy8gICAgIGxldCBzMjogU2xpY2UgPSBiZWdpbkNlbGwoKQovLy8gICAgICAgICAuc3RvcmVNYXliZVJlZihudWxsKQovLy8gICAgICAgICAuc3Rv" + + "cmVNYXliZVJlZihzMS5hc0NlbGwoKSkKLy8vICAgICAgICAgLmFzU2xpY2UoKTsKLy8vCi8vLyAgICAgbGV0IHJlZjE6IENlbGwgPSBzMi5wcmVsb2FkTWF5YmVSZWYo" + + "KTsgLy8gcmV0dXJucyBudWxsIGFuZCBkb2Vzbid0IG1vZGlmeSBzMgovLy8gICAgIGxldCByZWYyOiBDZWxsID0gczIucHJlbG9hZE1heWJlUmVmKCk7IC8vIHNhbWUg" + + "ZWZmZWN0Ci8vLyAgICAgcmVmMSA9PSBudWxsOyAvLyB0cnVlCi8vLyAgICAgcmVmMSA9PSByZWYyOyAvLyB0cnVlCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8v" + + "LyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlcHJlbG9hZG1heWJlcmVmCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcu" + + "b3JnL2Jvb2svZXhpdC1jb2RlcwovLy8KYXNtIGV4dGVuZHMgZnVuIHByZWxvYWRNYXliZVJlZihzZWxmOiBTbGljZSk6IENlbGw/IHsgUExET1BUUkVGIH0KCi8vLyBF" + + "eHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gTG9hZHMgMCDiiaQgYGxgIOKJpCAxMDIzIGJpdHMgZnJvbSB0aGUg" + + "YFNsaWNlYCBhbmQgcmV0dXJucyB0aGVtIGFzIGEgc2VwYXJhdGUgYFNsaWNlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBzcGVjaWZ5IGFuIG91dC1vZi1ib3VuZHMgYGxg" + + "IHZhbHVlIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDVdOiBgSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIEF0dGVt" + + "cHRzIHRvIGxvYWQgbW9yZSBkYXRhIHRoYW4gdGhlIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGgKLy8vIFtleGl0IGNvZGUgOV06IGBDZWxs" + + "IHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIs" + + "IDcpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogU2xpY2UgPSBzLmxvYWRCaXRzKDcpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczov" + + "L2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWRiaXRzCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2Rl" + + "cwovLy8KLy8vIFtleGl0IGNvZGUgNV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczov" + + "L2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KQG5hbWUobG9hZF9iaXRzKSAvLyBzcGVjaWFsIHRyZWF0bWVudCBpbiBGdW5jIGNvbXBpbGVy" + + "LCBzbyBub3QgcmVwbGFjZWQgd2l0aCBhc20gIkxEU0xJQ0VYIgpleHRlbmRzIG11dGF0ZXMgbmF0aXZlIGxvYWRCaXRzKHNlbGY6IFNsaWNlLCBsOiBJbnQpOiBTbGlj" + + "ZTsKCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gUHJlbG9hZHMgMCDiiaQgYGxgIOKJpCAxMDIzIGJpdHMgZnJvbSB0" + + "aGUgYFNsaWNlYCBhbmQgcmV0dXJucyB0aGVtIGFzIGEgc2VwYXJhdGUgYFNsaWNlYC4KLy8vIERvZXNuJ3QgbW9kaWZ5IHRoZSBvcmlnaW5hbCBgU2xpY2VgLgovLy8K" + + "Ly8vIEF0dGVtcHRzIHRvIHNwZWNpZnkgYW4gb3V0LW9mLWJvdW5kcyBgbGAgdmFsdWUgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGgKLy8vIFtleGl0IGNvZGUgNV06IGBJ" + + "bnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gcHJlbG9hZCBtb3JlIGRhdGEgdGhhbiB0aGUgYFNsaWNlYCBjb250YWlucyB0" + + "aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA5XTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsK" + + "Ly8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZUludCg0MiwgNykuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBTbGljZSA9IHMucHJlbG9h" + + "ZEJpdHMoNyk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlcHJlbG9h" + + "ZGJpdHMKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwovLy8gW2V4aXQgY29kZSA1XTogaHR0cHM6Ly9kb2NzLnRhY3Qt" + + "bGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwpA" + + "bmFtZShwcmVsb2FkX2JpdHMpIC8vIHNwZWNpYWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGlsZXIsIHNvIG5vdCByZXBsYWNlZCB3aXRoIGFzbSAiUExEU0xJQ0VYIgpl" + + "eHRlbmRzIG5hdGl2ZSBwcmVsb2FkQml0cyhzZWxmOiBTbGljZSwgbDogSW50KTogU2xpY2U7CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUg" + + "YFNsaWNlYCB0eXBlLgovLy8KLy8vIExvYWRzIGFuZCByZXR1cm5zIGEgc2lnbmVkIGBsYC1iaXQgYEludGAgZnJvbSB0aGUgYFNsaWNlYCwgZm9yIDAg4omkIGwg4omk" + + "IDI1Ny4KLy8vCi8vLyBBdHRlbXB0cyB0byBzcGVjaWZ5IGFuIG91dC1vZi1ib3VuZHMgYGxgIHZhbHVlIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBj" + + "b2RlIDVdOiBgSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIEF0dGVtcHRzIHRvIGxvYWQgbW9yZSBkYXRhIHRoYW4gdGhlIGBTbGljZWAgY29u" + + "dGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGgKLy8vIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1w" + + "bGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5s" + + "b2FkSW50KDcpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWRp" + + "bnQKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwovLy8gW2V4aXQgY29kZSA1XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFu" + + "Zy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwpAbmFt" + + "ZShsb2FkX2ludCkgLy8gc3BlY2lhbCB0cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJMRElYIgpleHRlbmRzIG11dGF0" + + "ZXMgbmF0aXZlIGxvYWRJbnQoc2VsZjogU2xpY2UsIGw6IEludCk6IEludDsKCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwov" + + "Ly8gUHJlbG9hZHMgYW5kIHJldHVybnMgYSBzaWduZWQgYGxgLWJpdCBgSW50YCBmcm9tIHRoZSBgU2xpY2VgLCBmb3IgMCDiiaQgbCDiiaQgMjU3LgovLy8gRG9lc24n" + + "dCBtb2RpZnkgdGhlIGBTbGljZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBhbiBvdXQtb2YtYm91bmRzIGBsYCB2YWx1ZSB0aHJvdyBhbiBleGNlcHRpb24g" + + "d2l0aAovLy8gW2V4aXQgY29kZSA1XTogYEludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBwcmVsb2FkIG1vcmUgZGF0YSB0" + + "aGFuIHRoZSBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBg" + + "YHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQyLCA3KS5hc1NsaWNlKCk7Ci8vLyAgICAg" + + "bGV0IGZpeno6IEludCA9IHMucHJlbG9hZEludCg3KTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVm" + + "L2NvcmUtY2VsbHMjc2xpY2VwcmVsb2FkaW50Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcwovLy8KLy8vIFtleGl0IGNvZGUg" + + "NV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9i" + + "b29rL2V4aXQtY29kZXMjOQovLy8KQG5hbWUocHJlbG9hZF9pbnQpIC8vIHNwZWNpYWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGlsZXIsIHNvIG5vdCByZXBsYWNlZCB3" + + "aXRoIGFzbSAiUExESVgiCmV4dGVuZHMgbmF0aXZlIHByZWxvYWRJbnQoc2VsZjogU2xpY2UsIGw6IEludCk6IEludDsKCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVu" + + "Y3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gTG9hZHMgYW5kIHJldHVybnMgYW4gdW5zaWduZWQgYGxgLWJpdCBgSW50YCBmcm9tIHRoZSBgU2xpY2Vg" + + "LCBmb3IgMCDiiaQgbCDiiaQgMjU2LgovLy8KLy8vIEF0dGVtcHRzIHRvIHNwZWNpZnkgYW4gb3V0LW9mLWJvdW5kcyBgbGAgdmFsdWUgdGhyb3cgYW4gZXhjZXB0aW9u" + + "IHdpdGgKLy8vIFtleGl0IGNvZGUgNV06IGBJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBtb3JlIGRhdGEgdGhh" + + "biB0aGUgYFNsaWNlYCBjb250YWlucyB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA5XTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0" + + "YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZVVpbnQoNDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBs" + + "ZXQgZml6ejogSW50ID0gcy5sb2FkVWludCg3KTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2Nv" + + "cmUtY2VsbHMjc2xpY2Vsb2FkdWludAovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMKLy8vCi8vLyBbZXhpdCBjb2RlIDVdOiBo" + + "dHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjNQovLy8gW2V4aXQgY29kZSA5XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9l" + + "eGl0LWNvZGVzIzkKLy8vCkBuYW1lKGxvYWRfdWludCkgLy8gc3BlY2lhbCB0cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNt" + + "ICJMRFVYIgpleHRlbmRzIG11dGF0ZXMgbmF0aXZlIGxvYWRVaW50KHNlbGY6IFNsaWNlLCBsOiBJbnQpOiBJbnQ7CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0" + + "aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIFByZWxvYWRzIGFuZCByZXR1cm5zIGFuIHVuc2lnbmVkIGBsYC1iaXQgYEludGAgZnJvbSB0aGUgYFNsaWNlYCwgZm9yIDAg" + + "4omkIGwg4omkIDI1Ni4KLy8vIERvZXNuJ3QgbW9kaWZ5IHRoZSBgU2xpY2VgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNwZWNpZnkgYW4gb3V0LW9mLWJvdW5kcyBgbGAg" + + "dmFsdWUgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGgKLy8vIFtleGl0IGNvZGUgNV06IGBJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZWAuCi8vLwovLy8gQXR0ZW1w" + + "dHMgdG8gcHJlbG9hZCBtb3JlIGRhdGEgdGhhbiB0aGUgYFNsaWNlYCBjb250YWlucyB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA5XTogYENl" + + "bGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZVVpbnQo" + + "NDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5wcmVsb2FkVWludCg3KTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0" + + "cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VwcmVsb2FkdWludAovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4" + + "aXQtY29kZXMKLy8vCi8vLyBbZXhpdCBjb2RlIDVdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjNQovLy8gW2V4aXQgY29kZSA5XTog" + + "aHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCkBuYW1lKHByZWxvYWRfdWludCkgLy8gc3BlY2lhbCB0cmVhdG1lbnQgaW4gRnVu" + + "YyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJQTERVWCIKZXh0ZW5kcyBuYXRpdmUgcHJlbG9hZFVpbnQoc2VsZjogU2xpY2UsIGw6IEludCk6IElu" + + "dDsKCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gTG9hZHMgYSBzaW5nbGUgYml0IGFuZCByZXR1cm5z" + + "IGEgYEJvb2xgIHZhbHVlIGZyb20gdGhlIGBTbGljZWAuCi8vLyBSZWFkcyBgdHJ1ZWAgaWYgdGhlIGxvYWRlZCBiaXQgaXMgZXF1YWwgdG8gMSwgYW5kIHJlYWRzIGBm" + + "YWxzZWAgb3RoZXJ3aXNlLgovLy8KLy8vIEF0dGVtcHRzIHRvIGxvYWQgc3VjaCBgQm9vbGAgd2hlbiB0aGUgYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cg" + + "YW4gZXhjZXB0aW9uIHdpdGgKLy8vIFtleGl0IGNvZGUgOF06IGBDZWxsIG92ZXJmbG93YC4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIHRo" + + "ZSBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QK" + + "Ly8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlQm9vbCh0cnVlKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZp" + + "eno6IEJvb2wgPSBzLmxvYWRCb29sKCk7IC8vIHRydWUKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVm" + + "L2NvcmUtY2VsbHMjc2xpY2Vsb2FkYm9vbAovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMKLy8vCi8vLyBbZXhpdCBjb2RlIDhd" + + "OiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOAovLy8gW2V4aXQgY29kZSA5XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9v" + + "ay9leGl0LWNvZGVzIzkKLy8vCmFzbSgtPiAxIDApIGV4dGVuZHMgbXV0YXRlcyBmdW4gbG9hZEJvb2woc2VsZjogU2xpY2UpOiBCb29sIHsgMSBMREkgfQoKLy8vIEV4" + + "dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjIuCi8vLwovLy8gU2tpcHMgYSBzaW5n" + + "bGUgYml0IGZyb20gdGhlIGBTbGljZWAuIFNpbWlsYXIgdG8gZGlzY2FyZGluZyB0aGUgcmV0dXJuIHZhbHVlIG9mIGBTbGljZS5sb2FkQm9vbCgpYC4KLy8vCi8vLyBB" + + "dHRlbXB0cyB0byBsb2FkIHN1Y2ggYEJvb2xgIHdoZW4gdGhlIGBTbGljZWAgZG9lc24ndCBjb250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhp" + + "dCBjb2RlIDhdOiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBtb3JlIGRhdGEgdGhhbiB0aGUgYFNsaWNlYCBjb250YWlucyB0aHJvdyBh" + + "biBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA5XTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAg" + + "ICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKQovLy8gICAgICAgICAuc3RvcmVCb29sKHRydWUpCi8vLyAgICAgICAgIC5zdG9yZVVpbnQoNDIsIDcpCi8vLyAgICAg" + + "ICAgIC5hc1NsaWNlKCk7Ci8vLwovLy8gICAgIHMuc2tpcEJvb2woKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5sb2FkVWludCg3KTsgLy8gNDIKLy8vIH0KLy8v" + + "IGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vza2lwYm9vbAovLy8gKiBodHRwczovL2Rv" + + "Y3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMKLy8vCi8vLyBbZXhpdCBjb2RlIDhdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29k" + + "ZXMjOAovLy8gW2V4aXQgY29kZSA5XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCmFzbSBleHRlbmRzIG11dGF0ZXMgZnVu" + + "IHNraXBCb29sKHNlbGY6IFNsaWNlKSB7IDEgTERJIE5JUCB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFp" + + "bGFibGUgc2luY2UgVGFjdCAxLjUuMC4KLy8vCi8vLyBBbGlhcyB0byBgU2xpY2UubG9hZEJvb2woKWAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7" + + "Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVCb29sKHRydWUpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogQm9vbCA9IHMubG9hZEJp" + + "dCgpOyAvLyB0cnVlCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlbG9hZGJpdAov" + + "Ly8KYXNtKC0+IDEgMCkgZXh0ZW5kcyBtdXRhdGVzIGZ1biBsb2FkQml0KHNlbGY6IFNsaWNlKTogQm9vbCB7IDEgTERJIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24g" + + "ZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gTG9hZHMgYW5kIHJldHVybnMgYSBzZXJpYWxpemVkIHVuc2lnbmVkIGBJbnRgIHZhbHVlIGluIHRo" + + "ZSByYW5nZSBmcm9tIDAgdG8gMl4xMjAgLSAxIGluY2x1c2l2ZSBmcm9tIHRoZSBgU2xpY2VgLiBUaGlzIHZhbHVlIHVzdWFsbHkgcmVwcmVzZW50cyB0aGUgYW1vdW50" + + "IGluIG5hbm9Ub25jb2lucy4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIHN1Y2ggYEludGAgd2hlbiBgU2xpY2VgIGRvZXNuJ3QgY29udGFpbiBpdCB0aHJvdyBhbiBl" + + "eGNlcHRpb24gd2l0aCBbZXhpdCBjb2RlIDhdOiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNv" + + "bnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUo" + + "KSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVDb2lucyg0MikuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxvYWRD" + + "b2lucygpOyAvLyA0MgovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxv" + + "YWRjb2lucwovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMKLy8vCi8vLyBbZXhpdCBjb2RlIDhdOiBodHRwczovL2RvY3MudGFj" + + "dC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOAovLy8gW2V4aXQgY29kZSA5XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8v" + + "CmFzbSggLT4gMSAwKSBleHRlbmRzIG11dGF0ZXMgZnVuIGxvYWRDb2lucyhzZWxmOiBTbGljZSk6IEludCB7IExEVkFSVUlOVDE2IH0KCi8vLyBFeHRlbnNpb24gbXV0" + + "YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4yLgovLy8KLy8vIFNraXBzIGEgc2VyaWFsaXplZCB1bnNp" + + "Z25lZCBgSW50YCB2YWx1ZSBpbiB0aGUgcmFuZ2UgZnJvbSAwIHRvIDJeMTIwIC0gMSBpbmNsdXNpdmUgZnJvbSB0aGUgYFNsaWNlYC4gU2ltaWxhciB0byBkaXNjYXJk" + + "aW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgYFNsaWNlLmxvYWRDb2lucygpYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBza2lwIHN1Y2ggYEludGAgd2hlbiBgU2xpY2VgIGRv" + + "ZXNuJ3QgY29udGFpbiBpdCB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBbZXhpdCBjb2RlIDhdOiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc2tp" + + "cCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwov" + + "Ly8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkKLy8vICAgICAgICAgLnN0b3JlQ29pbnMoMjM5KQov" + + "Ly8gICAgICAgICAuc3RvcmVVaW50KDQyLCA3KQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8KLy8vICAgICBzLnNraXBDb2lucygpOwovLy8gICAgIGxldCBmaXp6" + + "OiBJbnQgPSBzLmxvYWRVaW50KDcpOyAvLyA0MgovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29y" + + "ZS1jZWxscyNzbGljZXNraXBjb2lucwovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMKLy8vCi8vLyBbZXhpdCBjb2RlIDhdOiBo" + + "dHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOAovLy8gW2V4aXQgY29kZSA5XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9l" + + "eGl0LWNvZGVzIzkKLy8vCmFzbSBleHRlbmRzIG11dGF0ZXMgZnVuIHNraXBDb2lucyhzZWxmOiBTbGljZSkgeyBMRFZBUlVJTlQxNiBOSVAgfQoKLy8vIEV4dGVuc2lv" + + "biBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gQWxpYXMgdG8gYFNsaWNlLmxv" + + "YWRDb2lucygpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZVZhclVpbnQx" + + "Nig0MikuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxvYWRWYXJVaW50MTYoKTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8v" + + "ICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkdmFydWludDE2Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3Jn" + + "L3JlZi9jb3JlLWNlbGxzI3NsaWNlbG9hZGNvaW5zCi8vLwphc20oIC0+IDEgMCkgZXh0ZW5kcyBtdXRhdGVzIGZ1biBsb2FkVmFyVWludDE2KHNlbGY6IFNsaWNlKTog" + + "SW50IHsgTERWQVJVSU5UMTYgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3Qg" + + "MS42LjIuCi8vLwovLy8gQWxpYXMgdG8gYFNsaWNlLnNraXBDb2lucygpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczog" + + "U2xpY2UgPSBiZWdpbkNlbGwoKQovLy8gICAgICAgICAuc3RvcmVWYXJVaW50MTYoMjM5KQovLy8gICAgICAgICAuc3RvcmVVaW50KDQyLCA3KQovLy8gICAgICAgICAu" + + "YXNTbGljZSgpOwovLy8KLy8vICAgICBzLnNraXBWYXJVaW50MTYoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5sb2FkVWludCg3KTsgLy8gNDIKLy8vIH0KLy8v" + + "IGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vza2lwdmFydWludDE2Ci8vLyAqIGh0dHBz" + + "Oi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlc2tpcGNvaW5zCi8vLwphc20gZXh0ZW5kcyBtdXRhdGVzIGZ1biBza2lwVmFyVWludDE2KHNl" + + "bGY6IFNsaWNlKXsgTERWQVJVSU5UMTYgTklQIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBz" + + "aW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIFNpbWlsYXIgdG8gYFNsaWNlLmxvYWRDb2lucygpYCwgYnV0IHdpdGggYSBkaWZmZXJlbnQgYHZhbHVlYCByYW5nZTogZnJv" + + "bSAtMl4xMTkgdG8gMl4xMTkgLSAxIGluY2x1c2l2ZS4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIHN1Y2ggYEludGAgd2hlbiBgU2xpY2VgIGRvZXNuJ3QgY29udGFp" + + "biBpdCB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBbZXhpdCBjb2RlIDhdOiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBtb3JlIGRhdGEg" + + "dGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAov" + + "Ly8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVWYXJJbnQxNigtNDIpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQg" + + "Zml6ejogSW50ID0gcy5sb2FkVmFySW50MTYoKTsgLy8gLTQyCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3Jn" + + "L3JlZi9jb3JlLWNlbGxzI3NsaWNlbG9hZHZhcmludDE2Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcwovLy8KLy8vIFtleGl0" + + "IGNvZGUgOF06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5n" + + "Lm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtKCAtPiAxIDApIGV4dGVuZHMgbXV0YXRlcyBmdW4gbG9hZFZhckludDE2KHNlbGY6IFNsaWNlKTogSW50IHsgTERW" + + "QVJJTlQxNiB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMi4KLy8v" + + "Ci8vLyBTaW1pbGFyIHRvIGBTbGljZS5za2lwQ29pbnMoKWAsIGJ1dCB3aXRoIGEgZGlmZmVyZW50IGB2YWx1ZWAgcmFuZ2U6IGZyb20gLTJeMTE5IHRvIDJeMTE5IC0g" + + "MSBpbmNsdXNpdmUuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc2tpcCBzdWNoIGBJbnRgIHdoZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cgYW4gZXhjZXB0" + + "aW9uIHdpdGggW2V4aXQgY29kZSA4XTogYENlbGwgb3ZlcmZsb3dgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNraXAgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlu" + + "cyB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewov" + + "Ly8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZVZhckludDE2KC0yMzkpCi8vLyAgICAgICAgIC5zdG9yZVVpbnQoNDIsIDcp" + + "Ci8vLyAgICAgICAgIC5hc1NsaWNlKCk7Ci8vLwovLy8gICAgIHMuc2tpcFZhckludDE2KCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMubG9hZFVpbnQoNyk7IC8v" + + "IDQyCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlc2tpcHZhcmludDE2" + + "Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcwovLy8KLy8vIFtleGl0IGNvZGUgOF06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcu" + + "b3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4" + + "dGVuZHMgbXV0YXRlcyBmdW4gc2tpcFZhckludDE2KHNlbGY6IFNsaWNlKSB7IExEVkFSSU5UMTYgTklQIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24g" + + "Zm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIExvYWRzIGFuZCByZXR1cm5zIGEgc2VyaWFsaXplZCB1bnNpZ25l" + + "ZCBgSW50YCB2YWx1ZSBpbiB0aGUgcmFuZ2UgZnJvbSAwIHRvIDJeMjQ4IOKIkiAxIGluY2x1c2l2ZSBmcm9tIHRoZSBgU2xpY2VgLgovLy8KLy8vIEF0dGVtcHRzIHRv" + + "IGxvYWQgc3VjaCBgSW50YCB3aGVuIGBTbGljZWAgZG9lc24ndCBjb250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgOF06IGBDZWxsIG92" + + "ZXJmbG93YC4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggW2V4aXQg" + + "Y29kZSA5XTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwo" + + "KS5zdG9yZVZhclVpbnQzMig0MjAwMDApLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5sb2FkVmFyVWludDMyKCk7IC8vIDQyMDAwMAovLy8gfQov" + + "Ly8gYGBgCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWR2YXJ1aW50MzIKLy8vICogaHR0" + + "cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwovLy8gW2V4aXQgY29kZSA4XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9l" + + "eGl0LWNvZGVzIzgKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwphc20oIC0+IDEgMCkgZXh0" + + "ZW5kcyBtdXRhdGVzIGZ1biBsb2FkVmFyVWludDMyKHNlbGY6IFNsaWNlKTogSW50IHsgTERWQVJVSU5UMzIgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlv" + "biBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjIuCi8vLwovLy8gU2tpcHMgYSBzZXJpYWxpemVkIHVuc2lnbmVkIGBJbnRgIHZh" + - "bHVlIGluIHRoZSByYW5nZSBmcm9tIDAgdG8gMl4xMjAgLSAxIGluY2x1c2l2ZSBmcm9tIHRoZSBgU2xpY2VgLiBTaW1pbGFyIHRvIGRpc2NhcmRpbmcgdGhlIHJldHVy" + - "biB2YWx1ZSBvZiBgU2xpY2UubG9hZENvaW5zKClgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNraXAgc3VjaCBgSW50YCB3aGVuIGBTbGljZWAgZG9lc24ndCBjb250YWlu" + - "IGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA4OiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc2tpcCBtb3JlIGRhdGEgdGhh" + - "biBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA5OiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1" + - "biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZUNvaW5zKDIzOSkKLy8vICAgICAgICAgLnN0b3Jl" + - "VWludCg0MiwgNykKLy8vICAgICAgICAgLmFzU2xpY2UoKTsKLy8vCi8vLyAgICAgcy5za2lwQ29pbnMoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5sb2FkVWlu" + - "dCg3KTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkY29pbnMK" + - "Ly8vCmFzbSBleHRlbmRzIG11dGF0ZXMgZnVuIHNraXBDb2lucyhzZWxmOiBTbGljZSkgeyBMRFZBUlVJTlQxNiBOSVAgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBm" + - "dW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gQWxpYXMgdG8gYFNsaWNlLmxvYWRDb2lucygpYC4K" + - "Ly8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZVZhclVpbnQxNig0MikuYXNTbGlj" + - "ZSgpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxvYWRWYXJVaW50MTYoKTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9k" + - "b2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkdmFydWludDE2Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNl" + - "bGxzI3NsaWNlbG9hZGNvaW5zCi8vLwphc20oIC0+IDEgMCkgZXh0ZW5kcyBtdXRhdGVzIGZ1biBsb2FkVmFyVWludDE2KHNlbGY6IFNsaWNlKTogSW50IHsgTERWQVJV" + - "SU5UMTYgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjIuCi8vLwov" + - "Ly8gQWxpYXMgdG8gYFNsaWNlLnNraXBDb2lucygpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdp" + - "bkNlbGwoKQovLy8gICAgICAgICAuc3RvcmVWYXJVaW50MTYoMjM5KQovLy8gICAgICAgICAuc3RvcmVVaW50KDQyLCA3KQovLy8gICAgICAgICAuYXNTbGljZSgpOwov" + - "Ly8KLy8vICAgICBzLnNraXBWYXJVaW50MTYoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5sb2FkVWludCg3KTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8v" + - "IFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkdmFydWludDE2Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0" + - "LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlbG9hZGNvaW5zCi8vLwphc20gZXh0ZW5kcyBtdXRhdGVzIGZ1biBza2lwVmFyVWludDE2KHNlbGY6IFNsaWNlKXsg" + - "TERWQVJVSU5UMTYgTklQIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEu" + - "Ni4wLgovLy8KLy8vIFNpbWlsYXIgdG8gYFNsaWNlLmxvYWRDb2lucygpYCwgYnV0IHdpdGggYSBkaWZmZXJlbnQgYHZhbHVlYCByYW5nZTogZnJvbSAtMl4xMTkgdG8g" + - "Ml4xMTkgLSAxIGluY2x1c2l2ZS4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIHN1Y2ggYEludGAgd2hlbiBgU2xpY2VgIGRvZXNuJ3QgY29udGFpbiBpdCB0aHJvdyBh" + - "biBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgODogYENlbGwgb3ZlcmZsb3dgLgovLy8KLy8vIEF0dGVtcHRzIHRvIGxvYWQgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBj" + - "b250YWlucyB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgOTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgp" + - "IHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZVZhckludDE2KC00MikuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxv" + - "YWRWYXJJbnQxNigpOyAvLyAtNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vs" + - "b2FkdmFyaW50MTYKLy8vCmFzbSggLT4gMSAwKSBleHRlbmRzIG11dGF0ZXMgZnVuIGxvYWRWYXJJbnQxNihzZWxmOiBTbGljZSk6IEludCB7IExEVkFSSU5UMTYgfQoK" + - "Ly8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjIuCi8vLwovLy8gU2ltaWxh" + - "ciB0byBgU2xpY2Uuc2tpcENvaW5zKClgLCBidXQgd2l0aCBhIGRpZmZlcmVudCBgdmFsdWVgIHJhbmdlOiBmcm9tIC0yXjExOSB0byAyXjExOSAtIDEgaW5jbHVzaXZl" + - "LgovLy8KLy8vIEF0dGVtcHRzIHRvIHNraXAgc3VjaCBgSW50YCB3aGVuIGBTbGljZWAgZG9lc24ndCBjb250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4" + - "aXQgY29kZSA4OiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc2tpcCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4" + - "Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA5OiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBT" + - "bGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZVZhckludDE2KC0yMzkpCi8vLyAgICAgICAgIC5zdG9yZVVpbnQoNDIsIDcpCi8vLyAgICAgICAgIC5h" + - "c1NsaWNlKCk7Ci8vLwovLy8gICAgIHMuc2tpcFZhckludDE2KCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMubG9hZFVpbnQoNyk7IC8vIDQyCi8vLyB9Ci8vLyBg" + - "YGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlbG9hZHZhcmludDE2Ci8vLwphc20gZXh0ZW5kcyBtdXRh" + - "dGVzIGZ1biBza2lwVmFySW50MTYoc2VsZjogU2xpY2UpIHsgTERWQVJJTlQxNiBOSVAgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBT" + - "bGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gTG9hZHMgYW5kIHJldHVybnMgYSBzZXJpYWxpemVkIHVuc2lnbmVkIGBJbnRgIHZh" + - "bHVlIGluIHRoZSByYW5nZSBmcm9tIDAgdG8gMl4yNDgg4oiSIDEgaW5jbHVzaXZlIGZyb20gdGhlIGBTbGljZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBzdWNo" + - "IGBJbnRgIHdoZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDg6IGBDZWxsIG92ZXJmbG93YC4KLy8v" + - "Ci8vLyBBdHRlbXB0cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDk6IGBDZWxs" + - "IHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVWYXJVaW50" + - "MzIoNDIwMDAwKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMubG9hZFZhclVpbnQzMigpOyAvLyA0MjAwMDAKLy8vIH0KLy8vIGBgYAovLy8KLy8v" + - "IFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkdmFydWludDMyCi8vLwphc20oIC0+IDEgMCkgZXh0ZW5kcyBtdXRh" + - "dGVzIGZ1biBsb2FkVmFyVWludDMyKHNlbGY6IFNsaWNlKTogSW50IHsgTERWQVJVSU5UMzIgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhl" + - "IGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjIuCi8vLwovLy8gU2tpcHMgYSBzZXJpYWxpemVkIHVuc2lnbmVkIGBJbnRgIHZhbHVlIGluIHRo" + - "ZSByYW5nZSBmcm9tIDAgdG8gMl4yNDgg4oiSIDEgaW5jbHVzaXZlIGZyb20gdGhlIGBTbGljZWAuIFNpbWlsYXIgdG8gZGlzY2FyZGluZyB0aGUgcmV0dXJuIHZhbHVl" + - "IG9mIGBTbGljZS5sb2FkVmFyVWludDMyKClgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNraXAgc3VjaCBgSW50YCB3aGVuIGBTbGljZWAgZG9lc24ndCBjb250YWluIGl0" + - "IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA4OiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc2tpcCBtb3JlIGRhdGEgdGhhbiBg" + - "U2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA5OiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBl" + - "eGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZVZhclVpbnQzMigyMzkpCi8vLyAgICAgICAgIC5zdG9y" + - "ZVVpbnQoNDIsIDcpCi8vLyAgICAgICAgIC5hc1NsaWNlKCk7Ci8vLwovLy8gICAgIHMuc2tpcFZhclVpbnQzMigpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxv" + - "YWRVaW50KDcpOyAvLyA0MgovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWR2" + - "YXJ1aW50MzIKLy8vCmFzbSBleHRlbmRzIG11dGF0ZXMgZnVuIHNraXBWYXJVaW50MzIoc2VsZjogU2xpY2UpIHsgTERWQVJVSU5UMzIgTklQIH0KCi8vLyBFeHRlbnNp" + - "b24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIFNpbWlsYXIgdG8gYFNsaWNl" + - "LmxvYWRWYXJVaW50MzIoKWAsIGJ1dCB3aXRoIGEgZGlmZmVyZW50IGB2YWx1ZWAgcmFuZ2U6IGZyb20gLTJeMjQ3IHRvIDJeMjQ3IC0gMSBpbmNsdXNpdmUuCi8vLwov" + - "Ly8gQXR0ZW1wdHMgdG8gbG9hZCBzdWNoIGBJbnRgIHdoZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2Rl" + - "IDg6IGBDZWxsIG92ZXJmbG93YC4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9u" + - "IHdpdGggZXhpdCBjb2RlIDk6IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0g" + - "YmVnaW5DZWxsKCkuc3RvcmVWYXJJbnQzMigtNDIwMDAwKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMubG9hZFZhckludDMyKCk7IC8vIC00MjAw" + - "MDAKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkdmFyaW50MzIKLy8vCmFz" + - "bSggLT4gMSAwKSBleHRlbmRzIG11dGF0ZXMgZnVuIGxvYWRWYXJJbnQzMihzZWxmOiBTbGljZSk6IEludCB7IExEVkFSSU5UMzIgfQoKLy8vIEV4dGVuc2lvbiBtdXRh" + - "dGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjIuCi8vLwovLy8gU2ltaWxhciB0byBgU2xpY2Uuc2tpcFZh" + - "clVpbnQzMigpYCwgYnV0IHdpdGggYSBkaWZmZXJlbnQgYHZhbHVlYCByYW5nZTogZnJvbSAtMl4yNDcgdG8gMl4yNDcgLSAxIGluY2x1c2l2ZS4KLy8vCi8vLyBBdHRl" + - "bXB0cyB0byBza2lwIHN1Y2ggYEludGAgd2hlbiBgU2xpY2VgIGRvZXNuJ3QgY29udGFpbiBpdCB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgODogYENl" + - "bGwgb3ZlcmZsb3dgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNraXAgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucyB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBl" + - "eGl0IGNvZGUgOTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNl" + - "bGwoKQovLy8gICAgICAgICAuc3RvcmVWYXJJbnQzMigtMjM5KQovLy8gICAgICAgICAuc3RvcmVVaW50KDQyLCA3KQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8K" + - "Ly8vICAgICBzLnNraXBWYXJJbnQzMigpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxvYWRVaW50KDcpOyAvLyA0MgovLy8gfQovLy8gYGBgCi8vLwovLy8gU2Vl" + - "OiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWR2YXJ1aW50MzIKLy8vCmFzbSBleHRlbmRzIG11dGF0ZXMgZnVuIHNraXBW" + - "YXJJbnQzMihzZWxmOiBTbGljZSkgeyBMRFZBUklOVDMyIE5JUCB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgov" + - "Ly8KLy8vIExvYWRzIGFsbCBidXQgdGhlIGZpcnN0IDAg4omkIGBsYCDiiaQgMTAyMyBiaXRzIGZyb20gdGhlIGBTbGljZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc3Bl" + - "Y2lmeSBhbiBvdXQtb2YtYm91bmRzIGBsYCB2YWx1ZSB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA1XTogYEludGVnZXIgb3V0IG9mIGV4cGVj" + - "dGVkIHJhbmdlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIHRoZSBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRo" + - "Ci8vLyBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9" + - "IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQyLCA3KS5hc1NsaWNlKCk7Ci8vLyAgICAgcy5za2lwQml0cyg1KTsgICAgICAgICAgICAgICAgICAgLy8gYWxsIGJ1dCBmaXJz" + - "dCA1IGJpdHMKLy8vICAgICBsZXQgZml6ejogU2xpY2UgPSBzLmxvYWRCaXRzKDEpOyAvLyBsb2FkIG9ubHkgMSBiaXQKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTog" + - "aHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vza2lwYml0cwovLy8KLy8vIFtleGl0IGNvZGUgNV06IGh0dHBzOi8vZG9jcy50YWN0" + - "LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8K" + - "YXNtIGV4dGVuZHMgbXV0YXRlcyBmdW4gc2tpcEJpdHMoc2VsZjogU2xpY2UsIGw6IEludCkgeyBTRFNLSVBGSVJTVCB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZv" + - "ciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIENoZWNrcyB3aGV0aGVyIHRoZSBgU2xpY2VgIGlzIGVtcHR5IChpLmUuLCBjb250YWlucyBubyBiaXRzIG9mIGRhdGEg" + - "YW5kIG5vIGNlbGwgcmVmZXJlbmNlcykuCi8vLyBJZiBpdCBpcyBub3QsIGl0IHRocm93cyBhbiBleGNlcHRpb24gd2l0aCBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRl" + - "cmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBlbXB0eU9uZTogU2xpY2UgPSBlbXB0eVNsaWNlKCk7Ci8vLyAgICAg" + - "ZW1wdHlPbmUuZW5kUGFyc2UoKTsgLy8gbm90aGluZywgYXMgaXQncyBlbXB0eQovLy8KLy8vICAgICBsZXQgcGF1bDogU2xpY2UgPSAiRmVhciBpcyB0aGUgbWluZC1r" + - "aWxsZXIiLmFzU2xpY2UoKTsKLy8vICAgICB0cnkgewovLy8gICAgICAgICBwYXVsLmVuZFBhcnNlKCk7IC8vIHRocm93cyBleGl0IGNvZGUgOQovLy8gICAgIH0KLy8v" + - "IH0KLy8vIGBgYAovLy8KLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwphc20gZXh0ZW5kcyBm" + - "dW4gZW5kUGFyc2Uoc2VsZjogU2xpY2UpIHsgRU5EUyB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2Ug" + - "VGFjdCAxLjYuMC4KLy8vCi8vLyBQcmVsb2FkcyBhbGwgYnV0IHRoZSBsYXN0IDAg4omkIGBsZW5gIOKJpCAxMDIzIGJpdHMgZnJvbSB0aGUgYFNsaWNlYC4KLy8vCi8v" + - "LyBBdHRlbXB0cyB0byBzcGVjaWZ5IGFuIG91dC1vZi1ib3VuZHMgYGxlbmAgdmFsdWUgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDU6IGBJbnRlZ2Vy" + - "IG91dCBvZiBleHBlY3RlZCByYW5nZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gcHJlbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4" + - "Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA5OiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBT" + - "bGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQyLCA3KS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGFsbEJ1dExhc3RGaXZlOiBTbGljZSA9IHMuc2tpcExhc3RCaXRz" + - "KDUpOyAvLyBhbGwgYnV0IGxhc3QgNSBiaXRzLAovLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaS5lLiBvbmx5" + - "IGZpcnN0IDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vza2lwbGFzdGJpdHMK" + - "Ly8vCmFzbSBleHRlbmRzIGZ1biBza2lwTGFzdEJpdHMoc2VsZjogU2xpY2UsIGxlbjogSW50KTogU2xpY2UgeyBTRFNLSVBMQVNUIH0KCi8vLyBFeHRlbnNpb24gZnVu" + - "Y3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIFByZWxvYWRzIHRoZSBmaXJzdCAwIOKJpCBgbGVuYCDi" + - "iaQgMTAyMyBiaXRzIGZyb20gdGhlIGBTbGljZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBhbiBvdXQtb2YtYm91bmRzIGBsZW5gIHZhbHVlIHRocm93IGFu" + - "IGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA1OiBgSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHByZWxvYWQgbW9yZSBk" + - "YXRhIHRoYW4gYFNsaWNlYCBjb250YWlucyB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgOTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0YWN0" + - "Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZUludCg0MiwgNykuYXNTbGljZSgpOwovLy8gICAgIGxldCBm" + - "aXJzdEZpdmU6IFNsaWNlID0gcy5maXJzdEJpdHMoNSk7IC8vIGZpcnN0IDUgYml0cwovLy8gfQovLy8gYGBgCi8vLwovLy8gSW4gb3JkZXIgdG8gcmVkdWNlIGdhcyB1" + - "c2FnZSwgcHJlZmVyIGNhbGxpbmcgYFNsaWNlLnByZWxvYWRCaXRzKClgIG92ZXIgdXNpbmcgdGhpcyBmdW5jdGlvbiBzaW5jZSB0aGUgZm9ybWVyIGlzIG1vcmUgb3B0" + - "aW1pemVkLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VmaXJzdGJpdHMKLy8vICogaHR0cHM6" + - "Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VwcmVsb2FkYml0cwovLy8KYXNtIGV4dGVuZHMgZnVuIGZpcnN0Qml0cyhzZWxmOiBTbGljZSwg" + - "bGVuOiBJbnQpOiBTbGljZSB7IFNEQ1VURklSU1QgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRh" + - "Y3QgMS42LjAuCi8vLwovLy8gUHJlbG9hZHMgdGhlIGxhc3QgMCDiiaQgYGxlbmAg4omkIDEwMjMgYml0cyBmcm9tIHRoZSBgU2xpY2VgLgovLy8KLy8vIEF0dGVtcHRz" + - "IHRvIHNwZWNpZnkgYW4gb3V0LW9mLWJvdW5kcyBgbGVuYCB2YWx1ZSB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgNTogYEludGVnZXIgb3V0IG9mIGV4" + - "cGVjdGVkIHJhbmdlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBwcmVsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdp" + - "dGggZXhpdCBjb2RlIDk6IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVn" + - "aW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgbGFzdEZpdmU6IFNsaWNlID0gcy5sYXN0Qml0cyg1KTsgLy8gbGFzdCA1IGJpdHMK" + - "Ly8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VsYXN0Yml0cwovLy8KYXNtIGV4dGVu" + - "ZHMgZnVuIGxhc3RCaXRzKHNlbGY6IFNsaWNlLCBsZW46IEludCk6IFNsaWNlIHsgU0RDVVRMQVNUIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xp" + - "Y2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBgSW50YCBkZXB0aCBvZiB0aGUgYFNsaWNl" + - "YC4gUHJvZHVjZXMgMCBpZiB0aGUgYFNsaWNlYCBoYXMgbm8gcmVmZXJlbmNlcywgb3RoZXJ3aXNlIDEgcGx1cyB0aGUgbWF4aW11bSBvZiB0aGUgZGVwdGhzIG9mIHRo" + - "ZSByZWZlcmVuY2VkIGNlbGxzLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3Jl" + - "SW50KDQyLCA3KS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGRlcHRoOiBJbnQgPSBzLmRlcHRoKCk7IC8vIDAKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6" + - "Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VkZXB0aAovLy8KYXNtIGV4dGVuZHMgZnVuIGRlcHRoKHNlbGY6IFNsaWNlKTogSW50IHsgU0RF" + - "UFRIIH0KCi8vCi8vIFNsaWNlIHNpemUKLy8KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gUmV0dXJucyB0aGUgbnVt" + - "YmVyIG9mIHJlZmVyZW5jZXMgaW4gdGhlIGBTbGljZWAgYXMgYW4gYEludGAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6" + - "IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVSZWYoZW1wdHlDZWxsKCkpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5yZWZzKCk7Ci8vLyB9Ci8v" + - "LyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlcmVmcwovLy8KYXNtIGV4dGVuZHMgZnVuIHJlZnMo" + - "c2VsZjogU2xpY2UpOiBJbnQgeyBTUkVGUyB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIFJldHVybnMgdGhlIG51" + - "bWJlciBvZiBkYXRhIGJpdHMgaW4gdGhlIGBTbGljZWAgYXMgYW4gYEludGAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6" + - "IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVSZWYoZW1wdHlDZWxsKCkpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5iaXRzKCk7Ci8vLyB9Ci8v" + - "LyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlYml0cwovLy8KYXNtIGV4dGVuZHMgZnVuIGJpdHMo" + - "c2VsZjogU2xpY2UpOiBJbnQgeyBTQklUUyB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIENoZWNrcyB3aGV0aGVy" + - "IHRoZSBgU2xpY2VgIGlzIGVtcHR5IChpLmUuLCBjb250YWlucyBubyBiaXRzIG9mIGRhdGEgYW5kIG5vIGNlbGwgcmVmZXJlbmNlcykuCi8vLyBSZXR1cm5zIGB0cnVl" + - "YCBpZiBpdCBpcyBlbXB0eSwgYGZhbHNlYCBvdGhlcndpc2UuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0g" + - "YmVnaW5DZWxsKCkuc3RvcmVSZWYoZW1wdHlDZWxsKCkpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogQm9vbCA9IHMuZW1wdHkoKTsgICAgICAgICAgICAgICAg" + - "ICAgICAvLyBmYWxzZQovLy8gICAgIGxldCBidXp6OiBCb29sID0gYmVnaW5DZWxsKCkuYXNTbGljZSgpLmVtcHR5KCk7IC8vIHRydWUKLy8vIH0KLy8vIGBgYAovLy8K" + - "Ly8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VlbXB0eQovLy8KYXNtIGV4dGVuZHMgZnVuIGVtcHR5KHNlbGY6IFNs" + - "aWNlKTogQm9vbCB7IFNFTVBUWSB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIENoZWNrcyB3aGV0aGVyIHRoZSBg" + - "U2xpY2VgIGhhcyBubyBiaXRzIG9mIGRhdGEuCi8vLyBSZXR1cm5zIGB0cnVlYCBpZiBpdCBoYXMgbm8gZGF0YSwgYGZhbHNlYCBvdGhlcndpc2UuCi8vLwovLy8gYGBg" + - "dGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVSZWYoZW1wdHlDZWxsKCkpLmFzU2xpY2UoKTsKLy8v" + - "ICAgICBsZXQgZml6ejogQm9vbCA9IHMuZGF0YUVtcHR5KCk7ICAvLyB0cnVlCi8vLwovLy8gICAgIGxldCBzMjogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZUludCg0" + - "MiwgNykuYXNTbGljZSgpOwovLy8gICAgIGxldCBidXp6OiBCb29sID0gczIuZGF0YUVtcHR5KCk7IC8vIGZhbHNlCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0" + - "dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlZGF0YWVtcHR5Ci8vLwphc20gZXh0ZW5kcyBmdW4gZGF0YUVtcHR5KHNlbGY6IFNsaWNl" + - "KTogQm9vbCB7IFNERU1QVFkgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBDaGVja3Mgd2hldGhlciB0aGUgYFNs" + - "aWNlYCBoYXMgbm8gcmVmZXJlbmNlcy4KLy8vIFJldHVybnMgYHRydWVgIGlmIGl0IGhhcyBubyByZWZlcmVuY2VzLCBgZmFsc2VgIG90aGVyd2lzZS4KLy8vCi8vLyBg" + - "YGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZVJlZihlbXB0eUNlbGwoKSkuYXNTbGljZSgpOwov" + - "Ly8gICAgIGxldCBmaXp6OiBCb29sID0gcy5yZWZzRW1wdHkoKTsgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZQovLy8gICAgIGxldCBidXp6OiBCb29sID0gYmVn" + - "aW5DZWxsKCkuYXNTbGljZSgpLnJlZnNFbXB0eSgpOyAvLyB0cnVlCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3Jl" + - "Zi9jb3JlLWNlbGxzI3NsaWNlcmVmc2VtcHR5Ci8vLwphc20gZXh0ZW5kcyBmdW4gcmVmc0VtcHR5KHNlbGY6IFNsaWNlKTogQm9vbCB7IFNSRU1QVFkgfQoKLy8KLy8g" + - "Q29udmVyc2lvbnMKLy8KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgQnVpbGRlcmAgdHlwZS4KLy8vCi8vLyBDb252ZXJ0cyB0aGUgYEJ1aWxkZXJgIGlu" + - "dG8gYSBgU2xpY2VgIGFuZCByZXR1cm5zIGl0LgovLy8gQW4gYWxpYXMgdG8gYHNlbGYuZW5kQ2VsbCgpLmJlZ2luUGFyc2UoKWAuCi8vLwovLy8gYGBgdGFjdAovLy8g" + - "ZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGI6IEJ1aWxkZXIgPSBiZWdpbkNlbGwoKTsKLy8vICAgICBsZXQgZml6ejogU2xpY2UgPSBiLmFzU2xpY2UoKTsKLy8v" + - "IH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjYnVpbGRlcmFzc2xpY2UKLy8vCmlubGluZSBleHRl" + - "bmRzIGZ1biBhc1NsaWNlKHNlbGY6IEJ1aWxkZXIpOiBTbGljZSB7CiAgICByZXR1cm4gc2VsZi5lbmRDZWxsKCkuYmVnaW5QYXJzZSgpOwp9CgovLy8gRXh0ZW5zaW9u" + - "IGZ1bmN0aW9uIGZvciB0aGUgYENlbGxgIHR5cGUuCi8vLwovLy8gQ29udmVydHMgdGhlIGBDZWxsYCB0byBhIGBTbGljZWAgYW5kIHJldHVybnMgaXQuCi8vLyBBbiBh" + - "bGlhcyB0byBgc2VsZi5iZWdpblBhcnNlKClgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBjOiBDZWxsID0gZW1wdHlDZWxs" + - "KCk7Ci8vLyAgICAgbGV0IGZpeno6IFNsaWNlID0gYy5hc1NsaWNlKCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3Jn" + - "L3JlZi9jb3JlLWNlbGxzI2NlbGxhc3NsaWNlCi8vLwppbmxpbmUgZXh0ZW5kcyBmdW4gYXNTbGljZShzZWxmOiBDZWxsKTogU2xpY2UgewogICAgcmV0dXJuIHNlbGYu" + - "YmVnaW5QYXJzZSgpOwp9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIENvbnZlcnRzIHRoZSBgU2xpY2VgIHRvIGEg" + - "YENlbGxgIGFuZCByZXR1cm5zIGl0LgovLy8gQW4gYWxpYXMgdG8gYGJlZ2luQ2VsbCgpLnN0b3JlU2xpY2Uoc2VsZikuZW5kQ2VsbCgpYC4KLy8vCi8vLyBOT1RFOiAq" + - "KkdhcyBleHBlbnNpdmUhKiogVGhpcyBmdW5jdGlvbiB1c2VzIDUwMCBnYXMgdW5pdHMgb3IgbW9yZS4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsK" + - "Ly8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IENlbGwgPSBzLmFzQ2VsbCgpOwovLy8gICAgIGxldCBi" + - "dXp6OiBDZWxsID0gYmVnaW5DZWxsKCkuc3RvcmVTbGljZShzKS5lbmRDZWxsKCk7Ci8vLwovLy8gICAgIGZpenogPT0gYnV6ejsgLy8gdHJ1ZQovLy8gfQovLy8gYGBg" + - "Ci8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWFzY2VsbAovLy8KaW5saW5lIGV4dGVuZHMgZnVuIGFzQ2Vs" + - "bChzZWxmOiBTbGljZSk6IENlbGwgewogICAgcmV0dXJuIGJlZ2luQ2VsbCgpCiAgICAgICAgLnN0b3JlU2xpY2Uoc2VsZikKICAgICAgICAuZW5kQ2VsbCgpOwp9Cgov" + - "Ly8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYEJ1aWxkZXJgIHR5cGUuCi8vLwovLy8gQ29udmVydHMgdGhlIGBCdWlsZGVyYCBpbnRvIGEgYENlbGxgIGFuZCBy" + - "ZXR1cm5zIGl0LgovLy8gQW4gYWxpYXMgdG8gYHNlbGYuZW5kQ2VsbCgpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYjog" + - "QnVpbGRlciA9IGJlZ2luQ2VsbCgpOwovLy8gICAgIGxldCBmaXp6OiBDZWxsID0gYi5hc0NlbGwoKTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9k" + - "b2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjYnVpbGRlcmFzY2VsbAovLy8KaW5saW5lIGV4dGVuZHMgZnVuIGFzQ2VsbChzZWxmOiBCdWlsZGVyKTogQ2Vs" + - "bCB7CiAgICByZXR1cm4gc2VsZi5lbmRDZWxsKCk7Cn0KCi8vLyBDcmVhdGVzIGFuZCByZXR1cm5zIGFuIGVtcHR5IGBDZWxsYCAod2l0aG91dCBkYXRhIGFuZCByZWZl" + - "cmVuY2VzKS4KLy8vIEFuIGFsaWFzIHRvIGBiZWdpbkNlbGwoKS5lbmRDZWxsKClgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxl" + - "dCBmaXp6OiBDZWxsID0gZW1wdHlDZWxsKCk7Ci8vLyAgICAgbGV0IGJ1eno6IENlbGwgPSBiZWdpbkNlbGwoKS5lbmRDZWxsKCk7Ci8vLwovLy8gICAgIGZpenogPT0g" + - "YnV6ejsgLy8gdHJ1ZQovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNlbXB0eWNlbGwKLy8v" + - "CmFzbSBmdW4gZW1wdHlDZWxsKCk6IENlbGwgewogICAgPGIgYj4gUFVTSFJFRiAvLyBQdXJlIEZpZnQ6ICI8YiIgY3JlYXRlcyBhIGJ1aWxkZXIsICJiPiIgdHVybnMg" + - "aXQgaW50byBhIGNlbGwgYXQgY29tcGlsZSB0aW1lCn0KCi8vLyBDcmVhdGVzIGFuZCByZXR1cm5zIGFuIGVtcHR5IGBTbGljZWAgKHdpdGhvdXQgZGF0YSBhbmQgcmVm" + - "ZXJlbmNlcykuCi8vLyBBbiBhbGlhcyB0byBgZW1wdHlDZWxsKCkuYXNTbGljZSgpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBs" + - "ZXQgZml6ejogU2xpY2UgPSBlbXB0eVNsaWNlKCk7Ci8vLyAgICAgbGV0IGJ1eno6IFNsaWNlID0gZW1wdHlDZWxsKCkuYXNTbGljZSgpOwovLy8KLy8vICAgICBmaXp6" + - "ID09IGJ1eno7IC8vIHRydWUKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjZW1wdHlzbGlj" + - "ZQovLy8KYXNtIGZ1biBlbXB0eVNsaWNlKCk6IFNsaWNlIHsKICAgIGJ7fSBQVVNIU0xJQ0UKfQoKLy8vIFN0cnVjdCBmb3IgaG9sZGluZyB2YWx1ZXMgY29tcHV0ZWQg" + - "YnkgdGhlIGBDZWxsLmNvbXB1dGVEYXRhU2l6ZSgpYCBhbmQgYFNsaWNlLmNvbXB1dGVEYXRhU2l6ZSgpYCBleHRlbnNpb24gZnVuY3Rpb25zLiBBdmFpbGFibGUgc2lu" + - "Y2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2NlbGxjb21wdXRlZGF0YXNpemUK" + - "Ly8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vjb21wdXRlZGF0YXNpemUKLy8vCnN0cnVjdCBEYXRhU2l6ZSB7CiAgICAv" + - "Ly8gVGhlIHRvdGFsIG51bWJlciBvZiBuZXN0ZWQgY2VsbHMsIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcgb25lLgogICAgY2VsbHM6IEludDsKCiAgICAvLy8gVGhlIHRv" + - "dGFsIG51bWJlciBvZiBiaXRzIGluIGFsbCBuZXN0ZWQgY2VsbHMsIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcgb25lLgogICAgYml0czogSW50OwoKICAgIC8vLyBUaGUg" + - "dG90YWwgbnVtYmVyIG9mIHJlZnMgaW4gYWxsIG5lc3RlZCBjZWxscywgaW5jbHVkaW5nIHRoZSBzdGFydGluZyBvbmUuCiAgICByZWZzOiBJbnQ7Cn0KCi8vLyBFeHRl" + - "bnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgQ2VsbGAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhl" + - "IG51bWJlciBvZiBkaXN0aW5jdCBjZWxscywgYml0cyBhbmQgcmVmcyBpbiB0aGUgYENlbGxgIGJ5IHVzaW5nIGEgZGVwdGgtZmlyc3Qgc2VhcmNoIChERlMpIGFsZ29y" + - "aXRobSwgcmVjdXJzaXZlbHkgdHJhdmVyc2luZyBlYWNoIHJlZmVyZW5jZWQgY2VsbC4gVGhpcyBmdW5jdGlvbiBpcyBjb21wdXRhdGlvbmFsbHkgZXhwZW5zaXZlIGFu" + - "ZCBjYW4gY29uc3VtZSBhIGxvdCBvZiBnYXMuIElmIGBzZWxmYCBpcyBgbnVsbGAsIHJldHVybnMgYERhdGFTaXplYCB3aXRoIGFsbCBmaWVsZHMgc2V0IHRvIDAuCi8v" + - "LwovLy8gVGhlIHJlc3VsdHMgYXJlIHBhY2tlZCBpbnRvIGEgYERhdGFTaXplYCBTdHJ1Y3QgY29uc2lzdGluZyBvZjoKLy8vICogYGNlbGxzOiBJbnRgLCB0aGUgdG90" + - "YWwgbnVtYmVyIG9mIG5lc3RlZCBjZWxscywgaW5jbHVkaW5nIHRoZSBzdGFydGluZyBvbmUKLy8vICogYGJpdHM6IEludGAsIHRoZSB0b3RhbCBudW1iZXIgb2YgYml0" + - "cyBpbiBhbGwgbmVzdGVkIGNlbGxzLCBpbmNsdWRpbmcgdGhlIHN0YXJ0aW5nIG9uZQovLy8gKiBgcmVmczogSW50YCwgdGhlIHRvdGFsIG51bWJlciBvZiByZWZzIGlu" + - "IGFsbCBuZXN0ZWQgY2VsbHMsIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcgb25lCi8vLwovLy8gSWYgdGhlIHNwZWNpZmllZCBgbWF4Q2VsbHNgIHZhbHVlIGlzbid0IGVu" + - "b3VnaCB0byB0cmF2ZXJzZSBhbGwgY2VsbHMgaW5jbHVkaW5nIHRoZSBzdGFydGluZyBvbmUsIGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA4IGlzIHRocm93bjog" + - "YENlbGwgb3ZlcmZsb3dgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNwZWNpZnkgYSBuZWdhdGl2ZSB2YWx1ZSBvZiBgbWF4Q2VsbHNgIHRocm93IGFuIGV4Y2VwdGlvbiB3" + - "aXRoIGV4aXQgY29kZSA1OiBgSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxl" + - "dCBjOiBDZWxsID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLnN0b3JlUmVmKGVtcHR5Q2VsbCgpKS5lbmRDZWxsKCk7Ci8vLyAgICAgdHJ5IHsKLy8vICAgICAg" + - "ICAgbGV0IGRhdGFTaXplOiBEYXRhU2l6ZSA9IGMuY29tcHV0ZURhdGFTaXplKDIpOwovLy8gICAgICAgICBkYXRhU2l6ZS5jZWxsczsgLy8gMgovLy8gICAgICAgICBk" + - "YXRhU2l6ZS5iaXRzOyAgLy8gNwovLy8gICAgICAgICBkYXRhU2l6ZS5yZWZzOyAgLy8gMQovLy8gICAgIH0gY2F0Y2ggKGV4aXRDb2RlKSB7Ci8vLyAgICAgICAgIC8v" + - "IGlmIG1heENlbGxzIHdhcyBpbnN1ZmZpY2llbnQgdG8gdHJhdmVyc2UgdGhlIGNlbGwKLy8vICAgICAgICAgLy8gYW5kIGFsbCBvZiBpdHMgcmVmZXJlbmNlcywgdGhl" + - "IGV4aXRDb2RlIGhlcmUgd291bGQgYmUgOAovLy8gICAgIH0KLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2Nv" + - "cmUtY2VsbHMjY2VsbGNvbXB1dGVkYXRhc2l6ZQovLy8KYXNtIGV4dGVuZHMgZnVuIGNvbXB1dGVEYXRhU2l6ZShzZWxmOiBDZWxsPywgbWF4Q2VsbHM6IEludCk6IERh" + - "dGFTaXplIHsgQ0RBVEFTSVpFIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgov" + - "Ly8KLy8vIFNpbWlsYXIgdG8gYENlbGwuY29tcHV0ZURhdGFTaXplKClgLCBidXQgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCB0aGUgY2VsbCB0aGF0IGNvbnRhaW5z" + - "IHRoZSBgU2xpY2VgIGl0c2VsZi4gSG93ZXZlciwgYWNjb3VudHMgZm9yIGl0cyBiaXRzIGFuZCByZWZzLgovLy8KLy8vIFRoZSByZXN1bHRzIGFyZSBwYWNrZWQgaW50" + - "byBhIGBEYXRhU2l6ZWAgU3RydWN0IGNvbnNpc3Rpbmcgb2Y6Ci8vLyAqIGBjZWxsczogSW50YCwgdGhlIHRvdGFsIG51bWJlciBvZiBuZXN0ZWQgY2VsbHMsIGluY2x1" + - "ZGluZyB0aGUgc3RhcnRpbmcgb25lCi8vLyAqIGBiaXRzOiBJbnRgLCB0aGUgdG90YWwgbnVtYmVyIG9mIGJpdHMgaW4gYWxsIG5lc3RlZCBjZWxscywgaW5jbHVkaW5n" + - "IHRoZSBzdGFydGluZyBvbmUKLy8vICogYHJlZnM6IEludGAsIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVmcyBpbiBhbGwgbmVzdGVkIGNlbGxzLCBpbmNsdWRpbmcgdGhl" + - "IHN0YXJ0aW5nIG9uZQovLy8KLy8vIElmIHRoZSBzcGVjaWZpZWQgYG1heENlbGxzYCB2YWx1ZSBpc24ndCBlbm91Z2ggdG8gdHJhdmVyc2UgYWxsIGNlbGxzICoqbm90" + - "KiogaW5jbHVkaW5nIHRoZSBzdGFydGluZyBvbmUsIGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA4IGlzIHRocm93bjogYENlbGwgb3ZlcmZsb3dgLgovLy8KLy8v" + - "IEF0dGVtcHRzIHRvIHNwZWNpZnkgYSBuZWdhdGl2ZSB2YWx1ZSBvZiBgbWF4Q2VsbHNgIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA1OiBgSW50ZWdl" + - "ciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgp" + - "LnN0b3JlSW50KDQyLCA3KS5zdG9yZVJlZihlbXB0eUNlbGwoKSkuYXNTbGljZSgpOwovLy8gICAgIHRyeSB7Ci8vLyAgICAgICAgIGxldCBkYXRhU2l6ZTogRGF0YVNp" + - "emUgPSBzLmNvbXB1dGVEYXRhU2l6ZSgxKTsKLy8vICAgICAgICAgZGF0YVNpemUuY2VsbHM7IC8vIDEKLy8vICAgICAgICAgZGF0YVNpemUuYml0czsgIC8vIDcKLy8v" + - "ICAgICAgICAgZGF0YVNpemUucmVmczsgIC8vIDEKLy8vICAgICB9IGNhdGNoIChleGl0Q29kZSkgewovLy8gICAgICAgICAvLyBpZiBtYXhDZWxscyB3YXMgaW5zdWZm" + - "aWNpZW50IHRvIHRyYXZlcnNlIHRoZSBjZWxsCi8vLyAgICAgICAgIC8vIGFuZCBhbGwgb2YgaXRzIHJlZmVyZW5jZXMsIHRoZSBleGl0Q29kZSBoZXJlIHdvdWxkIGJl" + - "IDgKLy8vICAgICB9Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlY29tcHV0ZWRh" + - "dGFzaXplCi8vLwphc20gZXh0ZW5kcyBmdW4gY29tcHV0ZURhdGFTaXplKHNlbGY6IFNsaWNlLCBtYXhDZWxsczogSW50KTogRGF0YVNpemUgeyBTREFUQVNJWkUgfQoK" + - "Ly8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBDZWxsYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBDb21wdXRlcyBhbmQgcmV0" + - "dXJucyB0aGUgYEludGAgZGVwdGggb2YgdGhlIGBDZWxsYC4gUHJvZHVjZXMgMCBpZiB0aGUgYENlbGxgIGhhcyBubyByZWZlcmVuY2VzLCBvdGhlcndpc2UgMSBwbHVz" + - "IHRoZSBtYXhpbXVtIG9mIHRoZSBkZXB0aHMgb2YgdGhlIHJlZmVyZW5jZWQgY2VsbHMuIElmIGMgaXMgbnVsbCwgcmV0dXJucyB6ZXJvLgovLy8KLy8vIGBgYHRhY3QK" + - "Ly8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBjOiBDZWxsID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLmVuZENlbGwoKTsKLy8vICAgICBsZXQgZGVw" + - "dGg6IEludCA9IGMuZGVwdGgoKTsgLy8gMAovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNj" + - "ZWxsZGVwdGgKLy8vCmFzbSBleHRlbmRzIGZ1biBkZXB0aChzZWxmOiBDZWxsPyk6IEludCB7IENERVBUSCB9Cg=="; + "bHVlIGluIHRoZSByYW5nZSBmcm9tIDAgdG8gMl4yNDgg4oiSIDEgaW5jbHVzaXZlIGZyb20gdGhlIGBTbGljZWAuIFNpbWlsYXIgdG8gZGlzY2FyZGluZyB0aGUgcmV0" + + "dXJuIHZhbHVlIG9mIGBTbGljZS5sb2FkVmFyVWludDMyKClgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNraXAgc3VjaCBgSW50YCB3aGVuIGBTbGljZWAgZG9lc24ndCBj" + + "b250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgOF06IGBDZWxsIG92ZXJmbG93YC4KLy8vCi8vLyBBdHRlbXB0cyB0byBza2lwIG1vcmUg" + + "ZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggW2V4aXQgY29kZSA5XTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0" + + "YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKQovLy8gICAgICAgICAuc3RvcmVWYXJVaW50MzIoMjM5KQovLy8g" + + "ICAgICAgICAuc3RvcmVVaW50KDQyLCA3KQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8KLy8vICAgICBzLnNraXBWYXJVaW50MzIoKTsKLy8vICAgICBsZXQgZml6" + + "ejogSW50ID0gcy5sb2FkVWludCg3KTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2Nv" + + "cmUtY2VsbHMjc2xpY2Vza2lwdmFydWludDMyCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcwovLy8KLy8vIFtleGl0IGNvZGUg" + + "OF06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9i" + + "b29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4dGVuZHMgbXV0YXRlcyBmdW4gc2tpcFZhclVpbnQzMihzZWxmOiBTbGljZSkgeyBMRFZBUlVJTlQzMiBOSVAgfQoKLy8v" + + "IEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gU2ltaWxhciB0" + + "byBgU2xpY2UubG9hZFZhclVpbnQzMigpYCwgYnV0IHdpdGggYSBkaWZmZXJlbnQgYHZhbHVlYCByYW5nZTogZnJvbSAtMl4yNDcgdG8gMl4yNDcgLSAxIGluY2x1c2l2" + + "ZS4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIHN1Y2ggYEludGAgd2hlbiBgU2xpY2VgIGRvZXNuJ3QgY29udGFpbiBpdCB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBb" + + "ZXhpdCBjb2RlIDhdOiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFu" + + "IGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0" + + "IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVWYXJJbnQzMigtNDIwMDAwKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMubG9hZFZhckludDMy" + + "KCk7IC8vIC00MjAwMDAKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vs" + + "b2FkdmFyaW50MzIKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwovLy8gW2V4aXQgY29kZSA4XTogaHR0cHM6Ly9kb2Nz" + + "LnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzgKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5" + + "Ci8vLwphc20oIC0+IDEgMCkgZXh0ZW5kcyBtdXRhdGVzIGZ1biBsb2FkVmFySW50MzIoc2VsZjogU2xpY2UpOiBJbnQgeyBMRFZBUklOVDMyIH0KCi8vLyBFeHRlbnNp" + + "b24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4yLgovLy8KLy8vIFNpbWlsYXIgdG8gYFNsaWNl" + + "LnNraXBWYXJVaW50MzIoKWAsIGJ1dCB3aXRoIGEgZGlmZmVyZW50IGB2YWx1ZWAgcmFuZ2U6IGZyb20gLTJeMjQ3IHRvIDJeMjQ3IC0gMSBpbmNsdXNpdmUuCi8vLwov" + + "Ly8gQXR0ZW1wdHMgdG8gc2tpcCBzdWNoIGBJbnRgIHdoZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggW2V4aXQgY29k" + + "ZSA4XTogYENlbGwgb3ZlcmZsb3dgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNraXAgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucyB0aHJvdyBhbiBleGNlcHRp" + + "b24gd2l0aCBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGlj" + + "ZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZVZhckludDMyKC0yMzkpCi8vLyAgICAgICAgIC5zdG9yZVVpbnQoNDIsIDcpCi8vLyAgICAgICAgIC5hc1Ns" + + "aWNlKCk7Ci8vLwovLy8gICAgIHMuc2tpcFZhckludDMyKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMubG9hZFVpbnQoNyk7IC8vIDQyCi8vLyB9Ci8vLyBgYGAK" + + "Ly8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlc2tpcHZhcmludDMyCi8vLyAqIGh0dHBzOi8vZG9j" + + "cy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcwovLy8KLy8vIFtleGl0IGNvZGUgOF06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2Rl" + + "cyM4Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4dGVuZHMgbXV0YXRlcyBmdW4g" + + "c2tpcFZhckludDMyKHNlbGY6IFNsaWNlKSB7IExEVkFSSU5UMzIgTklQIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5" + + "cGUuCi8vLwovLy8gTG9hZHMgYWxsIGJ1dCB0aGUgZmlyc3QgMCDiiaQgYGxgIOKJpCAxMDIzIGJpdHMgZnJvbSB0aGUgYFNsaWNlYC4KLy8vCi8vLyBBdHRlbXB0cyB0" + + "byBzcGVjaWZ5IGFuIG91dC1vZi1ib3VuZHMgYGxgIHZhbHVlIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDVdOiBgSW50ZWdlciBvdXQgb2Yg" + + "ZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIEF0dGVtcHRzIHRvIGxvYWQgbW9yZSBkYXRhIHRoYW4gdGhlIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9u" + + "IHdpdGgKLy8vIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNs" + + "aWNlID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBzLnNraXBCaXRzKDUpOyAgICAgICAgICAgICAgICAgICAvLyBhbGwgYnV0" + + "IGZpcnN0IDUgYml0cwovLy8gICAgIGxldCBmaXp6OiBTbGljZSA9IHMubG9hZEJpdHMoMSk7IC8vIGxvYWQgb25seSAxIGJpdAovLy8gfQovLy8gYGBgCi8vLwovLy8g" + + "U2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZXNraXBiaXRzCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcu" + + "b3JnL2Jvb2svZXhpdC1jb2RlcwovLy8KLy8vIFtleGl0IGNvZGUgNV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1Ci8vLyBbZXhp" + + "dCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4dGVuZHMgbXV0YXRlcyBmdW4gc2tpcEJpdHMoc2Vs" + + "ZjogU2xpY2UsIGw6IEludCkgeyBTRFNLSVBGSVJTVCB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIENoZWNrcyB3" + + "aGV0aGVyIHRoZSBgU2xpY2VgIGlzIGVtcHR5IChpLmUuLCBjb250YWlucyBubyBiaXRzIG9mIGRhdGEgYW5kIG5vIGNlbGwgcmVmZXJlbmNlcykuCi8vLyBJZiBpdCBp" + + "cyBub3QsIGl0IHRocm93cyBhbiBleGNlcHRpb24gd2l0aCBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFt" + + "cGxlKCkgewovLy8gICAgIGxldCBlbXB0eU9uZTogU2xpY2UgPSBlbXB0eVNsaWNlKCk7Ci8vLyAgICAgZW1wdHlPbmUuZW5kUGFyc2UoKTsgLy8gbm90aGluZywgYXMg" + + "aXQncyBlbXB0eQovLy8KLy8vICAgICBsZXQgcGF1bDogU2xpY2UgPSAiRmVhciBpcyB0aGUgbWluZC1raWxsZXIiLmFzU2xpY2UoKTsKLy8vICAgICB0cnkgewovLy8g" + + "ICAgICAgICBwYXVsLmVuZFBhcnNlKCk7IC8vIHRocm93cyBleGl0IGNvZGUgOQovLy8gICAgIH0KLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6" + + "Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VlbmRwYXJzZQovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29k" + + "ZXMKLy8vCi8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4dGVuZHMgZnVuIGVuZFBh" + + "cnNlKHNlbGY6IFNsaWNlKSB7IEVORFMgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42" + + "LjAuCi8vLwovLy8gUHJlbG9hZHMgYWxsIGJ1dCB0aGUgbGFzdCAwIOKJpCBgbGVuYCDiiaQgMTAyMyBiaXRzIGZyb20gdGhlIGBTbGljZWAuCi8vLwovLy8gQXR0ZW1w" + + "dHMgdG8gc3BlY2lmeSBhbiBvdXQtb2YtYm91bmRzIGBsZW5gIHZhbHVlIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgNV06IGBJbnRlZ2VyIG91dCBv" + + "ZiBleHBlY3RlZCByYW5nZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gcHJlbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlv" + + "biB3aXRoIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNl" + + "ID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgYWxsQnV0TGFzdEZpdmU6IFNsaWNlID0gcy5za2lwTGFzdEJpdHMoNSk7" + + "IC8vIGFsbCBidXQgbGFzdCA1IGJpdHMsCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpLmUuIG9ubHkgZmly" + + "c3QgMgovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZXNraXBsYXN0Yml0" + + "cwovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMKLy8vCi8vLyBbZXhpdCBjb2RlIDVdOiBodHRwczovL2RvY3MudGFjdC1sYW5n" + + "Lm9yZy9ib29rL2V4aXQtY29kZXMjNQovLy8gW2V4aXQgY29kZSA5XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCmFzbSBl" + + "eHRlbmRzIGZ1biBza2lwTGFzdEJpdHMoc2VsZjogU2xpY2UsIGxlbjogSW50KTogU2xpY2UgeyBTRFNLSVBMQVNUIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9y" + + "IHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIFByZWxvYWRzIHRoZSBmaXJzdCAwIOKJpCBgbGVuYCDiiaQgMTAyMyBi" + + "aXRzIGZyb20gdGhlIGBTbGljZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBhbiBvdXQtb2YtYm91bmRzIGBsZW5gIHZhbHVlIHRocm93IGFuIGV4Y2VwdGlv" + + "biB3aXRoIFtleGl0IGNvZGUgNV06IGBJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gcHJlbG9hZCBtb3JlIGRhdGEgdGhh" + + "biBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8g" + + "ZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZmlyc3RG" + + "aXZlOiBTbGljZSA9IHMuZmlyc3RCaXRzKDUpOyAvLyBmaXJzdCA1IGJpdHMKLy8vIH0KLy8vIGBgYAovLy8KLy8vIEluIG9yZGVyIHRvIHJlZHVjZSBnYXMgdXNhZ2Us" + + "IHByZWZlciBjYWxsaW5nIGBTbGljZS5wcmVsb2FkQml0cygpYCBvdmVyIHVzaW5nIHRoaXMgZnVuY3Rpb24gc2luY2UgdGhlIGZvcm1lciBpcyBtb3JlIG9wdGltaXpl" + + "ZC4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlZmlyc3RiaXRzCi8vLyAqIGh0dHBzOi8vZG9j" + + "cy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlcHJlbG9hZGJpdHMKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVz" + + "Ci8vLwovLy8gW2V4aXQgY29kZSA1XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8v" + + "ZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwphc20gZXh0ZW5kcyBmdW4gZmlyc3RCaXRzKHNlbGY6IFNsaWNlLCBsZW46IEludCk6IFNsaWNl" + + "IHsgU0RDVVRGSVJTVCB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8v" + + "LyBQcmVsb2FkcyB0aGUgbGFzdCAwIOKJpCBgbGVuYCDiiaQgMTAyMyBiaXRzIGZyb20gdGhlIGBTbGljZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBhbiBv" + + "dXQtb2YtYm91bmRzIGBsZW5gIHZhbHVlIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgNV06IGBJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZWAu" + + "Ci8vLwovLy8gQXR0ZW1wdHMgdG8gcHJlbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUg" + + "OV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3Rv" + + "cmVJbnQoNDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgbGFzdEZpdmU6IFNsaWNlID0gcy5sYXN0Qml0cyg1KTsgLy8gbGFzdCA1IGJpdHMKLy8vIH0KLy8vIGBg" + + "YAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VsYXN0Yml0cwovLy8gKiBodHRwczovL2RvY3Mu" + + "dGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMKLy8vCi8vLyBbZXhpdCBjb2RlIDVdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMj" + + "NQovLy8gW2V4aXQgY29kZSA5XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCmFzbSBleHRlbmRzIGZ1biBsYXN0Qml0cyhz" + + "ZWxmOiBTbGljZSwgbGVuOiBJbnQpOiBTbGljZSB7IFNEQ1VUTEFTVCB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFi" + + "bGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgYEludGAgZGVwdGggb2YgdGhlIGBTbGljZWAuIFByb2R1Y2VzIDAgaWYg" + + "dGhlIGBTbGljZWAgaGFzIG5vIHJlZmVyZW5jZXMsIG90aGVyd2lzZSAxIHBsdXMgdGhlIG1heGltdW0gb2YgdGhlIGRlcHRocyBvZiB0aGUgcmVmZXJlbmNlZCBjZWxs" + + "cy4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZUludCg0MiwgNykuYXNTbGlj" + + "ZSgpOwovLy8gICAgIGxldCBkZXB0aDogSW50ID0gcy5kZXB0aCgpOyAvLyAwCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcu" + + "b3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlZGVwdGgKLy8vCmFzbSBleHRlbmRzIGZ1biBkZXB0aChzZWxmOiBTbGljZSk6IEludCB7IFNERVBUSCB9CgovLwovLyBTbGlj" + + "ZSBzaXplCi8vCgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiByZWZlcmVuY2Vz" + + "IGluIHRoZSBgU2xpY2VgIGFzIGFuIGBJbnRgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2Vs" + + "bCgpLnN0b3JlUmVmKGVtcHR5Q2VsbCgpKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMucmVmcygpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gU2Vl" + + "OiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZXJlZnMKLy8vCmFzbSBleHRlbmRzIGZ1biByZWZzKHNlbGY6IFNsaWNlKTogSW50" + + "IHsgU1JFRlMgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF0YSBiaXRz" + + "IGluIHRoZSBgU2xpY2VgIGFzIGFuIGBJbnRgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2Vs" + + "bCgpLnN0b3JlUmVmKGVtcHR5Q2VsbCgpKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMuYml0cygpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gU2Vl" + + "OiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWJpdHMKLy8vCmFzbSBleHRlbmRzIGZ1biBiaXRzKHNlbGY6IFNsaWNlKTogSW50" + + "IHsgU0JJVFMgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBDaGVja3Mgd2hldGhlciB0aGUgYFNsaWNlYCBpcyBl" + + "bXB0eSAoaS5lLiwgY29udGFpbnMgbm8gYml0cyBvZiBkYXRhIGFuZCBubyBjZWxsIHJlZmVyZW5jZXMpLgovLy8gUmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgZW1wdHks" + + "IGBmYWxzZWAgb3RoZXJ3aXNlLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3Jl" + + "UmVmKGVtcHR5Q2VsbCgpKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEJvb2wgPSBzLmVtcHR5KCk7ICAgICAgICAgICAgICAgICAgICAgLy8gZmFsc2UKLy8v" + + "ICAgICBsZXQgYnV6ejogQm9vbCA9IGJlZ2luQ2VsbCgpLmFzU2xpY2UoKS5lbXB0eSgpOyAvLyB0cnVlCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8v" + + "ZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlZW1wdHkKLy8vCmFzbSBleHRlbmRzIGZ1biBlbXB0eShzZWxmOiBTbGljZSk6IEJvb2wgeyBTRU1Q" + + "VFkgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBDaGVja3Mgd2hldGhlciB0aGUgYFNsaWNlYCBoYXMgbm8gYml0" + + "cyBvZiBkYXRhLgovLy8gUmV0dXJucyBgdHJ1ZWAgaWYgaXQgaGFzIG5vIGRhdGEsIGBmYWxzZWAgb3RoZXJ3aXNlLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFt" + + "cGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlUmVmKGVtcHR5Q2VsbCgpKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEJv" + + "b2wgPSBzLmRhdGFFbXB0eSgpOyAgLy8gdHJ1ZQovLy8KLy8vICAgICBsZXQgczI6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLmFzU2xpY2UoKTsK" + + "Ly8vICAgICBsZXQgYnV6ejogQm9vbCA9IHMyLmRhdGFFbXB0eSgpOyAvLyBmYWxzZQovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1s" + + "YW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWRhdGFlbXB0eQovLy8KYXNtIGV4dGVuZHMgZnVuIGRhdGFFbXB0eShzZWxmOiBTbGljZSk6IEJvb2wgeyBTREVNUFRZ" + + "IH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGBTbGljZWAgaGFzIG5vIHJlZmVy" + + "ZW5jZXMuCi8vLyBSZXR1cm5zIGB0cnVlYCBpZiBpdCBoYXMgbm8gcmVmZXJlbmNlcywgYGZhbHNlYCBvdGhlcndpc2UuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4" + + "YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVSZWYoZW1wdHlDZWxsKCkpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejog" + + "Qm9vbCA9IHMucmVmc0VtcHR5KCk7ICAgICAgICAgICAgICAgICAgICAgLy8gZmFsc2UKLy8vICAgICBsZXQgYnV6ejogQm9vbCA9IGJlZ2luQ2VsbCgpLmFzU2xpY2Uo" + + "KS5yZWZzRW1wdHkoKTsgLy8gdHJ1ZQovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGlj" + + "ZXJlZnNlbXB0eQovLy8KYXNtIGV4dGVuZHMgZnVuIHJlZnNFbXB0eShzZWxmOiBTbGljZSk6IEJvb2wgeyBTUkVNUFRZIH0KCi8vCi8vIENvbnZlcnNpb25zCi8vCgov" + + "Ly8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYEJ1aWxkZXJgIHR5cGUuCi8vLwovLy8gQ29udmVydHMgdGhlIGBCdWlsZGVyYCBpbnRvIGEgYFNsaWNlYCBhbmQg" + + "cmV0dXJucyBpdC4KLy8vIEFuIGFsaWFzIHRvIGBzZWxmLmVuZENlbGwoKS5iZWdpblBhcnNlKClgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewov" + + "Ly8gICAgIGxldCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCk7Ci8vLyAgICAgbGV0IGZpeno6IFNsaWNlID0gYi5hc1NsaWNlKCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8v" + + "LyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2J1aWxkZXJhc3NsaWNlCi8vLwppbmxpbmUgZXh0ZW5kcyBmdW4gYXNTbGljZShz" + + "ZWxmOiBCdWlsZGVyKTogU2xpY2UgewogICAgcmV0dXJuIHNlbGYuZW5kQ2VsbCgpLmJlZ2luUGFyc2UoKTsKfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhl" + + "IGBDZWxsYCB0eXBlLgovLy8KLy8vIENvbnZlcnRzIHRoZSBgQ2VsbGAgdG8gYSBgU2xpY2VgIGFuZCByZXR1cm5zIGl0LgovLy8gQW4gYWxpYXMgdG8gYHNlbGYuYmVn" + + "aW5QYXJzZSgpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYzogQ2VsbCA9IGVtcHR5Q2VsbCgpOwovLy8gICAgIGxldCBm" + + "aXp6OiBTbGljZSA9IGMuYXNTbGljZSgpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNj" + + "ZWxsYXNzbGljZQovLy8KaW5saW5lIGV4dGVuZHMgZnVuIGFzU2xpY2Uoc2VsZjogQ2VsbCk6IFNsaWNlIHsKICAgIHJldHVybiBzZWxmLmJlZ2luUGFyc2UoKTsKfQoK" + + "Ly8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBDb252ZXJ0cyB0aGUgYFNsaWNlYCB0byBhIGBDZWxsYCBhbmQgcmV0dXJu" + + "cyBpdC4KLy8vIEFuIGFsaWFzIHRvIGBiZWdpbkNlbGwoKS5zdG9yZVNsaWNlKHNlbGYpLmVuZENlbGwoKWAuCi8vLwovLy8gTk9URTogKipHYXMgZXhwZW5zaXZlISoq" + + "IFRoaXMgZnVuY3Rpb24gdXNlcyA1MDAgZ2FzIHVuaXRzIG9yIG1vcmUuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNs" + + "aWNlID0gYmVnaW5DZWxsKCkuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBDZWxsID0gcy5hc0NlbGwoKTsKLy8vICAgICBsZXQgYnV6ejogQ2VsbCA9IGJlZ2lu" + + "Q2VsbCgpLnN0b3JlU2xpY2UocykuZW5kQ2VsbCgpOwovLy8KLy8vICAgICBmaXp6ID09IGJ1eno7IC8vIHRydWUKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0" + + "cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vhc2NlbGwKLy8vCmlubGluZSBleHRlbmRzIGZ1biBhc0NlbGwoc2VsZjogU2xpY2UpOiBD" + + "ZWxsIHsKICAgIHJldHVybiBiZWdpbkNlbGwoKQogICAgICAgIC5zdG9yZVNsaWNlKHNlbGYpCiAgICAgICAgLmVuZENlbGwoKTsKfQoKLy8vIEV4dGVuc2lvbiBmdW5j" + + "dGlvbiBmb3IgdGhlIGBCdWlsZGVyYCB0eXBlLgovLy8KLy8vIENvbnZlcnRzIHRoZSBgQnVpbGRlcmAgaW50byBhIGBDZWxsYCBhbmQgcmV0dXJucyBpdC4KLy8vIEFu" + + "IGFsaWFzIHRvIGBzZWxmLmVuZENlbGwoKWAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGI6IEJ1aWxkZXIgPSBiZWdpbkNl" + + "bGwoKTsKLy8vICAgICBsZXQgZml6ejogQ2VsbCA9IGIuYXNDZWxsKCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3Jn" + + "L3JlZi9jb3JlLWNlbGxzI2J1aWxkZXJhc2NlbGwKLy8vCmlubGluZSBleHRlbmRzIGZ1biBhc0NlbGwoc2VsZjogQnVpbGRlcik6IENlbGwgewogICAgcmV0dXJuIHNl" + + "bGYuZW5kQ2VsbCgpOwp9CgovLy8gQ3JlYXRlcyBhbmQgcmV0dXJucyBhbiBlbXB0eSBgQ2VsbGAgKHdpdGhvdXQgZGF0YSBhbmQgcmVmZXJlbmNlcykuCi8vLyBBbiBh" + + "bGlhcyB0byBgYmVnaW5DZWxsKCkuZW5kQ2VsbCgpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgZml6ejogQ2VsbCA9IGVt" + + "cHR5Q2VsbCgpOwovLy8gICAgIGxldCBidXp6OiBDZWxsID0gYmVnaW5DZWxsKCkuZW5kQ2VsbCgpOwovLy8KLy8vICAgICBmaXp6ID09IGJ1eno7IC8vIHRydWUKLy8v" + + "IH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjZW1wdHljZWxsCi8vLwphc20gZnVuIGVtcHR5Q2Vs" + + "bCgpOiBDZWxsIHsKICAgIDxiIGI+IFBVU0hSRUYgLy8gUHVyZSBGaWZ0OiAiPGIiIGNyZWF0ZXMgYSBidWlsZGVyLCAiYj4iIHR1cm5zIGl0IGludG8gYSBjZWxsIGF0" + + "IGNvbXBpbGUgdGltZQp9CgovLy8gQ3JlYXRlcyBhbmQgcmV0dXJucyBhbiBlbXB0eSBgU2xpY2VgICh3aXRob3V0IGRhdGEgYW5kIHJlZmVyZW5jZXMpLgovLy8gQW4g" + + "YWxpYXMgdG8gYGVtcHR5Q2VsbCgpLmFzU2xpY2UoKWAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGZpeno6IFNsaWNlID0g" + + "ZW1wdHlTbGljZSgpOwovLy8gICAgIGxldCBidXp6OiBTbGljZSA9IGVtcHR5Q2VsbCgpLmFzU2xpY2UoKTsKLy8vCi8vLyAgICAgZml6eiA9PSBidXp6OyAvLyB0cnVl" + + "Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2VtcHR5c2xpY2UKLy8vCmFzbSBmdW4gZW1w" + + "dHlTbGljZSgpOiBTbGljZSB7CiAgICBie30gUFVTSFNMSUNFCn0KCi8vLyBTdHJ1Y3QgZm9yIGhvbGRpbmcgdmFsdWVzIGNvbXB1dGVkIGJ5IHRoZSBgQ2VsbC5jb21w" + + "dXRlRGF0YVNpemUoKWAgYW5kIGBTbGljZS5jb21wdXRlRGF0YVNpemUoKWAgZXh0ZW5zaW9uIGZ1bmN0aW9ucy4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8v" + + "LwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNjZWxsY29tcHV0ZWRhdGFzaXplCi8vLyAqIGh0dHBzOi8vZG9j" + + "cy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlY29tcHV0ZWRhdGFzaXplCi8vLwpzdHJ1Y3QgRGF0YVNpemUgewogICAgLy8vIFRoZSB0b3RhbCBudW1i" + + "ZXIgb2YgbmVzdGVkIGNlbGxzLCBpbmNsdWRpbmcgdGhlIHN0YXJ0aW5nIG9uZS4KICAgIGNlbGxzOiBJbnQ7CgogICAgLy8vIFRoZSB0b3RhbCBudW1iZXIgb2YgYml0" + + "cyBpbiBhbGwgbmVzdGVkIGNlbGxzLCBpbmNsdWRpbmcgdGhlIHN0YXJ0aW5nIG9uZS4KICAgIGJpdHM6IEludDsKCiAgICAvLy8gVGhlIHRvdGFsIG51bWJlciBvZiBy" + + "ZWZzIGluIGFsbCBuZXN0ZWQgY2VsbHMsIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcgb25lLgogICAgcmVmczogSW50Owp9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZv" + + "ciB0aGUgYENlbGxgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlzdGlu" + + "Y3QgY2VsbHMsIGJpdHMgYW5kIHJlZnMgaW4gdGhlIGBDZWxsYCBieSB1c2luZyBhIGRlcHRoLWZpcnN0IHNlYXJjaCAoREZTKSBhbGdvcml0aG0sIHJlY3Vyc2l2ZWx5" + + "IHRyYXZlcnNpbmcgZWFjaCByZWZlcmVuY2VkIGNlbGwuIFRoaXMgZnVuY3Rpb24gaXMgY29tcHV0YXRpb25hbGx5IGV4cGVuc2l2ZSBhbmQgY2FuIGNvbnN1bWUgYSBs" + + "b3Qgb2YgZ2FzLiBJZiBgc2VsZmAgaXMgYG51bGxgLCByZXR1cm5zIGBEYXRhU2l6ZWAgd2l0aCBhbGwgZmllbGRzIHNldCB0byAwLgovLy8KLy8vIFRoZSByZXN1bHRz" + + "IGFyZSBwYWNrZWQgaW50byBhIGBEYXRhU2l6ZWAgU3RydWN0IGNvbnNpc3Rpbmcgb2Y6Ci8vLyAqIGBjZWxsczogSW50YCwgdGhlIHRvdGFsIG51bWJlciBvZiBuZXN0" + + "ZWQgY2VsbHMsIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcgb25lCi8vLyAqIGBiaXRzOiBJbnRgLCB0aGUgdG90YWwgbnVtYmVyIG9mIGJpdHMgaW4gYWxsIG5lc3RlZCBj" + + "ZWxscywgaW5jbHVkaW5nIHRoZSBzdGFydGluZyBvbmUKLy8vICogYHJlZnM6IEludGAsIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVmcyBpbiBhbGwgbmVzdGVkIGNlbGxz" + + "LCBpbmNsdWRpbmcgdGhlIHN0YXJ0aW5nIG9uZQovLy8KLy8vIElmIHRoZSBzcGVjaWZpZWQgYG1heENlbGxzYCB2YWx1ZSBpc24ndCBlbm91Z2ggdG8gdHJhdmVyc2Ug" + + "YWxsIGNlbGxzIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcgb25lLCBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgOCBpcyB0aHJvd246IGBDZWxsIG92ZXJmbG93YC4K" + + "Ly8vCi8vLyBBdHRlbXB0cyB0byBzcGVjaWZ5IGEgbmVnYXRpdmUgdmFsdWUgb2YgYG1heENlbGxzYCB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgNTog" + + "YEludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYzogQ2VsbCA9IGJlZ2lu" + + "Q2VsbCgpLnN0b3JlSW50KDQyLCA3KS5zdG9yZVJlZihlbXB0eUNlbGwoKSkuZW5kQ2VsbCgpOwovLy8gICAgIHRyeSB7Ci8vLyAgICAgICAgIGxldCBkYXRhU2l6ZTog" + + "RGF0YVNpemUgPSBjLmNvbXB1dGVEYXRhU2l6ZSgyKTsKLy8vICAgICAgICAgZGF0YVNpemUuY2VsbHM7IC8vIDIKLy8vICAgICAgICAgZGF0YVNpemUuYml0czsgIC8v" + + "IDcKLy8vICAgICAgICAgZGF0YVNpemUucmVmczsgIC8vIDEKLy8vICAgICB9IGNhdGNoIChleGl0Q29kZSkgewovLy8gICAgICAgICAvLyBpZiBtYXhDZWxscyB3YXMg" + + "aW5zdWZmaWNpZW50IHRvIHRyYXZlcnNlIHRoZSBjZWxsCi8vLyAgICAgICAgIC8vIGFuZCBhbGwgb2YgaXRzIHJlZmVyZW5jZXMsIHRoZSBleGl0Q29kZSBoZXJlIHdv" + + "dWxkIGJlIDgKLy8vICAgICB9Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2NlbGxjb21w" + + "dXRlZGF0YXNpemUKLy8vCmFzbSBleHRlbmRzIGZ1biBjb21wdXRlRGF0YVNpemUoc2VsZjogQ2VsbD8sIG1heENlbGxzOiBJbnQpOiBEYXRhU2l6ZSB7IENEQVRBU0la" + + "RSB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBTaW1pbGFyIHRv" + + "IGBDZWxsLmNvbXB1dGVEYXRhU2l6ZSgpYCwgYnV0IGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgdGhlIGNlbGwgdGhhdCBjb250YWlucyB0aGUgYFNsaWNlYCBpdHNl" + + "bGYuIEhvd2V2ZXIsIGFjY291bnRzIGZvciBpdHMgYml0cyBhbmQgcmVmcy4KLy8vCi8vLyBUaGUgcmVzdWx0cyBhcmUgcGFja2VkIGludG8gYSBgRGF0YVNpemVgIFN0" + + "cnVjdCBjb25zaXN0aW5nIG9mOgovLy8gKiBgY2VsbHM6IEludGAsIHRoZSB0b3RhbCBudW1iZXIgb2YgbmVzdGVkIGNlbGxzLCBpbmNsdWRpbmcgdGhlIHN0YXJ0aW5n" + + "IG9uZQovLy8gKiBgYml0czogSW50YCwgdGhlIHRvdGFsIG51bWJlciBvZiBiaXRzIGluIGFsbCBuZXN0ZWQgY2VsbHMsIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcgb25l" + + "Ci8vLyAqIGByZWZzOiBJbnRgLCB0aGUgdG90YWwgbnVtYmVyIG9mIHJlZnMgaW4gYWxsIG5lc3RlZCBjZWxscywgaW5jbHVkaW5nIHRoZSBzdGFydGluZyBvbmUKLy8v" + + "Ci8vLyBJZiB0aGUgc3BlY2lmaWVkIGBtYXhDZWxsc2AgdmFsdWUgaXNuJ3QgZW5vdWdoIHRvIHRyYXZlcnNlIGFsbCBjZWxscyAqKm5vdCoqIGluY2x1ZGluZyB0aGUg" + + "c3RhcnRpbmcgb25lLCBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgOCBpcyB0aHJvd246IGBDZWxsIG92ZXJmbG93YC4KLy8vCi8vLyBBdHRlbXB0cyB0byBzcGVj" + + "aWZ5IGEgbmVnYXRpdmUgdmFsdWUgb2YgYG1heENlbGxzYCB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgNTogYEludGVnZXIgb3V0IG9mIGV4cGVjdGVk" + + "IHJhbmdlYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZUludCg0MiwgNyku" + + "c3RvcmVSZWYoZW1wdHlDZWxsKCkpLmFzU2xpY2UoKTsKLy8vICAgICB0cnkgewovLy8gICAgICAgICBsZXQgZGF0YVNpemU6IERhdGFTaXplID0gcy5jb21wdXRlRGF0" + + "YVNpemUoMSk7Ci8vLyAgICAgICAgIGRhdGFTaXplLmNlbGxzOyAvLyAxCi8vLyAgICAgICAgIGRhdGFTaXplLmJpdHM7ICAvLyA3Ci8vLyAgICAgICAgIGRhdGFTaXpl" + + "LnJlZnM7ICAvLyAxCi8vLyAgICAgfSBjYXRjaCAoZXhpdENvZGUpIHsKLy8vICAgICAgICAgLy8gaWYgbWF4Q2VsbHMgd2FzIGluc3VmZmljaWVudCB0byB0cmF2ZXJz" + + "ZSB0aGUgY2VsbAovLy8gICAgICAgICAvLyBhbmQgYWxsIG9mIGl0cyByZWZlcmVuY2VzLCB0aGUgZXhpdENvZGUgaGVyZSB3b3VsZCBiZSA4Ci8vLyAgICAgfQovLy8g" + + "fQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWNvbXB1dGVkYXRhc2l6ZQovLy8KYXNtIGV4" + + "dGVuZHMgZnVuIGNvbXB1dGVEYXRhU2l6ZShzZWxmOiBTbGljZSwgbWF4Q2VsbHM6IEludCk6IERhdGFTaXplIHsgU0RBVEFTSVpFIH0KCi8vLyBFeHRlbnNpb24gZnVu" + + "Y3Rpb24gZm9yIHRoZSBgQ2VsbGAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIGBJbnRgIGRl" + + "cHRoIG9mIHRoZSBgQ2VsbGAuIFByb2R1Y2VzIDAgaWYgdGhlIGBDZWxsYCBoYXMgbm8gcmVmZXJlbmNlcywgb3RoZXJ3aXNlIDEgcGx1cyB0aGUgbWF4aW11bSBvZiB0" + + "aGUgZGVwdGhzIG9mIHRoZSByZWZlcmVuY2VkIGNlbGxzLiBJZiBjIGlzIG51bGwsIHJldHVybnMgemVyby4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgp" + + "IHsKLy8vICAgICBsZXQgYzogQ2VsbCA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQyLCA3KS5lbmRDZWxsKCk7Ci8vLyAgICAgbGV0IGRlcHRoOiBJbnQgPSBjLmRlcHRo" + + "KCk7IC8vIDAKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjY2VsbGRlcHRoCi8vLwphc20g" + + "ZXh0ZW5kcyBmdW4gZGVwdGgoc2VsZjogQ2VsbD8pOiBJbnQgeyBDREVQVEggfQo="; files["std/internal/config.tact"] = "Ly8vIExvYWRzIGEgW2NvbmZpZ3VyYXRpb24gcGFyYW1ldGVyXSBvZiBUT04gQmxvY2tjaGFpbiBieSBpdHMgYGlkYCBudW1iZXIuCi8vLwovLy8gU2VlOiBodHRwczov" + "L2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jb250ZXh0c3RhdGUjZ2V0Y29uZmlncGFyYW0KLy8vCi8vLyBbY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJdOiBodHRw" + From 5946f1ea70bcdd7923cda84bc0383fe19f8c6ff7 Mon Sep 17 00:00:00 2001 From: Novus Nota <68142933+novusnota@users.noreply.github.com> Date: Tue, 18 Mar 2025 11:50:24 +0100 Subject: [PATCH 6/8] tests --- src/test/e2e-emulated/address.spec.ts | 26 +++++++++++++++ src/test/e2e-emulated/contracts/address.tact | 34 ++++++++++++++------ 2 files changed, 51 insertions(+), 9 deletions(-) diff --git a/src/test/e2e-emulated/address.spec.ts b/src/test/e2e-emulated/address.spec.ts index b2f59aa50..6125a83ad 100644 --- a/src/test/e2e-emulated/address.spec.ts +++ b/src/test/e2e-emulated/address.spec.ts @@ -43,4 +43,30 @@ describe("address", () => { "0:4a81708d2cf7b15a1b362fbf64880451d698461f52f05f145b36c08517d76873", ); }); + + it("should implement (de)serialization of BasechainAddresses correctly", async () => { + // Check the instantiation + const addr1 = await contract.getBasechainAddressFromHash(null); + const addr2 = + await contract.getBasechainAddressFromHash( + 0x4a81708d2cf7b15a1b362fbf64880451d698461f52f05f145b36c08517d76873n, + ); + + const cell1 = await contract.getBasechainAddressStore(addr1); + const cell2 = await contract.getBasechainAddressStore(addr2); + + // Check .skip... + await contract.getBasechainAddressSkip(cell1.asSlice()); + await contract.getBasechainAddressSkip(cell2.asSlice()); + + // Check .load... + const loadedAddr1 = await contract.getBasechainAddressLoad( + cell1.asSlice(), + ); + expect(addr1.hash === loadedAddr1.hash).toBe(true); + const loadedAddr2 = await contract.getBasechainAddressLoad( + cell2.asSlice(), + ); + expect(addr2.hash === loadedAddr2.hash).toBe(true); + }); }); diff --git a/src/test/e2e-emulated/contracts/address.tact b/src/test/e2e-emulated/contracts/address.tact index 851847aa8..6b4d6811a 100644 --- a/src/test/e2e-emulated/contracts/address.tact +++ b/src/test/e2e-emulated/contracts/address.tact @@ -1,11 +1,5 @@ -contract AddressTester { - init() { - - } - - receive() { - - } +contract AddressTester() { + receive() { } get fun test1(): Address { return address("UQBKgXCNLPexWhs2L79kiARR1phGH1LwXxRbNsCFF9doczSI"); @@ -18,4 +12,26 @@ contract AddressTester { get fun test3(): Address { return address("0:4a81708d2cf7b15a1b362fbf64880451d698461f52f05f145b36c08517d76873"); } -} \ No newline at end of file + + get fun basechainAddressFromHash(hash: Int?): BasechainAddress { + return BasechainAddress{ hash }; + } + + get fun basechainAddressStore(ba: BasechainAddress): Cell { + return beginCell() + .storeBasechainAddress(ba) + .endCell(); + } + + get fun basechainAddressLoad(baCell: Slice): BasechainAddress { + let ba = baCell.loadBasechainAddress(); + baCell.endParse(); // make sure it's empty + return ba; + } + + get fun basechainAddressSkip(baCell: Slice): Bool { + baCell.skipBasechainAddress(); + baCell.endParse(); // make sure it's empty + return true; + } +} From 3afc9bae555218a252c80965dd8c35a70cfc2bf8 Mon Sep 17 00:00:00 2001 From: Novus Nota <68142933+novusnota@users.noreply.github.com> Date: Tue, 18 Mar 2025 12:29:40 +0100 Subject: [PATCH 7/8] tests for addr_var and addr_extern, just in case --- src/test/e2e-emulated/address.spec.ts | 27 +++++++++++++++++++- src/test/e2e-emulated/contracts/address.tact | 20 +++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/test/e2e-emulated/address.spec.ts b/src/test/e2e-emulated/address.spec.ts index 6125a83ad..4a0a9d790 100644 --- a/src/test/e2e-emulated/address.spec.ts +++ b/src/test/e2e-emulated/address.spec.ts @@ -1,4 +1,4 @@ -import { toNano } from "@ton/core"; +import { beginCell, toNano } from "@ton/core"; import type { SandboxContract, TreasuryContract } from "@ton/sandbox"; import { Blockchain } from "@ton/sandbox"; import { AddressTester } from "./contracts/output/address_AddressTester"; @@ -68,5 +68,30 @@ describe("address", () => { cell2.asSlice(), ); expect(addr2.hash === loadedAddr2.hash).toBe(true); + + // Check .load... and .skip... of an addr_var + const varAddr = beginCell() + .storeUint(6, 3) + .storeUint(123, 9) + .storeUint(234, 32) + .storeUint(345, 123) + .endCell() + .asSlice(); + const resLoad1 = await contract.getBasechainAddressTryLoad(varAddr); + expect(resLoad1).toBe(false); + const resSkip1 = await contract.getBasechainAddressTrySkip(varAddr); + expect(resSkip1).toBe(false); + + // Check .load... and .skip... of an addr_extern + const externAddr = beginCell() + .storeUint(1, 2) // $01 + .storeUint(42, 9) // len:(## 9) + .storeUint(0, 42) // external_address:(bits len) + .endCell() + .asSlice(); + const resLoad2 = await contract.getBasechainAddressTryLoad(externAddr); + expect(resLoad2).toBe(false); + const resSkip2 = await contract.getBasechainAddressTrySkip(externAddr); + expect(resSkip2).toBe(false); }); }); diff --git a/src/test/e2e-emulated/contracts/address.tact b/src/test/e2e-emulated/contracts/address.tact index 6b4d6811a..a7b959ad5 100644 --- a/src/test/e2e-emulated/contracts/address.tact +++ b/src/test/e2e-emulated/contracts/address.tact @@ -29,9 +29,29 @@ contract AddressTester() { return ba; } + get fun basechainAddressTryLoad(baCell: Slice): Bool { + try { + let _ = baCell.loadBasechainAddress(); + baCell.endParse(); // make sure it's empty + return true; + } catch (_) { + return false; + } + } + get fun basechainAddressSkip(baCell: Slice): Bool { baCell.skipBasechainAddress(); baCell.endParse(); // make sure it's empty return true; } + + get fun basechainAddressTrySkip(baCell: Slice): Bool { + try { + baCell.skipBasechainAddress(); + baCell.endParse(); + return true; + } catch(_) { + return false; + } + } } From ec560dcd8ebe4a0bbbde83a8bc9600d4b57e1c52 Mon Sep 17 00:00:00 2001 From: Novus Nota <68142933+novusnota@users.noreply.github.com> Date: Tue, 18 Mar 2025 12:39:44 +0100 Subject: [PATCH 8/8] more visibility for address methods in core-cells --- docs/src/content/docs/ref/core-addresses.mdx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/src/content/docs/ref/core-addresses.mdx b/docs/src/content/docs/ref/core-addresses.mdx index 387ca080a..8d64a42b2 100644 --- a/docs/src/content/docs/ref/core-addresses.mdx +++ b/docs/src/content/docs/ref/core-addresses.mdx @@ -7,7 +7,10 @@ import { Badge } from '@astrojs/starlight/components'; `Address{:tact}` represents a standard [smart contract address](https://docs.ton.org/v3/concepts/dive-into-ton/ton-blockchain/smart-contract-addresses#address-of-smart-contract) on TON Blockchain. -See also: [`myAddress(){:tact}` function in the context and state reference](/ref/core-contextstate#myaddress). +See also: + +* [`myAddress(){:tact}` function in the context and state reference](/ref/core-contextstate#myaddress). +* Address-oriented extension functions for [`Builder{:tact}`][builder] and [`Slice{:tact}`][slice] types on their reference page: [Cells, Builders and Slices](/ref/core-cells). ## newAddress @@ -413,6 +416,7 @@ fun example() { [int]: /book/integers [nano]: /book/integers#nanotoncoin [cell]: /book/cells#cells +[builder]: /book/cells#builders [slice]: /book/cells#slices [struct]: /book/structs-and-messages#structs [opt]: /book/optionals