library UintArray {
    function hashSubArray(uint256[] memory array, uint256 subArrayStart, uint256 subArraySize)
        internal pure
        returns(bytes32 subArrayHash)
    {
        require(array.length >= subArrayStart + subArraySize, "ILLEGAL_SUBARRAY_DIMENSIONS");
        uint256 startOffsetBytes = 0x20 * (1 + subArrayStart);
        uint256 dataSizeBytes = 0x20 * subArraySize;
        assembly {
            subArrayHash := keccak256(add(array, startOffsetBytes), dataSizeBytes)
        }
    }

    /*
      Returns the address of a cell in offset within a uint256[] array.
      This allows assigning new variable of dynamic unit256[] pointing to a sub_array
      with a layout of serialied uint256[] (i.e. length+content).
    */
    function extractSerializedUintArray(uint256[] memory programOutput, uint256 offset)
        internal pure
        returns (uint256[] memory addr)
    {
        uint256 memOffset = 0x20 * (offset + 1);
        assembly {
            addr := add(programOutput, memOffset)
        }
    }

}
function extractSerializedUintArray(uint256[] memory programOutput, uint256 offset)
    internal pure
    returns (uint256[] memory addr)
{
    uint256 memOffset = 0x20 * (offset + 1);
    assembly {
        addr := add(programOutput, memOffset)
    }
}

/*
 Returns the address of a cell in offset within a uint256[] array.
 This allows assigning new variable of dynamic unit256[] pointing to a sub_array
 with a layout of serialied uint256[] (i.e. length+content).
 */