gam7 7.9.4__py3-none-any.whl → 7.9.5__py3-none-any.whl
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.
Potentially problematic release.
This version of gam7 might be problematic. Click here for more details.
- gam/__init__.py +127 -68
- {gam7-7.9.4.dist-info → gam7-7.9.5.dist-info}/METADATA +1 -1
- {gam7-7.9.4.dist-info → gam7-7.9.5.dist-info}/RECORD +6 -6
- {gam7-7.9.4.dist-info → gam7-7.9.5.dist-info}/WHEEL +0 -0
- {gam7-7.9.4.dist-info → gam7-7.9.5.dist-info}/entry_points.txt +0 -0
- {gam7-7.9.4.dist-info → gam7-7.9.5.dist-info}/licenses/LICENSE +0 -0
gam/__init__.py
CHANGED
|
@@ -25,7 +25,7 @@ https://github.com/GAM-team/GAM/wiki
|
|
|
25
25
|
"""
|
|
26
26
|
|
|
27
27
|
__author__ = 'GAM Team <google-apps-manager@googlegroups.com>'
|
|
28
|
-
__version__ = '7.09.
|
|
28
|
+
__version__ = '7.09.05'
|
|
29
29
|
__license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
|
|
30
30
|
|
|
31
31
|
#pylint: disable=wrong-import-position
|
|
@@ -12353,7 +12353,8 @@ def checkServiceAccount(users):
|
|
|
12353
12353
|
Ind.Increment()
|
|
12354
12354
|
try:
|
|
12355
12355
|
key = callGAPI(iam.projects().serviceAccounts().keys(), 'get',
|
|
12356
|
-
throwReasons=[GAPI.BAD_REQUEST, GAPI.INVALID, GAPI.NOT_FOUND,
|
|
12356
|
+
throwReasons=[GAPI.BAD_REQUEST, GAPI.INVALID, GAPI.NOT_FOUND,
|
|
12357
|
+
GAPI.PERMISSION_DENIED, GAPI.SERVICE_NOT_AVAILABLE],
|
|
12357
12358
|
name=name, fields='validAfterTime')
|
|
12358
12359
|
key_created, _ = iso8601.parse_date(key['validAfterTime'])
|
|
12359
12360
|
key_age = todaysTime()-key_created
|
|
@@ -12366,6 +12367,10 @@ def checkServiceAccount(users):
|
|
|
12366
12367
|
Ent.SVCACCT, GM.Globals[GM.OAUTH2SERVICE_JSON_DATA]['client_email']],
|
|
12367
12368
|
str(e))
|
|
12368
12369
|
printPassFail(Msg.SERVICE_ACCOUNT_PRIVATE_KEY_AGE.format('UNKNOWN'), testWarn)
|
|
12370
|
+
except GAPI.serviceNotAvailable as e:
|
|
12371
|
+
entityActionFailedExit([Ent.PROJECT, GM.Globals[GM.OAUTH2SERVICE_JSON_DATA]['project_id'],
|
|
12372
|
+
Ent.SVCACCT, GM.Globals[GM.OAUTH2SERVICE_JSON_DATA]['client_email']],
|
|
12373
|
+
str(e))
|
|
12369
12374
|
else:
|
|
12370
12375
|
printPassFail(Msg.SERVICE_ACCOUNT_SKIPPING_KEY_AGE_CHECK.format(key_type), testPass)
|
|
12371
12376
|
Ind.Decrement()
|
|
@@ -28111,27 +28116,21 @@ def commonprefix(m):
|
|
|
28111
28116
|
return s1[:i]
|
|
28112
28117
|
return s1
|
|
28113
28118
|
|
|
28114
|
-
|
|
28119
|
+
SCHEMA_TYPE_MESSAGE_MAP = {
|
|
28120
|
+
'NullableDuration': {'type': 'TYPE_INT64', 'namedType': 'duration'},
|
|
28121
|
+
'NullableLong': {'type': 'TYPE_INT64', 'namedType': 'value'},
|
|
28122
|
+
'SystemTimezone': {'type': 'TYPE_STRING', 'namedType': 'value'}
|
|
28123
|
+
}
|
|
28124
|
+
|
|
28125
|
+
def simplifyChromeSchemaUpdate(schema):
|
|
28115
28126
|
schema_name = schema['name'].split('/')[-1]
|
|
28116
|
-
schema_dict = {'name': schema_name,
|
|
28117
|
-
'description': schema.get('policyDescription', ''),
|
|
28118
|
-
'settings': {}
|
|
28119
|
-
}
|
|
28120
|
-
fieldDescriptions = schema['fieldDescriptions']
|
|
28121
|
-
savedSettingName = ''
|
|
28122
|
-
savedTypeName = ''
|
|
28127
|
+
schema_dict = {'name': schema_name, 'settings': {}}
|
|
28123
28128
|
for mtype in schema['definition']['messageType']:
|
|
28124
|
-
|
|
28129
|
+
if mtype['name'] in SCHEMA_TYPE_MESSAGE_MAP:
|
|
28130
|
+
continue
|
|
28125
28131
|
for setting in mtype['field']:
|
|
28126
28132
|
setting_name = setting['name']
|
|
28127
|
-
setting_dict = {'name': setting_name,
|
|
28128
|
-
'constraints': None,
|
|
28129
|
-
'descriptions': [],
|
|
28130
|
-
'type': setting['type'],
|
|
28131
|
-
}
|
|
28132
|
-
if mtype['name'] == savedTypeName and numSettings == 1:
|
|
28133
|
-
setting_dict['name'] = savedSettingName
|
|
28134
|
-
savedTypeName = ''
|
|
28133
|
+
setting_dict = {'name': setting_name, 'type': setting['type'], 'namedType': ''}
|
|
28135
28134
|
if setting_dict['type'] == 'TYPE_STRING' and setting.get('label') == 'LABEL_REPEATED':
|
|
28136
28135
|
setting_dict['type'] = 'TYPE_LIST'
|
|
28137
28136
|
if setting_dict['type'] == 'TYPE_ENUM':
|
|
@@ -28142,29 +28141,83 @@ def simplifyChromeSchema(schema):
|
|
|
28142
28141
|
setting_dict['enum_prefix'] = commonprefix(setting_dict['enums'])
|
|
28143
28142
|
prefix_len = len(setting_dict['enum_prefix'])
|
|
28144
28143
|
setting_dict['enums'] = [enum[prefix_len:] for enum in setting_dict['enums'] if not enum.endswith('UNSPECIFIED')]
|
|
28145
|
-
|
|
28146
|
-
|
|
28144
|
+
elif setting_dict['type'] == 'TYPE_MESSAGE':
|
|
28145
|
+
type_name = setting['typeName']
|
|
28146
|
+
if type_name not in SCHEMA_TYPE_MESSAGE_MAP:
|
|
28147
|
+
continue
|
|
28148
|
+
setting_dict['type'] = SCHEMA_TYPE_MESSAGE_MAP[type_name]['type']
|
|
28149
|
+
setting_dict['namedType'] = SCHEMA_TYPE_MESSAGE_MAP[type_name]['namedType']
|
|
28150
|
+
schema_dict['settings'][setting_name.lower()] = setting_dict
|
|
28151
|
+
return(schema_name, schema_dict)
|
|
28152
|
+
|
|
28153
|
+
def simplifyChromeSchemaDisplay(schema):
|
|
28154
|
+
schema_name = schema['name'].split('/')[-1]
|
|
28155
|
+
schema_dict = {'name': schema_name, 'description': schema.get('policyDescription', '')}
|
|
28156
|
+
fieldDescriptions = schema['fieldDescriptions']
|
|
28157
|
+
enumDict = {}
|
|
28158
|
+
for enumType in schema['definition'].get('enumType', []):
|
|
28159
|
+
enumEntry = {}
|
|
28160
|
+
enumEntry['enums'] = [enum['name'] for enum in enumType['value']]
|
|
28161
|
+
enumEntry['enum_prefix'] = commonprefix(enumEntry['enums'])
|
|
28162
|
+
enumEntry['enum_prefix_len'] = prefix_len = len(enumEntry['enum_prefix'])
|
|
28163
|
+
enumEntry['enums'] = [enum[prefix_len:] for enum in enumEntry['enums'] if not enum.endswith('UNSPECIFIED')]
|
|
28164
|
+
enumDict[enumType['name']] = enumEntry.copy()
|
|
28165
|
+
mesgDict = {}
|
|
28166
|
+
mesgPops = set()
|
|
28167
|
+
for mesgType in schema['definition']['messageType']:
|
|
28168
|
+
mtypeEntry = {'field': {}, 'subfield': False}
|
|
28169
|
+
for mfield in mesgType['field']:
|
|
28170
|
+
mfield.pop('number')
|
|
28171
|
+
mtypeEntry['field'][mfield.pop('name')] = mfield
|
|
28172
|
+
mesgDict[mesgType['name']] = mtypeEntry.copy()
|
|
28173
|
+
for _, mtypeEntry in mesgDict.items():
|
|
28174
|
+
for mfieldName, mfield in mtypeEntry['field'].items():
|
|
28175
|
+
mfield['descriptions'] = []
|
|
28176
|
+
if mfield['type'] == 'TYPE_STRING' and mfield.get('label') == 'LABEL_REPEATED':
|
|
28177
|
+
mfield['type'] = 'TYPE_LIST'
|
|
28178
|
+
if mfield['type'] == 'TYPE_ENUM':
|
|
28179
|
+
mfield['subtype'] = enumDict[mfield['typeName']]
|
|
28180
|
+
for an_enum in schema['definition']['enumType']:
|
|
28181
|
+
if an_enum['name'] == mfield['typeName']:
|
|
28182
|
+
mfield['descriptions'] = ['']*len(mfield['subtype']['enums'])
|
|
28183
|
+
for i, an in enumerate(mfield['subtype']['enums']):
|
|
28147
28184
|
for fdesc in fieldDescriptions:
|
|
28148
|
-
if fdesc.get('field') ==
|
|
28185
|
+
if fdesc.get('field') == mfieldName:
|
|
28149
28186
|
for d in fdesc.get('knownValueDescriptions', []):
|
|
28150
|
-
if d['value'][
|
|
28151
|
-
|
|
28187
|
+
if d['value'][mfield['subtype']['enum_prefix_len']:] == an:
|
|
28188
|
+
mfield['descriptions'][i] = d.get('description', '')
|
|
28152
28189
|
break
|
|
28153
28190
|
break
|
|
28154
28191
|
break
|
|
28155
|
-
elif
|
|
28156
|
-
|
|
28157
|
-
|
|
28192
|
+
elif mfield['type'] == 'TYPE_MESSAGE':
|
|
28193
|
+
subfield = mfield['typeName']
|
|
28194
|
+
if subfield not in SCHEMA_TYPE_MESSAGE_MAP:
|
|
28195
|
+
mesgDict[subfield]['subfield'] = True
|
|
28196
|
+
mfield['subtype'] = mesgDict[subfield]
|
|
28197
|
+
else:
|
|
28198
|
+
mfield['type'] = SCHEMA_TYPE_MESSAGE_MAP[subfield]['type']
|
|
28199
|
+
mesgPops.add(subfield)
|
|
28158
28200
|
continue
|
|
28159
28201
|
else:
|
|
28160
|
-
|
|
28161
|
-
|
|
28162
|
-
if fdesc['field'] == setting_name:
|
|
28202
|
+
for fdesc in fieldDescriptions:
|
|
28203
|
+
if fdesc['field'] == mfieldName:
|
|
28163
28204
|
if 'knownValueDescriptions' in fdesc:
|
|
28164
|
-
|
|
28205
|
+
if isinstance(fdesc['knownValueDescriptions'], list):
|
|
28206
|
+
for kvd in fdesc['knownValueDescriptions']:
|
|
28207
|
+
if isinstance(kvd, dict):
|
|
28208
|
+
if 'description' in kvd:
|
|
28209
|
+
mfield['descriptions'].append(f"{kvd['value']}: {kvd['description']}")
|
|
28210
|
+
else:
|
|
28211
|
+
mfield['descriptions'].append(f"{kvd['value']}")
|
|
28212
|
+
else:
|
|
28213
|
+
mfield['descriptions'].extend(kvd)
|
|
28214
|
+
else:
|
|
28215
|
+
mfield['descriptions'].append(kvd)
|
|
28165
28216
|
elif 'description' in fdesc:
|
|
28166
|
-
|
|
28167
|
-
|
|
28217
|
+
mfield['descriptions'].append(fdesc['description'])
|
|
28218
|
+
for pfield in mesgPops:
|
|
28219
|
+
mesgDict.pop(pfield)
|
|
28220
|
+
schema_dict['settings'] = mesgDict
|
|
28168
28221
|
return(schema_name, schema_dict)
|
|
28169
28222
|
|
|
28170
28223
|
def _getPolicyOrgUnitTarget(cd, cp, myarg, groupEmail):
|
|
@@ -28507,7 +28560,7 @@ def doUpdateChromePolicy():
|
|
|
28507
28560
|
elif myarg == 'convertcrnl':
|
|
28508
28561
|
convertCRsNLs = True
|
|
28509
28562
|
else:
|
|
28510
|
-
schemaName, schema =
|
|
28563
|
+
schemaName, schema = simplifyChromeSchemaUpdate(_getChromePolicySchema(cp, Cmd.Previous(), '*'))
|
|
28511
28564
|
body['requests'].append({'policyValue': {'policySchema': schemaName, 'value': {}},
|
|
28512
28565
|
'updateMask': ''})
|
|
28513
28566
|
schemaNameList.append(schemaName)
|
|
@@ -28593,8 +28646,9 @@ def doUpdateChromePolicy():
|
|
|
28593
28646
|
if field not in schema['settings']:
|
|
28594
28647
|
Cmd.Backup()
|
|
28595
28648
|
missingChoiceExit(schema['settings'])
|
|
28596
|
-
|
|
28597
|
-
|
|
28649
|
+
field_settings = schema['settings'][field]
|
|
28650
|
+
casedField = field_settings['name']
|
|
28651
|
+
vtype = field_settings['type']
|
|
28598
28652
|
value = getString(Cmd.OB_STRING, minLen=0 if vtype in {'TYPE_STRING', 'TYPE_LIST'} else 1)
|
|
28599
28653
|
if vtype in ['TYPE_INT64', 'TYPE_INT32', 'TYPE_UINT64']:
|
|
28600
28654
|
if not value.isnumeric():
|
|
@@ -28611,8 +28665,8 @@ def doUpdateChromePolicy():
|
|
|
28611
28665
|
invalidChoiceExit(value, TRUE_FALSE, True)
|
|
28612
28666
|
elif vtype == 'TYPE_ENUM':
|
|
28613
28667
|
value = value.upper()
|
|
28614
|
-
prefix =
|
|
28615
|
-
enum_values =
|
|
28668
|
+
prefix = field_settings['enum_prefix']
|
|
28669
|
+
enum_values = field_settings['enums']
|
|
28616
28670
|
if value in enum_values:
|
|
28617
28671
|
value = f'{prefix}{value}'
|
|
28618
28672
|
elif value.replace(prefix, '') in enum_values:
|
|
@@ -28639,7 +28693,10 @@ def doUpdateChromePolicy():
|
|
|
28639
28693
|
elif value and not CHROME_TARGET_VERSION_PATTERN.match(value):
|
|
28640
28694
|
Cmd.Backup()
|
|
28641
28695
|
invalidArgumentExit(Msg.CHROME_TARGET_VERSION_FORMAT)
|
|
28642
|
-
|
|
28696
|
+
if field_settings['namedType']:
|
|
28697
|
+
body['requests'][-1]['policyValue']['value'][casedField] = {field_settings['namedType']: value}
|
|
28698
|
+
else:
|
|
28699
|
+
body['requests'][-1]['policyValue']['value'][casedField] = value
|
|
28643
28700
|
body['requests'][-1]['updateMask'] += f'{casedField},'
|
|
28644
28701
|
checkPolicyArgs(targetResource, printer_id, app_id)
|
|
28645
28702
|
count = len(body['requests'])
|
|
@@ -28940,7 +28997,9 @@ def _showChromePolicySchema(schema, FJQC, i=0, count=0):
|
|
|
28940
28997
|
return
|
|
28941
28998
|
printEntity([Ent.CHROME_POLICY_SCHEMA, schema['name']], i, count)
|
|
28942
28999
|
Ind.Increment()
|
|
28943
|
-
showJSON(None, schema,
|
|
29000
|
+
showJSON(None, schema,
|
|
29001
|
+
dictObjectsKey={'messageType': 'name', 'field': 'name',
|
|
29002
|
+
'fieldDescriptions': 'field', 'knownValueDescriptions': 'value'})
|
|
28944
29003
|
Ind.Decrement()
|
|
28945
29004
|
|
|
28946
29005
|
CHROME_POLICY_SCHEMA_FIELDS_CHOICE_MAP = {
|
|
@@ -29074,31 +29133,35 @@ def doPrintShowChromePolicySchemas():
|
|
|
29074
29133
|
csvPF.writeCSVfile('Chrome Policy Schemas')
|
|
29075
29134
|
|
|
29076
29135
|
def _showChromePolicySchemaStd(schema):
|
|
29077
|
-
|
|
29078
|
-
|
|
29079
|
-
|
|
29080
|
-
|
|
29081
|
-
|
|
29136
|
+
def _printEntry(mtypeName, mtypeEntry):
|
|
29137
|
+
vtype = mtypeEntry['type']
|
|
29138
|
+
if vtype != 'TYPE_MESSAGE':
|
|
29139
|
+
printKeyValueList([f'{mtypeName}', f'{vtype}'])
|
|
29140
|
+
else:
|
|
29141
|
+
printKeyValueList([f'{mtypeName}'])
|
|
29082
29142
|
Ind.Increment()
|
|
29083
29143
|
if vtype == 'TYPE_ENUM':
|
|
29084
|
-
enums =
|
|
29085
|
-
descriptions =
|
|
29086
|
-
for i in range(len(
|
|
29144
|
+
enums = mtypeEntry['subtype']['enums']
|
|
29145
|
+
descriptions = mtypeEntry['descriptions']
|
|
29146
|
+
for i in range(len(enums)):
|
|
29087
29147
|
printKeyValueList([f'{enums[i]}', f'{descriptions[i]}'])
|
|
29088
|
-
elif vtype == '
|
|
29089
|
-
|
|
29090
|
-
|
|
29091
|
-
if
|
|
29092
|
-
|
|
29093
|
-
|
|
29094
|
-
|
|
29095
|
-
|
|
29096
|
-
printKeyValueList([f'{pvi[0]}'])
|
|
29097
|
-
else:
|
|
29098
|
-
description = val.get('descriptions')
|
|
29099
|
-
if len(description) > 0:
|
|
29100
|
-
printKeyValueList([f'{description[0]}'])
|
|
29148
|
+
elif vtype == 'TYPE_MESSAGE':
|
|
29149
|
+
for mfieldName, mfield in mtypeEntry['subtype']['field'].items():
|
|
29150
|
+
# managedBookmarks is recursive
|
|
29151
|
+
if mtypeName != 'entries':
|
|
29152
|
+
_printEntry(mfieldName, mfield)
|
|
29153
|
+
else:
|
|
29154
|
+
for description in mtypeEntry.get('descriptions', []):
|
|
29155
|
+
printKeyValueList([description])
|
|
29101
29156
|
Ind.Decrement()
|
|
29157
|
+
|
|
29158
|
+
printKeyValueList([f'{schema.get("name")}', f'{schema.get("description")}'])
|
|
29159
|
+
Ind.Increment()
|
|
29160
|
+
for _, mtypeEntry in schema['settings'].items():
|
|
29161
|
+
if mtypeEntry['subfield']:
|
|
29162
|
+
continue
|
|
29163
|
+
for mfieldName, mfield in mtypeEntry['field'].items():
|
|
29164
|
+
_printEntry(mfieldName, mfield)
|
|
29102
29165
|
Ind.Decrement()
|
|
29103
29166
|
|
|
29104
29167
|
# gam info chromeschema std <SchemaName>
|
|
@@ -29109,7 +29172,7 @@ def doInfoChromePolicySchemasStd(cp):
|
|
|
29109
29172
|
schema = callGAPI(cp.customers().policySchemas(), 'get',
|
|
29110
29173
|
throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN],
|
|
29111
29174
|
name=name)
|
|
29112
|
-
_, schema_dict =
|
|
29175
|
+
_, schema_dict = simplifyChromeSchemaDisplay(schema)
|
|
29113
29176
|
_showChromePolicySchemaStd(schema_dict)
|
|
29114
29177
|
except GAPI.notFound:
|
|
29115
29178
|
entityUnknownWarning(Ent.CHROME_POLICY_SCHEMA, name)
|
|
@@ -29131,7 +29194,7 @@ def doShowChromePolicySchemasStd(cp):
|
|
|
29131
29194
|
parent=parent, filter=sfilter)
|
|
29132
29195
|
schemas = {}
|
|
29133
29196
|
for schema in result:
|
|
29134
|
-
schema_name, schema_dict =
|
|
29197
|
+
schema_name, schema_dict = simplifyChromeSchemaDisplay(schema)
|
|
29135
29198
|
schemas[schema_name.lower()] = schema_dict
|
|
29136
29199
|
for _, schema in sorted(iter(schemas.items())):
|
|
29137
29200
|
_showChromePolicySchemaStd(schema)
|
|
@@ -66178,11 +66241,7 @@ def printSharedDriveOrganizers(users, useDomainAdminAccess=False):
|
|
|
66178
66241
|
showNoOrganizerDrives = SHOW_NO_PERMISSIONS_DRIVES_CHOICE_MAP['false']
|
|
66179
66242
|
fieldsList = ['role', 'type', 'emailAddress']
|
|
66180
66243
|
cd = entityList = orgUnitId = query = matchPattern = None
|
|
66181
|
-
domainList = set()
|
|
66182
|
-
if GC.Values[GC.DOMAIN]:
|
|
66183
|
-
domainList.add(GC.Values[GC.DOMAIN])
|
|
66184
|
-
else:
|
|
66185
|
-
domainList.add(GM.Globals[GM.DECODED_ID_TOKEN].get('hd', 'UNKNOWN').lower())
|
|
66244
|
+
domainList = set([(GC.Values[GC.DOMAIN] if GC.Values[GC.DOMAIN] else _getValueFromOAuth('hd'))])
|
|
66186
66245
|
oneOrganizer = True
|
|
66187
66246
|
while Cmd.ArgumentsRemaining():
|
|
66188
66247
|
myarg = getArgument()
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
gam/__init__.py,sha256=
|
|
1
|
+
gam/__init__.py,sha256=j3hkZrsjhG4N6Zcnpyb4WoZZoKqgPb_ZAcMdmP_FAcw,3521872
|
|
2
2
|
gam/__main__.py,sha256=amz0-959ph6zkZKqjaar4n60yho-T37w6qWI36qx0CA,1049
|
|
3
3
|
gam/cacerts.pem,sha256=82Ak7btW_2XvocLUvAwPmpx8Chi0oqtZUG1gseLK_t4,50235
|
|
4
4
|
gam/cbcm-v1.1beta1.json,sha256=xO5XloCQQULmPbFBx5bckdqmbLFQ7sJ2TImhE1ysDIY,19439
|
|
@@ -65,8 +65,8 @@ gam/googleapiclient/discovery_cache/base.py,sha256=yCDPtxnbNN-p5_9fzBacC6P3wcUPl
|
|
|
65
65
|
gam/googleapiclient/discovery_cache/file_cache.py,sha256=sim3Mg4HgRYo3vX75jvcKy_aV568EvIrtBfvfbw-044,4774
|
|
66
66
|
gam/iso8601/__init__.py,sha256=Z2PsYbXgAH5a5xzUvgczCboPzqWpm65kRcIngCnhViU,1218
|
|
67
67
|
gam/iso8601/iso8601.py,sha256=Li2FHZ4sBTWuthuQhyCvmvj0j6At8JbGzkSv2fc2RHU,4384
|
|
68
|
-
gam7-7.9.
|
|
69
|
-
gam7-7.9.
|
|
70
|
-
gam7-7.9.
|
|
71
|
-
gam7-7.9.
|
|
72
|
-
gam7-7.9.
|
|
68
|
+
gam7-7.9.5.dist-info/METADATA,sha256=rLan4He52qoDi4Lg2jLXBk26-H1LAyKomySkAox-pyg,2977
|
|
69
|
+
gam7-7.9.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
70
|
+
gam7-7.9.5.dist-info/entry_points.txt,sha256=HVUM5J7dA8YwvJfG30jiLefR19ExMs387TWugWd9sf4,42
|
|
71
|
+
gam7-7.9.5.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
72
|
+
gam7-7.9.5.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|