Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions Lib/_pydecimal.py
Original file line number Diff line number Diff line change
Expand Up @@ -431,10 +431,7 @@ class FloatOperation(DecimalException, TypeError):
##### Context Functions ##################################################

# The getcontext() and setcontext() function manage access to a thread-local
# current context. Py2.4 offers direct support for thread locals. If that
# is not available, use threading.current_thread() which is slower but will
# work for older Pythons. If threads are not part of the build, create a
# mock threading object with threading.local() returning the module namespace.
# current context.

import threading

Expand Down
14 changes: 1 addition & 13 deletions Lib/importlib/_bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -1121,25 +1121,13 @@ def _setup(sys_module, _imp_module):

# Directly load built-in modules needed during bootstrap.
self_module = sys.modules[__name__]
for builtin_name in ('_warnings',):
for builtin_name in ('_thread', '_warnings', '_weakref'):
if builtin_name not in sys.modules:
builtin_module = _builtin_from_name(builtin_name)
else:
builtin_module = sys.modules[builtin_name]
setattr(self_module, builtin_name, builtin_module)

# Directly load the _thread module (needed during bootstrap).
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please look also at _bootstrap_external.py. It contains almost duplicated code.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like you're right. @ericsnowcurrently, out of curiosity, why the two "bootstrap" modules?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A while back we split the fundamental import machinery from the file-based parts. The "external" part encapsulates the file-based finders and loaders (e.g. .py, extensions) and related functionality. In addition to maintenance benefits, during runtime startup it helps to have a hard separation between the two. Furthermore, the split also supports some planned work (encapsulating the import state).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In particular, with the multi-phase bootstrap refactoring, the builtin and frozen module support is initialised as one of the last steps in the core runtime initialisation (https://github.com/python/cpython/blob/master/Python/pylifecycle.c#L717), while setting up filesystem imports doesn't happen until the main interpreter is being configured (https://github.com/python/cpython/blob/master/Python/pylifecycle.c#L803)

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you both for the explanation. I think if those files had been named something else (such as _bootstrap_core.py and _bootstrap_importers.py) the situation would have been less confusing to me ("externals" sounded it was something else entirely). Also, you could consider improving the top-level module docstrings and/or comments to describe the split accurately.

try:
thread_module = _builtin_from_name('_thread')
except ImportError:
# Python was built without threads
thread_module = None
setattr(self_module, '_thread', thread_module)

# Directly load the _weakref module (needed during bootstrap).
weakref_module = _builtin_from_name('_weakref')
setattr(self_module, '_weakref', weakref_module)


def _install(sys_module, _imp_module):
"""Install importers for builtin and frozen modules"""
Expand Down
6 changes: 1 addition & 5 deletions Lib/importlib/_bootstrap_external.py
Original file line number Diff line number Diff line change
Expand Up @@ -1411,11 +1411,7 @@ def _setup(_bootstrap_module):
setattr(self_module, 'path_separators', ''.join(path_separators))

# Directly load the _thread module (needed during bootstrap).
try:
thread_module = _bootstrap._builtin_from_name('_thread')
except ImportError:
# Python was built without threads
thread_module = None
thread_module = _bootstrap._builtin_from_name('_thread')
setattr(self_module, '_thread', thread_module)

# Directly load the _weakref module (needed during bootstrap).
Expand Down
2 changes: 1 addition & 1 deletion Lib/test/ssl_servers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
import sys
import ssl
import pprint
import threading
import urllib.parse
# Rename HTTPServer to _HTTPServer so as to avoid confusion with HTTPSServer.
from http.server import (HTTPServer as _HTTPServer,
SimpleHTTPRequestHandler, BaseHTTPRequestHandler)

from test import support
threading = support.import_module("threading")

here = os.path.dirname(__file__)

Expand Down
1 change: 0 additions & 1 deletion Lib/test/support/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2060,7 +2060,6 @@ def threading_cleanup(*original_values):
def reap_threads(func):
"""Use this function when threads are being used. This will
ensure that the threads are cleaned up even when the test fails.
If threading is unavailable this function does nothing.
"""
@functools.wraps(func)
def decorator(*args):
Expand Down
3 changes: 1 addition & 2 deletions Lib/test/test_httplib.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import os
import array
import socket
import threading

import unittest
TestCase = unittest.TestCase
Expand Down Expand Up @@ -1077,8 +1078,6 @@ def test_read1_bound_content_length(self):

def test_response_fileno(self):
# Make sure fd returned by fileno is valid.
threading = support.import_module("threading")

serv = socket.socket(
socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
self.addCleanup(serv.close)
Expand Down
2 changes: 1 addition & 1 deletion Lib/test/test_idle.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import unittest
from test.support import import_module

# Skip test if _thread or _tkinter wasn't built, if idlelib is missing,
# Skip test if _tkinter wasn't built, if idlelib is missing,
# or if tcl/tk is not the 8.5+ needed for ttk widgets.
tk = import_module('tkinter') # imports _tkinter
if tk.TkVersion < 8.5:
Expand Down
3 changes: 1 addition & 2 deletions Lib/test/test_multiprocessing_main_handling.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
# tests __main__ module handling in multiprocessing
from test import support
# Skip tests if _thread or _multiprocessing wasn't built.
support.import_module('_thread')
# Skip tests if _multiprocessing wasn't built.
support.import_module('_multiprocessing')

import importlib
Expand Down
2 changes: 1 addition & 1 deletion Lib/test/test_thread.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import unittest
import random
from test import support
thread = support.import_module('_thread')
import _thread as thread
import time
import sys
import weakref
Expand Down
2 changes: 1 addition & 1 deletion Lib/test/test_threadsignals.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import os
import sys
from test import support
thread = support.import_module('_thread')
import _thread as thread
import time

if (sys.platform[:3] == 'win'):
Expand Down
1 change: 0 additions & 1 deletion Lib/test/test_tools/test_sundry.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ def test_sundry_windows(self):
for name in self.windows_only:
import_tool(name)

@unittest.skipIf(not support.threading, "test requires _thread module")
def test_analyze_dxp_import(self):
if hasattr(sys, 'getdxp'):
import_tool('analyze_dxp')
Expand Down
2 changes: 1 addition & 1 deletion Lib/test/test_winreg.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import os, sys, errno
import unittest
from test import support
threading = support.import_module("threading")
import threading
from platform import machine

# Do this first so test will be skipped if module doesn't exist
Expand Down
2 changes: 1 addition & 1 deletion Lib/test/test_wsgiref.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import re
import signal
import sys
import threading
import unittest


Expand Down Expand Up @@ -253,7 +254,6 @@ def test_interrupted_write(self):
# BaseHandler._write() and _flush() have to write all data, even if
# it takes multiple send() calls. Test this by interrupting a send()
# call with a Unix signal.
threading = support.import_module("threading")
pthread_kill = support.get_attribute(signal, "pthread_kill")

def app(environ, start_response):
Expand Down
8 changes: 1 addition & 7 deletions Lib/test/test_xmlrpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -1175,13 +1175,7 @@ def test_gzip_decode_limit(self):
class ServerProxyTestCase(unittest.TestCase):
def setUp(self):
unittest.TestCase.setUp(self)
if threading:
self.url = URL
else:
# Without threading, http_server() and http_multi_server() will not
# be executed and URL is still equal to None. 'http://' is a just
# enough to choose the scheme (HTTP)
self.url = 'http://'
self.url = URL

def test_close(self):
p = xmlrpclib.ServerProxy(self.url)
Expand Down
185 changes: 89 additions & 96 deletions Python/importlib.h
Original file line number Diff line number Diff line change
Expand Up @@ -1707,8 +1707,8 @@ const unsigned char _Py_M__importlib[] = {
0,0,0,114,11,0,0,0,218,18,95,98,117,105,108,116,
105,110,95,102,114,111,109,95,110,97,109,101,66,4,0,0,
115,8,0,0,0,0,1,10,1,8,1,12,1,114,197,0,
0,0,99,2,0,0,0,0,0,0,0,12,0,0,0,12,
0,0,0,67,0,0,0,115,244,0,0,0,124,1,97,0,
0,0,99,2,0,0,0,0,0,0,0,10,0,0,0,5,
0,0,0,67,0,0,0,115,174,0,0,0,124,1,97,0,
124,0,97,1,116,2,116,1,131,1,125,2,120,86,116,1,
106,3,160,4,161,0,68,0,93,72,92,2,125,3,125,4,
116,5,124,4,124,2,131,2,114,28,124,3,116,1,106,6,
Expand All @@ -1719,101 +1719,94 @@ const unsigned char _Py_M__importlib[] = {
100,5,68,0,93,46,125,8,124,8,116,1,106,3,107,7,
114,144,116,13,124,8,131,1,125,9,110,10,116,1,106,3,
124,8,25,0,125,9,116,14,124,7,124,8,124,9,131,3,
1,0,113,120,87,0,121,12,116,13,100,2,131,1,125,10,
87,0,110,24,4,0,116,15,107,10,114,206,1,0,1,0,
1,0,100,3,125,10,89,0,110,2,88,0,116,14,124,7,
100,2,124,10,131,3,1,0,116,13,100,4,131,1,125,11,
116,14,124,7,100,4,124,11,131,3,1,0,100,3,83,0,
41,6,122,250,83,101,116,117,112,32,105,109,112,111,114,116,
108,105,98,32,98,121,32,105,109,112,111,114,116,105,110,103,
32,110,101,101,100,101,100,32,98,117,105,108,116,45,105,110,
32,109,111,100,117,108,101,115,32,97,110,100,32,105,110,106,
101,99,116,105,110,103,32,116,104,101,109,10,32,32,32,32,
105,110,116,111,32,116,104,101,32,103,108,111,98,97,108,32,
110,97,109,101,115,112,97,99,101,46,10,10,32,32,32,32,
65,115,32,115,121,115,32,105,115,32,110,101,101,100,101,100,
32,102,111,114,32,115,121,115,46,109,111,100,117,108,101,115,
32,97,99,99,101,115,115,32,97,110,100,32,95,105,109,112,
32,105,115,32,110,101,101,100,101,100,32,116,111,32,108,111,
97,100,32,98,117,105,108,116,45,105,110,10,32,32,32,32,
109,111,100,117,108,101,115,44,32,116,104,111,115,101,32,116,
119,111,32,109,111,100,117,108,101,115,32,109,117,115,116,32,
98,101,32,101,120,112,108,105,99,105,116,108,121,32,112,97,
115,115,101,100,32,105,110,46,10,10,32,32,32,32,114,167,
0,0,0,114,20,0,0,0,78,114,56,0,0,0,41,1,
114,167,0,0,0,41,16,114,49,0,0,0,114,14,0,0,
0,114,13,0,0,0,114,80,0,0,0,218,5,105,116,101,
109,115,114,171,0,0,0,114,70,0,0,0,114,142,0,0,
0,114,76,0,0,0,114,152,0,0,0,114,129,0,0,0,
114,134,0,0,0,114,1,0,0,0,114,197,0,0,0,114,
5,0,0,0,114,71,0,0,0,41,12,218,10,115,121,115,
95,109,111,100,117,108,101,218,11,95,105,109,112,95,109,111,
100,117,108,101,90,11,109,111,100,117,108,101,95,116,121,112,
101,114,15,0,0,0,114,84,0,0,0,114,94,0,0,0,
114,83,0,0,0,90,11,115,101,108,102,95,109,111,100,117,
108,101,90,12,98,117,105,108,116,105,110,95,110,97,109,101,
90,14,98,117,105,108,116,105,110,95,109,111,100,117,108,101,
90,13,116,104,114,101,97,100,95,109,111,100,117,108,101,90,
14,119,101,97,107,114,101,102,95,109,111,100,117,108,101,114,
1,0,113,120,87,0,100,4,83,0,41,6,122,250,83,101,
116,117,112,32,105,109,112,111,114,116,108,105,98,32,98,121,
32,105,109,112,111,114,116,105,110,103,32,110,101,101,100,101,
100,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,
101,115,32,97,110,100,32,105,110,106,101,99,116,105,110,103,
32,116,104,101,109,10,32,32,32,32,105,110,116,111,32,116,
104,101,32,103,108,111,98,97,108,32,110,97,109,101,115,112,
97,99,101,46,10,10,32,32,32,32,65,115,32,115,121,115,
32,105,115,32,110,101,101,100,101,100,32,102,111,114,32,115,
121,115,46,109,111,100,117,108,101,115,32,97,99,99,101,115,
115,32,97,110,100,32,95,105,109,112,32,105,115,32,110,101,
101,100,101,100,32,116,111,32,108,111,97,100,32,98,117,105,
108,116,45,105,110,10,32,32,32,32,109,111,100,117,108,101,
115,44,32,116,104,111,115,101,32,116,119,111,32,109,111,100,
117,108,101,115,32,109,117,115,116,32,98,101,32,101,120,112,
108,105,99,105,116,108,121,32,112,97,115,115,101,100,32,105,
110,46,10,10,32,32,32,32,114,20,0,0,0,114,167,0,
0,0,114,56,0,0,0,78,41,3,114,20,0,0,0,114,
167,0,0,0,114,56,0,0,0,41,15,114,49,0,0,0,
114,14,0,0,0,114,13,0,0,0,114,80,0,0,0,218,
5,105,116,101,109,115,114,171,0,0,0,114,70,0,0,0,
114,142,0,0,0,114,76,0,0,0,114,152,0,0,0,114,
129,0,0,0,114,134,0,0,0,114,1,0,0,0,114,197,
0,0,0,114,5,0,0,0,41,10,218,10,115,121,115,95,
109,111,100,117,108,101,218,11,95,105,109,112,95,109,111,100,
117,108,101,90,11,109,111,100,117,108,101,95,116,121,112,101,
114,15,0,0,0,114,84,0,0,0,114,94,0,0,0,114,
83,0,0,0,90,11,115,101,108,102,95,109,111,100,117,108,
101,90,12,98,117,105,108,116,105,110,95,110,97,109,101,90,
14,98,117,105,108,116,105,110,95,109,111,100,117,108,101,114,
10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,6,
95,115,101,116,117,112,73,4,0,0,115,50,0,0,0,0,
95,115,101,116,117,112,73,4,0,0,115,36,0,0,0,0,
9,4,1,4,3,8,1,20,1,10,1,10,1,6,1,10,
1,6,2,2,1,10,1,14,3,10,1,10,1,10,1,10,
2,10,1,16,3,2,1,12,1,14,2,10,1,12,3,8,
1,114,201,0,0,0,99,2,0,0,0,0,0,0,0,2,
0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0,
116,0,124,0,124,1,131,2,1,0,116,1,106,2,160,3,
116,4,161,1,1,0,116,1,106,2,160,3,116,5,161,1,
1,0,100,1,83,0,41,2,122,48,73,110,115,116,97,108,
108,32,105,109,112,111,114,116,101,114,115,32,102,111,114,32,
98,117,105,108,116,105,110,32,97,110,100,32,102,114,111,122,
101,110,32,109,111,100,117,108,101,115,78,41,6,114,201,0,
0,0,114,14,0,0,0,114,166,0,0,0,114,110,0,0,
0,114,142,0,0,0,114,152,0,0,0,41,2,114,199,0,
0,0,114,200,0,0,0,114,10,0,0,0,114,10,0,0,
0,114,11,0,0,0,218,8,95,105,110,115,116,97,108,108,
120,4,0,0,115,6,0,0,0,0,2,10,2,12,1,114,
202,0,0,0,99,0,0,0,0,0,0,0,0,1,0,0,
0,4,0,0,0,67,0,0,0,115,32,0,0,0,100,1,
100,2,108,0,125,0,124,0,97,1,124,0,160,2,116,3,
106,4,116,5,25,0,161,1,1,0,100,2,83,0,41,3,
122,57,73,110,115,116,97,108,108,32,105,109,112,111,114,116,
101,114,115,32,116,104,97,116,32,114,101,113,117,105,114,101,
32,101,120,116,101,114,110,97,108,32,102,105,108,101,115,121,
115,116,101,109,32,97,99,99,101,115,115,114,19,0,0,0,
78,41,6,218,26,95,102,114,111,122,101,110,95,105,109,112,
111,114,116,108,105,98,95,101,120,116,101,114,110,97,108,114,
116,0,0,0,114,202,0,0,0,114,14,0,0,0,114,80,
0,0,0,114,1,0,0,0,41,1,114,203,0,0,0,114,
10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,27,
95,105,110,115,116,97,108,108,95,101,120,116,101,114,110,97,
108,95,105,109,112,111,114,116,101,114,115,128,4,0,0,115,
6,0,0,0,0,3,8,1,4,1,114,204,0,0,0,41,
2,78,78,41,1,78,41,2,78,114,19,0,0,0,41,51,
114,3,0,0,0,114,116,0,0,0,114,12,0,0,0,114,
16,0,0,0,114,51,0,0,0,114,29,0,0,0,114,36,
0,0,0,114,17,0,0,0,114,18,0,0,0,114,41,0,
0,0,114,42,0,0,0,114,45,0,0,0,114,57,0,0,
0,114,59,0,0,0,114,69,0,0,0,114,75,0,0,0,
114,78,0,0,0,114,85,0,0,0,114,96,0,0,0,114,
97,0,0,0,114,103,0,0,0,114,79,0,0,0,114,129,
0,0,0,114,134,0,0,0,114,137,0,0,0,114,92,0,
0,0,114,81,0,0,0,114,140,0,0,0,114,141,0,0,
0,114,82,0,0,0,114,142,0,0,0,114,152,0,0,0,
114,157,0,0,0,114,163,0,0,0,114,165,0,0,0,114,
170,0,0,0,114,174,0,0,0,90,15,95,69,82,82,95,
77,83,71,95,80,82,69,70,73,88,114,176,0,0,0,114,
179,0,0,0,218,6,111,98,106,101,99,116,114,180,0,0,
0,114,181,0,0,0,114,182,0,0,0,114,189,0,0,0,
114,193,0,0,0,114,196,0,0,0,114,197,0,0,0,114,
201,0,0,0,114,202,0,0,0,114,204,0,0,0,114,10,
0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,
0,0,218,8,60,109,111,100,117,108,101,62,25,0,0,0,
115,96,0,0,0,4,0,4,2,8,8,8,8,4,2,4,
3,16,4,14,68,14,21,14,16,8,37,8,17,8,11,14,
8,8,11,8,12,8,16,8,36,14,27,14,101,16,26,10,
45,14,60,8,17,8,17,8,24,8,29,8,23,8,15,14,
73,14,77,14,13,8,9,8,9,10,47,8,16,4,1,8,
2,8,27,6,3,8,16,10,15,8,31,8,27,18,35,8,
7,8,47,8,8,
2,10,1,114,201,0,0,0,99,2,0,0,0,0,0,0,
0,2,0,0,0,3,0,0,0,67,0,0,0,115,38,0,
0,0,116,0,124,0,124,1,131,2,1,0,116,1,106,2,
160,3,116,4,161,1,1,0,116,1,106,2,160,3,116,5,
161,1,1,0,100,1,83,0,41,2,122,48,73,110,115,116,
97,108,108,32,105,109,112,111,114,116,101,114,115,32,102,111,
114,32,98,117,105,108,116,105,110,32,97,110,100,32,102,114,
111,122,101,110,32,109,111,100,117,108,101,115,78,41,6,114,
201,0,0,0,114,14,0,0,0,114,166,0,0,0,114,110,
0,0,0,114,142,0,0,0,114,152,0,0,0,41,2,114,
199,0,0,0,114,200,0,0,0,114,10,0,0,0,114,10,
0,0,0,114,11,0,0,0,218,8,95,105,110,115,116,97,
108,108,108,4,0,0,115,6,0,0,0,0,2,10,2,12,
1,114,202,0,0,0,99,0,0,0,0,0,0,0,0,1,
0,0,0,4,0,0,0,67,0,0,0,115,32,0,0,0,
100,1,100,2,108,0,125,0,124,0,97,1,124,0,160,2,
116,3,106,4,116,5,25,0,161,1,1,0,100,2,83,0,
41,3,122,57,73,110,115,116,97,108,108,32,105,109,112,111,
114,116,101,114,115,32,116,104,97,116,32,114,101,113,117,105,
114,101,32,101,120,116,101,114,110,97,108,32,102,105,108,101,
115,121,115,116,101,109,32,97,99,99,101,115,115,114,19,0,
0,0,78,41,6,218,26,95,102,114,111,122,101,110,95,105,
109,112,111,114,116,108,105,98,95,101,120,116,101,114,110,97,
108,114,116,0,0,0,114,202,0,0,0,114,14,0,0,0,
114,80,0,0,0,114,1,0,0,0,41,1,114,203,0,0,
0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,
218,27,95,105,110,115,116,97,108,108,95,101,120,116,101,114,
110,97,108,95,105,109,112,111,114,116,101,114,115,116,4,0,
0,115,6,0,0,0,0,3,8,1,4,1,114,204,0,0,
0,41,2,78,78,41,1,78,41,2,78,114,19,0,0,0,
41,51,114,3,0,0,0,114,116,0,0,0,114,12,0,0,
0,114,16,0,0,0,114,51,0,0,0,114,29,0,0,0,
114,36,0,0,0,114,17,0,0,0,114,18,0,0,0,114,
41,0,0,0,114,42,0,0,0,114,45,0,0,0,114,57,
0,0,0,114,59,0,0,0,114,69,0,0,0,114,75,0,
0,0,114,78,0,0,0,114,85,0,0,0,114,96,0,0,
0,114,97,0,0,0,114,103,0,0,0,114,79,0,0,0,
114,129,0,0,0,114,134,0,0,0,114,137,0,0,0,114,
92,0,0,0,114,81,0,0,0,114,140,0,0,0,114,141,
0,0,0,114,82,0,0,0,114,142,0,0,0,114,152,0,
0,0,114,157,0,0,0,114,163,0,0,0,114,165,0,0,
0,114,170,0,0,0,114,174,0,0,0,90,15,95,69,82,
82,95,77,83,71,95,80,82,69,70,73,88,114,176,0,0,
0,114,179,0,0,0,218,6,111,98,106,101,99,116,114,180,
0,0,0,114,181,0,0,0,114,182,0,0,0,114,189,0,
0,0,114,193,0,0,0,114,196,0,0,0,114,197,0,0,
0,114,201,0,0,0,114,202,0,0,0,114,204,0,0,0,
114,10,0,0,0,114,10,0,0,0,114,10,0,0,0,114,
11,0,0,0,218,8,60,109,111,100,117,108,101,62,25,0,
0,0,115,96,0,0,0,4,0,4,2,8,8,8,8,4,
2,4,3,16,4,14,68,14,21,14,16,8,37,8,17,8,
11,14,8,8,11,8,12,8,16,8,36,14,27,14,101,16,
26,10,45,14,60,8,17,8,17,8,24,8,29,8,23,8,
15,14,73,14,77,14,13,8,9,8,9,10,47,8,16,4,
1,8,2,8,27,6,3,8,16,10,15,8,31,8,27,18,
35,8,7,8,35,8,8,
};
Loading