Contract 0xE1277fd6540208E3feC1893C70336B211Fa78CD2

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xf906d4780ee98acd60273d62b69f5a0c498393164e205376d0292c8ae83d06a8Transfer222705122023-11-03 14:19:1827 days 3 hrs ago0x95eec4869998a169a96613a73cb83b97e761cc52 IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.000363895
0x656d7579f69fd818db93817aaeb56f7a4f13417cdba49d6d8469e22504c50313Transfer222704892023-11-03 14:17:2327 days 3 hrs ago0x95eec4869998a169a96613a73cb83b97e761cc52 IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.000363895
0x54e486635037f2751ad389bd6ad0fd5b6612c867444f1953ea3cc3fb9d4ea4deTransfer222704642023-11-03 14:15:1827 days 3 hrs ago0x95eec4869998a169a96613a73cb83b97e761cc52 IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.000366985
0xb25662251844e094c540cbfd3b3699ff109721269dac3833607f7a4d07a04447Transfer222704272023-11-03 14:12:1327 days 3 hrs ago0x95eec4869998a169a96613a73cb83b97e761cc52 IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.0003675
0xf2346a2de51a9d345efae24353973d947786b97ba2ff25de24de2efade46bfadTransfer222703702023-11-03 14:07:2827 days 3 hrs ago0x95eec4869998a169a96613a73cb83b97e761cc52 IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.00036132
0x69f480b89f3c1221e8467ff6c90981c78c1a24fc12912053801a0811efd4217eTransfer222644662023-11-03 5:55:2827 days 11 hrs ago0xafdd522699cb1692dfa531233077e02bec52e7ab IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.000364925
0xa166e76dc37db04d9ed2fbab37fc980c3ab7fe4dce57c49c777f5b1dc410bb73Transfer222643372023-11-03 5:44:4327 days 12 hrs ago0xee67344087d12618868b9980cc801515f6c9c2f8 IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.00036441
0xe89b1e691ef58b098ae6ebbebdf9cfd9ebae238ce867374e5bad5cb05b3b55b0Transfer222641252023-11-03 5:27:0327 days 12 hrs ago0x6ad3690110e86554d1977116a2dfae1846e5f4a1 IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.000363895
0x79cedef18799000758324a91b73283dc61d9c7f592565e43bd9ab13a56dbe3a5Transfer222641022023-11-03 5:25:0827 days 12 hrs ago0x1fc1d9b95ef5d59ce1db5f116234a321151f6a0e IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.000366985
0x956b5df1291855f2387bd038fc9d9cc50a6f61d34634972dcffbe432528b6a2bTransfer222640682023-11-03 5:22:1827 days 12 hrs ago0x11b74c87488b2faf62fac3f9fd6d3d7c18489465 IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.000362865
0xba5835072f4f4d13fdf6099f702644ca4a4f5c087ed29fb45e8e99b459ab0bc1Transfer221693472023-10-28 17:48:5332 days 23 hrs ago0x6ad3690110e86554d1977116a2dfae1846e5f4a1 IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.000362865
0x6080867e52227d91bb8cd3de0ef8abe587e571d888f067cdd5839dad35d8c99eTransfer221295162023-10-26 10:29:3735 days 7 hrs ago0xafdd522699cb1692dfa531233077e02bec52e7ab IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.000363895
0xabaafa06b4286fd202cb1c416889de7f41839d0d3178bcade3d507d371cf510eTransfer221295072023-10-26 10:28:5235 days 7 hrs ago0xafdd522699cb1692dfa531233077e02bec52e7ab IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.000278235
0x332db040b5b7bad2f5a72f1818239b4df2532d14645f45ebdf84294483f39cd4Transfer221294972023-10-26 10:28:0235 days 7 hrs ago0xafdd522699cb1692dfa531233077e02bec52e7ab IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.000367045
0xb66cf4e19c6e2d555242ef5b7f4b75c84f32072aa108c9359435b7b176289539Transfer221294692023-10-26 10:25:4235 days 7 hrs ago0xafdd522699cb1692dfa531233077e02bec52e7ab IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.000363955
0x6b5db4e09dc19a13db6acaa325d22e374f8652183996dd45b8c3c19b1bb123c3Transfer221294442023-10-26 10:23:3735 days 7 hrs ago0xafdd522699cb1692dfa531233077e02bec52e7ab IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.000364985
0xe443141c0715a46304ffb7b12211e4536e2947ae4a28e1ed902ab11cfa49fa86Transfer221281082023-10-26 8:32:1735 days 9 hrs ago0xee67344087d12618868b9980cc801515f6c9c2f8 IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.000363955
0x0394014678b1b6b9e1547d948e23b0f00e1e8bdc424f441377884e3deb0799f3Transfer221280992023-10-26 8:31:3235 days 9 hrs ago0x6ad3690110e86554d1977116a2dfae1846e5f4a1 IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.00036647
0x0b7a1b74e041a13e208b3b672f5cce2b5e98515c7f745af00d8079d465fb22dfTransfer221280302023-10-26 8:25:4735 days 9 hrs ago0x1fc1d9b95ef5d59ce1db5f116234a321151f6a0e IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.00036756
0xfc5d5d32e7a6c7ba5346f5ace80787e27f1935cf3d665bdb3f1907ad0c2aa714Transfer221279682023-10-26 8:20:3735 days 9 hrs ago0x62195b81ef094c9aacb50a7bbf1bbba2eb0cfb8a IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.00036756
0x9a4b9cd9d2b81ef60a3c8bfc896864323148d46802abe2286cb29fa609d86ff9Transfer221279092023-10-26 8:15:4235 days 9 hrs ago0x11b74c87488b2faf62fac3f9fd6d3d7c18489465 IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.000675415
0x4a23bdcaade2f4ae3dc13e2188b05d84076909553c5ce6b54d806b95e7b8bd04Transfer219216172023-10-14 9:44:3747 days 8 hrs ago0xafdd522699cb1692dfa531233077e02bec52e7ab IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.00044676
0x2ad36e10b7c396390ba164301ba7968085b585823223ad6545cce3800c9f1fc3Transfer218501492023-10-10 6:28:5651 days 11 hrs ago0x11b74c87488b2faf62fac3f9fd6d3d7c18489465 IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.0003675
0xa2271133973ca2ab63e7b4f59f9d2a504c76d129f617ad526f465c1611b88e36Transfer218499952023-10-10 6:16:0651 days 11 hrs ago0x1fc1d9b95ef5d59ce1db5f116234a321151f6a0e IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.000366985
0xd29bb5dc6225b80536b6c5441ceebf820ace9e1901aeda19dc662a40fbc48624Transfer218499672023-10-10 6:13:4651 days 11 hrs ago0x11b74c87488b2faf62fac3f9fd6d3d7c18489465 IN  0xe1277fd6540208e3fec1893c70336b211fa78cd20 CELO0.000363895
[ Download CSV Export 
Parent Txn Hash Block From To Value
Index Block
Loading

Similar Match Source Code
This contract matches the deployed ByteCode of the Source Code for Contract 0x45d747172e77d55575c197cba9451bc2cd8f4958
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
DemurrageTokenSingleNocap

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
byzantium EvmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at celoscan.io on 2023-06-03
*/

pragma solidity >= 0.8.0;


/*
 * ABDK Math 64.64 Smart Contract Library.  Copyright © 2019 by ABDK Consulting.
 * Author: Mikhail Vladimirov <[email protected]>
 * License: BSD-4-Clause
 */
 
/**
 * Smart contract library of mathematical functions operating with signed
 * 64.64-bit fixed point numbers.  Signed 64.64-bit fixed point number is
 * basically a simple fraction whose numerator is signed 128-bit integer and
 * denominator is 2^64.  As long as denominator is always the same, there is no
 * need to store it, thus in Solidity signed 64.64-bit fixed point numbers are
 * represented by int128 type holding only the numerator.
 */
library ABDKMath64x64 {
  /*
   * Minimum value signed 64.64-bit fixed point number may have. 
   */
  int128 private constant MIN_64x64 = -0x80000000000000000000000000000000;

  /*
   * Maximum value signed 64.64-bit fixed point number may have. 
   */
  int128 private constant MAX_64x64 = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;

  /**
   * Convert signed 256-bit integer number into signed 64.64-bit fixed point
   * number.  Revert on overflow.
   *
   * @param x signed 256-bit integer number
   * @return signed 64.64-bit fixed point number
   */
  function fromInt (int256 x) internal pure returns (int128) {
    unchecked {
      require (x >= -0x8000000000000000 && x <= 0x7FFFFFFFFFFFFFFF);
      return int128 (x << 64);
    }
  }

  /**
   * Convert signed 64.64 fixed point number into signed 64-bit integer number
   * rounding down.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64-bit integer number
   */
  function toInt (int128 x) internal pure returns (int64) {
    unchecked {
      return int64 (x >> 64);
    }
  }

  /**
   * Convert unsigned 256-bit integer number into signed 64.64-bit fixed point
   * number.  Revert on overflow.
   *
   * @param x unsigned 256-bit integer number
   * @return signed 64.64-bit fixed point number
   */
  function fromUInt (uint256 x) internal pure returns (int128) {
    unchecked {
      require (x <= 0x7FFFFFFFFFFFFFFF);
      return int128 (int256 (x << 64));
    }
  }

  /**
   * Convert signed 64.64 fixed point number into unsigned 64-bit integer
   * number rounding down.  Revert on underflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @return unsigned 64-bit integer number
   */
  function toUInt (int128 x) internal pure returns (uint64) {
    unchecked {
      require (x >= 0);
      return uint64 (uint128 (x >> 64));
    }
  }

  /**
   * Convert signed 128.128 fixed point number into signed 64.64-bit fixed point
   * number rounding down.  Revert on overflow.
   *
   * @param x signed 128.128-bin fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function from128x128 (int256 x) internal pure returns (int128) {
    unchecked {
      int256 result = x >> 64;
      require (result >= MIN_64x64 && result <= MAX_64x64);
      return int128 (result);
    }
  }

  /**
   * Convert signed 64.64 fixed point number into signed 128.128 fixed point
   * number.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 128.128 fixed point number
   */
  function to128x128 (int128 x) internal pure returns (int256) {
    unchecked {
      return int256 (x) << 64;
    }
  }

  /**
   * Calculate x + y.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function add (int128 x, int128 y) internal pure returns (int128) {
    unchecked {
      int256 result = int256(x) + y;
      require (result >= MIN_64x64 && result <= MAX_64x64);
      return int128 (result);
    }
  }

  /**
   * Calculate x - y.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function sub (int128 x, int128 y) internal pure returns (int128) {
    unchecked {
      int256 result = int256(x) - y;
      require (result >= MIN_64x64 && result <= MAX_64x64);
      return int128 (result);
    }
  }

  /**
   * Calculate x * y rounding down.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function mul (int128 x, int128 y) internal pure returns (int128) {
    unchecked {
      int256 result = int256(x) * y >> 64;
      require (result >= MIN_64x64 && result <= MAX_64x64);
      return int128 (result);
    }
  }

  /**
   * Calculate x * y rounding towards zero, where x is signed 64.64 fixed point
   * number and y is signed 256-bit integer number.  Revert on overflow.
   *
   * @param x signed 64.64 fixed point number
   * @param y signed 256-bit integer number
   * @return signed 256-bit integer number
   */
  function muli (int128 x, int256 y) internal pure returns (int256) {
    unchecked {
      if (x == MIN_64x64) {
        require (y >= -0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF &&
          y <= 0x1000000000000000000000000000000000000000000000000);
        return -y << 63;
      } else {
        bool negativeResult = false;
        if (x < 0) {
          x = -x;
          negativeResult = true;
        }
        if (y < 0) {
          y = -y; // We rely on overflow behavior here
          negativeResult = !negativeResult;
        }
        uint256 absoluteResult = mulu (x, uint256 (y));
        if (negativeResult) {
          require (absoluteResult <=
            0x8000000000000000000000000000000000000000000000000000000000000000);
          return -int256 (absoluteResult); // We rely on overflow behavior here
        } else {
          require (absoluteResult <=
            0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
          return int256 (absoluteResult);
        }
      }
    }
  }

  /**
   * Calculate x * y rounding down, where x is signed 64.64 fixed point number
   * and y is unsigned 256-bit integer number.  Revert on overflow.
   *
   * @param x signed 64.64 fixed point number
   * @param y unsigned 256-bit integer number
   * @return unsigned 256-bit integer number
   */
  function mulu (int128 x, uint256 y) internal pure returns (uint256) {
    unchecked {
      if (y == 0) return 0;

      require (x >= 0);

      uint256 lo = (uint256 (int256 (x)) * (y & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)) >> 64;
      uint256 hi = uint256 (int256 (x)) * (y >> 128);

      require (hi <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
      hi <<= 64;

      require (hi <=
        0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - lo);
      return hi + lo;
    }
  }

  /**
   * Calculate x / y rounding towards zero.  Revert on overflow or when y is
   * zero.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function div (int128 x, int128 y) internal pure returns (int128) {
    unchecked {
      require (y != 0);
      int256 result = (int256 (x) << 64) / y;
      require (result >= MIN_64x64 && result <= MAX_64x64);
      return int128 (result);
    }
  }

  /**
   * Calculate x / y rounding towards zero, where x and y are signed 256-bit
   * integer numbers.  Revert on overflow or when y is zero.
   *
   * @param x signed 256-bit integer number
   * @param y signed 256-bit integer number
   * @return signed 64.64-bit fixed point number
   */
  function divi (int256 x, int256 y) internal pure returns (int128) {
    unchecked {
      require (y != 0);

      bool negativeResult = false;
      if (x < 0) {
        x = -x; // We rely on overflow behavior here
        negativeResult = true;
      }
      if (y < 0) {
        y = -y; // We rely on overflow behavior here
        negativeResult = !negativeResult;
      }
      uint128 absoluteResult = divuu (uint256 (x), uint256 (y));
      if (negativeResult) {
        require (absoluteResult <= 0x80000000000000000000000000000000);
        return -int128 (absoluteResult); // We rely on overflow behavior here
      } else {
        require (absoluteResult <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
        return int128 (absoluteResult); // We rely on overflow behavior here
      }
    }
  }

  /**
   * Calculate x / y rounding towards zero, where x and y are unsigned 256-bit
   * integer numbers.  Revert on overflow or when y is zero.
   *
   * @param x unsigned 256-bit integer number
   * @param y unsigned 256-bit integer number
   * @return signed 64.64-bit fixed point number
   */
  function divu (uint256 x, uint256 y) internal pure returns (int128) {
    unchecked {
      require (y != 0);
      uint128 result = divuu (x, y);
      require (result <= uint128 (MAX_64x64));
      return int128 (result);
    }
  }

  /**
   * Calculate -x.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function neg (int128 x) internal pure returns (int128) {
    unchecked {
      require (x != MIN_64x64);
      return -x;
    }
  }

  /**
   * Calculate |x|.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function abs (int128 x) internal pure returns (int128) {
    unchecked {
      require (x != MIN_64x64);
      return x < 0 ? -x : x;
    }
  }

  /**
   * Calculate 1 / x rounding towards zero.  Revert on overflow or when x is
   * zero.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function inv (int128 x) internal pure returns (int128) {
    unchecked {
      require (x != 0);
      int256 result = int256 (0x100000000000000000000000000000000) / x;
      require (result >= MIN_64x64 && result <= MAX_64x64);
      return int128 (result);
    }
  }

  /**
   * Calculate arithmetics average of x and y, i.e. (x + y) / 2 rounding down.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function avg (int128 x, int128 y) internal pure returns (int128) {
    unchecked {
      return int128 ((int256 (x) + int256 (y)) >> 1);
    }
  }

  /**
   * Calculate geometric average of x and y, i.e. sqrt (x * y) rounding down.
   * Revert on overflow or in case x * y is negative.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function gavg (int128 x, int128 y) internal pure returns (int128) {
    unchecked {
      int256 m = int256 (x) * int256 (y);
      require (m >= 0);
      require (m <
          0x4000000000000000000000000000000000000000000000000000000000000000);
      return int128 (sqrtu (uint256 (m)));
    }
  }

  /**
   * Calculate x^y assuming 0^0 is 1, where x is signed 64.64 fixed point number
   * and y is unsigned 256-bit integer number.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y uint256 value
   * @return signed 64.64-bit fixed point number
   */
  function pow (int128 x, uint256 y) internal pure returns (int128) {
    unchecked {
      bool negative = x < 0 && y & 1 == 1;

      uint256 absX = uint128 (x < 0 ? -x : x);
      uint256 absResult;
      absResult = 0x100000000000000000000000000000000;

      if (absX <= 0x10000000000000000) {
        absX <<= 63;
        while (y != 0) {
          if (y & 0x1 != 0) {
            absResult = absResult * absX >> 127;
          }
          absX = absX * absX >> 127;

          if (y & 0x2 != 0) {
            absResult = absResult * absX >> 127;
          }
          absX = absX * absX >> 127;

          if (y & 0x4 != 0) {
            absResult = absResult * absX >> 127;
          }
          absX = absX * absX >> 127;

          if (y & 0x8 != 0) {
            absResult = absResult * absX >> 127;
          }
          absX = absX * absX >> 127;

          y >>= 4;
        }

        absResult >>= 64;
      } else {
        uint256 absXShift = 63;
        if (absX < 0x1000000000000000000000000) { absX <<= 32; absXShift -= 32; }
        if (absX < 0x10000000000000000000000000000) { absX <<= 16; absXShift -= 16; }
        if (absX < 0x1000000000000000000000000000000) { absX <<= 8; absXShift -= 8; }
        if (absX < 0x10000000000000000000000000000000) { absX <<= 4; absXShift -= 4; }
        if (absX < 0x40000000000000000000000000000000) { absX <<= 2; absXShift -= 2; }
        if (absX < 0x80000000000000000000000000000000) { absX <<= 1; absXShift -= 1; }

        uint256 resultShift = 0;
        while (y != 0) {
          require (absXShift < 64);

          if (y & 0x1 != 0) {
            absResult = absResult * absX >> 127;
            resultShift += absXShift;
            if (absResult > 0x100000000000000000000000000000000) {
              absResult >>= 1;
              resultShift += 1;
            }
          }
          absX = absX * absX >> 127;
          absXShift <<= 1;
          if (absX >= 0x100000000000000000000000000000000) {
              absX >>= 1;
              absXShift += 1;
          }

          y >>= 1;
        }

        require (resultShift < 64);
        absResult >>= 64 - resultShift;
      }
      int256 result = negative ? -int256 (absResult) : int256 (absResult);
      require (result >= MIN_64x64 && result <= MAX_64x64);
      return int128 (result);
    }
  }

  /**
   * Calculate sqrt (x) rounding down.  Revert if x < 0.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function sqrt (int128 x) internal pure returns (int128) {
    unchecked {
      require (x >= 0);
      return int128 (sqrtu (uint256 (int256 (x)) << 64));
    }
  }

  /**
   * Calculate binary logarithm of x.  Revert if x <= 0.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function log_2 (int128 x) internal pure returns (int128) {
    unchecked {
      require (x > 0);

      int256 msb = 0;
      int256 xc = x;
      if (xc >= 0x10000000000000000) { xc >>= 64; msb += 64; }
      if (xc >= 0x100000000) { xc >>= 32; msb += 32; }
      if (xc >= 0x10000) { xc >>= 16; msb += 16; }
      if (xc >= 0x100) { xc >>= 8; msb += 8; }
      if (xc >= 0x10) { xc >>= 4; msb += 4; }
      if (xc >= 0x4) { xc >>= 2; msb += 2; }
      if (xc >= 0x2) msb += 1;  // No need to shift xc anymore

      int256 result = msb - 64 << 64;
      uint256 ux = uint256 (int256 (x)) << uint256 (127 - msb);
      for (int256 bit = 0x8000000000000000; bit > 0; bit >>= 1) {
        ux *= ux;
        uint256 b = ux >> 255;
        ux >>= 127 + b;
        result += bit * int256 (b);
      }

      return int128 (result);
    }
  }

  /**
   * Calculate natural logarithm of x.  Revert if x <= 0.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function ln (int128 x) internal pure returns (int128) {
    unchecked {
      require (x > 0);

      return int128 (int256 (
          uint256 (int256 (log_2 (x))) * 0xB17217F7D1CF79ABC9E3B39803F2F6AF >> 128));
    }
  }

  /**
   * Calculate binary exponent of x.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function exp_2 (int128 x) internal pure returns (int128) {
    unchecked {
      require (x < 0x400000000000000000); // Overflow

      if (x < -0x400000000000000000) return 0; // Underflow

      uint256 result = 0x80000000000000000000000000000000;

      if (x & 0x8000000000000000 > 0)
        result = result * 0x16A09E667F3BCC908B2FB1366EA957D3E >> 128;
      if (x & 0x4000000000000000 > 0)
        result = result * 0x1306FE0A31B7152DE8D5A46305C85EDEC >> 128;
      if (x & 0x2000000000000000 > 0)
        result = result * 0x1172B83C7D517ADCDF7C8C50EB14A791F >> 128;
      if (x & 0x1000000000000000 > 0)
        result = result * 0x10B5586CF9890F6298B92B71842A98363 >> 128;
      if (x & 0x800000000000000 > 0)
        result = result * 0x1059B0D31585743AE7C548EB68CA417FD >> 128;
      if (x & 0x400000000000000 > 0)
        result = result * 0x102C9A3E778060EE6F7CACA4F7A29BDE8 >> 128;
      if (x & 0x200000000000000 > 0)
        result = result * 0x10163DA9FB33356D84A66AE336DCDFA3F >> 128;
      if (x & 0x100000000000000 > 0)
        result = result * 0x100B1AFA5ABCBED6129AB13EC11DC9543 >> 128;
      if (x & 0x80000000000000 > 0)
        result = result * 0x10058C86DA1C09EA1FF19D294CF2F679B >> 128;
      if (x & 0x40000000000000 > 0)
        result = result * 0x1002C605E2E8CEC506D21BFC89A23A00F >> 128;
      if (x & 0x20000000000000 > 0)
        result = result * 0x100162F3904051FA128BCA9C55C31E5DF >> 128;
      if (x & 0x10000000000000 > 0)
        result = result * 0x1000B175EFFDC76BA38E31671CA939725 >> 128;
      if (x & 0x8000000000000 > 0)
        result = result * 0x100058BA01FB9F96D6CACD4B180917C3D >> 128;
      if (x & 0x4000000000000 > 0)
        result = result * 0x10002C5CC37DA9491D0985C348C68E7B3 >> 128;
      if (x & 0x2000000000000 > 0)
        result = result * 0x1000162E525EE054754457D5995292026 >> 128;
      if (x & 0x1000000000000 > 0)
        result = result * 0x10000B17255775C040618BF4A4ADE83FC >> 128;
      if (x & 0x800000000000 > 0)
        result = result * 0x1000058B91B5BC9AE2EED81E9B7D4CFAB >> 128;
      if (x & 0x400000000000 > 0)
        result = result * 0x100002C5C89D5EC6CA4D7C8ACC017B7C9 >> 128;
      if (x & 0x200000000000 > 0)
        result = result * 0x10000162E43F4F831060E02D839A9D16D >> 128;
      if (x & 0x100000000000 > 0)
        result = result * 0x100000B1721BCFC99D9F890EA06911763 >> 128;
      if (x & 0x80000000000 > 0)
        result = result * 0x10000058B90CF1E6D97F9CA14DBCC1628 >> 128;
      if (x & 0x40000000000 > 0)
        result = result * 0x1000002C5C863B73F016468F6BAC5CA2B >> 128;
      if (x & 0x20000000000 > 0)
        result = result * 0x100000162E430E5A18F6119E3C02282A5 >> 128;
      if (x & 0x10000000000 > 0)
        result = result * 0x1000000B1721835514B86E6D96EFD1BFE >> 128;
      if (x & 0x8000000000 > 0)
        result = result * 0x100000058B90C0B48C6BE5DF846C5B2EF >> 128;
      if (x & 0x4000000000 > 0)
        result = result * 0x10000002C5C8601CC6B9E94213C72737A >> 128;
      if (x & 0x2000000000 > 0)
        result = result * 0x1000000162E42FFF037DF38AA2B219F06 >> 128;
      if (x & 0x1000000000 > 0)
        result = result * 0x10000000B17217FBA9C739AA5819F44F9 >> 128;
      if (x & 0x800000000 > 0)
        result = result * 0x1000000058B90BFCDEE5ACD3C1CEDC823 >> 128;
      if (x & 0x400000000 > 0)
        result = result * 0x100000002C5C85FE31F35A6A30DA1BE50 >> 128;
      if (x & 0x200000000 > 0)
        result = result * 0x10000000162E42FF0999CE3541B9FFFCF >> 128;
      if (x & 0x100000000 > 0)
        result = result * 0x100000000B17217F80F4EF5AADDA45554 >> 128;
      if (x & 0x80000000 > 0)
        result = result * 0x10000000058B90BFBF8479BD5A81B51AD >> 128;
      if (x & 0x40000000 > 0)
        result = result * 0x1000000002C5C85FDF84BD62AE30A74CC >> 128;
      if (x & 0x20000000 > 0)
        result = result * 0x100000000162E42FEFB2FED257559BDAA >> 128;
      if (x & 0x10000000 > 0)
        result = result * 0x1000000000B17217F7D5A7716BBA4A9AE >> 128;
      if (x & 0x8000000 > 0)
        result = result * 0x100000000058B90BFBE9DDBAC5E109CCE >> 128;
      if (x & 0x4000000 > 0)
        result = result * 0x10000000002C5C85FDF4B15DE6F17EB0D >> 128;
      if (x & 0x2000000 > 0)
        result = result * 0x1000000000162E42FEFA494F1478FDE05 >> 128;
      if (x & 0x1000000 > 0)
        result = result * 0x10000000000B17217F7D20CF927C8E94C >> 128;
      if (x & 0x800000 > 0)
        result = result * 0x1000000000058B90BFBE8F71CB4E4B33D >> 128;
      if (x & 0x400000 > 0)
        result = result * 0x100000000002C5C85FDF477B662B26945 >> 128;
      if (x & 0x200000 > 0)
        result = result * 0x10000000000162E42FEFA3AE53369388C >> 128;
      if (x & 0x100000 > 0)
        result = result * 0x100000000000B17217F7D1D351A389D40 >> 128;
      if (x & 0x80000 > 0)
        result = result * 0x10000000000058B90BFBE8E8B2D3D4EDE >> 128;
      if (x & 0x40000 > 0)
        result = result * 0x1000000000002C5C85FDF4741BEA6E77E >> 128;
      if (x & 0x20000 > 0)
        result = result * 0x100000000000162E42FEFA39FE95583C2 >> 128;
      if (x & 0x10000 > 0)
        result = result * 0x1000000000000B17217F7D1CFB72B45E1 >> 128;
      if (x & 0x8000 > 0)
        result = result * 0x100000000000058B90BFBE8E7CC35C3F0 >> 128;
      if (x & 0x4000 > 0)
        result = result * 0x10000000000002C5C85FDF473E242EA38 >> 128;
      if (x & 0x2000 > 0)
        result = result * 0x1000000000000162E42FEFA39F02B772C >> 128;
      if (x & 0x1000 > 0)
        result = result * 0x10000000000000B17217F7D1CF7D83C1A >> 128;
      if (x & 0x800 > 0)
        result = result * 0x1000000000000058B90BFBE8E7BDCBE2E >> 128;
      if (x & 0x400 > 0)
        result = result * 0x100000000000002C5C85FDF473DEA871F >> 128;
      if (x & 0x200 > 0)
        result = result * 0x10000000000000162E42FEFA39EF44D91 >> 128;
      if (x & 0x100 > 0)
        result = result * 0x100000000000000B17217F7D1CF79E949 >> 128;
      if (x & 0x80 > 0)
        result = result * 0x10000000000000058B90BFBE8E7BCE544 >> 128;
      if (x & 0x40 > 0)
        result = result * 0x1000000000000002C5C85FDF473DE6ECA >> 128;
      if (x & 0x20 > 0)
        result = result * 0x100000000000000162E42FEFA39EF366F >> 128;
      if (x & 0x10 > 0)
        result = result * 0x1000000000000000B17217F7D1CF79AFA >> 128;
      if (x & 0x8 > 0)
        result = result * 0x100000000000000058B90BFBE8E7BCD6D >> 128;
      if (x & 0x4 > 0)
        result = result * 0x10000000000000002C5C85FDF473DE6B2 >> 128;
      if (x & 0x2 > 0)
        result = result * 0x1000000000000000162E42FEFA39EF358 >> 128;
      if (x & 0x1 > 0)
        result = result * 0x10000000000000000B17217F7D1CF79AB >> 128;

      result >>= uint256 (int256 (63 - (x >> 64)));
      require (result <= uint256 (int256 (MAX_64x64)));

      return int128 (int256 (result));
    }
  }

  /**
   * Calculate natural exponent of x.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function exp (int128 x) internal pure returns (int128) {
    unchecked {
      require (x < 0x400000000000000000); // Overflow

      if (x < -0x400000000000000000) return 0; // Underflow

      return exp_2 (
          int128 (int256 (x) * 0x171547652B82FE1777D0FFDA0D23A7D12 >> 128));
    }
  }

  /**
   * Calculate x / y rounding towards zero, where x and y are unsigned 256-bit
   * integer numbers.  Revert on overflow or when y is zero.
   *
   * @param x unsigned 256-bit integer number
   * @param y unsigned 256-bit integer number
   * @return unsigned 64.64-bit fixed point number
   */
  function divuu (uint256 x, uint256 y) private pure returns (uint128) {
    unchecked {
      require (y != 0);

      uint256 result;

      if (x <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
        result = (x << 64) / y;
      else {
        uint256 msb = 192;
        uint256 xc = x >> 192;
        if (xc >= 0x100000000) { xc >>= 32; msb += 32; }
        if (xc >= 0x10000) { xc >>= 16; msb += 16; }
        if (xc >= 0x100) { xc >>= 8; msb += 8; }
        if (xc >= 0x10) { xc >>= 4; msb += 4; }
        if (xc >= 0x4) { xc >>= 2; msb += 2; }
        if (xc >= 0x2) msb += 1;  // No need to shift xc anymore

        result = (x << 255 - msb) / ((y - 1 >> msb - 191) + 1);
        require (result <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);

        uint256 hi = result * (y >> 128);
        uint256 lo = result * (y & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);

        uint256 xh = x >> 192;
        uint256 xl = x << 64;

        if (xl < lo) xh -= 1;
        xl -= lo; // We rely on overflow behavior here
        lo = hi << 128;
        if (xl < lo) xh -= 1;
        xl -= lo; // We rely on overflow behavior here

        assert (xh == hi >> 128);

        result += xl / y;
      }

      require (result <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
      return uint128 (result);
    }
  }

  /**
   * Calculate sqrt (x) rounding down, where x is unsigned 256-bit integer
   * number.
   *
   * @param x unsigned 256-bit integer number
   * @return unsigned 128-bit integer number
   */
  function sqrtu (uint256 x) private pure returns (uint128) {
    unchecked {
      if (x == 0) return 0;
      else {
        uint256 xx = x;
        uint256 r = 1;
        if (xx >= 0x100000000000000000000000000000000) { xx >>= 128; r <<= 64; }
        if (xx >= 0x10000000000000000) { xx >>= 64; r <<= 32; }
        if (xx >= 0x100000000) { xx >>= 32; r <<= 16; }
        if (xx >= 0x10000) { xx >>= 16; r <<= 8; }
        if (xx >= 0x100) { xx >>= 8; r <<= 4; }
        if (xx >= 0x10) { xx >>= 4; r <<= 2; }
        if (xx >= 0x4) { r <<= 1; }
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1; // Seven iterations should be enough
        uint256 r1 = x / r;
        return uint128 (r < r1 ? r : r1);
      }
    }
  }
}


// SPDX-License-Identifier: GPL-3.0-or-later
contract DemurrageTokenSingleNocap {

	struct redistributionItem {
		uint32 period;
		uint72 value;
		uint64 demurrage;
	}
	redistributionItem[] public redistributions;

	// Account balances
	mapping (address => uint256) account;
	
	// Cached demurrage amount, ppm with 38 digit resolution
	//uint128 public demurrageAmount;
	int128 public demurrageAmount;

	// Cached demurrage timestamp; the timestamp for which demurrageAmount was last calculated
	uint256 public demurrageTimestamp;

	// Implements EIP173
	address public owner;

	address newOwner;

	// Implements ERC20
	string public name;

	// Implements ERC20
	string public symbol;

	// Implements ERC20
	uint256 public immutable decimals;

	uint256 supply;

	// Last executed period
	uint256 public lastPeriod;

	// Last sink redistribution amount
	uint256 public totalSink;

	// Value of burnt tokens (burnt tokens do not decay)
	uint256 burned;

	// 128 bit resolution of the demurrage divisor
	// (this constant x 1000000 is contained within 128 bits)
	//uint256 constant nanoDivider = 100000000000000000000000000; // now nanodivider, 6 zeros less

	// remaining decimal positions of nanoDivider to reach 38, equals precision in growth and decay
	//uint256 constant growthResolutionFactor = 1000000000000;

	// demurrage decimal width; 38 places
	//uint256 public immutable resolutionFactor = nanoDivider * growthResolutionFactor; 

	// Timestamp of start of periods (time which contract constructor was called)
	uint256 public immutable periodStart;

	// Duration of a single redistribution period in seconds
	uint256 public immutable periodDuration;

	// Demurrage in ppm per minute
	//uint256 public immutable decayLevel;
	// 64x64
	int128 public immutable decayLevel;
		
	// Addresses allowed to mint new tokens
	mapping (address => bool) minter;

	// Storage for ERC20 approve/transferFrom methods
	mapping (address => mapping (address => uint256 ) ) allowance; // holder -> spender -> amount (amount is subject to demurrage)

	// Address to send unallocated redistribution tokens
	address public sinkAddress; 

	// timestamp when token contract expires
	uint256 public expires;
	bool expired;

	// supply xap
	uint256 public maxSupply;

	// Implements ERC20
	event Transfer(address indexed _from, address indexed _to, uint256 _value);

	// Implements ERC20
	event Approval(address indexed _owner, address indexed _spender, uint256 _value);

	// Implements Minter
	event Mint(address indexed _minter, address indexed _beneficiary, uint256 _value);

	// New demurrage cache milestone calculated
	event Decayed(uint256 indexed _period, uint256 indexed _periodCount, int128 indexed _oldAmount, int128 _newAmount);

	// When a new period threshold has been crossed
	event Period(uint256 _period);

	// Redistribution applied on a single eligible account
	event Redistribution(address indexed _account, uint256 indexed _period, uint256 _value);

	// Temporary event used in development, will be removed on prod
	//event Debug(bytes32 _foo);
	event Debug(int128 indexed _foo, uint256 indexed _bar);

	// Implements Burn
	event Burn(address indexed _burner, uint256 _value);

	// EIP173
	event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); // EIP173

	// Implements Expire
	event Expired(uint256 _timestamp);

	// Implements Expire
	event ExpiryChange(uint256 indexed _oldTimestamp, uint256 _newTimestamp);

	event Cap(uint256 indexed _oldCap, uint256 _newCap);

	// Implements Seal
	uint256 public sealState;
	uint8 constant WRITER_STATE = 1;
	uint8 constant SINK_STATE = 2;
	uint8 constant EXPIRY_STATE = 4;
	uint8 constant CAP_STATE = 8;
	// Implements Seal
	uint256 constant public maxSealState = 15;

	// Implements Seal
	event SealStateChange(bool indexed _final, uint256 _sealState);


	constructor(string memory _name, string memory _symbol, uint8 _decimals, int128 _decayLevel, uint256 _periodMinutes, address _defaultSinkAddress) {
		require(_decayLevel < (1 << 64));
		redistributionItem memory initialRedistribution;

		//require(ABDKMath64x64.toUInt(_decayLevel) == 0);

		// ACL setup
		owner = msg.sender;

		// ERC20 setup
		name = _name;
		symbol = _symbol;
		decimals = _decimals;

		// Demurrage setup
		demurrageTimestamp = block.timestamp;
		periodStart = demurrageTimestamp;
		periodDuration = _periodMinutes * 60;
		demurrageAmount = ABDKMath64x64.fromUInt(1);

		decayLevel = ABDKMath64x64.ln(_decayLevel);
		initialRedistribution = toRedistribution(0, demurrageAmount, 0, 1);
		redistributions.push(initialRedistribution);

		// Misc settings
		sinkAddress = _defaultSinkAddress;
	}

	function seal(uint256 _state) public returns(uint256) {
		require(_state < 16, 'ERR_INVALID_STATE');
		require(_state & sealState == 0, 'ERR_ALREADY_LOCKED');
		sealState |= _state;
		emit SealStateChange(sealState == maxSealState, sealState);
		return uint256(sealState);
	}

	function isSealed(uint256 _state) public view returns(bool) {
		require(_state < maxSealState);
		if (_state == 0) {
			return sealState == maxSealState;
		}
		return _state & sealState == _state;
	}

	// Set when token expires. 
	// Value is set it terms of redistribution periods.
	// Cannot be set to a time in the past.
	function setExpirePeriod(uint256 _expirePeriod) public {
		uint256 r;
		uint256 oldTimestamp;

		require(!isSealed(EXPIRY_STATE));
		require(!expired);
		require(msg.sender == owner);
		r = periodStart + (_expirePeriod * periodDuration);
		require(r > expires);
		oldTimestamp = expires;
		expires = r;
		emit ExpiryChange(oldTimestamp, expires);
	}

	// Change max token supply.
	// Can only increase supply cap, not decrease.
	function setMaxSupply(uint256 _cap) public {
		require(!isSealed(CAP_STATE));
		require(msg.sender == owner);
		require(_cap > totalSupply());
		emit Cap(maxSupply, _cap);
		maxSupply = _cap;
	}

	// Change sink address for redistribution
	function setSinkAddress(address _sinkAddress) public {
		require(!isSealed(SINK_STATE));
		require(msg.sender == owner);
		sinkAddress = _sinkAddress;
	}

	// Expire the contract if expire is set and we have gone over the threshold.
	// Finalizes demurrage up to the timestamp of the expiry. 
	// The first approve, transfer or transferFrom call that hits the ex == 2 will get the tx mined. but without the actual effect. Otherwise we would have to wait until an external egent called applyExpiry to get the correct final balance.
	// Implements Expire
	function applyExpiry() public returns(uint8) {
		if (expired) {
			return 1;
		}
		if (expires == 0) {
			return 0;
		}
		if (block.timestamp >= expires) {
			applyDemurrageLimited(expires - demurrageTimestamp / 60);
			expired = true;
			emit Expired(block.timestamp);
			changePeriod();
			return 2;
		}
		return 0;
	}

	// Given address will be allowed to call the mintTo() function
	// Implements Writer
	function addWriter(address _minter) public returns (bool) {
		require(!isSealed(WRITER_STATE));
		require(msg.sender == owner);
		minter[_minter] = true;
		return true;
	}

	// Given address will no longer be allowed to call the mintTo() function
	// Implements Writer
	function deleteWriter(address _minter) public returns (bool) {
		require(!isSealed(WRITER_STATE));
		require(msg.sender == owner || _minter == msg.sender);
		minter[_minter] = false;
		return true;
	}

	// Implements Writer
	function isWriter(address _minter) public view returns(bool) {
		return minter[_minter];
	}

	/// Implements ERC20
	function balanceOf(address _account) public view returns (uint256) {
		int128 baseBalance;
		int128 currentDemurragedAmount;
		uint256 periodCount;

		baseBalance = ABDKMath64x64.fromUInt(baseBalanceOf(_account));

		periodCount = getMinutesDelta(demurrageTimestamp);

		currentDemurragedAmount = ABDKMath64x64.mul(baseBalance, demurrageAmount);
		return decayBy(ABDKMath64x64.toUInt(currentDemurragedAmount), periodCount);
	}

	// Balance unmodified by demurrage
	function baseBalanceOf(address _account) public view returns (uint256) {
		return account[_account];
	}

	/// Increases base balance for a single account
	function increaseBaseBalance(address _account, uint256 _delta) private returns (bool) {
		uint256 oldBalance;
		uint256 workAccount;

		workAccount = uint256(account[_account]);
	
		if (_delta == 0) {
			return false;
		}

		oldBalance = baseBalanceOf(_account);
		account[_account] = oldBalance + _delta;
		return true;
	}

	/// Decreases base balance for a single account
	function decreaseBaseBalance(address _account, uint256 _delta) private returns (bool) {
		uint256 oldBalance;
		uint256 workAccount;

		workAccount = uint256(account[_account]);

		if (_delta == 0) {
			return false;
		}

		oldBalance = baseBalanceOf(_account);	
		require(oldBalance >= _delta, 'ERR_OVERSPEND'); // overspend guard
		account[_account] = oldBalance - _delta;
		return true;
	}

	// Send full balance of one account to another
	function sweep(address _account) public returns (uint256) {
		uint256 v;

		v = account[msg.sender];
		account[msg.sender] = 0;
		account[_account] += v;
		return v;
	}

	// Creates new tokens out of thin air, and allocates them to the given address
	// Triggers tax
	// Implements Minter
	function mintTo(address _beneficiary, uint256 _amount) public returns (bool) {
		uint256 baseAmount;

		require(applyExpiry() == 0);
		require(minter[msg.sender] || msg.sender == owner, 'ERR_ACCESS');

		changePeriod();
		if (maxSupply > 0) {
			require(supply + _amount <= maxSupply);
		}
		supply += _amount;

		baseAmount = toBaseAmount(_amount);
		increaseBaseBalance(_beneficiary, baseAmount);
		emit Mint(msg.sender, _beneficiary, _amount);
		saveRedistributionSupply();
		return true;
	}

	// Implements Minter
	function mint(address _beneficiary, uint256 _amount, bytes calldata _data) public {
		_data;
		mintTo(_beneficiary, _amount);
	}

	// Implements Minter
	function safeMint(address _beneficiary, uint256 _amount, bytes calldata _data) public {
		_data;
		mintTo(_beneficiary, _amount);
	}

	// Deserializes the redistribution word
	function toRedistribution(uint256 _participants, int128 _demurrageModifier, uint256 _value, uint256 _period) public pure returns(redistributionItem memory) {
		redistributionItem memory redistribution;

		redistribution.period = uint32(_period);
		redistribution.value = uint72(_value);
		redistribution.demurrage = uint64(uint128(_demurrageModifier) & 0xffffffffffffffff);
		_participants;
		return redistribution;

	}

	// Serializes the demurrage period part of the redistribution word
	function toRedistributionPeriod(redistributionItem memory _redistribution) public pure returns (uint256) {
		return uint256(_redistribution.period);
	}

	// Serializes the supply part of the redistribution word
	function toRedistributionSupply(redistributionItem memory _redistribution) public pure returns (uint256) {
		return uint256(_redistribution.value);
	}

	// Serializes the number of participants part of the redistribution word
	function toRedistributionDemurrageModifier(redistributionItem memory _redistribution) public pure returns (int128) {
		int128 r;

		r = int128(int64(_redistribution.demurrage) & int128(0x0000000000000000ffffffffffffffff));
		if (r == 0) {
			r = ABDKMath64x64.fromUInt(1);
		}
		return r;
	}

	// Client accessor to the redistributions array length
	function redistributionCount() public view returns (uint256) {
		return redistributions.length;
	}

	// Save the current total supply amount to the current redistribution period
	function saveRedistributionSupply() private returns (bool) {
		redistributionItem memory currentRedistribution;
		uint256 grownSupply;

		grownSupply = totalSupply();
		currentRedistribution = redistributions[redistributions.length-1];
		currentRedistribution.value = uint72(grownSupply);

		redistributions[redistributions.length-1] = currentRedistribution;
		return true;
	}

	// Get the demurrage period of the current block number
	function actualPeriod() public view returns (uint128) {
		return uint128((block.timestamp - periodStart) / periodDuration + 1);
	}

	// Retrieve next redistribution if the period threshold has been crossed
	function checkPeriod() private view returns (redistributionItem memory) {
		redistributionItem memory lastRedistribution;
		redistributionItem memory emptyRedistribution;
		uint256 currentPeriod;

		lastRedistribution =  redistributions[lastPeriod];
		currentPeriod = this.actualPeriod();
		if (currentPeriod <= toRedistributionPeriod(lastRedistribution)) {
			return emptyRedistribution;
		}
		return lastRedistribution;
	}

	function getDistribution(uint256 _supply, int128 _demurrageAmount) public pure returns (uint256) {
		int128 difference;

		difference = ABDKMath64x64.mul(ABDKMath64x64.fromUInt(_supply), ABDKMath64x64.sub(ABDKMath64x64.fromUInt(1), _demurrageAmount));
		return _supply - ABDKMath64x64.toUInt(difference);
			
	}

	function getDistributionFromRedistribution(redistributionItem memory _redistribution) public pure returns (uint256) {
		uint256 redistributionSupply;
		int128 redistributionDemurrage;

		redistributionSupply = toRedistributionSupply(_redistribution);
		redistributionDemurrage = toRedistributionDemurrageModifier(_redistribution);
		return getDistribution(redistributionSupply, redistributionDemurrage);
	}

	// Returns the amount sent to the sink address
	function applyDefaultRedistribution(redistributionItem memory _redistribution) private returns (uint256) {
		uint256 unit;
		uint256 baseUnit;
	
		unit = totalSupply() - getDistributionFromRedistribution(_redistribution);	
		baseUnit = toBaseAmount(unit) - totalSink;
		increaseBaseBalance(sinkAddress, baseUnit);
		emit Redistribution(sinkAddress, _redistribution.period, unit);
		lastPeriod += 1;
		totalSink += baseUnit;
		return unit;
	}

	// Recalculate the demurrage modifier for the new period
	// Note that the supply for the consecutive period will be taken at the time of code execution, and thus not necessarily at the time when the redistribution period threshold was crossed.
	function changePeriod() public returns (bool) {
		redistributionItem memory currentRedistribution;
		redistributionItem memory nextRedistribution;
		redistributionItem memory lastRedistribution;
		uint256 currentPeriod;
		int128 lastDemurrageAmount;
		int128 nextRedistributionDemurrage;
		uint256 demurrageCounts;
		uint256 nextPeriod;

		applyDemurrage();
		currentRedistribution = checkPeriod();
		if (isEmptyRedistribution(currentRedistribution)) {
			return false;
		}

		// calculate the decay from previous redistributino
		lastRedistribution = redistributions[lastPeriod];
		currentPeriod = toRedistributionPeriod(currentRedistribution);
		nextPeriod = currentPeriod + 1;
		lastDemurrageAmount = toRedistributionDemurrageModifier(lastRedistribution);
		demurrageCounts = (periodDuration * currentPeriod) / 60;
		// TODO refactor decayby to take int128 then DRY with it
		nextRedistributionDemurrage = ABDKMath64x64.exp(ABDKMath64x64.mul(decayLevel, ABDKMath64x64.fromUInt(demurrageCounts)));
		nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply(), nextPeriod);
		redistributions.push(nextRedistribution);

		applyDefaultRedistribution(nextRedistribution);
		emit Period(nextPeriod);
		return true;
	}

	// Calculate the time delta in whole minutes passed between given timestamp and current timestamp
	function getMinutesDelta(uint256 _lastTimestamp) public view returns (uint256) {
		return (block.timestamp - _lastTimestamp) / 60;
	}

	// Calculate and cache the demurrage value corresponding to the (period of the) time of the method call
	function applyDemurrage() public returns (uint256) {
		return applyDemurrageLimited(0);
	}

	// returns true if expired
	function applyDemurrageLimited(uint256 _rounds) public returns (uint256) {
		int128 v;
		uint256 periodCount;
		int128 periodPoint;
		int128 lastDemurrageAmount;

		if (expired) {
			return 0; 
		}

		periodCount = getMinutesDelta(demurrageTimestamp);
		if (periodCount == 0) {
			return 0;
		}
		lastDemurrageAmount = demurrageAmount;
	
		// safety limit for exponential calculation to ensure that we can always
		// execute this code no matter how much time passes.			
		if (_rounds > 0 && _rounds < periodCount) {
			periodCount = _rounds;
		}

		periodPoint = ABDKMath64x64.fromUInt(periodCount);
		v = ABDKMath64x64.mul(decayLevel, periodPoint);
		v = ABDKMath64x64.exp(v);
		demurrageAmount = ABDKMath64x64.mul(demurrageAmount, v);

		demurrageTimestamp = demurrageTimestamp + (periodCount * 60);
		emit Decayed(demurrageTimestamp, periodCount, lastDemurrageAmount, demurrageAmount);
		return periodCount;
	}

	// Return timestamp of start of period threshold
	function getPeriodTimeDelta(uint256 _periodCount) public view returns (uint256) {
		return periodStart + (_periodCount * periodDuration);
	}

	// Amount of demurrage cycles inbetween the current timestamp and the given target time
	function demurrageCycles(uint256 _target) public view returns (uint256) {
		return (block.timestamp - _target) / 60;
	}

	// Equality check for empty redistribution data
	function isEmptyRedistribution(redistributionItem memory _redistribution) public pure returns(bool) {
		if (_redistribution.period > 0) {
			return false;
		}
		if (_redistribution.value > 0) {
			return false;
		}
		if (_redistribution.demurrage > 0) {
			return false;
		}
		return true;
	}


	// Calculate a value reduced by demurrage by the given period
	function decayBy(uint256 _value, uint256 _period)  public view returns (uint256) {
		int128 valuePoint;
		int128 periodPoint;
		int128 v;
	
		valuePoint = ABDKMath64x64.fromUInt(_value);
		periodPoint = ABDKMath64x64.fromUInt(_period);

		v = ABDKMath64x64.mul(decayLevel, periodPoint);
		v = ABDKMath64x64.exp(v);
		v = ABDKMath64x64.mul(valuePoint, v);
		return ABDKMath64x64.toUInt(v);
	}


	// Inflates the given amount according to the current demurrage modifier
	function toBaseAmount(uint256 _value) public view returns (uint256) {
		int128 r;
		r = ABDKMath64x64.div(ABDKMath64x64.fromUInt(_value), demurrageAmount);
		return ABDKMath64x64.toUInt(r);
	}

	// Triggers tax and/or redistribution
	// Implements ERC20
	function approve(address _spender, uint256 _value) public returns (bool) {
		uint256 baseValue;
		uint8 ex;

		ex = applyExpiry();
		if (ex == 2) {
			return false;	
		} else if (ex > 0) {
			revert('EXPIRED');
		}
		if (allowance[msg.sender][_spender] > 0) {
			require(_value == 0, 'ZERO_FIRST');
		}
		
		changePeriod();

		baseValue = toBaseAmount(_value);
		allowance[msg.sender][_spender] = baseValue;
		emit Approval(msg.sender, _spender, _value);
		return true;
	}

	// Reduce allowance by amount
	function decreaseAllowance(address _spender, uint256 _value) public returns (bool) {
		uint256 baseValue;

		baseValue = toBaseAmount(_value);
		require(allowance[msg.sender][_spender] >= baseValue);
		
		changePeriod();

		allowance[msg.sender][_spender] -= baseValue;
		emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]);
		return true;
	}

	// Increase allowance by amount
	function increaseAllowance(address _spender, uint256 _value) public returns (bool) {
		uint256 baseValue;

		changePeriod();

		baseValue = toBaseAmount(_value);

		allowance[msg.sender][_spender] += baseValue;
		emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]);
		return true;
	}

	// Triggers tax and/or redistribution
	// Implements ERC20
	function transfer(address _to, uint256 _value) public returns (bool) {
		uint256 baseValue;
		bool result;
		uint8 ex;

		ex = applyExpiry();
		if (ex == 2) {
			return false;	
		} else if (ex > 0) {
			revert('EXPIRED');
		}
		changePeriod();

		baseValue = toBaseAmount(_value);
		result = transferBase(msg.sender, _to, baseValue);
		emit Transfer(msg.sender, _to, _value);
		return result;
	}

	// Triggers tax and/or redistribution
	// Implements ERC20
	function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
		uint256 baseValue;
		bool result;
		uint8 ex;

		ex = applyExpiry();
		if (ex == 2) {
			return false;	
		} else if (ex > 0) {
			revert('EXPIRED');
		}
		changePeriod();

		baseValue = toBaseAmount(_value);
		require(allowance[_from][msg.sender] >= baseValue);

		allowance[_from][msg.sender] -= baseValue;
		result = transferBase(_from, _to, baseValue);

		emit Transfer(_from, _to, _value);
		return result;
	}

	// ERC20 transfer backend for transfer, transferFrom
	function transferBase(address _from, address _to, uint256 _value) private returns (bool) {
		decreaseBaseBalance(_from, _value);
		increaseBaseBalance(_to, _value);

		return true;
	}

	// Implements EIP173
	function transferOwnership(address _newOwner) public returns (bool) {
		address oldOwner;

		require(msg.sender == owner);
		oldOwner = owner;
		owner = _newOwner;

		emit OwnershipTransferred(oldOwner, owner);
		return true;
	}

	// Explicitly and irretrievably burn tokens
	// Only token minters can burn tokens
	// Implements Burner
	function burn(uint256 _value) public returns(bool) {
		require(applyExpiry() == 0);
		require(minter[msg.sender] || msg.sender == owner, 'ERR_ACCESS');
		require(_value <= account[msg.sender]);
		uint256 _delta = toBaseAmount(_value);

		//applyDemurrage();
		decreaseBaseBalance(msg.sender, _delta);
		burned += _value;
		emit Burn(msg.sender, _value);
		return true;
	}

	// Implements Burner
	function burn(address _from, uint256 _value, bytes calldata _data) public {
		require(_from == msg.sender, 'ERR_ONLY_SELF_BURN');
		_data;
		burn(_value);
	}

	// Implements Burner
	function burn() public returns(bool) {
		return burn(account[msg.sender]);
	}

	// Implements ERC20
	function totalSupply() public view returns (uint256) {
		return supply - burned;
	}

	// Return total number of burned tokens
	// Implements Burner
	function totalBurned() public view returns (uint256) {
		return burned;
	}

	// Return total number of tokens ever minted
	// Implements Burner
	function totalMinted() public view returns (uint256) {
		return supply;
	}


	// Implements EIP165
	function supportsInterface(bytes4 _sum) public pure returns (bool) {
		if (_sum == 0xb61bc941) { // ERC20
			return true;
		}
		if (_sum == 0x5878bcf4) { // Minter
			return true;
		}
		if (_sum == 0xbc4babdd) { // Burner
			return true;
		}
		if (_sum == 0x0d7491f8) { // Seal
			return true;
		}
		if (_sum == 0xabe1f1f5) { // Writer
			return true;
		}
		if (_sum == 0x841a0e94) { // Expire
			return true;
		}
		if (_sum == 0x01ffc9a7) { // ERC165
			return true;
		}
		if (_sum == 0x9493f8b2) { // ERC173
			return true;
		}
		if (_sum == 0xd0017968) { // ERC5678Ext20
			return true;
		}
		return false;
	}
}

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_decayLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newTimestamp","type":"uint256"}],"name":"ExpiryChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decayLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"sweep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

6101006040523480156200001257600080fd5b50604051620066d8380380620066d8833981810160405281019062000038919062000863565b6801000000000000000083600f0b126200005157600080fd5b6200005b62000578565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b84565b508560079081620000bf919062000b84565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c9a565b60c08181525050620001126001620002a9640100000000026200325b176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016c84620002d06401000000000262003281176401000000009004565b600f0b60e081600f0b81525050620001a86000600260009054906101000a9004600f0b6000600162000324640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000ce5565b6000677fffffffffffffff821115620002c157600080fd5b6040829060020a029050919050565b60008082600f0b13620002e257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6200030f84620003a8640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b6200032e62000578565b6200033862000578565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003ba57600080fd5b60008083600f0b9050680100000000000000008112620003f6576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811262000425576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000452576010819060008212600003808260020a82851804189250505090506010820191505b61010081126200047e576008819060008212600003808260020a82851804189250505090506008820191505b60108112620004a9576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004d4576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004e4576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156200056b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000511565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061d82620005d2565b810181811067ffffffffffffffff821117156200063f576200063e620005e3565b5b80604052505050565b600062000654620005b4565b905062000662828262000612565b919050565b600067ffffffffffffffff821115620006855762000684620005e3565b5b6200069082620005d2565b9050602081019050919050565b60005b83811015620006bd578082015181840152602081019050620006a0565b60008484015250505050565b6000620006e0620006da8462000667565b62000648565b905082815260208101848484011115620006ff57620006fe620005cd565b5b6200070c8482856200069d565b509392505050565b600082601f8301126200072c576200072b620005c8565b5b81516200073e848260208601620006c9565b91505092915050565b600060ff82169050919050565b6200075f8162000747565b81146200076b57600080fd5b50565b6000815190506200077f8162000754565b92915050565b600081600f0b9050919050565b6200079d8162000785565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000819050919050565b620007d881620007c3565b8114620007e457600080fd5b50565b600081519050620007f881620007cd565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082b82620007fe565b9050919050565b6200083d816200081e565b81146200084957600080fd5b50565b6000815190506200085d8162000832565b92915050565b60008060008060008060c08789031215620008835762000882620005be565b5b600087015167ffffffffffffffff811115620008a457620008a3620005c3565b5b620008b289828a0162000714565b965050602087015167ffffffffffffffff811115620008d657620008d5620005c3565b5b620008e489828a0162000714565b9550506040620008f789828a016200076e565b94505060606200090a89828a01620007ac565b93505060806200091d89828a01620007e7565b92505060a06200093089828a016200084c565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200099057607f821691505b602082108103620009a657620009a562000948565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009d1565b62000a1f8683620009d1565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a6262000a5c62000a5684620007c3565b62000a37565b620007c3565b9050919050565b6000819050919050565b62000a7e8362000a41565b62000a9662000a8d8262000a69565b848454620009e1565b825550505050565b600090565b62000aad62000a9e565b62000aba81848462000a73565b505050565b5b8181101562000ae25762000ad660008262000aa3565b60018101905062000ac0565b5050565b601f82111562000b315762000afb81620009ac565b62000b0684620009c1565b8101602085101562000b16578190505b62000b2e62000b2585620009c1565b83018262000abf565b50505b505050565b60008160020a8304905092915050565b600062000b596000198460080262000b36565b1980831691505092915050565b600062000b74838362000b46565b9150826002028217905092915050565b62000b8f826200093d565b67ffffffffffffffff81111562000bab5762000baa620005e3565b5b62000bb7825462000977565b62000bc482828562000ae6565b600060209050601f83116001811462000bfc576000841562000be7578287015190505b62000bf3858262000b66565b86555062000c63565b601f19841662000c0c86620009ac565b60005b8281101562000c365784890151825560018201915060208501945060208101905062000c0f565b8683101562000c56578489015162000c52601f89168262000b46565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ca782620007c3565b915062000cb483620007c3565b925082820262000cc481620007c3565b9150828204841483151762000cde5762000cdd62000c6b565b5b5092915050565b60805160a05160c05160e05161597362000d65600039600081816117f1015281816126dc015281816128c90152612cc5015260008181611f3e0152818161269f01528181612c1d01528181612e62015261308a015260008181611f6a01528181612e8e015281816130ab01526130f00152600061184f01526159736000f3fe608060405234801561001057600080fd5b50600436106103d7576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e11610211578063a2309ff811610137578063d7a52fa9116100ca578063e69571af11610099578063e69571af14610ca8578063e809529514610cd8578063eda4e6d614610cf6578063f2fde38b14610d14576103d7565b8063d7a52fa914610c0e578063d89135cd14610c2a578063da2824a814610c48578063e54063a614610c78576103d7565b8063b470aade11610106578063b470aade14610b84578063c0ab707714610ba2578063d340ef8a14610bd2578063d5abeb0114610bf0576103d7565b8063a2309ff814610ae8578063a457c2d714610b06578063a9059cbb14610b36578063b1cb0db314610b66576103d7565b806386fe212d116101af5780638f1df6bc1161017e5780638f1df6bc14610a7257806394d008ef14610a9057806395d89b4114610aac5780639f24880814610aca576103d7565b806386fe212d146109ec5780638832e6e314610a1c5780638da5cb5b14610a385780638f0b2d5d14610a56576103d7565b8063731f237c116101eb578063731f237c146109625780637445e33a1461098057806374bedb95146109b057806384dde4af146109ce576103d7565b80636a2d094e146108e65780636f8b44b01461091657806370a0823114610932576103d7565b8063313334871161030157806344df8e701161029457806358b2833b1161026357806358b2833b1461084a5780635ae06f7e146108685780635f408c04146108985780636787a9be146108b6576103d7565b806344df8e701461079c57806347a50517146107ba5780634abfbba2146107ea57806351b4541c1461081a576103d7565b806340452d91116102d057806340452d91146106ee57806342966c6814610720578063449a52f81461075057806344d1718714610780576103d7565b80633133348714610652578063313ce5671461068257806331a5995d146106a057806339509351146106be576103d7565b806318cbbcfc1161037957806323b872dd1161034857806323b872dd146105925780632a7aec09146105c25780632b29ba23146105f25780632c1758c114610622576103d7565b806318cbbcfc146104f65780631989c6a814610514578063213d1e1e1461053257806323a8594414610562576103d7565b8063095ea7b3116103b5578063095ea7b31461045a57806309f28f3c1461048a57806311c56615146104a857806318160ddd146104d8576103d7565b806301681a62146103dc57806301ffc9a71461040c57806306fdde031461043c575b600080fd5b6103f660048036038101906103f19190614be8565b610d44565b6040516104039190614c2e565b60405180910390f35b61042660048036038101906104219190614ca1565b610e2d565b6040516104339190614ce9565b60405180910390f35b61044461111b565b6040516104519190614d94565b60405180910390f35b610474600480360381019061046f9190614de2565b6111a9565b6040516104819190614ce9565b60405180910390f35b6104926113e5565b60405161049f9190614e3e565b60405180910390f35b6104c260048036038101906104bd9190614e85565b6113f8565b6040516104cf9190614c2e565b60405180910390f35b6104e0611448565b6040516104ed9190614c2e565b60405180910390f35b6104fe61145f565b60405161050b9190614c2e565b60405180910390f35b61051c611464565b6040516105299190614c2e565b60405180910390f35b61054c60048036038101906105479190615066565b611470565b6040516105599190614c2e565b60405180910390f35b61057c60048036038101906105779190615066565b611489565b6040516105899190614ce9565b60405180910390f35b6105ac60048036038101906105a79190615093565b6114f1565b6040516105b99190614ce9565b60405180910390f35b6105dc60048036038101906105d79190615066565b61170f565b6040516105e99190614e3e565b60405180910390f35b61060c60048036038101906106079190614be8565b611747565b6040516106199190614ce9565b60405180910390f35b61063c600480360381019061063791906150e6565b61179d565b6040516106499190614ce9565b60405180910390f35b61066c60048036038101906106679190615113565b6117d0565b6040516106799190614c2e565b60405180910390f35b61068a61184d565b6040516106979190614c2e565b60405180910390f35b6106a8611871565b6040516106b59190614c2e565b60405180910390f35b6106d860048036038101906106d39190614de2565b611877565b6040516106e59190614ce9565b60405180910390f35b610708600480360381019061070391906150e6565b611a0d565b60405161071793929190615180565b60405180910390f35b61073a600480360381019061073591906150e6565b611a7c565b6040516107479190614ce9565b60405180910390f35b61076a60048036038101906107659190614de2565b611c4d565b6040516107779190614ce9565b60405180910390f35b61079a6004803603810190610795919061521c565b611e24565b005b6107a4611ea2565b6040516107b19190614ce9565b60405180910390f35b6107d460048036038101906107cf9190614be8565b611ef1565b6040516107e19190614c2e565b60405180910390f35b61080460048036038101906107ff91906150e6565b611f3a565b6040516108119190614c2e565b60405180910390f35b610834600480360381019061082f91906150e6565b611f9a565b6040516108419190614c2e565b60405180910390f35b610852611fbb565b60405161085f9190614c2e565b60405180910390f35b610882600480360381019061087d9190614be8565b611fc1565b60405161088f9190614ce9565b60405180910390f35b6108a06120cb565b6040516108ad91906152ac565b60405180910390f35b6108d060048036038101906108cb91906150e6565b612198565b6040516108dd9190614c2e565b60405180910390f35b61090060048036038101906108fb91906150e6565b6121d9565b60405161090d9190614c2e565b60405180910390f35b610930600480360381019061092b91906150e6565b6121fa565b005b61094c60048036038101906109479190614be8565b6122c2565b6040516109599190614c2e565b60405180910390f35b61096a612329565b6040516109779190614c2e565b60405180910390f35b61099a60048036038101906109959190615066565b61233a565b6040516109a79190614c2e565b60405180910390f35b6109b8612368565b6040516109c59190614c2e565b60405180910390f35b6109d661236e565b6040516109e391906152d6565b60405180910390f35b610a066004803603810190610a0191906150e6565b612394565b604051610a139190614c2e565b60405180910390f35b610a366004803603810190610a31919061521c565b61247b565b005b610a4061248c565b604051610a4d91906152d6565b60405180910390f35b610a706004803603810190610a6b9190614be8565b6124b2565b005b610a7a612567565b604051610a879190614ce9565b60405180910390f35b610aaa6004803603810190610aa5919061521c565b612828565b005b610ab4612839565b604051610ac19190614d94565b60405180910390f35b610ad26128c7565b604051610adf9190614e3e565b60405180910390f35b610af06128eb565b604051610afd9190614c2e565b60405180910390f35b610b206004803603810190610b1b9190614de2565b6128f5565b604051610b2d9190614ce9565b60405180910390f35b610b506004803603810190610b4b9190614de2565b612b14565b604051610b5d9190614ce9565b60405180910390f35b610b6e612c15565b604051610b7b9190614c2e565b60405180910390f35b610b8c612c1b565b604051610b999190614c2e565b60405180910390f35b610bbc6004803603810190610bb791906150e6565b612c3f565b604051610bc99190614c2e565b60405180910390f35b610bda612dc6565b604051610be79190614c2e565b60405180910390f35b610bf8612dcc565b604051610c059190614c2e565b60405180910390f35b610c286004803603810190610c2391906150e6565b612dd2565b005b610c32612f12565b604051610c3f9190614c2e565b60405180910390f35b610c626004803603810190610c5d9190614be8565b612f1c565b604051610c6f9190614ce9565b60405180910390f35b610c926004803603810190610c8d9190615066565b612ff0565b604051610c9f9190614c2e565b60405180910390f35b610cc26004803603810190610cbd91906152f1565b613004565b604051610ccf91906153c7565b60405180910390f35b610ce0613084565b604051610ced919061540d565b60405180910390f35b610cfe6130ee565b604051610d0b9190614c2e565b60405180910390f35b610d2e6004803603810190610d299190614be8565b613112565b604051610d3b9190614ce9565b60405180910390f35b600080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e1d9190615457565b9250508190555080915050919050565b600063b61bc9417c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e815760019050611116565b635878bcf47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ed35760019050611116565b63bc4babdd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f255760019050611116565b630d7491f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f775760019050611116565b63abe1f1f57c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610fc95760019050611116565b63841a0e947c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361101b5760019050611116565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361106d5760019050611116565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036110bf5760019050611116565b63d00179687c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036111115760019050611116565b600090505b919050565b60068054611128906154ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611154906154ba565b80156111a15780601f10611176576101008083540402835291602001916111a1565b820191906000526020600020905b81548152906001019060200180831161118457829003601f168201915b505050505081565b60008060006111b66120cb565b905060028160ff16036111ce576000925050506113df565b60008160ff161115611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120c90615537565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156112de57600084146112dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d4906155a3565b60405180910390fd5b5b6112e6612567565b506112f084612198565b915081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516113d09190614c2e565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b60008061141f6114078561325b565b61141a611414600161325b565b866132c3565b61332a565b905061142a816133a9565b67ffffffffffffffff168461143f91906155c3565b91505092915050565b6000600b5460085461145a91906155c3565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600080826000015163ffffffff1611156114a657600090506114ec565b6000826020015168ffffffffffffffffff1611156114c757600090506114ec565b6000826040015167ffffffffffffffff1611156114e757600090506114ec565b600190505b919050565b6000806000806114ff6120cb565b905060028160ff16036115185760009350505050611708565b60008160ff16111561155f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155690615537565b60405180910390fd5b611567612567565b5061157185612198565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156115fc57600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461168891906155c3565b9250508190555061169a8787856133de565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516116f99190614c2e565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b0361173e5761173b600161325b565b90505b80915050919050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600f82106117ac57600080fd5b600082036117c157600f6012541490506117cb565b8160125483161490505b919050565b6000806000806117df8661325b565b92506117ea8561325b565b91506118167f00000000000000000000000000000000000000000000000000000000000000008361332a565b905061182181613401565b905061182d838261332a565b9050611838816133a9565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b600080611882612567565b5061188c83612198565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461191a9190615457565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516119fa9190614c2e565b60405180910390a3600191505092915050565b60008181548110611a1d57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600080611a876120cb565b60ff1614611a9457600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611b395750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6f90615643565b60405180910390fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115611bc457600080fd5b6000611bcf83612198565b9050611bdb338261348e565b5082600b6000828254611bee9190615457565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca584604051611c3b9190614c2e565b60405180910390a26001915050919050565b6000806000611c5a6120cb565b60ff1614611c6757600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611d0c5750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4290615643565b60405180910390fd5b611d53612567565b5060006011541115611d7c5760115483600854611d709190615457565b1115611d7b57600080fd5b5b8260086000828254611d8e9190615457565b92505081905550611d9e83612198565b9050611daa8482613592565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611e089190614c2e565b60405180910390a3611e18613653565b50600191505092915050565b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e89906156af565b60405180910390fd5b611e9b83611a7c565b5050505050565b6000611eec600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a7c565b905090565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611f6891906156cf565b7f0000000000000000000000000000000000000000000000000000000000000000611f939190615457565b9050919050565b6000603c8242611faa91906155c3565b611fb49190615740565b9050919050565b60035481565b6000611fd0600160ff1661179d565b15611fda57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061206157503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61206a57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff16156120eb5760019050612195565b6000600f54036120fe5760009050612195565b600f5442106121905761212b603c6003546121199190615740565b600f5461212691906155c3565b612c3f565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe9426040516121769190614c2e565b60405180910390a1612186612567565b5060029050612195565b600090505b90565b6000806121bc6121a78461325b565b600260009054906101000a9004600f0b613817565b90506121c7816133a9565b67ffffffffffffffff16915050919050565b6000603c82426121e991906155c3565b6121f39190615740565b9050919050565b612207600860ff1661179d565b1561221157600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461226b57600080fd5b612273611448565b811161227e57600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe6826040516122b09190614c2e565b60405180910390a28060118190555050565b6000806000806122d96122d486611ef1565b61325b565b92506122e6600354611f9a565b905061230183600260009054906101000a9004600f0b61332a565b915061231f61230f836133a9565b67ffffffffffffffff16826117d0565b9350505050919050565b60006123356000612c3f565b905090565b600080600061234884611470565b91506123538461170f565b905061235f82826113f8565b92505050919050565b600a5481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601082106123d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d0906157bd565b60405180910390fd5b6000601254831614612420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241790615829565b60405180910390fd5b81601260008282541792505081905550600f6012541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e6012546040516124699190614c2e565b60405180910390a26012549050919050565b6124858484611c4d565b5050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6124bf600260ff1661179d565b156124c957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461252357600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612571614b3a565b612579614b3a565b612581614b3a565b6000806000806000612591612329565b5061259a6138a3565b97506125a588611489565b156125bb57600098505050505050505050612825565b6000600954815481106125d1576125d0615849565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061267e88612ff0565b945060018561268d9190615457565b90506126988661170f565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006126c891906156cf565b6126d29190615740565b915061270e6127097f00000000000000000000000000000000000000000000000000000000000000006127048561325b565b61332a565b613401565b925061272460008461271e611448565b84613004565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506127e087613a39565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516128109190614c2e565b60405180910390a16001985050505050505050505b90565b6128328484611c4d565b5050505050565b60078054612846906154ba565b80601f0160208091040260200160405190810160405280929190818152602001828054612872906154ba565b80156128bf5780601f10612894576101008083540402835291602001916128bf565b820191906000526020600020905b8154815290600101906020018083116128a257829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600854905090565b60008061290183612198565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561298c57600080fd5b612994612567565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a2191906155c3565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051612b019190614c2e565b60405180910390a3600191505092915050565b600080600080612b226120cb565b905060028160ff1603612b3b5760009350505050612c0f565b60008160ff161115612b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7990615537565b60405180910390fd5b612b8a612567565b50612b9485612198565b9250612ba13387856133de565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051612c009190614c2e565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff1615612c69576000945050505050612dc1565b612c74600354611f9a565b925060008303612c8b576000945050505050612dc1565b600260009054906101000a9004600f0b9050600086118015612cac57508286105b15612cb5578592505b612cbe8361325b565b9150612cea7f00000000000000000000000000000000000000000000000000000000000000008361332a565b9350612cf584613401565b9350612d10600260009054906101000a9004600f0b8561332a565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612d5891906156cf565b600354612d659190615457565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612db19190614e3e565b60405180910390a4829450505050505b919050565b60095481565b60115481565b600080612de2600460ff1661179d565b15612dec57600080fd5b601060009054906101000a900460ff1615612e0657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e6057600080fd5b7f000000000000000000000000000000000000000000000000000000000000000083612e8c91906156cf565b7f0000000000000000000000000000000000000000000000000000000000000000612eb79190615457565b9150600f548211612ec757600080fd5b600f54905081600f81905550807ff5bd6cb27a0006b5ea8618058a0d84719695cb6d984f4840bc1a54ca12ae4b7c600f54604051612f059190614c2e565b60405180910390a2505050565b6000600b54905090565b6000612f2b600160ff1661179d565b15612f3557600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f8f57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000816000015163ffffffff169050919050565b61300c614b3a565b613014614b3a565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000426130d591906155c3565b6130df9190615740565b6130e99190615457565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461316f57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36001915050919050565b6000677fffffffffffffff82111561327257600080fd5b6040829060020a029050919050565b60008082600f0b1361329257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6132ae84613b58565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561331757506f7fffffffffffffffffffffffffffffff600f0b8113155b61332057600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561339657506f7fffffffffffffffffffffffffffffff600f0b8113155b61339f57600080fd5b8091505092915050565b60008082600f0b12156133bb57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b60006133ea848361348e565b506133f58383613592565b50600190509392505050565b60006840000000000000000082600f0b1261341b57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b121561344f5760009050613489565b6134866080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050613d1e565b90505b919050565b6000806000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600084036134e85760009250505061358c565b6134f185611ef1565b915083821015613536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352d906158c4565b60405180910390fd5b838261354291906155c3565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001925050505b92915050565b6000806000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600084036135ec5760009250505061364d565b6135f585611ef1565b915083826136039190615457565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001925050505b92915050565b600061365d614b3a565b6000613667611448565b90506000600160008054905061367d91906155c3565b8154811061368e5761368d615849565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff1681525050816000600160008054905061376991906155c3565b8154811061377a57613779615849565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361382857600080fd5b600082600f0b604085600f0b9060020a028161384757613846615711565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561389057506f7fffffffffffffffffffffffffffffff600f0b8113155b61389957600080fd5b8091505092915050565b6138ab614b3a565b6138b3614b3a565b6138bb614b3a565b600080600954815481106138d2576138d1615849565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156139dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a019190615910565b6fffffffffffffffffffffffffffffffff169050613a1e83612ff0565b8111613a2f57819350505050613a36565b8293505050505b90565b6000806000613a478461233a565b613a4f611448565b613a5991906155c3565b9150600a54613a6783612198565b613a7191906155c3565b9050613a9f600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682613592565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d384604051613b139190614c2e565b60405180910390a3600160096000828254613b2e9190615457565b9250508190555080600a6000828254613b479190615457565b925050819055508192505050919050565b60008082600f0b13613b6957600080fd5b60008083600f0b9050680100000000000000008112613ba4576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112613bd2576020819060008212600003808260020a82851804189250505090506020820191505b620100008112613bfe576010819060008212600003808260020a82851804189250505090506010820191505b6101008112613c29576008819060008212600003808260020a82851804189250505090506008820191505b60108112613c53576004819060008212600003808260020a82851804189250505090506004820191505b60048112613c7d576002819060008212600003808260020a82851804189250505090506002820191505b60028112613c8c576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b6000811315613d11578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613cb9565b5081945050505050919050565b60006840000000000000000082600f0b12613d3857600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613d6c5760009050614b35565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b1315613dba57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b1315613df35760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315613e2c5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315613e6557608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315613e9e5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613ed7576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613f1057608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613f49576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613f8157608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613fb95760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613ff1576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b13156140295760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315614061576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b131561409957608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b13156140d15760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b131561410957608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b13156141405760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315614177576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b13156141ae57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b13156141e5576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b131561421c57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b13156142535760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b131561428a576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b13156142c15760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b13156142f7576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b131561432d57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b13156143635760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b131561439957608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156143cf5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315614405576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561443b57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315614471576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b13156144a657608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156144db5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315614510576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156145455760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b131561457a576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b13156145af57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156145e45760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561461957608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b131561464d5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315614681576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b13156146b557608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156146e9576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561471d57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156147515760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315614785576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156147b95760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b13156147ec576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561481f57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156148525760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561488557608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156148b85760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b13156148eb576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561491e57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315614951576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561498357608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156149b55760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156149e7576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b1315614a195760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315614a4b576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b1315614a7d57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b1315614aaf5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b1315614ae157608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b811115614b3057600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614bb582614b8a565b9050919050565b614bc581614baa565b8114614bd057600080fd5b50565b600081359050614be281614bbc565b92915050565b600060208284031215614bfe57614bfd614b80565b5b6000614c0c84828501614bd3565b91505092915050565b6000819050919050565b614c2881614c15565b82525050565b6000602082019050614c436000830184614c1f565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614c7e81614c49565b8114614c8957600080fd5b50565b600081359050614c9b81614c75565b92915050565b600060208284031215614cb757614cb6614b80565b5b6000614cc584828501614c8c565b91505092915050565b60008115159050919050565b614ce381614cce565b82525050565b6000602082019050614cfe6000830184614cda565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614d3e578082015181840152602081019050614d23565b60008484015250505050565b6000601f19601f8301169050919050565b6000614d6682614d04565b614d708185614d0f565b9350614d80818560208601614d20565b614d8981614d4a565b840191505092915050565b60006020820190508181036000830152614dae8184614d5b565b905092915050565b614dbf81614c15565b8114614dca57600080fd5b50565b600081359050614ddc81614db6565b92915050565b60008060408385031215614df957614df8614b80565b5b6000614e0785828601614bd3565b9250506020614e1885828601614dcd565b9150509250929050565b600081600f0b9050919050565b614e3881614e22565b82525050565b6000602082019050614e536000830184614e2f565b92915050565b614e6281614e22565b8114614e6d57600080fd5b50565b600081359050614e7f81614e59565b92915050565b60008060408385031215614e9c57614e9b614b80565b5b6000614eaa85828601614dcd565b9250506020614ebb85828601614e70565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614f0282614d4a565b810181811067ffffffffffffffff82111715614f2157614f20614eca565b5b80604052505050565b6000614f34614b76565b9050614f408282614ef9565b919050565b600063ffffffff82169050919050565b614f5e81614f45565b8114614f6957600080fd5b50565b600081359050614f7b81614f55565b92915050565b600068ffffffffffffffffff82169050919050565b614f9f81614f81565b8114614faa57600080fd5b50565b600081359050614fbc81614f96565b92915050565b600067ffffffffffffffff82169050919050565b614fdf81614fc2565b8114614fea57600080fd5b50565b600081359050614ffc81614fd6565b92915050565b60006060828403121561501857615017614ec5565b5b6150226060614f2a565b9050600061503284828501614f6c565b600083015250602061504684828501614fad565b602083015250604061505a84828501614fed565b60408301525092915050565b60006060828403121561507c5761507b614b80565b5b600061508a84828501615002565b91505092915050565b6000806000606084860312156150ac576150ab614b80565b5b60006150ba86828701614bd3565b93505060206150cb86828701614bd3565b92505060406150dc86828701614dcd565b9150509250925092565b6000602082840312156150fc576150fb614b80565b5b600061510a84828501614dcd565b91505092915050565b6000806040838503121561512a57615129614b80565b5b600061513885828601614dcd565b925050602061514985828601614dcd565b9150509250929050565b61515c81614f45565b82525050565b61516b81614f81565b82525050565b61517a81614fc2565b82525050565b60006060820190506151956000830186615153565b6151a26020830185615162565b6151af6040830184615171565b949350505050565b600080fd5b600080fd5b600080fd5b60008083601f8401126151dc576151db6151b7565b5b8235905067ffffffffffffffff8111156151f9576151f86151bc565b5b602083019150836001820283011115615215576152146151c1565b5b9250929050565b6000806000806060858703121561523657615235614b80565b5b600061524487828801614bd3565b945050602061525587828801614dcd565b935050604085013567ffffffffffffffff81111561527657615275614b85565b5b615282878288016151c6565b925092505092959194509250565b600060ff82169050919050565b6152a681615290565b82525050565b60006020820190506152c1600083018461529d565b92915050565b6152d081614baa565b82525050565b60006020820190506152eb60008301846152c7565b92915050565b6000806000806080858703121561530b5761530a614b80565b5b600061531987828801614dcd565b945050602061532a87828801614e70565b935050604061533b87828801614dcd565b925050606061534c87828801614dcd565b91505092959194509250565b61536181614f45565b82525050565b61537081614f81565b82525050565b61537f81614fc2565b82525050565b60608201600082015161539b6000850182615358565b5060208201516153ae6020850182615367565b5060408201516153c16040850182615376565b50505050565b60006060820190506153dc6000830184615385565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b615407816153e2565b82525050565b600060208201905061542260008301846153fe565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061546282614c15565b915061546d83614c15565b925082820190508082111561548557615484615428565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806154d257607f821691505b6020821081036154e5576154e461548b565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000615521600783614d0f565b915061552c826154eb565b602082019050919050565b6000602082019050818103600083015261555081615514565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b600061558d600a83614d0f565b915061559882615557565b602082019050919050565b600060208201905081810360008301526155bc81615580565b9050919050565b60006155ce82614c15565b91506155d983614c15565b92508282039050818111156155f1576155f0615428565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061562d600a83614d0f565b9150615638826155f7565b602082019050919050565b6000602082019050818103600083015261565c81615620565b9050919050565b7f4552525f4f4e4c595f53454c465f4255524e0000000000000000000000000000600082015250565b6000615699601283614d0f565b91506156a482615663565b602082019050919050565b600060208201905081810360008301526156c88161568c565b9050919050565b60006156da82614c15565b91506156e583614c15565b92508282026156f381614c15565b9150828204841483151761570a57615709615428565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061574b82614c15565b915061575683614c15565b92508261576657615765615711565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b60006157a7601183614d0f565b91506157b282615771565b602082019050919050565b600060208201905081810360008301526157d68161579a565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000615813601283614d0f565b915061581e826157dd565b602082019050919050565b6000602082019050818103600083015261584281615806565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006158ae600d83614d0f565b91506158b982615878565b602082019050919050565b600060208201905081810360008301526158dd816158a1565b9050919050565b6158ed816153e2565b81146158f857600080fd5b50565b60008151905061590a816158e4565b92915050565b60006020828403121561592657615925614b80565b5b6000615934848285016158fb565b9150509291505056fea2646970667358221220328f0fbbc2c230ab0b2baa7351327ca952449758c2fcb28fb33fe2b826f38dba64736f6c6343000812003300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000fffff8276fb8cfff000000000000000000000000000000000000000000000000000000000000a8c00000000000000000000000005523058cdffe5f3c1eadadd5015e55c6e00fb4390000000000000000000000000000000000000000000000000000000000000006536172616675000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035352460000000000000000000000000000000000000000000000000000000000

Deployed ByteCode Sourcemap

26344:23454:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35536:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49154:641;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26944:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45090:492;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26684:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39315:317;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48742:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30123:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38030:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37437:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43968:303;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46884:526;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37669:299;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33925:93;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31391:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44342:403;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27038:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29939:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46028:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26475:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;48037:382;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35838:511;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48447:161;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48636:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34525:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43555:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42183:135;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26812:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33692:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32985:335;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44827:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43792:121;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32172:200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34046:437;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42429:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39637:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27191:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28465:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31105:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36536:135;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26874:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32421:157;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40809:1269;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36377:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26990:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28105:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49048:76;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45619:370;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46405:412;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28541:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27975:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42555:944;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27123:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28601:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31727:361;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48897:76;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33413:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37220:153;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36718:428;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38663:132;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27874:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47686:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35536:175;35585:7;35599:9;35619:7;:19;35627:10;35619:19;;;;;;;;;;;;;;;;35615:23;;35665:1;35643:7;:19;35651:10;35643:19;;;;;;;;;;;;;;;:23;;;;35692:1;35671:7;:17;35679:8;35671:17;;;;;;;;;;;;;;;;:22;;;;;;;:::i;:::-;;;;;;;;35705:1;35698:8;;;35536:175;;;:::o;49154:641::-;49215:4;49238:10;49230:18;;:4;:18;;;;49226:56;;49272:4;49265:11;;;;49226:56;49298:10;49290:18;;:4;:18;;;;49286:57;;49333:4;49326:11;;;;49286:57;49359:10;49351:18;;:4;:18;;;;49347:57;;49394:4;49387:11;;;;49347:57;49420:10;49412:18;;:4;:18;;;;49408:55;;49453:4;49446:11;;;;49408:55;49479:10;49471:18;;:4;:18;;;;49467:57;;49514:4;49507:11;;;;49467:57;49540:10;49532:18;;:4;:18;;;;49528:57;;49575:4;49568:11;;;;49528:57;49601:10;49593:18;;:4;:18;;;;49589:57;;49636:4;49629:11;;;;49589:57;49662:10;49654:18;;:4;:18;;;;49650:57;;49697:4;49690:11;;;;49650:57;49723:10;49715:18;;:4;:18;;;;49711:63;;49764:4;49757:11;;;;49711:63;49785:5;49778:12;;49154:641;;;;:::o;26944:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45090:492::-;45157:4;45168:17;45190:8;45210:13;:11;:13::i;:::-;45205:18;;45238:1;45232:2;:7;;;45228:85;;45254:5;45247:12;;;;;;45228:85;45281:1;45276:2;:6;;;45272:41;;;45290:17;;;;;;;;;;:::i;:::-;;;;;;;;45272:41;45355:1;45321:9;:21;45331:10;45321:21;;;;;;;;;;;;;;;:31;45343:8;45321:31;;;;;;;;;;;;;;;;:35;45317:87;;;45382:1;45372:6;:11;45364:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;45317:87;45412:14;:12;:14::i;:::-;;45445:20;45458:6;45445:12;:20::i;:::-;45433:32;;45504:9;45470;:21;45480:10;45470:21;;;;;;;;;;;;;;;:31;45492:8;45470:31;;;;;;;;;;;;;;;:43;;;;45544:8;45523:38;;45532:10;45523:38;;;45554:6;45523:38;;;;;;:::i;:::-;;;;;;;;45573:4;45566:11;;;;45090:492;;;;;:::o;26684:29::-;;;;;;;;;;;;;:::o;39315:317::-;39403:7;39417:17;39454:114;39472:31;39495:7;39472:22;:31::i;:::-;39505:62;39523:25;39546:1;39523:22;:25::i;:::-;39550:16;39505:17;:62::i;:::-;39454:17;:114::i;:::-;39441:127;;39590:32;39611:10;39590:20;:32::i;:::-;39580:42;;:7;:42;;;;:::i;:::-;39573:49;;;39315:317;;;;:::o;48742:85::-;48786:7;48816:6;;48807;;:15;;;;:::i;:::-;48800:22;;48742:85;:::o;30123:41::-;30162:2;30123:41;:::o;38030:100::-;38082:7;38103:15;:22;;;;38096:29;;38030:100;:::o;37437:152::-;37533:7;37562:15;:21;;;37554:30;;37547:37;;37437:152;;;:::o;43968:303::-;44062:4;44102:1;44077:15;:22;;;:26;;;44073:56;;;44118:5;44111:12;;;;44073:56;44161:1;44137:15;:21;;;:25;;;44133:55;;;44177:5;44170:12;;;;44133:55;44224:1;44196:15;:25;;;:29;;;44192:59;;;44240:5;44233:12;;;;44192:59;44262:4;44255:11;;43968:303;;;;:::o;46884:526::-;46966:4;46977:17;46999:11;47015:8;47035:13;:11;:13::i;:::-;47030:18;;47063:1;47057:2;:7;;;47053:85;;47079:5;47072:12;;;;;;;47053:85;47106:1;47101:2;:6;;;47097:41;;;47115:17;;;;;;;;;;:::i;:::-;;;;;;;;47097:41;47142:14;:12;:14::i;:::-;;47175:20;47188:6;47175:12;:20::i;:::-;47163:32;;47240:9;47208;:16;47218:5;47208:16;;;;;;;;;;;;;;;:28;47225:10;47208:28;;;;;;;;;;;;;;;;:41;;47200:50;;;;;;47289:9;47257;:16;47267:5;47257:16;;;;;;;;;;;;;;;:28;47274:10;47257:28;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;47312:35;47325:5;47332:3;47337:9;47312:12;:35::i;:::-;47303:44;;47375:3;47359:28;;47368:5;47359:28;;;47380:6;47359:28;;;;;;:::i;:::-;;;;;;;;47399:6;47392:13;;;;;46884:526;;;;;;:::o;37669:299::-;37776:6;37789:8;37857:34;37821:15;:25;;;37815:77;;;37804:89;;37907:1;37902;:6;;;37898:53;;37920:25;37943:1;37920:22;:25::i;:::-;37916:29;;37898:53;37962:1;37955:8;;;37669:299;;;:::o;33925:93::-;33980:4;33998:6;:15;34005:7;33998:15;;;;;;;;;;;;;;;;;;;;;;;;;33991:22;;33925:93;;;:::o;31391:205::-;31445:4;30162:2;31464:6;:21;31456:30;;;;;;31505:1;31495:6;:11;31491:61;;30162:2;31521:9;;:25;31514:32;;;;31491:61;31585:6;31572:9;;31563:6;:18;:28;31556:35;;31391:205;;;;:::o;44342:403::-;44414:7;44428:17;44450:18;44473:8;44502:30;44525:6;44502:22;:30::i;:::-;44489:43;;44551:31;44574:7;44551:22;:31::i;:::-;44537:45;;44593:42;44611:10;44623:11;44593:17;:42::i;:::-;44589:46;;44644:20;44662:1;44644:17;:20::i;:::-;44640:24;;44673:32;44691:10;44703:1;44673:17;:32::i;:::-;44669:36;;44717:23;44738:1;44717:20;:23::i;:::-;44710:30;;;;;;;44342:403;;;;:::o;27038:33::-;;;:::o;29939:24::-;;;;:::o;46028:310::-;46105:4;46116:17;46140:14;:12;:14::i;:::-;;46173:20;46186:6;46173:12;:20::i;:::-;46161:32;;46235:9;46200;:21;46210:10;46200:21;;;;;;;;;;;;;;;:31;46222:8;46200:31;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;46275:8;46254:63;;46263:10;46254:63;;;46285:9;:21;46295:10;46285:21;;;;;;;;;;;;;;;:31;46307:8;46285:31;;;;;;;;;;;;;;;;46254:63;;;;;;:::i;:::-;;;;;;;;46329:4;46322:11;;;46028:310;;;;:::o;26475:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48037:382::-;48082:4;48118:1;48101:13;:11;:13::i;:::-;:18;;;48093:27;;;;;;48133:6;:18;48140:10;48133:18;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;;48169:5;;;;;;;;;;;48155:19;;:10;:19;;;48133:41;48125:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;48212:7;:19;48220:10;48212:19;;;;;;;;;;;;;;;;48202:6;:29;;48194:38;;;;;;48237:14;48254:20;48267:6;48254:12;:20::i;:::-;48237:37;;48304:39;48324:10;48336:6;48304:19;:39::i;:::-;;48358:6;48348;;:16;;;;;;;:::i;:::-;;;;;;;;48379:10;48374:24;;;48391:6;48374:24;;;;;;:::i;:::-;;;;;;;;48410:4;48403:11;;;48037:382;;;:::o;35838:511::-;35909:4;35920:18;35970:1;35953:13;:11;:13::i;:::-;:18;;;35945:27;;;;;;35985:6;:18;35992:10;35985:18;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;;36021:5;;;;;;;;;;;36007:19;;:10;:19;;;35985:41;35977:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;36048:14;:12;:14::i;:::-;;36083:1;36071:9;;:13;36067:69;;;36120:9;;36109:7;36100:6;;:16;;;;:::i;:::-;:29;;36092:38;;;;;;36067:69;36150:7;36140:6;;:17;;;;;;;:::i;:::-;;;;;;;;36177:21;36190:7;36177:12;:21::i;:::-;36164:34;;36203:45;36223:12;36237:10;36203:19;:45::i;:::-;;36275:12;36258:39;;36263:10;36258:39;;;36289:7;36258:39;;;;;;:::i;:::-;;;;;;;;36302:26;:24;:26::i;:::-;;36340:4;36333:11;;;35838:511;;;;:::o;48447:161::-;48543:10;48534:19;;:5;:19;;;48526:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;48591:12;48596:6;48591:4;:12::i;:::-;;48447:161;;;;:::o;48636:79::-;48667:4;48685:25;48690:7;:19;48698:10;48690:19;;;;;;;;;;;;;;;;48685:4;:25::i;:::-;48678:32;;48636:79;:::o;34525:105::-;34587:7;34608;:17;34616:8;34608:17;;;;;;;;;;;;;;;;34601:24;;34525:105;;;:::o;43555:142::-;43626:7;43677:14;43662:12;:29;;;;:::i;:::-;43647:11;:45;;;;:::i;:::-;43640:52;;43555:142;;;:::o;42183:135::-;42253:7;42311:2;42293:14;42275:15;:32;;;;:::i;:::-;42274:39;;;;:::i;:::-;42267:46;;42183:135;;;:::o;26812:33::-;;;;:::o;33692:205::-;33747:4;33767:22;29997:1;33767:22;;:8;:22::i;:::-;33766:23;33758:32;;;;;;33817:5;;;;;;;;;;;33803:19;;:10;:19;;;:44;;;;33837:10;33826:21;;:7;:21;;;33803:44;33795:53;;;;;;33871:5;33853:6;:15;33860:7;33853:15;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;33888:4;33881:11;;33692:205;;;:::o;32985:335::-;33023:5;33039:7;;;;;;;;;;;33035:33;;;33061:1;33054:8;;;;33035:33;33087:1;33076:7;;:12;33072:38;;33103:1;33096:8;;;;33072:38;33137:7;;33118:15;:26;33114:189;;33152:56;33205:2;33184:18;;:23;;;;:::i;:::-;33174:7;;:33;;;;:::i;:::-;33152:21;:56::i;:::-;;33224:4;33214:7;;:14;;;;;;;;;;;;;;;;;;33239:24;33247:15;33239:24;;;;;;:::i;:::-;;;;;;;;33269:14;:12;:14::i;:::-;;33296:1;33289:8;;;;33114:189;33314:1;33307:8;;32985:335;;:::o;44827:196::-;44886:7;44900:8;44917:66;44935:30;44958:6;44935:22;:30::i;:::-;44967:15;;;;;;;;;;;44917:17;:66::i;:::-;44913:70;;44995:23;45016:1;44995:20;:23::i;:::-;44988:30;;;;;44827:196;;;:::o;43792:121::-;43855:7;43906:2;43895:7;43877:15;:25;;;;:::i;:::-;43876:32;;;;:::i;:::-;43869:39;;43792:121;;;:::o;32172:200::-;32229:19;30097:1;32229:19;;:8;:19::i;:::-;32228:20;32220:29;;;;;;32276:5;;;;;;;;;;;32262:19;;:10;:19;;;32254:28;;;;;;32302:13;:11;:13::i;:::-;32295:4;:20;32287:29;;;;;;32330:9;;32326:20;32341:4;32326:20;;;;;;:::i;:::-;;;;;;;;32363:4;32351:9;:16;;;;32172:200;:::o;34046:437::-;34104:7;34118:18;34141:30;34176:19;34216:47;34239:23;34253:8;34239:13;:23::i;:::-;34216:22;:47::i;:::-;34202:61;;34284:35;34300:18;;34284:15;:35::i;:::-;34270:49;;34352:47;34370:11;34383:15;;;;;;;;;;;34352:17;:47::i;:::-;34326:73;;34411:67;34419:45;34440:23;34419:20;:45::i;:::-;34411:67;;34466:11;34411:7;:67::i;:::-;34404:74;;;;;34046:437;;;:::o;42429:92::-;42471:7;42492:24;42514:1;42492:21;:24::i;:::-;42485:31;;42429:92;:::o;39637:413::-;39744:7;39758:28;39791:30;39851:39;39874:15;39851:22;:39::i;:::-;39828:62;;39921:50;39955:15;39921:33;:50::i;:::-;39895:76;;39983:62;39999:20;40021:23;39983:15;:62::i;:::-;39976:69;;;;39637:413;;;:::o;27191:24::-;;;;:::o;28465:26::-;;;;;;;;;;;;;:::o;31105:281::-;31150:7;31181:2;31172:6;:11;31164:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;31240:1;31227:9;;31218:6;:18;:23;31210:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;31282:6;31269:9;;:19;;;;;;;;;;;30162:2;31314:9;;:25;31298:53;;;31341:9;;31298:53;;;;;;:::i;:::-;;;;;;;;31371:9;;31356:25;;31105:281;;;:::o;36536:135::-;36637:29;36644:12;36658:7;36637:6;:29::i;:::-;;36536:135;;;;:::o;26874:20::-;;;;;;;;;;;;;:::o;32421:157::-;32488:20;30030:1;32488:20;;:8;:20::i;:::-;32487:21;32479:30;;;;;;32536:5;;;;;;;;;;;32522:19;;:10;:19;;;32514:28;;;;;;32561:12;32547:11;;:26;;;;;;;;;;;;;;;;;;32421:157;:::o;40809:1269::-;40849:4;40860:47;;:::i;:::-;40912:44;;:::i;:::-;40961;;:::i;:::-;41010:21;41036:26;41067:34;41106:23;41134:18;41159:16;:14;:16::i;:::-;;41204:13;:11;:13::i;:::-;41180:37;;41226:44;41248:21;41226;:44::i;:::-;41222:74;;;41285:5;41278:12;;;;;;;;;;;;41222:74;41378:15;41394:10;;41378:27;;;;;;;;:::i;:::-;;;;;;;;;41357:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41426:45;41449:21;41426:22;:45::i;:::-;41410:61;;41505:1;41489:13;:17;;;;:::i;:::-;41476:30;;41533:53;41567:18;41533:33;:53::i;:::-;41511:75;;41644:2;41627:13;41610:14;:30;;;;:::i;:::-;41609:37;;;;:::i;:::-;41591:55;;41741:89;41759:70;41777:10;41789:39;41812:15;41789:22;:39::i;:::-;41759:17;:70::i;:::-;41741:17;:89::i;:::-;41711:119;;41856:75;41873:1;41876:27;41905:13;:11;:13::i;:::-;41920:10;41856:16;:75::i;:::-;41835:96;;41936:15;41957:18;41936:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41983:46;42010:18;41983:26;:46::i;:::-;;42039:18;42046:10;42039:18;;;;;;:::i;:::-;;;;;;;;42069:4;42062:11;;;;;;;;;;40809:1269;;:::o;36377:131::-;36474:29;36481:12;36495:7;36474:6;:29::i;:::-;;36377:131;;;;:::o;26990:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28105:34::-;;;:::o;49048:76::-;49092:7;49113:6;;49106:13;;49048:76;:::o;45619:370::-;45696:4;45707:17;45743:20;45756:6;45743:12;:20::i;:::-;45731:32;;45811:9;45776;:21;45786:10;45776:21;;;;;;;;;;;;;;;:31;45798:8;45776:31;;;;;;;;;;;;;;;;:44;;45768:53;;;;;;45830:14;:12;:14::i;:::-;;45886:9;45851;:21;45861:10;45851:21;;;;;;;;;;;;;;;:31;45873:8;45851:31;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;45926:8;45905:63;;45914:10;45905:63;;;45936:9;:21;45946:10;45936:21;;;;;;;;;;;;;;;:31;45958:8;45936:31;;;;;;;;;;;;;;;;45905:63;;;;;;:::i;:::-;;;;;;;;45980:4;45973:11;;;45619:370;;;;:::o;46405:412::-;46468:4;46479:17;46501:11;46517:8;46537:13;:11;:13::i;:::-;46532:18;;46565:1;46559:2;:7;;;46555:85;;46581:5;46574:12;;;;;;;46555:85;46608:1;46603:2;:6;;;46599:41;;;46617:17;;;;;;;;;;:::i;:::-;;;;;;;;46599:41;46644:14;:12;:14::i;:::-;;46677:20;46690:6;46677:12;:20::i;:::-;46665:32;;46711:40;46724:10;46736:3;46741:9;46711:12;:40::i;:::-;46702:49;;46782:3;46761:33;;46770:10;46761:33;;;46787:6;46761:33;;;;;;:::i;:::-;;;;;;;;46806:6;46799:13;;;;;46405:412;;;;;:::o;28541:22::-;;;;:::o;27975:39::-;;;:::o;42555:944::-;42619:7;42633:8;42646:19;42670:18;42693:26;42730:7;;;;;;;;;;;42726:34;;;42752:1;42745:8;;;;;;;;42726:34;42780:35;42796:18;;42780:15;:35::i;:::-;42766:49;;42839:1;42824:11;:16;42820:42;;42855:1;42848:8;;;;;;;;42820:42;42888:15;;;;;;;;;;;42866:37;;43060:1;43050:7;:11;:36;;;;;43075:11;43065:7;:21;43050:36;43046:75;;;43108:7;43094:21;;43046:75;43141:35;43164:11;43141:22;:35::i;:::-;43127:49;;43185:42;43203:10;43215:11;43185:17;:42::i;:::-;43181:46;;43236:20;43254:1;43236:17;:20::i;:::-;43232:24;;43279:37;43297:15;;;;;;;;;;;43314:1;43279:17;:37::i;:::-;43261:15;;:55;;;;;;;;;;;;;;;;;;;;43380:2;43366:11;:16;;;;:::i;:::-;43344:18;;:39;;;;:::i;:::-;43323:18;:60;;;;43434:19;43393:78;;43421:11;43401:18;;43393:78;43455:15;;;;;;;;;;;43393:78;;;;;;:::i;:::-;;;;;;;;43483:11;43476:18;;;;;;42555:944;;;;:::o;27123:25::-;;;;:::o;28601:24::-;;;;:::o;31727:361::-;31787:9;31801:20;31837:22;30065:1;31837:22;;:8;:22::i;:::-;31836:23;31828:32;;;;;;31874:7;;;;;;;;;;;31873:8;31865:17;;;;;;31909:5;;;;;;;;;;;31895:19;;:10;:19;;;31887:28;;;;;;31955:14;31939:13;:30;;;;:::i;:::-;31924:11;:46;;;;:::i;:::-;31920:50;;31987:7;;31983:1;:11;31975:20;;;;;;32015:7;;32000:22;;32037:1;32027:7;:11;;;;32061:12;32048:35;32075:7;;32048:35;;;;;;:::i;:::-;;;;;;;;31782:306;;31727:361;:::o;48897:76::-;48941:7;48962:6;;48955:13;;48897:76;:::o;33413:176::-;33465:4;33485:22;29997:1;33485:22;;:8;:22::i;:::-;33484:23;33476:32;;;;;;33535:5;;;;;;;;;;;33521:19;;:10;:19;;;33513:28;;;;;;33564:4;33546:6;:15;33553:7;33546:15;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;33580:4;33573:11;;33413:176;;;:::o;37220:153::-;37316:7;37345:15;:22;;;37337:31;;37330:38;;37220:153;;;:::o;36718:428::-;36847:25;;:::i;:::-;36879:40;;:::i;:::-;36957:7;36926:14;:21;;:39;;;;;;;;;;;37000:6;36970:14;:20;;:37;;;;;;;;;;;37076:18;37054;37046:48;37012:14;:24;;:83;;;;;;;;;;;37125:14;37118:21;;;36718:428;;;;;;:::o;38663:132::-;38708:7;38788:1;38771:14;38756:11;38738:15;:29;;;;:::i;:::-;38737:48;;;;:::i;:::-;:52;;;;:::i;:::-;38722:68;;38663:132;:::o;27874:36::-;;;:::o;47686:237::-;47748:4;47759:16;47804:5;;;;;;;;;;;47790:19;;:10;:19;;;47782:28;;;;;;47826:5;;;;;;;;;;;47815:16;;47844:9;47836:5;;:17;;;;;;;;;;;;;;;;;;47896:5;;;;;;;;;;;47865:37;;47886:8;47865:37;;;;;;;;;;;;47914:4;47907:11;;;47686:237;;;:::o;2009:174::-;2062:6;2110:18;2105:1;:23;;2096:33;;;;;;2166:2;2161:1;:7;;;;2138:32;;2009:174;;;:::o;15633:228::-;15679:6;15726:1;15722;:5;;;15713:15;;;;;;15843:3;15805:34;15791:9;15798:1;15791:5;:9::i;:::-;15783:18;;15774:65;:72;;;;;;;;;15739:109;;15633:228;;;:::o;4071:225::-;4128:6;4162:13;4190:1;4178:13;;4185:1;4178:9;;:13;4162:29;;815:35;4209:19;;:6;:19;;:42;;;;;973:34;4232:19;;:6;:19;;4209:42;4200:52;;;;;;4276:6;4261:22;;;4071:225;;;;:::o;4532:231::-;4589:6;4623:13;4656:2;4651:1;4639:13;;4646:1;4639:9;;:13;:19;;;;;;;;;;;;;;;;;;;4623:35;;815;4676:19;;:6;:19;;:42;;;;;973:34;4699:19;;:6;:19;;4676:42;4667:52;;;;;;4743:6;4728:22;;;4532:231;;;;:::o;2430:155::-;2480:6;2528:1;2523;:6;;;;2514:16;;;;;;2568:2;2563:1;:7;;;;;;;;;;;;;;;;;;;;;2539:33;;2430:155;;;:::o;47470:188::-;47553:4;47564:34;47584:5;47591:6;47564:19;:34::i;:::-;;47603:32;47623:3;47628:6;47603:19;:32::i;:::-;;47649:4;47642:11;;47470:188;;;;;:::o;23217:305::-;23264:6;23311:20;23307:1;:24;;;23298:34;;;;;;23363:21;23359:1;:25;;;23355:39;;;23393:1;23386:8;;;;23355:39;23425:84;23504:3;23465:35;23460:1;23452:10;;:48;:55;;;;;;;;;;;;;;;;;;;23425:5;:84::i;:::-;23418:91;;23217:305;;;;:::o;35076:406::-;35156:4;35167:18;35190:19;35238:7;:17;35246:8;35238:17;;;;;;;;;;;;;;;;35216:40;;35277:1;35267:6;:11;35263:41;;35293:5;35286:12;;;;;;35263:41;35323:23;35337:8;35323:13;:23::i;:::-;35310:36;;35374:6;35360:10;:20;;35352:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;35455:6;35442:10;:19;;;;:::i;:::-;35422:7;:17;35430:8;35422:17;;;;;;;;;;;;;;;:39;;;;35473:4;35466:11;;;;35076:406;;;;;:::o;34685:336::-;34765:4;34776:18;34799:19;34847:7;:17;34855:8;34847:17;;;;;;;;;;;;;;;;34825:40;;34887:1;34877:6;:11;34873:41;;34903:5;34896:12;;;;;;34873:41;34933:23;34947:8;34933:13;:23::i;:::-;34920:36;;34994:6;34981:10;:19;;;;:::i;:::-;34961:7;:17;34969:8;34961:17;;;;;;;;;;;;;;;:39;;;;35012:4;35005:11;;;;34685:336;;;;;:::o;38214:386::-;38267:4;38278:47;;:::i;:::-;38330:19;38370:13;:11;:13::i;:::-;38356:27;;38412:15;38451:1;38428:15;:22;;;;:24;;;;:::i;:::-;38412:41;;;;;;;;:::i;:::-;;;;;;;;;38388:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38495:11;38458:21;:27;;:49;;;;;;;;;;;38558:21;38514:15;38553:1;38530:15;:22;;;;:24;;;;:::i;:::-;38514:41;;;;;;;;:::i;:::-;;;;;;;;;:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38591:4;38584:11;;;;38214:386;:::o;7255:259::-;7312:6;7360:1;7355;:6;;;7346:16;;;;;;7371:13;7408:1;7387:22;;7402:2;7396:1;7388:10;;:16;;;;7387:22;;;;;:::i;:::-;;;7371:38;;815:35;7427:19;;:6;:19;;:42;;;;;973:34;7450:19;;:6;:19;;7427:42;7418:52;;;;;;7494:6;7479:22;;;7255:259;;;;:::o;38875:435::-;38920:25;;:::i;:::-;38952:44;;:::i;:::-;39001:45;;:::i;:::-;39051:21;39101:15;39117:10;;39101:27;;;;;;;;:::i;:::-;;;;;;;;;39079:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39149:4;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39133:35;;;;39194:42;39217:18;39194:22;:42::i;:::-;39177:13;:59;39173:103;;39251:19;39244:26;;;;;;;39173:103;39287:18;39280:25;;;;;38875:435;;:::o;40104:452::-;40200:7;40214:12;40231:16;40278:50;40312:15;40278:33;:50::i;:::-;40262:13;:11;:13::i;:::-;:66;;;;:::i;:::-;40255:73;;40366:9;;40345:18;40358:4;40345:12;:18::i;:::-;:30;;;;:::i;:::-;40334:41;;40380:42;40400:11;;;;;;;;;;;40413:8;40380:19;:42::i;:::-;;40460:15;:22;;;40432:57;;40447:11;;;;;;;;;;;40432:57;;;40484:4;40432:57;;;;;;:::i;:::-;;;;;;;;40508:1;40494:10;;:15;;;;;;;:::i;:::-;;;;;;;;40527:8;40514:9;;:21;;;;;;;:::i;:::-;;;;;;;;40547:4;40540:11;;;;40104:452;;;:::o;14584:863::-;14633:6;14680:1;14676;:5;;;14667:15;;;;;;14693:10;14716:9;14728:1;14716:13;;;;14748:19;14742:2;:25;14738:56;;14778:2;14771:9;;;;;;;;;;;;;;;;;;;;;;14789:2;14782:9;;;;14738:56;14812:11;14806:2;:17;14802:48;;14834:2;14827:9;;;;;;;;;;;;;;;;;;;;;;14845:2;14838:9;;;;14802:48;14868:7;14862:2;:13;14858:44;;14886:2;14879:9;;;;;;;;;;;;;;;;;;;;;;14897:2;14890:9;;;;14858:44;14920:5;14914:2;:11;14910:40;;14936:1;14929:8;;;;;;;;;;;;;;;;;;;;;;14946:1;14939:8;;;;14910:40;14968:4;14962:2;:10;14958:39;;14983:1;14976:8;;;;;;;;;;;;;;;;;;;;;;14993:1;14986:8;;;;14958:39;15015:3;15009:2;:9;15005:38;;15029:1;15022:8;;;;;;;;;;;;;;;;;;;;;;15039:1;15032:8;;;;15005:38;15061:3;15055:2;:9;15051:23;;15073:1;15066:8;;;;15051:23;15117:13;15145:2;15139;15133:3;:8;:14;;;;15117:30;;15156:10;15208:3;15202;:9;15186:1;15178:10;;15169:43;;;;15156:56;;15226:10;15239:18;15226:31;;15221:181;15265:1;15259:3;:7;15221:181;;;15296:2;15290:8;;;;15309:9;15327:3;15321:2;:9;;;;;;;;;15309:21;;15354:1;15348:3;:7;15341:14;;;;;;;;;;;;15390:1;15376:3;:16;15366:26;;;;15279:123;15276:1;15268:9;;;;;;;;;;;;;;;;;;;;;;15221:181;;;;15427:6;15412:22;;;;;;14584:863;;;:::o;16047:6983::-;16096:6;16143:20;16139:1;:24;;;16130:34;;;;;;16195:21;16191:1;:25;;;16187:39;;;16225:1;16218:8;;;;16187:39;16250:14;16267:34;16250:51;;16341:1;16320:18;16316:1;:22;:26;;;16312:101;;;16410:3;16371:35;16362:6;:44;:51;;;;;;;;;16353:60;;16312:101;16451:1;16430:18;16426:1;:22;:26;;;16422:101;;;16520:3;16481:35;16472:6;:44;:51;;;;;;;;;16463:60;;16422:101;16561:1;16540:18;16536:1;:22;:26;;;16532:101;;;16630:3;16591:35;16582:6;:44;:51;;;;;;;;;16573:60;;16532:101;16671:1;16650:18;16646:1;:22;:26;;;16642:101;;;16740:3;16701:35;16692:6;:44;:51;;;;;;;;;16683:60;;16642:101;16780:1;16760:17;16756:1;:21;:25;;;16752:100;;;16849:3;16810:35;16801:6;:44;:51;;;;;;;;;16792:60;;16752:100;16889:1;16869:17;16865:1;:21;:25;;;16861:100;;;16958:3;16919:35;16910:6;:44;:51;;;;;;;;;16901:60;;16861:100;16998:1;16978:17;16974:1;:21;:25;;;16970:100;;;17067:3;17028:35;17019:6;:44;:51;;;;;;;;;17010:60;;16970:100;17107:1;17087:17;17083:1;:21;:25;;;17079:100;;;17176:3;17137:35;17128:6;:44;:51;;;;;;;;;17119:60;;17079:100;17215:1;17196:16;17192:1;:20;:24;;;17188:99;;;17284:3;17245:35;17236:6;:44;:51;;;;;;;;;17227:60;;17188:99;17323:1;17304:16;17300:1;:20;:24;;;17296:99;;;17392:3;17353:35;17344:6;:44;:51;;;;;;;;;17335:60;;17296:99;17431:1;17412:16;17408:1;:20;:24;;;17404:99;;;17500:3;17461:35;17452:6;:44;:51;;;;;;;;;17443:60;;17404:99;17539:1;17520:16;17516:1;:20;:24;;;17512:99;;;17608:3;17569:35;17560:6;:44;:51;;;;;;;;;17551:60;;17512:99;17646:1;17628:15;17624:1;:19;:23;;;17620:98;;;17715:3;17676:35;17667:6;:44;:51;;;;;;;;;17658:60;;17620:98;17753:1;17735:15;17731:1;:19;:23;;;17727:98;;;17822:3;17783:35;17774:6;:44;:51;;;;;;;;;17765:60;;17727:98;17860:1;17842:15;17838:1;:19;:23;;;17834:98;;;17929:3;17890:35;17881:6;:44;:51;;;;;;;;;17872:60;;17834:98;17967:1;17949:15;17945:1;:19;:23;;;17941:98;;;18036:3;17997:35;17988:6;:44;:51;;;;;;;;;17979:60;;17941:98;18073:1;18056:14;18052:1;:18;:22;;;18048:97;;;18142:3;18103:35;18094:6;:44;:51;;;;;;;;;18085:60;;18048:97;18179:1;18162:14;18158:1;:18;:22;;;18154:97;;;18248:3;18209:35;18200:6;:44;:51;;;;;;;;;18191:60;;18154:97;18285:1;18268:14;18264:1;:18;:22;;;18260:97;;;18354:3;18315:35;18306:6;:44;:51;;;;;;;;;18297:60;;18260:97;18391:1;18374:14;18370:1;:18;:22;;;18366:97;;;18460:3;18421:35;18412:6;:44;:51;;;;;;;;;18403:60;;18366:97;18496:1;18480:13;18476:1;:17;:21;;;18472:96;;;18565:3;18526:35;18517:6;:44;:51;;;;;;;;;18508:60;;18472:96;18601:1;18585:13;18581:1;:17;:21;;;18577:96;;;18670:3;18631:35;18622:6;:44;:51;;;;;;;;;18613:60;;18577:96;18706:1;18690:13;18686:1;:17;:21;;;18682:96;;;18775:3;18736:35;18727:6;:44;:51;;;;;;;;;18718:60;;18682:96;18811:1;18795:13;18791:1;:17;:21;;;18787:96;;;18880:3;18841:35;18832:6;:44;:51;;;;;;;;;18823:60;;18787:96;18915:1;18900:12;18896:1;:16;:20;;;18892:95;;;18984:3;18945:35;18936:6;:44;:51;;;;;;;;;18927:60;;18892:95;19019:1;19004:12;19000:1;:16;:20;;;18996:95;;;19088:3;19049:35;19040:6;:44;:51;;;;;;;;;19031:60;;18996:95;19123:1;19108:12;19104:1;:16;:20;;;19100:95;;;19192:3;19153:35;19144:6;:44;:51;;;;;;;;;19135:60;;19100:95;19227:1;19212:12;19208:1;:16;:20;;;19204:95;;;19296:3;19257:35;19248:6;:44;:51;;;;;;;;;19239:60;;19204:95;19330:1;19316:11;19312:1;:15;:19;;;19308:94;;;19399:3;19360:35;19351:6;:44;:51;;;;;;;;;19342:60;;19308:94;19433:1;19419:11;19415:1;:15;:19;;;19411:94;;;19502:3;19463:35;19454:6;:44;:51;;;;;;;;;19445:60;;19411:94;19536:1;19522:11;19518:1;:15;:19;;;19514:94;;;19605:3;19566:35;19557:6;:44;:51;;;;;;;;;19548:60;;19514:94;19639:1;19625:11;19621:1;:15;:19;;;19617:94;;;19708:3;19669:35;19660:6;:44;:51;;;;;;;;;19651:60;;19617:94;19741:1;19728:10;19724:1;:14;:18;;;19720:93;;;19810:3;19771:35;19762:6;:44;:51;;;;;;;;;19753:60;;19720:93;19843:1;19830:10;19826:1;:14;:18;;;19822:93;;;19912:3;19873:35;19864:6;:44;:51;;;;;;;;;19855:60;;19822:93;19945:1;19932:10;19928:1;:14;:18;;;19924:93;;;20014:3;19975:35;19966:6;:44;:51;;;;;;;;;19957:60;;19924:93;20047:1;20034:10;20030:1;:14;:18;;;20026:93;;;20116:3;20077:35;20068:6;:44;:51;;;;;;;;;20059:60;;20026:93;20148:1;20136:9;20132:1;:13;:17;;;20128:92;;;20217:3;20178:35;20169:6;:44;:51;;;;;;;;;20160:60;;20128:92;20249:1;20237:9;20233:1;:13;:17;;;20229:92;;;20318:3;20279:35;20270:6;:44;:51;;;;;;;;;20261:60;;20229:92;20350:1;20338:9;20334:1;:13;:17;;;20330:92;;;20419:3;20380:35;20371:6;:44;:51;;;;;;;;;20362:60;;20330:92;20451:1;20439:9;20435:1;:13;:17;;;20431:92;;;20520:3;20481:35;20472:6;:44;:51;;;;;;;;;20463:60;;20431:92;20551:1;20540:8;20536:1;:12;:16;;;20532:91;;;20620:3;20581:35;20572:6;:44;:51;;;;;;;;;20563:60;;20532:91;20651:1;20640:8;20636:1;:12;:16;;;20632:91;;;20720:3;20681:35;20672:6;:44;:51;;;;;;;;;20663:60;;20632:91;20751:1;20740:8;20736:1;:12;:16;;;20732:91;;;20820:3;20781:35;20772:6;:44;:51;;;;;;;;;20763:60;;20732:91;20851:1;20840:8;20836:1;:12;:16;;;20832:91;;;20920:3;20881:35;20872:6;:44;:51;;;;;;;;;20863:60;;20832:91;20950:1;20940:7;20936:1;:11;:15;;;20932:90;;;21019:3;20980:35;20971:6;:44;:51;;;;;;;;;20962:60;;20932:90;21049:1;21039:7;21035:1;:11;:15;;;21031:90;;;21118:3;21079:35;21070:6;:44;:51;;;;;;;;;21061:60;;21031:90;21148:1;21138:7;21134:1;:11;:15;;;21130:90;;;21217:3;21178:35;21169:6;:44;:51;;;;;;;;;21160:60;;21130:90;21247:1;21237:7;21233:1;:11;:15;;;21229:90;;;21316:3;21277:35;21268:6;:44;:51;;;;;;;;;21259:60;;21229:90;21345:1;21336:6;21332:1;:10;:14;;;21328:89;;;21414:3;21375:35;21366:6;:44;:51;;;;;;;;;21357:60;;21328:89;21443:1;21434:6;21430:1;:10;:14;;;21426:89;;;21512:3;21473:35;21464:6;:44;:51;;;;;;;;;21455:60;;21426:89;21541:1;21532:6;21528:1;:10;:14;;;21524:89;;;21610:3;21571:35;21562:6;:44;:51;;;;;;;;;21553:60;;21524:89;21639:1;21630:6;21626:1;:10;:14;;;21622:89;;;21708:3;21669:35;21660:6;:44;:51;;;;;;;;;21651:60;;21622:89;21736:1;21728:5;21724:1;:9;:13;;;21720:88;;;21805:3;21766:35;21757:6;:44;:51;;;;;;;;;21748:60;;21720:88;21833:1;21825:5;21821:1;:9;:13;;;21817:88;;;21902:3;21863:35;21854:6;:44;:51;;;;;;;;;21845:60;;21817:88;21930:1;21922:5;21918:1;:9;:13;;;21914:88;;;21999:3;21960:35;21951:6;:44;:51;;;;;;;;;21942:60;;21914:88;22027:1;22019:5;22015:1;:9;:13;;;22011:88;;;22096:3;22057:35;22048:6;:44;:51;;;;;;;;;22039:60;;22011:88;22123:1;22116:4;22112:1;:8;:12;;;22108:87;;;22192:3;22153:35;22144:6;:44;:51;;;;;;;;;22135:60;;22108:87;22219:1;22212:4;22208:1;:8;:12;;;22204:87;;;22288:3;22249:35;22240:6;:44;:51;;;;;;;;;22231:60;;22204:87;22315:1;22308:4;22304:1;:8;:12;;;22300:87;;;22384:3;22345:35;22336:6;:44;:51;;;;;;;;;22327:60;;22300:87;22411:1;22404:4;22400:1;:8;:12;;;22396:87;;;22480:3;22441:35;22432:6;:44;:51;;;;;;;;;22423:60;;22396:87;22506:1;22500:3;22496:1;:7;:11;;;22492:86;;;22575:3;22536:35;22527:6;:44;:51;;;;;;;;;22518:60;;22492:86;22601:1;22595:3;22591:1;:7;:11;;;22587:86;;;22670:3;22631:35;22622:6;:44;:51;;;;;;;;;22613:60;;22587:86;22696:1;22690:3;22686:1;:7;:11;;;22682:86;;;22765:3;22726:35;22717:6;:44;:51;;;;;;;;;22708:60;;22682:86;22791:1;22785:3;22781:1;:7;:11;;;22777:86;;;22860:3;22821:35;22812:6;:44;:51;;;;;;;;;22803:60;;22777:86;22913:2;22908:1;:7;;;;;;;;;;;;;;;;;;;;;22902:2;:14;22894:23;;22874:44;;;;;;;;;;;;973:34;22955:18;;22936:6;:38;;22927:48;;;;;;23009:6;22986:31;;;16047:6983;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:149::-;1647:7;1687:66;1680:5;1676:78;1665:89;;1611:149;;;:::o;1766:120::-;1838:23;1855:5;1838:23;:::i;:::-;1831:5;1828:34;1818:62;;1876:1;1873;1866:12;1818:62;1766:120;:::o;1892:137::-;1937:5;1975:6;1962:20;1953:29;;1991:32;2017:5;1991:32;:::i;:::-;1892:137;;;;:::o;2035:327::-;2093:6;2142:2;2130:9;2121:7;2117:23;2113:32;2110:119;;;2148:79;;:::i;:::-;2110:119;2268:1;2293:52;2337:7;2328:6;2317:9;2313:22;2293:52;:::i;:::-;2283:62;;2239:116;2035:327;;;;:::o;2368:90::-;2402:7;2445:5;2438:13;2431:21;2420:32;;2368:90;;;:::o;2464:109::-;2545:21;2560:5;2545:21;:::i;:::-;2540:3;2533:34;2464:109;;:::o;2579:210::-;2666:4;2704:2;2693:9;2689:18;2681:26;;2717:65;2779:1;2768:9;2764:17;2755:6;2717:65;:::i;:::-;2579:210;;;;:::o;2795:99::-;2847:6;2881:5;2875:12;2865:22;;2795:99;;;:::o;2900:169::-;2984:11;3018:6;3013:3;3006:19;3058:4;3053:3;3049:14;3034:29;;2900:169;;;;:::o;3075:246::-;3156:1;3166:113;3180:6;3177:1;3174:13;3166:113;;;3265:1;3260:3;3256:11;3250:18;3246:1;3241:3;3237:11;3230:39;3202:2;3199:1;3195:10;3190:15;;3166:113;;;3313:1;3304:6;3299:3;3295:16;3288:27;3137:184;3075:246;;;:::o;3327:102::-;3368:6;3419:2;3415:7;3410:2;3403:5;3399:14;3395:28;3385:38;;3327:102;;;:::o;3435:377::-;3523:3;3551:39;3584:5;3551:39;:::i;:::-;3606:71;3670:6;3665:3;3606:71;:::i;:::-;3599:78;;3686:65;3744:6;3739:3;3732:4;3725:5;3721:16;3686:65;:::i;:::-;3776:29;3798:6;3776:29;:::i;:::-;3771:3;3767:39;3760:46;;3527:285;3435:377;;;;:::o;3818:313::-;3931:4;3969:2;3958:9;3954:18;3946:26;;4018:9;4012:4;4008:20;4004:1;3993:9;3989:17;3982:47;4046:78;4119:4;4110:6;4046:78;:::i;:::-;4038:86;;3818:313;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:92::-;4926:7;4970:5;4966:2;4955:21;4944:32;;4890:92;;;:::o;4988:115::-;5073:23;5090:5;5073:23;:::i;:::-;5068:3;5061:36;4988:115;;:::o;5109:218::-;5200:4;5238:2;5227:9;5223:18;5215:26;;5251:69;5317:1;5306:9;5302:17;5293:6;5251:69;:::i;:::-;5109:218;;;;:::o;5333:120::-;5405:23;5422:5;5405:23;:::i;:::-;5398:5;5395:34;5385:62;;5443:1;5440;5433:12;5385:62;5333:120;:::o;5459:137::-;5504:5;5542:6;5529:20;5520:29;;5558:32;5584:5;5558:32;:::i;:::-;5459:137;;;;:::o;5602:472::-;5669:6;5677;5726:2;5714:9;5705:7;5701:23;5697:32;5694:119;;;5732:79;;:::i;:::-;5694:119;5852:1;5877:53;5922:7;5913:6;5902:9;5898:22;5877:53;:::i;:::-;5867:63;;5823:117;5979:2;6005:52;6049:7;6040:6;6029:9;6025:22;6005:52;:::i;:::-;5995:62;;5950:117;5602:472;;;;;:::o;6080:117::-;6189:1;6186;6179:12;6203:180;6251:77;6248:1;6241:88;6348:4;6345:1;6338:15;6372:4;6369:1;6362:15;6389:281;6472:27;6494:4;6472:27;:::i;:::-;6464:6;6460:40;6602:6;6590:10;6587:22;6566:18;6554:10;6551:34;6548:62;6545:88;;;6613:18;;:::i;:::-;6545:88;6653:10;6649:2;6642:22;6432:238;6389:281;;:::o;6676:129::-;6710:6;6737:20;;:::i;:::-;6727:30;;6766:33;6794:4;6786:6;6766:33;:::i;:::-;6676:129;;;:::o;6934:93::-;6970:7;7010:10;7003:5;6999:22;6988:33;;6934:93;;;:::o;7033:120::-;7105:23;7122:5;7105:23;:::i;:::-;7098:5;7095:34;7085:62;;7143:1;7140;7133:12;7085:62;7033:120;:::o;7159:137::-;7204:5;7242:6;7229:20;7220:29;;7258:32;7284:5;7258:32;:::i;:::-;7159:137;;;;:::o;7302:103::-;7338:7;7378:20;7371:5;7367:32;7356:43;;7302:103;;;:::o;7411:120::-;7483:23;7500:5;7483:23;:::i;:::-;7476:5;7473:34;7463:62;;7521:1;7518;7511:12;7463:62;7411:120;:::o;7537:137::-;7582:5;7620:6;7607:20;7598:29;;7636:32;7662:5;7636:32;:::i;:::-;7537:137;;;;:::o;7680:101::-;7716:7;7756:18;7749:5;7745:30;7734:41;;7680:101;;;:::o;7787:120::-;7859:23;7876:5;7859:23;:::i;:::-;7852:5;7849:34;7839:62;;7897:1;7894;7887:12;7839:62;7787:120;:::o;7913:137::-;7958:5;7996:6;7983:20;7974:29;;8012:32;8038:5;8012:32;:::i;:::-;7913:137;;;;:::o;8115:751::-;8200:5;8244:4;8232:9;8227:3;8223:19;8219:30;8216:117;;;8252:79;;:::i;:::-;8216:117;8351:21;8367:4;8351:21;:::i;:::-;8342:30;;8433:1;8473:48;8517:3;8508:6;8497:9;8493:22;8473:48;:::i;:::-;8466:4;8459:5;8455:16;8448:74;8382:151;8593:2;8634:48;8678:3;8669:6;8658:9;8654:22;8634:48;:::i;:::-;8627:4;8620:5;8616:16;8609:74;8543:151;8758:2;8799:48;8843:3;8834:6;8823:9;8819:22;8799:48;:::i;:::-;8792:4;8785:5;8781:16;8774:74;8704:155;8115:751;;;;:::o;8872:401::-;8967:6;9016:2;9004:9;8995:7;8991:23;8987:32;8984:119;;;9022:79;;:::i;:::-;8984:119;9142:1;9167:89;9248:7;9239:6;9228:9;9224:22;9167:89;:::i;:::-;9157:99;;9113:153;8872:401;;;;:::o;9279:619::-;9356:6;9364;9372;9421:2;9409:9;9400:7;9396:23;9392:32;9389:119;;;9427:79;;:::i;:::-;9389:119;9547:1;9572:53;9617:7;9608:6;9597:9;9593:22;9572:53;:::i;:::-;9562:63;;9518:117;9674:2;9700:53;9745:7;9736:6;9725:9;9721:22;9700:53;:::i;:::-;9690:63;;9645:118;9802:2;9828:53;9873:7;9864:6;9853:9;9849:22;9828:53;:::i;:::-;9818:63;;9773:118;9279:619;;;;;:::o;9904:329::-;9963:6;10012:2;10000:9;9991:7;9987:23;9983:32;9980:119;;;10018:79;;:::i;:::-;9980:119;10138:1;10163:53;10208:7;10199:6;10188:9;10184:22;10163:53;:::i;:::-;10153:63;;10109:117;9904:329;;;;:::o;10239:474::-;10307:6;10315;10364:2;10352:9;10343:7;10339:23;10335:32;10332:119;;;10370:79;;:::i;:::-;10332:119;10490:1;10515:53;10560:7;10551:6;10540:9;10536:22;10515:53;:::i;:::-;10505:63;;10461:117;10617:2;10643:53;10688:7;10679:6;10668:9;10664:22;10643:53;:::i;:::-;10633:63;;10588:118;10239:474;;;;;:::o;10719:115::-;10804:23;10821:5;10804:23;:::i;:::-;10799:3;10792:36;10719:115;;:::o;10840:::-;10925:23;10942:5;10925:23;:::i;:::-;10920:3;10913:36;10840:115;;:::o;10961:::-;11046:23;11063:5;11046:23;:::i;:::-;11041:3;11034:36;10961:115;;:::o;11082:430::-;11225:4;11263:2;11252:9;11248:18;11240:26;;11276:69;11342:1;11331:9;11327:17;11318:6;11276:69;:::i;:::-;11355:70;11421:2;11410:9;11406:18;11397:6;11355:70;:::i;:::-;11435;11501:2;11490:9;11486:18;11477:6;11435:70;:::i;:::-;11082:430;;;;;;:::o;11518:117::-;11627:1;11624;11617:12;11641:117;11750:1;11747;11740:12;11764:117;11873:1;11870;11863:12;11900:552;11957:8;11967:6;12017:3;12010:4;12002:6;11998:17;11994:27;11984:122;;12025:79;;:::i;:::-;11984:122;12138:6;12125:20;12115:30;;12168:18;12160:6;12157:30;12154:117;;;12190:79;;:::i;:::-;12154:117;12304:4;12296:6;12292:17;12280:29;;12358:3;12350:4;12342:6;12338:17;12328:8;12324:32;12321:41;12318:128;;;12365:79;;:::i;:::-;12318:128;11900:552;;;;;:::o;12458:817::-;12546:6;12554;12562;12570;12619:2;12607:9;12598:7;12594:23;12590:32;12587:119;;;12625:79;;:::i;:::-;12587:119;12745:1;12770:53;12815:7;12806:6;12795:9;12791:22;12770:53;:::i;:::-;12760:63;;12716:117;12872:2;12898:53;12943:7;12934:6;12923:9;12919:22;12898:53;:::i;:::-;12888:63;;12843:118;13028:2;13017:9;13013:18;13000:32;13059:18;13051:6;13048:30;13045:117;;;13081:79;;:::i;:::-;13045:117;13194:64;13250:7;13241:6;13230:9;13226:22;13194:64;:::i;:::-;13176:82;;;;12971:297;12458:817;;;;;;;:::o;13281:86::-;13316:7;13356:4;13349:5;13345:16;13334:27;;13281:86;;;:::o;13373:112::-;13456:22;13472:5;13456:22;:::i;:::-;13451:3;13444:35;13373:112;;:::o;13491:214::-;13580:4;13618:2;13607:9;13603:18;13595:26;;13631:67;13695:1;13684:9;13680:17;13671:6;13631:67;:::i;:::-;13491:214;;;;:::o;13711:118::-;13798:24;13816:5;13798:24;:::i;:::-;13793:3;13786:37;13711:118;;:::o;13835:222::-;13928:4;13966:2;13955:9;13951:18;13943:26;;13979:71;14047:1;14036:9;14032:17;14023:6;13979:71;:::i;:::-;13835:222;;;;:::o;14063:763::-;14148:6;14156;14164;14172;14221:3;14209:9;14200:7;14196:23;14192:33;14189:120;;;14228:79;;:::i;:::-;14189:120;14348:1;14373:53;14418:7;14409:6;14398:9;14394:22;14373:53;:::i;:::-;14363:63;;14319:117;14475:2;14501:52;14545:7;14536:6;14525:9;14521:22;14501:52;:::i;:::-;14491:62;;14446:117;14602:2;14628:53;14673:7;14664:6;14653:9;14649:22;14628:53;:::i;:::-;14618:63;;14573:118;14730:2;14756:53;14801:7;14792:6;14781:9;14777:22;14756:53;:::i;:::-;14746:63;;14701:118;14063:763;;;;;;;:::o;14832:105::-;14907:23;14924:5;14907:23;:::i;:::-;14902:3;14895:36;14832:105;;:::o;14943:::-;15018:23;15035:5;15018:23;:::i;:::-;15013:3;15006:36;14943:105;;:::o;15054:::-;15129:23;15146:5;15129:23;:::i;:::-;15124:3;15117:36;15054:105;;:::o;15279:705::-;15448:4;15443:3;15439:14;15537:4;15530:5;15526:16;15520:23;15556:61;15611:4;15606:3;15602:14;15588:12;15556:61;:::i;:::-;15463:164;15710:4;15703:5;15699:16;15693:23;15729:61;15784:4;15779:3;15775:14;15761:12;15729:61;:::i;:::-;15637:163;15887:4;15880:5;15876:16;15870:23;15906:61;15961:4;15956:3;15952:14;15938:12;15906:61;:::i;:::-;15810:167;15417:567;15279:705;;:::o;15990:366::-;16155:4;16193:2;16182:9;16178:18;16170:26;;16206:143;16346:1;16335:9;16331:17;16322:6;16206:143;:::i;:::-;15990:366;;;;:::o;16362:118::-;16399:7;16439:34;16432:5;16428:46;16417:57;;16362:118;;;:::o;16486:::-;16573:24;16591:5;16573:24;:::i;:::-;16568:3;16561:37;16486:118;;:::o;16610:222::-;16703:4;16741:2;16730:9;16726:18;16718:26;;16754:71;16822:1;16811:9;16807:17;16798:6;16754:71;:::i;:::-;16610:222;;;;:::o;16838:180::-;16886:77;16883:1;16876:88;16983:4;16980:1;16973:15;17007:4;17004:1;16997:15;17024:191;17064:3;17083:20;17101:1;17083:20;:::i;:::-;17078:25;;17117:20;17135:1;17117:20;:::i;:::-;17112:25;;17160:1;17157;17153:9;17146:16;;17181:3;17178:1;17175:10;17172:36;;;17188:18;;:::i;:::-;17172:36;17024:191;;;;:::o;17221:180::-;17269:77;17266:1;17259:88;17366:4;17363:1;17356:15;17390:4;17387:1;17380:15;17407:320;17451:6;17488:1;17482:4;17478:12;17468:22;;17535:1;17529:4;17525:12;17556:18;17546:81;;17612:4;17604:6;17600:17;17590:27;;17546:81;17674:2;17666:6;17663:14;17643:18;17640:38;17637:84;;17693:18;;:::i;:::-;17637:84;17458:269;17407:320;;;:::o;17733:157::-;17873:9;17869:1;17861:6;17857:14;17850:33;17733:157;:::o;17896:365::-;18038:3;18059:66;18123:1;18118:3;18059:66;:::i;:::-;18052:73;;18134:93;18223:3;18134:93;:::i;:::-;18252:2;18247:3;18243:12;18236:19;;17896:365;;;:::o;18267:419::-;18433:4;18471:2;18460:9;18456:18;18448:26;;18520:9;18514:4;18510:20;18506:1;18495:9;18491:17;18484:47;18548:131;18674:4;18548:131;:::i;:::-;18540:139;;18267:419;;;:::o;18692:160::-;18832:12;18828:1;18820:6;18816:14;18809:36;18692:160;:::o;18858:366::-;19000:3;19021:67;19085:2;19080:3;19021:67;:::i;:::-;19014:74;;19097:93;19186:3;19097:93;:::i;:::-;19215:2;19210:3;19206:12;19199:19;;18858:366;;;:::o;19230:419::-;19396:4;19434:2;19423:9;19419:18;19411:26;;19483:9;19477:4;19473:20;19469:1;19458:9;19454:17;19447:47;19511:131;19637:4;19511:131;:::i;:::-;19503:139;;19230:419;;;:::o;19655:194::-;19695:4;19715:20;19733:1;19715:20;:::i;:::-;19710:25;;19749:20;19767:1;19749:20;:::i;:::-;19744:25;;19793:1;19790;19786:9;19778:17;;19817:1;19811:4;19808:11;19805:37;;;19822:18;;:::i;:::-;19805:37;19655:194;;;;:::o;19855:160::-;19995:12;19991:1;19983:6;19979:14;19972:36;19855:160;:::o;20021:366::-;20163:3;20184:67;20248:2;20243:3;20184:67;:::i;:::-;20177:74;;20260:93;20349:3;20260:93;:::i;:::-;20378:2;20373:3;20369:12;20362:19;;20021:366;;;:::o;20393:419::-;20559:4;20597:2;20586:9;20582:18;20574:26;;20646:9;20640:4;20636:20;20632:1;20621:9;20617:17;20610:47;20674:131;20800:4;20674:131;:::i;:::-;20666:139;;20393:419;;;:::o;20818:168::-;20958:20;20954:1;20946:6;20942:14;20935:44;20818:168;:::o;20992:366::-;21134:3;21155:67;21219:2;21214:3;21155:67;:::i;:::-;21148:74;;21231:93;21320:3;21231:93;:::i;:::-;21349:2;21344:3;21340:12;21333:19;;20992:366;;;:::o;21364:419::-;21530:4;21568:2;21557:9;21553:18;21545:26;;21617:9;21611:4;21607:20;21603:1;21592:9;21588:17;21581:47;21645:131;21771:4;21645:131;:::i;:::-;21637:139;;21364:419;;;:::o;21789:410::-;21829:7;21852:20;21870:1;21852:20;:::i;:::-;21847:25;;21886:20;21904:1;21886:20;:::i;:::-;21881:25;;21941:1;21938;21934:9;21963:30;21981:11;21963:30;:::i;:::-;21952:41;;22142:1;22133:7;22129:15;22126:1;22123:22;22103:1;22096:9;22076:83;22053:139;;22172:18;;:::i;:::-;22053:139;21837:362;21789:410;;;;:::o;22205:180::-;22253:77;22250:1;22243:88;22350:4;22347:1;22340:15;22374:4;22371:1;22364:15;22391:185;22431:1;22448:20;22466:1;22448:20;:::i;:::-;22443:25;;22482:20;22500:1;22482:20;:::i;:::-;22477:25;;22521:1;22511:35;;22526:18;;:::i;:::-;22511:35;22568:1;22565;22561:9;22556:14;;22391:185;;;;:::o;22582:167::-;22722:19;22718:1;22710:6;22706:14;22699:43;22582:167;:::o;22755:366::-;22897:3;22918:67;22982:2;22977:3;22918:67;:::i;:::-;22911:74;;22994:93;23083:3;22994:93;:::i;:::-;23112:2;23107:3;23103:12;23096:19;;22755:366;;;:::o;23127:419::-;23293:4;23331:2;23320:9;23316:18;23308:26;;23380:9;23374:4;23370:20;23366:1;23355:9;23351:17;23344:47;23408:131;23534:4;23408:131;:::i;:::-;23400:139;;23127:419;;;:::o;23552:168::-;23692:20;23688:1;23680:6;23676:14;23669:44;23552:168;:::o;23726:366::-;23868:3;23889:67;23953:2;23948:3;23889:67;:::i;:::-;23882:74;;23965:93;24054:3;23965:93;:::i;:::-;24083:2;24078:3;24074:12;24067:19;;23726:366;;;:::o;24098:419::-;24264:4;24302:2;24291:9;24287:18;24279:26;;24351:9;24345:4;24341:20;24337:1;24326:9;24322:17;24315:47;24379:131;24505:4;24379:131;:::i;:::-;24371:139;;24098:419;;;:::o;24523:180::-;24571:77;24568:1;24561:88;24668:4;24665:1;24658:15;24692:4;24689:1;24682:15;24709:163;24849:15;24845:1;24837:6;24833:14;24826:39;24709:163;:::o;24878:366::-;25020:3;25041:67;25105:2;25100:3;25041:67;:::i;:::-;25034:74;;25117:93;25206:3;25117:93;:::i;:::-;25235:2;25230:3;25226:12;25219:19;;24878:366;;;:::o;25250:419::-;25416:4;25454:2;25443:9;25439:18;25431:26;;25503:9;25497:4;25493:20;25489:1;25478:9;25474:17;25467:47;25531:131;25657:4;25531:131;:::i;:::-;25523:139;;25250:419;;;:::o;25675:122::-;25748:24;25766:5;25748:24;:::i;:::-;25741:5;25738:35;25728:63;;25787:1;25784;25777:12;25728:63;25675:122;:::o;25803:143::-;25860:5;25891:6;25885:13;25876:22;;25907:33;25934:5;25907:33;:::i;:::-;25803:143;;;;:::o;25952:351::-;26022:6;26071:2;26059:9;26050:7;26046:23;26042:32;26039:119;;;26077:79;;:::i;:::-;26039:119;26197:1;26222:64;26278:7;26269:6;26258:9;26254:22;26222:64;:::i;:::-;26212:74;;26168:128;25952:351;;;;:::o

Swarm Source

ipfs://328f0fbbc2c230ab0b2baa7351327ca952449758c2fcb28fb33fe2b826f38dba
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.