def main(): parser = argparse.ArgumentParser(prog="python -m ensurepip") parser.add_argument( "--version", action="version", version="pip {}".format(ensurepip.version()), help="Show the version of pip that is bundled with this Python.", ) parser.add_argument( "-v", "--verbose", action="count", default=0, dest="verbosity", help=("Give more output. Option is additive, and can be used up to 3 " "times."), ) parser.add_argument( "-U", "--upgrade", action="store_true", default=False, help="Upgrade pip and dependencies, even if already installed.", ) parser.add_argument( "--user", action="store_true", default=False, help="Install using the user scheme.", ) parser.add_argument( "--root", default=None, help="Install everything relative to this alternate root directory.", ) parser.add_argument( "--altinstall", action="store_true", default=False, help=("Make an alternate install, installing only the X.Y versioned" "scripts (Default: pipX, pipX.Y, easy_install-X.Y)"), ) parser.add_argument( "--default-pip", action="store_true", default=False, help=("Make a default pip install, installing the unqualified pip " "and easy_install in addition to the versioned scripts"), ) args = parser.parse_args() ensurepip.bootstrap( root=args.root, upgrade=args.upgrade, user=args.user, verbosity=args.verbosity, altinstall=args.altinstall, default_pip=args.default_pip, )
def do_test_with_pip(self, system_site_packages): rmtree(self.env_dir) with EnvironmentVarGuard() as envvars: envvars['PYTHONWARNINGS'] = 'e' envvars['PIP_NO_INSTALL'] = '1' with tempfile.TemporaryDirectory() as home_dir: envvars['HOME'] = home_dir bad_config = '[global]\nno-install=1' win_location = 'pip', 'pip.ini' posix_location = '.pip', 'pip.conf' for dirname, fname in (posix_location, ): dirpath = os.path.join(home_dir, dirname) os.mkdir(dirpath) fpath = os.path.join(dirpath, fname) with open(fpath, 'w') as f: f.write(bad_config) try: self.run_with_capture( venv.create, self.env_dir, system_site_packages=system_site_packages, with_pip=True) except subprocess.CalledProcessError as exc: details = exc.output.decode(errors='replace') msg = '{}\n\n**Subprocess Output**\n{}' self.fail(msg.format(exc, details)) envpy = os.path.join(os.path.realpath(self.env_dir), self.bindir, self.exe) cmd = [envpy, '-Im', 'pip', '--version'] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() err = err.decode('latin-1') self.assertEqual(err, '') out = out.decode('latin-1') expected_version = 'pip {}'.format(ensurepip.version()) self.assertEqual(out[:len(expected_version)], expected_version) env_dir = os.fsencode(self.env_dir).decode('latin-1') self.assertIn(env_dir, out) cmd = [envpy, '-Im', 'ensurepip._uninstall'] with EnvironmentVarGuard() as envvars: p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() err = err.decode('latin-1') err = re.sub( '^The directory .* or its parent directory is not owned by the current user .*$', '', err, flags=re.MULTILINE) self.assertEqual(err.rstrip(), '') out = out.decode('latin-1') self.assertIn('Successfully uninstalled pip', out) self.assertIn('Successfully uninstalled setuptools', out) if not system_site_packages: self.assert_pip_not_installed()
def test_version(self): # Test version() with tempfile.TemporaryDirectory() as tmpdir: self.touch(tmpdir, "pip-1.2.3b1-py2.py3-none-any.whl") self.touch(tmpdir, "setuptools-49.1.3-py3-none-any.whl") with (unittest.mock.patch.object(ensurepip, '_PACKAGES', None), unittest.mock.patch.object(ensurepip, '_WHEEL_PKG_DIR', tmpdir)): self.assertEqual(ensurepip.version(), '1.2.3b1')
def test_with_pip(self): shutil.rmtree(self.env_dir) with EnvironmentVarGuard() as envvars: # pip's cross-version compatibility may trigger deprecation # warnings in current versions of Python. Ensure related # environment settings don't cause venv to fail. envvars["PYTHONWARNINGS"] = "e" # ensurepip is different enough from a normal pip invocation # that we want to ensure it ignores the normal pip environment # variable settings. We set PIP_NO_INSTALL here specifically # to check that ensurepip (and hence venv) ignores it. # See http://bugs.python.org/issue19734 for details envvars["PIP_NO_INSTALL"] = "1" try: self.run_with_capture(venv.create, self.env_dir, with_pip=True) except subprocess.CalledProcessError as exc: # The output this produces can be a little hard to read, but # least it has all the details details = exc.output.decode(errors="replace") msg = "{}\n\n**Subprocess Output**\n{}".format(exc, details) self.fail(msg) # Ensure pip is available in the virtual environment envpy = os.path.join(os.path.realpath(self.env_dir), self.bindir, self.exe) cmd = [envpy, '-Im', 'pip', '--version'] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() # We force everything to text, so unittest gives the detailed diff # if we get unexpected results err = err.decode("latin-1") # Force to text, prevent decoding errors self.assertEqual(err, "") out = out.decode("latin-1") # Force to text, prevent decoding errors expected_version = "pip {}".format(ensurepip.version()) self.assertEqual(out[:len(expected_version)], expected_version) env_dir = os.fsencode(self.env_dir).decode("latin-1") self.assertIn(env_dir, out) # http://bugs.python.org/issue19728 # Check the private uninstall command provided for the Windows # installers works (at least in a virtual environment) cmd = [envpy, '-Im', 'ensurepip._uninstall'] with EnvironmentVarGuard() as envvars: p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() # We force everything to text, so unittest gives the detailed diff # if we get unexpected results err = err.decode("latin-1") # Force to text, prevent decoding errors self.assertEqual(err, "") # Being fairly specific regarding the expected behaviour for the # initial bundling phase in Python 3.4. If the output changes in # future pip versions, this test can likely be relaxed further. out = out.decode("latin-1") # Force to text, prevent decoding errors self.assertIn("Successfully uninstalled pip", out) self.assertIn("Successfully uninstalled setuptools", out) # Check pip is now gone from the virtual environment self.assert_pip_not_installed()
def test_get_packages_no_dir(self): # Test _get_packages() without a wheel package directory with (unittest.mock.patch.object(ensurepip, '_PACKAGES', None), unittest.mock.patch.object(ensurepip, '_WHEEL_PKG_DIR', None)): packages = ensurepip._get_packages() # when bundled wheel packages are used, we get _PIP_VERSION self.assertEqual(ensurepip._PIP_VERSION, ensurepip.version()) # use bundled wheel packages self.assertIsNotNone(packages['pip'].wheel_name) self.assertIsNotNone(packages['setuptools'].wheel_name)
def _main(argv=None): parser = argparse.ArgumentParser(prog='python -m ensurepip._uninstall') parser.add_argument( '--version', action='version', version='pip {}'.format(ensurepip.version()), help='Show the version of pip this will attempt to uninstall.') parser.add_argument( '-v', '--verbose', action='count', default=0, dest='verbosity', help= 'Give more output. Option is additive, and can be used up to 3 times.') args = parser.parse_args(argv) ensurepip._uninstall_helper(verbosity=args.verbosity)
def fake_pip(version=ensurepip.version()): if version is None: pip = None else: class FakePip(): __version__ = version pip = FakePip() sentinel = object() orig_pip = sys.modules.get("pip", sentinel) sys.modules["pip"] = pip try: yield pip finally: if orig_pip is sentinel: del sys.modules["pip"] else: sys.modules["pip"] = orig_pip
def main(): parser = argparse.ArgumentParser(prog="python -m ensurepip._uninstall") parser.add_argument( "--version", action="version", version="pip {}".format(ensurepip.version()), help="Show the version of pip this will attempt to uninstall.", ) parser.add_argument( "-v", "--verbose", action="count", default=0, dest="verbosity", help=("Give more output. Option is additive, and can be used up to 3 " "times."), ) args = parser.parse_args() ensurepip._uninstall(verbosity=args.verbosity)
def _main(argv=None): parser = argparse.ArgumentParser(prog="python -m ensurepip._uninstall") parser.add_argument( "--version", action="version", version="pip {}".format(ensurepip.version()), help="Show the version of pip this will attempt to uninstall.", ) parser.add_argument( "-v", "--verbose", action="count", default=0, dest="verbosity", help=("Give more output. Option is additive, and can be used up to 3 " "times."), ) args = parser.parse_args(argv) ensurepip._uninstall_helper(verbosity=args.verbosity)
def do_test_with_pip(self, system_site_packages): rmtree(self.env_dir) with EnvironmentVarGuard() as envvars: # pip's cross-version compatibility may trigger deprecation # warnings in current versions of Python. Ensure related # environment settings don't cause venv to fail. envvars["PYTHONWARNINGS"] = "e" # ensurepip is different enough from a normal pip invocation # that we want to ensure it ignores the normal pip environment # variable settings. We set PIP_NO_INSTALL here specifically # to check that ensurepip (and hence venv) ignores it. # See http://bugs.python.org/issue19734 envvars["PIP_NO_INSTALL"] = "1" # Also check that we ignore the pip configuration file # See http://bugs.python.org/issue20053 with tempfile.TemporaryDirectory() as home_dir: envvars["HOME"] = home_dir bad_config = "[global]\nno-install=1" # Write to both config file names on all platforms to reduce # cross-platform variation in test code behaviour win_location = ("pip", "pip.ini") posix_location = (".pip", "pip.conf") # Skips win_location due to http://bugs.python.org/issue20541 for dirname, fname in (posix_location,): dirpath = os.path.join(home_dir, dirname) os.mkdir(dirpath) fpath = os.path.join(dirpath, fname) with open(fpath, 'w') as f: f.write(bad_config) # Actually run the create command with all that unhelpful # config in place to ensure we ignore it try: self.run_with_capture(venv.create, self.env_dir, system_site_packages=system_site_packages, with_pip=True) except subprocess.CalledProcessError as exc: # The output this produces can be a little hard to read, # but at least it has all the details details = exc.output.decode(errors="replace") msg = "{}\n\n**Subprocess Output**\n{}" self.fail(msg.format(exc, details)) # Ensure pip is available in the virtual environment envpy = os.path.join(os.path.realpath(self.env_dir), self.bindir, self.exe) # Ignore DeprecationWarning since pip code is not part of Python out, err = check_output([envpy, '-W', 'ignore::DeprecationWarning', '-I', '-m', 'pip', '--version']) # We force everything to text, so unittest gives the detailed diff # if we get unexpected results err = err.decode("latin-1") # Force to text, prevent decoding errors self.assertEqual(err, "") out = out.decode("latin-1") # Force to text, prevent decoding errors expected_version = "pip {}".format(ensurepip.version()) self.assertEqual(out[:len(expected_version)], expected_version) env_dir = os.fsencode(self.env_dir).decode("latin-1") self.assertIn(env_dir, out) # http://bugs.python.org/issue19728 # Check the private uninstall command provided for the Windows # installers works (at least in a virtual environment) with EnvironmentVarGuard() as envvars: out, err = check_output([envpy, '-W', 'ignore::DeprecationWarning', '-I', '-m', 'ensurepip._uninstall']) # We force everything to text, so unittest gives the detailed diff # if we get unexpected results err = err.decode("latin-1") # Force to text, prevent decoding errors # Ignore the warning: # "The directory '$HOME/.cache/pip/http' or its parent directory # is not owned by the current user and the cache has been disabled. # Please check the permissions and owner of that directory. If # executing pip with sudo, you may want sudo's -H flag." # where $HOME is replaced by the HOME environment variable. err = re.sub("^The directory .* or its parent directory is not owned " "by the current user .*$", "", err, flags=re.MULTILINE) self.assertEqual(err.rstrip(), "") # Being fairly specific regarding the expected behaviour for the # initial bundling phase in Python 3.4. If the output changes in # future pip versions, this test can likely be relaxed further. out = out.decode("latin-1") # Force to text, prevent decoding errors self.assertIn("Successfully uninstalled pip", out) self.assertIn("Successfully uninstalled setuptools", out) # Check pip is now gone from the virtual environment. This only # applies in the system_site_packages=False case, because in the # other case, pip may still be available in the system site-packages if not system_site_packages: self.assert_pip_not_installed()
def test_returns_version(self): self.assertEqual(ensurepip._PIP_VERSION, ensurepip.version())
def test_with_pip(self): shutil.rmtree(self.env_dir) with EnvironmentVarGuard() as envvars: # pip's cross-version compatibility may trigger deprecation # warnings in current versions of Python. Ensure related # environment settings don't cause venv to fail. envvars["PYTHONWARNINGS"] = "e" # ensurepip is different enough from a normal pip invocation # that we want to ensure it ignores the normal pip environment # variable settings. We set PIP_NO_INSTALL here specifically # to check that ensurepip (and hence venv) ignores it. # See http://bugs.python.org/issue19734 envvars["PIP_NO_INSTALL"] = "1" # Also check that we ignore the pip configuration file # See http://bugs.python.org/issue20053 with tempfile.TemporaryDirectory() as home_dir: envvars["HOME"] = home_dir bad_config = "[global]\nno-install=1" # Write to both config file names on all platforms to reduce # cross-platform variation in test code behaviour win_location = ("pip", "pip.ini") posix_location = (".pip", "pip.conf") # Skips win_location due to http://bugs.python.org/issue20541 for dirname, fname in (posix_location, ): dirpath = os.path.join(home_dir, dirname) os.mkdir(dirpath) fpath = os.path.join(dirpath, fname) with open(fpath, 'w') as f: f.write(bad_config) # Actually run the create command with all that unhelpful # config in place to ensure we ignore it try: self.run_with_capture(venv.create, self.env_dir, with_pip=True) except subprocess.CalledProcessError as exc: # The output this produces can be a little hard to read, # but at least it has all the details details = exc.output.decode(errors="replace") msg = "{}\n\n**Subprocess Output**\n{}" self.fail(msg.format(exc, details)) # Ensure pip is available in the virtual environment envpy = os.path.join(os.path.realpath(self.env_dir), self.bindir, self.exe) cmd = [envpy, '-Im', 'pip', '--version'] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() # We force everything to text, so unittest gives the detailed diff # if we get unexpected results err = err.decode("latin-1") # Force to text, prevent decoding errors self.assertEqual(err, "") out = out.decode("latin-1") # Force to text, prevent decoding errors expected_version = "pip {}".format(ensurepip.version()) self.assertEqual(out[:len(expected_version)], expected_version) env_dir = os.fsencode(self.env_dir).decode("latin-1") self.assertIn(env_dir, out) # http://bugs.python.org/issue19728 # Check the private uninstall command provided for the Windows # installers works (at least in a virtual environment) cmd = [envpy, '-Im', 'ensurepip._uninstall'] with EnvironmentVarGuard() as envvars: p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() # We force everything to text, so unittest gives the detailed diff # if we get unexpected results err = err.decode("latin-1") # Force to text, prevent decoding errors self.assertEqual(err, "") # Being fairly specific regarding the expected behaviour for the # initial bundling phase in Python 3.4. If the output changes in # future pip versions, this test can likely be relaxed further. out = out.decode("latin-1") # Force to text, prevent decoding errors self.assertIn("Successfully uninstalled pip", out) self.assertIn("Successfully uninstalled setuptools", out) # Check pip is now gone from the virtual environment self.assert_pip_not_installed()
print('Adafruit GPIO Library') print('Works best with Python 2.7') print('THIS INSTALL SCRIPT MAY REQUIRE ROOT/ADMIN PERMISSIONS') print('Especially if you installed python for "all users" on Windows') print('\ntry the following in your systems terminal if ensurepip is not sufficient:') print('$ python -m ensurepip --upgrade') print('$ python -m pip install --upgrade pip setuptools') import sys try: import pip from setuptools import setup, find_packages except ImportError: import ensurepip ensurepip.version() ensurepip.bootstrap() from setuptools import setup, find_packages # Define required packages. requires = ['adafruit-pureio'] # Assume spidev is required on non-windows & non-mac platforms (i.e. linux). if sys.platform != 'win32' and sys.platform != 'darwin': requires.append('spidev') setup(name = 'Adafruit_GPIO', version = '1.0.4', author = 'Tony DiCola', author_email = '*****@*****.**', description = 'Library to provide a cross-platform GPIO interface on the Raspberry Pi and Beaglebone Black using the RPi.GPIO and Adafruit_BBIO libraries.', license = 'MIT',
def test_with_pip(self): rmtree(self.env_dir) with EnvironmentVarGuard() as envvars: # pip's cross-version compatibility may trigger deprecation # warnings in current versions of Python. Ensure related # environment settings don't cause venv to fail. envvars["PYTHONWARNINGS"] = "e" # ensurepip is different enough from a normal pip invocation # that we want to ensure it ignores the normal pip environment # variable settings. We set PIP_NO_INSTALL here specifically # to check that ensurepip (and hence venv) ignores it. # See http://bugs.python.org/issue19734 envvars["PIP_NO_INSTALL"] = "1" # Also check that we ignore the pip configuration file # See http://bugs.python.org/issue20053 with tempfile.TemporaryDirectory() as home_dir: envvars["HOME"] = home_dir bad_config = "[global]\nno-install=1" # Write to both config file names on all platforms to reduce # cross-platform variation in test code behaviour win_location = ("pip", "pip.ini") posix_location = (".pip", "pip.conf") # Skips win_location due to http://bugs.python.org/issue20541 for dirname, fname in (posix_location,): dirpath = os.path.join(home_dir, dirname) os.mkdir(dirpath) fpath = os.path.join(dirpath, fname) with open(fpath, 'w') as f: f.write(bad_config) # Actually run the create command with all that unhelpful # config in place to ensure we ignore it try: self.run_with_capture(venv.create, self.env_dir, with_pip=True) except subprocess.CalledProcessError as exc: # The output this produces can be a little hard to read, # but at least it has all the details details = exc.output.decode(errors="replace") msg = "{}\n\n**Subprocess Output**\n{}" self.fail(msg.format(exc, details)) # Ensure pip is available in the virtual environment envpy = os.path.join(os.path.realpath(self.env_dir), self.bindir, self.exe) cmd = [envpy, '-Im', 'pip', '--version'] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() # We force everything to text, so unittest gives the detailed diff # if we get unexpected results err = err.decode("latin-1") # Force to text, prevent decoding errors self.assertEqual(err, "") out = out.decode("latin-1") # Force to text, prevent decoding errors expected_version = "pip {}".format(ensurepip.version()) self.assertEqual(out[:len(expected_version)], expected_version) env_dir = os.fsencode(self.env_dir).decode("latin-1") self.assertIn(env_dir, out) # http://bugs.python.org/issue19728 # Check the private uninstall command provided for the Windows # installers works (at least in a virtual environment) cmd = [envpy, '-Im', 'ensurepip._uninstall'] with EnvironmentVarGuard() as envvars: p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() # We force everything to text, so unittest gives the detailed diff # if we get unexpected results err = err.decode("latin-1") # Force to text, prevent decoding errors self.assertEqual(err, "") # Being fairly specific regarding the expected behaviour for the # initial bundling phase in Python 3.4. If the output changes in # future pip versions, this test can likely be relaxed further. out = out.decode("latin-1") # Force to text, prevent decoding errors self.assertIn("Successfully uninstalled pip", out) self.assertIn("Successfully uninstalled setuptools", out) # Check pip is now gone from the virtual environment self.assert_pip_not_installed()
def test_with_pip(self): shutil.rmtree(self.env_dir) with EnvironmentVarGuard() as envvars: # pip's cross-version compatibility may trigger deprecation # warnings in current versions of Python. Ensure related # environment settings don't cause venv to fail. envvars["PYTHONWARNINGS"] = "e" # pip doesn't ignore environment variables when running in # isolated mode, and we don't have an active virtualenv here, # we're relying on the native venv support in 3.3+ # See http://bugs.python.org/issue19734 for details del envvars["PIP_REQUIRE_VIRTUALENV"] try: self.run_with_capture(venv.create, self.env_dir, with_pip=True) except subprocess.CalledProcessError as exc: # The output this produces can be a little hard to read, but # least it has all the details details = exc.output.decode(errors="replace") msg = "{}\n\n**Subprocess Output**\n{}".format(exc, details) self.fail(msg) # Ensure pip is available in the virtual environment envpy = os.path.join(os.path.realpath(self.env_dir), self.bindir, self.exe) cmd = [envpy, '-Im', 'pip', '--version'] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() # We force everything to text, so unittest gives the detailed diff # if we get unexpected results err = err.decode("latin-1") # Force to text, prevent decoding errors self.assertEqual(err, "") out = out.decode("latin-1") # Force to text, prevent decoding errors expected_version = "pip {}".format(ensurepip.version()) self.assertEqual(out[:len(expected_version)], expected_version) env_dir = os.fsencode(self.env_dir).decode("latin-1") self.assertIn(env_dir, out) # http://bugs.python.org/issue19728 # Check the private uninstall command provided for the Windows # installers works (at least in a virtual environment) cmd = [envpy, '-Im', 'ensurepip._uninstall'] with EnvironmentVarGuard() as envvars: # pip doesn't ignore environment variables when running in # isolated mode, and we don't have an active virtualenv here, # we're relying on the native venv support in 3.3+ # See http://bugs.python.org/issue19734 for details del envvars["PIP_REQUIRE_VIRTUALENV"] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() # We force everything to text, so unittest gives the detailed diff # if we get unexpected results err = err.decode("latin-1") # Force to text, prevent decoding errors self.assertEqual(err, "") # Being fairly specific regarding the expected behaviour for the # initial bundling phase in Python 3.4. If the output changes in # future pip versions, this test can likely be relaxed further. out = out.decode("latin-1") # Force to text, prevent decoding errors self.assertIn("Successfully uninstalled pip", out) self.assertIn("Successfully uninstalled setuptools", out) # Check pip is now gone from the virtual environment self.assert_pip_not_installed()
self.os_environ["PIP_THIS_SHOULD_GO_AWAY"] = "test fodder" with fake_pip(): ensurepip._uninstall_helper() self.assertNotIn("PIP_THIS_SHOULD_GO_AWAY", self.os_environ) def test_pip_config_file_disabled(self): # ensurepip deliberately ignores the pip config file # See http://bugs.python.org/issue20053 for details with fake_pip(): ensurepip._uninstall_helper() self.assertEqual(self.os_environ["PIP_CONFIG_FILE"], os.devnull) # Basic testing of the main functions and their argument parsing EXPECTED_VERSION_OUTPUT = "pip " + ensurepip.version() class TestBootstrappingMainFunction(EnsurepipMixin, unittest.TestCase): def test_bootstrap_version(self): with test.support.captured_stdout() as stdout: with self.assertRaises(SystemExit): ensurepip._main(["--version"]) result = stdout.getvalue().strip() self.assertEqual(result, EXPECTED_VERSION_OUTPUT) self.assertFalse(self.run_pip.called) def test_basic_bootstrapping(self): exit_code = ensurepip._main([]) self.run_pip.assert_called_once_with(
print('Works best with Python 2.7') print('THIS INSTALL SCRIPT MAY REQUIRE ROOT/ADMIN PERMISSIONS') print('Especially if you installed python for "all users" on Windows') print( '\ntry the following in your systems terminal if ensurepip is not sufficient:' ) print('$ python -m ensurepip --upgrade') print('$ python -m pip install --upgrade pip setuptools') import sys try: import pip from setuptools import setup, find_packages except ImportError: import ensurepip ensurepip.version() ensurepip.bootstrap() from setuptools import setup, find_packages # Define required packages. requires = ['adafruit-pureio'] # Assume spidev is required on non-windows & non-mac platforms (i.e. linux). if sys.platform != 'win32' and sys.platform != 'darwin': requires.append('spidev') setup( name='Adafruit_GPIO', version='1.0.4', author='Tony DiCola', author_email='*****@*****.**',