pyarmor 8.2.6__zip → 8.2.8__zip

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. {pyarmor-8.2.6 → pyarmor-8.2.8}/PKG-INFO +1 -1
  2. {pyarmor-8.2.6 → pyarmor-8.2.8}/pyarmor.egg-info/PKG-INFO +1 -1
  3. {pyarmor-8.2.6 → pyarmor-8.2.8}/pyarmor.egg-info/SOURCES.txt +1 -0
  4. pyarmor-8.2.8/pyarmor.egg-info/requires.txt +1 -0
  5. {pyarmor-8.2.6 → pyarmor-8.2.8}/setup.py +1 -1
  6. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/cli/__init__.py +1 -1
  7. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/cli/bootstrap.py +1 -1
  8. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/cli/default.cfg +2 -2
  9. pyarmor-8.2.8/src/cli/docker.py +153 -0
  10. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/cli/register.py +26 -5
  11. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/cli/repack.py +2 -1
  12. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/config.py +1 -1
  13. pyarmor-8.2.6/pyarmor.egg-info/requires.txt +0 -1
  14. {pyarmor-8.2.6 → pyarmor-8.2.8}/MANIFEST.in +0 -0
  15. {pyarmor-8.2.6 → pyarmor-8.2.8}/README.md +0 -0
  16. {pyarmor-8.2.6 → pyarmor-8.2.8}/pyarmor.egg-info/dependency_links.txt +0 -0
  17. {pyarmor-8.2.6 → pyarmor-8.2.8}/pyarmor.egg-info/entry_points.txt +0 -0
  18. {pyarmor-8.2.6 → pyarmor-8.2.8}/pyarmor.egg-info/top_level.txt +0 -0
  19. {pyarmor-8.2.6 → pyarmor-8.2.8}/setup.cfg +0 -0
  20. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/README.rst +0 -0
  21. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/__init__.py +0 -0
  22. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/benchmark.py +0 -0
  23. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/build_meta.py +0 -0
  24. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/cli/__main__.py +0 -0
  25. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/cli/config.py +0 -0
  26. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/cli/context.py +0 -0
  27. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/cli/generate.py +0 -0
  28. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/cli/merge.py +0 -0
  29. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/cli/mixer.py +0 -0
  30. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/cli/plugin.py +0 -0
  31. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/cli/public_capsule.zip +0 -0
  32. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/cli/resource.py +0 -0
  33. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/cli/shell.py +0 -0
  34. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/cobuilder.py +0 -0
  35. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/README-ZH.md +0 -0
  36. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/README.md +0 -0
  37. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/build-for-exe.bat +0 -0
  38. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/build-for-freeze.bat +0 -0
  39. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/build-with-project.bat +0 -0
  40. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/build-with-project.sh +0 -0
  41. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/cx_Freeze/hello.py +0 -0
  42. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/cx_Freeze/queens.py +0 -0
  43. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/cx_Freeze/setup.py +0 -0
  44. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/helloworld/foo.py +0 -0
  45. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/obfuscate-app.bat +0 -0
  46. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/obfuscate-app.sh +0 -0
  47. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/obfuscate-pkg.bat +0 -0
  48. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/obfuscate-pkg.sh +0 -0
  49. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pack-obfuscated-scripts.bat +0 -0
  50. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pack-obfuscated-scripts.sh +0 -0
  51. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/py2exe/hello.py +0 -0
  52. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/py2exe/queens.py +0 -0
  53. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/py2exe/setup.py +0 -0
  54. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pybench/Arithmetic.py +0 -0
  55. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pybench/Calls.py +0 -0
  56. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pybench/CommandLine.py +0 -0
  57. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pybench/Constructs.py +0 -0
  58. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pybench/Dict.py +0 -0
  59. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pybench/Exceptions.py +0 -0
  60. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pybench/Imports.py +0 -0
  61. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pybench/Instances.py +0 -0
  62. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pybench/Lists.py +0 -0
  63. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pybench/Lookups.py +0 -0
  64. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pybench/NewInstances.py +0 -0
  65. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pybench/Numbers.py +0 -0
  66. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pybench/Setup.py +0 -0
  67. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pybench/Strings.py +0 -0
  68. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pybench/Tuples.py +0 -0
  69. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pybench/With.py +0 -0
  70. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pybench/clockres.py +0 -0
  71. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pybench/package/__init__.py +0 -0
  72. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pybench/package/submodule.py +0 -0
  73. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pybench/pybench.py +0 -0
  74. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/pybench/systimes.py +0 -0
  75. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/simple/queens.py +0 -0
  76. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/testmod/hello.py +0 -0
  77. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/testmod/queens.py +0 -0
  78. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/testpkg/main.py +0 -0
  79. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/testpkg/mypkg/__init__.py +0 -0
  80. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/examples/testpkg/mypkg/foo.py +0 -0
  81. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/helper/__init__.py +0 -0
  82. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/helper/build_data_module.py +0 -0
  83. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/helper/buildext.py +0 -0
  84. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/helper/get_bind_key.py +0 -0
  85. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/helper/get_license_info.py +0 -0
  86. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/helper/get_platform_name.py +0 -0
  87. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/helper/merge.py +0 -0
  88. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/helper/repack.py +0 -0
  89. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/helper/superuntime.py +0 -0
  90. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/license.tri +0 -0
  91. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/packer.py +0 -0
  92. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/platforms/darwin/x86_64/_pytransform.dylib +0 -0
  93. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/platforms/linux/x86/_pytransform.so +0 -0
  94. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/platforms/linux/x86_64/_pytransform.so +0 -0
  95. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/platforms/windows/x86/_pytransform.dll +0 -0
  96. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/platforms/windows/x86_64/_pytransform.dll +0 -0
  97. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/plugins/README.md +0 -0
  98. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/plugins/check_ntp_time.py +0 -0
  99. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/polyfills/__init__.py +0 -0
  100. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/polyfills/argparse.py +0 -0
  101. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/product.key +0 -0
  102. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/project.py +0 -0
  103. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/protect_code.pt +0 -0
  104. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/protect_code2.pt +0 -0
  105. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/public.key +0 -0
  106. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/public_capsule.zip +0 -0
  107. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/pyarmor-webui.py +0 -0
  108. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/pyarmor.py +0 -0
  109. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/pyshield.key +0 -0
  110. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/pyshield.lic +0 -0
  111. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/pytransform.py +0 -0
  112. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/reform.py +0 -0
  113. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/register.py +0 -0
  114. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/sppmode.py +0 -0
  115. {pyarmor-8.2.6 → pyarmor-8.2.8}/src/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.1
2
2
  Name: pyarmor
3
- Version: 8.2.6
3
+ Version: 8.2.8
4
4
  Summary: A tool used to obfuscate python scripts, bind obfuscated scripts to fixed machine or expire obfuscated scripts.
5
5
  Home-page: https://github.com/dashingsoft/pyarmor
6
6
  Author: Jondy Zhao
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.1
2
2
  Name: pyarmor
3
- Version: 8.2.6
3
+ Version: 8.2.8
4
4
  Summary: A tool used to obfuscate python scripts, bind obfuscated scripts to fixed machine or expire obfuscated scripts.
5
5
  Home-page: https://github.com/dashingsoft/pyarmor
6
6
  Author: Jondy Zhao
@@ -36,6 +36,7 @@ src/cli/bootstrap.py
36
36
  src/cli/config.py
37
37
  src/cli/context.py
38
38
  src/cli/default.cfg
39
+ src/cli/docker.py
39
40
  src/cli/generate.py
40
41
  src/cli/merge.py
41
42
  src/cli/mixer.py
@@ -0,0 +1 @@
1
+ pyarmor.cli.core~=3.2.8
@@ -113,7 +113,7 @@ setup(
113
113
  },
114
114
 
115
115
  install_requires=[
116
- 'pyarmor.cli.core~=3.2.6'
116
+ 'pyarmor.cli.core~=3.2.8'
117
117
  ],
118
118
 
119
119
  entry_points={
@@ -1,6 +1,6 @@
1
1
  import logging
2
2
 
3
- __VERSION__ = '8.2.6'
3
+ __VERSION__ = '8.2.8'
4
4
 
5
5
  logger = logging.getLogger('cli')
6
6
 
@@ -35,7 +35,7 @@ def check_prebuilt_runtime_library(platnames, extra=None, rtver=''):
35
35
  'install it'.format('pyarmor.cli.core'))
36
36
 
37
37
  instcmd = [sys.executable, '-m', 'pip', 'install',
38
- '--disable-pip-version-check']
38
+ '--disable-pip-version-check']
39
39
 
40
40
  # Before Pyarmor 8.3, prefer to "pyarmor.cli.runtime"
41
41
  # It could be disabled by
@@ -3,10 +3,10 @@
3
3
  ;; Pyarmor version
4
4
  major = 8
5
5
  minor = 2
6
- patch = 6
6
+ patch = 8
7
7
 
8
8
  ;; Core version
9
- cli.core = 3.2.6
9
+ cli.core = 3.2.8
10
10
 
11
11
  ;; Deprecated since Pyarmor 8.2.5
12
12
  ; cli.runtime = 3.2.5
@@ -0,0 +1,153 @@
1
+ import argparse
2
+ import logging
3
+ import os
4
+ import socketserver
5
+ import struct
6
+ import sys
7
+
8
+ import docker
9
+
10
+ from .context import Context
11
+ from .generate import Builder, Pytransform3
12
+ from .register import Register
13
+
14
+ PORT = 29092
15
+
16
+
17
+ def get_docker_gateway(client):
18
+ filters = {
19
+ 'driver': 'bridge',
20
+ 'type': 'builtin'
21
+ }
22
+ networks = client.networks.list(filters=filters)
23
+ return networks[0].attrs['IPAM']['Config'][0]['Gateway']
24
+
25
+
26
+ class DockerAuthHandler(socketserver.BaseRequestHandler):
27
+
28
+ WORKPATH = os.path.expanduser(os.path.join('~', '.pyarmor', 'docker'))
29
+ CTX = None
30
+ CLIENT = None
31
+
32
+ def handle(self):
33
+ data = self.request.recv(64)
34
+ logging.info('receive request from %s', self.client_address)
35
+ try:
36
+ logging.debug('data (%d): %s', len(data), data)
37
+ self.process(data)
38
+ logging.info('send auth result to %s', self.client_address)
39
+ except Exception as e:
40
+ logging.error('%s', str(e))
41
+ msg = 'failed to verify docker, please check host console'.encode()
42
+ msg += b'\00'
43
+ self.request.send(struct.pack('!HH', 1, len(msg)) + msg)
44
+
45
+ def copy_file_into_docker(self, containerid, filename):
46
+ from subprocess import check_call
47
+ check_call(['docker', 'cp', filename, '%s:/' % containerid])
48
+
49
+ def get_container_info(self, client, shortid):
50
+ try:
51
+ container = client.container.get(shortid)
52
+ return container.attrs
53
+ except docker.errors.NotFound:
54
+ pass
55
+ except docker.errors.APIError:
56
+ pass
57
+
58
+ def process(self, packet):
59
+ if packet[:4] == b'PADH':
60
+ self.request.send(self.MACHID)
61
+ return
62
+
63
+ container = self.get_container(self.client_address[0])
64
+ state = container.attrs['State']
65
+ if state.get('Status') == 'running' and state.get('Running'):
66
+ # 2023-06-15T23:51:03.287483366Z
67
+ # state.get('StartedAt')
68
+ # bridge = container.attrs['NetworkSettings']['Networks']['bridge']
69
+ # bridge['MacAddress']
70
+ # bridge['Gateway'] and bridge['IPAddress']
71
+ # bridge['IPv6Gateway'] and bridge['GlobalIPv6Address']
72
+ userdata = self.parse_packet(packet)
73
+ keydata = self.generate_runtime_key(userdata.decode('utf-8'))
74
+ self.request.send(struct.pack('!HH', 0, len(keydata)) + keydata)
75
+
76
+ def parse_packet(self, packet):
77
+ if len(packet) == 32 and packet[:4] == b'PADK':
78
+ return packet[12:]
79
+ raise RuntimeError('invalid auth request')
80
+
81
+ def generate_runtime_key(self, userdata):
82
+ ctx = self.CTX
83
+ ctx.cmd_options['user_data'] = userdata
84
+ return Builder(ctx).generate_runtime_key()
85
+
86
+ def get_container(self, ipaddr):
87
+ filters = {
88
+ 'driver': 'bridge',
89
+ 'type': 'builtin'
90
+ }
91
+ networks = self.CLIENT.networks.list(filters=filters, greedy=True)
92
+ containers = networks[0].attrs.get('Containers')
93
+ if containers:
94
+ marker = ipaddr + '/'
95
+ for dockid, netattr in containers.items():
96
+ if netattr.get('IPv4Address').startswith(marker):
97
+ return self.CLIENT.containers.get(dockid)
98
+ raise RuntimeError('no found countainer with IPv4 %s' % ipaddr)
99
+
100
+
101
+ def register_pyarmor(ctx, regfile):
102
+ reg = Register(ctx)
103
+ logging.info('register "%s"', regfile)
104
+ reg.register_regfile(regfile)
105
+ if reg.license_info['features'] < 15:
106
+ raise RuntimeError('this feature is only for group license')
107
+
108
+ machid = reg._get_machine_id()
109
+ logging.debug('machine id: %s', machid)
110
+ DockerAuthHandler.MACHID = machid
111
+
112
+ Pytransform3._update_token(ctx)
113
+
114
+
115
+ def main_entry():
116
+ parser = argparse.ArgumentParser()
117
+ parser.add_argument('-p', '--port', type=int, default=PORT)
118
+ parser.add_argument('-s', '--sock', default='/var/run/docker.sock',
119
+ help=argparse.SUPPRESS)
120
+ parser.add_argument('--home', help=argparse.SUPPRESS)
121
+ parser.add_argument('regfile', nargs=1,
122
+ help='group device registration file for this machine')
123
+ args = parser.parse_args(sys.argv[1:])
124
+
125
+ home = DockerAuthHandler.WORKPATH
126
+ if args.home:
127
+ DockerAuthHandler.WORKPATH = args.home
128
+ home = args.home
129
+ logging.info('work path: %s', home)
130
+
131
+ ctx = Context(home=os.path.expanduser(home))
132
+ register_pyarmor(ctx, args.regfile[0])
133
+ DockerAuthHandler.CTX = ctx
134
+
135
+ client = docker.from_env()
136
+ host, port = get_docker_gateway(client), args.port
137
+ DockerAuthHandler.CLIENT = client
138
+
139
+ with socketserver.TCPServer((host, port), DockerAuthHandler) as server:
140
+ logging.info('listen docker auth request on %s:%s', host, args.port)
141
+ server.serve_forever()
142
+
143
+
144
+ def main():
145
+ logging.basicConfig(
146
+ level=logging.INFO,
147
+ format='%(asctime)s: %(message)s',
148
+ )
149
+ main_entry()
150
+
151
+
152
+ if __name__ == '__main__':
153
+ main()
@@ -153,11 +153,15 @@ class Register(object):
153
153
  f.extract(item, path=path)
154
154
  namelist = f.namelist()
155
155
  if 'group.tokens' in namelist:
156
- machid = self._get_machine_id()
157
- name = '/'.join(['tokens', machid.decode('utf-8')])
156
+ machid = self._get_machine_id().decode('utf-8')
157
+ name = '/'.join(['tokens', machid])
158
158
  if name not in namelist:
159
- logger.debug('no found "%s" in offline regfile', name)
160
- raise CliError('this regfile is not for this device')
159
+ machid = self._get_docker_hostname()
160
+ hostname = '/'.join(['tokens', machid])
161
+ if hostname not in namelist:
162
+ logger.debug('no found "%s" in offline regfile', name)
163
+ raise CliError('this regfile is not for this device')
164
+ name = hostname
161
165
  logger.debug('extracting %s', name)
162
166
  self.ctx.save_token(f.read(name))
163
167
  return
@@ -168,9 +172,26 @@ class Register(object):
168
172
  logger.info('update license token')
169
173
  self.update_token()
170
174
 
175
+ def _get_docker_hostname(self):
176
+ try:
177
+ from socket import socket, AF_INET, SOCK_STREAM
178
+ host = 'host.docker.internal'
179
+ port = 29092
180
+ with socket(AF_INET, SOCK_STREAM) as s:
181
+ s.connect((host, port))
182
+ s.sendall(b'PADH' + b'x' * 60)
183
+ flag = s.recv(1)
184
+ if flag in (b'a', b'b'):
185
+ data = s.recv(32)
186
+ machid = (flag + data).decode('utf-8')
187
+ logger.info('got docker host machine id: %s', machid)
188
+ return machid
189
+ except Exception:
190
+ pass
191
+
171
192
  def _get_machine_id(self):
172
193
  from .core import Pytransform3
173
- return Pytransform3.get_hd_info(10)
194
+ return Pytransform3.get_hd_info(11)
174
195
 
175
196
  def generate_group_device(self, devid):
176
197
  path = self.ctx.group_device_file(devid)
@@ -134,7 +134,8 @@ class CArchiveWriter2(CArchiveWriter):
134
134
  return
135
135
 
136
136
  with tempfile.TemporaryDirectory() as tmpdir:
137
- pathname = os.path.join(tmpdir.name, name)
137
+ pathname = os.path.join(tmpdir,
138
+ name.replace('/', '_').replace('\\', '_'))
138
139
  with open(pathname, 'wb') as f:
139
140
  f.write(rawdata)
140
141
  if typecode in (PKG_ITEM_PYSOURCE, PKG_ITEM_PYMODULE,
@@ -1,6 +1,6 @@
1
1
  from sys import platform
2
2
 
3
- version = '8.2.6'
3
+ version = '8.2.8'
4
4
 
5
5
  # The corresponding version of pytransform.so
6
6
  core_version = 'r52.6'
@@ -1 +0,0 @@
1
- pyarmor.cli.core~=3.2.6
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes