==== ExternalSource: _stringutils/stringutils.sol ====
==== Source: strings.sol ====
pragma abicoder v2;
import "_stringutils/stringutils.sol";

contract test {
    using strings for bytes32;
    using strings for string;
    using strings for strings.slice;

    function toSlice(string memory a) external pure returns (strings.slice memory) {
        return a.toSlice();
    }

    function roundtrip(string memory a) external pure returns (string memory) {
        return a.toSlice().toString();
    }

    function utf8len(string memory a) external pure returns (uint) {
        return a.toSlice().len();
    }

    function multiconcat(string memory a, uint count) public pure returns (string memory) {
        strings.slice memory s = a.toSlice();
        for (uint i = 0; i < count; i++) {
            s = s.concat(s).toSlice();
        }
        return s.toString();
    }

    function benchmark(string memory text, bytes32 seed) external pure returns (uint) {
        // Grow text.
        text = multiconcat(text, 10);

        strings.slice memory a = text.toSlice();
        strings.slice memory b = seed.toSliceB32();

        // Some heavy computation.
        bool c = b.equals(a) || b.startsWith(a);

        // Join as a list.
        strings.slice memory delim = c ? string(",").toSlice() : string(";").toSlice();
        strings.slice[] memory parts = new strings.slice[](2);
        parts[0] = a;
        parts[1] = b;
        string memory d = delim.join(parts);
        return d.toSlice().len();
    }
}
// ====
// compileViaYul: also
// ----
// constructor()
// gas irOptimized: 912777
// gas legacy: 1188228
// gas legacyOptimized: 771634
// toSlice(string): 0x20, 11, "hello world" -> 11, 0xa0
// gas irOptimized: 22877
// gas legacy: 23190
// gas legacyOptimized: 22508
// roundtrip(string): 0x20, 11, "hello world" -> 0x20, 11, "hello world"
// gas irOptimized: 23676
// gas legacy: 23820
// gas legacyOptimized: 23123
// utf8len(string): 0x20, 16, "\xf0\x9f\x98\x83\xf0\x9f\x98\x83\xf0\x9f\x98\x83\xf0\x9f\x98\x83" -> 4 # Input: "😃😃😃😃" #
// gas irOptimized: 24779
// gas legacy: 25716
// gas legacyOptimized: 24115
// multiconcat(string,uint256): 0x40, 3, 11, "hello world" -> 0x20, 0x58, 0x68656c6c6f20776f726c6468656c6c6f20776f726c6468656c6c6f20776f726c, 0x6468656c6c6f20776f726c6468656c6c6f20776f726c6468656c6c6f20776f72, 49027192869463622675296414541903001712009715982962058146354235762728281047040 # concatenating 3 times #
// gas irOptimized: 29729
// gas legacy: 31621
// gas legacyOptimized: 27914
// benchmark(string,bytes32): 0x40, 0x0842021, 8, "solidity" -> 0x2020
// gas irOptimized: 2903627
// gas legacy: 4381235
// gas legacyOptimized: 2317529
