@Anthrazit Property is the sole export of the module. AISCTable is a local variable to the module. The way I discovered that was by interactively debugging the Property procedure:
stopat(Property): # instrument Property procedure to launch debugger when called
Property("W8X21","W"); # this should invoke the debugger
With the debugger started, execute a few into commands to step into a nested conditional. You'll then see the Maple statement
From that you can determine that AISCTable is a local variable assigned a table (possibly a record, but in fact is a table). It's entries are also tables, hence the second index.
Possibly easier is to just print and inspect the Property procedure
AISCShapes:-Property := proc(requiredMember::string, requiredPar::string)
local parPos, memberPos;
1* if _npassed = 2 then
2 if requiredMember in AISCShapes:-memberNames and requiredPar
in AISCShapes:-parNames then
4 if not (requiredMember in AISCShapes:-memberNames or
requiredPar in AISCShapes:-parNames) then
5 error "Member and parameter not found"
elif not requiredMember in AISCShapes:-memberNames then
6 error "Member not found"
elif not requiredPar in AISCShapes:-parNames then
7 error "Parameter not found"
elif _npassed = 3 and _passed = "metadata" then
8 parPos := ListTools:-Search(requiredPar,AISCShapes:-parNames);
9 return AISCMetadata[parPos+1,5]
elif _npassed = 1 and _passed = "allmembers" then
10 return AISCShapes:-memberNames
Apologies for the typo in the original response, it happens.