diff --git a/2023/icons/studiolibrary.png b/2023/icons/studiolibrary.png
new file mode 100644
index 0000000..98a8ea1
Binary files /dev/null and b/2023/icons/studiolibrary.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/README.md b/2023/scripts/animation_tools/studiolibrary/README.md
new file mode 100644
index 0000000..b634ca3
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/README.md
@@ -0,0 +1,64 @@
+# Studio Library
+
+Studio Library 是一个免费的动画库工具,用于在 Autodesk Maya 中管理姿势和动画。
+
+## 版本
+
+Studio Library 2.20.2
+
+## 官方信息
+
+- **官网**: https://www.studiolibrary.com
+- **GitHub**: https://github.com/krathjen/studiolibrary
+- **作者**: Kurt Rathjen
+
+## 功能特性
+
+- 保存和加载动画姿势
+- 管理动画片段
+- 镜像姿势和动画
+- 选择集管理
+- 自定义缩略图
+- 支持多个库
+- 拖放操作
+- 搜索和过滤
+
+## 使用方法
+
+### 在 Python 中启动
+
+```python
+import sys
+import os
+
+studiolibrary_path = r'h:\Workspace\Raw\Tools\Plugins\Maya\2023\scripts\animation_tools\studiolibrary'
+if studiolibrary_path not in sys.path:
+ sys.path.insert(0, studiolibrary_path)
+
+import studiolibrary
+studiolibrary.main()
+```
+
+### 从工具架启动
+
+点击动画工具架上的 **StudioLib** 按钮即可启动。
+
+## 模块结构
+
+此模块包含以下子模块:
+
+- **studiolibrary**: 核心库模块
+- **studiolibrarymaya**: Maya 集成模块
+- **mutils**: Maya 工具函数
+- **studioqt**: Qt 界面组件
+- **studiovendor**: 第三方依赖
+
+## 注意事项
+
+- 首次使用需要设置库路径
+- 支持 Maya 2017 及更高版本
+- 需要 PySide2 或 PySide6(Maya 自带)
+
+## 许可证
+
+GNU Lesser General Public License v3.0
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/README.md b/2023/scripts/animation_tools/studiolibrary/mutils/README.md
new file mode 100644
index 0000000..680f783
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/README.md
@@ -0,0 +1,5 @@
+# Welcome to mutils!
+
+`mutils` is a python package containing many Maya utility functions for managing poses and animations in Maya.
+
+* www.studiolibrary.com
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/__init__.py b/2023/scripts/animation_tools/studiolibrary/mutils/__init__.py
new file mode 100644
index 0000000..3e1f48c
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/__init__.py
@@ -0,0 +1,30 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from .cmds import *
+from .decorators import *
+
+from . import playblast
+from . import namespace
+
+from .scriptjob import ScriptJob
+from .matchnames import matchNames, groupObjects
+
+from .node import Node
+from .attribute import Attribute
+
+from .transferobject import TransferObject
+
+from .selectionset import SelectionSet, saveSelectionSet
+from .pose import Pose, savePose, loadPose
+from .animation import Animation, PasteOption, saveAnim, loadAnims
+from .mirrortable import MirrorTable, MirrorOption, saveMirrorTable
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/animation.py b/2023/scripts/animation_tools/studiolibrary/mutils/animation.py
new file mode 100644
index 0000000..ad6c8b8
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/animation.py
@@ -0,0 +1,839 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import os
+import shutil
+import logging
+
+from studiovendor.Qt import QtWidgets
+
+import mutils
+import mutils.gui
+
+try:
+ import maya.cmds
+except ImportError:
+ import traceback
+ traceback.print_exc()
+
+logger = logging.getLogger(__name__)
+
+
+MIN_TIME_LIMIT = -10000
+MAX_TIME_LIMIT = 100000
+DEFAULT_FILE_TYPE = "mayaBinary" # "mayaAscii"
+
+# A feature flag that will be removed in the future.
+FIX_SAVE_ANIM_REFERENCE_LOCKED_ERROR = True
+
+
+class PasteOption:
+
+ Insert = "insert"
+ Replace = "replace"
+ ReplaceAll = "replace all"
+ ReplaceCompletely = "replaceCompletely"
+
+
+class AnimationTransferError(Exception):
+ """Base class for exceptions in this module."""
+ pass
+
+
+class OutOfBoundsError(AnimationTransferError):
+ """Exceptions for clips or ranges that are outside the expected range"""
+ pass
+
+
+def validateAnimLayers():
+ """
+ Check if the selected animation layer can be exported.
+
+ :raise: AnimationTransferError
+ """
+ if maya.cmds.about(q=True, batch=True):
+ return
+
+ animLayers = maya.mel.eval('$gSelectedAnimLayers=$gSelectedAnimLayers')
+
+ # Check if more than one animation layer has been selected.
+ if len(animLayers) > 1:
+ msg = "More than one animation layer is selected! " \
+ "Please select only one animation layer for export!"
+
+ raise AnimationTransferError(msg)
+
+ # Check if the selected animation layer is locked
+ if len(animLayers) == 1:
+ if maya.cmds.animLayer(animLayers[0], query=True, lock=True):
+ msg = "Cannot export an animation layer that is locked! " \
+ "Please unlock the anim layer before exporting animation!"
+
+ raise AnimationTransferError(msg)
+
+
+def saveAnim(
+ objects,
+ path,
+ time=None,
+ sampleBy=1,
+ fileType="",
+ metadata=None,
+ iconPath="",
+ sequencePath="",
+ bakeConnected=True
+):
+ """
+ Save the anim data for the given objects.
+
+ Example:
+ import mutils
+ mutils.saveAnim(
+ path="c:/example.anim",
+ objects=["control1", "control2"]
+ time=(1, 20),
+ metadata={'description': 'Example anim'}
+ )
+
+ :type path: str
+ :type objects: None or list[str]
+ :type time: (int, int) or None
+ :type fileType: str or None
+ :type sampleBy: int
+ :type iconPath: str
+ :type sequencePath: str
+ :type metadata: dict or None
+ :type bakeConnected: bool
+
+ :rtype: mutils.Animation
+ """
+ # Copy the icon path to the temp location
+ if iconPath:
+ shutil.copyfile(iconPath, path + "/thumbnail.jpg")
+
+ # Copy the sequence path to the temp location
+ if sequencePath:
+ shutil.move(sequencePath, path + "/sequence")
+
+ # Save the animation to the temp location
+ anim = mutils.Animation.fromObjects(objects)
+ anim.updateMetadata(metadata)
+ anim.save(
+ path,
+ time=time,
+ sampleBy=sampleBy,
+ fileType=fileType,
+ bakeConnected=bakeConnected
+ )
+ return anim
+
+
+def clampRange(srcTime, dstTime):
+ """
+ Clips the given source time to within the given destination time.
+
+ Example:
+ print clampRange((15, 35), (20, 30))
+ # 20, 30
+
+ print clampRange((25, 45), (20, 30))
+ # 25, 30
+
+ :type srcTime: (int, int)
+ :type dstTime: (int, int)
+ :rtype: (int, int)
+ """
+ srcStart, srcEnd = srcTime
+ dstStart, dstEnd = dstTime
+
+ if srcStart > dstEnd or srcEnd < dstStart:
+ msg = "The src and dst time do not overlap. " \
+ "Unable to clamp (src=%s, dest=%s)"
+ raise OutOfBoundsError(msg, srcTime, dstTime)
+
+ if srcStart < dstStart:
+ srcStart = dstStart
+
+ if srcEnd > dstEnd:
+ srcEnd = dstEnd
+
+ return srcStart, srcEnd
+
+
+def moveTime(time, start):
+ """
+ Move the given time to the given start time.
+
+ Example:
+ print moveTime((15, 35), 5)
+ # 5, 20
+
+ :type time: (int, int)
+ :type start: int
+ :rtype: (int, int)
+ """
+ srcStartTime, srcEndTime = time
+ duration = srcEndTime - srcStartTime
+
+ if start is None:
+ startTime = srcStartTime
+ else:
+ startTime = start
+
+ endTime = startTime + duration
+
+ if startTime == endTime:
+ endTime = startTime + 1
+
+ return startTime, endTime
+
+
+def findFirstLastKeyframes(curves, time=None):
+ """
+ Return the first and last frame of the given animation curves
+
+ :type curves: list[str]
+ :type time: (int, int)
+ :rtype: (int, int)
+ """
+ first = maya.cmds.findKeyframe(curves, which='first')
+ last = maya.cmds.findKeyframe(curves, which='last')
+
+ result = (first, last)
+
+ if time:
+
+ # It's possible (but unlikely) that the curves will not lie within the
+ # first and last frame
+ try:
+ result = clampRange(time, result)
+ except OutOfBoundsError as error:
+ logger.warning(error)
+
+ return result
+
+
+def insertKeyframe(curves, time):
+ """
+ Insert a keyframe on the given curves at the given time.
+
+ :type curves: list[str]
+ :type time: (int, int)
+ """
+ startTime, endTime = time
+
+ for curve in curves:
+ insertStaticKeyframe(curve, time)
+
+ firstFrame = maya.cmds.findKeyframe(curves, time=(startTime, startTime), which='first')
+ lastFrame = maya.cmds.findKeyframe(curves, time=(endTime, endTime), which='last')
+
+ if firstFrame < startTime < lastFrame:
+ maya.cmds.setKeyframe(curves, insert=True, time=(startTime, startTime))
+
+ if firstFrame < endTime < lastFrame:
+ maya.cmds.setKeyframe(curves, insert=True, time=(endTime, endTime))
+
+
+def insertStaticKeyframe(curve, time):
+ """
+ Insert a static keyframe on the given curve at the given time.
+
+ :type curve: str
+ :type time: (int, int)
+ :rtype: None
+ """
+ startTime, endTime = time
+
+ lastFrame = maya.cmds.findKeyframe(curve, which='last')
+ firstFrame = maya.cmds.findKeyframe(curve, which='first')
+
+ if firstFrame == lastFrame:
+ maya.cmds.setKeyframe(curve, insert=True, time=(startTime, endTime))
+ maya.cmds.keyTangent(curve, time=(startTime, startTime), ott="step")
+
+ if startTime < firstFrame:
+ nextFrame = maya.cmds.findKeyframe(curve, time=(startTime, startTime), which='next')
+ if startTime < nextFrame < endTime:
+ maya.cmds.setKeyframe(curve, insert=True, time=(startTime, nextFrame))
+ maya.cmds.keyTangent(curve, time=(startTime, startTime), ott="step")
+
+ if endTime > lastFrame:
+ previousFrame = maya.cmds.findKeyframe(curve, time=(endTime, endTime), which='previous')
+ if startTime < previousFrame < endTime:
+ maya.cmds.setKeyframe(curve, insert=True, time=(previousFrame, endTime))
+ maya.cmds.keyTangent(curve, time=(previousFrame, previousFrame), ott="step")
+
+
+def duplicateNode(node, name):
+ """Duplicate the given node.
+
+ :param node: Maya path.
+ :type node: str
+ :param name: Name for the duplicated node.
+ :type name: str
+ :returns: Duplicated node names.
+ :rtype: list[str]
+ """
+ if maya.cmds.nodeType(node) in ["transform", "joint"]:
+ new = maya.cmds.duplicate(node, name=name, parentOnly=True)[0]
+ else:
+ # Please let us know if this logic is causing issues.
+ new = maya.cmds.duplicate(node, name=name)[0]
+ shapes = maya.cmds.listRelatives(new, shapes=True) or []
+ if shapes:
+ return [shapes[0], new]
+ return [new]
+
+
+def loadAnims(
+ paths,
+ spacing=1,
+ objects=None,
+ option=None,
+ connect=False,
+ namespaces=None,
+ startFrame=None,
+ mirrorTable=None,
+ currentTime=None,
+ showDialog=False,
+):
+ """
+ Load the animations in the given order of paths with the spacing specified.
+
+ :type paths: list[str]
+ :type spacing: int
+ :type connect: bool
+ :type objects: list[str]
+ :type namespaces: list[str]
+ :type startFrame: int
+ :type option: PasteOption
+ :type currentTime: bool
+ :type mirrorTable: bool
+ :type showDialog: bool
+ """
+ isFirstAnim = True
+
+ if spacing < 1:
+ spacing = 1
+
+ if option is None or option == "replace all":
+ option = PasteOption.ReplaceCompletely
+
+ if currentTime and startFrame is None:
+ startFrame = int(maya.cmds.currentTime(query=True))
+
+ if showDialog:
+
+ msg = "Load the following animation in sequence;\n"
+
+ for i, path in enumerate(paths):
+ msg += "\n {0}. {1}".format(i, os.path.basename(path))
+
+ msg += "\n\nPlease choose the spacing between each animation."
+
+ spacing, accepted = QtWidgets.QInputDialog.getInt(
+ None,
+ "Load animation sequence",
+ msg,
+ spacing,
+ QtWidgets.QInputDialog.NoButtons,
+ )
+
+ if not accepted:
+ raise Exception("Dialog canceled!")
+
+ for path in paths:
+
+ anim = mutils.Animation.fromPath(path)
+
+ if startFrame is None and isFirstAnim:
+ startFrame = anim.startFrame()
+
+ if option == "replaceCompletely" and not isFirstAnim:
+ option = "insert"
+
+ anim.load(
+ option=option,
+ objects=objects,
+ connect=connect,
+ startFrame=startFrame,
+ namespaces=namespaces,
+ currentTime=currentTime,
+ mirrorTable=mirrorTable,
+ )
+
+ duration = anim.endFrame() - anim.startFrame()
+ startFrame += duration + spacing
+ isFirstAnim = False
+
+
+class Animation(mutils.Pose):
+
+ IMPORT_NAMESPACE = "REMOVE_IMPORT"
+
+ @classmethod
+ def fromPath(cls, path):
+ """
+ Create and return an Anim object from the give path.
+
+ Example:
+ anim = Animation.fromPath("/temp/example.anim")
+ print anim.endFrame()
+ # 14
+
+ :type path: str
+ :rtype: Animation
+ """
+ anim = cls()
+ anim.setPath(path)
+ anim.read()
+ return anim
+
+ def __init__(self):
+ mutils.Pose.__init__(self)
+
+ try:
+ timeUnit = maya.cmds.currentUnit(q=True, time=True)
+ linearUnit = maya.cmds.currentUnit(q=True, linear=True)
+ angularUnit = maya.cmds.currentUnit(q=True, angle=True)
+
+ self.setMetadata("timeUnit", timeUnit)
+ self.setMetadata("linearUnit", linearUnit)
+ self.setMetadata("angularUnit", angularUnit)
+ except NameError as msg:
+ logger.exception(msg)
+
+ def select(self, objects=None, namespaces=None, **kwargs):
+ """
+ Select the objects contained in the animation.
+
+ :type objects: list[str] or None
+ :type namespaces: list[str] or None
+ :rtype: None
+ """
+ selectionSet = mutils.SelectionSet.fromPath(self.poseJsonPath())
+ selectionSet.load(objects=objects, namespaces=namespaces, **kwargs)
+
+ def startFrame(self):
+ """
+ Return the start frame for anim object.
+
+ :rtype: int
+ """
+ return self.metadata().get("startFrame")
+
+ def endFrame(self):
+ """
+ Return the end frame for anim object.
+
+ :rtype: int
+ """
+ return self.metadata().get("endFrame")
+
+ def mayaPath(self):
+ """
+ :rtype: str
+ """
+ mayaPath = os.path.join(self.path(), "animation.mb")
+ if not os.path.exists(mayaPath):
+ mayaPath = os.path.join(self.path(), "animation.ma")
+ return mayaPath
+
+ def poseJsonPath(self):
+ """
+ :rtype: str
+ """
+ return os.path.join(self.path(), "pose.json")
+
+ def paths(self):
+ """
+ Return all the paths for Anim object.
+
+ :rtype: list[str]
+ """
+ result = []
+ if os.path.exists(self.mayaPath()):
+ result.append(self.mayaPath())
+
+ if os.path.exists(self.poseJsonPath()):
+ result.append(self.poseJsonPath())
+
+ return result
+
+ def animCurve(self, name, attr, withNamespace=False):
+ """
+ Return the animCurve for the given object name and attribute.
+
+ :type name: str
+ :type attr: str
+ :type withNamespace: bool
+
+ :rtype: str
+ """
+ curve = self.attr(name, attr).get("curve", None)
+ if curve and withNamespace:
+ curve = Animation.IMPORT_NAMESPACE + ":" + curve
+ return curve
+
+ def setAnimCurve(self, name, attr, curve):
+ """
+ Set the animCurve for the given object name and attribute.
+
+ :type name: str
+ :type attr: str
+ :type curve: str
+ """
+ self.objects()[name].setdefault("attrs", {})
+ self.objects()[name]["attrs"].setdefault(attr, {})
+ self.objects()[name]["attrs"][attr]["curve"] = curve
+
+ def read(self, path=None):
+ """
+ Read all the data to be used by the Anim object.
+
+ :rtype: None
+ """
+ path = self.poseJsonPath()
+
+ logger.debug("Reading: " + path)
+ mutils.Pose.read(self, path=path)
+ logger.debug("Reading Done")
+
+ def isAscii(self, s):
+ """Check if the given string is a valid ascii string."""
+ return all(ord(c) < 128 for c in s)
+
+ @mutils.unifyUndo
+ @mutils.restoreSelection
+ def open(self):
+ """
+ The reason we use importing and not referencing is because we
+ need to modify the imported animation curves and modifying
+ referenced animation curves is only supported in Maya 2014+
+ """
+ self.close() # Make sure everything is cleaned before importing
+
+ if not self.isAscii(self.mayaPath()):
+ msg = "Cannot load animation using non-ascii paths."
+ raise IOError(msg)
+
+ nodes = maya.cmds.file(
+ self.mayaPath(),
+ i=True,
+ groupLocator=True,
+ ignoreVersion=True,
+ returnNewNodes=True,
+ namespace=Animation.IMPORT_NAMESPACE,
+ )
+
+ return nodes
+
+ def close(self):
+ """
+ Clean up all imported nodes, as well as the namespace.
+ Should be called in a finally block.
+ """
+ nodes = maya.cmds.ls(Animation.IMPORT_NAMESPACE + ":*", r=True) or []
+ if nodes:
+ maya.cmds.delete(nodes)
+
+ # It is important that we remove the imported namespace,
+ # otherwise another namespace will be created on next
+ # animation open.
+ namespaces = maya.cmds.namespaceInfo(ls=True) or []
+
+ if Animation.IMPORT_NAMESPACE in namespaces:
+ maya.cmds.namespace(set=':')
+ maya.cmds.namespace(rm=Animation.IMPORT_NAMESPACE)
+
+ def cleanMayaFile(self, path):
+ """
+ Clean up all commands in the exported maya file that are
+ not createNode.
+ """
+ results = []
+
+ if path.endswith(".mb"):
+ return
+
+ with open(path, "r") as f:
+ for line in f.readlines():
+ if not line.startswith("select -ne"):
+ results.append(line)
+ else:
+ results.append("// End")
+ break
+
+ with open(path, "w") as f:
+ f.writelines(results)
+
+ @mutils.timing
+ @mutils.unifyUndo
+ @mutils.showWaitCursor
+ @mutils.restoreSelection
+ def save(
+ self,
+ path,
+ time=None,
+ sampleBy=1,
+ fileType="",
+ bakeConnected=True
+ ):
+ """
+ Save all animation data from the objects set on the Anim object.
+
+ :type path: str
+ :type time: (int, int) or None
+ :type sampleBy: int
+ :type fileType: str
+ :type bakeConnected: bool
+
+ :rtype: None
+ """
+ objects = list(self.objects().keys())
+
+ fileType = fileType or DEFAULT_FILE_TYPE
+
+ if not time:
+ time = mutils.selectedObjectsFrameRange(objects)
+ start, end = time
+
+ # Check selected animation layers
+ validateAnimLayers()
+
+ # Check frame range
+ if start is None or end is None:
+ msg = "Please specify a start and end frame!"
+ raise AnimationTransferError(msg)
+
+ if start >= end:
+ msg = "The start frame cannot be greater than or equal to the end frame!"
+ raise AnimationTransferError(msg)
+
+ # Check if animation exists
+ if mutils.getDurationFromNodes(objects or [], time=time) <= 0:
+ msg = "No animation was found on the specified object/s! " \
+ "Please create a pose instead!"
+ raise AnimationTransferError(msg)
+
+ self.setMetadata("endFrame", end)
+ self.setMetadata("startFrame", start)
+
+ end += 1
+ validCurves = []
+ deleteObjects = []
+
+ msg = u"Animation.save(path={0}, time={1}, bakeConnections={2}, sampleBy={3})"
+ msg = msg.format(path, str(time), str(bakeConnected), str(sampleBy))
+ logger.debug(msg)
+
+ try:
+ if bakeConnected:
+ maya.cmds.undoInfo(openChunk=True)
+ mutils.bakeConnected(objects, time=(start, end), sampleBy=sampleBy)
+
+ for name in objects:
+ if maya.cmds.copyKey(name, time=(start, end), includeUpperBound=False, option="keys"):
+ dstNodes = duplicateNode(name, "CURVE")
+ dstNode = dstNodes[0]
+ deleteObjects.extend(dstNodes)
+
+ if not FIX_SAVE_ANIM_REFERENCE_LOCKED_ERROR:
+ mutils.disconnectAll(dstNode)
+
+ # Make sure we delete all proxy attributes, otherwise pasteKey will duplicate keys
+ mutils.Attribute.deleteProxyAttrs(dstNode)
+ maya.cmds.pasteKey(dstNode)
+
+ attrs = maya.cmds.listAttr(dstNode, unlocked=True, keyable=True) or []
+ attrs = list(set(attrs) - set(['translate', 'rotate', 'scale']))
+
+ for attr in attrs:
+ dstAttr = mutils.Attribute(dstNode, attr)
+ dstCurve = dstAttr.animCurve()
+
+ if dstCurve:
+
+ dstCurve = maya.cmds.rename(dstCurve, "CURVE")
+ deleteObjects.append(dstCurve)
+
+ srcAttr = mutils.Attribute(name, attr)
+ srcCurve = srcAttr.animCurve()
+
+ if srcCurve:
+ preInfinity = maya.cmds.getAttr(srcCurve + ".preInfinity")
+ postInfinity = maya.cmds.getAttr(srcCurve + ".postInfinity")
+ curveColor = maya.cmds.getAttr(srcCurve + ".curveColor")
+ useCurveColor = maya.cmds.getAttr(srcCurve + ".useCurveColor")
+
+ maya.cmds.setAttr(dstCurve + ".preInfinity", preInfinity)
+ maya.cmds.setAttr(dstCurve + ".postInfinity", postInfinity)
+ maya.cmds.setAttr(dstCurve + ".curveColor", *curveColor[0])
+ maya.cmds.setAttr(dstCurve + ".useCurveColor", useCurveColor)
+
+ if maya.cmds.keyframe(dstCurve, query=True, time=(start, end), keyframeCount=True):
+ self.setAnimCurve(name, attr, dstCurve)
+ maya.cmds.cutKey(dstCurve, time=(MIN_TIME_LIMIT, start - 1))
+ maya.cmds.cutKey(dstCurve, time=(end + 1, end + MAX_TIME_LIMIT))
+ validCurves.append(dstCurve)
+
+ fileName = "animation.ma"
+ if fileType == "mayaBinary":
+ fileName = "animation.mb"
+
+ mayaPath = os.path.join(path, fileName)
+ posePath = os.path.join(path, "pose.json")
+ mutils.Pose.save(self, posePath)
+
+ if validCurves:
+ maya.cmds.select(validCurves)
+ logger.info("Saving animation: %s" % mayaPath)
+ maya.cmds.file(mayaPath, force=True, options='v=0', type=fileType, uiConfiguration=False, exportSelected=True)
+ self.cleanMayaFile(mayaPath)
+
+ finally:
+ if bakeConnected:
+ # HACK! Undo all baked connections. :)
+ maya.cmds.undoInfo(closeChunk=True)
+ maya.cmds.undo()
+ elif deleteObjects:
+ maya.cmds.delete(deleteObjects)
+
+ self.setPath(path)
+
+ @mutils.timing
+ @mutils.showWaitCursor
+ def load(
+ self,
+ objects=None,
+ namespaces=None,
+ attrs=None,
+ startFrame=None,
+ sourceTime=None,
+ option=None,
+ connect=False,
+ mirrorTable=None,
+ currentTime=None
+ ):
+ """
+ Load the animation data to the given objects or namespaces.
+
+ :type objects: list[str]
+ :type namespaces: list[str]
+ :type startFrame: int
+ :type sourceTime: (int, int) or None
+ :type attrs: list[str]
+ :type option: PasteOption or None
+ :type connect: bool
+ :type mirrorTable: mutils.MirrorTable
+ :type currentTime: bool or None
+ """
+ logger.info(u'Loading: {0}'.format(self.path()))
+
+ connect = bool(connect) # Make false if connect is None
+
+ if not sourceTime:
+ sourceTime = (self.startFrame(), self.endFrame())
+
+ if option and option.lower() == "replace all":
+ option = "replaceCompletely"
+
+ if option is None or option == PasteOption.ReplaceAll:
+ option = PasteOption.ReplaceCompletely
+
+ self.validate(namespaces=namespaces)
+
+ objects = objects or []
+
+ logger.debug("Animation.load(objects=%s, option=%s, namespaces=%s, srcTime=%s, currentTime=%s)" %
+ (len(objects), str(option), str(namespaces), str(sourceTime), str(currentTime)))
+
+ srcObjects = self.objects().keys()
+
+ if mirrorTable:
+ self.setMirrorTable(mirrorTable)
+
+ valid = False
+ matches = list(mutils.matchNames(srcObjects=srcObjects, dstObjects=objects, dstNamespaces=namespaces))
+
+ for srcNode, dstNode in matches:
+ if dstNode.exists():
+ valid = True
+ break
+
+ if not matches or not valid:
+
+ text = "No objects match when loading data. " \
+ "Turn on debug mode to see more details."
+
+ raise mutils.NoMatchFoundError(text)
+
+ # Load the animation data.
+ srcCurves = self.open()
+
+ try:
+ maya.cmds.flushUndo()
+ maya.cmds.undoInfo(openChunk=True)
+
+ if currentTime and startFrame is None:
+ startFrame = int(maya.cmds.currentTime(query=True))
+
+ srcTime = findFirstLastKeyframes(srcCurves, sourceTime)
+ dstTime = moveTime(srcTime, startFrame)
+
+ if option != PasteOption.ReplaceCompletely:
+ insertKeyframe(srcCurves, srcTime)
+
+ for srcNode, dstNode in matches:
+
+ # Remove the first pipe in-case the object has a parent
+ dstNode.stripFirstPipe()
+
+ for attr in self.attrs(srcNode.name()):
+
+ # Filter any attributes if the parameter has been set
+ if attrs is not None and attr not in attrs:
+ continue
+
+ dstAttr = mutils.Attribute(dstNode.name(), attr)
+
+ if not dstAttr.exists():
+ logger.debug('Skipping attribute: The destination attribute "%s" does not exist!' % dstAttr.fullname())
+ continue
+
+ if dstAttr.isProxy():
+ logger.debug('Skipping attribute: The destination attribute "%s" is a proxy attribute!', dstAttr.fullname())
+ continue
+
+ srcCurve = self.animCurve(srcNode.name(), attr, withNamespace=True)
+
+ if srcCurve:
+ dstAttr.setAnimCurve(
+ srcCurve,
+ time=dstTime,
+ option=option,
+ source=srcTime,
+ connect=connect
+ )
+ else:
+ value = self.attrValue(srcNode.name(), attr)
+ dstAttr.setStaticKeyframe(value, dstTime, option)
+
+ finally:
+ self.close()
+ maya.cmds.undoInfo(closeChunk=True)
+
+ # Return the focus to the Maya window
+ maya.cmds.setFocus("MayaWindow")
+
+ logger.info(u'Loaded: {0}'.format(self.path()))
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/attribute.py b/2023/scripts/animation_tools/studiolibrary/mutils/attribute.py
new file mode 100644
index 0000000..27e4b0f
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/attribute.py
@@ -0,0 +1,565 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+"""
+Example:
+
+import mutils
+
+attr = mutils.Attribute("sphere1", "translateX")
+attr.set(100)
+"""
+import logging
+from studiovendor import six
+
+try:
+ import maya.cmds
+except ImportError:
+ import traceback
+ traceback.print_exc()
+
+
+logger = logging.getLogger(__name__)
+
+
+VALID_CONNECTIONS = [
+ "animCurve",
+ "animBlend",
+ "pairBlend",
+ "character"
+]
+
+VALID_BLEND_ATTRIBUTES = [
+ "int",
+ "long",
+ "float",
+ "short",
+ "double",
+ "doubleAngle",
+ "doubleLinear",
+]
+
+VALID_ATTRIBUTE_TYPES = [
+ "int",
+ "long",
+ "enum",
+ "bool",
+ "string",
+ "float",
+ "short",
+ "double",
+ "doubleAngle",
+ "doubleLinear",
+]
+
+
+class AttributeError(Exception):
+ """Base class for exceptions in this module."""
+ pass
+
+
+class Attribute(object):
+
+
+ @classmethod
+ def listAttr(cls, name, **kwargs):
+ """
+ Return a list of Attribute from the given name and matching criteria.
+
+ If no flags are specified all attributes are listed.
+
+ :rtype: list[Attribute]
+ """
+ attrs = maya.cmds.listAttr(name, **kwargs) or []
+ return [cls(name, attr) for attr in attrs]
+
+ @classmethod
+ def deleteProxyAttrs(cls, name):
+ """Delete all the proxy attributes for the given object name."""
+ attrs = cls.listAttr(name, unlocked=True, keyable=True) or []
+ for attr in attrs:
+ if attr.isProxy():
+ attr.delete()
+
+ def __init__(self, name, attr=None, value=None, type=None, cache=True):
+ """
+ :type name: str
+ :type attr: str | None
+ :type type: str | None
+ :type value: object | None
+ :type cache: bool
+ """
+ if "." in name:
+ name, attr = name.split(".")
+
+ if attr is None:
+ msg = "Cannot initialise attribute instance without a given attr."
+ raise AttributeError(msg)
+
+ self._name = six.text_type(name)
+ self._attr = six.text_type(attr)
+ self._type = type
+ self._value = value
+ self._cache = cache
+ self._fullname = None
+
+ def __str__(self):
+ """
+ :rtype: str
+ """
+ return str(self.toDict())
+
+ def name(self):
+ """
+ Return the Maya object name for the attribute.
+
+ :rtype: str
+ """
+ return self._name
+
+ def attr(self):
+ """
+ Return the attribute name.
+
+ :rtype: str
+ """
+ return self._attr
+
+ def isLocked(self):
+ """
+ Return true if the attribute is locked.
+
+ :rtype: bool
+ """
+ return maya.cmds.getAttr(self.fullname(), lock=True)
+
+ def isUnlocked(self):
+ """
+ Return true if the attribute is unlocked.
+
+ :rtype: bool
+ """
+ return not self.isLocked()
+
+ def toDict(self):
+ """
+ Return a dictionary of the attribute object.
+
+ :rtype: dict
+ """
+ result = {
+ "type": self.type(),
+ "value": self.value(),
+ "fullname": self.fullname(),
+ }
+ return result
+
+ def isValid(self):
+ """
+ Return true if the attribute type is valid.
+
+ :rtype: bool
+ """
+ return self.type() in VALID_ATTRIBUTE_TYPES
+
+ def isProxy(self):
+ """
+ Return true if the attribute is a proxy
+
+ :rtype: bool
+ """
+ if not maya.cmds.addAttr(self.fullname(), query=True, exists=True):
+ return False
+
+ return maya.cmds.addAttr(self.fullname(), query=True, usedAsProxy=True)
+
+ def delete(self):
+ """Delete the attribute"""
+ maya.cmds.deleteAttr(self.fullname())
+
+ def exists(self):
+ """
+ Return true if the object and attribute exists in the scene.
+
+ :rtype: bool
+ """
+ return maya.cmds.objExists(self.fullname())
+
+ def prettyPrint(self):
+ """
+ Print the command for setting the attribute value
+ """
+ msg = 'maya.cmds.setAttr("{0}", {1})'
+ msg = msg.format(self.fullname(), self.value())
+ print(msg)
+
+ def clearCache(self):
+ """
+ Clear all cached values
+ """
+ self._type = None
+ self._value = None
+
+ def update(self):
+ """
+ This method will be deprecated.
+ """
+ self.clearCache()
+
+ def query(self, **kwargs):
+ """
+ Convenience method for Maya's attribute query command
+
+ :rtype: object
+ """
+ return maya.cmds.attributeQuery(self.attr(), node=self.name(), **kwargs)
+
+ def listConnections(self, **kwargs):
+ """
+ Convenience method for Maya's list connections command
+
+ :rtype: list[str]
+ """
+ return maya.cmds.listConnections(self.fullname(), **kwargs)
+
+ def sourceConnection(self, **kwargs):
+ """
+ Return the source connection for this attribute.
+
+ :rtype: str | None
+ """
+ try:
+ return self.listConnections(destination=False, **kwargs)[0]
+ except IndexError:
+ return None
+
+ def fullname(self):
+ """
+ Return the name with the attr name.
+
+ :rtype: str
+ """
+ if self._fullname is None:
+ self._fullname = '{0}.{1}'.format(self.name(), self.attr())
+ return self._fullname
+
+ def value(self):
+ """
+ Return the value of the attribute.
+
+ :rtype: float | str | list
+ """
+ if self._value is None or not self._cache:
+
+ try:
+ self._value = maya.cmds.getAttr(self.fullname())
+ except Exception:
+ msg = 'Cannot GET attribute VALUE for "{0}"'
+ msg = msg.format(self.fullname())
+ logger.exception(msg)
+
+ return self._value
+
+ def type(self):
+ """
+ Return the type of data currently in the attribute.
+
+ :rtype: str
+ """
+ if self._type is None:
+
+ try:
+ self._type = maya.cmds.getAttr(self.fullname(), type=True)
+ self._type = six.text_type(self._type)
+ except Exception:
+ msg = 'Cannot GET attribute TYPE for "{0}"'
+ msg = msg.format(self.fullname())
+ logger.exception(msg)
+
+ return self._type
+
+ def set(self, value, blend=100, key=False, clamp=True, additive=False):
+ """
+ Set the value for the attribute.
+
+ :type key: bool
+ :type clamp: bool
+ :type value: float | str | list
+ :type blend: float
+ """
+ try:
+ if additive and self.type() != 'bool':
+ if self.attr().startswith('scale'):
+ value = self.value() * (1 + (value - 1) * (blend/100.0))
+ else:
+ value = self.value() + value * (blend/100.0)
+ elif int(blend) == 0:
+ value = self.value()
+ else:
+ _value = (value - self.value()) * (blend/100.00)
+ value = self.value() + _value
+ except TypeError as error:
+ msg = 'Cannot BLEND or ADD attribute {0}: Error: {1}'
+ msg = msg.format(self.fullname(), error)
+ logger.debug(msg)
+
+ try:
+ if self.type() in ["string"]:
+ maya.cmds.setAttr(self.fullname(), value, type=self.type())
+ elif self.type() in ["list", "matrix"]:
+ maya.cmds.setAttr(self.fullname(), *value, type=self.type())
+ else:
+ maya.cmds.setAttr(self.fullname(), value, clamp=clamp)
+ except (ValueError, RuntimeError) as error:
+ msg = "Cannot SET attribute {0}: Error: {1}"
+ msg = msg.format(self.fullname(), error)
+ logger.debug(msg)
+
+ try:
+ if key:
+ self.setKeyframe(value=value)
+ except TypeError as error:
+ msg = 'Cannot KEY attribute {0}: Error: {1}'
+ msg = msg.format(self.fullname(), error)
+ logger.debug(msg)
+
+ def setKeyframe(self, value, respectKeyable=True, **kwargs):
+ """
+ Set a keyframe with the given value.
+
+ :value: object
+ :respectKeyable: bool
+ :rtype: None
+ """
+ if self.query(minExists=True):
+ minimum = self.query(minimum=True)[0]
+ if value < minimum:
+ value = minimum
+
+ if self.query(maxExists=True):
+ maximum = self.query(maximum=True)[0]
+ if value > maximum:
+ value = maximum
+
+ kwargs.setdefault("value", value)
+ kwargs.setdefault("respectKeyable", respectKeyable)
+
+ maya.cmds.setKeyframe(self.fullname(), **kwargs)
+
+ def setStaticKeyframe(self, value, time, option):
+ """
+ Set a static keyframe at the given time.
+
+ :type value: object
+ :type time: (int, int)
+ :type option: PasteOption
+ """
+ if option == "replaceCompletely":
+ maya.cmds.cutKey(self.fullname())
+ self.set(value, key=False)
+
+ # This should be changed to only look for animation.
+ # Also will need to support animation layers ect...
+ elif self.isConnected():
+
+ # TODO: Should also support static attrs when there is animation.
+ if option == "replace":
+ maya.cmds.cutKey(self.fullname(), time=time)
+ self.insertStaticKeyframe(value, time)
+
+ elif option == "replace":
+ self.insertStaticKeyframe(value, time)
+
+ else:
+ self.set(value, key=False)
+
+ def insertStaticKeyframe(self, value, time):
+ """
+ Insert a static keyframe at the given time with the given value.
+
+ :type value: float | str
+ :type time: (int, int)
+ :rtype: None
+ """
+ startTime, endTime = time
+ duration = endTime - startTime
+ try:
+ # Offset all keyframes from the start position.
+ maya.cmds.keyframe(self.fullname(), relative=True, time=(startTime, 1000000), timeChange=duration)
+
+ # Set a key at the given start and end time
+ self.setKeyframe(value, time=(startTime, startTime), ott='step')
+ self.setKeyframe(value, time=(endTime, endTime), itt='flat', ott='flat')
+
+ # Set the tangent for the next keyframe to flat
+ nextFrame = maya.cmds.findKeyframe(self.fullname(), time=(endTime, endTime), which='next')
+ maya.cmds.keyTangent(self.fullname(), time=(nextFrame, nextFrame), itt='flat')
+ except TypeError as error:
+ msg = "Cannot insert static key frame for attribute {0}: Error: {1}"
+ msg = msg.format(self.fullname(), error)
+ logger.debug(msg)
+
+ def setAnimCurve(self, curve, time, option, source=None, connect=False):
+ """
+ Set/Paste the give animation curve to this attribute.
+
+ :type curve: str
+ :type option: PasteOption
+ :type time: (int, int)
+ :type source: (int, int)
+ :type connect: bool
+ :rtype: None
+ """
+ fullname = self.fullname()
+ startTime, endTime = time
+
+ if self.isProxy():
+ logger.debug("Cannot set anim curve for proxy attribute")
+ return
+
+ if not self.exists():
+ logger.debug("Attr does not exists")
+ return
+
+ if self.isLocked():
+ logger.debug("Cannot set anim curve when the attr locked")
+ return
+
+ if source is None:
+ first = maya.cmds.findKeyframe(curve, which='first')
+ last = maya.cmds.findKeyframe(curve, which='last')
+ source = (first, last)
+
+ # We run the copy key command twice to check we have a valid curve.
+ # It needs to run before the cutKey command, otherwise if it fails
+ # we have cut keys for no reason!
+ success = maya.cmds.copyKey(curve, time=source)
+ if not success:
+ msg = "Cannot copy keys from the anim curve {0}"
+ msg = msg.format(curve)
+ logger.debug(msg)
+ return
+
+ if option == "replace":
+ maya.cmds.cutKey(fullname, time=time)
+ else:
+ time = (startTime, startTime)
+
+ try:
+ # Update the clip board with the give animation curve
+ maya.cmds.copyKey(curve, time=source)
+
+ # Note: If the attribute is connected to referenced
+ # animation then the following command will not work.
+ maya.cmds.pasteKey(fullname, option=option, time=time, connect=connect)
+
+ if option == "replaceCompletely":
+
+ # The pasteKey cmd doesn't support all anim attributes
+ # so we need to manually set theses.
+ dstCurve = self.animCurve()
+ if dstCurve:
+ curveColor = maya.cmds.getAttr(curve + ".curveColor")
+ preInfinity = maya.cmds.getAttr(curve + ".preInfinity")
+ postInfinity = maya.cmds.getAttr(curve + ".postInfinity")
+ useCurveColor = maya.cmds.getAttr(curve + ".useCurveColor")
+
+ maya.cmds.setAttr(dstCurve + ".preInfinity", preInfinity)
+ maya.cmds.setAttr(dstCurve + ".postInfinity", postInfinity)
+ maya.cmds.setAttr(dstCurve + ".curveColor", *curveColor[0])
+ maya.cmds.setAttr(dstCurve + ".useCurveColor", useCurveColor)
+
+ except RuntimeError:
+ msg = 'Cannot paste anim curve "{0}" to attribute "{1}"'
+ msg = msg.format(curve, fullname)
+ logger.exception(msg)
+
+ def animCurve(self):
+ """
+ Return the connected animation curve.
+
+ :rtype: str | None
+ """
+ result = None
+
+ if self.exists():
+
+ n = self.listConnections(plugs=True, destination=False)
+
+ if n and "animCurve" in maya.cmds.nodeType(n):
+ result = n
+
+ elif n and "character" in maya.cmds.nodeType(n):
+ n = maya.cmds.listConnections(n, plugs=True,
+ destination=False)
+ if n and "animCurve" in maya.cmds.nodeType(n):
+ result = n
+
+ if result:
+ return result[0].split(".")[0]
+
+ def isConnected(self, ignoreConnections=None):
+ """
+ Return true if the attribute is connected.
+
+ :type ignoreConnections: list[str]
+ :rtype: bool
+ """
+ if ignoreConnections is None:
+ ignoreConnections = []
+ try:
+ connection = self.listConnections(destination=False)
+ except ValueError:
+ return False
+
+ if connection:
+ if ignoreConnections:
+ connectionType = maya.cmds.nodeType(connection)
+ for ignoreType in ignoreConnections:
+ if connectionType.startswith(ignoreType):
+ return False
+ return True
+ else:
+ return False
+
+ def isBlendable(self):
+ """
+ Return true if the attribute can be blended.
+
+ :rtype: bool
+ """
+ return self.type() in VALID_BLEND_ATTRIBUTES
+
+ def isSettable(self, validConnections=None):
+ """
+ Return true if the attribute can be set.
+
+ :type validConnections: list[str]
+ :rtype: bool
+ """
+ if validConnections is None:
+ validConnections = VALID_CONNECTIONS
+
+ if not self.exists():
+ return False
+
+ if not maya.cmds.listAttr(self.fullname(), unlocked=True, keyable=True, multi=True, scalar=True):
+ return False
+
+ connection = self.listConnections(destination=False)
+ if connection:
+ connectionType = maya.cmds.nodeType(connection)
+ for validType in validConnections:
+ if connectionType.startswith(validType):
+ return True
+ return False
+ else:
+ return True
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/cmds.py b/2023/scripts/animation_tools/studiolibrary/mutils/cmds.py
new file mode 100644
index 0000000..d88b9a4
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/cmds.py
@@ -0,0 +1,425 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import logging
+import platform
+import traceback
+
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+try:
+ import maya.mel
+ import maya.cmds
+except ImportError:
+ traceback.print_exc()
+
+import mutils
+
+
+logger = logging.getLogger(__name__)
+
+
+class MayaUtilsError(Exception):
+ """Base class for exceptions in this module."""
+
+
+class ObjectsError(MayaUtilsError):
+ pass
+
+
+class SelectionError(MayaUtilsError):
+ pass
+
+
+class NoMatchFoundError(MayaUtilsError):
+ pass
+
+
+class NoObjectFoundError(MayaUtilsError):
+ pass
+
+
+class MoreThanOneObjectFoundError(MayaUtilsError):
+ pass
+
+
+class ModelPanelNotInFocusError(MayaUtilsError):
+ pass
+
+
+def system():
+ """
+ Return the current platform in lowercase.
+
+ :rtype: str
+ """
+ return platform.system().lower()
+
+
+def isMac():
+ """
+ Return True if the current OS is Mac.
+
+ :rtype: bool
+ """
+ return system().startswith("os") or \
+ system().startswith("mac") or \
+ system().startswith("darwin")
+
+
+def isLinux():
+ """
+ Return True if the current OS is linux.
+
+ :rtype: bool
+ """
+ return system().lower().startswith("lin")
+
+
+def isWindows():
+ """
+ Return True if the current OS is windows.
+
+ :rtype: bool
+ """
+ return system().lower().startswith("win")
+
+
+def isMaya():
+ """
+ Return True if the current python session is in Maya.
+
+ :rtype: bool
+ """
+ try:
+ import maya.cmds
+ maya.cmds.about(batch=True)
+ return True
+ except ImportError:
+ return False
+
+
+def selectionModifiers():
+ """
+ Return a dictionary of the current key modifiers
+
+ :rtype: dict
+ """
+ result = {"add": False, "deselect": False}
+ modifiers = QtWidgets.QApplication.keyboardModifiers()
+
+ if modifiers == QtCore.Qt.ShiftModifier:
+ result["deselect"] = True
+ elif modifiers == QtCore.Qt.ControlModifier:
+ result["add"] = True
+
+ return result
+
+
+def ls(*args, **kwargs):
+ """
+ List all the node objects for the given options.
+
+ :type args: list
+ :type kwargs: dict
+ """
+ return [mutils.Node(name) for name in maya.cmds.ls(*args, **kwargs) or []]
+
+
+def listAttr(name, **kwargs):
+ """
+ List all the attributes for the given object name.
+
+ :type name: str
+ :type kwargs: str
+ :rtype: list[mutils.Attribute]
+ """
+ attrs = maya.cmds.listAttr(name, **kwargs) or []
+ attrs = list(set(attrs))
+ return [mutils.Attribute(name, attr) for attr in attrs]
+
+
+def disconnectAll(name):
+ """
+ Disconnect all connections from the given object name.
+
+ :type name: str
+ """
+ plugins = maya.cmds.listConnections(name, plugs=True, source=False) or []
+
+ for plug in plugins:
+ source, = maya.cmds.listConnections(plug, plugs=True)
+ maya.cmds.disconnectAttr(source, plug)
+
+
+def animCurve(fullname):
+ """
+ Return the animation curve name for the give attribute.
+
+ :type fullname: str or None
+ :rtype: str or None
+ """
+ attribute = mutils.Attribute(fullname)
+ return attribute.animCurve()
+
+
+def deleteUnknownNodes():
+ """Delete all unknown nodes in the Maya scene."""
+ nodes = maya.cmds.ls(type="unknown")
+ if nodes:
+ for node in nodes:
+ if maya.cmds.objExists(node) and \
+ maya.cmds.referenceQuery(node, inr=True):
+ maya.cmds.delete(node)
+
+
+def currentModelPanel():
+ """
+ Get the current model panel name.
+
+ :rtype: str or None
+ """
+ currentPanel = maya.cmds.getPanel(withFocus=True)
+ currentPanelType = maya.cmds.getPanel(typeOf=currentPanel)
+
+ if currentPanelType not in ['modelPanel']:
+ return None
+
+ return currentPanel
+
+
+def getBakeAttrs(objects):
+ """
+ Get the attributes that are not connected to an animation curve.
+
+ :type objects: list[str]
+ :rtype: list[str]
+ """
+ result = []
+
+ if not objects:
+ raise Exception("No objects specified")
+
+ connections = maya.cmds.listConnections(
+ objects,
+ plugs=True,
+ source=True,
+ connections=True,
+ destination=False
+ ) or []
+
+ for i in range(0, len(connections), 2):
+ dstObj = connections[i]
+ srcObj = connections[i + 1]
+
+ nodeType = maya.cmds.nodeType(srcObj)
+
+ if "animCurve" not in nodeType:
+ result.append(dstObj)
+
+ return result
+
+
+def bakeConnected(objects, time, sampleBy=1):
+ """
+ Bake the given objects.
+
+ :type objects: list[str]
+ :type time: (int, int)
+ :type sampleBy: int
+ """
+ bakeAttrs = getBakeAttrs(objects)
+
+ if bakeAttrs:
+ maya.cmds.bakeResults(
+ bakeAttrs,
+ time=time,
+ shape=False,
+ simulation=True,
+ sampleBy=sampleBy,
+ controlPoints=False,
+ minimizeRotation=True,
+ bakeOnOverrideLayer=False,
+ preserveOutsideKeys=False,
+ sparseAnimCurveBake=False,
+ disableImplicitControl=True,
+ removeBakedAttributeFromLayer=False,
+ )
+ else:
+ logger.error("Cannot find any connection to bake!")
+
+
+def getSelectedObjects():
+ """
+ Get a list of the selected objects in Maya.
+
+ :rtype: list[str]
+ :raises: mutils.SelectionError:
+ """
+ selection = maya.cmds.ls(selection=True)
+ if not selection:
+ raise mutils.SelectionError("No objects selected!")
+ return selection
+
+
+def getSelectedAttrs():
+ """
+ Get the attributes that are selected in the channel box.
+
+ :rtype: list[str]
+ """
+ attributes = maya.cmds.channelBox(
+ "mainChannelBox",
+ query=True,
+ selectedMainAttributes=True
+ )
+
+ if attributes is not None:
+ attributes = str(attributes)
+ attributes = attributes.replace("tx", "translateX")
+ attributes = attributes.replace("ty", "translateY")
+ attributes = attributes.replace("tz", "translateZ")
+ attributes = attributes.replace("rx", "rotateX")
+ attributes = attributes.replace("ry", "rotateY")
+ attributes = attributes.replace("rz", "rotateZ")
+ attributes = eval(attributes)
+
+ return attributes
+
+
+def currentFrameRange():
+ """
+ Get the current first and last frame depending on the context.
+
+ :rtype: (int, int)
+ """
+ start, end = selectedFrameRange()
+
+ if end == start:
+ start, end = selectedObjectsFrameRange()
+
+ if start == end:
+ start, end = playbackFrameRange()
+
+ return start, end
+
+
+def playbackFrameRange():
+ """
+ Get the first and last frame from the play back options.
+
+ :rtype: (int, int)
+ """
+ start = maya.cmds.playbackOptions(query=True, min=True)
+ end = maya.cmds.playbackOptions(query=True, max=True)
+ return start, end
+
+
+def selectedFrameRange():
+ """
+ Get the first and last frame from the play back slider.
+
+ :rtype: (int, int)
+ """
+ result = maya.mel.eval("timeControl -q -range $gPlayBackSlider")
+ start, end = result.replace('"', "").split(":")
+ start, end = int(start), int(end)
+ if end - start == 1:
+ end = start
+ return start, end
+
+
+def selectedObjectsFrameRange(objects=None):
+ """
+ Get the first and last animation frame from the given objects.
+
+ :type objects: list[str]
+ :rtype: (int, int)
+ """
+ start = 0
+ end = 0
+
+ if not objects:
+ objects = maya.cmds.ls(selection=True) or []
+
+ if objects:
+ start = int(maya.cmds.findKeyframe(objects, which='first'))
+ end = int(maya.cmds.findKeyframe(objects, which='last'))
+
+ return start, end
+
+
+def getDurationFromNodes(objects, time=None):
+ """
+ Get the duration of the animation from the given object names.
+
+ :type time: [str, str]
+ :type objects: list[str]
+ :rtype: float
+ """
+ if objects:
+
+ first = maya.cmds.findKeyframe(objects, which='first')
+ last = maya.cmds.findKeyframe(objects, which='last')
+
+ if time:
+ startKey = maya.cmds.findKeyframe(objects, time=(time[0], time[0]), which="next")
+ if startKey > time[1] or startKey < time[0]:
+ return 0
+
+ if first == last:
+ if maya.cmds.keyframe(objects, query=True, keyframeCount=True) > 0:
+ return 1
+ else:
+ return 0
+
+ return last - first
+ else:
+ return 0
+
+
+def getReferencePaths(objects, withoutCopyNumber=False):
+ """
+ Get the reference paths for the given objects.
+
+ :type objects: list[str]
+ :type withoutCopyNumber: bool
+ :rtype: list[str]
+ """
+ paths = []
+ for obj in objects:
+ if maya.cmds.referenceQuery(obj, isNodeReferenced=True):
+ paths.append(maya.cmds.referenceQuery(obj, f=True, wcn=withoutCopyNumber))
+
+ return list(set(paths))
+
+
+def getReferenceData(objects):
+ """
+ Get the reference paths for the given objects.
+
+ :type objects: list[str]
+ :rtype: list[dict]
+ """
+ data = []
+ paths = getReferencePaths(objects)
+
+ for path in paths:
+ data.append({
+ "filename": path,
+ "unresolved": maya.cmds.referenceQuery(path, filename=True, withoutCopyNumber=True),
+ "namespace": maya.cmds.file(path, q=True, namespace=True),
+ "node": maya.cmds.referenceQuery(path, referenceNode=True)
+ })
+
+ return data
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/decorators.py b/2023/scripts/animation_tools/studiolibrary/mutils/decorators.py
new file mode 100644
index 0000000..8e15a79
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/decorators.py
@@ -0,0 +1,166 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import time
+import logging
+
+try:
+ import maya.cmds
+except ImportError:
+ import traceback
+ traceback.print_exc()
+
+
+logger = logging.getLogger(__name__)
+
+
+__all__ = [
+ "timing",
+ "unifyUndo",
+ "disableUndo",
+ "disableViews",
+ "disableAutoKey",
+ "showWaitCursor",
+ "restoreSelection",
+ "restoreCurrentTime",
+]
+
+
+def timing(fn):
+
+ def wrapped(*args, **kwargs):
+ time1 = time.time()
+ ret = fn(*args, **kwargs)
+ time2 = time.time()
+ logger.debug('%s function took %0.5f sec' % (fn.__name__, (time2 - time1)))
+ return ret
+
+ return wrapped
+
+
+def unifyUndo(fn):
+
+ def wrapped(*args, **kwargs):
+ maya.cmds.undoInfo(openChunk=True)
+ try:
+ return fn(*args, **kwargs)
+ finally:
+ maya.cmds.undoInfo(closeChunk=True)
+
+ wrapped.__name__ = fn.__name__
+ wrapped.__doc__ = fn.__doc__
+
+ return wrapped
+
+
+def disableUndo(fn):
+
+ def wrapped(*args, **kwargs):
+ initialUndoState = maya.cmds.undoInfo(q=True, state=True)
+ maya.cmds.undoInfo(stateWithoutFlush=False)
+ try:
+ return fn(*args, **kwargs)
+ finally:
+ maya.cmds.undoInfo(stateWithoutFlush=initialUndoState)
+
+ wrapped.__name__ = fn.__name__
+ wrapped.__doc__ = fn.__doc__
+
+ return wrapped
+
+
+def disableAutoKey(fn):
+
+ def wrapped(*args, **kwargs):
+ initialState = maya.cmds.autoKeyframe(query=True, state=True)
+ maya.cmds.autoKeyframe(edit=True, state=False)
+ try:
+ return fn(*args, **kwargs)
+ finally:
+ maya.cmds.autoKeyframe(edit=True, state=initialState)
+
+ wrapped.__name__ = fn.__name__
+ wrapped.__doc__ = fn.__doc__
+
+ return wrapped
+
+
+def restoreSelection(fn):
+
+ def wrapped(*args, **kwargs):
+ selection = maya.cmds.ls(selection=True) or []
+ try:
+ return fn(*args, **kwargs)
+ finally:
+ if selection:
+ maya.cmds.select(selection)
+
+ wrapped.__name__ = fn.__name__
+ wrapped.__doc__ = fn.__doc__
+
+ return wrapped
+
+
+def restoreCurrentTime(fn):
+
+ def wrapped(*args, **kwargs):
+ initialTime = maya.cmds.currentTime(query=True)
+ try:
+ return fn(*args, **kwargs)
+ finally:
+ maya.cmds.currentTime(initialTime, edit=True)
+
+ wrapped.__name__ = fn.__name__
+ wrapped.__doc__ = fn.__doc__
+
+ return wrapped
+
+
+def showWaitCursor(fn):
+
+ def wrapped(*args, **kwargs):
+ maya.cmds.waitCursor(state=True)
+ try:
+ return fn(*args, **kwargs)
+ finally:
+ maya.cmds.waitCursor(state=False)
+
+ wrapped.__name__ = fn.__name__
+ wrapped.__doc__ = fn.__doc__
+
+ return wrapped
+
+
+def disableViews(fn):
+
+ def wrapped(*args, **kwargs):
+ modelPanels = maya.cmds.getPanel(vis=True)
+ emptySelConn = maya.cmds.selectionConnection()
+
+ for panel in modelPanels:
+ if maya.cmds.getPanel(to=panel) == 'modelPanel':
+ maya.cmds.isolateSelect(panel, state=True)
+ maya.cmds.modelEditor(panel, e=True, mlc=emptySelConn)
+
+ try:
+ return fn(*args, **kwargs)
+ finally:
+ for panel in modelPanels:
+ if maya.cmds.getPanel(to=panel) == 'modelPanel':
+ maya.cmds.isolateSelect(panel, state=False)
+
+ maya.cmds.deleteUI(emptySelConn)
+
+ wrapped.__name__ = fn.__name__
+ wrapped.__doc__ = fn.__doc__
+
+ return wrapped
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/gui/__init__.py b/2023/scripts/animation_tools/studiolibrary/mutils/gui/__init__.py
new file mode 100644
index 0000000..7cf2579
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/gui/__init__.py
@@ -0,0 +1,52 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtCompat
+from studiovendor.Qt import QtWidgets
+
+try:
+ import maya.OpenMayaUI as omui
+except ImportError as error:
+ print(error)
+
+from .framerangemenu import FrameRangeMenu
+from .framerangemenu import showFrameRangeMenu
+from .modelpanelwidget import ModelPanelWidget
+from .thumbnailcapturedialog import *
+from .thumbnailcapturemenu import ThumbnailCaptureMenu
+
+
+def mayaWindow():
+ """
+ Return the Maya main window as a QMainWindow object.
+
+ :rtype: QMainWindow
+ """
+ mainWindowPtr = omui.MQtUtil.mainWindow()
+ return QtCompat.wrapInstance(mainWindowPtr, QtWidgets.QMainWindow)
+
+
+def makeMayaStandaloneWindow(w):
+ """
+ Make a standalone window, though parented under Maya's mainWindow.
+
+ The parenting under Maya's mainWindow is done so that the QWidget will
+ not auto-destroy itself when the instance variable goes out of scope.
+ """
+ # Parent under the main Maya window
+ w.setParent(mayaWindow())
+
+ # Make this widget appear as a standalone window
+ w.setWindowFlags(QtCore.Qt.Window)
+ w.raise_()
+ w.show()
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/gui/framerangemenu.py b/2023/scripts/animation_tools/studiolibrary/mutils/gui/framerangemenu.py
new file mode 100644
index 0000000..f35778f
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/gui/framerangemenu.py
@@ -0,0 +1,67 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtWidgets
+
+import mutils
+
+
+__all__ = ["FrameRangeMenu", "showFrameRangeMenu"]
+
+
+class FrameRangeAction(QtWidgets.QAction):
+ def __init__(self, *args):
+ super(FrameRangeAction, self).__init__(*args)
+
+ self._frameRange = (0, 100)
+
+ def frameRange(self):
+ return self._frameRange
+
+ def setFrameRange(self, frameRange):
+ self._frameRange = frameRange
+
+
+class FrameRangeMenu(QtWidgets.QMenu):
+
+ def __init__(self, parent=None):
+ super(FrameRangeMenu, self).__init__(parent)
+
+ action = FrameRangeAction("From Timeline", self)
+ action.setFrameRange(mutils.playbackFrameRange())
+ self.addAction(action)
+
+ action = FrameRangeAction("From Selected Timeline", self)
+ action.setFrameRange(mutils.selectedFrameRange())
+ self.addAction(action)
+
+ action = FrameRangeAction("From Selected Objects", self)
+ action.setFrameRange(mutils.selectedObjectsFrameRange())
+ self.addAction(action)
+
+
+def showFrameRangeMenu():
+ """
+ Show the frame range menu at the current cursor position.
+
+ :rtype: QtWidgets.QAction
+ """
+ menu = FrameRangeMenu()
+ position = QtGui.QCursor().pos()
+ action = menu.exec_(position)
+ return action
+
+
+if __name__ == "__main__":
+ action = showFrameRangeMenu()
+ print(action.frameRange())
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/gui/modelpanelwidget.py b/2023/scripts/animation_tools/studiolibrary/mutils/gui/modelpanelwidget.py
new file mode 100644
index 0000000..8bb8e8c
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/gui/modelpanelwidget.py
@@ -0,0 +1,100 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import mutils
+import mutils.gui
+
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+try:
+ import maya.cmds
+ import maya.OpenMayaUI as mui
+ isMaya = True
+except ImportError:
+ isMaya = False
+
+
+__all__ = ["ModelPanelWidget"]
+
+
+class ModelPanelWidget(QtWidgets.QWidget):
+
+ def __init__(self, parent, name="capturedModelPanel", **kwargs):
+ super(ModelPanelWidget, self).__init__(parent, **kwargs)
+
+ uniqueName = name + str(id(self))
+ self.setObjectName(uniqueName + 'Widget')
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.setContentsMargins(0, 0, 0, 0)
+ layout.setObjectName(uniqueName + "Layout")
+ self.setLayout(layout)
+
+ maya.cmds.setParent(layout.objectName())
+ self._modelPanel = maya.cmds.modelPanel(uniqueName, label="ModelPanel")
+ self.setModelPanelOptions()
+
+ def setModelPanelOptions(self):
+
+ modelPanel = self.name()
+
+ maya.cmds.modelEditor(modelPanel, edit=True, allObjects=False)
+ maya.cmds.modelEditor(modelPanel, edit=True, grid=False)
+ maya.cmds.modelEditor(modelPanel, edit=True, dynamics=False)
+ maya.cmds.modelEditor(modelPanel, edit=True, activeOnly=False)
+ maya.cmds.modelEditor(modelPanel, edit=True, manipulators=False)
+ maya.cmds.modelEditor(modelPanel, edit=True, headsUpDisplay=False)
+ maya.cmds.modelEditor(modelPanel, edit=True, selectionHiliteDisplay=False)
+
+ maya.cmds.modelEditor(modelPanel, edit=True, polymeshes=True)
+ maya.cmds.modelEditor(modelPanel, edit=True, nurbsSurfaces=True)
+ maya.cmds.modelEditor(modelPanel, edit=True, subdivSurfaces=True)
+ maya.cmds.modelEditor(modelPanel, edit=True, displayTextures=True)
+ maya.cmds.modelEditor(modelPanel, edit=True, displayAppearance="smoothShaded")
+
+ currentModelPanel = mutils.currentModelPanel()
+
+ if currentModelPanel:
+ camera = maya.cmds.modelEditor(currentModelPanel, query=True, camera=True)
+ displayLights = maya.cmds.modelEditor(currentModelPanel, query=True, displayLights=True)
+ displayTextures = maya.cmds.modelEditor(currentModelPanel, query=True, displayTextures=True)
+
+ maya.cmds.modelEditor(modelPanel, edit=True, camera=camera)
+ maya.cmds.modelEditor(modelPanel, edit=True, displayLights=displayLights)
+ maya.cmds.modelEditor(modelPanel, edit=True, displayTextures=displayTextures)
+
+ def name(self):
+ return self._modelPanel
+
+ def modelPanel(self):
+ ptr = mui.MQtUtil.findControl(self._modelPanel)
+ return mutils.gui.wrapInstance(ptr, QtWidgets.QWidget)
+
+ def barLayout(self):
+ name = maya.cmds.modelPanel(self._modelPanel, query=True, barLayout=True)
+ ptr = mui.MQtUtil.findControl(name)
+ return mutils.gui.wrapInstance(ptr, QtCore.QObject)
+
+ def hideBarLayout(self):
+ self.barLayout().hide()
+
+ def hideMenuBar(self):
+ maya.cmds.modelPanel(self._modelPanel, edit=True, menuBarVisible=False)
+
+ def setCamera(self, name):
+ maya.cmds.modelPanel(self._modelPanel, edit=True, cam=name)
+
+
+if __name__ == "__main__":
+ widget = ModelPanelWidget(None, "modelPanel")
+ widget.show()
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/gui/thumbnailcapturedialog.py b/2023/scripts/animation_tools/studiolibrary/mutils/gui/thumbnailcapturedialog.py
new file mode 100644
index 0000000..0be4dfd
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/gui/thumbnailcapturedialog.py
@@ -0,0 +1,290 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+"""
+The capture dialog is used for creating thumbnails and thumbnail playblasts.
+
+import mutils.gui
+print mutils.gui.capture("c:/temp/test.jpg", startFrame=1, endFrame=100)
+# c:/temp/test.0001.jpg
+"""
+
+import os
+import shutil
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+try:
+ import maya.cmds
+except Exception:
+ import traceback
+ traceback.print_exc()
+
+import studioqt
+
+import mutils.gui
+import mutils.gui.modelpanelwidget
+
+
+__all__ = [
+ "thumbnailCapture",
+ "ThumbnailCaptureDialog",
+ ]
+
+
+_instance = None
+
+
+def thumbnailCapture(
+ path,
+ startFrame=None,
+ endFrame=None,
+ step=1,
+ clearCache=False,
+ captured=None,
+ show=False,
+ modifier=True,
+):
+ """
+ Capture a playblast and save it to the given path.
+
+ :type path: str
+ :type startFrame: int or None
+ :type endFrame: int or None
+ :type step: int
+ :type clearCache: bool
+ :type captured: func or None
+ :rtype: ThumbnailCaptureDialog
+ """
+
+ global _instance
+
+ def _clearCache():
+ dirname = os.path.dirname(path)
+ if os.path.exists(dirname):
+ shutil.rmtree(dirname)
+
+ if _instance:
+ _instance.close()
+
+ d = mutils.gui.ThumbnailCaptureDialog(
+ path=path,
+ startFrame=startFrame,
+ endFrame=endFrame,
+ step=step,
+ )
+
+ if captured:
+ d.captured.connect(captured)
+
+ if clearCache:
+ d.capturing.connect(_clearCache)
+
+ d.show()
+
+ if not show and not (modifier and studioqt.isControlModifier()):
+ d.capture()
+ d.close()
+
+ _instance = d
+
+ return _instance
+
+
+class ThumbnailCaptureDialog(QtWidgets.QDialog):
+
+ DEFAULT_WIDTH = 250
+ DEFAULT_HEIGHT = 250
+
+ captured = QtCore.Signal(str)
+ capturing = QtCore.Signal(str)
+
+ def __init__(self, path="", parent=None, startFrame=None, endFrame=None, step=1):
+ """
+ :type path: str
+ :type parent: QtWidgets.QWidget
+ :type startFrame: int
+ :type endFrame: int
+ :type step: int
+ """
+ parent = parent or mutils.gui.mayaWindow()
+
+ QtWidgets.QDialog.__init__(self, parent)
+
+ self._path = path
+ self._step = step
+ self._endFrame = None
+ self._startFrame = None
+ self._capturedPath = None
+
+ if endFrame is None:
+ endFrame = int(maya.cmds.currentTime(query=True))
+
+ if startFrame is None:
+ startFrame = int(maya.cmds.currentTime(query=True))
+
+ self.setEndFrame(endFrame)
+ self.setStartFrame(startFrame)
+
+ self.setObjectName("CaptureWindow")
+ self.setWindowTitle("Capture Window")
+
+ self._captureButton = QtWidgets.QPushButton("Capture")
+ self._captureButton.clicked.connect(self.capture)
+
+ self._modelPanelWidget = mutils.gui.modelpanelwidget.ModelPanelWidget(self)
+
+ vbox = QtWidgets.QVBoxLayout()
+ vbox.setObjectName(self.objectName() + "Layout")
+ vbox.addWidget(self._modelPanelWidget)
+ vbox.addWidget(self._captureButton)
+
+ self.setLayout(vbox)
+
+ width = (self.DEFAULT_WIDTH * 1.5)
+ height = (self.DEFAULT_HEIGHT * 1.5) + 50
+
+ self.setWidthHeight(width, height)
+ self.centerWindow()
+
+ def path(self):
+ """
+ Return the destination path.
+
+ :rtype: str
+ """
+ return self._path
+
+ def setPath(self, path):
+ """
+ Set the destination path.
+
+ :type path: str
+ """
+ self._path = path
+
+ def endFrame(self):
+ """
+ Return the end frame of the playblast.
+
+ :rtype: int
+ """
+ return self._endFrame
+
+ def setEndFrame(self, endFrame):
+ """
+ Specify the end frame of the playblast.
+
+ :type endFrame: int
+ """
+ self._endFrame = int(endFrame)
+
+ def startFrame(self):
+ """
+ Return the start frame of the playblast.
+
+ :rtype: int
+ """
+ return self._startFrame
+
+ def setStartFrame(self, startFrame):
+ """
+ Specify the start frame of the playblast.
+
+ :type startFrame: int
+ """
+ self._startFrame = int(startFrame)
+
+ def step(self):
+ """
+ Return the step amount of the playblast.
+
+ Example:
+ if step is set to 2 it will playblast every second frame.
+
+ :rtype: int
+ """
+ return self._step
+
+ def setStep(self, step):
+ """
+ Set the step amount of the playblast.
+
+ :type step: int
+ """
+ self._step = step
+
+ def setWidthHeight(self, width, height):
+ """
+ Set the width and height of the window.
+
+ :type width: int
+ :type height: int
+ :rtype: None
+ """
+ x = self.geometry().x()
+ y = self.geometry().y()
+ self.setGeometry(x, y, width, height)
+
+ def centerWindow(self):
+ """
+ Center the widget to the center of the desktop.
+
+ :rtype: None
+ """
+ geometry = self.frameGeometry()
+ pos = QtGui.QCursor.pos()
+ screen = QtWidgets.QApplication.screenAt(pos)
+ centerPoint = screen.availableGeometry().center()
+ geometry.moveCenter(centerPoint)
+ self.move(geometry.topLeft())
+
+ def capturedPath(self):
+ """
+ Return the location of the captured playblast.
+
+ :rtype:
+ """
+ return self._capturedPath
+
+ def capture(self):
+ """
+ Capture a playblast and save it to the given path.
+
+ :rtype: None
+ """
+ path = self.path()
+
+ self.capturing.emit(path)
+
+ modelPanel = self._modelPanelWidget.name()
+ startFrame = self.startFrame()
+ endFrame = self.endFrame()
+ step = self.step()
+ width = self.DEFAULT_WIDTH
+ height = self.DEFAULT_HEIGHT
+
+ self._capturedPath = mutils.playblast.playblast(
+ path,
+ modelPanel,
+ startFrame,
+ endFrame,
+ width,
+ height,
+ step=step,
+ )
+
+ self.accept()
+
+ self.captured.emit(self._capturedPath)
+ return self._capturedPath
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/gui/thumbnailcapturemenu.py b/2023/scripts/animation_tools/studiolibrary/mutils/gui/thumbnailcapturemenu.py
new file mode 100644
index 0000000..f87487a
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/gui/thumbnailcapturemenu.py
@@ -0,0 +1,149 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import os
+import shutil
+import logging
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+import mutils.gui
+
+import studiolibrary.widgets
+
+
+__all__ = [
+ "ThumbnailCaptureMenu",
+ "testThumbnailCaptureMenu"
+]
+
+
+logger = logging.getLogger(__name__)
+
+
+class ThumbnailCaptureMenu(QtWidgets.QMenu):
+
+ captured = QtCore.Signal(str)
+
+ def __init__(self, path, force=False, parent=None):
+ """
+ Thumbnail capture menu.
+
+ :type path: str
+ :type force: bool
+ :type parent: None or QtWidgets.QWidget
+ """
+ QtWidgets.QMenu.__init__(self, parent)
+
+ self._path = path
+ self._force = force
+
+ changeImageAction = QtWidgets.QAction('Capture new image', self)
+ changeImageAction.triggered.connect(self.capture)
+ self.addAction(changeImageAction)
+
+ changeImageAction = QtWidgets.QAction('Show Capture window', self)
+ changeImageAction.triggered.connect(self.showCaptureWindow)
+ self.addAction(changeImageAction)
+
+ loadImageAction = QtWidgets.QAction('Load image from disk', self)
+ loadImageAction.triggered.connect(self.showLoadImageDialog)
+ self.addAction(loadImageAction)
+
+ def path(self):
+ """
+ Return the thumbnail path on disc.
+
+ :rtype: str
+ """
+ return self._path
+
+ def showWarningDialog(self):
+ """Show a warning dialog for overriding the previous thumbnail."""
+ title = "Override Thumbnail"
+
+ text = u"This action will delete the previous thumbnail. The " \
+ u"previous image cannot be backed up. Do you want to " \
+ u"confirm the action to take a new image and delete " \
+ u"the previous one?"
+
+ clickedButton = studiolibrary.widgets.MessageBox.warning(
+ self.parent(),
+ title=title,
+ text=text,
+ enableDontShowCheckBox=True,
+ )
+
+ if clickedButton != QtWidgets.QDialogButtonBox.StandardButton.Yes:
+ raise Exception("Dialog was canceled!")
+
+ def showCaptureWindow(self):
+ """Show the capture window for framing."""
+ self.capture(show=True)
+
+ def capture(self, show=False):
+ """
+ Capture an image from the Maya viewport.
+
+ :type show: bool
+ """
+ if not self._force and os.path.exists(self.path()):
+ self.showWarningDialog()
+
+ mutils.gui.thumbnailCapture(
+ show=show,
+ path=self.path(),
+ captured=self.captured.emit
+ )
+
+ def showLoadImageDialog(self):
+ """Show a file dialog for choosing an image from disc."""
+ if not self._force and os.path.exists(self.path()):
+ self.showWarningDialog()
+
+ fileDialog = QtWidgets.QFileDialog(
+ self,
+ caption="Open Image",
+ filter="Image Files (*.png *.jpg *.bmp)"
+ )
+
+ fileDialog.fileSelected.connect(self._fileSelected)
+ fileDialog.exec_()
+
+ def _fileSelected(self, path):
+ """
+ Triggered when the file dialog is accepted.
+
+ :type path: str
+ """
+ shutil.copy(path, self.path())
+ self.captured.emit(self.path())
+
+
+def testThumbnailCaptureMenu():
+ """A method for testing the thumbnail capture menu in Maya."""
+
+ def capturedCallback(path):
+ """
+ Triggered when the captured menu has been accepted.
+
+ :type path: str
+ """
+ print("Captured thumbnail to:", path)
+
+ path = "c:/tmp/test.png"
+
+ menu = ThumbnailCaptureMenu(path, True)
+ menu.captured.connect(capturedCallback)
+ menu.exec_(QtGui.QCursor.pos())
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/matchnames.py b/2023/scripts/animation_tools/studiolibrary/mutils/matchnames.py
new file mode 100644
index 0000000..4eb66ee
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/matchnames.py
@@ -0,0 +1,174 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import logging
+
+import mutils
+from collections import OrderedDict
+
+__all__ = [
+ "matchNames",
+ "groupObjects",
+]
+
+
+logger = logging.getLogger(__name__)
+
+
+def rotateSequence(seq, current):
+ """
+ :type seq:
+ :type current:
+ :rtype:
+ """
+ n = len(seq)
+ for i in range(n):
+ yield seq[(i + current) % n]
+
+
+def groupObjects(objects):
+ """
+ :type objects:
+ :rtype:
+ """
+ results = OrderedDict()
+ for name in objects:
+ node = mutils.Node(name)
+ results.setdefault(node.namespace(), [])
+ results[node.namespace()].append(name)
+ results = OrderedDict(sorted(results.items(), key=lambda t: (t[0].count(":"), len(t[0]))))
+ return results
+
+
+def indexObjects(objects):
+ """
+ :type objects: list[str]
+ :rtype: dict
+ """
+ result = {}
+ if objects:
+ for name in objects:
+ node = mutils.Node(name)
+ result.setdefault(node.shortname(), [])
+ result[node.shortname()].append(node)
+ return result
+
+
+def matchInIndex(node, index):
+ """
+ :type node: mutils.Node
+ :type index: dict[list[mutils.Node]]
+ :rtype: Node
+ """
+ result = None
+ if node.shortname() in index:
+ nodes = index[node.shortname()]
+ if nodes:
+ for n in nodes:
+ if node.name().endswith(n.name()) or n.name().endswith(node.name()):
+ result = n
+ break
+ if result is not None:
+ index[node.shortname()].remove(result)
+
+ return result
+
+
+def matchNames(srcObjects, dstObjects=None, dstNamespaces=None, search=None, replace=None):
+ """
+ :type srcObjects: list[str]
+ :type dstObjects: list[str]
+ :type dstNamespaces: list[str]
+ :rtype: list[(mutils.Node, mutils.Node)]
+ """
+ results = []
+ if dstObjects is None:
+ dstObjects = []
+
+ srcGroup = groupObjects(srcObjects)
+ srcNamespaces = srcGroup.keys()
+
+ if not dstObjects and not dstNamespaces: # and not selection:
+ dstNamespaces = srcNamespaces
+
+ if not dstNamespaces and dstObjects:
+ dstGroup = groupObjects(dstObjects)
+ dstNamespaces = dstGroup.keys()
+
+ dstIndex = indexObjects(dstObjects)
+ # DESTINATION NAMESPACES NOT IN SOURCE OBJECTS
+ dstNamespaces2 = [x for x in dstNamespaces if x not in srcNamespaces]
+
+ # DESTINATION NAMESPACES IN SOURCE OBJECTS
+ dstNamespaces1 = [x for x in dstNamespaces if x not in dstNamespaces2]
+
+ # CACHE DESTINATION OBJECTS WITH NAMESPACES IN SOURCE OBJECTS
+ usedNamespaces = []
+ notUsedNamespaces = []
+
+ # FIRST LOOP THROUGH ALL DESTINATION NAMESPACES IN SOURCE OBJECTS
+ for srcNamespace in srcNamespaces:
+ if srcNamespace in dstNamespaces1:
+ usedNamespaces.append(srcNamespace)
+ for name in srcGroup[srcNamespace]:
+
+ srcNode = mutils.Node(name)
+
+ if search is not None and replace is not None:
+ # Using the mirror table which supports * style replacing
+ name = mutils.MirrorTable.replace(name, search, replace)
+
+ dstNode = mutils.Node(name)
+
+ if dstObjects:
+ dstNode = matchInIndex(dstNode, dstIndex)
+ if dstNode:
+ results.append((srcNode, dstNode))
+ yield (srcNode, dstNode)
+ else:
+ logger.debug("Cannot find matching destination object for %s" % srcNode.name())
+ else:
+ notUsedNamespaces.append(srcNamespace)
+
+ # SECOND LOOP THROUGH ALL OTHER DESTINATION NAMESPACES
+ srcNamespaces = notUsedNamespaces
+ srcNamespaces.extend(usedNamespaces)
+ _index = 0
+ for dstNamespace in dstNamespaces2:
+ match = False
+ i = _index
+ for srcNamespace in rotateSequence(srcNamespaces, _index):
+ if match:
+ _index = i
+ break
+ i += 1
+ for name in srcGroup[srcNamespace]:
+ srcNode = mutils.Node(name)
+ dstNode = mutils.Node(name)
+ dstNode.setNamespace(dstNamespace)
+
+ if dstObjects:
+ dstNode = matchInIndex(dstNode, dstIndex)
+ elif dstNamespaces:
+ pass
+
+ if dstNode:
+ match = True
+ results.append((srcNode, dstNode))
+ yield (srcNode, dstNode)
+ else:
+ logger.debug("Cannot find matching destination object for %s" % srcNode.name())
+
+ if logger.parent.level == logging.DEBUG or logger.level == logging.DEBUG:
+ for dstNodes in dstIndex.values():
+ for dstNode in dstNodes:
+ logger.debug("Cannot find matching source object for %s" % dstNode.name())
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/mirrortable.py b/2023/scripts/animation_tools/studiolibrary/mutils/mirrortable.py
new file mode 100644
index 0000000..c4daedc
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/mirrortable.py
@@ -0,0 +1,918 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+"""
+# mirrortable.py
+
+import mutils
+
+# Example 1:
+# Create a MirrorTable instance from the given objects
+mt = mutils.MirrorTable.fromObjects(objects, "_l_", "_r_", MirrorPlane.YZ)
+
+# Example 2:
+# Create a MirrorTable instance from the selected objects
+objects = maya.cmds.ls(selection=True)
+mt = mutils.MirrorTable.fromObjects(objects, "_l_", "_r_", MirrorPlane.YZ)
+
+# Example 3:
+# Save the MirrorTable to the given JSON path
+path = "/tmp/mirrortable.json"
+mt.save(path)
+
+# Example 4:
+# Create a MirrorTable instance from the given JSON path
+path = "/tmp/mirrortable.json"
+mt = mutils.MirrorTable.fromPath(path)
+
+# Example 5:
+# Mirror all the objects from file
+mt.load()
+
+# Example 6:
+# Mirror only the selected objects
+objects = maya.cmds.ls(selection=True) or []
+mt.load(objects=objects)
+
+# Example 7:
+# Mirror all objects from file to the given namespaces
+mt.load(namespaces=["character1", "character2"])
+
+# Example 8:
+# Mirror only the given objects
+mt.load(objects=["character1:Hand_L", "character1:Finger_L"])
+
+# Example 9:
+# Mirror all objects from left to right
+mt.load(option=mutils.MirrorOption.LeftToRight)
+
+# Example 10:
+# Mirror all objects from right to left
+mt.load(option=mutils.MirrorOption.RightToLeft)
+
+# Example 11:
+# Mirror only the current pose
+mt.load(animation=False)
+"""
+
+import re
+import mutils
+import logging
+import traceback
+
+from studiovendor import six
+
+try:
+ import maya.cmds
+except ImportError:
+ traceback.print_exc()
+
+
+__all__ = [
+ "MirrorTable",
+ "MirrorPlane",
+ "MirrorOption",
+ "saveMirrorTable",
+]
+
+
+logger = logging.getLogger(__name__)
+
+
+RE_LEFT_SIDE = "Left|left|Lf|lt_|_lt|lf_|_lf|_l_|_L|L_|:l_|^l_|_l$|:L|^L"
+RE_RIGHT_SIDE = "Right|right|Rt|rt_|_rt|_r_|_R|R_|:r_|^r_|_r$|:R|^R"
+
+VALID_NODE_TYPES = ["joint", "transform"]
+
+
+class MirrorPlane:
+ YZ = [-1, 1, 1]
+ XZ = [1, -1, 1]
+ XY = [1, 1, -1]
+
+
+class MirrorOption:
+ Swap = 0
+ LeftToRight = 1
+ RightToLeft = 2
+
+
+class KeysOption:
+ All = "All Keys"
+ SelectedRange = "Selected Range"
+
+
+def saveMirrorTable(path, objects, metadata=None, *args, **kwargs):
+ """
+ Convenience function for saving a mirror table to the given disc location.
+
+ :type path: str
+ :type objects: list[str]
+ :type metadata: dict or None
+ :type args: list
+ :type kwargs: dict
+ :rtype: MirrorTable
+ """
+ mirrorTable = MirrorTable.fromObjects(objects, *args, **kwargs)
+
+ if metadata:
+ mirrorTable.updateMetadata(metadata)
+
+ mirrorTable.save(path)
+
+ return mirrorTable
+
+
+class MirrorTable(mutils.TransferObject):
+
+ @classmethod
+ @mutils.timing
+ @mutils.unifyUndo
+ @mutils.showWaitCursor
+ @mutils.restoreSelection
+ def fromObjects(
+ cls,
+ objects,
+ leftSide=None,
+ rightSide=None,
+ mirrorPlane=None
+ ):
+ """
+ Create a new Mirror Table instance from the given Maya object/controls.
+
+ :type objects: list[str]
+ :type leftSide: str
+ :type rightSide: str
+ :type mirrorPlane: mirrortable.MirrorPlane or str
+
+ :rtype: MirrorTable
+ """
+ mirrorPlane = mirrorPlane or MirrorPlane.YZ
+
+ if isinstance(mirrorPlane, six.string_types):
+
+ if mirrorPlane.lower() == "yz":
+ mirrorPlane = MirrorPlane.YZ
+
+ elif mirrorPlane.lower() == "xz":
+ mirrorPlane = MirrorPlane.XZ
+
+ elif mirrorPlane.lower() == "xy":
+ mirrorPlane = MirrorPlane.XY
+
+ mirrorTable = cls()
+ mirrorTable.setMetadata("left", leftSide)
+ mirrorTable.setMetadata("right", rightSide)
+ mirrorTable.setMetadata("mirrorPlane", mirrorPlane)
+
+ for obj in objects:
+ nodeType = maya.cmds.nodeType(obj)
+ if nodeType in VALID_NODE_TYPES:
+ mirrorTable.add(obj)
+ else:
+ msg = "Node of type {0} is not supported. Node name: {1}"
+ msg = msg.format(nodeType, obj)
+ logger.info(msg)
+
+ return mirrorTable
+
+ @staticmethod
+ def findLeftSide(objects):
+ """
+ Return the left side naming convention for the given objects
+
+ :type objects: list[str]
+ :rtype: str
+ """
+ return MirrorTable.findSide(objects, RE_LEFT_SIDE)
+
+ @staticmethod
+ def findRightSide(objects):
+ """
+ Return the right side naming convention for the given objects
+
+ :type objects: list[str]
+ :rtype: str
+ """
+ return MirrorTable.findSide(objects, RE_RIGHT_SIDE)
+
+ @classmethod
+ def findSide(cls, objects, reSides):
+ """
+ Return the naming convention for the given object names.
+
+ :type objects: list[str]
+ :type reSides: str or list[str]
+ :rtype: str
+ """
+ if isinstance(reSides, six.string_types):
+ reSides = reSides.split("|")
+
+ # Compile the list of regular expressions into a re.object
+ reSides = [re.compile(side) for side in reSides]
+
+ for obj in objects:
+ obj = obj.split("|")[-1]
+ obj = obj.split(":")[-1]
+
+ for reSide in reSides:
+
+ m = reSide.search(obj)
+ if m:
+ side = m.group()
+
+ if obj.startswith(side):
+ side += "*"
+
+ if obj.endswith(side):
+ side = "*" + side
+
+ return side
+
+ return ""
+
+ @staticmethod
+ def matchSide(name, side):
+ """
+ Return True if the name contains the given side.
+
+ :type name: str
+ :type side: str
+ :rtype: bool
+ """
+ if side:
+ return MirrorTable.rreplace(name, side, "X") != name
+
+ return False
+
+ @staticmethod
+ def rreplace(name, old, new):
+ """
+ convenience method.
+
+ Example:
+ print MirrorTable.rreplace("CHR1:RIG:RhandCON", ":R", ":L")
+ "CHR1:RIG:LhandCON"
+
+ :type name: str
+ :type old: str
+ :type new: str
+ :rtype: str
+ """
+ names = []
+
+ for n in name.split("|"):
+
+ namespaces = ''
+ if ':' in n:
+ namespaces, n = n.rsplit(':', 1)
+
+ other = mutils.mirrortable.MirrorTable.replace(n, old, new)
+
+ if namespaces:
+ other = ':'.join([namespaces, other])
+
+ names.append(other)
+
+ return "|".join(names)
+
+ @staticmethod
+ def replace(name, old, new):
+ """
+ A static method that is called by self.mirrorObject.
+
+ :type name: str
+ :type old: str
+ :type new: str
+ :rtype: str
+ """
+ # Support for replacing a prefix naming convention.
+ if old.endswith("*") or new.endswith("*"):
+ name = MirrorTable.replacePrefix(name, old, new)
+
+ # Support for replacing a suffix naming convention.
+ elif old.startswith("*") or new.startswith("*"):
+ name = MirrorTable.replaceSuffix(name, old, new)
+
+ # Support for all other naming conventions.
+ else:
+ name = name.replace(old, new)
+
+ return name
+
+ @staticmethod
+ def replacePrefix(name, old, new):
+ """
+ Replace the given old prefix with the given new prefix.
+ It should also support long names.
+
+ # Example:
+ self.replacePrefix("R_footRoll", "R", "L")
+ # Result: "L_footRoll" and not "L_footLoll".
+
+ self.replacePrefix("Grp|Ch1:R_footExtra|Ch1:R_footRoll", "R_", "L_")
+ # Result: "Grp|Ch1:L_footExtra|Ch1:L_footRoll"
+
+ :type name: str
+ :type old: str
+ :type new: str
+ :rtype: str
+ """
+ old = old.replace("*", "")
+ new = new.replace("*", "")
+
+ if name.startswith(old):
+ name = name.replace(old, new, 1)
+
+ return name
+
+ @staticmethod
+ def replaceSuffix(name, old, new):
+ """
+ Replace the given old suffix with the given new suffix.
+ It should also support long names.
+
+ # Example:
+ self.replaceSuffix("footRoll_R", "R", "L")
+ # Result: "footRoll_L" and not "footLoll_L".
+
+ self.replaceSuffix("Grp|Ch1:footExtra_R|Ch1:footRoll_R", "_R", "_L")
+ # Result: "Grp|Ch1:footExtra_L|Ch1:footRoll_L"
+
+ :type name: str
+ :type old: str
+ :type new: str
+ :rtype: str
+ """
+ old = old.replace("*", "")
+ new = new.replace("*", "")
+
+ if name.endswith(old):
+ name = name[:-len(old)] + new
+
+ return name
+
+ def mirrorObject(self, obj):
+ """
+ Return the other/opposite side for the given name.
+
+ Example:
+ print self.mirrorObject("FKSholder_L")
+ # FKShoulder_R
+
+ :type obj: str
+ :rtype: str or None
+ """
+ leftSide = self.leftSide()
+ rightSide = self.rightSide()
+ return self._mirrorObject(obj, leftSide, rightSide)
+
+ @staticmethod
+ def _mirrorObject(obj, leftSide, rightSide):
+ """
+ A static method that is called by self.mirrorObject.
+
+ :type obj: str
+ :rtype: str or None
+ """
+ dstName = MirrorTable.rreplace(obj, leftSide, rightSide)
+
+ if obj == dstName:
+ dstName = MirrorTable.rreplace(obj, rightSide, leftSide)
+
+ if dstName != obj:
+ return dstName
+
+ # Return None as the given name is probably a center control
+ # and doesn't have an opposite side.
+ return None
+
+ @staticmethod
+ def animCurve(obj, attr):
+ """
+ :type obj: str
+ :type attr: str
+ :rtype: str
+ """
+ fullname = obj + "." + attr
+ connections = maya.cmds.listConnections(fullname, d=False, s=True)
+ if connections:
+ return connections[0]
+ return None
+
+ @staticmethod
+ def scaleKey(obj, attr, time=None):
+ """
+ :type obj: str
+ :type attr: str
+ """
+ curve = MirrorTable.animCurve(obj, attr)
+ if curve:
+ maya.cmds.selectKey(curve)
+ if time:
+ maya.cmds.scaleKey(time=time, iub=False, ts=1, fs=1, vs=-1, vp=0, animation="keys")
+ else:
+ maya.cmds.scaleKey(iub=False, ts=1, fs=1, vs=-1, vp=0, animation="keys")
+ @staticmethod
+ def formatValue(attr, value, mirrorAxis):
+ """
+ :type attr: str
+ :type value: float
+ :type mirrorAxis: list[int]
+ :rtype: float
+ """
+ if MirrorTable.isAttrMirrored(attr, mirrorAxis):
+ return value * -1
+ return value
+
+ @staticmethod
+ def maxIndex(numbers):
+ """
+ Finds the largest number in a list
+ :type numbers: list[float] or list[str]
+ :rtype: int
+ """
+ m = 0
+ result = 0
+ for i in numbers:
+ v = abs(float(i))
+ if v > m:
+ m = v
+ result = numbers.index(i)
+ return result
+
+ @staticmethod
+ def axisWorldPosition(obj, axis):
+ """
+ :type obj: str
+ :type axis: list[int]
+ :rtype: list[float]
+ """
+ transform1 = maya.cmds.createNode("transform", name="transform1")
+ try:
+ transform1, = maya.cmds.parent(transform1, obj, r=True)
+ maya.cmds.setAttr(transform1 + ".t", *axis)
+ maya.cmds.setAttr(transform1 + ".r", 0, 0, 0)
+ maya.cmds.setAttr(transform1 + ".s", 1, 1, 1)
+ return maya.cmds.xform(transform1, q=True, ws=True, piv=True)
+ finally:
+ maya.cmds.delete(transform1)
+
+ @staticmethod
+ def isAttrMirrored(attr, mirrorAxis):
+ """
+ :type attr: str
+ :type mirrorAxis: list[int]
+ :rtype: float
+ """
+ if mirrorAxis == [-1, 1, 1]:
+ if attr == "translateX" or attr == "rotateY" or attr == "rotateZ":
+ return True
+
+ elif mirrorAxis == [1, -1, 1]:
+ if attr == "translateY" or attr == "rotateX" or attr == "rotateZ":
+ return True
+
+ elif mirrorAxis == [1, 1, -1]:
+ if attr == "translateZ" or attr == "rotateX" or attr == "rotateY":
+ return True
+
+ elif mirrorAxis == [-1, -1, -1]:
+ if attr == "translateX" or attr == "translateY" or attr == "translateZ":
+ return True
+ return False
+
+ @staticmethod
+ def isAxisMirrored(srcObj, dstObj, axis, mirrorPlane):
+ """
+ :type srcObj: str
+ :type dstObj: str
+ :type axis: list[int]
+ :type mirrorPlane: list[int]
+ :rtype: int
+ """
+ old1 = maya.cmds.xform(srcObj, q=True, ws=True, piv=True)
+ old2 = maya.cmds.xform(dstObj, q=True, ws=True, piv=True)
+
+ new1 = MirrorTable.axisWorldPosition(srcObj, axis)
+ new2 = MirrorTable.axisWorldPosition(dstObj, axis)
+
+ mp = mirrorPlane
+ v1 = mp[0]*(new1[0]-old1[0]), mp[1]*(new1[1]-old1[1]), mp[2]*(new1[2]-old1[2])
+ v2 = new2[0]-old2[0], new2[1]-old2[1], new2[2]-old2[2]
+
+ d = sum(p*q for p, q in zip(v1, v2))
+
+ if d >= 0.0:
+ return False
+ return True
+
+ @staticmethod
+ def _calculateMirrorAxis(obj, mirrorPlane):
+ """
+ :type obj: str
+ :rtype: list[int]
+ """
+ result = [1, 1, 1]
+ transform0 = maya.cmds.createNode("transform", name="transform0")
+
+ try:
+ transform0, = maya.cmds.parent(transform0, obj, r=True)
+ transform0, = maya.cmds.parent(transform0, w=True)
+ maya.cmds.setAttr(transform0 + ".t", 0, 0, 0)
+
+ t1 = MirrorTable.axisWorldPosition(transform0, [1, 0, 0])
+ t2 = MirrorTable.axisWorldPosition(transform0, [0, 1, 0])
+ t3 = MirrorTable.axisWorldPosition(transform0, [0, 0, 1])
+
+ t1 = "%.3f" % t1[0], "%.3f" % t1[1], "%.3f" % t1[2]
+ t2 = "%.3f" % t2[0], "%.3f" % t2[1], "%.3f" % t2[2]
+ t3 = "%.3f" % t3[0], "%.3f" % t3[1], "%.3f" % t3[2]
+
+ if mirrorPlane == MirrorPlane.YZ: # [-1, 1, 1]:
+ x = [t1[0], t2[0], t3[0]]
+ i = MirrorTable.maxIndex(x)
+ result[i] = -1
+
+ if mirrorPlane == MirrorPlane.XZ: # [1, -1, 1]:
+ y = [t1[1], t2[1], t3[1]]
+ i = MirrorTable.maxIndex(y)
+ result[i] = -1
+
+ if mirrorPlane == MirrorPlane.XY: # [1, 1, -1]:
+ z = [t1[2], t2[2], t3[2]]
+ i = MirrorTable.maxIndex(z)
+ result[i] = -1
+
+ finally:
+ maya.cmds.delete(transform0)
+
+ return result
+
+ def select(self, objects=None, namespaces=None, **kwargs):
+ """
+ Select the objects contained in file.
+
+ :type objects: list[str] or None
+ :type namespaces: list[str] or None
+ :rtype: None
+ """
+ selectionSet = mutils.SelectionSet.fromPath(self.path())
+ selectionSet.load(objects=objects, namespaces=namespaces, **kwargs)
+
+ def leftSide(self):
+ """
+ :rtype: str | None
+ """
+ return self.metadata().get("left")
+
+ def rightSide(self):
+ """
+ :rtype: str | None
+ """
+ return self.metadata().get("right")
+
+ def mirrorPlane(self):
+ """
+ :rtype: lsit[int] | None
+ """
+ return self.metadata().get("mirrorPlane")
+
+ def mirrorAxis(self, name):
+ """
+ :rtype: list[int]
+ """
+ return self.objects()[name]["mirrorAxis"]
+
+ def leftCount(self, objects=None):
+ """
+ :type objects: list[str]
+ :rtype: int
+ """
+ if objects is None:
+ objects = self.objects()
+ return len([obj for obj in objects if self.isLeftSide(obj)])
+
+ def rightCount(self, objects=None):
+ """
+ :type objects: list[str]
+ :rtype: int
+ """
+ if objects is None:
+ objects = self.objects()
+ return len([obj for obj in objects if self.isRightSide(obj)])
+
+ def createObjectData(self, name):
+ """
+ :type name:
+ :rtype:
+ """
+ result = {"mirrorAxis": self.calculateMirrorAxis(name)}
+ return result
+
+ def matchObjects(
+ self,
+ objects=None,
+ namespaces=None,
+ ):
+ """
+ :type objects: list[str]
+ :type namespaces: list[str]
+ :rtype: list[str]
+ """
+ srcObjects = self.objects().keys()
+
+ matches = mutils.matchNames(
+ srcObjects=srcObjects,
+ dstObjects=objects,
+ dstNamespaces=namespaces,
+ )
+
+ for srcNode, dstNode in matches:
+ dstName = dstNode.name()
+ mirrorAxis = self.mirrorAxis(srcNode.name())
+ yield srcNode.name(), dstName, mirrorAxis
+
+ def rightToLeft(self):
+ """"""
+ self.load(option=MirrorOption.RightToLeft)
+
+ def leftToRight(self):
+ """"""
+ self.load(option=MirrorOption.LeftToRight)
+
+ @mutils.timing
+ @mutils.unifyUndo
+ @mutils.showWaitCursor
+ @mutils.restoreSelection
+ def load(
+ self,
+ objects=None,
+ namespaces=None,
+ option=None,
+ keysOption=None,
+ time=None,
+ ):
+ """
+ Load the mirror table for the given objects.
+
+ :type objects: list[str]
+ :type namespaces: list[str]
+ :type option: mirrorOptions
+ :type keysOption: None or KeysOption.SelectedRange
+ :type time: None or list[int]
+ """
+ if option and not isinstance(option, int):
+ if option.lower() == "swap":
+ option = 0
+ elif option.lower() == "left to right":
+ option = 1
+ elif option.lower() == "right to left":
+ option = 2
+ else:
+ raise ValueError('Invalid load option=' + str(option))
+
+ self.validate(namespaces=namespaces)
+
+ results = {}
+ animation = True
+ foundObject = False
+ srcObjects = self.objects().keys()
+
+ if option is None:
+ option = MirrorOption.Swap
+
+ if keysOption == KeysOption.All:
+ time = None
+ elif keysOption == KeysOption.SelectedRange:
+ time = mutils.selectedFrameRange()
+
+ # Check to make sure that the given time is not a single frame
+ if time and time[0] == time[1]:
+ time = None
+ animation = False
+
+ matches = mutils.matchNames(
+ srcObjects=srcObjects,
+ dstObjects=objects,
+ dstNamespaces=namespaces,
+ )
+
+ for srcNode, dstNode in matches:
+ dstObj = dstNode.name()
+ dstObj2 = self.mirrorObject(dstObj) or dstObj
+
+ if dstObj2 not in results:
+ results[dstObj] = dstObj2
+
+ mirrorAxis = self.mirrorAxis(srcNode.name())
+ dstObjExists = maya.cmds.objExists(dstObj)
+ dstObj2Exists = maya.cmds.objExists(dstObj2)
+
+ if dstObjExists and dstObj2Exists:
+ foundObject = True
+ if animation:
+ self.transferAnimation(dstObj, dstObj2, mirrorAxis=mirrorAxis, option=option, time=time)
+ else:
+ self.transferStatic(dstObj, dstObj2, mirrorAxis=mirrorAxis, option=option)
+ else:
+ if not dstObjExists:
+ msg = "Cannot find destination object {0}"
+ msg = msg.format(dstObj)
+ logger.debug(msg)
+
+ if not dstObj2Exists:
+ msg = "Cannot find mirrored destination object {0}"
+ msg = msg.format(dstObj2)
+ logger.debug(msg)
+
+ # Return the focus to the Maya window
+ maya.cmds.setFocus("MayaWindow")
+
+ if not foundObject:
+
+ text = "No objects match when loading data. " \
+ "Turn on debug mode to see more details."
+
+ raise mutils.NoMatchFoundError(text)
+
+ def transferStatic(self, srcObj, dstObj, mirrorAxis=None, attrs=None, option=MirrorOption.Swap):
+ """
+ :type srcObj: str
+ :type dstObj: str
+ :type mirrorAxis: list[int]
+ :type attrs: None | list[str]
+ :type option: MirrorOption
+ """
+ srcValue = None
+ dstValue = None
+ srcValid = self.isValidMirror(srcObj, option)
+ dstValid = self.isValidMirror(dstObj, option)
+
+ if attrs is None:
+ attrs = maya.cmds.listAttr(srcObj, keyable=True) or []
+
+ for attr in attrs:
+ dstAttr = dstObj + "." + attr
+ srcAttr = srcObj + "." + attr
+ if maya.cmds.objExists(dstAttr):
+ if dstValid:
+ srcValue = maya.cmds.getAttr(srcAttr)
+
+ if srcValid:
+ dstValue = maya.cmds.getAttr(dstAttr)
+
+ if dstValid:
+ self.setAttr(dstObj, attr, srcValue, mirrorAxis=mirrorAxis)
+
+ if srcValid:
+ self.setAttr(srcObj, attr, dstValue, mirrorAxis=mirrorAxis)
+ else:
+ logger.debug("Cannot find destination attribute %s" % dstAttr)
+
+ def setAttr(self, name, attr, value, mirrorAxis=None):
+ """
+ :type name: str
+ :type: attr: str
+ :type: value: int | float
+ :type mirrorAxis: Axis or None
+ """
+ if mirrorAxis is not None:
+ value = self.formatValue(attr, value, mirrorAxis)
+ try:
+ maya.cmds.setAttr(name + "." + attr, value)
+ except RuntimeError:
+ msg = "Cannot mirror static attribute {name}.{attr}"
+ msg = msg.format(name=name, attr=attr)
+ logger.debug(msg)
+
+ def transferAnimation(self, srcObj, dstObj, mirrorAxis=None, option=MirrorOption.Swap, time=None):
+ """
+ :type srcObj: str
+ :type dstObj: str
+ :type mirrorAxis: Axis or None
+ """
+ srcValid = self.isValidMirror(srcObj, option)
+ dstValid = self.isValidMirror(dstObj, option)
+
+ tmpObj, = maya.cmds.duplicate(srcObj, name='DELETE_ME', parentOnly=True)
+ try:
+ if dstValid:
+ self._transferAnimation(srcObj, tmpObj, time=time)
+ if srcValid:
+ self._transferAnimation(dstObj, srcObj, mirrorAxis=mirrorAxis, time=time)
+ if dstValid:
+ self._transferAnimation(tmpObj, dstObj, mirrorAxis=mirrorAxis, time=time)
+ finally:
+ maya.cmds.delete(tmpObj)
+
+ def _transferAnimation(self, srcObj, dstObj, attrs=None, mirrorAxis=None, time=None):
+ """
+ :type srcObj: str
+ :type dstObj: str
+ :type attrs: list[str]
+ :type time: list[int]
+ :type mirrorAxis: list[int]
+ """
+ maya.cmds.cutKey(dstObj, time=time or ()) # remove keys
+ if maya.cmds.copyKey(srcObj, time=time or ()):
+ if not time:
+ maya.cmds.pasteKey(dstObj, option="replaceCompletely")
+ else:
+ maya.cmds.pasteKey(dstObj, time=time, option="replace")
+
+ if attrs is None:
+ attrs = maya.cmds.listAttr(srcObj, keyable=True) or []
+
+ for attr in attrs:
+ srcAttribute = mutils.Attribute(srcObj, attr)
+ dstAttribute = mutils.Attribute(dstObj, attr)
+
+ if dstAttribute.exists():
+ if dstAttribute.isConnected():
+ if self.isAttrMirrored(attr, mirrorAxis):
+ maya.cmds.scaleKey(dstAttribute.name(), valueScale=-1, attribute=attr)
+ else:
+ value = srcAttribute.value()
+ self.setAttr(dstObj, attr, value, mirrorAxis)
+
+ def isValidMirror(self, obj, option):
+ """
+ :type obj: str
+ :type option: MirrorOption
+ :rtype: bool
+ """
+ if option == MirrorOption.Swap:
+ return True
+
+ elif option == MirrorOption.LeftToRight and self.isLeftSide(obj):
+ return False
+
+ elif option == MirrorOption.RightToLeft and self.isRightSide(obj):
+ return False
+
+ else:
+ return True
+
+ def isLeftSide(self, name):
+ """
+ Return True if the object contains the left side string.
+
+ # Group|Character1:footRollExtra_L|Character1:footRoll_L
+ # Group|footRollExtra_L|footRoll_LShape
+ # footRoll_L
+ # footRoll_LShape
+
+ :type name: str
+ :rtype: bool
+ """
+ side = self.leftSide()
+ return self.matchSide(name, side)
+
+ def isRightSide(self, name):
+ """
+ Return True if the object contains the right side string.
+
+ # Group|Character1:footRollExtra_R|Character1:footRoll_R
+ # Group|footRollExtra_R|footRoll_RShape
+ # footRoll_R
+ # footRoll_RShape
+
+ :type name: str
+ :rtype: bool
+ """
+ side = self.rightSide()
+ return self.matchSide(name, side)
+
+ def calculateMirrorAxis(self, srcObj):
+ """
+ :type srcObj: str
+ :rtype: list[int]
+ """
+ result = [1, 1, 1]
+ dstObj = self.mirrorObject(srcObj) or srcObj
+ mirrorPlane = self.mirrorPlane()
+
+ if dstObj == srcObj or not maya.cmds.objExists(dstObj):
+ # The source object does not have an opposite side
+ result = MirrorTable._calculateMirrorAxis(srcObj, mirrorPlane)
+ else:
+ # The source object does have an opposite side
+ if MirrorTable.isAxisMirrored(srcObj, dstObj, [1, 0, 0], mirrorPlane):
+ result[0] = -1
+
+ if MirrorTable.isAxisMirrored(srcObj, dstObj, [0, 1, 0], mirrorPlane):
+ result[1] = -1
+
+ if MirrorTable.isAxisMirrored(srcObj, dstObj, [0, 0, 1], mirrorPlane):
+ result[2] = -1
+
+ return result
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/namespace.py b/2023/scripts/animation_tools/studiolibrary/mutils/namespace.py
new file mode 100644
index 0000000..1311a7e
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/namespace.py
@@ -0,0 +1,88 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+import logging
+import traceback
+from collections import OrderedDict
+
+try:
+ import maya.cmds
+except ImportError:
+ traceback.print_exc()
+
+
+logger = logging.getLogger(__name__)
+
+
+__all__ = [
+ "getAll",
+ "getFromDagPath",
+ "getFromDagPaths",
+ "getFromSelection",
+]
+
+
+def getFromDagPaths(dagPaths):
+ """
+ :type dagPaths: list[str]
+ :rtype: list[str]
+ """
+ namespaces = []
+
+ for dagPath in dagPaths:
+ namespace = getFromDagPath(dagPath)
+ namespaces.append(namespace)
+
+ # Remove any duplicates while retaining the order
+ return list(OrderedDict.fromkeys(namespaces))
+
+
+def getFromDagPath(dagPath):
+ """
+ :type dagPath: str
+ :rtype: str
+ """
+ shortName = dagPath.split("|")[-1]
+ namespace = ":".join(shortName.split(":")[:-1])
+ return namespace
+
+
+def getFromSelection():
+ """
+ Get the current namespaces from the selected objects in Maya.
+
+ :rtype: list[str]
+ """
+ namespaces = [""]
+
+ try:
+ names = maya.cmds.ls(selection=True)
+ namespaces = getFromDagPaths(names) or namespaces
+ except NameError as error:
+ # Catch any errors when running this command outside of Maya
+ logger.exception(error)
+
+ return namespaces
+
+
+def getAll():
+ """
+ Get all the available namespaces in the scene
+
+ :rtype: list[str]
+ """
+ IGNORE_NAMESPACES = ['UI', 'shared']
+
+ namespaces = maya.cmds.namespaceInfo(listOnlyNamespaces=True, recurse=True)
+ namespaces = list(set(namespaces) - set(IGNORE_NAMESPACES))
+ namespaces = sorted(namespaces)
+
+ return namespaces
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/node.py b/2023/scripts/animation_tools/studiolibrary/mutils/node.py
new file mode 100644
index 0000000..00854c6
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/node.py
@@ -0,0 +1,178 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import mutils
+
+from studiovendor import six
+
+try:
+ import maya.cmds
+except Exception:
+ import traceback
+ traceback.print_exc()
+
+
+class Node(object):
+
+ @classmethod
+ def ls(cls, objects=None, selection=False):
+ """
+ nodes = Node.ls(selection=True)
+ :rtype: list[Node]
+ """
+
+ if objects is None and not selection:
+ objects = maya.cmds.ls()
+ else:
+ objects = objects or []
+ if selection:
+ objects.extend(maya.cmds.ls(selection=True) or [])
+
+ return [cls(name) for name in objects]
+
+ def __init__(self, name, attributes=None):
+ """
+ :type attributes: [Attribute]
+ :type name: str
+ """
+ try:
+ self._name = six.text_type(name) # .encode('ascii')
+ except UnicodeEncodeError:
+ raise UnicodeEncodeError('Not a valid ascii name "%s".' % name)
+
+ # Cached properties
+ self._shortname = None
+ self._namespace = None
+ self._mirrorAxis = None
+ self._attributes = attributes
+
+ def __str__(self):
+ return self.name()
+
+ def name(self):
+ """
+ :rtype: str
+ """
+ return self._name
+
+ def attributes(self):
+ """
+ :rtype: str
+ """
+ return self._attributes
+
+ def shortname(self):
+ """
+ :rtype: str
+ """
+ if self._shortname is None:
+ self._shortname = self.name().split("|")[-1]
+ return self._shortname
+
+ def toShortName(self):
+ """
+ :rtype: None or str
+ """
+ # Try to reduce any long names to short names when using namespaces
+ names = maya.cmds.ls(self.shortname())
+ if len(names) == 1:
+ return Node(names[0])
+ elif len(names) > 1:
+ # Return the original name if the short name is not unique
+ return Node(self.name())
+ else:
+ raise mutils.NoObjectFoundError("No object found %s" % str(self.shortname()))
+
+ def namespace(self):
+ """
+ :rtype: str
+ """
+ if self._namespace is None:
+ self._namespace = ":".join(self.shortname().split(":")[:-1])
+ return self._namespace
+
+ def stripFirstPipe(self):
+ """
+ n = Node("|pSphere")
+ n.stripFirstPipe()
+ print(n.name())
+ # Result: pSphere
+ """
+ if self.name().startswith("|"):
+ self._name = self.name()[1:]
+
+ def exists(self):
+ """
+ :rtype: bool
+ """
+ return maya.cmds.objExists(self.name())
+
+ def isLong(self):
+ """
+ :rtype: bool
+ """
+ return "|" in self.name()
+
+ def isReferenced(self):
+ """
+ :rtype: bool
+ """
+ return maya.cmds.referenceQuery(self.name(), isNodeReferenced=True)
+
+ def setMirrorAxis(self, mirrorAxis):
+ """
+ :type mirrorAxis: list[int]
+ """
+ self._mirrorAxis = mirrorAxis
+
+ def setNamespace(self, namespace):
+ """
+ Sets the namespace for a current node in Maya.
+
+ node.setNamespace("character", "|group|control")
+ result: |character:group|character:control
+
+ setNamespace("", "|character:group|character:control")
+ result: |group|control
+
+ :type namespace: str
+ """
+ newName = self.name()
+ oldName = self.name()
+
+ newNamespace = namespace
+ oldNamespace = self.namespace()
+
+ # Ignore any further processing if the namespace is the same.
+ if newNamespace == oldNamespace:
+ return self.name()
+
+ # Replace the current namespace with the specified one
+ if oldNamespace and newNamespace:
+ newName = oldName.replace(oldNamespace + ":", newNamespace + ":")
+
+ # Remove existing namespace
+ elif oldNamespace and not newNamespace:
+ newName = oldName.replace(oldNamespace + ":", "")
+
+ # Set namespace if the current namespace doesn't exists
+ elif not oldNamespace and newNamespace:
+ newName = oldName.replace("|", "|" + newNamespace + ":")
+ if newNamespace and not newName.startswith("|"):
+ newName = newNamespace + ":" + newName
+
+ self._name = newName
+
+ self._shortname = None
+ self._namespace = None
+
+ return self.name()
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/playblast.py b/2023/scripts/animation_tools/studiolibrary/mutils/playblast.py
new file mode 100644
index 0000000..bd6065d
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/playblast.py
@@ -0,0 +1,107 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import os
+import logging
+
+import mutils
+
+try:
+ import maya.cmds
+except Exception:
+ import traceback
+ traceback.print_exc()
+
+
+__all__ = [
+ "playblast",
+]
+
+logger = logging.getLogger(__name__)
+
+
+# Valid Renderers:
+# [u'vp2Renderer', u'base_OpenGL_Renderer',
+# u'hwRender_OpenGL_Renderer', u'stub_Renderer']
+DEFAULT_PLAYBLAST_RENDERER = None
+
+
+class PlayblastError(Exception):
+ """Base class for exceptions in this module."""
+ pass
+
+
+def playblast(filename, modelPanel, startFrame, endFrame, width, height, step=1):
+ """
+ Wrapper for Maya's Playblast command.
+
+ :type filename: str
+ :type modelPanel: str
+ :type startFrame: int
+ :type endFrame: int
+ :type width: int
+ :type height: int
+ :type step: list[int]
+ :rtype: str
+ """
+ logger.info(u"Playblasting '{filename}'".format(filename=filename))
+
+ if startFrame == endFrame and os.path.exists(filename):
+ os.remove(filename)
+
+ frame = [i for i in range(startFrame, endFrame + 1, step)]
+
+ modelPanel = modelPanel or mutils.currentModelPanel()
+ if maya.cmds.modelPanel(modelPanel, query=True, exists=True):
+ maya.cmds.setFocus(modelPanel)
+ if DEFAULT_PLAYBLAST_RENDERER:
+ maya.cmds.modelEditor(
+ modelPanel,
+ edit=True,
+ rendererName=DEFAULT_PLAYBLAST_RENDERER
+ )
+
+ name, compression = os.path.splitext(filename)
+ filename = filename.replace(compression, "")
+ compression = compression.replace(".", "")
+ offScreen = mutils.isLinux()
+
+ path = maya.cmds.playblast(
+ format="image",
+ viewer=False,
+ percent=100,
+ quality=100,
+ frame=frame,
+ width=width,
+ height=height,
+ filename=filename,
+ endTime=endFrame,
+ startTime=startFrame,
+ offScreen=offScreen,
+ forceOverwrite=True,
+ showOrnaments=False,
+ compression=compression,
+ )
+
+ if not path:
+ raise PlayblastError("Playblast was canceled")
+
+ src = path.replace("####", str(int(0)).rjust(4, "0"))
+
+ if startFrame == endFrame:
+ dst = src.replace(".0000.", ".")
+ logger.info("Renaming '%s' => '%s" % (src, dst))
+ os.rename(src, dst)
+ src = dst
+
+ logger.info(u"Playblasted '%s'" % src)
+ return src
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/pose.py b/2023/scripts/animation_tools/studiolibrary/mutils/pose.py
new file mode 100644
index 0000000..aea6601
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/pose.py
@@ -0,0 +1,591 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+"""
+#
+# pose.py
+import mutils
+
+# Example 1:
+# Save and load a pose from the selected objects
+objects = maya.cmds.ls(selection=True)
+mutils.savePose("/tmp/pose.json", objects)
+
+mutils.loadPose("/tmp/pose.json")
+
+# Example 2:
+# Create a pose object from a list of object names
+pose = mutils.Pose.fromObjects(objects)
+
+# Example 3:
+# Create a pose object from the selected objects
+objects = maya.cmds.ls(selection=True)
+pose = mutils.Pose.fromObjects(objects)
+
+# Example 4:
+# Save the pose object to disc
+path = "/tmp/pose.json"
+pose.save(path)
+
+# Example 5:
+# Create a pose object from disc
+path = "/tmp/pose.json"
+pose = mutils.Pose.fromPath(path)
+
+# Load the pose on to the objects from file
+pose.load()
+
+# Load the pose to the selected objects
+objects = maya.cmds.ls(selection=True)
+pose.load(objects=objects)
+
+# Load the pose to the specified namespaces
+pose.load(namespaces=["character1", "character2"])
+
+# Load the pose to the specified objects
+pose.load(objects=["Character1:Hand_L", "Character1:Finger_L"])
+
+"""
+import logging
+
+import mutils
+
+try:
+ import maya.cmds
+except ImportError:
+ import traceback
+ traceback.print_exc()
+
+
+__all__ = ["Pose", "savePose", "loadPose"]
+
+logger = logging.getLogger(__name__)
+
+_pose_ = None
+
+
+def savePose(path, objects, metadata=None):
+ """
+ Convenience function for saving a pose to disc for the given objects.
+
+ Example:
+ path = "C:/example.pose"
+ pose = savePose(path, metadata={'description': 'Example pose'})
+ print(pose.metadata())
+ # {
+ 'user': 'Hovel',
+ 'mayaVersion': '2016',
+ 'description': 'Example pose'
+ }
+
+ :type path: str
+ :type objects: list[str]
+ :type metadata: dict or None
+ :rtype: Pose
+ """
+ pose = mutils.Pose.fromObjects(objects)
+
+ if metadata:
+ pose.updateMetadata(metadata)
+
+ pose.save(path)
+
+ return pose
+
+
+def loadPose(path, *args, **kwargs):
+ """
+ Convenience function for loading the given pose path.
+
+ :type path: str
+ :type args: list
+ :type kwargs: dict
+ :rtype: Pose
+ """
+ global _pose_
+
+ clearCache = kwargs.get("clearCache")
+
+ if not _pose_ or _pose_.path() != path or clearCache:
+ _pose_ = Pose.fromPath(path)
+
+ _pose_.load(*args, **kwargs)
+
+ return _pose_
+
+
+class Pose(mutils.TransferObject):
+
+ def __init__(self):
+ mutils.TransferObject.__init__(self)
+
+ self._cache = None
+ self._mtime = None
+ self._cacheKey = None
+ self._isLoading = False
+ self._selection = None
+ self._mirrorTable = None
+ self._autoKeyFrame = None
+
+ def createObjectData(self, name):
+ """
+ Create the object data for the given object name.
+
+ :type name: str
+ :rtype: dict
+ """
+ attrs = maya.cmds.listAttr(name, unlocked=True, keyable=True) or []
+ attrs = list(set(attrs))
+ attrs = [mutils.Attribute(name, attr) for attr in attrs]
+
+ data = {"attrs": self.attrs(name)}
+
+ for attr in attrs:
+ if attr.isValid():
+ if attr.value() is None:
+ msg = "Cannot save the attribute %s with value None."
+ logger.warning(msg, attr.fullname())
+ else:
+ data["attrs"][attr.attr()] = {
+ "type": attr.type(),
+ "value": attr.value()
+ }
+
+ return data
+
+ def select(self, objects=None, namespaces=None, **kwargs):
+ """
+ Select the objects contained in the pose file.
+
+ :type objects: list[str] or None
+ :type namespaces: list[str] or None
+ :rtype: None
+ """
+ selectionSet = mutils.SelectionSet.fromPath(self.path())
+ selectionSet.load(objects=objects, namespaces=namespaces, **kwargs)
+
+ def cache(self):
+ """
+ Return the current cached attributes for the pose.
+
+ :rtype: list[(Attribute, Attribute)]
+ """
+ return self._cache
+
+ def attrs(self, name):
+ """
+ Return the attribute for the given name.
+
+ :type name: str
+ :rtype: dict
+ """
+ return self.object(name).get("attrs", {})
+
+ def attr(self, name, attr):
+ """
+ Return the attribute data for the given name and attribute.
+
+ :type name: str
+ :type attr: str
+ :rtype: dict
+ """
+ return self.attrs(name).get(attr, {})
+
+ def attrType(self, name, attr):
+ """
+ Return the attribute type for the given name and attribute.
+
+ :type name: str
+ :type attr: str
+ :rtype: str
+ """
+ return self.attr(name, attr).get("type", None)
+
+ def attrValue(self, name, attr):
+ """
+ Return the attribute value for the given name and attribute.
+
+ :type name: str
+ :type attr: str
+ :rtype: str | int | float
+ """
+ return self.attr(name, attr).get("value", None)
+
+ def setMirrorAxis(self, name, mirrorAxis):
+ """
+ Set the mirror axis for the given name.
+
+ :type name: str
+ :type mirrorAxis: list[int]
+ """
+ if name in self.objects():
+ self.object(name).setdefault("mirrorAxis", mirrorAxis)
+ else:
+ msg = "Object does not exist in pose. " \
+ "Cannot set mirror axis for %s"
+
+ logger.debug(msg, name)
+
+ def mirrorAxis(self, name):
+ """
+ Return the mirror axis for the given name.
+
+ :rtype: list[int] | None
+ """
+ result = None
+ if name in self.objects():
+ result = self.object(name).get("mirrorAxis", None)
+
+ if result is None:
+ logger.debug("Cannot find mirror axis in pose for %s", name)
+
+ return result
+
+ def updateMirrorAxis(self, name, mirrorAxis):
+ """
+ Update the mirror axis for the given object name.
+
+ :type name: str
+ :type mirrorAxis: list[int]
+ """
+ self.setMirrorAxis(name, mirrorAxis)
+
+ def mirrorTable(self):
+ """
+ Return the Mirror Table for the pose.
+
+ :rtype: mutils.MirrorTable
+ """
+ return self._mirrorTable
+
+ def setMirrorTable(self, mirrorTable):
+ """
+ Set the Mirror Table for the pose.
+
+ :type mirrorTable: mutils.MirrorTable
+ """
+ objects = self.objects().keys()
+ self._mirrorTable = mirrorTable
+
+ for srcName, dstName, mirrorAxis in mirrorTable.matchObjects(objects):
+ self.updateMirrorAxis(dstName, mirrorAxis)
+
+ def mirrorValue(self, name, attr, mirrorAxis):
+ """
+ Return the mirror value for the given name, attribute and mirror axis.
+
+ :type name: str
+ :type attr: str
+ :type mirrorAxis: list[]
+ :rtype: None | int | float
+ """
+ value = None
+
+ if self.mirrorTable() and name:
+
+ value = self.attrValue(name, attr)
+
+ if value is not None:
+ value = self.mirrorTable().formatValue(attr, value, mirrorAxis)
+ else:
+ logger.debug("Cannot find mirror value for %s.%s", name, attr)
+
+ return value
+
+ def beforeLoad(self, clearSelection=True):
+ """
+ Called before loading the pose.
+
+ :type clearSelection: bool
+ """
+ logger.debug('Before Load "%s"', self.path())
+
+ if not self._isLoading:
+
+ maya.cmds.refresh(cv=True)
+
+ self._isLoading = True
+ maya.cmds.undoInfo(openChunk=True)
+
+ self._selection = maya.cmds.ls(selection=True) or []
+ self._autoKeyFrame = maya.cmds.autoKeyframe(query=True, state=True)
+
+ maya.cmds.autoKeyframe(edit=True, state=False)
+ maya.cmds.select(clear=clearSelection)
+
+ def afterLoad(self):
+ """Called after loading the pose."""
+ if not self._isLoading:
+ return
+
+ logger.debug("After Load '%s'", self.path())
+
+ self._isLoading = False
+ if self._selection:
+ maya.cmds.select(self._selection)
+ self._selection = None
+
+ maya.cmds.autoKeyframe(edit=True, state=self._autoKeyFrame)
+ maya.cmds.undoInfo(closeChunk=True)
+
+ logger.debug('Loaded "%s"', self.path())
+
+ @mutils.timing
+ def load(
+ self,
+ objects=None,
+ namespaces=None,
+ attrs=None,
+ blend=100,
+ key=False,
+ mirror=False,
+ additive=False,
+ refresh=False,
+ batchMode=False,
+ clearCache=False,
+ mirrorTable=None,
+ onlyConnected=False,
+ clearSelection=False,
+ ignoreConnected=False,
+ searchAndReplace=None,
+ ):
+ """
+ Load the pose to the given objects or namespaces.
+
+ :type objects: list[str]
+ :type namespaces: list[str]
+ :type attrs: list[str]
+ :type blend: float
+ :type key: bool
+ :type refresh: bool
+ :type mirror: bool
+ :type additive: bool
+ :type mirrorTable: mutils.MirrorTable
+ :type batchMode: bool
+ :type clearCache: bool
+ :type ignoreConnected: bool
+ :type onlyConnected: bool
+ :type clearSelection: bool
+ :type searchAndReplace: (str, str) or None
+ """
+ if mirror and not mirrorTable:
+ logger.warning("Cannot mirror pose without a mirror table!")
+ mirror = False
+
+ if batchMode:
+ key = False
+
+ self.updateCache(
+ objects=objects,
+ namespaces=namespaces,
+ attrs=attrs,
+ batchMode=batchMode,
+ clearCache=clearCache,
+ mirrorTable=mirrorTable,
+ onlyConnected=onlyConnected,
+ ignoreConnected=ignoreConnected,
+ searchAndReplace=searchAndReplace,
+ )
+
+ self.beforeLoad(clearSelection=clearSelection)
+
+ try:
+ self.loadCache(blend=blend, key=key, mirror=mirror,
+ additive=additive)
+ finally:
+ if not batchMode:
+ self.afterLoad()
+
+ # Return the focus to the Maya window
+ maya.cmds.setFocus("MayaWindow")
+ maya.cmds.refresh(cv=True)
+
+ def updateCache(
+ self,
+ objects=None,
+ namespaces=None,
+ attrs=None,
+ ignoreConnected=False,
+ onlyConnected=False,
+ mirrorTable=None,
+ batchMode=False,
+ clearCache=True,
+ searchAndReplace=None,
+ ):
+ """
+ Update the pose cache.
+
+ :type objects: list[str] or None
+ :type namespaces: list[str] or None
+ :type attrs: list[str] or None
+ :type ignoreConnected: bool
+ :type onlyConnected: bool
+ :type clearCache: bool
+ :type batchMode: bool
+ :type mirrorTable: mutils.MirrorTable
+ :type searchAndReplace: (str, str) or None
+ """
+ if clearCache or not batchMode or not self._mtime:
+ self._mtime = self.mtime()
+
+ mtime = self._mtime
+
+ cacheKey = \
+ str(mtime) + \
+ str(objects) + \
+ str(attrs) + \
+ str(namespaces) + \
+ str(ignoreConnected) + \
+ str(searchAndReplace) + \
+ str(maya.cmds.currentTime(query=True))
+
+ if self._cacheKey != cacheKey or clearCache:
+
+ self.validate(namespaces=namespaces)
+
+ self._cache = []
+ self._cacheKey = cacheKey
+
+ dstObjects = objects
+ srcObjects = self.objects()
+ usingNamespaces = not objects and namespaces
+
+ if mirrorTable:
+ self.setMirrorTable(mirrorTable)
+
+ search = None
+ replace = None
+ if searchAndReplace:
+ search = searchAndReplace[0]
+ replace = searchAndReplace[1]
+
+ matches = mutils.matchNames(
+ srcObjects,
+ dstObjects=dstObjects,
+ dstNamespaces=namespaces,
+ search=search,
+ replace=replace,
+ )
+
+ for srcNode, dstNode in matches:
+ self.cacheNode(
+ srcNode,
+ dstNode,
+ attrs=attrs,
+ onlyConnected=onlyConnected,
+ ignoreConnected=ignoreConnected,
+ usingNamespaces=usingNamespaces,
+ )
+
+ if not self.cache():
+ text = "No objects match when loading data. " \
+ "Turn on debug mode to see more details."
+
+ raise mutils.NoMatchFoundError(text)
+
+ def cacheNode(
+ self,
+ srcNode,
+ dstNode,
+ attrs=None,
+ ignoreConnected=None,
+ onlyConnected=None,
+ usingNamespaces=None
+ ):
+ """
+ Cache the given pair of nodes.
+
+ :type srcNode: mutils.Node
+ :type dstNode: mutils.Node
+ :type attrs: list[str] or None
+ :type ignoreConnected: bool or None
+ :type onlyConnected: bool or None
+ :type usingNamespaces: none or list[str]
+ """
+ mirrorAxis = None
+ mirrorObject = None
+
+ # Remove the first pipe in-case the object has a parent
+ dstNode.stripFirstPipe()
+
+ srcName = srcNode.name()
+
+ if self.mirrorTable():
+ mirrorObject = self.mirrorTable().mirrorObject(srcName)
+
+ if not mirrorObject:
+ mirrorObject = srcName
+ msg = "Cannot find mirror object in pose for %s"
+ logger.debug(msg, srcName)
+
+ # Check if a mirror axis exists for the mirrorObject otherwise
+ # check the srcNode
+ mirrorAxis = self.mirrorAxis(mirrorObject) or self.mirrorAxis(srcName)
+
+ if mirrorObject and not maya.cmds.objExists(mirrorObject):
+ msg = "Mirror object does not exist in the scene %s"
+ logger.debug(msg, mirrorObject)
+
+ if usingNamespaces:
+ # Try and use the short name.
+ # Much faster than the long name when setting attributes.
+ try:
+ dstNode = dstNode.toShortName()
+ except mutils.NoObjectFoundError as msg:
+ logger.debug(msg)
+ return
+ except mutils.MoreThanOneObjectFoundError as msg:
+ logger.debug(msg)
+
+ for attr in self.attrs(srcName):
+
+ if attrs and attr not in attrs:
+ continue
+
+ dstAttribute = mutils.Attribute(dstNode.name(), attr)
+ isConnected = dstAttribute.isConnected()
+
+ if (ignoreConnected and isConnected) or (onlyConnected and not isConnected):
+ continue
+
+ type_ = self.attrType(srcName, attr)
+ value = self.attrValue(srcName, attr)
+ srcMirrorValue = self.mirrorValue(mirrorObject, attr, mirrorAxis=mirrorAxis)
+
+ srcAttribute = mutils.Attribute(dstNode.name(), attr, value=value, type=type_)
+ dstAttribute.update()
+
+ self._cache.append((srcAttribute, dstAttribute, srcMirrorValue))
+
+ def loadCache(self, blend=100, key=False, mirror=False, additive=False):
+ """
+ Load the pose from the current cache.
+
+ :type blend: float
+ :type key: bool
+ :type mirror: bool
+ :rtype: None
+ """
+ cache = self.cache()
+
+ for i in range(0, len(cache)):
+ srcAttribute, dstAttribute, srcMirrorValue = cache[i]
+ if srcAttribute and dstAttribute:
+ if mirror and srcMirrorValue is not None:
+ value = srcMirrorValue
+ else:
+ value = srcAttribute.value()
+ try:
+ dstAttribute.set(value, blend=blend, key=key,
+ additive=additive)
+ except (ValueError, RuntimeError):
+ cache[i] = (None, None)
+ logger.debug('Ignoring %s', dstAttribute.fullname())
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/scriptjob.py b/2023/scripts/animation_tools/studiolibrary/mutils/scriptjob.py
new file mode 100644
index 0000000..c0b7e11
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/scriptjob.py
@@ -0,0 +1,38 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import traceback
+
+try:
+ import maya.cmds
+except ImportError:
+ traceback.print_exc()
+
+
+class ScriptJob(object):
+ """
+ self._scriptJob = mutils.ScriptJob(e=['SelectionChanged', self.selectionChanged])
+ """
+ def __init__(self, *args, **kwargs):
+ self.id = maya.cmds.scriptJob(*args, **kwargs)
+
+ def kill(self):
+ if self.id:
+ maya.cmds.scriptJob(kill=self.id, force=True)
+ self.id = None
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, t, v, tb):
+ if t is not None:
+ self.kill()
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/selectionset.py b/2023/scripts/animation_tools/studiolibrary/mutils/selectionset.py
new file mode 100644
index 0000000..f9cea0d
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/selectionset.py
@@ -0,0 +1,111 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import logging
+
+import mutils
+
+try:
+ import maya.cmds
+except Exception:
+ import traceback
+ traceback.print_exc()
+
+
+logger = logging.getLogger(__name__)
+
+
+def saveSelectionSet(path, objects, metadata=None):
+ """
+ Convenience function for saving a selection set to the given disc location.
+
+ :type path: str
+ :type objects: list[str]
+ :type metadata: dict or None
+ :type args: list
+ :type kwargs: dict
+ :rtype: SelectionSet
+ """
+ selectionSet = SelectionSet.fromObjects(objects)
+
+ if metadata:
+ selectionSet.updateMetadata(metadata)
+
+ selectionSet.save(path)
+
+ return selectionSet
+
+
+class SelectionSet(mutils.TransferObject):
+
+ def load(self, objects=None, namespaces=None, **kwargs):
+ """
+ Load/Select the transfer objects to the given objects or namespaces.
+
+ :type objects: list[str] or None
+ :type namespaces: list[str] or None
+ :type kwargs:
+ """
+ validNodes = []
+ dstObjects = objects
+ srcObjects = self.objects()
+
+ self.validate(namespaces=namespaces)
+
+ matches = mutils.matchNames(
+ srcObjects,
+ dstObjects=dstObjects,
+ dstNamespaces=namespaces
+ )
+
+ for srcNode, dstNode in matches:
+ # Support for wild cards eg: ['*_control'].
+ if "*" in dstNode.name():
+ validNodes.append(dstNode.name())
+ else:
+ # Remove the first pipe in-case the object has a parent.
+ dstNode.stripFirstPipe()
+
+ # Try to get the short name. Much faster than the long
+ # name when selecting objects.
+ try:
+ dstNode = dstNode.toShortName()
+
+ except mutils.NoObjectFoundError as error:
+ logger.debug(error)
+ continue
+
+ except mutils.MoreThanOneObjectFoundError as error:
+ logger.debug(error)
+
+ validNodes.append(dstNode.name())
+
+ if validNodes:
+ maya.cmds.select(validNodes, **kwargs)
+
+ # Return the focus to the Maya window
+ maya.cmds.setFocus("MayaWindow")
+ else:
+ text = "No objects match when loading data. " \
+ "Turn on debug mode to see more details."
+
+ raise mutils.NoMatchFoundError(text)
+
+ def select(self, objects=None, namespaces=None, **kwargs):
+ """
+ Convenience method for any classes inheriting SelectionSet.
+
+ :type objects: str
+ :type namespaces: list[str]
+ :rtype: None
+ """
+ SelectionSet.load(self, objects=objects, namespaces=namespaces, **kwargs)
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/__init__.py b/2023/scripts/animation_tools/studiolibrary/mutils/tests/__init__.py
new file mode 100644
index 0000000..ef3f5f7
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/__init__.py
@@ -0,0 +1,40 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from mutils.tests.run import run
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/anim.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/anim.ma
new file mode 100644
index 0000000..75740bf
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/anim.ma
@@ -0,0 +1,84 @@
+//Maya ASCII 2013 scene
+//Name: anim.ma
+//Last modified: Wed, Aug 20, 2014 07:33:27 PM
+//Codeset: UTF-8
+requires maya "2013";
+requires "stereoCamera" "10.0";
+currentUnit -l centimeter -a degree -t film;
+fileInfo "application" "maya";
+fileInfo "product" "Maya batch mode";
+fileInfo "version" "2013 Service Pack 2P12 x64";
+fileInfo "cutIdentifier" "201304120319-868747";
+fileInfo "osv" "Linux 3.5.4-2.10-desktop #1 SMP PREEMPT Fri Oct 5 14:56:49 CEST 2012 x86_64";
+createNode animCurveTA -n "CURVE1";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841;
+createNode animCurveTU -n "CURVE2";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTL -n "CURVE3";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 0;
+createNode animCurveTL -n "CURVE4";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 8 10 8;
+createNode animCurveTL -n "CURVE5";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292;
+createNode animCurveTU -n "CURVE6";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666;
+createNode animCurveTU -n "CURVE7";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 10;
+createNode animCurveTU -n "CURVE8";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792;
+createNode animCurveTU -n "CURVE9";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTU -n "CURVE10";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2;
+createNode animCurveTU -n "CURVE11";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4;
+createNode animCurveTA -n "CURVE12";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096;
+createNode animCurveTU -n "CURVE13";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6;
+createNode animCurveTU -n "CURVE14";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585;
+createNode animCurveTU -n "CURVE15";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 5 10 5;
+createNode animCurveTU -n "CURVE16";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTL -n "CURVE18";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 15;
+// End
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/animation.anim b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/animation.anim
new file mode 100644
index 0000000..b084484
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/animation.anim differ
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/pose.json b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/pose.json
new file mode 100644
index 0000000..81dad16
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/pose.json
@@ -0,0 +1,166 @@
+{
+ "metadata": {
+ "angularUnit": "deg",
+ "description": "test shot",
+ "user": "testuser",
+ "startTime": 1,
+ "mayaSceneFile": "/norman/work/krathjen/git/sandbox/site-packages/mutils/tests/data/test_anim.ma",
+ "timeUnit": "film",
+ "cTime": 646464451,
+ "mayaVersion": "2013 Service Pack 2P12 x64",
+ "linearUnit": "cm",
+ "version": "1.0.0",
+ "endTime": 48
+ }
+,
+ "objects": {
+ "srcSphere:offset": {
+ "attrs": {}
+ },
+ "srcSphere:sphere": {
+ "attrs": {
+ "rotateX": {
+ "curve": "CURVE1",
+ "type": "doubleAngle",
+ "value": 45.0
+ },
+ "testEnum": {
+ "curve": "CURVE2",
+ "type": "enum",
+ "value": 1
+ },
+ "translateX": {
+ "curve": "CURVE3",
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "translateY": {
+ "curve": "CURVE4",
+ "type": "doubleLinear",
+ "value": 8.0
+ },
+ "translateZ": {
+ "curve": "CURVE5",
+ "type": "doubleLinear",
+ "value": -12.0
+ },
+ "rotateY": {
+ "type": "doubleAngle",
+ "value": 50.0
+ },
+ "testFloat": {
+ "curve": "CURVE6",
+ "type": "double",
+ "value": 0.66600000000000004
+ },
+ "testAnimated": {
+ "curve": "CURVE7",
+ "type": "double",
+ "value": 0.0
+ },
+ "scaleX": {
+ "curve": "CURVE8",
+ "type": "double",
+ "value": 0.25
+ },
+ "scaleY": {
+ "type": "double",
+ "value": 4.6600000000000001
+ },
+ "visibility": {
+ "curve": "CURVE9",
+ "type": "bool",
+ "value": true
+ },
+ "testString": {
+ "type": "string",
+ "value": "Hello world"
+ },
+ "testVectorX": {
+ "curve": "CURVE10",
+ "type": "double",
+ "value": 0.20000000000000001
+ },
+ "testVectorY": {
+ "curve": "CURVE11",
+ "type": "double",
+ "value": 1.3999999999999999
+ },
+ "rotateZ": {
+ "curve": "CURVE12",
+ "type": "doubleAngle",
+ "value": 90.0
+ },
+ "testVectorZ": {
+ "curve": "CURVE13",
+ "type": "double",
+ "value": 2.6000000000000001
+ },
+ "scaleZ": {
+ "curve": "CURVE14",
+ "type": "double",
+ "value": 0.5
+ },
+ "testInteger": {
+ "curve": "CURVE15",
+ "type": "long",
+ "value": 5
+ },
+ "testBoolean": {
+ "curve": "CURVE16",
+ "type": "bool",
+ "value": true
+ },
+ "testConnect": {
+ "type": "double",
+ "value": 8.0
+ }
+ }
+ },
+ "srcSphere:lockedNode": {
+ "attrs": {
+ "translateX": {
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "translateY": {
+ "type": "doubleLinear",
+ "value": 5.0
+ },
+ "translateZ": {
+ "curve": "CURVE18",
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "scaleX": {
+ "type": "double",
+ "value": 1.0
+ },
+ "scaleY": {
+ "type": "double",
+ "value": 1.0
+ },
+ "visibility": {
+ "type": "bool",
+ "value": true
+ },
+ "rotateX": {
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "rotateY": {
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "rotateZ": {
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "scaleZ": {
+ "type": "double",
+ "value": 1.0
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/sphere.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/sphere.ma
new file mode 100644
index 0000000..8c89abc
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/sphere.ma
@@ -0,0 +1,354 @@
+//Maya ASCII 2017 scene
+//Name: sphere.ma
+//Last modified: Sun, Feb 11, 2018 03:47:35 AM
+//Codeset: 1252
+requires maya "2017";
+requires "stereoCamera" "10.0";
+currentUnit -l centimeter -a degree -t film;
+fileInfo "application" "maya";
+fileInfo "product" "Maya 2017";
+fileInfo "version" "2017";
+fileInfo "cutIdentifier" "201606150345-997974";
+fileInfo "osv" "Microsoft Windows 8 Business Edition, 64-bit (Build 9200)\n";
+createNode transform -s -n "persp";
+ rename -uid "E076660C-4F85-B186-64D1-46849E688491";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" 133.3110926639115 16.134754006216241 19.317795622267052 ;
+ setAttr ".r" -type "double3" -8.7383527296081347 79.400000000001739 0 ;
+createNode camera -s -n "perspShape" -p "persp";
+ rename -uid "00E21AC0-4731-C2C0-2E71-409F5D47F930";
+ setAttr -k off ".v" no;
+ setAttr ".fl" 34.999999999999993;
+ setAttr ".coi" 114.68216434604706;
+ setAttr ".imn" -type "string" "persp";
+ setAttr ".den" -type "string" "persp_depth";
+ setAttr ".man" -type "string" "persp_mask";
+ setAttr ".hc" -type "string" "viewSet -p %camera";
+createNode transform -s -n "top";
+ rename -uid "882E7E2C-450F-3325-2BB3-E09C8E2DEA5D";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" 0 100.1 0 ;
+ setAttr ".r" -type "double3" -89.999999999999986 0 0 ;
+createNode camera -s -n "topShape" -p "top";
+ rename -uid "12B4F816-4EEE-299F-7183-A58F890C1FD5";
+ setAttr -k off ".v" no;
+ setAttr ".rnd" no;
+ setAttr ".coi" 100.1;
+ setAttr ".ow" 30;
+ setAttr ".imn" -type "string" "top";
+ setAttr ".den" -type "string" "top_depth";
+ setAttr ".man" -type "string" "top_mask";
+ setAttr ".hc" -type "string" "viewSet -t %camera";
+ setAttr ".o" yes;
+createNode transform -s -n "front";
+ rename -uid "FD0E4029-44A6-7FDE-9CFF-FDBF36FCE708";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" 2.0350096678112575 0.39361762628711539 100.1 ;
+createNode camera -s -n "frontShape" -p "front";
+ rename -uid "8997F15C-4C97-598E-A50F-DA88CA1063E6";
+ setAttr -k off ".v" no;
+ setAttr ".rnd" no;
+ setAttr ".coi" 100.1;
+ setAttr ".ow" 61.766282942468983;
+ setAttr ".imn" -type "string" "front";
+ setAttr ".den" -type "string" "front_depth";
+ setAttr ".man" -type "string" "front_mask";
+ setAttr ".hc" -type "string" "viewSet -f %camera";
+ setAttr ".o" yes;
+createNode transform -s -n "side";
+ rename -uid "CC57D42B-44BD-C01F-AB99-E6B928031F2B";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" 100.1 0 0 ;
+ setAttr ".r" -type "double3" 0 89.999999999999986 0 ;
+createNode camera -s -n "sideShape" -p "side";
+ rename -uid "B98CA35F-4DFD-36DE-7461-189C98891637";
+ setAttr -k off ".v" no;
+ setAttr ".rnd" no;
+ setAttr ".coi" 100.1;
+ setAttr ".ow" 30;
+ setAttr ".imn" -type "string" "side";
+ setAttr ".den" -type "string" "side_depth";
+ setAttr ".man" -type "string" "side_mask";
+ setAttr ".hc" -type "string" "viewSet -s %camera";
+ setAttr ".o" yes;
+createNode transform -n "group";
+ rename -uid "BECCB461-41D0-BD8A-CC79-3591B57B0D18";
+ addAttr -s false -ci true -sn "testMessage" -ln "testMessage" -at "message";
+createNode transform -n "offset" -p "group";
+ rename -uid "16BDF72C-4277-8CD9-B837-22ACC6FF5F01";
+ setAttr -l on ".v";
+ setAttr -l on ".tx";
+ setAttr -l on ".ty";
+ setAttr -l on ".tz";
+ setAttr -l on ".rx";
+ setAttr -l on ".ry";
+ setAttr -l on ".rz";
+ setAttr -l on ".sx";
+ setAttr -l on ".sy";
+ setAttr -l on ".sz";
+createNode transform -n "lockedNode" -p "offset";
+ rename -uid "C7E5AB1E-4BA2-E4D0-551E-FCA465DB50D6";
+lockNode -l 1 ;
+createNode transform -n "sphere" -p "lockedNode";
+ rename -uid "6D95DBB5-4D74-05BF-A95F-59887E9E743D";
+ addAttr -ci true -sn "testVector" -ln "testVector" -at "double3" -nc 3;
+ addAttr -ci true -sn "testVectorX" -ln "testVectorX" -at "double" -p "testVector";
+ addAttr -ci true -sn "testVectorY" -ln "testVectorY" -at "double" -p "testVector";
+ addAttr -ci true -sn "testVectorZ" -ln "testVectorZ" -at "double" -p "testVector";
+ addAttr -ci true -uac -sn "testColor" -ln "testColor" -at "float3" -nc 3;
+ addAttr -ci true -sn "testRed" -ln "testRed" -at "float" -p "testColor";
+ addAttr -ci true -sn "testGreen" -ln "testGreen" -at "float" -p "testColor";
+ addAttr -ci true -sn "testRed" -ln "testRed" -at "float" -p "testColor";
+ addAttr -ci true -sn "testString" -ln "testString" -dt "string";
+ addAttr -ci true -sn "testEnum" -ln "testEnum" -min 0 -max 2 -en "Apple:Lemon:Banana"
+ -at "enum";
+ addAttr -ci true -sn "testFloat" -ln "testFloat" -min 0 -max 10 -at "double";
+ addAttr -ci true -sn "testBoolean" -ln "testBoolean" -min 0 -max 1 -at "bool";
+ addAttr -ci true -sn "testInteger" -ln "testInteger" -min 0 -max 10 -at "long";
+ addAttr -ci true -sn "testLocked" -ln "testLocked" -min 0 -max 10 -at "double";
+ addAttr -ci true -sn "testHidden" -ln "testHidden" -min 0 -max 10 -at "double";
+ addAttr -ci true -sn "testConnect" -ln "testConnect" -at "double";
+ addAttr -ci true -sn "testAnimated" -ln "testAnimated" -at "double";
+ addAttr -s false -ci true -sn "testMessage" -ln "testMessage" -at "message";
+ addAttr -ci true -sn "testLimit" -ln "testLimit" -dv 5 -min -10 -max 10 -at "double";
+ addAttr -ci true -sn "testNonKeyable" -ln "testNonKeyable" -at "double";
+ addAttr -uap -ci true -k true -sn "testProxy" -ln "testProxy" -dv 1 -at "double";
+ setAttr -k on ".testVector";
+ setAttr -k on ".testVectorX";
+ setAttr -k on ".testVectorY";
+ setAttr -k on ".testVectorZ";
+ setAttr -k on ".testString";
+ setAttr -k on ".testEnum" 2;
+ setAttr -k on ".testFloat";
+ setAttr -k on ".testBoolean";
+ setAttr -k on ".testInteger";
+ setAttr -l on -k on ".testLocked";
+ setAttr -k on ".testConnect";
+ setAttr -k on ".testAnimated";
+ setAttr -k on ".testLimit" 10;
+ setAttr -cb on ".testNonKeyable";
+createNode mesh -n "sphereShape" -p "sphere";
+ rename -uid "A54E9E87-47A6-32A9-85C4-AFBAA8C21840";
+ setAttr -k off ".v";
+ setAttr ".vir" yes;
+ setAttr ".vif" yes;
+ setAttr ".uvst[0].uvsn" -type "string" "map1";
+ setAttr ".cuvs" -type "string" "map1";
+ setAttr ".dcc" -type "string" "Ambient+Diffuse";
+ setAttr ".covm[0]" 0 1 1;
+ setAttr ".cdvm[0]" 0 1 1;
+ setAttr ".ugsdt" no;
+ setAttr ".vnm" 0;
+createNode transform -n "pCube1";
+ rename -uid "EB3530D0-4207-A5AE-6925-9D94CBDDD1F9";
+ setAttr ".t" -type "double3" 0 0 -29.719509228177799 ;
+createNode mesh -n "pCubeShape1" -p "pCube1";
+ rename -uid "7E4B2133-4E80-F102-7998-A9B732FEACD1";
+ setAttr -k off ".v";
+ setAttr ".vir" yes;
+ setAttr ".vif" yes;
+ setAttr ".uvst[0].uvsn" -type "string" "map1";
+ setAttr ".cuvs" -type "string" "map1";
+ setAttr ".dcc" -type "string" "Ambient+Diffuse";
+ setAttr ".covm[0]" 0 1 1;
+ setAttr ".cdvm[0]" 0 1 1;
+createNode lightLinker -s -n "lightLinker1";
+ rename -uid "BB27B0F0-4683-C766-9E0B-D2AFAEB1AFF6";
+ setAttr -s 2 ".lnk";
+ setAttr -s 2 ".slnk";
+createNode displayLayerManager -n "layerManager";
+ rename -uid "1270B817-40F6-0E8E-D20B-FD9B9195A9EE";
+createNode displayLayer -n "defaultLayer";
+ rename -uid "23B6DA10-4D2D-10C6-9FAF-749F161B9716";
+createNode renderLayerManager -n "renderLayerManager";
+ rename -uid "1308789F-439F-925D-3094-0B8AA9FBE17D";
+createNode renderLayer -n "defaultRenderLayer";
+ rename -uid "7827EACA-45F4-FC44-3C4C-368439DEC2B0";
+ setAttr ".g" yes;
+createNode polySphere -n "srcPolySphere";
+ rename -uid "1B369F70-4317-2F4F-4C28-E18C566DC198";
+ setAttr ".r" 4.1417806816985845;
+createNode script -n "sceneConfigurationScriptNode";
+ rename -uid "B0BF38E3-48B8-4929-20D7-45BD7DF0B488";
+ setAttr ".b" -type "string" "playbackOptions -min 1 -max 24 -ast 1 -aet 48 ";
+ setAttr ".st" 6;
+createNode animCurveTU -n "sphere_testAnimated";
+ rename -uid "3A08FC92-43C1-C2D8-F4D3-98813CAFADB9";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 10;
+createNode shapeEditorManager -n "shapeEditorManager";
+ rename -uid "76FE07E3-4101-0D2E-BA83-308EDB6BAFB5";
+createNode poseInterpolatorManager -n "poseInterpolatorManager";
+ rename -uid "E4F59164-433D-3B5A-9EB0-858BC8193BA6";
+createNode polyCube -n "polyCube1";
+ rename -uid "440FB0CB-44F5-D535-6B4E-6088139890E3";
+ setAttr ".cuv" 4;
+createNode objectSet -n "lockedSet";
+ rename -uid "452516C3-40E5-8508-BCB2-8A8F6B2C0F4C";
+ setAttr ".ihi" 0;
+ setAttr -l on ".dsm";
+createNode script -n "uiConfigurationScriptNode";
+ rename -uid "5F07C60B-437F-3FFF-82B2-9ABBA913F194";
+ setAttr ".b" -type "string" (
+ "// Maya Mel UI Configuration File.\n//\n// This script is machine generated. Edit at your own risk.\n//\n//\n\nglobal string $gMainPane;\nif (`paneLayout -exists $gMainPane`) {\n\n\tglobal int $gUseScenePanelConfig;\n\tint $useSceneConfig = $gUseScenePanelConfig;\n\tint $menusOkayInPanels = `optionVar -q allowMenusInPanels`;\tint $nVisPanes = `paneLayout -q -nvp $gMainPane`;\n\tint $nPanes = 0;\n\tstring $editorName;\n\tstring $panelName;\n\tstring $itemFilterName;\n\tstring $panelConfig;\n\n\t//\n\t// get current state of the UI\n\t//\n\tsceneUIReplacement -update $gMainPane;\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"Outliner\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `outlinerPanel -unParent -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n"
+ + " -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n"
+ + " -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\t}\n\t} else {\n"
+ + "\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n"
+ + " -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n"
+ + " -expandAttribute 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Top View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n"
+ + " -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n"
+ + " -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n"
+ + " -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n"
+ + " -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n"
+ + " -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n"
+ + " -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Side View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n"
+ + " -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n"
+ + " -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n"
+ + " -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n"
+ + "\t\tmodelPanel -edit -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n"
+ + " -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n"
+ + " -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Front View\")) `;\n"
+ + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n"
+ + " -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n"
+ + " -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n"
+ + " -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n"
+ + " -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n"
+ + " -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n"
+ + " -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Persp View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n"
+ + " -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n"
+ + " -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n"
+ + " -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1531\n -height 1022\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n"
+ + " modelEditor -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n"
+ + " -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n"
+ + " -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1531\n -height 1022\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"Outliner\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n"
+ + "\t\t\t$panelName = `outlinerPanel -unParent -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n outlinerEditor -e \n -docTag \"isolOutln_fromSeln\" \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 0\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n"
+ + " -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n"
+ + " -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -docTag \"isolOutln_fromSeln\" \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 0\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n"
+ + " -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n"
+ + " -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"graphEditor\" (localizedPanelLabel(\"Graph Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"graphEditor\" -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n"
+ + " -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 1\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n"
+ + " -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 1\n -displayInfinities 0\n -displayValues 0\n -autoFit 1\n -snapTime \"integer\" \n -snapValue \"none\" \n -showResults \"off\" \n -showBufferCurves \"off\" \n -smoothness \"fine\" \n"
+ + " -resultSamples 0.96\n -resultScreenSamples 0\n -resultUpdate \"delayed\" \n -showUpstreamCurves 1\n -showCurveNames 0\n -showActiveCurveNames 0\n -stackedCurves 0\n -stackedCurvesMin -1\n -stackedCurvesMax 1\n -stackedCurvesSpace 0.2\n -displayNormalized 0\n -preSelectionHighlight 0\n -constrainDrag 0\n -classicMode 1\n -valueLinesToggle 1\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n"
+ + " -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 1\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n"
+ + " -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 1\n -displayInfinities 0\n"
+ + " -displayValues 0\n -autoFit 1\n -snapTime \"integer\" \n -snapValue \"none\" \n -showResults \"off\" \n -showBufferCurves \"off\" \n -smoothness \"fine\" \n -resultSamples 0.96\n -resultScreenSamples 0\n -resultUpdate \"delayed\" \n -showUpstreamCurves 1\n -showCurveNames 0\n -showActiveCurveNames 0\n -stackedCurves 0\n -stackedCurvesMin -1\n -stackedCurvesMax 1\n -stackedCurvesSpace 0.2\n -displayNormalized 0\n -preSelectionHighlight 0\n -constrainDrag 0\n -classicMode 1\n -valueLinesToggle 1\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dopeSheetPanel\" (localizedPanelLabel(\"Dope Sheet\")) `;\n\tif (\"\" == $panelName) {\n"
+ + "\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dopeSheetPanel\" -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 0\n"
+ + " -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n"
+ + " -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -outliner \"dopeSheetPanel1OutlineEd\" \n -showSummary 1\n -showScene 0\n -hierarchyBelow 0\n -showTicks 1\n -selectionWindow 0 0 0 0 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n"
+ + " -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 0\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n"
+ + " -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n"
+ + " -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -outliner \"dopeSheetPanel1OutlineEd\" \n -showSummary 1\n -showScene 0\n -hierarchyBelow 0\n -showTicks 1\n -selectionWindow 0 0 0 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"timeEditorPanel\" (localizedPanelLabel(\"Time Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"timeEditorPanel\" -l (localizedPanelLabel(\"Time Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Time Editor\")) -mbv $menusOkayInPanels $panelName;\n"
+ + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"clipEditorPanel\" (localizedPanelLabel(\"Trax Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"clipEditorPanel\" -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 0 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n"
+ + " clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"sequenceEditorPanel\" (localizedPanelLabel(\"Camera Sequencer\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"sequenceEditorPanel\" -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n"
+ + " -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperGraphPanel\" (localizedPanelLabel(\"Hypergraph Hierarchy\")) `;\n"
+ + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"hyperGraphPanel\" -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n -orientation \"horiz\" \n -mergeConnections 0\n -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n -showExpressions 0\n -showConstraints 0\n -showConnectionFromSelected 0\n -showConnectionToSelected 0\n -showConstraintLabels 0\n -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -imagePosition 0 0 \n -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n"
+ + " -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n -orientation \"horiz\" \n -mergeConnections 0\n -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n -showExpressions 0\n -showConstraints 0\n -showConnectionFromSelected 0\n -showConnectionToSelected 0\n -showConstraintLabels 0\n"
+ + " -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -imagePosition 0 0 \n -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"visorPanel\" (localizedPanelLabel(\"Visor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"visorPanel\" -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels $panelName;\n"
+ + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"createNodePanel\" (localizedPanelLabel(\"Create Node\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"createNodePanel\" -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"polyTexturePlacementPanel\" (localizedPanelLabel(\"UV Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"polyTexturePlacementPanel\" -l (localizedPanelLabel(\"UV Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"UV Editor\")) -mbv $menusOkayInPanels $panelName;\n"
+ + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"renderWindowPanel\" (localizedPanelLabel(\"Render View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"renderWindowPanel\" -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"shapePanel\" (localizedPanelLabel(\"Shape Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\tshapePanel -unParent -l (localizedPanelLabel(\"Shape Editor\")) -mbv $menusOkayInPanels ;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tshapePanel -edit -l (localizedPanelLabel(\"Shape Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n"
+ + "\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"posePanel\" (localizedPanelLabel(\"Pose Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\tposePanel -unParent -l (localizedPanelLabel(\"Pose Editor\")) -mbv $menusOkayInPanels ;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tposePanel -edit -l (localizedPanelLabel(\"Pose Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynRelEdPanel\" (localizedPanelLabel(\"Dynamic Relationships\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dynRelEdPanel\" -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"relationshipPanel\" (localizedPanelLabel(\"Relationship Editor\")) `;\n"
+ + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"relationshipPanel\" -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"referenceEditorPanel\" (localizedPanelLabel(\"Reference Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"referenceEditorPanel\" -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"componentEditorPanel\" (localizedPanelLabel(\"Component Editor\")) `;\n"
+ + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"componentEditorPanel\" -l (localizedPanelLabel(\"Component Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Component Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynPaintScriptedPanelType\" (localizedPanelLabel(\"Paint Effects\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dynPaintScriptedPanelType\" -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"scriptEditorPanel\" (localizedPanelLabel(\"Script Editor\")) `;\n"
+ + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"scriptEditorPanel\" -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\tif ($useSceneConfig) {\n\t\tscriptedPanel -e -to $panelName;\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"profilerPanel\" (localizedPanelLabel(\"Profiler Tool\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"profilerPanel\" -l (localizedPanelLabel(\"Profiler Tool\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Profiler Tool\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"contentBrowserPanel\" (localizedPanelLabel(\"Content Browser\")) `;\n"
+ + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"contentBrowserPanel\" -l (localizedPanelLabel(\"Content Browser\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Content Browser\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"ToggledOutliner\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `outlinerPanel -unParent -l (localizedPanelLabel(\"ToggledOutliner\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n"
+ + " -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n"
+ + " -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"ToggledOutliner\")) -mbv $menusOkayInPanels $panelName;\n"
+ + "\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n"
+ + " -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n"
+ + "\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"Stereo\" (localizedPanelLabel(\"Stereo\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"Stereo\" -l (localizedPanelLabel(\"Stereo\")) -mbv $menusOkayInPanels `;\nstring $editorName = ($panelName+\"Editor\");\n stereoCameraView -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n"
+ + " -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 4 4 \n -bumpResolution 4 4 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 0\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n"
+ + " -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n"
+ + " -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 0\n -height 0\n -sceneRenderFilter 0\n -displayMode \"centerEye\" \n -viewColor 0 0 0 1 \n -useCustomBackground 1\n $editorName;\n stereoCameraView -e -viewSelected 0 $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Stereo\")) -mbv $menusOkayInPanels $panelName;\nstring $editorName = ($panelName+\"Editor\");\n stereoCameraView -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n"
+ + " -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 4 4 \n"
+ + " -bumpResolution 4 4 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 0\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n"
+ + " -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 0\n -height 0\n -sceneRenderFilter 0\n -displayMode \"centerEye\" \n -viewColor 0 0 0 1 \n -useCustomBackground 1\n $editorName;\n stereoCameraView -e -viewSelected 0 $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n"
+ + "\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperShadePanel\" (localizedPanelLabel(\"Hypershade\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"hyperShadePanel\" -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"nodeEditorPanel\" (localizedPanelLabel(\"Node Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"nodeEditorPanel\" -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -consistentNameSize 1\n"
+ + " -createNodeCommand \"nodeEdCreateNodeCommand\" \n -defaultPinnedState 0\n -additiveGraphingMode 0\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -useAssets 1\n -syncedSelection 1\n -extendToShapes 1\n -activeTab -1\n -editorMode \"default\" \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n"
+ + " -allNodes 0\n -autoSizeNodes 1\n -consistentNameSize 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -defaultPinnedState 0\n -additiveGraphingMode 0\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -useAssets 1\n -syncedSelection 1\n -extendToShapes 1\n -activeTab -1\n -editorMode \"default\" \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\tif ($useSceneConfig) {\n string $configName = `getPanel -cwl (localizedPanelLabel(\"Current Layout\"))`;\n"
+ + " if (\"\" != $configName) {\n\t\t\tpanelConfiguration -edit -label (localizedPanelLabel(\"Current Layout\")) \n\t\t\t\t-userCreated false\n\t\t\t\t-defaultImage \"vacantCell.xP:/\"\n\t\t\t\t-image \"\"\n\t\t\t\t-sc false\n\t\t\t\t-configString \"global string $gMainPane; paneLayout -e -cn \\\"single\\\" -ps 1 100 100 $gMainPane;\"\n\t\t\t\t-removeAllPanels\n\t\t\t\t-ap false\n\t\t\t\t\t(localizedPanelLabel(\"Persp View\")) \n\t\t\t\t\t\"modelPanel\"\n"
+ + "\t\t\t\t\t\"$panelName = `modelPanel -unParent -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels `;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -holdOuts 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 0\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 16384\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -depthOfFieldPreview 1\\n -maxConstantTransparency 1\\n -rendererName \\\"vp2Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -particleInstancers 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -greasePencils 1\\n -shadows 0\\n -captureSequenceNumber -1\\n -width 1531\\n -height 1022\\n -sceneRenderFilter 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName\"\n"
+ + "\t\t\t\t\t\"modelPanel -edit -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels $panelName;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -holdOuts 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 0\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 16384\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -depthOfFieldPreview 1\\n -maxConstantTransparency 1\\n -rendererName \\\"vp2Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -particleInstancers 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -greasePencils 1\\n -shadows 0\\n -captureSequenceNumber -1\\n -width 1531\\n -height 1022\\n -sceneRenderFilter 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName\"\n"
+ + "\t\t\t\t$configName;\n\n setNamedPanelLayout (localizedPanelLabel(\"Current Layout\"));\n }\n\n panelHistory -e -clear mainPanelHistory;\n setFocus `paneLayout -q -p1 $gMainPane`;\n sceneUIReplacement -deleteRemaining;\n sceneUIReplacement -clear;\n\t}\n\n\ngrid -spacing 5 -size 12 -divisions 5 -displayAxes yes -displayGridLines yes -displayDivisionLines yes -displayPerspectiveLabels no -displayOrthographicLabels no -displayAxesBold yes -perspectiveLabelPosition axis -orthographicLabelPosition edge;\nviewManip -drawCompass 0 -compassAngle 0 -frontParameters \"\" -homeParameters \"\" -selectionLockParameters \"\";\n}\n");
+ setAttr ".st" 3;
+select -ne :time1;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr ".o" 1;
+ setAttr ".unw" 1;
+select -ne :hardwareRenderingGlobals;
+ setAttr ".otfna" -type "stringArray" 18 "NURBS Curves" "NURBS Surfaces" "Polygons" "Subdiv Surfaces" "Particles" "Fluids" "Image Planes" "UI:" "Lights" "Cameras" "Locators" "Joints" "IK Handles" "Deformers" "Motion Trails" "Components" "Misc. UI" "Ornaments" ;
+ setAttr ".otfva" -type "Int32Array" 18 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 ;
+ setAttr ".vac" 2;
+select -ne :renderPartition;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -s 2 ".st";
+select -ne :renderGlobalsList1;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+select -ne :defaultShaderList1;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -s 4 ".s";
+select -ne :postProcessList1;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -s 2 ".p";
+select -ne :defaultRenderingList1;
+select -ne :initialShadingGroup;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -s 2 ".dsm";
+ setAttr -k on ".mwc";
+ setAttr ".ro" yes;
+select -ne :initialParticleSE;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -k on ".mwc";
+ setAttr ".ro" yes;
+select -ne :defaultRenderGlobals;
+ setAttr ".ep" 1;
+select -ne :defaultResolution;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -av ".w" 640;
+ setAttr -av ".h" 480;
+ setAttr -k on ".pa" 1;
+ setAttr -k on ".al";
+ setAttr -av ".dar" 1.3333332538604736;
+ setAttr -k on ".ldar";
+ setAttr -k on ".off";
+ setAttr -k on ".fld";
+ setAttr -k on ".zsl";
+select -ne :defaultLightSet;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -k on ".mwc";
+ setAttr ".ro" yes;
+select -ne :defaultColorMgtGlobals;
+ setAttr ".cme" no;
+select -ne :hardwareRenderGlobals;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr ".ctrs" 256;
+ setAttr ".btrs" 512;
+connectAttr "sphere.msg" "group.testMessage" -l on;
+connectAttr "sphere.ty" "sphere.testConnect";
+connectAttr "sphere_testAnimated.o" "sphere.testAnimated";
+connectAttr "group.msg" "sphere.testMessage" -l on;
+connectAttr "pCube1.sz" "sphere.testProxy";
+connectAttr "srcPolySphere.out" "sphereShape.i";
+connectAttr "polyCube1.out" "pCubeShape1.i";
+relationship "link" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message";
+relationship "link" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message";
+relationship "shadowLink" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message";
+relationship "shadowLink" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message";
+connectAttr "layerManager.dli[0]" "defaultLayer.id";
+connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid";
+connectAttr "sphere.iog" "lockedSet.dsm" -l on -na;
+connectAttr "defaultRenderLayer.msg" ":defaultRenderingList1.r" -na;
+connectAttr "sphereShape.iog" ":initialShadingGroup.dsm" -na;
+connectAttr "pCubeShape1.iog" ":initialShadingGroup.dsm" -na;
+// End of sphere.ma
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test.ma
new file mode 100644
index 0000000..d89fb42
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test.ma
@@ -0,0 +1,187 @@
+//Maya ASCII 2013 scene
+//Name: test.ma
+//Last modified: Thu, Jun 26, 2014 01:46:47 PM
+//Codeset: UTF-8
+requires maya "2013";
+currentUnit -l centimeter -a degree -t film;
+fileInfo "application" "maya";
+fileInfo "product" "Maya 2013";
+fileInfo "version" "2013 Service Pack 2P12 x64";
+fileInfo "cutIdentifier" "201304120319-868747";
+fileInfo "osv" "Linux 3.5.4-2.10-desktop #1 SMP PREEMPT Fri Oct 5 14:56:49 CEST 2012 x86_64";
+createNode animCurveTA -n "DELETE_NODE_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841;
+ setAttr -k on ".fullname" -type "string" "srcSphere:sphere.rotateX";
+createNode animCurveTU -n "DELETE_NODE_testEnum";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+ setAttr -k on ".fullname" -type "string" "srcSphere:sphere.testEnum";
+createNode animCurveTL -n "DELETE_NODE_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 0;
+ setAttr -k on ".fullname" -type "string" "srcSphere:sphere.translateX";
+createNode animCurveTL -n "DELETE_NODE_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 8 10 8;
+ setAttr -k on ".fullname" -type "string" "srcSphere:sphere.translateY";
+createNode animCurveTL -n "DELETE_NODE_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292;
+ setAttr -k on ".fullname" -type "string" "srcSphere:sphere.translateZ";
+createNode animCurveTA -n "DELETE_NODE_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 25 10 -82.269409864294204;
+ setAttr -k on ".fullname" -type "string" "srcSphere:sphere.rotateY";
+createNode animCurveTU -n "DELETE_NODE_testFloat";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666;
+ setAttr -k on ".fullname" -type "string" "srcSphere:sphere.testFloat";
+createNode animCurveTU -n "DELETE_NODE_testAnimated";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 10;
+ setAttr -k on ".fullname" -type "string" "srcSphere:sphere.testAnimated";
+createNode animCurveTU -n "DELETE_NODE_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792;
+ setAttr -k on ".fullname" -type "string" "srcSphere:sphere.scaleX";
+createNode animCurveTU -n "DELETE_NODE_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1.5 10 2.5775116688782669;
+ setAttr -k on ".fullname" -type "string" "srcSphere:sphere.scaleY";
+createNode animCurveTU -n "DELETE_NODE_visibility";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+ setAttr -k on ".fullname" -type "string" "srcSphere:sphere.visibility";
+createNode animCurveTU -n "DELETE_NODE_testVectorX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2;
+ setAttr -k on ".fullname" -type "string" "srcSphere:sphere.testVectorX";
+createNode animCurveTU -n "DELETE_NODE_testVectorY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4;
+ setAttr -k on ".fullname" -type "string" "srcSphere:sphere.testVectorY";
+createNode animCurveTA -n "DELETE_NODE_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096;
+ setAttr -k on ".fullname" -type "string" "srcSphere:sphere.rotateZ";
+createNode animCurveTU -n "DELETE_NODE_testVectorZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6;
+ setAttr -k on ".fullname" -type "string" "srcSphere:sphere.testVectorZ";
+createNode animCurveTU -n "DELETE_NODE_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585;
+ setAttr -k on ".fullname" -type "string" "srcSphere:sphere.scaleZ";
+createNode animCurveTU -n "DELETE_NODE_testInteger";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 5 10 5;
+ setAttr -k on ".fullname" -type "string" "srcSphere:sphere.testInteger";
+createNode animCurveTU -n "DELETE_NODE_testBoolean";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+ setAttr -k on ".fullname" -type "string" "srcSphere:sphere.testBoolean";
+select -ne :time1;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr ".o" 10;
+ setAttr ".unw" 10;
+select -ne :renderPartition;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -s 2 ".st";
+select -ne :initialShadingGroup;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -s 2 ".dsm";
+ setAttr -k on ".mwc";
+ setAttr ".ro" yes;
+select -ne :initialParticleSE;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -k on ".mwc";
+ setAttr ".ro" yes;
+select -ne :defaultShaderList1;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -s 2 ".s";
+select -ne :postProcessList1;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -s 2 ".p";
+select -ne :defaultRenderingList1;
+ setAttr -s 3 ".r";
+select -ne :renderGlobalsList1;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+select -ne :defaultResolution;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -av ".w";
+ setAttr -av ".h";
+ setAttr -k on ".pa" 1;
+ setAttr -k on ".al";
+ setAttr -av ".dar";
+ setAttr -k on ".ldar";
+ setAttr -k on ".off";
+ setAttr -k on ".fld";
+ setAttr -k on ".zsl";
+select -ne :defaultLightSet;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -k on ".mwc";
+ setAttr ".ro" yes;
+select -ne :hardwareRenderGlobals;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr ".ctrs" 256;
+ setAttr ".btrs" 512;
+select -ne :hardwareRenderingGlobals;
+ setAttr ".otfna" -type "stringArray" 18 "NURBS Curves" "NURBS Surfaces" "Polygons" "Subdiv Surfaces" "Particles" "Fluids" "Image Planes" "UI:" "Lights" "Cameras" "Locators" "Joints" "IK Handles" "Deformers" "Motion Trails" "Components" "Misc. UI" "Ornaments" ;
+ setAttr ".otfva" -type "Int32Array" 18 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 ;
+select -ne :defaultHardwareRenderGlobals;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr ".fn" -type "string" "im";
+ setAttr ".res" -type "string" "ntsc_4d 646 485 1.333";
+// End of test.ma
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_anim.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_anim.ma
new file mode 100644
index 0000000..036f61e
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_anim.ma
@@ -0,0 +1,429 @@
+//Maya ASCII 2014 scene
+//Name: test_anim.ma
+//Last modified: Sat, Mar 14, 2015 04:31:24 AM
+//Codeset: 1252
+file -rdi 1 -ns "srcSphere" -rfn "srcSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma";
+file -rdi 1 -ns "dstSphere" -rfn "dstSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma";
+file -r -ns "srcSphere" -dr 1 -rfn "srcSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma";
+file -r -ns "dstSphere" -dr 1 -rfn "dstSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma";
+requires maya "2014";
+currentUnit -l centimeter -a degree -t film;
+fileInfo "application" "maya";
+fileInfo "product" "Maya 2014";
+fileInfo "version" "2014 x64";
+fileInfo "cutIdentifier" "201303010241-864206";
+fileInfo "osv" "Microsoft Windows 7 Ultimate Edition, 64-bit Windows 7 Service Pack 1 (Build 7601)\n";
+createNode transform -s -n "persp";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" -123.17900131274617 74.628663135067598 32.661032572240735 ;
+ setAttr ".r" -type "double3" -30.338352727390017 -72.599999999996271 0 ;
+createNode camera -s -n "perspShape" -p "persp";
+ setAttr -k off ".v" no;
+ setAttr ".fl" 34.999999999999993;
+ setAttr ".coi" 150.42418693917088;
+ setAttr ".imn" -type "string" "persp";
+ setAttr ".den" -type "string" "persp_depth";
+ setAttr ".man" -type "string" "persp_mask";
+ setAttr ".hc" -type "string" "viewSet -p %camera";
+createNode transform -s -n "top";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" 0 100.1 0 ;
+ setAttr ".r" -type "double3" -89.999999999999986 0 0 ;
+createNode camera -s -n "topShape" -p "top";
+ setAttr -k off ".v" no;
+ setAttr ".rnd" no;
+ setAttr ".coi" 100.1;
+ setAttr ".ow" 30;
+ setAttr ".imn" -type "string" "top";
+ setAttr ".den" -type "string" "top_depth";
+ setAttr ".man" -type "string" "top_mask";
+ setAttr ".hc" -type "string" "viewSet -t %camera";
+ setAttr ".o" yes;
+createNode transform -s -n "front";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" 2.0350096678112575 0.39361762628711539 100.1 ;
+createNode camera -s -n "frontShape" -p "front";
+ setAttr -k off ".v" no;
+ setAttr ".rnd" no;
+ setAttr ".coi" 100.1;
+ setAttr ".ow" 61.766282942468983;
+ setAttr ".imn" -type "string" "front";
+ setAttr ".den" -type "string" "front_depth";
+ setAttr ".man" -type "string" "front_mask";
+ setAttr ".hc" -type "string" "viewSet -f %camera";
+ setAttr ".o" yes;
+createNode transform -s -n "side";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" 100.1 0 0 ;
+ setAttr ".r" -type "double3" 0 89.999999999999986 0 ;
+createNode camera -s -n "sideShape" -p "side";
+ setAttr -k off ".v" no;
+ setAttr ".rnd" no;
+ setAttr ".coi" 100.1;
+ setAttr ".ow" 30;
+ setAttr ".imn" -type "string" "side";
+ setAttr ".den" -type "string" "side_depth";
+ setAttr ".man" -type "string" "side_mask";
+ setAttr ".hc" -type "string" "viewSet -s %camera";
+ setAttr ".o" yes;
+createNode lightLinker -s -n "lightLinker1";
+ setAttr -s 2 ".lnk";
+ setAttr -s 2 ".slnk";
+createNode displayLayerManager -n "layerManager";
+createNode displayLayer -n "defaultLayer";
+createNode renderLayerManager -n "renderLayerManager";
+createNode renderLayer -n "defaultRenderLayer";
+ setAttr ".g" yes;
+createNode script -n "sceneConfigurationScriptNode";
+ setAttr ".b" -type "string" "playbackOptions -min 1 -max 24 -ast 1 -aet 48 ";
+ setAttr ".st" 6;
+createNode reference -n "srcSphereRN";
+ setAttr -s 16 ".phl";
+ setAttr ".phl[1]" 0;
+ setAttr ".phl[2]" 0;
+ setAttr ".phl[3]" 0;
+ setAttr ".phl[4]" 0;
+ setAttr ".phl[5]" 0;
+ setAttr ".phl[6]" 0;
+ setAttr ".phl[7]" 0;
+ setAttr ".phl[8]" 0;
+ setAttr ".phl[9]" 0;
+ setAttr ".phl[10]" 0;
+ setAttr ".phl[11]" 0;
+ setAttr ".phl[12]" 0;
+ setAttr ".phl[13]" 0;
+ setAttr ".phl[14]" 0;
+ setAttr ".phl[15]" 0;
+ setAttr ".phl[16]" 0;
+ setAttr ".ed" -type "dataReferenceEdits"
+ "srcSphereRN"
+ "srcSphereRN" 0
+ "srcSphereRN" 45
+ 1 |srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere
+ "testStatic" "testStatic" " -ci 1 -at \"double\""
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "visibility" " 1"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translate" " -type \"double3\" 0 5 0"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translateX" " -av"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translateY" " -av"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translateZ" " -av"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotate" " -type \"double3\" 0 0 0"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotateX" " -av"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotateY" " -av"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotateZ" " -av"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "scale" " -type \"double3\" 1 1 1"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "translate" " -type \"double3\" 0 8 -12"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "translateZ" " -av"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "rotate" " -type \"double3\" 45 50 90"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "rotateX" " -av"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "rotateY" " -av"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "rotateZ" " -av"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "scale" " -type \"double3\" 0.25 4.66 0.5"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "scaleX" " -av"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "scaleY" " -av"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "scaleZ" " -av"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testVector" " -k 1 -type \"double3\" 0.2 1.4 2.6"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testVector" " -k 1"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testVectorX" " -k 1"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testVectorY" " -av -k 1"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testVectorZ" " -k 1"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testColor" " -type \"float3\" 0.18 0.6 0.18"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testString" " -k 1 -type \"string\" \"Hello world\""
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testStatic" " -k 1 0"
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode.translateZ"
+ "srcSphereRN.placeHolderList[1]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testVectorX"
+ "srcSphereRN.placeHolderList[2]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testVectorY"
+ "srcSphereRN.placeHolderList[3]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testVectorZ"
+ "srcSphereRN.placeHolderList[4]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testEnum"
+ "srcSphereRN.placeHolderList[5]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testFloat"
+ "srcSphereRN.placeHolderList[6]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testBoolean"
+ "srcSphereRN.placeHolderList[7]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testInteger"
+ "srcSphereRN.placeHolderList[8]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.translateY"
+ "srcSphereRN.placeHolderList[9]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.translateX"
+ "srcSphereRN.placeHolderList[10]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.translateZ"
+ "srcSphereRN.placeHolderList[11]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.rotateX"
+ "srcSphereRN.placeHolderList[12]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.rotateZ"
+ "srcSphereRN.placeHolderList[13]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.scaleX"
+ "srcSphereRN.placeHolderList[14]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.scaleZ"
+ "srcSphereRN.placeHolderList[15]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.visibility"
+ "srcSphereRN.placeHolderList[16]" "";
+ setAttr ".ptag" -type "string" "";
+lockNode -l 1 ;
+createNode reference -n "dstSphereRN";
+ setAttr ".ed" -type "dataReferenceEdits"
+ "dstSphereRN"
+ "dstSphereRN" 0;
+ setAttr ".ptag" -type "string" "";
+lockNode -l 1 ;
+createNode animCurveTU -n "srcSphere:sphere_visibility";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTL -n "srcSphere:sphere_translateX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 0;
+createNode animCurveTL -n "srcSphere:sphere_translateY";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 8 10 8;
+createNode animCurveTL -n "srcSphere:sphere_translateZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292;
+createNode animCurveTA -n "srcSphere:sphere_rotateX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841;
+createNode animCurveTA -n "srcSphere:sphere_rotateZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096;
+createNode animCurveTU -n "srcSphere:sphere_scaleX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792;
+createNode animCurveTU -n "srcSphere:sphere_scaleZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585;
+createNode animCurveTU -n "srcSphere:sphere_testVectorX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2;
+createNode animCurveTU -n "srcSphere:sphere_testVectorY";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4;
+createNode animCurveTU -n "srcSphere:sphere_testVectorZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6;
+createNode animCurveTU -n "srcSphere:sphere_testEnum";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTU -n "srcSphere:sphere_testFloat";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666;
+createNode animCurveTU -n "srcSphere:sphere_testBoolean";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTU -n "srcSphere:sphere_testInteger";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 5 10 5;
+createNode animCurveTL -n "dstSphere:sphere_translateY";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 8 10 8;
+createNode animCurveTL -n "lockedNode_translateZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 15;
+createNode animCurveTU -n "sphere_testInteger";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 5 10 5;
+createNode animCurveTU -n "sphere_testEnum";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTL -n "sphere_translateX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 0;
+createNode animCurveTL -n "sphere_translateZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292;
+createNode animCurveTU -n "sphere_testFloat";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666;
+createNode animCurveTU -n "sphere_scaleX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792;
+createNode animCurveTU -n "sphere_testVectorZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6;
+createNode animCurveTU -n "sphere_scaleZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585;
+createNode animCurveTA -n "sphere_rotateX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841;
+createNode animCurveTU -n "sphere_testVectorY";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4;
+createNode animCurveTA -n "sphere_rotateZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096;
+createNode animCurveTU -n "sphere_visibility";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTU -n "sphere_testVectorX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2;
+createNode animCurveTU -n "sphere_testBoolean";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTL -n "lockedNode_translateZ1";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 15;
+createNode reference -n "sharedReferenceNode";
+ setAttr ".ed" -type "dataReferenceEdits"
+ "sharedReferenceNode";
+select -ne :time1;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr ".o" 1;
+ setAttr ".unw" 1;
+select -ne :renderPartition;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -s 2 ".st";
+select -ne :initialShadingGroup;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -s 2 ".dsm";
+ setAttr -k on ".mwc";
+ setAttr ".ro" yes;
+select -ne :initialParticleSE;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -k on ".mwc";
+ setAttr ".ro" yes;
+select -ne :defaultShaderList1;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -s 2 ".s";
+select -ne :postProcessList1;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -s 2 ".p";
+select -ne :defaultRenderingList1;
+ setAttr -s 6 ".r";
+select -ne :renderGlobalsList1;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+select -ne :defaultRenderGlobals;
+ setAttr ".ep" 1;
+select -ne :defaultResolution;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -av ".w" 640;
+ setAttr -av ".h" 480;
+ setAttr -k on ".pa" 1;
+ setAttr -k on ".al";
+ setAttr -av ".dar" 1.3333332538604736;
+ setAttr -k on ".ldar";
+ setAttr -k on ".off";
+ setAttr -k on ".fld";
+ setAttr -k on ".zsl";
+select -ne :defaultLightSet;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -k on ".mwc";
+ setAttr ".ro" yes;
+select -ne :hardwareRenderGlobals;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr ".ctrs" 256;
+ setAttr ".btrs" 512;
+select -ne :hardwareRenderingGlobals;
+ setAttr ".otfna" -type "stringArray" 18 "NURBS Curves" "NURBS Surfaces" "Polygons" "Subdiv Surfaces" "Particles" "Fluids" "Image Planes" "UI:" "Lights" "Cameras" "Locators" "Joints" "IK Handles" "Deformers" "Motion Trails" "Components" "Misc. UI" "Ornaments" ;
+ setAttr ".otfva" -type "Int32Array" 18 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 ;
+select -ne :defaultHardwareRenderGlobals;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr ".fn" -type "string" "im";
+ setAttr ".res" -type "string" "ntsc_4d 646 485 1.333";
+select -ne :ikSystem;
+ setAttr -s 4 ".sol";
+connectAttr "lockedNode_translateZ.o" "srcSphereRN.phl[1]";
+connectAttr "srcSphere:sphere_testVectorX.o" "srcSphereRN.phl[2]";
+connectAttr "srcSphere:sphere_testVectorY.o" "srcSphereRN.phl[3]";
+connectAttr "srcSphere:sphere_testVectorZ.o" "srcSphereRN.phl[4]";
+connectAttr "srcSphere:sphere_testEnum.o" "srcSphereRN.phl[5]";
+connectAttr "srcSphere:sphere_testFloat.o" "srcSphereRN.phl[6]";
+connectAttr "srcSphere:sphere_testBoolean.o" "srcSphereRN.phl[7]";
+connectAttr "srcSphere:sphere_testInteger.o" "srcSphereRN.phl[8]";
+connectAttr "srcSphere:sphere_translateY.o" "srcSphereRN.phl[9]";
+connectAttr "srcSphere:sphere_translateX.o" "srcSphereRN.phl[10]";
+connectAttr "srcSphere:sphere_translateZ.o" "srcSphereRN.phl[11]";
+connectAttr "srcSphere:sphere_rotateX.o" "srcSphereRN.phl[12]";
+connectAttr "srcSphere:sphere_rotateZ.o" "srcSphereRN.phl[13]";
+connectAttr "srcSphere:sphere_scaleX.o" "srcSphereRN.phl[14]";
+connectAttr "srcSphere:sphere_scaleZ.o" "srcSphereRN.phl[15]";
+connectAttr "srcSphere:sphere_visibility.o" "srcSphereRN.phl[16]";
+relationship "link" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message";
+relationship "link" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message";
+relationship "shadowLink" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message";
+relationship "shadowLink" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message";
+connectAttr "layerManager.dli[0]" "defaultLayer.id";
+connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid";
+connectAttr "sharedReferenceNode.sr" "dstSphereRN.sr";
+connectAttr "defaultRenderLayer.msg" ":defaultRenderingList1.r" -na;
+// End of test_anim.ma
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.anim/animation.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.anim/animation.ma
new file mode 100644
index 0000000..8f9113a
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.anim/animation.ma
@@ -0,0 +1,29 @@
+//Maya ASCII 2016 scene
+//Name: animation.ma
+//Last modified: Tue, Aug 09, 2016 08:47:07 AM
+//Codeset: 1252
+requires maya "2016";
+currentUnit -l centimeter -a degree -t film;
+fileInfo "application" "maya";
+fileInfo "product" "Maya 2016";
+fileInfo "version" "2016";
+fileInfo "cutIdentifier" "201502261600-953408";
+fileInfo "osv" "Microsoft Windows 8 Business Edition, 64-bit (Build 9200)\n";
+createNode animCurveTU -n "CURVE1";
+ rename -uid "B3A2D98C-465C-F630-EA7F-7A960B6B0B4D";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 10;
+createNode animCurveTU -n "CURVE2";
+ rename -uid "3A3C753F-43CD-18A5-3E19-E9B3F445D832";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 10 ".ktv[0:9]" 1 8 2 8 3 8 4 8 5 8 6 8 7 8 8 8 9 8 10 8;
+ setAttr -s 10 ".kit[9]" 1;
+ setAttr -s 10 ".kot[0:9]" 1 18 18 18 18 18 18 18
+ 18 18;
+ setAttr -s 10 ".kix[9]" 1;
+ setAttr -s 10 ".kiy[9]" 0;
+ setAttr -s 10 ".kox[0:9]" 1 1 1 1 1 1 1 1 1 1;
+ setAttr -s 10 ".koy[0:9]" 0 0 0 0 0 0 0 0 0 0;
+// End
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.anim/animation.mb b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.anim/animation.mb
new file mode 100644
index 0000000..a5aefe6
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.anim/animation.mb differ
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.anim/pose.json b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.anim/pose.json
new file mode 100644
index 0000000..f747de5
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.anim/pose.json
@@ -0,0 +1,224 @@
+{
+ "metadata": {
+ "mayaSceneFile": "C:/Users/hovel/Dropbox/git/site-packages/studiolibrary/packages/mutils/tests/data/test_bake_connected.ma",
+ "angularUnit": "deg",
+ "ctime": "1518341545",
+ "endFrame": 10,
+ "linearUnit": "cm",
+ "version": "1.0.0",
+ "user": "Hovel",
+ "startFrame": 1,
+ "timeUnit": "film",
+ "mayaVersion": "2017"
+ }
+,
+ "objects": {
+ "srcSphere:offset": {
+ "attrs": {}
+ },
+ "srcSphere:group": {
+ "attrs": {
+ "translateX": {
+ "curve": "CURVE1",
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "translateY": {
+ "curve": "CURVE2",
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "translateZ": {
+ "curve": "CURVE3",
+ "type": "doubleLinear",
+ "value": 18.1320010846965
+ },
+ "scaleX": {
+ "type": "double",
+ "value": 1.0
+ },
+ "scaleY": {
+ "type": "double",
+ "value": 1.0
+ },
+ "visibility": {
+ "type": "bool",
+ "value": true
+ },
+ "rotateX": {
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "rotateY": {
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "rotateZ": {
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "scaleZ": {
+ "type": "double",
+ "value": 1.0
+ }
+ }
+ },
+ "srcSphere:sphere": {
+ "attrs": {
+ "testInteger": {
+ "curve": "CURVE5",
+ "type": "long",
+ "value": 5
+ },
+ "testProxy": {
+ "type": "double",
+ "value": 1.0
+ },
+ "scaleY": {
+ "type": "double",
+ "value": 4.66
+ },
+ "testLimit": {
+ "type": "double",
+ "value": 10.0
+ },
+ "testConnect": {
+ "curve": "CURVE6",
+ "type": "double",
+ "value": 8.0
+ },
+ "testEnum": {
+ "curve": "CURVE7",
+ "type": "enum",
+ "value": 1
+ },
+ "scaleX": {
+ "curve": "CURVE8",
+ "type": "double",
+ "value": 0.4295852781463779
+ },
+ "testString": {
+ "type": "string",
+ "value": "Hello world"
+ },
+ "scaleZ": {
+ "curve": "CURVE9",
+ "type": "double",
+ "value": 0.8591705562927558
+ },
+ "rotateX": {
+ "curve": "CURVE10",
+ "type": "doubleAngle",
+ "value": 30.81018202226841
+ },
+ "rotateY": {
+ "type": "doubleAngle",
+ "value": 50.0
+ },
+ "rotateZ": {
+ "curve": "CURVE11",
+ "type": "doubleAngle",
+ "value": 149.70880463068096
+ },
+ "translateX": {
+ "curve": "CURVE12",
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "translateY": {
+ "curve": "CURVE13",
+ "type": "doubleLinear",
+ "value": 8.0
+ },
+ "translateZ": {
+ "curve": "CURVE14",
+ "type": "doubleLinear",
+ "value": 11.214436147065292
+ },
+ "visibility": {
+ "curve": "CURVE15",
+ "type": "bool",
+ "value": true
+ },
+ "testFloat": {
+ "curve": "CURVE16",
+ "type": "double",
+ "value": 0.666
+ },
+ "testAnimated": {
+ "curve": "CURVE17",
+ "type": "double",
+ "value": 10.0
+ },
+ "testVectorX": {
+ "curve": "CURVE18",
+ "type": "double",
+ "value": 0.2
+ },
+ "testVectorY": {
+ "curve": "CURVE19",
+ "type": "double",
+ "value": 1.4
+ },
+ "testVectorZ": {
+ "curve": "CURVE20",
+ "type": "double",
+ "value": 2.6
+ },
+ "testBoolean": {
+ "curve": "CURVE21",
+ "type": "bool",
+ "value": true
+ }
+ }
+ },
+ "srcSphere:lockedNode": {
+ "attrs": {
+ "translateX": {
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "translateY": {
+ "type": "doubleLinear",
+ "value": 5.0
+ },
+ "translateZ": {
+ "curve": "CURVE23",
+ "type": "doubleLinear",
+ "value": 15.0
+ },
+ "scaleX": {
+ "type": "double",
+ "value": 1.0
+ },
+ "scaleY": {
+ "type": "double",
+ "value": 1.0
+ },
+ "visibility": {
+ "type": "bool",
+ "value": true
+ },
+ "rotateX": {
+ "curve": "CURVE24",
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "rotateY": {
+ "curve": "CURVE25",
+ "type": "doubleAngle",
+ "value": -69.84190849889626
+ },
+ "rotateZ": {
+ "curve": "CURVE26",
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "scaleZ": {
+ "type": "double",
+ "value": 1.0
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.ma
new file mode 100644
index 0000000..4a8ff16
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.ma
@@ -0,0 +1,636 @@
+//Maya ASCII 2013 scene
+//Name: test_bake_connections.ma
+//Last modified: Wed, Aug 20, 2014 02:40:58 PM
+//Codeset: UTF-8
+file -rdi 1 -ns "srcSphere" -rfn "srcSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma";
+file -rdi 1 -ns "dstSphere" -rfn "dstSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma";
+file -r -ns "srcSphere" -dr 1 -rfn "srcSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma";
+file -r -ns "dstSphere" -dr 1 -rfn "dstSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma";
+requires maya "2013";
+requires "stereoCamera" "10.0";
+currentUnit -l centimeter -a degree -t film;
+fileInfo "application" "maya";
+fileInfo "product" "Maya 2013";
+fileInfo "version" "2013 Service Pack 2P12 x64";
+fileInfo "cutIdentifier" "201304120319-868747";
+fileInfo "osv" "Linux 3.5.4-2.10-desktop #1 SMP PREEMPT Fri Oct 5 14:56:49 CEST 2012 x86_64";
+createNode transform -s -n "persp";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" 7.1985912106548611 102.16300347609724 -144.90732864886502 ;
+ setAttr ".r" -type "double3" -30.938352727397543 -178.19999999999578 0 ;
+createNode camera -s -n "perspShape" -p "persp";
+ setAttr -k off ".v" no;
+ setAttr ".fl" 34.999999999999993;
+ setAttr ".coi" 163.53638497594133;
+ setAttr ".imn" -type "string" "persp";
+ setAttr ".den" -type "string" "persp_depth";
+ setAttr ".man" -type "string" "persp_mask";
+ setAttr ".hc" -type "string" "viewSet -p %camera";
+createNode transform -s -n "top";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" 0 100.1 0 ;
+ setAttr ".r" -type "double3" -89.999999999999986 0 0 ;
+createNode camera -s -n "topShape" -p "top";
+ setAttr -k off ".v" no;
+ setAttr ".rnd" no;
+ setAttr ".coi" 100.1;
+ setAttr ".ow" 30;
+ setAttr ".imn" -type "string" "top";
+ setAttr ".den" -type "string" "top_depth";
+ setAttr ".man" -type "string" "top_mask";
+ setAttr ".hc" -type "string" "viewSet -t %camera";
+ setAttr ".o" yes;
+createNode transform -s -n "front";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" 2.0350096678112575 0.39361762628711539 100.1 ;
+createNode camera -s -n "frontShape" -p "front";
+ setAttr -k off ".v" no;
+ setAttr ".rnd" no;
+ setAttr ".coi" 100.1;
+ setAttr ".ow" 61.766282942468983;
+ setAttr ".imn" -type "string" "front";
+ setAttr ".den" -type "string" "front_depth";
+ setAttr ".man" -type "string" "front_mask";
+ setAttr ".hc" -type "string" "viewSet -f %camera";
+ setAttr ".o" yes;
+createNode transform -s -n "side";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" 100.1 0 0 ;
+ setAttr ".r" -type "double3" 0 89.999999999999986 0 ;
+createNode camera -s -n "sideShape" -p "side";
+ setAttr -k off ".v" no;
+ setAttr ".rnd" no;
+ setAttr ".coi" 100.1;
+ setAttr ".ow" 30;
+ setAttr ".imn" -type "string" "side";
+ setAttr ".den" -type "string" "side_depth";
+ setAttr ".man" -type "string" "side_mask";
+ setAttr ".hc" -type "string" "viewSet -s %camera";
+ setAttr ".o" yes;
+createNode transform -n "locator1";
+createNode locator -n "locatorShape1" -p "locator1";
+ setAttr -k off ".v";
+createNode transform -n "locator2";
+ setAttr ".t" -type "double3" 0 0 18.132001084696501 ;
+ setAttr ".s" -type "double3" 4.1257198596207596 4.1257198596207596 4.1257198596207596 ;
+createNode locator -n "locatorShape2" -p "locator2";
+ setAttr -k off ".v";
+createNode transform -n "srcSphereRNfosterParent1";
+createNode orientConstraint -n "lockedNode_orientConstraint1" -p "srcSphereRNfosterParent1";
+ addAttr -ci true -k true -sn "w0" -ln "locator1W0" -dv 1 -min 0 -at "double";
+ setAttr -k on ".nds";
+ setAttr -k off ".v";
+ setAttr -k off ".tx";
+ setAttr -k off ".ty";
+ setAttr -k off ".tz";
+ setAttr -k off ".rx";
+ setAttr -k off ".ry";
+ setAttr -k off ".rz";
+ setAttr -k off ".sx";
+ setAttr -k off ".sy";
+ setAttr -k off ".sz";
+ setAttr ".erp" yes;
+ setAttr ".lr" -type "double3" 0 -69.84190849889626 0 ;
+ setAttr -k on ".w0";
+createNode lightLinker -s -n "lightLinker1";
+ setAttr -s 2 ".lnk";
+ setAttr -s 2 ".slnk";
+createNode displayLayerManager -n "layerManager";
+createNode displayLayer -n "defaultLayer";
+createNode renderLayerManager -n "renderLayerManager";
+createNode renderLayer -n "defaultRenderLayer";
+ setAttr ".g" yes;
+createNode script -n "sceneConfigurationScriptNode";
+ setAttr ".b" -type "string" "playbackOptions -min 1 -max 24 -ast 1 -aet 48 ";
+ setAttr ".st" 6;
+createNode reference -n "srcSphereRN";
+ setAttr -s 22 ".phl";
+ setAttr ".phl[1]" 0;
+ setAttr ".phl[2]" 0;
+ setAttr ".phl[3]" 0;
+ setAttr ".phl[4]" 0;
+ setAttr ".phl[5]" 0;
+ setAttr ".phl[6]" 0;
+ setAttr ".phl[7]" 0;
+ setAttr ".phl[8]" 0;
+ setAttr ".phl[9]" 0;
+ setAttr ".phl[10]" 0;
+ setAttr ".phl[11]" 0;
+ setAttr ".phl[12]" 0;
+ setAttr ".phl[13]" 0;
+ setAttr ".phl[14]" 0;
+ setAttr ".phl[15]" 0;
+ setAttr ".phl[16]" 0;
+ setAttr ".phl[17]" 0;
+ setAttr ".phl[18]" 0;
+ setAttr ".phl[19]" 0;
+ setAttr ".phl[20]" 0;
+ setAttr ".phl[21]" 0;
+ setAttr ".phl[22]" 0;
+ setAttr ".ed" -type "dataReferenceEdits"
+ "srcSphereRN"
+ "srcSphereRN" 0
+ "srcSphereRN" 50
+ 0 "|srcSphereRNfosterParent1|lockedNode_orientConstraint1" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode"
+ "-s -r "
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "visibility" " 1"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translate" " -type \"double3\" 0 5 15"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translateX" " -av"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translateY" " -av"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translateZ" " -av"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotate" " -type \"double3\" 0 -69.841908 0"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotateX" " -av"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotateY" " -av"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotateZ" " -av"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "scale" " -type \"double3\" 1 1 1"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "translate" " -type \"double3\" 0 8 11.214436"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "translateZ" " -av"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "rotate" " -type \"double3\" 30.810182 50 149.708805"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "rotateX" " -av"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "rotateY" " -av"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "rotateZ" " -av"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "scale" " -type \"double3\" 0.429585 4.66 0.859171"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "scaleX" " -av"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "scaleY" " -av"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "scaleZ" " -av"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testVector" " -k 1 -type \"double3\" 0.2 1.4 2.6"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testVector" " -k 1"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testVectorX" " -k 1"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testVectorY" " -av -k 1"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testVectorZ" " -k 1"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testColor" " -type \"float3\" 0.18 0.6 0.18"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testString" " -k 1 -type \"string\" \"Hello world\""
+ 5 4 "srcSphereRN" "|srcSphere:group.translate" "srcSphereRN.placeHolderList[1]"
+ ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode.translateZ"
+ "srcSphereRN.placeHolderList[2]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode.rotateX"
+ "srcSphereRN.placeHolderList[3]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode.rotateY"
+ "srcSphereRN.placeHolderList[4]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode.rotateZ"
+ "srcSphereRN.placeHolderList[5]" ""
+ 5 3 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode.rotateOrder"
+ "srcSphereRN.placeHolderList[6]" ""
+ 5 3 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode.parentInverseMatrix"
+ "srcSphereRN.placeHolderList[7]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testVectorX"
+ "srcSphereRN.placeHolderList[8]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testVectorY"
+ "srcSphereRN.placeHolderList[9]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testVectorZ"
+ "srcSphereRN.placeHolderList[10]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testEnum"
+ "srcSphereRN.placeHolderList[11]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testFloat"
+ "srcSphereRN.placeHolderList[12]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testBoolean"
+ "srcSphereRN.placeHolderList[13]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testInteger"
+ "srcSphereRN.placeHolderList[14]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.translateY"
+ "srcSphereRN.placeHolderList[15]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.translateX"
+ "srcSphereRN.placeHolderList[16]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.translateZ"
+ "srcSphereRN.placeHolderList[17]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.rotateX"
+ "srcSphereRN.placeHolderList[18]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.rotateZ"
+ "srcSphereRN.placeHolderList[19]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.scaleX"
+ "srcSphereRN.placeHolderList[20]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.scaleZ"
+ "srcSphereRN.placeHolderList[21]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.visibility"
+ "srcSphereRN.placeHolderList[22]" "";
+ setAttr ".ptag" -type "string" "";
+lockNode -l 1 ;
+createNode reference -n "dstSphereRN";
+ setAttr ".ed" -type "dataReferenceEdits"
+ "dstSphereRN"
+ "dstSphereRN" 0;
+ setAttr ".ptag" -type "string" "";
+lockNode -l 1 ;
+createNode animCurveTU -n "srcSphere:sphere_visibility";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTL -n "srcSphere:sphere_translateX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 0;
+createNode animCurveTL -n "srcSphere:sphere_translateY";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 8 10 8;
+createNode animCurveTL -n "srcSphere:sphere_translateZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292;
+createNode animCurveTA -n "srcSphere:sphere_rotateX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841;
+createNode animCurveTA -n "srcSphere:sphere_rotateZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096;
+createNode animCurveTU -n "srcSphere:sphere_scaleX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792;
+createNode animCurveTU -n "srcSphere:sphere_scaleZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585;
+createNode animCurveTU -n "srcSphere:sphere_testVectorX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2;
+createNode animCurveTU -n "srcSphere:sphere_testVectorY";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4;
+createNode animCurveTU -n "srcSphere:sphere_testVectorZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6;
+createNode animCurveTU -n "srcSphere:sphere_testEnum";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTU -n "srcSphere:sphere_testFloat";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666;
+createNode animCurveTU -n "srcSphere:sphere_testBoolean";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTU -n "srcSphere:sphere_testInteger";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 5 10 5;
+createNode animCurveTL -n "dstSphere:sphere_translateY";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 8 10 8;
+createNode animCurveTL -n "lockedNode_translateZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 15;
+createNode animCurveTU -n "sphere_testInteger";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 5 10 5;
+createNode animCurveTU -n "sphere_testEnum";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTL -n "sphere_translateX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 0;
+createNode animCurveTL -n "sphere_translateZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292;
+createNode animCurveTU -n "sphere_testFloat";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666;
+createNode animCurveTU -n "sphere_scaleX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792;
+createNode animCurveTU -n "sphere_testVectorZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6;
+createNode animCurveTU -n "sphere_scaleZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585;
+createNode animCurveTA -n "sphere_rotateX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841;
+createNode animCurveTU -n "sphere_testVectorY";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4;
+createNode animCurveTA -n "sphere_rotateZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096;
+createNode animCurveTU -n "sphere_visibility";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTU -n "sphere_testVectorX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2;
+createNode animCurveTU -n "sphere_testBoolean";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTL -n "lockedNode_translateZ1";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 15;
+createNode reference -n "sharedReferenceNode";
+ setAttr ".ed" -type "dataReferenceEdits"
+ "sharedReferenceNode";
+createNode animCurveTU -n "locator1_visibility";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 5 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTL -n "locator1_translateX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 5 11.661339872825151 10 11.661339872825151;
+createNode animCurveTL -n "locator1_translateY";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 5 13.237957579056641 10 13.237957579056641;
+createNode animCurveTL -n "locator1_translateZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 5 11.944644232286457 10 11.944644232286457;
+createNode animCurveTA -n "locator1_rotateX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 5 0 10 0;
+createNode animCurveTA -n "locator1_rotateY";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 5 0 10 -69.84190849889626;
+createNode animCurveTA -n "locator1_rotateZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 5 0 10 0;
+createNode animCurveTU -n "locator1_scaleX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 5 4.0680107858594825 10 4.0680107858594825;
+createNode animCurveTU -n "locator1_scaleY";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 5 4.0680107858594825 10 4.0680107858594825;
+createNode animCurveTU -n "locator1_scaleZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 5 4.0680107858594825 10 4.0680107858594825;
+select -ne :time1;
+ setAttr -av -k on ".cch";
+ setAttr -cb on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr -k on ".o" 13;
+ setAttr -k on ".unw" 13;
+ setAttr -k on ".etw";
+ setAttr -k on ".tps";
+ setAttr -k on ".tms";
+lockNode -l 1 ;
+select -ne :renderPartition;
+ setAttr -k on ".cch";
+ setAttr -cb on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr -s 2 ".st";
+ setAttr -cb on ".an";
+ setAttr -cb on ".pt";
+lockNode -l 1 ;
+select -ne :initialShadingGroup;
+ setAttr -k on ".cch";
+ setAttr -cb on ".ihi";
+ setAttr -av -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr -s 2 ".dsm";
+ setAttr -k on ".mwc";
+ setAttr -cb on ".an";
+ setAttr -cb on ".il";
+ setAttr -cb on ".vo";
+ setAttr -cb on ".eo";
+ setAttr -cb on ".fo";
+ setAttr -cb on ".epo";
+ setAttr -k on ".ro" yes;
+lockNode -l 1 ;
+select -ne :initialParticleSE;
+ setAttr -av -k on ".cch";
+ setAttr -cb on ".ihi";
+ setAttr -av -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr -k on ".mwc";
+ setAttr -cb on ".an";
+ setAttr -cb on ".il";
+ setAttr -cb on ".vo";
+ setAttr -cb on ".eo";
+ setAttr -cb on ".fo";
+ setAttr -cb on ".epo";
+ setAttr -k on ".ro" yes;
+select -ne :defaultShaderList1;
+ setAttr -k on ".cch";
+ setAttr -cb on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr -s 2 ".s";
+select -ne :postProcessList1;
+ setAttr -k on ".cch";
+ setAttr -cb on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr -s 2 ".p";
+select -ne :defaultRenderingList1;
+ setAttr -s 6 ".r";
+select -ne :renderGlobalsList1;
+ setAttr -k on ".cch";
+ setAttr -cb on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -cb on ".bnm";
+select -ne :defaultResolution;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -av ".w";
+ setAttr -av ".h";
+ setAttr -k on ".pa" 1;
+ setAttr -k on ".al";
+ setAttr -av ".dar";
+ setAttr -k on ".ldar";
+ setAttr -k on ".off";
+ setAttr -k on ".fld";
+ setAttr -k on ".zsl";
+select -ne :defaultLightSet;
+ setAttr -k on ".cch";
+ setAttr -k on ".ihi";
+ setAttr -av -k on ".nds";
+ setAttr -k on ".bnm";
+ setAttr -k on ".mwc";
+ setAttr -k on ".an";
+ setAttr -k on ".il";
+ setAttr -k on ".vo";
+ setAttr -k on ".eo";
+ setAttr -k on ".fo";
+ setAttr -k on ".epo";
+ setAttr -k on ".ro" yes;
+select -ne :defaultObjectSet;
+ setAttr ".ro" yes;
+lockNode -l 1 ;
+select -ne :hardwareRenderGlobals;
+ setAttr -k on ".cch";
+ setAttr -cb on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr ".ctrs" 256;
+ setAttr ".btrs" 512;
+ setAttr -k off ".fbfm";
+ setAttr -k off -cb on ".ehql";
+ setAttr -k off -cb on ".eams";
+ setAttr -k off -cb on ".eeaa";
+ setAttr -k off -cb on ".engm";
+ setAttr -k off -cb on ".mes";
+ setAttr -k off -cb on ".emb";
+ setAttr -av -k off -cb on ".mbbf";
+ setAttr -k off -cb on ".mbs";
+ setAttr -k off -cb on ".trm";
+ setAttr -k off -cb on ".tshc";
+ setAttr -k off ".enpt";
+ setAttr -k off -cb on ".clmt";
+ setAttr -k off -cb on ".tcov";
+ setAttr -k off -cb on ".lith";
+ setAttr -k off -cb on ".sobc";
+ setAttr -k off -cb on ".cuth";
+ setAttr -k off -cb on ".hgcd";
+ setAttr -k off -cb on ".hgci";
+ setAttr -k off -cb on ".mgcs";
+ setAttr -k off -cb on ".twa";
+ setAttr -k off -cb on ".twz";
+ setAttr -k on ".hwcc";
+ setAttr -k on ".hwdp";
+ setAttr -k on ".hwql";
+ setAttr -k on ".hwfr";
+select -ne :hardwareRenderingGlobals;
+ setAttr ".otfna" -type "stringArray" 18 "NURBS Curves" "NURBS Surfaces" "Polygons" "Subdiv Surfaces" "Particles" "Fluids" "Image Planes" "UI:" "Lights" "Cameras" "Locators" "Joints" "IK Handles" "Deformers" "Motion Trails" "Components" "Misc. UI" "Ornaments" ;
+ setAttr ".otfva" -type "Int32Array" 18 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 ;
+select -ne :defaultHardwareRenderGlobals;
+ setAttr -k on ".cch";
+ setAttr -cb on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr -av -k on ".rp";
+ setAttr -k on ".cai";
+ setAttr -k on ".coi";
+ setAttr -cb on ".bc";
+ setAttr -av -k on ".bcb";
+ setAttr -av -k on ".bcg";
+ setAttr -av -k on ".bcr";
+ setAttr -k on ".ei";
+ setAttr -k on ".ex";
+ setAttr -av -k on ".es";
+ setAttr -av -k on ".ef";
+ setAttr -av -k on ".bf";
+ setAttr -k on ".fii";
+ setAttr -av -k on ".sf";
+ setAttr -k on ".gr";
+ setAttr -k on ".li";
+ setAttr -k on ".ls";
+ setAttr -k on ".mb";
+ setAttr -k on ".ti";
+ setAttr -k on ".txt";
+ setAttr -k on ".mpr";
+ setAttr -k on ".wzd";
+ setAttr ".fn" -type "string" "im";
+ setAttr -k on ".if";
+ setAttr ".res" -type "string" "ntsc_4d 646 485 1.333";
+ setAttr -k on ".as";
+ setAttr -k on ".ds";
+ setAttr -k on ".lm";
+ setAttr -k on ".fir";
+ setAttr -k on ".aap";
+ setAttr -k on ".gh";
+ setAttr -cb on ".sd";
+lockNode -l 1 ;
+connectAttr "locator2.t" "srcSphereRN.phl[1]";
+connectAttr "lockedNode_translateZ.o" "srcSphereRN.phl[2]";
+connectAttr "lockedNode_orientConstraint1.crx" "srcSphereRN.phl[3]";
+connectAttr "lockedNode_orientConstraint1.cry" "srcSphereRN.phl[4]";
+connectAttr "lockedNode_orientConstraint1.crz" "srcSphereRN.phl[5]";
+connectAttr "srcSphereRN.phl[6]" "lockedNode_orientConstraint1.cro";
+connectAttr "srcSphereRN.phl[7]" "lockedNode_orientConstraint1.cpim";
+connectAttr "srcSphere:sphere_testVectorX.o" "srcSphereRN.phl[8]";
+connectAttr "srcSphere:sphere_testVectorY.o" "srcSphereRN.phl[9]";
+connectAttr "srcSphere:sphere_testVectorZ.o" "srcSphereRN.phl[10]";
+connectAttr "srcSphere:sphere_testEnum.o" "srcSphereRN.phl[11]";
+connectAttr "srcSphere:sphere_testFloat.o" "srcSphereRN.phl[12]";
+connectAttr "srcSphere:sphere_testBoolean.o" "srcSphereRN.phl[13]";
+connectAttr "srcSphere:sphere_testInteger.o" "srcSphereRN.phl[14]";
+connectAttr "srcSphere:sphere_translateY.o" "srcSphereRN.phl[15]";
+connectAttr "srcSphere:sphere_translateX.o" "srcSphereRN.phl[16]";
+connectAttr "srcSphere:sphere_translateZ.o" "srcSphereRN.phl[17]";
+connectAttr "srcSphere:sphere_rotateX.o" "srcSphereRN.phl[18]";
+connectAttr "srcSphere:sphere_rotateZ.o" "srcSphereRN.phl[19]";
+connectAttr "srcSphere:sphere_scaleX.o" "srcSphereRN.phl[20]";
+connectAttr "srcSphere:sphere_scaleZ.o" "srcSphereRN.phl[21]";
+connectAttr "srcSphere:sphere_visibility.o" "srcSphereRN.phl[22]";
+connectAttr "locator1_rotateX.o" "locator1.rx";
+connectAttr "locator1_rotateY.o" "locator1.ry";
+connectAttr "locator1_rotateZ.o" "locator1.rz";
+connectAttr "locator1_visibility.o" "locator1.v";
+connectAttr "locator1_translateX.o" "locator1.tx";
+connectAttr "locator1_translateY.o" "locator1.ty";
+connectAttr "locator1_translateZ.o" "locator1.tz";
+connectAttr "locator1_scaleX.o" "locator1.sx";
+connectAttr "locator1_scaleY.o" "locator1.sy";
+connectAttr "locator1_scaleZ.o" "locator1.sz";
+connectAttr "locator1.r" "lockedNode_orientConstraint1.tg[0].tr";
+connectAttr "locator1.ro" "lockedNode_orientConstraint1.tg[0].tro";
+connectAttr "locator1.pm" "lockedNode_orientConstraint1.tg[0].tpm";
+connectAttr "lockedNode_orientConstraint1.w0" "lockedNode_orientConstraint1.tg[0].tw"
+ ;
+relationship "link" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message";
+relationship "link" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message";
+relationship "shadowLink" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message";
+relationship "shadowLink" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message";
+connectAttr "layerManager.dli[0]" "defaultLayer.id";
+connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid";
+connectAttr "srcSphereRNfosterParent1.msg" "srcSphereRN.fp";
+connectAttr "sharedReferenceNode.sr" "dstSphereRN.sr";
+connectAttr "defaultRenderLayer.msg" ":defaultRenderingList1.r" -na;
+// End of test_bake_connections.ma
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_insert.anim/animation.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_insert.anim/animation.ma
new file mode 100644
index 0000000..1ad6589
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_insert.anim/animation.ma
@@ -0,0 +1,100 @@
+//Maya ASCII 2016 scene
+//Name: animation.ma
+//Last modified: Tue, Aug 09, 2016 08:47:07 AM
+//Codeset: 1252
+requires maya "2016";
+currentUnit -l centimeter -a degree -t film;
+fileInfo "application" "maya";
+fileInfo "product" "Maya 2016";
+fileInfo "version" "2016";
+fileInfo "cutIdentifier" "201502261600-953408";
+fileInfo "osv" "Microsoft Windows 8 Business Edition, 64-bit (Build 9200)\n";
+createNode animCurveTU -n "CURVE1";
+ rename -uid "B4FA69EE-4158-445F-5AB5-769D92B60EE3";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 5 10 5;
+createNode animCurveTU -n "CURVE2";
+ rename -uid "CA0863B5-4680-36D0-E9A3-83A0A33EC51B";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTU -n "CURVE3";
+ rename -uid "436929BD-4536-FD91-F836-FA9961D739F5";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792;
+createNode animCurveTU -n "CURVE4";
+ rename -uid "9E217B7B-4585-8318-49F7-249A1ACBA95B";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585;
+createNode animCurveTA -n "CURVE5";
+ rename -uid "5649AD20-440E-7866-8CAB-B08834F07905";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841;
+createNode animCurveTA -n "CURVE6";
+ rename -uid "19E0B15E-449C-F085-5151-10BFD6772FE1";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096;
+createNode animCurveTL -n "CURVE7";
+ rename -uid "1FE3DC07-4819-A244-0BC3-B8A3B3EF1275";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 0;
+createNode animCurveTL -n "CURVE8";
+ rename -uid "00984994-4BA2-5907-9C38-D1BE8279B667";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 8 10 8;
+createNode animCurveTL -n "CURVE9";
+ rename -uid "40524ED9-44E0-043B-4F9E-00ABB81FF2FA";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292;
+createNode animCurveTU -n "CURVE10";
+ rename -uid "240A5025-4AA3-D27B-CBD9-3D98E97E7B2A";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTU -n "CURVE11";
+ rename -uid "4541CB45-4FD7-656E-2626-0394702423B3";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666;
+createNode animCurveTU -n "CURVE12";
+ rename -uid "55FC02E9-4D2D-FF69-A838-978CC1CA83B4";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 10;
+createNode animCurveTU -n "CURVE13";
+ rename -uid "CBF4DD9D-4839-361A-70F2-6990E98D9C30";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2;
+createNode animCurveTU -n "CURVE14";
+ rename -uid "1A7FD955-44FC-DA80-17C8-F8B2936C2A64";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4;
+createNode animCurveTU -n "CURVE15";
+ rename -uid "3F957170-4D7E-FD98-8F3E-6086609AB97F";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6;
+createNode animCurveTU -n "CURVE16";
+ rename -uid "2EC19608-4057-B2F8-7796-27BB84CC1532";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTL -n "CURVE18";
+ rename -uid "75AC48FC-4740-40A9-B0B6-AFB0FB0FAD85";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 15;
+// End
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_insert.anim/animation.mb b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_insert.anim/animation.mb
new file mode 100644
index 0000000..0f9ee74
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_insert.anim/animation.mb differ
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_insert.anim/pose.json b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_insert.anim/pose.json
new file mode 100644
index 0000000..a87bacc
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_insert.anim/pose.json
@@ -0,0 +1,177 @@
+{
+ "metadata": {
+ "mayaSceneFile": "C:/Users/hovel/Dropbox/git/site-packages/studiolibrary/packages/mutils/tests/data/test_anim.ma",
+ "angularUnit": "deg",
+ "ctime": "1518341545",
+ "endFrame": 10,
+ "linearUnit": "cm",
+ "version": "1.0.0",
+ "user": "Hovel",
+ "startFrame": 1,
+ "timeUnit": "film",
+ "mayaVersion": "2017"
+ }
+,
+ "objects": {
+ "srcSphere:offset": {
+ "attrs": {}
+ },
+ "srcSphere:sphere": {
+ "attrs": {
+ "testInteger": {
+ "curve": "CURVE1",
+ "type": "long",
+ "value": 5
+ },
+ "testProxy": {
+ "type": "double",
+ "value": 1.0
+ },
+ "scaleY": {
+ "type": "double",
+ "value": 4.66
+ },
+ "testLimit": {
+ "type": "double",
+ "value": 10.0
+ },
+ "testConnect": {
+ "type": "double",
+ "value": 8.0
+ },
+ "testEnum": {
+ "curve": "CURVE2",
+ "type": "enum",
+ "value": 1
+ },
+ "scaleX": {
+ "curve": "CURVE3",
+ "type": "double",
+ "value": 0.25
+ },
+ "testString": {
+ "type": "string",
+ "value": "Hello world"
+ },
+ "scaleZ": {
+ "curve": "CURVE4",
+ "type": "double",
+ "value": 0.5
+ },
+ "rotateX": {
+ "curve": "CURVE5",
+ "type": "doubleAngle",
+ "value": 45.0
+ },
+ "rotateY": {
+ "type": "doubleAngle",
+ "value": 50.0
+ },
+ "rotateZ": {
+ "curve": "CURVE6",
+ "type": "doubleAngle",
+ "value": 90.0
+ },
+ "testStatic": {
+ "type": "double",
+ "value": 0.0
+ },
+ "translateX": {
+ "curve": "CURVE7",
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "translateY": {
+ "curve": "CURVE8",
+ "type": "doubleLinear",
+ "value": 8.0
+ },
+ "translateZ": {
+ "curve": "CURVE9",
+ "type": "doubleLinear",
+ "value": -12.0
+ },
+ "visibility": {
+ "curve": "CURVE10",
+ "type": "bool",
+ "value": true
+ },
+ "testFloat": {
+ "curve": "CURVE11",
+ "type": "double",
+ "value": 0.666
+ },
+ "testAnimated": {
+ "curve": "CURVE12",
+ "type": "double",
+ "value": 0.0
+ },
+ "testVectorX": {
+ "curve": "CURVE13",
+ "type": "double",
+ "value": 0.2
+ },
+ "testVectorY": {
+ "curve": "CURVE14",
+ "type": "double",
+ "value": 1.4
+ },
+ "testVectorZ": {
+ "curve": "CURVE15",
+ "type": "double",
+ "value": 2.6
+ },
+ "testBoolean": {
+ "curve": "CURVE16",
+ "type": "bool",
+ "value": true
+ }
+ }
+ },
+ "srcSphere:lockedNode": {
+ "attrs": {
+ "translateX": {
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "translateY": {
+ "type": "doubleLinear",
+ "value": 5.0
+ },
+ "translateZ": {
+ "curve": "CURVE18",
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "scaleX": {
+ "type": "double",
+ "value": 1.0
+ },
+ "scaleY": {
+ "type": "double",
+ "value": 1.0
+ },
+ "visibility": {
+ "type": "bool",
+ "value": true
+ },
+ "rotateX": {
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "rotateY": {
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "rotateZ": {
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "scaleZ": {
+ "type": "double",
+ "value": 1.0
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace.anim/animation.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace.anim/animation.ma
new file mode 100644
index 0000000..e72ea48
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace.anim/animation.ma
@@ -0,0 +1,100 @@
+//Maya ASCII 2016 scene
+//Name: animation.ma
+//Last modified: Tue, Aug 09, 2016 08:47:07 AM
+//Codeset: 1252
+requires maya "2016";
+currentUnit -l centimeter -a degree -t film;
+fileInfo "application" "maya";
+fileInfo "product" "Maya 2016";
+fileInfo "version" "2016";
+fileInfo "cutIdentifier" "201502261600-953408";
+fileInfo "osv" "Microsoft Windows 8 Business Edition, 64-bit (Build 9200)\n";
+createNode animCurveTU -n "CURVE1";
+ rename -uid "44F21FB5-4121-8FAA-4E5A-2795D8DB1C98";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 5 10 5;
+createNode animCurveTU -n "CURVE2";
+ rename -uid "89D65122-4A81-C08C-8F60-A8A69D8BDDFF";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTU -n "CURVE3";
+ rename -uid "394F9F8B-44A0-7AEE-3FF8-43BE62C0DDC8";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792;
+createNode animCurveTU -n "CURVE4";
+ rename -uid "CF90746B-43BD-0210-E0FC-05A5368FC36F";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585;
+createNode animCurveTA -n "CURVE5";
+ rename -uid "C88B0183-4A49-7472-1F9B-75861AB915A8";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841;
+createNode animCurveTA -n "CURVE6";
+ rename -uid "70CBACAA-40C4-7C42-B9F5-0BB67E97595D";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096;
+createNode animCurveTL -n "CURVE7";
+ rename -uid "9A9A4A91-42EF-2651-3696-91ACC6F098B6";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 0;
+createNode animCurveTL -n "CURVE8";
+ rename -uid "CBDCAEFF-4D9E-5162-0CAC-7C8CE46E91F2";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 8 10 8;
+createNode animCurveTL -n "CURVE9";
+ rename -uid "B745DFCE-4739-96FC-C827-1494F35ED50D";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292;
+createNode animCurveTU -n "CURVE10";
+ rename -uid "0A53795D-45F0-B3C3-E5F2-AAB7665A9E8E";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTU -n "CURVE11";
+ rename -uid "7DC24CA9-48A1-3B3A-8278-5A81D70CA4E9";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666;
+createNode animCurveTU -n "CURVE12";
+ rename -uid "400DED74-4D52-543D-91D4-0881D938C5C9";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 10;
+createNode animCurveTU -n "CURVE13";
+ rename -uid "5527A666-49BE-9277-3936-12B07312A901";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2;
+createNode animCurveTU -n "CURVE14";
+ rename -uid "DF0B2F0E-49A4-61C0-521D-0A8497BF2753";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4;
+createNode animCurveTU -n "CURVE15";
+ rename -uid "20CAFE14-4EBD-6A5D-458C-5B82383EC0F2";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6;
+createNode animCurveTU -n "CURVE16";
+ rename -uid "7996F54C-49E2-85E5-D444-CBB553D75344";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTL -n "CURVE18";
+ rename -uid "C516D5DD-4FA0-4AEC-8E33-0ABF26EF9D60";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 15;
+// End
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace.anim/animation.mb b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace.anim/animation.mb
new file mode 100644
index 0000000..8a44ea5
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace.anim/animation.mb differ
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace.anim/pose.json b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace.anim/pose.json
new file mode 100644
index 0000000..27d9c5a
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace.anim/pose.json
@@ -0,0 +1,177 @@
+{
+ "metadata": {
+ "mayaSceneFile": "C:/Users/hovel/Dropbox/git/site-packages/studiolibrary/packages/mutils/tests/data/test_anim.ma",
+ "angularUnit": "deg",
+ "ctime": "1518341546",
+ "endFrame": 10,
+ "linearUnit": "cm",
+ "version": "1.0.0",
+ "user": "Hovel",
+ "startFrame": 1,
+ "timeUnit": "film",
+ "mayaVersion": "2017"
+ }
+,
+ "objects": {
+ "srcSphere:offset": {
+ "attrs": {}
+ },
+ "srcSphere:sphere": {
+ "attrs": {
+ "testInteger": {
+ "curve": "CURVE1",
+ "type": "long",
+ "value": 5
+ },
+ "testProxy": {
+ "type": "double",
+ "value": 1.0
+ },
+ "scaleY": {
+ "type": "double",
+ "value": 4.66
+ },
+ "testLimit": {
+ "type": "double",
+ "value": 10.0
+ },
+ "testConnect": {
+ "type": "double",
+ "value": 8.0
+ },
+ "testEnum": {
+ "curve": "CURVE2",
+ "type": "enum",
+ "value": 1
+ },
+ "scaleX": {
+ "curve": "CURVE3",
+ "type": "double",
+ "value": 0.25
+ },
+ "testString": {
+ "type": "string",
+ "value": "Hello world"
+ },
+ "scaleZ": {
+ "curve": "CURVE4",
+ "type": "double",
+ "value": 0.5
+ },
+ "rotateX": {
+ "curve": "CURVE5",
+ "type": "doubleAngle",
+ "value": 45.0
+ },
+ "rotateY": {
+ "type": "doubleAngle",
+ "value": 50.0
+ },
+ "rotateZ": {
+ "curve": "CURVE6",
+ "type": "doubleAngle",
+ "value": 90.0
+ },
+ "testStatic": {
+ "type": "double",
+ "value": 0.0
+ },
+ "translateX": {
+ "curve": "CURVE7",
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "translateY": {
+ "curve": "CURVE8",
+ "type": "doubleLinear",
+ "value": 8.0
+ },
+ "translateZ": {
+ "curve": "CURVE9",
+ "type": "doubleLinear",
+ "value": -12.0
+ },
+ "visibility": {
+ "curve": "CURVE10",
+ "type": "bool",
+ "value": true
+ },
+ "testFloat": {
+ "curve": "CURVE11",
+ "type": "double",
+ "value": 0.666
+ },
+ "testAnimated": {
+ "curve": "CURVE12",
+ "type": "double",
+ "value": 0.0
+ },
+ "testVectorX": {
+ "curve": "CURVE13",
+ "type": "double",
+ "value": 0.2
+ },
+ "testVectorY": {
+ "curve": "CURVE14",
+ "type": "double",
+ "value": 1.4
+ },
+ "testVectorZ": {
+ "curve": "CURVE15",
+ "type": "double",
+ "value": 2.6
+ },
+ "testBoolean": {
+ "curve": "CURVE16",
+ "type": "bool",
+ "value": true
+ }
+ }
+ },
+ "srcSphere:lockedNode": {
+ "attrs": {
+ "translateX": {
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "translateY": {
+ "type": "doubleLinear",
+ "value": 5.0
+ },
+ "translateZ": {
+ "curve": "CURVE18",
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "scaleX": {
+ "type": "double",
+ "value": 1.0
+ },
+ "scaleY": {
+ "type": "double",
+ "value": 1.0
+ },
+ "visibility": {
+ "type": "bool",
+ "value": true
+ },
+ "rotateX": {
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "rotateY": {
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "rotateZ": {
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "scaleZ": {
+ "type": "double",
+ "value": 1.0
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace_completely.anim/animation.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace_completely.anim/animation.ma
new file mode 100644
index 0000000..d6c6694
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace_completely.anim/animation.ma
@@ -0,0 +1,100 @@
+//Maya ASCII 2016 scene
+//Name: animation.ma
+//Last modified: Tue, Aug 09, 2016 08:47:08 AM
+//Codeset: 1252
+requires maya "2016";
+currentUnit -l centimeter -a degree -t film;
+fileInfo "application" "maya";
+fileInfo "product" "Maya 2016";
+fileInfo "version" "2016";
+fileInfo "cutIdentifier" "201502261600-953408";
+fileInfo "osv" "Microsoft Windows 8 Business Edition, 64-bit (Build 9200)\n";
+createNode animCurveTU -n "CURVE1";
+ rename -uid "07400D46-41EF-56B5-ABE2-FCB3FDC705F2";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 5 10 5;
+createNode animCurveTU -n "CURVE2";
+ rename -uid "E2B997BA-4A97-2EF7-C65E-E7BD483688D6";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTU -n "CURVE3";
+ rename -uid "2AF61E8F-4817-A910-3417-6B9823CED36D";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792;
+createNode animCurveTU -n "CURVE4";
+ rename -uid "61ED901E-4BFA-A417-6F1A-A89854BAE1F9";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585;
+createNode animCurveTA -n "CURVE5";
+ rename -uid "25E543E0-4233-B654-6DC2-C980CC9ED600";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841;
+createNode animCurveTA -n "CURVE6";
+ rename -uid "3921DD56-44E6-E6D7-DB1B-C28209F3157E";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096;
+createNode animCurveTL -n "CURVE7";
+ rename -uid "5EE5D458-498D-AD10-196B-0F99DE4A9F97";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 0;
+createNode animCurveTL -n "CURVE8";
+ rename -uid "81FBC4EF-479F-58C1-D24D-859C16E01BA1";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 8 10 8;
+createNode animCurveTL -n "CURVE9";
+ rename -uid "898B5C26-448D-366F-0E63-5082268110FB";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292;
+createNode animCurveTU -n "CURVE10";
+ rename -uid "139725A4-4C9A-C99F-2E9F-AF91BC3F67E9";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTU -n "CURVE11";
+ rename -uid "1A5281F1-4252-087B-1631-9998C170D33B";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666;
+createNode animCurveTU -n "CURVE12";
+ rename -uid "3B543491-429F-763A-0075-4EB85B2E50AB";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 10;
+createNode animCurveTU -n "CURVE13";
+ rename -uid "8532CE01-49F8-571C-2D65-A98F3427EBF0";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2;
+createNode animCurveTU -n "CURVE14";
+ rename -uid "D9767D2E-4DFC-F089-183D-789D8B697CF1";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4;
+createNode animCurveTU -n "CURVE15";
+ rename -uid "73706920-4309-DAEE-AE70-CAAF4C1D68FB";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6;
+createNode animCurveTU -n "CURVE16";
+ rename -uid "70D851D4-43F8-72F5-0327-E28AEB0F174C";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTL -n "CURVE18";
+ rename -uid "716232B6-4903-7906-472A-569BBA3146DA";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 15;
+// End
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace_completely.anim/animation.mb b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace_completely.anim/animation.mb
new file mode 100644
index 0000000..41261dd
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace_completely.anim/animation.mb differ
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace_completely.anim/pose.json b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace_completely.anim/pose.json
new file mode 100644
index 0000000..27d9c5a
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace_completely.anim/pose.json
@@ -0,0 +1,177 @@
+{
+ "metadata": {
+ "mayaSceneFile": "C:/Users/hovel/Dropbox/git/site-packages/studiolibrary/packages/mutils/tests/data/test_anim.ma",
+ "angularUnit": "deg",
+ "ctime": "1518341546",
+ "endFrame": 10,
+ "linearUnit": "cm",
+ "version": "1.0.0",
+ "user": "Hovel",
+ "startFrame": 1,
+ "timeUnit": "film",
+ "mayaVersion": "2017"
+ }
+,
+ "objects": {
+ "srcSphere:offset": {
+ "attrs": {}
+ },
+ "srcSphere:sphere": {
+ "attrs": {
+ "testInteger": {
+ "curve": "CURVE1",
+ "type": "long",
+ "value": 5
+ },
+ "testProxy": {
+ "type": "double",
+ "value": 1.0
+ },
+ "scaleY": {
+ "type": "double",
+ "value": 4.66
+ },
+ "testLimit": {
+ "type": "double",
+ "value": 10.0
+ },
+ "testConnect": {
+ "type": "double",
+ "value": 8.0
+ },
+ "testEnum": {
+ "curve": "CURVE2",
+ "type": "enum",
+ "value": 1
+ },
+ "scaleX": {
+ "curve": "CURVE3",
+ "type": "double",
+ "value": 0.25
+ },
+ "testString": {
+ "type": "string",
+ "value": "Hello world"
+ },
+ "scaleZ": {
+ "curve": "CURVE4",
+ "type": "double",
+ "value": 0.5
+ },
+ "rotateX": {
+ "curve": "CURVE5",
+ "type": "doubleAngle",
+ "value": 45.0
+ },
+ "rotateY": {
+ "type": "doubleAngle",
+ "value": 50.0
+ },
+ "rotateZ": {
+ "curve": "CURVE6",
+ "type": "doubleAngle",
+ "value": 90.0
+ },
+ "testStatic": {
+ "type": "double",
+ "value": 0.0
+ },
+ "translateX": {
+ "curve": "CURVE7",
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "translateY": {
+ "curve": "CURVE8",
+ "type": "doubleLinear",
+ "value": 8.0
+ },
+ "translateZ": {
+ "curve": "CURVE9",
+ "type": "doubleLinear",
+ "value": -12.0
+ },
+ "visibility": {
+ "curve": "CURVE10",
+ "type": "bool",
+ "value": true
+ },
+ "testFloat": {
+ "curve": "CURVE11",
+ "type": "double",
+ "value": 0.666
+ },
+ "testAnimated": {
+ "curve": "CURVE12",
+ "type": "double",
+ "value": 0.0
+ },
+ "testVectorX": {
+ "curve": "CURVE13",
+ "type": "double",
+ "value": 0.2
+ },
+ "testVectorY": {
+ "curve": "CURVE14",
+ "type": "double",
+ "value": 1.4
+ },
+ "testVectorZ": {
+ "curve": "CURVE15",
+ "type": "double",
+ "value": 2.6
+ },
+ "testBoolean": {
+ "curve": "CURVE16",
+ "type": "bool",
+ "value": true
+ }
+ }
+ },
+ "srcSphere:lockedNode": {
+ "attrs": {
+ "translateX": {
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "translateY": {
+ "type": "doubleLinear",
+ "value": 5.0
+ },
+ "translateZ": {
+ "curve": "CURVE18",
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "scaleX": {
+ "type": "double",
+ "value": 1.0
+ },
+ "scaleY": {
+ "type": "double",
+ "value": 1.0
+ },
+ "visibility": {
+ "type": "bool",
+ "value": true
+ },
+ "rotateX": {
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "rotateY": {
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "rotateZ": {
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "scaleZ": {
+ "type": "double",
+ "value": 1.0
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_mirror_tables.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_mirror_tables.ma
new file mode 100644
index 0000000..1651558
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_mirror_tables.ma
@@ -0,0 +1,748 @@
+//Maya ASCII 2014 scene
+//Name: test_mirror_tables.ma
+//Last modified: Thu, Sep 11, 2014 08:35:27 PM
+//Codeset: 1252
+requires maya "2014";
+requires -nodeType "mentalrayFramebuffer" -nodeType "mentalrayOutputPass" -nodeType "mentalrayRenderPass"
+ -nodeType "mentalrayUserBuffer" -nodeType "mentalraySubdivApprox" -nodeType "mentalrayCurveApprox"
+ -nodeType "mentalraySurfaceApprox" -nodeType "mentalrayDisplaceApprox" -nodeType "mentalrayOptions"
+ -nodeType "mentalrayGlobals" -nodeType "mentalrayItemsList" -nodeType "mentalrayShader"
+ -nodeType "mentalrayUserData" -nodeType "mentalrayText" -nodeType "mentalrayTessellation"
+ -nodeType "mentalrayPhenomenon" -nodeType "mentalrayLightProfile" -nodeType "mentalrayVertexColors"
+ -nodeType "mentalrayIblShape" -nodeType "mapVizShape" -nodeType "mentalrayCCMeshProxy"
+ -nodeType "cylindricalLightLocator" -nodeType "discLightLocator" -nodeType "rectangularLightLocator"
+ -nodeType "sphericalLightLocator" -nodeType "abcimport" -nodeType "mia_physicalsun"
+ -nodeType "mia_physicalsky" -nodeType "mia_material" -nodeType "mia_material_x" -nodeType "mia_roundcorners"
+ -nodeType "mia_exposure_simple" -nodeType "mia_portal_light" -nodeType "mia_light_surface"
+ -nodeType "mia_exposure_photographic" -nodeType "mia_exposure_photographic_rev" -nodeType "mia_lens_bokeh"
+ -nodeType "mia_envblur" -nodeType "mia_ciesky" -nodeType "mia_photometric_light"
+ -nodeType "mib_texture_vector" -nodeType "mib_texture_remap" -nodeType "mib_texture_rotate"
+ -nodeType "mib_bump_basis" -nodeType "mib_bump_map" -nodeType "mib_passthrough_bump_map"
+ -nodeType "mib_bump_map2" -nodeType "mib_lookup_spherical" -nodeType "mib_lookup_cube1"
+ -nodeType "mib_lookup_cube6" -nodeType "mib_lookup_background" -nodeType "mib_lookup_cylindrical"
+ -nodeType "mib_texture_lookup" -nodeType "mib_texture_lookup2" -nodeType "mib_texture_filter_lookup"
+ -nodeType "mib_texture_checkerboard" -nodeType "mib_texture_polkadot" -nodeType "mib_texture_polkasphere"
+ -nodeType "mib_texture_turbulence" -nodeType "mib_texture_wave" -nodeType "mib_reflect"
+ -nodeType "mib_refract" -nodeType "mib_transparency" -nodeType "mib_continue" -nodeType "mib_opacity"
+ -nodeType "mib_twosided" -nodeType "mib_refraction_index" -nodeType "mib_dielectric"
+ -nodeType "mib_ray_marcher" -nodeType "mib_illum_lambert" -nodeType "mib_illum_phong"
+ -nodeType "mib_illum_ward" -nodeType "mib_illum_ward_deriv" -nodeType "mib_illum_blinn"
+ -nodeType "mib_illum_cooktorr" -nodeType "mib_illum_hair" -nodeType "mib_volume"
+ -nodeType "mib_color_alpha" -nodeType "mib_color_average" -nodeType "mib_color_intensity"
+ -nodeType "mib_color_interpolate" -nodeType "mib_color_mix" -nodeType "mib_color_spread"
+ -nodeType "mib_geo_cube" -nodeType "mib_geo_torus" -nodeType "mib_geo_sphere" -nodeType "mib_geo_cone"
+ -nodeType "mib_geo_cylinder" -nodeType "mib_geo_square" -nodeType "mib_geo_instance"
+ -nodeType "mib_geo_instance_mlist" -nodeType "mib_geo_add_uv_texsurf" -nodeType "mib_photon_basic"
+ -nodeType "mib_light_infinite" -nodeType "mib_light_point" -nodeType "mib_light_spot"
+ -nodeType "mib_light_photometric" -nodeType "mib_cie_d" -nodeType "mib_blackbody"
+ -nodeType "mib_shadow_transparency" -nodeType "mib_lens_stencil" -nodeType "mib_lens_clamp"
+ -nodeType "mib_lightmap_write" -nodeType "mib_lightmap_sample" -nodeType "mib_amb_occlusion"
+ -nodeType "mib_fast_occlusion" -nodeType "mib_map_get_scalar" -nodeType "mib_map_get_integer"
+ -nodeType "mib_map_get_vector" -nodeType "mib_map_get_color" -nodeType "mib_map_get_transform"
+ -nodeType "mib_map_get_scalar_array" -nodeType "mib_map_get_integer_array" -nodeType "mib_fg_occlusion"
+ -nodeType "mib_bent_normal_env" -nodeType "mib_glossy_reflection" -nodeType "mib_glossy_refraction"
+ -nodeType "builtin_bsdf_architectural" -nodeType "builtin_bsdf_architectural_comp"
+ -nodeType "builtin_bsdf_carpaint" -nodeType "builtin_bsdf_ashikhmin" -nodeType "builtin_bsdf_lambert"
+ -nodeType "builtin_bsdf_mirror" -nodeType "builtin_bsdf_phong" -nodeType "contour_store_function"
+ -nodeType "contour_store_function_simple" -nodeType "contour_contrast_function_levels"
+ -nodeType "contour_contrast_function_simple" -nodeType "contour_shader_simple" -nodeType "contour_shader_silhouette"
+ -nodeType "contour_shader_maxcolor" -nodeType "contour_shader_curvature" -nodeType "contour_shader_factorcolor"
+ -nodeType "contour_shader_depthfade" -nodeType "contour_shader_framefade" -nodeType "contour_shader_layerthinner"
+ -nodeType "contour_shader_widthfromcolor" -nodeType "contour_shader_widthfromlightdir"
+ -nodeType "contour_shader_widthfromlight" -nodeType "contour_shader_combi" -nodeType "contour_only"
+ -nodeType "contour_composite" -nodeType "contour_ps" -nodeType "mi_metallic_paint"
+ -nodeType "mi_metallic_paint_x" -nodeType "mi_bump_flakes" -nodeType "mi_car_paint_phen"
+ -nodeType "mi_metallic_paint_output_mixer" -nodeType "mi_car_paint_phen_x" -nodeType "physical_lens_dof"
+ -nodeType "physical_light" -nodeType "dgs_material" -nodeType "dgs_material_photon"
+ -nodeType "dielectric_material" -nodeType "dielectric_material_photon" -nodeType "oversampling_lens"
+ -nodeType "path_material" -nodeType "parti_volume" -nodeType "parti_volume_photon"
+ -nodeType "transmat" -nodeType "transmat_photon" -nodeType "mip_rayswitch" -nodeType "mip_rayswitch_advanced"
+ -nodeType "mip_rayswitch_environment" -nodeType "mip_card_opacity" -nodeType "mip_motionblur"
+ -nodeType "mip_motion_vector" -nodeType "mip_matteshadow" -nodeType "mip_cameramap"
+ -nodeType "mip_mirrorball" -nodeType "mip_grayball" -nodeType "mip_gamma_gain" -nodeType "mip_render_subset"
+ -nodeType "mip_matteshadow_mtl" -nodeType "mip_binaryproxy" -nodeType "mip_rayswitch_stage"
+ -nodeType "mip_fgshooter" -nodeType "mib_ptex_lookup" -nodeType "misss_physical"
+ -nodeType "misss_physical_phen" -nodeType "misss_fast_shader" -nodeType "misss_fast_shader_x"
+ -nodeType "misss_fast_shader2" -nodeType "misss_fast_shader2_x" -nodeType "misss_skin_specular"
+ -nodeType "misss_lightmap_write" -nodeType "misss_lambert_gamma" -nodeType "misss_call_shader"
+ -nodeType "misss_set_normal" -nodeType "misss_fast_lmap_maya" -nodeType "misss_fast_simple_maya"
+ -nodeType "misss_fast_skin_maya" -nodeType "misss_fast_skin_phen" -nodeType "misss_fast_skin_phen_d"
+ -nodeType "misss_mia_skin2_phen" -nodeType "misss_mia_skin2_phen_d" -nodeType "misss_lightmap_phen"
+ -nodeType "misss_mia_skin2_surface_phen" -nodeType "surfaceSampler" -nodeType "mib_data_bool"
+ -nodeType "mib_data_int" -nodeType "mib_data_scalar" -nodeType "mib_data_vector"
+ -nodeType "mib_data_color" -nodeType "mib_data_string" -nodeType "mib_data_texture"
+ -nodeType "mib_data_shader" -nodeType "mib_data_bool_array" -nodeType "mib_data_int_array"
+ -nodeType "mib_data_scalar_array" -nodeType "mib_data_vector_array" -nodeType "mib_data_color_array"
+ -nodeType "mib_data_string_array" -nodeType "mib_data_texture_array" -nodeType "mib_data_shader_array"
+ -nodeType "mib_data_get_bool" -nodeType "mib_data_get_int" -nodeType "mib_data_get_scalar"
+ -nodeType "mib_data_get_vector" -nodeType "mib_data_get_color" -nodeType "mib_data_get_string"
+ -nodeType "mib_data_get_texture" -nodeType "mib_data_get_shader" -nodeType "mib_data_get_shader_bool"
+ -nodeType "mib_data_get_shader_int" -nodeType "mib_data_get_shader_scalar" -nodeType "mib_data_get_shader_vector"
+ -nodeType "mib_data_get_shader_color" -nodeType "user_ibl_env" -nodeType "user_ibl_rect"
+ -nodeType "mia_material_x_passes" -nodeType "mi_metallic_paint_x_passes" -nodeType "mi_car_paint_phen_x_passes"
+ -nodeType "misss_fast_shader_x_passes" -dataType "byteArray" "Mayatomr" "2014.0 - 3.11.1.4 ";
+currentUnit -l centimeter -a degree -t film;
+fileInfo "application" "maya";
+fileInfo "product" "Maya 2014";
+fileInfo "version" "2014 x64";
+fileInfo "cutIdentifier" "201303010241-864206";
+fileInfo "osv" "Microsoft Windows 7 Ultimate Edition, 64-bit Windows 7 Service Pack 1 (Build 7601)\n";
+createNode transform -s -n "persp";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" 22.248422999787756 12.500732575524742 10.391306855519792 ;
+ setAttr ".r" -type "double3" -28.538352729610519 64.599999999998701 -3.7075007778321079e-015 ;
+createNode camera -s -n "perspShape" -p "persp";
+ setAttr -k off ".v" no;
+ setAttr ".fl" 34.999999999999993;
+ setAttr ".coi" 27.199165290100083;
+ setAttr ".imn" -type "string" "persp";
+ setAttr ".den" -type "string" "persp_depth";
+ setAttr ".man" -type "string" "persp_mask";
+ setAttr ".hc" -type "string" "viewSet -p %camera";
+createNode transform -s -n "top";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" 0 100.1 0 ;
+ setAttr ".r" -type "double3" -89.999999999999986 0 0 ;
+createNode camera -s -n "topShape" -p "top";
+ setAttr -k off ".v" no;
+ setAttr ".rnd" no;
+ setAttr ".coi" 100.1;
+ setAttr ".ow" 30;
+ setAttr ".imn" -type "string" "top";
+ setAttr ".den" -type "string" "top_depth";
+ setAttr ".man" -type "string" "top_mask";
+ setAttr ".hc" -type "string" "viewSet -t %camera";
+ setAttr ".o" yes;
+createNode transform -s -n "front";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" 0 0 100.1 ;
+createNode camera -s -n "frontShape" -p "front";
+ setAttr -k off ".v" no;
+ setAttr ".rnd" no;
+ setAttr ".coi" 100.1;
+ setAttr ".ow" 30;
+ setAttr ".imn" -type "string" "front";
+ setAttr ".den" -type "string" "front_depth";
+ setAttr ".man" -type "string" "front_mask";
+ setAttr ".hc" -type "string" "viewSet -f %camera";
+ setAttr ".o" yes;
+createNode transform -s -n "side";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" 100.1 0 0 ;
+ setAttr ".r" -type "double3" 0 89.999999999999986 0 ;
+createNode camera -s -n "sideShape" -p "side";
+ setAttr -k off ".v" no;
+ setAttr ".rnd" no;
+ setAttr ".coi" 100.1;
+ setAttr ".ow" 30;
+ setAttr ".imn" -type "string" "side";
+ setAttr ".den" -type "string" "side_depth";
+ setAttr ".man" -type "string" "side_mask";
+ setAttr ".hc" -type "string" "viewSet -s %camera";
+ setAttr ".o" yes;
+createNode transform -n "Group";
+createNode transform -n "Group2" -p "Group";
+createNode transform -n "cubeR" -p "Group2";
+ setAttr ".t" -type "double3" -5 0 0 ;
+createNode mesh -n "cubeRShape" -p "cubeR";
+ setAttr -k off ".v";
+ setAttr ".vir" yes;
+ setAttr ".vif" yes;
+ setAttr ".uvst[0].uvsn" -type "string" "map1";
+ setAttr ".cuvs" -type "string" "map1";
+ setAttr ".dcc" -type "string" "Ambient+Diffuse";
+ setAttr ".covm[0]" 0 1 1;
+ setAttr ".cdvm[0]" 0 1 1;
+createNode transform -n "cubeL" -p "Group2";
+ setAttr ".t" -type "double3" 5 -1.7155814546566843 0 ;
+createNode mesh -n "cubeLShape" -p "cubeL";
+ setAttr -k off ".v";
+ setAttr ".vir" yes;
+ setAttr ".vif" yes;
+ setAttr ".uvst[0].uvsn" -type "string" "map1";
+ setAttr -s 14 ".uvst[0].uvsp[0:13]" -type "float2" 0.375 0 0.625 0 0.375
+ 0.25 0.625 0.25 0.375 0.5 0.625 0.5 0.375 0.75 0.625 0.75 0.375 1 0.625 1 0.875 0
+ 0.875 0.25 0.125 0 0.125 0.25;
+ setAttr ".cuvs" -type "string" "map1";
+ setAttr ".dcc" -type "string" "Ambient+Diffuse";
+ setAttr ".covm[0]" 0 1 1;
+ setAttr ".cdvm[0]" 0 1 1;
+ setAttr -s 8 ".vt[0:7]" -0.5 -0.5 0.5 0.5 -0.5 0.5 -0.5 0.5 0.5 0.5 0.5 0.5
+ -0.5 0.5 -0.5 0.5 0.5 -0.5 -0.5 -0.5 -0.5 0.5 -0.5 -0.5;
+ setAttr -s 12 ".ed[0:11]" 0 1 0 2 3 0 4 5 0 6 7 0 0 2 0 1 3 0 2 4 0
+ 3 5 0 4 6 0 5 7 0 6 0 0 7 1 0;
+ setAttr -s 6 -ch 24 ".fc[0:5]" -type "polyFaces"
+ f 4 0 5 -2 -5
+ mu 0 4 0 1 3 2
+ f 4 1 7 -3 -7
+ mu 0 4 2 3 5 4
+ f 4 2 9 -4 -9
+ mu 0 4 4 5 7 6
+ f 4 3 11 -1 -11
+ mu 0 4 6 7 9 8
+ f 4 -12 -10 -8 -6
+ mu 0 4 1 10 11 3
+ f 4 10 4 6 8
+ mu 0 4 12 0 2 13;
+ setAttr ".cd" -type "dataPolyComponent" Index_Data Edge 0 ;
+ setAttr ".cvd" -type "dataPolyComponent" Index_Data Vertex 0 ;
+ setAttr ".hfd" -type "dataPolyComponent" Index_Data Face 0 ;
+createNode transform -n "Group3" -p "Group";
+ setAttr ".t" -type "double3" 0 0 -2.8742420497365515 ;
+createNode transform -n "R_cube" -p "Group3";
+ setAttr ".t" -type "double3" -5 -0.71903628511057072 0 ;
+createNode mesh -n "R_cubeShape" -p "R_cube";
+ setAttr -k off ".v";
+ setAttr ".vir" yes;
+ setAttr ".vif" yes;
+ setAttr ".uvst[0].uvsn" -type "string" "map1";
+ setAttr -s 14 ".uvst[0].uvsp[0:13]" -type "float2" 0.375 0 0.625 0 0.375
+ 0.25 0.625 0.25 0.375 0.5 0.625 0.5 0.375 0.75 0.625 0.75 0.375 1 0.625 1 0.875 0
+ 0.875 0.25 0.125 0 0.125 0.25;
+ setAttr ".cuvs" -type "string" "map1";
+ setAttr ".dcc" -type "string" "Ambient+Diffuse";
+ setAttr ".covm[0]" 0 1 1;
+ setAttr ".cdvm[0]" 0 1 1;
+ setAttr -s 8 ".vt[0:7]" -0.5 -0.5 0.5 0.5 -0.5 0.5 -0.5 0.5 0.5 0.5 0.5 0.5
+ -0.5 0.5 -0.5 0.5 0.5 -0.5 -0.5 -0.5 -0.5 0.5 -0.5 -0.5;
+ setAttr -s 12 ".ed[0:11]" 0 1 0 2 3 0 4 5 0 6 7 0 0 2 0 1 3 0 2 4 0
+ 3 5 0 4 6 0 5 7 0 6 0 0 7 1 0;
+ setAttr -s 6 -ch 24 ".fc[0:5]" -type "polyFaces"
+ f 4 0 5 -2 -5
+ mu 0 4 0 1 3 2
+ f 4 1 7 -3 -7
+ mu 0 4 2 3 5 4
+ f 4 2 9 -4 -9
+ mu 0 4 4 5 7 6
+ f 4 3 11 -1 -11
+ mu 0 4 6 7 9 8
+ f 4 -12 -10 -8 -6
+ mu 0 4 1 10 11 3
+ f 4 10 4 6 8
+ mu 0 4 12 0 2 13;
+ setAttr ".cd" -type "dataPolyComponent" Index_Data Edge 0 ;
+ setAttr ".cvd" -type "dataPolyComponent" Index_Data Vertex 0 ;
+ setAttr ".hfd" -type "dataPolyComponent" Index_Data Face 0 ;
+createNode transform -n "L_cube" -p "Group3";
+ setAttr ".t" -type "double3" 2.1362195941342836 4.3031875715542744 0 ;
+ setAttr -av ".tx";
+ setAttr -av ".ty";
+createNode mesh -n "L_cubeShape" -p "L_cube";
+ setAttr -k off ".v";
+ setAttr ".vir" yes;
+ setAttr ".vif" yes;
+ setAttr ".uvst[0].uvsn" -type "string" "map1";
+ setAttr -s 14 ".uvst[0].uvsp[0:13]" -type "float2" 0.375 0 0.625 0 0.375
+ 0.25 0.625 0.25 0.375 0.5 0.625 0.5 0.375 0.75 0.625 0.75 0.375 1 0.625 1 0.875 0
+ 0.875 0.25 0.125 0 0.125 0.25;
+ setAttr ".cuvs" -type "string" "map1";
+ setAttr ".dcc" -type "string" "Ambient+Diffuse";
+ setAttr ".covm[0]" 0 1 1;
+ setAttr ".cdvm[0]" 0 1 1;
+ setAttr -s 8 ".vt[0:7]" -0.5 -0.5 0.5 0.5 -0.5 0.5 -0.5 0.5 0.5 0.5 0.5 0.5
+ -0.5 0.5 -0.5 0.5 0.5 -0.5 -0.5 -0.5 -0.5 0.5 -0.5 -0.5;
+ setAttr -s 12 ".ed[0:11]" 0 1 0 2 3 0 4 5 0 6 7 0 0 2 0 1 3 0 2 4 0
+ 3 5 0 4 6 0 5 7 0 6 0 0 7 1 0;
+ setAttr -s 6 -ch 24 ".fc[0:5]" -type "polyFaces"
+ f 4 0 5 -2 -5
+ mu 0 4 0 1 3 2
+ f 4 1 7 -3 -7
+ mu 0 4 2 3 5 4
+ f 4 2 9 -4 -9
+ mu 0 4 4 5 7 6
+ f 4 3 11 -1 -11
+ mu 0 4 6 7 9 8
+ f 4 -12 -10 -8 -6
+ mu 0 4 1 10 11 3
+ f 4 10 4 6 8
+ mu 0 4 12 0 2 13;
+ setAttr ".cd" -type "dataPolyComponent" Index_Data Edge 0 ;
+ setAttr ".cvd" -type "dataPolyComponent" Index_Data Vertex 0 ;
+ setAttr ".hfd" -type "dataPolyComponent" Index_Data Face 0 ;
+createNode mentalrayItemsList -s -n "mentalrayItemsList";
+createNode mentalrayGlobals -s -n "mentalrayGlobals";
+createNode mentalrayOptions -s -n "miDefaultOptions";
+ addAttr -ci true -m -sn "stringOptions" -ln "stringOptions" -at "compound" -nc
+ 3;
+ addAttr -ci true -sn "name" -ln "name" -dt "string" -p "stringOptions";
+ addAttr -ci true -sn "value" -ln "value" -dt "string" -p "stringOptions";
+ addAttr -ci true -sn "type" -ln "type" -dt "string" -p "stringOptions";
+ addAttr -ci true -sn "miSamplesQualityR" -ln "miSamplesQualityR" -dv 0.25 -min 0.01
+ -max 9999999.9000000004 -smn 0.1 -smx 2 -at "double";
+ addAttr -ci true -sn "miSamplesQualityG" -ln "miSamplesQualityG" -dv 0.25 -min 0.01
+ -max 9999999.9000000004 -smn 0.1 -smx 2 -at "double";
+ addAttr -ci true -sn "miSamplesQualityB" -ln "miSamplesQualityB" -dv 0.25 -min 0.01
+ -max 9999999.9000000004 -smn 0.1 -smx 2 -at "double";
+ addAttr -ci true -sn "miSamplesQualityA" -ln "miSamplesQualityA" -dv 0.25 -min 0.01
+ -max 9999999.9000000004 -smn 0.1 -smx 2 -at "double";
+ addAttr -ci true -sn "miSamplesMin" -ln "miSamplesMin" -dv 1 -min 0.1 -at "double";
+ addAttr -ci true -sn "miSamplesMax" -ln "miSamplesMax" -dv 100 -min 0.1 -at "double";
+ addAttr -ci true -sn "miSamplesErrorCutoffR" -ln "miSamplesErrorCutoffR" -min 0
+ -max 1 -at "double";
+ addAttr -ci true -sn "miSamplesErrorCutoffG" -ln "miSamplesErrorCutoffG" -min 0
+ -max 1 -at "double";
+ addAttr -ci true -sn "miSamplesErrorCutoffB" -ln "miSamplesErrorCutoffB" -min 0
+ -max 1 -at "double";
+ addAttr -ci true -sn "miSamplesErrorCutoffA" -ln "miSamplesErrorCutoffA" -min 0
+ -max 1 -at "double";
+ addAttr -ci true -sn "miSamplesPerObject" -ln "miSamplesPerObject" -min 0 -max 1
+ -at "bool";
+ addAttr -ci true -sn "miRastShadingSamples" -ln "miRastShadingSamples" -dv 1 -min
+ 0.25 -at "double";
+ addAttr -ci true -sn "miRastSamples" -ln "miRastSamples" -dv 3 -min 1 -at "long";
+ addAttr -ci true -sn "miContrastAsColor" -ln "miContrastAsColor" -min 0 -max 1 -at "bool";
+ addAttr -ci true -sn "miProgMaxTime" -ln "miProgMaxTime" -min 0 -at "long";
+ addAttr -ci true -sn "miProgSubsampleSize" -ln "miProgSubsampleSize" -dv 4 -min
+ 1 -at "long";
+ addAttr -ci true -sn "miTraceCameraMotionVectors" -ln "miTraceCameraMotionVectors"
+ -min 0 -max 1 -at "bool";
+ addAttr -ci true -sn "miTraceCameraClip" -ln "miTraceCameraClip" -min 0 -max 1 -at "bool";
+ setAttr -s 45 ".stringOptions";
+ setAttr ".stringOptions[0].name" -type "string" "rast motion factor";
+ setAttr ".stringOptions[0].value" -type "string" "1.0";
+ setAttr ".stringOptions[0].type" -type "string" "scalar";
+ setAttr ".stringOptions[1].name" -type "string" "rast transparency depth";
+ setAttr ".stringOptions[1].value" -type "string" "8";
+ setAttr ".stringOptions[1].type" -type "string" "integer";
+ setAttr ".stringOptions[2].name" -type "string" "rast useopacity";
+ setAttr ".stringOptions[2].value" -type "string" "true";
+ setAttr ".stringOptions[2].type" -type "string" "boolean";
+ setAttr ".stringOptions[3].name" -type "string" "importon";
+ setAttr ".stringOptions[3].value" -type "string" "false";
+ setAttr ".stringOptions[3].type" -type "string" "boolean";
+ setAttr ".stringOptions[4].name" -type "string" "importon density";
+ setAttr ".stringOptions[4].value" -type "string" "1.0";
+ setAttr ".stringOptions[4].type" -type "string" "scalar";
+ setAttr ".stringOptions[5].name" -type "string" "importon merge";
+ setAttr ".stringOptions[5].value" -type "string" "0.0";
+ setAttr ".stringOptions[5].type" -type "string" "scalar";
+ setAttr ".stringOptions[6].name" -type "string" "importon trace depth";
+ setAttr ".stringOptions[6].value" -type "string" "0";
+ setAttr ".stringOptions[6].type" -type "string" "integer";
+ setAttr ".stringOptions[7].name" -type "string" "importon traverse";
+ setAttr ".stringOptions[7].value" -type "string" "true";
+ setAttr ".stringOptions[7].type" -type "string" "boolean";
+ setAttr ".stringOptions[8].name" -type "string" "shadowmap pixel samples";
+ setAttr ".stringOptions[8].value" -type "string" "3";
+ setAttr ".stringOptions[8].type" -type "string" "integer";
+ setAttr ".stringOptions[9].name" -type "string" "ambient occlusion";
+ setAttr ".stringOptions[9].value" -type "string" "false";
+ setAttr ".stringOptions[9].type" -type "string" "boolean";
+ setAttr ".stringOptions[10].name" -type "string" "ambient occlusion rays";
+ setAttr ".stringOptions[10].value" -type "string" "256";
+ setAttr ".stringOptions[10].type" -type "string" "integer";
+ setAttr ".stringOptions[11].name" -type "string" "ambient occlusion cache";
+ setAttr ".stringOptions[11].value" -type "string" "false";
+ setAttr ".stringOptions[11].type" -type "string" "boolean";
+ setAttr ".stringOptions[12].name" -type "string" "ambient occlusion cache density";
+ setAttr ".stringOptions[12].value" -type "string" "1.0";
+ setAttr ".stringOptions[12].type" -type "string" "scalar";
+ setAttr ".stringOptions[13].name" -type "string" "ambient occlusion cache points";
+ setAttr ".stringOptions[13].value" -type "string" "64";
+ setAttr ".stringOptions[13].type" -type "string" "integer";
+ setAttr ".stringOptions[14].name" -type "string" "irradiance particles";
+ setAttr ".stringOptions[14].value" -type "string" "false";
+ setAttr ".stringOptions[14].type" -type "string" "boolean";
+ setAttr ".stringOptions[15].name" -type "string" "irradiance particles rays";
+ setAttr ".stringOptions[15].value" -type "string" "256";
+ setAttr ".stringOptions[15].type" -type "string" "integer";
+ setAttr ".stringOptions[16].name" -type "string" "irradiance particles interpolate";
+ setAttr ".stringOptions[16].value" -type "string" "1";
+ setAttr ".stringOptions[16].type" -type "string" "integer";
+ setAttr ".stringOptions[17].name" -type "string" "irradiance particles interppoints";
+ setAttr ".stringOptions[17].value" -type "string" "64";
+ setAttr ".stringOptions[17].type" -type "string" "integer";
+ setAttr ".stringOptions[18].name" -type "string" "irradiance particles indirect passes";
+ setAttr ".stringOptions[18].value" -type "string" "0";
+ setAttr ".stringOptions[18].type" -type "string" "integer";
+ setAttr ".stringOptions[19].name" -type "string" "irradiance particles scale";
+ setAttr ".stringOptions[19].value" -type "string" "1.0";
+ setAttr ".stringOptions[19].type" -type "string" "scalar";
+ setAttr ".stringOptions[20].name" -type "string" "irradiance particles env";
+ setAttr ".stringOptions[20].value" -type "string" "true";
+ setAttr ".stringOptions[20].type" -type "string" "boolean";
+ setAttr ".stringOptions[21].name" -type "string" "irradiance particles env rays";
+ setAttr ".stringOptions[21].value" -type "string" "256";
+ setAttr ".stringOptions[21].type" -type "string" "integer";
+ setAttr ".stringOptions[22].name" -type "string" "irradiance particles env scale";
+ setAttr ".stringOptions[22].value" -type "string" "1";
+ setAttr ".stringOptions[22].type" -type "string" "integer";
+ setAttr ".stringOptions[23].name" -type "string" "irradiance particles rebuild";
+ setAttr ".stringOptions[23].value" -type "string" "true";
+ setAttr ".stringOptions[23].type" -type "string" "boolean";
+ setAttr ".stringOptions[24].name" -type "string" "irradiance particles file";
+ setAttr ".stringOptions[24].value" -type "string" "";
+ setAttr ".stringOptions[24].type" -type "string" "string";
+ setAttr ".stringOptions[25].name" -type "string" "geom displace motion factor";
+ setAttr ".stringOptions[25].value" -type "string" "1.0";
+ setAttr ".stringOptions[25].type" -type "string" "scalar";
+ setAttr ".stringOptions[26].name" -type "string" "contrast all buffers";
+ setAttr ".stringOptions[26].value" -type "string" "true";
+ setAttr ".stringOptions[26].type" -type "string" "boolean";
+ setAttr ".stringOptions[27].name" -type "string" "finalgather normal tolerance";
+ setAttr ".stringOptions[27].value" -type "string" "25.842";
+ setAttr ".stringOptions[27].type" -type "string" "scalar";
+ setAttr ".stringOptions[28].name" -type "string" "trace camera clip";
+ setAttr ".stringOptions[28].value" -type "string" "false";
+ setAttr ".stringOptions[28].type" -type "string" "boolean";
+ setAttr ".stringOptions[29].name" -type "string" "unified sampling";
+ setAttr ".stringOptions[29].value" -type "string" "true";
+ setAttr ".stringOptions[29].type" -type "string" "boolean";
+ setAttr ".stringOptions[30].name" -type "string" "samples quality";
+ setAttr ".stringOptions[30].value" -type "string" "0.5 0.5 0.5 0.5";
+ setAttr ".stringOptions[30].type" -type "string" "color";
+ setAttr ".stringOptions[31].name" -type "string" "samples min";
+ setAttr ".stringOptions[31].value" -type "string" "1.0";
+ setAttr ".stringOptions[31].type" -type "string" "scalar";
+ setAttr ".stringOptions[32].name" -type "string" "samples max";
+ setAttr ".stringOptions[32].value" -type "string" "100.0";
+ setAttr ".stringOptions[32].type" -type "string" "scalar";
+ setAttr ".stringOptions[33].name" -type "string" "samples error cutoff";
+ setAttr ".stringOptions[33].value" -type "string" "0.0 0.0 0.0 0.0";
+ setAttr ".stringOptions[33].type" -type "string" "color";
+ setAttr ".stringOptions[34].name" -type "string" "samples per object";
+ setAttr ".stringOptions[34].value" -type "string" "false";
+ setAttr ".stringOptions[34].type" -type "string" "boolean";
+ setAttr ".stringOptions[35].name" -type "string" "progressive";
+ setAttr ".stringOptions[35].value" -type "string" "false";
+ setAttr ".stringOptions[35].type" -type "string" "boolean";
+ setAttr ".stringOptions[36].name" -type "string" "progressive max time";
+ setAttr ".stringOptions[36].value" -type "string" "0";
+ setAttr ".stringOptions[36].type" -type "string" "integer";
+ setAttr ".stringOptions[37].name" -type "string" "progressive subsampling size";
+ setAttr ".stringOptions[37].value" -type "string" "1";
+ setAttr ".stringOptions[37].type" -type "string" "integer";
+ setAttr ".stringOptions[38].name" -type "string" "iray";
+ setAttr ".stringOptions[38].value" -type "string" "false";
+ setAttr ".stringOptions[38].type" -type "string" "boolean";
+ setAttr ".stringOptions[39].name" -type "string" "light relative scale";
+ setAttr ".stringOptions[39].value" -type "string" "0.31831";
+ setAttr ".stringOptions[39].type" -type "string" "scalar";
+ setAttr ".stringOptions[40].name" -type "string" "trace camera motion vectors";
+ setAttr ".stringOptions[40].value" -type "string" "false";
+ setAttr ".stringOptions[40].type" -type "string" "boolean";
+ setAttr ".stringOptions[41].name" -type "string" "ray differentials";
+ setAttr ".stringOptions[41].value" -type "string" "true";
+ setAttr ".stringOptions[41].type" -type "string" "boolean";
+ setAttr ".stringOptions[42].name" -type "string" "environment lighting mode";
+ setAttr ".stringOptions[42].value" -type "string" "off";
+ setAttr ".stringOptions[42].type" -type "string" "string";
+ setAttr ".stringOptions[43].name" -type "string" "environment lighting quality";
+ setAttr ".stringOptions[43].value" -type "string" "0.167";
+ setAttr ".stringOptions[43].type" -type "string" "scalar";
+ setAttr ".stringOptions[44].name" -type "string" "environment lighting shadow";
+ setAttr ".stringOptions[44].value" -type "string" "transparent";
+ setAttr ".stringOptions[44].type" -type "string" "string";
+createNode mentalrayFramebuffer -s -n "miDefaultFramebuffer";
+createNode lightLinker -s -n "lightLinker1";
+ setAttr -s 2 ".lnk";
+ setAttr -s 2 ".slnk";
+createNode displayLayerManager -n "layerManager";
+createNode displayLayer -n "defaultLayer";
+createNode renderLayerManager -n "renderLayerManager";
+createNode renderLayer -n "defaultRenderLayer";
+ setAttr ".g" yes;
+createNode polyCube -n "polyCube1";
+ setAttr ".cuv" 4;
+createNode script -n "uiConfigurationScriptNode";
+ setAttr ".b" -type "string" (
+ "// Maya Mel UI Configuration File.\n//\n// This script is machine generated. Edit at your own risk.\n//\n//\n\nglobal string $gMainPane;\nif (`paneLayout -exists $gMainPane`) {\n\n\tglobal int $gUseScenePanelConfig;\n\tint $useSceneConfig = $gUseScenePanelConfig;\n\tint $menusOkayInPanels = `optionVar -q allowMenusInPanels`;\tint $nVisPanes = `paneLayout -q -nvp $gMainPane`;\n\tint $nPanes = 0;\n\tstring $editorName;\n\tstring $panelName;\n\tstring $itemFilterName;\n\tstring $panelConfig;\n\n\t//\n\t// get current state of the UI\n\t//\n\tsceneUIReplacement -update $gMainPane;\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Top View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n"
+ + " -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n"
+ + " -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n"
+ + " -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels $panelName;\n"
+ + "\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n"
+ + " -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n"
+ + " -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Side View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels `;\n"
+ + "\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n"
+ + " -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n"
+ + " -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n"
+ + " $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n"
+ + " -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n"
+ + " -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Front View\")) `;\n"
+ + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n"
+ + " -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n"
+ + " -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n"
+ + " -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n"
+ + " -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n"
+ + " -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n"
+ + " modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Persp View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n"
+ + " -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n"
+ + " -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n"
+ + " -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n"
+ + " -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n"
+ + " -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n"
+ + " -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"Outliner\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `outlinerPanel -unParent -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n outlinerEditor -e \n -docTag \"isolOutln_fromSeln\" \n -showShapes 0\n -showReferenceNodes 1\n -showReferenceMembers 1\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n"
+ + " -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n"
+ + " -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -docTag \"isolOutln_fromSeln\" \n -showShapes 0\n -showReferenceNodes 1\n -showReferenceMembers 1\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n"
+ + " -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n"
+ + " -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"graphEditor\" (localizedPanelLabel(\"Graph Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"graphEditor\" -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n"
+ + " -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 1\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n"
+ + " -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n -mapMotionTrails 1\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 1\n -displayInfinities 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -showResults \"off\" \n -showBufferCurves \"off\" \n -smoothness \"fine\" \n -resultSamples 1\n -resultScreenSamples 0\n -resultUpdate \"delayed\" \n"
+ + " -showUpstreamCurves 1\n -stackedCurves 0\n -stackedCurvesMin -1\n -stackedCurvesMax 1\n -stackedCurvesSpace 0.2\n -displayNormalized 0\n -preSelectionHighlight 0\n -constrainDrag 0\n -classicMode 1\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n"
+ + " -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 1\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n"
+ + " -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n -mapMotionTrails 1\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 1\n -displayInfinities 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -showResults \"off\" \n -showBufferCurves \"off\" \n -smoothness \"fine\" \n -resultSamples 1\n -resultScreenSamples 0\n -resultUpdate \"delayed\" \n -showUpstreamCurves 1\n -stackedCurves 0\n -stackedCurvesMin -1\n -stackedCurvesMax 1\n"
+ + " -stackedCurvesSpace 0.2\n -displayNormalized 0\n -preSelectionHighlight 0\n -constrainDrag 0\n -classicMode 1\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dopeSheetPanel\" (localizedPanelLabel(\"Dope Sheet\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dopeSheetPanel\" -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n"
+ + " -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 0\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n"
+ + " -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 1\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -outliner \"dopeSheetPanel1OutlineEd\" \n -showSummary 1\n -showScene 0\n -hierarchyBelow 0\n -showTicks 1\n -selectionWindow 0 0 0 0 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n"
+ + "\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 0\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n"
+ + " -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 1\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n"
+ + " -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -outliner \"dopeSheetPanel1OutlineEd\" \n -showSummary 1\n -showScene 0\n -hierarchyBelow 0\n -showTicks 1\n -selectionWindow 0 0 0 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"clipEditorPanel\" (localizedPanelLabel(\"Trax Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"clipEditorPanel\" -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n"
+ + " -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -manageSequencer 0 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -manageSequencer 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"sequenceEditorPanel\" (localizedPanelLabel(\"Camera Sequencer\")) `;\n"
+ + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"sequenceEditorPanel\" -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -manageSequencer 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n"
+ + " -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -manageSequencer 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperGraphPanel\" (localizedPanelLabel(\"Hypergraph Hierarchy\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"hyperGraphPanel\" -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n -orientation \"horiz\" \n -mergeConnections 0\n -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n -showExpressions 0\n -showConstraints 0\n -showConnectionFromSelected 0\n"
+ + " -showConnectionToSelected 0\n -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -imagePosition 0 0 \n -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n -orientation \"horiz\" \n -mergeConnections 0\n"
+ + " -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n -showExpressions 0\n -showConstraints 0\n -showConnectionFromSelected 0\n -showConnectionToSelected 0\n -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -imagePosition 0 0 \n -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperShadePanel\" (localizedPanelLabel(\"Hypershade\")) `;\n"
+ + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"hyperShadePanel\" -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"visorPanel\" (localizedPanelLabel(\"Visor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"visorPanel\" -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"nodeEditorPanel\" (localizedPanelLabel(\"Node Editor\")) `;\n\tif (\"\" == $panelName) {\n"
+ + "\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"nodeEditorPanel\" -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -defaultPinnedState 0\n -ignoreAssets 1\n -additiveGraphingMode 0\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -keyReleaseCommand \"nodeEdKeyReleaseCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -island 0\n -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n"
+ + " -syncedSelection 1\n -extendToShapes 1\n $editorName;;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -defaultPinnedState 0\n -ignoreAssets 1\n -additiveGraphingMode 0\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -keyReleaseCommand \"nodeEdKeyReleaseCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -island 0\n -showNamespace 1\n"
+ + " -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -syncedSelection 1\n -extendToShapes 1\n $editorName;;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"createNodePanel\" (localizedPanelLabel(\"Create Node\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"createNodePanel\" -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"polyTexturePlacementPanel\" (localizedPanelLabel(\"UV Texture Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"polyTexturePlacementPanel\" -l (localizedPanelLabel(\"UV Texture Editor\")) -mbv $menusOkayInPanels `;\n"
+ + "\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"UV Texture Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"renderWindowPanel\" (localizedPanelLabel(\"Render View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"renderWindowPanel\" -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"blendShapePanel\" (localizedPanelLabel(\"Blend Shape\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\tblendShapePanel -unParent -l (localizedPanelLabel(\"Blend Shape\")) -mbv $menusOkayInPanels ;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n"
+ + "\t\tblendShapePanel -edit -l (localizedPanelLabel(\"Blend Shape\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynRelEdPanel\" (localizedPanelLabel(\"Dynamic Relationships\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dynRelEdPanel\" -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"relationshipPanel\" (localizedPanelLabel(\"Relationship Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"relationshipPanel\" -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels `;\n"
+ + "\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"referenceEditorPanel\" (localizedPanelLabel(\"Reference Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"referenceEditorPanel\" -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"componentEditorPanel\" (localizedPanelLabel(\"Component Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"componentEditorPanel\" -l (localizedPanelLabel(\"Component Editor\")) -mbv $menusOkayInPanels `;\n"
+ + "\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Component Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynPaintScriptedPanelType\" (localizedPanelLabel(\"Paint Effects\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dynPaintScriptedPanelType\" -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"scriptEditorPanel\" (localizedPanelLabel(\"Script Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"scriptEditorPanel\" -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels `;\n"
+ + "\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\tif ($useSceneConfig) {\n\t\tscriptedPanel -e -to $panelName;\n\t}\n\n\n\tif ($useSceneConfig) {\n string $configName = `getPanel -cwl (localizedPanelLabel(\"Current Layout\"))`;\n if (\"\" != $configName) {\n\t\t\tpanelConfiguration -edit -label (localizedPanelLabel(\"Current Layout\")) \n\t\t\t\t-defaultImage \"vacantCell.xP:/\"\n\t\t\t\t-image \"\"\n\t\t\t\t-sc false\n\t\t\t\t-configString \"global string $gMainPane; paneLayout -e -cn \\\"single\\\" -ps 1 100 100 $gMainPane;\"\n\t\t\t\t-removeAllPanels\n\t\t\t\t-ap false\n\t\t\t\t\t(localizedPanelLabel(\"Persp View\")) \n\t\t\t\t\t\"modelPanel\"\n"
+ + "\t\t\t\t\t\"$panelName = `modelPanel -unParent -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels `;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 1\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 8192\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -maxConstantTransparency 1\\n -rendererName \\\"base_OpenGL_Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -greasePencils 1\\n -shadows 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n"
+ + "\t\t\t\t\t\"modelPanel -edit -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels $panelName;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 1\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 8192\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -maxConstantTransparency 1\\n -rendererName \\\"base_OpenGL_Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -greasePencils 1\\n -shadows 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n"
+ + "\t\t\t\t$configName;\n\n setNamedPanelLayout (localizedPanelLabel(\"Current Layout\"));\n }\n\n panelHistory -e -clear mainPanelHistory;\n setFocus `paneLayout -q -p1 $gMainPane`;\n sceneUIReplacement -deleteRemaining;\n sceneUIReplacement -clear;\n\t}\n\n\ngrid -spacing 5 -size 12 -divisions 5 -displayAxes yes -displayGridLines yes -displayDivisionLines yes -displayPerspectiveLabels no -displayOrthographicLabels no -displayAxesBold yes -perspectiveLabelPosition axis -orthographicLabelPosition edge;\nviewManip -drawCompass 0 -compassAngle 0 -frontParameters \"\" -homeParameters \"\" -selectionLockParameters \"\";\n}\n");
+ setAttr ".st" 3;
+createNode script -n "sceneConfigurationScriptNode";
+ setAttr ".b" -type "string" "playbackOptions -min 1 -max 24 -ast 1 -aet 48 ";
+ setAttr ".st" 6;
+createNode animCurveTU -n "L_cube_visibility";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr ".ktv[0]" 3 1;
+ setAttr ".kot[0]" 5;
+createNode animCurveTL -n "L_cube_translateX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr ".ktv[0]" 3 5;
+createNode animCurveTL -n "L_cube_translateY";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr ".ktv[0]" 3 2.3775028017191246;
+createNode animCurveTL -n "L_cube_translateZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr ".ktv[0]" 3 0;
+createNode animCurveTA -n "L_cube_rotateX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr ".ktv[0]" 3 0;
+createNode animCurveTA -n "L_cube_rotateY";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr ".ktv[0]" 3 0;
+createNode animCurveTA -n "L_cube_rotateZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr ".ktv[0]" 3 0;
+createNode animCurveTU -n "L_cube_scaleX";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr ".ktv[0]" 3 1;
+createNode animCurveTU -n "L_cube_scaleY";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr ".ktv[0]" 3 1;
+createNode animCurveTU -n "L_cube_scaleZ";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr ".ktv[0]" 3 1;
+select -ne :time1;
+ setAttr -av -k on ".cch";
+ setAttr -k on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr -k on ".o" 12;
+ setAttr ".unw" 12;
+select -ne :renderPartition;
+ setAttr -k on ".cch";
+ setAttr -k on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr -s 2 ".st";
+ setAttr -k on ".an";
+ setAttr -k on ".pt";
+select -ne :initialShadingGroup;
+ setAttr -k on ".cch";
+ setAttr -k on ".ihi";
+ setAttr -av -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr -s 4 ".dsm";
+ setAttr -k on ".mwc";
+ setAttr -k on ".an";
+ setAttr -k on ".il";
+ setAttr -k on ".vo";
+ setAttr -k on ".eo";
+ setAttr -k on ".fo";
+ setAttr -k on ".epo";
+ setAttr ".ro" yes;
+ setAttr -cb on ".mimt";
+ setAttr -cb on ".miop";
+ setAttr -cb on ".mise";
+ setAttr -cb on ".mism";
+ setAttr -cb on ".mice";
+ setAttr -av -cb on ".micc";
+ setAttr -cb on ".mica";
+ setAttr -cb on ".micw";
+ setAttr -cb on ".mirw";
+select -ne :initialParticleSE;
+ setAttr -k on ".cch";
+ setAttr -k on ".ihi";
+ setAttr -av -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr -k on ".mwc";
+ setAttr -k on ".an";
+ setAttr -k on ".il";
+ setAttr -k on ".vo";
+ setAttr -k on ".eo";
+ setAttr -k on ".fo";
+ setAttr -k on ".epo";
+ setAttr ".ro" yes;
+ setAttr -cb on ".mimt";
+ setAttr -cb on ".miop";
+ setAttr -cb on ".mise";
+ setAttr -cb on ".mism";
+ setAttr -cb on ".mice";
+ setAttr -av -cb on ".micc";
+ setAttr -cb on ".mica";
+ setAttr -av -cb on ".micw";
+ setAttr -cb on ".mirw";
+select -ne :defaultShaderList1;
+ setAttr -k on ".cch";
+ setAttr -k on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr -s 2 ".s";
+select -ne :postProcessList1;
+ setAttr -k on ".cch";
+ setAttr -k on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr -s 2 ".p";
+select -ne :defaultRenderingList1;
+select -ne :renderGlobalsList1;
+ setAttr -k on ".cch";
+ setAttr -k on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -cb on ".bnm";
+select -ne :defaultResolution;
+ setAttr ".pa" 1;
+select -ne :defaultLightSet;
+ setAttr -k on ".cch";
+ setAttr -k on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -k on ".bnm";
+ setAttr -k on ".mwc";
+ setAttr -k on ".an";
+ setAttr -k on ".il";
+ setAttr -k on ".vo";
+ setAttr -k on ".eo";
+ setAttr -k on ".fo";
+ setAttr -k on ".epo";
+ setAttr -k on ".ro" yes;
+select -ne :defaultObjectSet;
+ setAttr ".ro" yes;
+select -ne :hardwareRenderGlobals;
+ setAttr -k on ".cch";
+ setAttr -cb on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr ".ctrs" 256;
+ setAttr ".btrs" 512;
+ setAttr -k off ".fbfm";
+ setAttr -k off -cb on ".ehql";
+ setAttr -k off -cb on ".eams";
+ setAttr -k off -cb on ".eeaa";
+ setAttr -k off -cb on ".engm";
+ setAttr -k off -cb on ".mes";
+ setAttr -k off -cb on ".emb";
+ setAttr -av -k off -cb on ".mbbf";
+ setAttr -k off -cb on ".mbs";
+ setAttr -k off -cb on ".trm";
+ setAttr -k off -cb on ".tshc";
+ setAttr -k off ".enpt";
+ setAttr -k off -cb on ".clmt";
+ setAttr -k off -cb on ".tcov";
+ setAttr -k off -cb on ".lith";
+ setAttr -k off -cb on ".sobc";
+ setAttr -k off -cb on ".cuth";
+ setAttr -k off -cb on ".hgcd";
+ setAttr -k off -cb on ".hgci";
+ setAttr -k off -cb on ".mgcs";
+ setAttr -k off -cb on ".twa";
+ setAttr -k off -cb on ".twz";
+ setAttr -k on ".hwcc";
+ setAttr -k on ".hwdp";
+ setAttr -k on ".hwql";
+ setAttr -k on ".hwfr";
+select -ne :hardwareRenderingGlobals;
+ setAttr ".otfna" -type "stringArray" 18 "NURBS Curves" "NURBS Surfaces" "Polygons" "Subdiv Surfaces" "Particles" "Fluids" "Image Planes" "UI:" "Lights" "Cameras" "Locators" "Joints" "IK Handles" "Deformers" "Motion Trails" "Components" "Misc. UI" "Ornaments" ;
+ setAttr ".otfva" -type "Int32Array" 18 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 ;
+select -ne :defaultHardwareRenderGlobals;
+ setAttr -k on ".cch";
+ setAttr -cb on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr -k on ".rp";
+ setAttr -k on ".cai";
+ setAttr -k on ".coi";
+ setAttr -cb on ".bc";
+ setAttr -av -k on ".bcb";
+ setAttr -av -k on ".bcg";
+ setAttr -av -k on ".bcr";
+ setAttr -k on ".ei";
+ setAttr -k on ".ex";
+ setAttr -av -k on ".es";
+ setAttr -av -k on ".ef";
+ setAttr -av -k on ".bf";
+ setAttr -k on ".fii";
+ setAttr -av -k on ".sf";
+ setAttr -k on ".gr";
+ setAttr -k on ".li";
+ setAttr -k on ".ls";
+ setAttr -k on ".mb";
+ setAttr -k on ".ti";
+ setAttr -k on ".txt";
+ setAttr -k on ".mpr";
+ setAttr -k on ".wzd";
+ setAttr ".fn" -type "string" "im";
+ setAttr -k on ".if";
+ setAttr ".res" -type "string" "ntsc_4d 646 485 1.333";
+ setAttr -k on ".as";
+ setAttr -k on ".ds";
+ setAttr -k on ".lm";
+ setAttr -k on ".fir";
+ setAttr -k on ".aap";
+ setAttr -k on ".gh";
+ setAttr -cb on ".sd";
+connectAttr "polyCube1.out" "cubeRShape.i";
+connectAttr "L_cube_visibility.o" "L_cube.v";
+connectAttr "L_cube_translateX.o" "L_cube.tx";
+connectAttr "L_cube_translateY.o" "L_cube.ty";
+connectAttr "L_cube_translateZ.o" "L_cube.tz";
+connectAttr "L_cube_rotateX.o" "L_cube.rx";
+connectAttr "L_cube_rotateY.o" "L_cube.ry";
+connectAttr "L_cube_rotateZ.o" "L_cube.rz";
+connectAttr "L_cube_scaleX.o" "L_cube.sx";
+connectAttr "L_cube_scaleY.o" "L_cube.sy";
+connectAttr "L_cube_scaleZ.o" "L_cube.sz";
+connectAttr ":mentalrayGlobals.msg" ":mentalrayItemsList.glb";
+connectAttr ":miDefaultOptions.msg" ":mentalrayItemsList.opt" -na;
+connectAttr ":miDefaultFramebuffer.msg" ":mentalrayItemsList.fb" -na;
+connectAttr ":miDefaultOptions.msg" ":mentalrayGlobals.opt";
+connectAttr ":miDefaultFramebuffer.msg" ":mentalrayGlobals.fb";
+relationship "link" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message";
+relationship "link" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message";
+relationship "shadowLink" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message";
+relationship "shadowLink" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message";
+connectAttr "layerManager.dli[0]" "defaultLayer.id";
+connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid";
+connectAttr "cubeRShape.iog" ":initialShadingGroup.dsm" -na;
+connectAttr "cubeLShape.iog" ":initialShadingGroup.dsm" -na;
+connectAttr "R_cubeShape.iog" ":initialShadingGroup.dsm" -na;
+connectAttr "L_cubeShape.iog" ":initialShadingGroup.dsm" -na;
+connectAttr "defaultRenderLayer.msg" ":defaultRenderingList1.r" -na;
+// End of test_mirror_tables.ma
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_non_unique_names.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_non_unique_names.ma
new file mode 100644
index 0000000..00b814a
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_non_unique_names.ma
@@ -0,0 +1,797 @@
+//Maya ASCII 2017 scene
+//Name: test_non_unique_names.ma
+//Last modified: Sat, Feb 04, 2017 11:58:36 PM
+//Codeset: 1252
+file -rdi 1 -ns "srcSphere" -rfn "srcSphereRN" -typ "mayaAscii" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma";
+file -r -ns "srcSphere" -dr 1 -rfn "srcSphereRN" -typ "mayaAscii" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma";
+requires maya "2017";
+requires "stereoCamera" "10.0";
+currentUnit -l centimeter -a degree -t film;
+fileInfo "application" "maya";
+fileInfo "product" "Maya 2017";
+fileInfo "version" "2017";
+fileInfo "cutIdentifier" "201606150345-997974";
+fileInfo "osv" "Microsoft Windows 8 Business Edition, 64-bit (Build 9200)\n";
+createNode transform -s -n "persp";
+ rename -uid "DDAA8254-4753-78D5-6AAE-159C81EDC3F9";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" -123.17900131274617 74.628663135067598 32.661032572240735 ;
+ setAttr ".r" -type "double3" -30.338352727390017 -72.599999999996271 0 ;
+createNode camera -s -n "perspShape" -p "persp";
+ rename -uid "27F094E9-49EE-F1D7-052F-24B6AD29870D";
+ setAttr -k off ".v" no;
+ setAttr ".fl" 34.999999999999993;
+ setAttr ".coi" 150.42418693917088;
+ setAttr ".imn" -type "string" "persp";
+ setAttr ".den" -type "string" "persp_depth";
+ setAttr ".man" -type "string" "persp_mask";
+ setAttr ".hc" -type "string" "viewSet -p %camera";
+createNode transform -s -n "top";
+ rename -uid "E6DDBE5E-414D-598C-1652-DDA9896B2C18";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" 0 100.1 0 ;
+ setAttr ".r" -type "double3" -89.999999999999986 0 0 ;
+createNode camera -s -n "topShape" -p "top";
+ rename -uid "BA963D24-4FDB-8DA9-9320-68A3D19A3033";
+ setAttr -k off ".v" no;
+ setAttr ".rnd" no;
+ setAttr ".coi" 100.1;
+ setAttr ".ow" 30;
+ setAttr ".imn" -type "string" "top";
+ setAttr ".den" -type "string" "top_depth";
+ setAttr ".man" -type "string" "top_mask";
+ setAttr ".hc" -type "string" "viewSet -t %camera";
+ setAttr ".o" yes;
+createNode transform -s -n "front";
+ rename -uid "56938C00-4FC9-9BB5-7BA8-22B2465F51AC";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" 2.0350096678112575 0.39361762628711539 100.1 ;
+createNode camera -s -n "frontShape" -p "front";
+ rename -uid "25B2B187-477B-D3AA-AC82-5C9C5B6BD4DA";
+ setAttr -k off ".v" no;
+ setAttr ".rnd" no;
+ setAttr ".coi" 100.1;
+ setAttr ".ow" 61.766282942468983;
+ setAttr ".imn" -type "string" "front";
+ setAttr ".den" -type "string" "front_depth";
+ setAttr ".man" -type "string" "front_mask";
+ setAttr ".hc" -type "string" "viewSet -f %camera";
+ setAttr ".o" yes;
+createNode transform -s -n "side";
+ rename -uid "D0276B16-4FEE-5998-5D3D-E7AA9047C23C";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" 100.1 0 0 ;
+ setAttr ".r" -type "double3" 0 89.999999999999986 0 ;
+createNode camera -s -n "sideShape" -p "side";
+ rename -uid "52D7FE6B-4C52-8DC6-B4BD-73870EB09DB0";
+ setAttr -k off ".v" no;
+ setAttr ".rnd" no;
+ setAttr ".coi" 100.1;
+ setAttr ".ow" 30;
+ setAttr ".imn" -type "string" "side";
+ setAttr ".den" -type "string" "side_depth";
+ setAttr ".man" -type "string" "side_mask";
+ setAttr ".hc" -type "string" "viewSet -s %camera";
+ setAttr ".o" yes;
+createNode transform -n "group";
+ rename -uid "E0D02B96-4B6D-0116-B834-3A8B17F2574B";
+ addAttr -s false -ci true -sn "testMessage" -ln "testMessage" -at "message";
+createNode transform -n "offset" -p "group";
+ rename -uid "53E00748-4BAE-DC3E-72DA-C39AC1FABCA1";
+ setAttr -l on ".v";
+ setAttr -l on ".tx";
+ setAttr -l on ".ty";
+ setAttr -l on ".tz";
+ setAttr -l on ".rx";
+ setAttr -l on ".ry";
+ setAttr -l on ".rz";
+ setAttr -l on ".sx";
+ setAttr -l on ".sy";
+ setAttr -l on ".sz";
+createNode transform -n "lockedNode" -p "|group|offset";
+ rename -uid "C77C5FBF-4DA8-7E08-F3BE-AC9D0D00D0FC";
+createNode transform -n "sphere" -p "|group|offset|lockedNode";
+ rename -uid "8066C85B-4E94-344B-173A-698197FBAF5E";
+ addAttr -ci true -sn "testVector" -ln "testVector" -at "double3" -nc 3;
+ addAttr -ci true -sn "testVectorX" -ln "testVectorX" -at "double" -p "testVector";
+ addAttr -ci true -sn "testVectorY" -ln "testVectorY" -at "double" -p "testVector";
+ addAttr -ci true -sn "testVectorZ" -ln "testVectorZ" -at "double" -p "testVector";
+ addAttr -ci true -uac -sn "testColor" -ln "testColor" -at "float3" -nc 3;
+ addAttr -ci true -sn "testRed" -ln "testRed" -at "float" -p "testColor";
+ addAttr -ci true -sn "testGreen" -ln "testGreen" -at "float" -p "testColor";
+ addAttr -ci true -sn "testRed" -ln "testRed" -at "float" -p "testColor";
+ addAttr -ci true -sn "testString" -ln "testString" -dt "string";
+ addAttr -ci true -sn "testEnum" -ln "testEnum" -min 0 -max 2 -en "Apple:Lemon:Banana"
+ -at "enum";
+ addAttr -ci true -sn "testFloat" -ln "testFloat" -min 0 -max 10 -at "double";
+ addAttr -ci true -sn "testBoolean" -ln "testBoolean" -min 0 -max 1 -at "bool";
+ addAttr -ci true -sn "testInteger" -ln "testInteger" -min 0 -max 10 -at "long";
+ addAttr -ci true -sn "testLocked" -ln "testLocked" -min 0 -max 10 -at "double";
+ addAttr -ci true -sn "testHidden" -ln "testHidden" -min 0 -max 10 -at "double";
+ addAttr -ci true -sn "testConnect" -ln "testConnect" -at "double";
+ addAttr -ci true -sn "testAnimated" -ln "testAnimated" -at "double";
+ addAttr -s false -ci true -sn "testMessage" -ln "testMessage" -at "message";
+ addAttr -ci true -sn "testLimit" -ln "testLimit" -min -10 -max 10 -at "double";
+ addAttr -ci true -sn "testNonKeyable" -ln "testNonKeyable" -at "double";
+ setAttr -k on ".testVector";
+ setAttr -k on ".testVectorX";
+ setAttr -k on ".testVectorY";
+ setAttr -k on ".testVectorZ";
+ setAttr -k on ".testString";
+ setAttr -k on ".testEnum" 2;
+ setAttr -k on ".testFloat";
+ setAttr -k on ".testBoolean";
+ setAttr -k on ".testInteger";
+ setAttr -l on -k on ".testLocked";
+ setAttr -k on ".testConnect";
+ setAttr -k on ".testAnimated";
+ setAttr -k on ".testLimit";
+ setAttr -cb on ".testNonKeyable";
+createNode mesh -n "sphereShape" -p "|group|offset|lockedNode|sphere";
+ rename -uid "31DEDCCA-419C-842A-2745-C2BADE15FAD3";
+ setAttr -k off ".v";
+ setAttr ".vir" yes;
+ setAttr ".vif" yes;
+ setAttr ".uvst[0].uvsn" -type "string" "map1";
+ setAttr ".cuvs" -type "string" "map1";
+ setAttr ".dcc" -type "string" "Ambient+Diffuse";
+ setAttr ".covm[0]" 0 1 1;
+ setAttr ".cdvm[0]" 0 1 1;
+ setAttr ".ugsdt" no;
+ setAttr ".vnm" 0;
+createNode transform -n "group1";
+ rename -uid "3BD55A1F-4D3B-0600-E76E-A3B8DDB90A9E";
+ addAttr -s false -ci true -sn "testMessage" -ln "testMessage" -at "message";
+createNode transform -n "offset" -p "group1";
+ rename -uid "DB0A4EF6-440F-3E67-85E1-F6A0FC8B3359";
+ setAttr -l on ".v";
+ setAttr -l on ".tx";
+ setAttr -l on ".ty";
+ setAttr -l on ".tz";
+ setAttr -l on ".rx";
+ setAttr -l on ".ry";
+ setAttr -l on ".rz";
+ setAttr -l on ".sx";
+ setAttr -l on ".sy";
+ setAttr -l on ".sz";
+createNode transform -n "lockedNode" -p "|group1|offset";
+ rename -uid "425F552C-4C6B-094E-065C-43BF75DE749F";
+createNode transform -n "sphere" -p "|group1|offset|lockedNode";
+ rename -uid "D9F1C1EE-4A3B-CC6C-E2F6-D0AD5B44CB13";
+ addAttr -ci true -sn "testVector" -ln "testVector" -at "double3" -nc 3;
+ addAttr -ci true -sn "testVectorX" -ln "testVectorX" -at "double" -p "testVector";
+ addAttr -ci true -sn "testVectorY" -ln "testVectorY" -at "double" -p "testVector";
+ addAttr -ci true -sn "testVectorZ" -ln "testVectorZ" -at "double" -p "testVector";
+ addAttr -ci true -uac -sn "testColor" -ln "testColor" -at "float3" -nc 3;
+ addAttr -ci true -sn "testRed" -ln "testRed" -at "float" -p "testColor";
+ addAttr -ci true -sn "testGreen" -ln "testGreen" -at "float" -p "testColor";
+ addAttr -ci true -sn "testRed" -ln "testRed" -at "float" -p "testColor";
+ addAttr -ci true -sn "testString" -ln "testString" -dt "string";
+ addAttr -ci true -sn "testEnum" -ln "testEnum" -min 0 -max 2 -en "Apple:Lemon:Banana"
+ -at "enum";
+ addAttr -ci true -sn "testFloat" -ln "testFloat" -min 0 -max 10 -at "double";
+ addAttr -ci true -sn "testBoolean" -ln "testBoolean" -min 0 -max 1 -at "bool";
+ addAttr -ci true -sn "testInteger" -ln "testInteger" -min 0 -max 10 -at "long";
+ addAttr -ci true -sn "testLocked" -ln "testLocked" -min 0 -max 10 -at "double";
+ addAttr -ci true -sn "testHidden" -ln "testHidden" -min 0 -max 10 -at "double";
+ addAttr -ci true -sn "testConnect" -ln "testConnect" -at "double";
+ addAttr -ci true -sn "testAnimated" -ln "testAnimated" -at "double";
+ addAttr -s false -ci true -sn "testMessage" -ln "testMessage" -at "message";
+ setAttr -k on ".testVector";
+ setAttr -k on ".testVectorX";
+ setAttr -k on ".testVectorY";
+ setAttr -k on ".testVectorZ";
+ setAttr -k on ".testString";
+ setAttr -k on ".testEnum" 2;
+ setAttr -k on ".testFloat";
+ setAttr -k on ".testBoolean";
+ setAttr -k on ".testInteger";
+ setAttr -l on -k on ".testLocked";
+ setAttr -k on ".testConnect";
+ setAttr -k on ".testAnimated";
+createNode mesh -n "sphereShape" -p "|group1|offset|lockedNode|sphere";
+ rename -uid "4D2BA5B2-42B9-056B-13C8-D285A9FBD044";
+ setAttr -k off ".v";
+ setAttr ".vir" yes;
+ setAttr ".vif" yes;
+ setAttr ".uvst[0].uvsn" -type "string" "map1";
+ setAttr ".cuvs" -type "string" "map1";
+ setAttr ".dcc" -type "string" "Ambient+Diffuse";
+ setAttr ".covm[0]" 0 1 1;
+ setAttr ".cdvm[0]" 0 1 1;
+ setAttr ".ugsdt" no;
+ setAttr ".vnm" 0;
+createNode lightLinker -s -n "lightLinker1";
+ rename -uid "548C9C33-497A-C6D1-8D06-98B89D3D62D8";
+ setAttr -s 2 ".lnk";
+ setAttr -s 2 ".slnk";
+createNode displayLayerManager -n "layerManager";
+ rename -uid "82379A41-4D50-EE15-B9ED-688E288FD51B";
+createNode displayLayer -n "defaultLayer";
+ rename -uid "3283B76B-49A2-D9EB-14C2-4C827D163B8F";
+createNode renderLayerManager -n "renderLayerManager";
+ rename -uid "72986805-4CFF-9FD5-4A52-5F9D8DBB9B59";
+createNode renderLayer -n "defaultRenderLayer";
+ rename -uid "F62FFC33-4D56-2BEB-B85F-A6A272377F4C";
+ setAttr ".g" yes;
+createNode script -n "sceneConfigurationScriptNode";
+ rename -uid "7FD6986F-4794-3763-3E36-59852AA535BF";
+ setAttr ".b" -type "string" "playbackOptions -min 1 -max 24 -ast 1 -aet 48 ";
+ setAttr ".st" 6;
+createNode reference -n "srcSphereRN";
+ rename -uid "236A7996-4E4A-8901-858E-DDBE7FC55F9A";
+ setAttr -s 16 ".phl";
+ setAttr ".phl[1]" 0;
+ setAttr ".phl[2]" 0;
+ setAttr ".phl[3]" 0;
+ setAttr ".phl[4]" 0;
+ setAttr ".phl[5]" 0;
+ setAttr ".phl[6]" 0;
+ setAttr ".phl[7]" 0;
+ setAttr ".phl[8]" 0;
+ setAttr ".phl[9]" 0;
+ setAttr ".phl[10]" 0;
+ setAttr ".phl[11]" 0;
+ setAttr ".phl[12]" 0;
+ setAttr ".phl[13]" 0;
+ setAttr ".phl[14]" 0;
+ setAttr ".phl[15]" 0;
+ setAttr ".phl[16]" 0;
+ setAttr ".ed" -type "dataReferenceEdits"
+ "srcSphereRN"
+ "srcSphereRN" 0
+ "srcSphereRN" 43
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "visibility" " 1"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translate" " -type \"double3\" 0 5 0"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translateX" " -av"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translateY" " -av"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translateZ" " -av"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotate" " -type \"double3\" 0 0 0"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotateX" " -av"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotateY" " -av"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotateZ" " -av"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "scale" " -type \"double3\" 1 1 1"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "translate" " -type \"double3\" 0 8 -12"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "translateZ" " -av"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "rotate" " -type \"double3\" 45 50 90"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "rotateX" " -av"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "rotateY" " -av"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "rotateZ" " -av"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "scale" " -type \"double3\" 0.25 4.66 0.5"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "scaleX" " -av"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "scaleY" " -av"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "scaleZ" " -av"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testVector" " -k 1 -type \"double3\" 0.2 1.4 2.6"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testVector" " -k 1"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testVectorX" " -k 1"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testVectorY" " -av -k 1"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testVectorZ" " -k 1"
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testColor" " -type \"float3\" 0.18000000999999999 0.60000001999999997 0.18000000999999999"
+
+ 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere"
+ "testString" " -k 1 -type \"string\" \"Hello world\""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode.translateZ"
+ "srcSphereRN.placeHolderList[1]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testVectorX"
+ "srcSphereRN.placeHolderList[2]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testVectorY"
+ "srcSphereRN.placeHolderList[3]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testVectorZ"
+ "srcSphereRN.placeHolderList[4]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testEnum"
+ "srcSphereRN.placeHolderList[5]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testFloat"
+ "srcSphereRN.placeHolderList[6]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testBoolean"
+ "srcSphereRN.placeHolderList[7]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testInteger"
+ "srcSphereRN.placeHolderList[8]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.translateY"
+ "srcSphereRN.placeHolderList[9]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.translateX"
+ "srcSphereRN.placeHolderList[10]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.translateZ"
+ "srcSphereRN.placeHolderList[11]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.rotateX"
+ "srcSphereRN.placeHolderList[12]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.rotateZ"
+ "srcSphereRN.placeHolderList[13]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.scaleX"
+ "srcSphereRN.placeHolderList[14]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.scaleZ"
+ "srcSphereRN.placeHolderList[15]" ""
+ 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.visibility"
+ "srcSphereRN.placeHolderList[16]" "";
+ setAttr ".ptag" -type "string" "";
+lockNode -l 1 ;
+createNode animCurveTU -n "srcSphere:sphere_visibility";
+ rename -uid "25B7A44D-46CB-EE48-EBD0-1E9ADC4681DE";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTL -n "srcSphere:sphere_translateX";
+ rename -uid "D13498C8-4E35-AB33-9DA8-D0B1AB09A06C";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 0;
+createNode animCurveTL -n "srcSphere:sphere_translateY";
+ rename -uid "30A68F0C-473D-C3BD-68EE-1A97C506CB8A";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 8 10 8;
+createNode animCurveTL -n "srcSphere:sphere_translateZ";
+ rename -uid "591EE7E4-471A-2A88-0F1D-48A0CA2F575E";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292;
+createNode animCurveTA -n "srcSphere:sphere_rotateX";
+ rename -uid "7DAF1ACE-4BF1-C12E-BD6B-A5A56B35773F";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841;
+createNode animCurveTA -n "srcSphere:sphere_rotateZ";
+ rename -uid "86BF49D8-4C94-99EC-28F6-2EA727F428F4";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096;
+createNode animCurveTU -n "srcSphere:sphere_scaleX";
+ rename -uid "9C679B5C-4862-3674-978A-D484AEE966E3";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792;
+createNode animCurveTU -n "srcSphere:sphere_scaleZ";
+ rename -uid "F8AEC957-4DD2-855F-9D56-69B153BA1F5C";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585;
+createNode animCurveTU -n "srcSphere:sphere_testVectorX";
+ rename -uid "D3E850E5-45D3-3797-2452-828BC0F88BF5";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2;
+createNode animCurveTU -n "srcSphere:sphere_testVectorY";
+ rename -uid "411854EA-4881-2F52-8A0C-DCB3502416B8";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4;
+createNode animCurveTU -n "srcSphere:sphere_testVectorZ";
+ rename -uid "502BF718-4050-BBE2-991E-77BE7C123CAA";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6;
+createNode animCurveTU -n "srcSphere:sphere_testEnum";
+ rename -uid "8CF62262-46FF-9062-6DED-C4AA2B2CCE2E";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTU -n "srcSphere:sphere_testFloat";
+ rename -uid "498C6886-4FDB-563B-723A-A8A9474E9570";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666;
+createNode animCurveTU -n "srcSphere:sphere_testBoolean";
+ rename -uid "143ED449-4120-35D8-6BC9-A98C802C5CA3";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTU -n "srcSphere:sphere_testInteger";
+ rename -uid "E96551ED-459B-4C0A-CDDA-44A263050285";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 5 10 5;
+createNode animCurveTL -n "dstSphere:sphere_translateY";
+ rename -uid "20E5403E-4B3D-0674-161A-91A6924D0559";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 8 10 8;
+createNode animCurveTL -n "lockedNode_translateZ";
+ rename -uid "B63F154D-4C27-9666-D375-138ED9037730";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 15;
+createNode animCurveTU -n "sphere_testInteger";
+ rename -uid "97499943-4659-497E-3F90-61B92034A6C4";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 5 10 5;
+createNode animCurveTU -n "sphere_testEnum";
+ rename -uid "B071F69A-4FC0-DA63-9FFE-4A94AA5979B4";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTL -n "sphere_translateX";
+ rename -uid "0768FFC8-4267-269E-B230-439D662AADFE";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 0;
+createNode animCurveTL -n "sphere_translateZ";
+ rename -uid "4C1A73F4-461D-F4BA-D731-D4B281F14C48";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292;
+createNode animCurveTU -n "sphere_testFloat";
+ rename -uid "4CE18D96-4C85-2A00-A762-A7A94AE1606A";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666;
+createNode animCurveTU -n "sphere_scaleX";
+ rename -uid "866CDCF6-4F4D-103D-63EC-729E61A6D480";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792;
+createNode animCurveTU -n "sphere_testVectorZ";
+ rename -uid "AEBEFB59-4872-F7FD-CADC-EAA305119536";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6;
+createNode animCurveTU -n "sphere_scaleZ";
+ rename -uid "EFB25E16-44ED-32F9-943A-ED8A845F4D39";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585;
+createNode animCurveTA -n "sphere_rotateX";
+ rename -uid "19C44183-45EF-1073-AE60-D0AC778E182D";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841;
+createNode animCurveTU -n "sphere_testVectorY";
+ rename -uid "B55F1B53-48D5-A874-A1E0-C0B71E545F06";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4;
+createNode animCurveTA -n "sphere_rotateZ";
+ rename -uid "07252CD5-4363-F661-068A-66B3EF78D16A";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096;
+createNode animCurveTU -n "sphere_visibility";
+ rename -uid "F78C1BCC-435D-D057-01ED-D1B15A6BE60B";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTU -n "sphere_testVectorX";
+ rename -uid "9FAF8611-4755-AE77-1A60-4FA5FF5469C7";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2;
+createNode animCurveTU -n "sphere_testBoolean";
+ rename -uid "55CCB691-471C-1916-5F57-D78DFC7CE524";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 10 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+createNode animCurveTL -n "lockedNode_translateZ1";
+ rename -uid "12CDCBC7-41D0-13DA-F2E6-04B9FC31CE19";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 15;
+createNode renderLayerManager -n "dstSphere:renderLayerManager";
+ rename -uid "88F08ACE-4F04-45CD-ED01-1DAC296CF287";
+createNode renderLayer -n "dstSphere:defaultRenderLayer";
+ rename -uid "97E29F6D-495A-42D8-7A95-BDADCBE099F0";
+ setAttr ".g" yes;
+createNode animCurveTU -n "sphere_testAnimated";
+ rename -uid "A38AFFD7-4BB6-7949-58F0-1DA330C26C51";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 10;
+createNode polySphere -n "srcPolySphere";
+ rename -uid "9DC42CA0-4D9A-CAA0-B1D3-56A34DA33DDA";
+ setAttr ".r" 4.1417806816985845;
+createNode animCurveTU -n "sphere_testAnimated1";
+ rename -uid "4785293F-43CF-7E0E-6273-0A9CE9B8C052";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 0 10 10;
+createNode polySphere -n "srcPolySphere1";
+ rename -uid "22D3CF49-4D45-E0C1-99E9-98949F65BC37";
+ setAttr ".r" 4.1417806816985845;
+createNode shapeEditorManager -n "shapeEditorManager";
+ rename -uid "4E61DE05-49DE-4ABA-D703-36AE442A88AD";
+createNode poseInterpolatorManager -n "poseInterpolatorManager";
+ rename -uid "A2E4EC6B-4BE3-25B3-9E39-BCB3468204D9";
+createNode script -n "uiConfigurationScriptNode";
+ rename -uid "5DFFAA9C-4881-F956-58D0-CE9DBC5970AC";
+ setAttr ".b" -type "string" (
+ "// Maya Mel UI Configuration File.\n//\n// This script is machine generated. Edit at your own risk.\n//\n//\n\nglobal string $gMainPane;\nif (`paneLayout -exists $gMainPane`) {\n\n\tglobal int $gUseScenePanelConfig;\n\tint $useSceneConfig = $gUseScenePanelConfig;\n\tint $menusOkayInPanels = `optionVar -q allowMenusInPanels`;\tint $nVisPanes = `paneLayout -q -nvp $gMainPane`;\n\tint $nPanes = 0;\n\tstring $editorName;\n\tstring $panelName;\n\tstring $itemFilterName;\n\tstring $panelConfig;\n\n\t//\n\t// get current state of the UI\n\t//\n\tsceneUIReplacement -update $gMainPane;\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Top View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n"
+ + " -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n"
+ + " -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n"
+ + " -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n"
+ + " -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n"
+ + " -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n"
+ + " -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n"
+ + " modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Side View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n"
+ + " -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n"
+ + " -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n"
+ + " -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n"
+ + " -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n"
+ + " -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n"
+ + " -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Front View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels `;\n"
+ + "\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n"
+ + " -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n"
+ + " -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n"
+ + " -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n"
+ + " -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n"
+ + " -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n"
+ + " -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Persp View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n"
+ + " -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n"
+ + " -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n"
+ + " -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 2058\n -height 1022\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n"
+ + "\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n"
+ + " -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n"
+ + " -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 2058\n -height 1022\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n"
+ + " $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"ToggledOutliner\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `outlinerPanel -unParent -l (localizedPanelLabel(\"ToggledOutliner\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n"
+ + " -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n"
+ + " -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"ToggledOutliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n"
+ + " -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n"
+ + " -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"Outliner\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `outlinerPanel -unParent -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n outlinerEditor -e \n"
+ + " -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n"
+ + " -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n"
+ + "\t\toutlinerPanel -edit -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n"
+ + " -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"graphEditor\" (localizedPanelLabel(\"Graph Editor\")) `;\n"
+ + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"graphEditor\" -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n"
+ + " -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 1\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n"
+ + " -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 1\n -displayInfinities 0\n -displayValues 0\n -autoFit 1\n -snapTime \"integer\" \n -snapValue \"none\" \n -showResults \"off\" \n -showBufferCurves \"off\" \n -smoothness \"fine\" \n -resultSamples 0.96\n -resultScreenSamples 0\n -resultUpdate \"delayed\" \n -showUpstreamCurves 1\n -showCurveNames 0\n -showActiveCurveNames 0\n -stackedCurves 0\n -stackedCurvesMin -1\n -stackedCurvesMax 1\n -stackedCurvesSpace 0.2\n"
+ + " -displayNormalized 0\n -preSelectionHighlight 0\n -constrainDrag 0\n -classicMode 1\n -valueLinesToggle 1\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n"
+ + " -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 1\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n"
+ + " -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 1\n -displayInfinities 0\n -displayValues 0\n -autoFit 1\n -snapTime \"integer\" \n -snapValue \"none\" \n -showResults \"off\" \n -showBufferCurves \"off\" \n -smoothness \"fine\" \n -resultSamples 0.96\n -resultScreenSamples 0\n -resultUpdate \"delayed\" \n -showUpstreamCurves 1\n -showCurveNames 0\n"
+ + " -showActiveCurveNames 0\n -stackedCurves 0\n -stackedCurvesMin -1\n -stackedCurvesMax 1\n -stackedCurvesSpace 0.2\n -displayNormalized 0\n -preSelectionHighlight 0\n -constrainDrag 0\n -classicMode 1\n -valueLinesToggle 1\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dopeSheetPanel\" (localizedPanelLabel(\"Dope Sheet\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dopeSheetPanel\" -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n"
+ + " -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 0\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n"
+ + " -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n"
+ + " -displayValues 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -outliner \"dopeSheetPanel1OutlineEd\" \n -showSummary 1\n -showScene 0\n -hierarchyBelow 0\n -showTicks 1\n -selectionWindow 0 0 0 0 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n"
+ + " -autoExpand 0\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 0\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n"
+ + " -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -outliner \"dopeSheetPanel1OutlineEd\" \n -showSummary 1\n"
+ + " -showScene 0\n -hierarchyBelow 0\n -showTicks 1\n -selectionWindow 0 0 0 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"timeEditorPanel\" (localizedPanelLabel(\"Time Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"timeEditorPanel\" -l (localizedPanelLabel(\"Time Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Time Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"clipEditorPanel\" (localizedPanelLabel(\"Trax Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"clipEditorPanel\" -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels `;\n"
+ + "\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 0 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n"
+ + " -initialized 0\n -manageSequencer 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"sequenceEditorPanel\" (localizedPanelLabel(\"Camera Sequencer\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"sequenceEditorPanel\" -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n"
+ + "\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperGraphPanel\" (localizedPanelLabel(\"Hypergraph Hierarchy\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"hyperGraphPanel\" -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n"
+ + " hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n -orientation \"horiz\" \n -mergeConnections 0\n -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n -showExpressions 0\n -showConstraints 0\n -showConnectionFromSelected 0\n -showConnectionToSelected 0\n -showConstraintLabels 0\n -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -imagePosition 0 0 \n -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n"
+ + " -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n -orientation \"horiz\" \n -mergeConnections 0\n -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n -showExpressions 0\n -showConstraints 0\n -showConnectionFromSelected 0\n -showConnectionToSelected 0\n -showConstraintLabels 0\n -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -imagePosition 0 0 \n"
+ + " -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"visorPanel\" (localizedPanelLabel(\"Visor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"visorPanel\" -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"createNodePanel\" (localizedPanelLabel(\"Create Node\")) `;\n"
+ + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"createNodePanel\" -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"polyTexturePlacementPanel\" (localizedPanelLabel(\"UV Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"polyTexturePlacementPanel\" -l (localizedPanelLabel(\"UV Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"UV Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"renderWindowPanel\" (localizedPanelLabel(\"Render View\")) `;\n"
+ + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"renderWindowPanel\" -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"shapePanel\" (localizedPanelLabel(\"Shape Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\tshapePanel -unParent -l (localizedPanelLabel(\"Shape Editor\")) -mbv $menusOkayInPanels ;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tshapePanel -edit -l (localizedPanelLabel(\"Shape Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"posePanel\" (localizedPanelLabel(\"Pose Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\tposePanel -unParent -l (localizedPanelLabel(\"Pose Editor\")) -mbv $menusOkayInPanels ;\n"
+ + "\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tposePanel -edit -l (localizedPanelLabel(\"Pose Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynRelEdPanel\" (localizedPanelLabel(\"Dynamic Relationships\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dynRelEdPanel\" -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"relationshipPanel\" (localizedPanelLabel(\"Relationship Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"relationshipPanel\" -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels `;\n"
+ + "\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"referenceEditorPanel\" (localizedPanelLabel(\"Reference Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"referenceEditorPanel\" -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"componentEditorPanel\" (localizedPanelLabel(\"Component Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"componentEditorPanel\" -l (localizedPanelLabel(\"Component Editor\")) -mbv $menusOkayInPanels `;\n"
+ + "\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Component Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynPaintScriptedPanelType\" (localizedPanelLabel(\"Paint Effects\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dynPaintScriptedPanelType\" -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"scriptEditorPanel\" (localizedPanelLabel(\"Script Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"scriptEditorPanel\" -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels `;\n"
+ + "\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"profilerPanel\" (localizedPanelLabel(\"Profiler Tool\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"profilerPanel\" -l (localizedPanelLabel(\"Profiler Tool\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Profiler Tool\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"contentBrowserPanel\" (localizedPanelLabel(\"Content Browser\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"contentBrowserPanel\" -l (localizedPanelLabel(\"Content Browser\")) -mbv $menusOkayInPanels `;\n"
+ + "\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Content Browser\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"Stereo\" (localizedPanelLabel(\"Stereo\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"Stereo\" -l (localizedPanelLabel(\"Stereo\")) -mbv $menusOkayInPanels `;\nstring $editorName = ($panelName+\"Editor\");\n stereoCameraView -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n"
+ + " -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 4 4 \n -bumpResolution 4 4 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n"
+ + " -lowQualityLighting 0\n -maximumNumHardwareLights 0\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n"
+ + " -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 0\n -height 0\n -sceneRenderFilter 0\n -displayMode \"centerEye\" \n -viewColor 0 0 0 1 \n -useCustomBackground 1\n $editorName;\n stereoCameraView -e -viewSelected 0 $editorName;\n stereoCameraView -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Stereo\")) -mbv $menusOkayInPanels $panelName;\nstring $editorName = ($panelName+\"Editor\");\n"
+ + " stereoCameraView -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n"
+ + " -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 4 4 \n -bumpResolution 4 4 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 0\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n"
+ + " -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 0\n -height 0\n"
+ + " -sceneRenderFilter 0\n -displayMode \"centerEye\" \n -viewColor 0 0 0 1 \n -useCustomBackground 1\n $editorName;\n stereoCameraView -e -viewSelected 0 $editorName;\n stereoCameraView -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"Outliner\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `outlinerPanel -unParent -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n"
+ + " -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n"
+ + " -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels $panelName;\n"
+ + "\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n"
+ + " -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n"
+ + "\t\t}\n\t}\n\tif ($useSceneConfig) {\n\t\toutlinerPanel -e -to $panelName;\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperShadePanel\" (localizedPanelLabel(\"Hypershade\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"hyperShadePanel\" -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"nodeEditorPanel\" (localizedPanelLabel(\"Node Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"nodeEditorPanel\" -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n"
+ + " -consistentNameSize 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -defaultPinnedState 0\n -additiveGraphingMode 0\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -useAssets 1\n -syncedSelection 1\n -extendToShapes 1\n -activeTab -1\n -editorMode \"default\" \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n"
+ + " -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -consistentNameSize 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -defaultPinnedState 0\n -additiveGraphingMode 0\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -useAssets 1\n -syncedSelection 1\n -extendToShapes 1\n -activeTab -1\n -editorMode \"default\" \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\tif ($useSceneConfig) {\n string $configName = `getPanel -cwl (localizedPanelLabel(\"Current Layout\"))`;\n"
+ + " if (\"\" != $configName) {\n\t\t\tpanelConfiguration -edit -label (localizedPanelLabel(\"Current Layout\")) \n\t\t\t\t-userCreated false\n\t\t\t\t-defaultImage \"vacantCell.xP:/\"\n\t\t\t\t-image \"\"\n\t\t\t\t-sc false\n\t\t\t\t-configString \"global string $gMainPane; paneLayout -e -cn \\\"single\\\" -ps 1 100 100 $gMainPane;\"\n\t\t\t\t-removeAllPanels\n\t\t\t\t-ap false\n\t\t\t\t\t(localizedPanelLabel(\"Persp View\")) \n\t\t\t\t\t\"modelPanel\"\n"
+ + "\t\t\t\t\t\"$panelName = `modelPanel -unParent -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels `;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -holdOuts 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 0\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 16384\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -depthOfFieldPreview 1\\n -maxConstantTransparency 1\\n -rendererName \\\"vp2Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -particleInstancers 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -greasePencils 1\\n -shadows 0\\n -captureSequenceNumber -1\\n -width 2058\\n -height 1022\\n -sceneRenderFilter 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n"
+ + "\t\t\t\t\t\"modelPanel -edit -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels $panelName;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -holdOuts 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 0\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 16384\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -depthOfFieldPreview 1\\n -maxConstantTransparency 1\\n -rendererName \\\"vp2Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -particleInstancers 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -greasePencils 1\\n -shadows 0\\n -captureSequenceNumber -1\\n -width 2058\\n -height 1022\\n -sceneRenderFilter 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n"
+ + "\t\t\t\t$configName;\n\n setNamedPanelLayout (localizedPanelLabel(\"Current Layout\"));\n }\n\n panelHistory -e -clear mainPanelHistory;\n setFocus `paneLayout -q -p1 $gMainPane`;\n sceneUIReplacement -deleteRemaining;\n sceneUIReplacement -clear;\n\t}\n\n\ngrid -spacing 5 -size 12 -divisions 5 -displayAxes yes -displayGridLines yes -displayDivisionLines yes -displayPerspectiveLabels no -displayOrthographicLabels no -displayAxesBold yes -perspectiveLabelPosition axis -orthographicLabelPosition edge;\nviewManip -drawCompass 0 -compassAngle 0 -frontParameters \"\" -homeParameters \"\" -selectionLockParameters \"\";\n}\n");
+ setAttr ".st" 3;
+select -ne :time1;
+ setAttr -av -k on ".cch";
+ setAttr -cb on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr -k on ".o" 1;
+ setAttr -k on ".unw" 1;
+ setAttr -k on ".etw";
+ setAttr -k on ".tps";
+ setAttr -k on ".tms";
+lockNode -l 1 ;
+select -ne :hardwareRenderingGlobals;
+ setAttr ".otfna" -type "stringArray" 18 "NURBS Curves" "NURBS Surfaces" "Polygons" "Subdiv Surfaces" "Particles" "Fluids" "Image Planes" "UI:" "Lights" "Cameras" "Locators" "Joints" "IK Handles" "Deformers" "Motion Trails" "Components" "Misc. UI" "Ornaments" ;
+ setAttr ".otfva" -type "Int32Array" 18 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 ;
+select -ne :renderPartition;
+ setAttr -k on ".cch";
+ setAttr -cb on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr -s 2 ".st";
+ setAttr -cb on ".an";
+ setAttr -cb on ".pt";
+lockNode -l 1 ;
+select -ne :renderGlobalsList1;
+ setAttr -k on ".cch";
+ setAttr -cb on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -cb on ".bnm";
+select -ne :defaultShaderList1;
+ setAttr -k on ".cch";
+ setAttr -cb on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr -s 4 ".s";
+select -ne :postProcessList1;
+ setAttr -k on ".cch";
+ setAttr -cb on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr -s 2 ".p";
+select -ne :defaultRenderingList1;
+ setAttr -s 3 ".r";
+select -ne :initialShadingGroup;
+ setAttr -k on ".cch";
+ setAttr -cb on ".ihi";
+ setAttr -av -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr -s 3 ".dsm";
+ setAttr -k on ".mwc";
+ setAttr -cb on ".an";
+ setAttr -cb on ".il";
+ setAttr -cb on ".vo";
+ setAttr -cb on ".eo";
+ setAttr -cb on ".fo";
+ setAttr -cb on ".epo";
+ setAttr -k on ".ro" yes;
+lockNode -l 1 ;
+select -ne :initialParticleSE;
+ setAttr -av -k on ".cch";
+ setAttr -cb on ".ihi";
+ setAttr -av -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr -k on ".mwc";
+ setAttr -cb on ".an";
+ setAttr -cb on ".il";
+ setAttr -cb on ".vo";
+ setAttr -cb on ".eo";
+ setAttr -cb on ".fo";
+ setAttr -cb on ".epo";
+ setAttr -k on ".ro" yes;
+select -ne :defaultRenderGlobals;
+ setAttr ".ep" 1;
+select -ne :defaultResolution;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -av ".w" 640;
+ setAttr -av ".h" 480;
+ setAttr -k on ".pa" 1;
+ setAttr -k on ".al";
+ setAttr -av ".dar" 1.3333332538604736;
+ setAttr -k on ".ldar";
+ setAttr -k on ".off";
+ setAttr -k on ".fld";
+ setAttr -k on ".zsl";
+select -ne :defaultLightSet;
+ setAttr -k on ".cch";
+ setAttr -k on ".ihi";
+ setAttr -av -k on ".nds";
+ setAttr -k on ".bnm";
+ setAttr -k on ".mwc";
+ setAttr -k on ".an";
+ setAttr -k on ".il";
+ setAttr -k on ".vo";
+ setAttr -k on ".eo";
+ setAttr -k on ".fo";
+ setAttr -k on ".epo";
+ setAttr -k on ".ro" yes;
+select -ne :defaultObjectSet;
+ setAttr ".ro" yes;
+lockNode -l 1 ;
+select -ne :defaultColorMgtGlobals;
+ setAttr ".cme" no;
+select -ne :hardwareRenderGlobals;
+ setAttr -k on ".cch";
+ setAttr -cb on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -cb on ".bnm";
+ setAttr ".ctrs" 256;
+ setAttr ".btrs" 512;
+ setAttr -k off ".fbfm";
+ setAttr -k off -cb on ".ehql";
+ setAttr -k off -cb on ".eams";
+ setAttr -k off -cb on ".eeaa";
+ setAttr -k off -cb on ".engm";
+ setAttr -k off -cb on ".mes";
+ setAttr -k off -cb on ".emb";
+ setAttr -av -k off -cb on ".mbbf";
+ setAttr -k off -cb on ".mbs";
+ setAttr -k off -cb on ".trm";
+ setAttr -k off -cb on ".tshc";
+ setAttr -k off ".enpt";
+ setAttr -k off -cb on ".clmt";
+ setAttr -k off -cb on ".tcov";
+ setAttr -k off -cb on ".lith";
+ setAttr -k off -cb on ".sobc";
+ setAttr -k off -cb on ".cuth";
+ setAttr -k off -cb on ".hgcd";
+ setAttr -k off -cb on ".hgci";
+ setAttr -k off -cb on ".mgcs";
+ setAttr -k off -cb on ".twa";
+ setAttr -k off -cb on ".twz";
+ setAttr -k on ".hwcc";
+ setAttr -k on ".hwdp";
+ setAttr -k on ".hwql";
+ setAttr -k on ".hwfr";
+select -ne :ikSystem;
+ setAttr -k on ".cch";
+ setAttr -k on ".ihi";
+ setAttr -k on ".nds";
+ setAttr -k on ".bnm";
+ setAttr -av ".gsn";
+ setAttr -k on ".gsv";
+ setAttr -s 4 ".sol";
+connectAttr "lockedNode_translateZ.o" "srcSphereRN.phl[1]";
+connectAttr "srcSphere:sphere_testVectorX.o" "srcSphereRN.phl[2]";
+connectAttr "srcSphere:sphere_testVectorY.o" "srcSphereRN.phl[3]";
+connectAttr "srcSphere:sphere_testVectorZ.o" "srcSphereRN.phl[4]";
+connectAttr "srcSphere:sphere_testEnum.o" "srcSphereRN.phl[5]";
+connectAttr "srcSphere:sphere_testFloat.o" "srcSphereRN.phl[6]";
+connectAttr "srcSphere:sphere_testBoolean.o" "srcSphereRN.phl[7]";
+connectAttr "srcSphere:sphere_testInteger.o" "srcSphereRN.phl[8]";
+connectAttr "srcSphere:sphere_translateY.o" "srcSphereRN.phl[9]";
+connectAttr "srcSphere:sphere_translateX.o" "srcSphereRN.phl[10]";
+connectAttr "srcSphere:sphere_translateZ.o" "srcSphereRN.phl[11]";
+connectAttr "srcSphere:sphere_rotateX.o" "srcSphereRN.phl[12]";
+connectAttr "srcSphere:sphere_rotateZ.o" "srcSphereRN.phl[13]";
+connectAttr "srcSphere:sphere_scaleX.o" "srcSphereRN.phl[14]";
+connectAttr "srcSphere:sphere_scaleZ.o" "srcSphereRN.phl[15]";
+connectAttr "srcSphere:sphere_visibility.o" "srcSphereRN.phl[16]";
+connectAttr "|group|offset|lockedNode|sphere.msg" "group.testMessage" -l on;
+connectAttr "|group|offset|lockedNode|sphere.ty" "|group|offset|lockedNode|sphere.testConnect"
+ ;
+connectAttr "sphere_testAnimated.o" "|group|offset|lockedNode|sphere.testAnimated"
+ ;
+connectAttr "group.msg" "|group|offset|lockedNode|sphere.testMessage" -l on;
+connectAttr "srcPolySphere.out" "|group|offset|lockedNode|sphere|sphereShape.i";
+connectAttr "|group1|offset|lockedNode|sphere.msg" "group1.testMessage" -l on;
+connectAttr "|group1|offset|lockedNode|sphere.ty" "|group1|offset|lockedNode|sphere.testConnect"
+ ;
+connectAttr "sphere_testAnimated1.o" "|group1|offset|lockedNode|sphere.testAnimated"
+ ;
+connectAttr "group1.msg" "|group1|offset|lockedNode|sphere.testMessage" -l on;
+connectAttr "srcPolySphere1.out" "|group1|offset|lockedNode|sphere|sphereShape.i"
+ ;
+relationship "link" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message";
+relationship "link" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message";
+relationship "shadowLink" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message";
+relationship "shadowLink" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message";
+connectAttr "layerManager.dli[0]" "defaultLayer.id";
+connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid";
+connectAttr "dstSphere:renderLayerManager.rlmi[0]" "dstSphere:defaultRenderLayer.rlid"
+ ;
+connectAttr "defaultRenderLayer.msg" ":defaultRenderingList1.r" -na;
+connectAttr "dstSphere:defaultRenderLayer.msg" ":defaultRenderingList1.r" -na;
+connectAttr "|group|offset|lockedNode|sphere|sphereShape.iog" ":initialShadingGroup.dsm"
+ -na;
+connectAttr "|group1|offset|lockedNode|sphere|sphereShape.iog" ":initialShadingGroup.dsm"
+ -na;
+// End of test_non_unique_names.ma
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_non_unique_names.pose b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_non_unique_names.pose
new file mode 100644
index 0000000..25f0497
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_non_unique_names.pose
@@ -0,0 +1,151 @@
+{
+ "metadata": {
+ "mayaSceneFile": "C:/Users/hovel/Dropbox/git/site-packages/studiolibrary/packages/mutils/tests/data/test_non_unique_names.ma",
+ "version": "1.0.0",
+ "user": "Hovel",
+ "mayaVersion": "2017",
+ "ctime": "1518341544"
+ }
+,
+ "objects": {
+ "srcSphere:offset": {
+ "attrs": {}
+ },
+ "srcSphere:sphere": {
+ "attrs": {
+ "testInteger": {
+ "type": "long",
+ "value": 5
+ },
+ "testProxy": {
+ "type": "double",
+ "value": 1.0
+ },
+ "scaleY": {
+ "type": "double",
+ "value": 4.66
+ },
+ "testLimit": {
+ "type": "double",
+ "value": 10.0
+ },
+ "testConnect": {
+ "type": "double",
+ "value": 8.0
+ },
+ "testEnum": {
+ "type": "enum",
+ "value": 1
+ },
+ "scaleX": {
+ "type": "double",
+ "value": 0.25
+ },
+ "testString": {
+ "type": "string",
+ "value": "Hello world"
+ },
+ "scaleZ": {
+ "type": "double",
+ "value": 0.5
+ },
+ "rotateX": {
+ "type": "doubleAngle",
+ "value": 45.0
+ },
+ "rotateY": {
+ "type": "doubleAngle",
+ "value": 50.0
+ },
+ "rotateZ": {
+ "type": "doubleAngle",
+ "value": 90.0
+ },
+ "translateX": {
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "translateY": {
+ "type": "doubleLinear",
+ "value": 8.0
+ },
+ "translateZ": {
+ "type": "doubleLinear",
+ "value": -12.0
+ },
+ "visibility": {
+ "type": "bool",
+ "value": true
+ },
+ "testFloat": {
+ "type": "double",
+ "value": 0.666
+ },
+ "testAnimated": {
+ "type": "double",
+ "value": 0.0
+ },
+ "testVectorX": {
+ "type": "double",
+ "value": 0.2
+ },
+ "testVectorY": {
+ "type": "double",
+ "value": 1.4
+ },
+ "testVectorZ": {
+ "type": "double",
+ "value": 2.6
+ },
+ "testBoolean": {
+ "type": "bool",
+ "value": true
+ }
+ }
+ },
+ "srcSphere:lockedNode": {
+ "attrs": {
+ "translateX": {
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "translateY": {
+ "type": "doubleLinear",
+ "value": 5.0
+ },
+ "translateZ": {
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "scaleX": {
+ "type": "double",
+ "value": 1.0
+ },
+ "scaleY": {
+ "type": "double",
+ "value": 1.0
+ },
+ "visibility": {
+ "type": "bool",
+ "value": true
+ },
+ "rotateX": {
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "rotateY": {
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "rotateZ": {
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "scaleZ": {
+ "type": "double",
+ "value": 1.0
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.anim/.studioLibrary/record.dict b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.anim/.studioLibrary/record.dict
new file mode 100644
index 0000000..34de2a7
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.anim/.studioLibrary/record.dict
@@ -0,0 +1 @@
+{'end': 24, 'description': 'eded', 'scene': '', 'start': 1, 'mtime': '1391012417', 'owner': 'tlhomme', 'ctime': '1391012417'}
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.anim/animation.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.anim/animation.ma
new file mode 100644
index 0000000..85956c0
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.anim/animation.ma
@@ -0,0 +1,7123 @@
+//Maya ASCII 2013 scene
+//Name: animation.ma
+//Last modified: Thu, Feb 07, 2013 04:40:04 PM
+//Codeset: 1252
+requires maya "2013";
+requires "stereoCamera" "10.0";
+currentUnit -l centimeter -a degree -t film;
+fileInfo "application" "maya";
+fileInfo "product" "Maya 2013";
+fileInfo "version" "2013 x64";
+fileInfo "cutIdentifier" "201202220241-825136";
+fileInfo "osv" "Microsoft Windows 7 Ultimate Edition, 64-bit Windows 7 Service Pack 1 (Build 7601)\n";
+createNode animCurveTL -n "DELETE_NODE_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinRt|malcolm1:grp3LipCornerSkinRt|malcolm1:grp2LipCornerSkinRt|malcolm1:ctlLipCornerSkinRt.translateX";
+createNode animCurveTL -n "DELETE_NODE_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinRt|malcolm1:grp3LipCornerSkinRt|malcolm1:grp2LipCornerSkinRt|malcolm1:ctlLipCornerSkinRt.translateY";
+createNode animCurveTL -n "DELETE_NODE_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinRt|malcolm1:grp3LipCornerSkinRt|malcolm1:grp2LipCornerSkinRt|malcolm1:ctlLipCornerSkinRt.translateZ";
+createNode animCurveTU -n "DELETE_NODE_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinRt|malcolm1:grp3LipCornerSkinRt|malcolm1:grp2LipCornerSkinRt|malcolm1:ctlLipCornerSkinRt.scaleX";
+createNode animCurveTU -n "DELETE_NODE_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinRt|malcolm1:grp3LipCornerSkinRt|malcolm1:grp2LipCornerSkinRt|malcolm1:ctlLipCornerSkinRt.scaleY";
+createNode animCurveTU -n "DELETE_NODE_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinRt|malcolm1:grp3LipCornerSkinRt|malcolm1:grp2LipCornerSkinRt|malcolm1:ctlLipCornerSkinRt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinRt|malcolm1:grp3LipCornerSkinRt|malcolm1:grp2LipCornerSkinRt|malcolm1:ctlLipCornerSkinRt.rotateX";
+createNode animCurveTA -n "DELETE_NODE_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinRt|malcolm1:grp3LipCornerSkinRt|malcolm1:grp2LipCornerSkinRt|malcolm1:ctlLipCornerSkinRt.rotateY";
+createNode animCurveTA -n "DELETE_NODE_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinRt|malcolm1:grp3LipCornerSkinRt|malcolm1:grp2LipCornerSkinRt|malcolm1:ctlLipCornerSkinRt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE1_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinLf|malcolm1:grp3LipCornerSkinLf|malcolm1:grp2LipCornerSkinLf|malcolm1:ctlLipCornerSkinLf.translateX";
+createNode animCurveTL -n "DELETE_NODE1_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinLf|malcolm1:grp3LipCornerSkinLf|malcolm1:grp2LipCornerSkinLf|malcolm1:ctlLipCornerSkinLf.translateY";
+createNode animCurveTL -n "DELETE_NODE1_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinLf|malcolm1:grp3LipCornerSkinLf|malcolm1:grp2LipCornerSkinLf|malcolm1:ctlLipCornerSkinLf.translateZ";
+createNode animCurveTU -n "DELETE_NODE1_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinLf|malcolm1:grp3LipCornerSkinLf|malcolm1:grp2LipCornerSkinLf|malcolm1:ctlLipCornerSkinLf.scaleX";
+createNode animCurveTU -n "DELETE_NODE1_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinLf|malcolm1:grp3LipCornerSkinLf|malcolm1:grp2LipCornerSkinLf|malcolm1:ctlLipCornerSkinLf.scaleY";
+createNode animCurveTU -n "DELETE_NODE1_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinLf|malcolm1:grp3LipCornerSkinLf|malcolm1:grp2LipCornerSkinLf|malcolm1:ctlLipCornerSkinLf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE1_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinLf|malcolm1:grp3LipCornerSkinLf|malcolm1:grp2LipCornerSkinLf|malcolm1:ctlLipCornerSkinLf.rotateX";
+createNode animCurveTA -n "DELETE_NODE1_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinLf|malcolm1:grp3LipCornerSkinLf|malcolm1:grp2LipCornerSkinLf|malcolm1:ctlLipCornerSkinLf.rotateY";
+createNode animCurveTA -n "DELETE_NODE1_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinLf|malcolm1:grp3LipCornerSkinLf|malcolm1:grp2LipCornerSkinLf|malcolm1:ctlLipCornerSkinLf.rotateZ";
+createNode animCurveTU -n "DELETE_NODE2_jawStretch";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.jawStretch";
+createNode animCurveTL -n "DELETE_NODE2_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.translateX";
+createNode animCurveTL -n "DELETE_NODE2_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0.0033959318634735991 10 0.0033959318634735991;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.translateY";
+createNode animCurveTL -n "DELETE_NODE2_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0.037225733300033453 10 0.037225733300033453;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.translateZ";
+createNode animCurveTU -n "DELETE_NODE2_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.scaleX";
+createNode animCurveTU -n "DELETE_NODE2_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.scaleY";
+createNode animCurveTU -n "DELETE_NODE2_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.scaleZ";
+createNode animCurveTU -n "DELETE_NODE2_lipsSeal";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.lipsSeal";
+createNode animCurveTA -n "DELETE_NODE2_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 38.044336921645353 6 -5.2124021846970194
+ 10 -5.2124021846970194;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.rotateX";
+createNode animCurveTA -n "DELETE_NODE2_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 -3.4001631649756883 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.rotateY";
+createNode animCurveTA -n "DELETE_NODE2_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 4.3342393392160101 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.rotateZ";
+createNode animCurveTU -n "DELETE_NODE2_lipSealHeight";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.lipSealHeight";
+createNode animCurveTL -n "DELETE_NODE3_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:lipBtDriven|malcolm1:ctlLipBt.translateX";
+createNode animCurveTL -n "DELETE_NODE3_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:lipBtDriven|malcolm1:ctlLipBt.translateY";
+createNode animCurveTL -n "DELETE_NODE3_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:lipBtDriven|malcolm1:ctlLipBt.translateZ";
+createNode animCurveTU -n "DELETE_NODE3_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:lipBtDriven|malcolm1:ctlLipBt.scaleX";
+createNode animCurveTU -n "DELETE_NODE3_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:lipBtDriven|malcolm1:ctlLipBt.scaleY";
+createNode animCurveTU -n "DELETE_NODE3_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:lipBtDriven|malcolm1:ctlLipBt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE3_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:lipBtDriven|malcolm1:ctlLipBt.rotateX";
+createNode animCurveTA -n "DELETE_NODE3_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:lipBtDriven|malcolm1:ctlLipBt.rotateY";
+createNode animCurveTA -n "DELETE_NODE3_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:lipBtDriven|malcolm1:ctlLipBt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE4_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" (
+ "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4|malcolm1:grpTongue5|malcolm1:ctlTongue5.translateX");
+createNode animCurveTL -n "DELETE_NODE4_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" (
+ "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4|malcolm1:grpTongue5|malcolm1:ctlTongue5.translateY");
+createNode animCurveTL -n "DELETE_NODE4_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" (
+ "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4|malcolm1:grpTongue5|malcolm1:ctlTongue5.translateZ");
+createNode animCurveTU -n "DELETE_NODE4_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" (
+ "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4|malcolm1:grpTongue5|malcolm1:ctlTongue5.scaleX");
+createNode animCurveTU -n "DELETE_NODE4_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" (
+ "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4|malcolm1:grpTongue5|malcolm1:ctlTongue5.scaleY");
+createNode animCurveTU -n "DELETE_NODE4_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" (
+ "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4|malcolm1:grpTongue5|malcolm1:ctlTongue5.scaleZ");
+createNode animCurveTA -n "DELETE_NODE4_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" (
+ "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4|malcolm1:grpTongue5|malcolm1:ctlTongue5.rotateX");
+createNode animCurveTA -n "DELETE_NODE4_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" (
+ "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4|malcolm1:grpTongue5|malcolm1:ctlTongue5.rotateY");
+createNode animCurveTA -n "DELETE_NODE4_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" (
+ "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4|malcolm1:grpTongue5|malcolm1:ctlTongue5.rotateZ");
+createNode animCurveTL -n "DELETE_NODE5_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" (
+ "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4.translateX");
+createNode animCurveTL -n "DELETE_NODE5_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" (
+ "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4.translateY");
+createNode animCurveTL -n "DELETE_NODE5_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" (
+ "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4.translateZ");
+createNode animCurveTU -n "DELETE_NODE5_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" (
+ "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4.scaleX");
+createNode animCurveTU -n "DELETE_NODE5_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" (
+ "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4.scaleY");
+createNode animCurveTU -n "DELETE_NODE5_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" (
+ "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4.scaleZ");
+createNode animCurveTA -n "DELETE_NODE5_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" (
+ "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4.rotateX");
+createNode animCurveTA -n "DELETE_NODE5_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" (
+ "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4.rotateY");
+createNode animCurveTA -n "DELETE_NODE5_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" (
+ "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4.rotateZ");
+createNode animCurveTL -n "DELETE_NODE6_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3.translateX";
+createNode animCurveTL -n "DELETE_NODE6_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3.translateY";
+createNode animCurveTL -n "DELETE_NODE6_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3.translateZ";
+createNode animCurveTU -n "DELETE_NODE6_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3.scaleX";
+createNode animCurveTU -n "DELETE_NODE6_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3.scaleY";
+createNode animCurveTU -n "DELETE_NODE6_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3.scaleZ";
+createNode animCurveTA -n "DELETE_NODE6_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3.rotateX";
+createNode animCurveTA -n "DELETE_NODE6_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3.rotateY";
+createNode animCurveTA -n "DELETE_NODE6_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3.rotateZ";
+createNode animCurveTL -n "DELETE_NODE7_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2.translateX";
+createNode animCurveTL -n "DELETE_NODE7_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0.109769011920731 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2.translateY";
+createNode animCurveTL -n "DELETE_NODE7_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2.translateZ";
+createNode animCurveTU -n "DELETE_NODE7_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2.scaleX";
+createNode animCurveTU -n "DELETE_NODE7_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2.scaleY";
+createNode animCurveTU -n "DELETE_NODE7_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2.scaleZ";
+createNode animCurveTA -n "DELETE_NODE7_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2.rotateX";
+createNode animCurveTA -n "DELETE_NODE7_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2.rotateY";
+createNode animCurveTA -n "DELETE_NODE7_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2.rotateZ";
+createNode animCurveTL -n "DELETE_NODE8_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1.translateX";
+createNode animCurveTL -n "DELETE_NODE8_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1.translateY";
+createNode animCurveTL -n "DELETE_NODE8_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1.translateZ";
+createNode animCurveTU -n "DELETE_NODE8_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1.scaleX";
+createNode animCurveTU -n "DELETE_NODE8_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1.scaleY";
+createNode animCurveTU -n "DELETE_NODE8_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1.scaleZ";
+createNode animCurveTA -n "DELETE_NODE8_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1.rotateX";
+createNode animCurveTA -n "DELETE_NODE8_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1.rotateY";
+createNode animCurveTA -n "DELETE_NODE8_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1.rotateZ";
+createNode animCurveTL -n "DELETE_NODE9_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt.translateX";
+createNode animCurveTL -n "DELETE_NODE9_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt.translateY";
+createNode animCurveTL -n "DELETE_NODE9_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt.translateZ";
+createNode animCurveTU -n "DELETE_NODE9_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt.scaleX";
+createNode animCurveTU -n "DELETE_NODE9_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt.scaleY";
+createNode animCurveTU -n "DELETE_NODE9_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE9_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt.rotateX";
+createNode animCurveTA -n "DELETE_NODE9_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt.rotateY";
+createNode animCurveTA -n "DELETE_NODE9_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE10_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Lf|malcolm1:ctlTeethBt1Lf.translateX";
+createNode animCurveTL -n "DELETE_NODE10_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Lf|malcolm1:ctlTeethBt1Lf.translateY";
+createNode animCurveTL -n "DELETE_NODE10_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Lf|malcolm1:ctlTeethBt1Lf.translateZ";
+createNode animCurveTU -n "DELETE_NODE10_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Lf|malcolm1:ctlTeethBt1Lf.scaleX";
+createNode animCurveTU -n "DELETE_NODE10_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Lf|malcolm1:ctlTeethBt1Lf.scaleY";
+createNode animCurveTU -n "DELETE_NODE10_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Lf|malcolm1:ctlTeethBt1Lf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE10_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Lf|malcolm1:ctlTeethBt1Lf.rotateX";
+createNode animCurveTA -n "DELETE_NODE10_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Lf|malcolm1:ctlTeethBt1Lf.rotateY";
+createNode animCurveTA -n "DELETE_NODE10_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Lf|malcolm1:ctlTeethBt1Lf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE11_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Rt|malcolm1:ctlTeethBt1Rt.translateX";
+createNode animCurveTL -n "DELETE_NODE11_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Rt|malcolm1:ctlTeethBt1Rt.translateY";
+createNode animCurveTL -n "DELETE_NODE11_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Rt|malcolm1:ctlTeethBt1Rt.translateZ";
+createNode animCurveTU -n "DELETE_NODE11_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Rt|malcolm1:ctlTeethBt1Rt.scaleX";
+createNode animCurveTU -n "DELETE_NODE11_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Rt|malcolm1:ctlTeethBt1Rt.scaleY";
+createNode animCurveTU -n "DELETE_NODE11_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Rt|malcolm1:ctlTeethBt1Rt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE11_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Rt|malcolm1:ctlTeethBt1Rt.rotateX";
+createNode animCurveTA -n "DELETE_NODE11_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Rt|malcolm1:ctlTeethBt1Rt.rotateY";
+createNode animCurveTA -n "DELETE_NODE11_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Rt|malcolm1:ctlTeethBt1Rt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE12_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Lf|malcolm1:ctlTeethBt2Lf.translateX";
+createNode animCurveTL -n "DELETE_NODE12_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Lf|malcolm1:ctlTeethBt2Lf.translateY";
+createNode animCurveTL -n "DELETE_NODE12_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Lf|malcolm1:ctlTeethBt2Lf.translateZ";
+createNode animCurveTU -n "DELETE_NODE12_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Lf|malcolm1:ctlTeethBt2Lf.scaleX";
+createNode animCurveTU -n "DELETE_NODE12_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Lf|malcolm1:ctlTeethBt2Lf.scaleY";
+createNode animCurveTU -n "DELETE_NODE12_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Lf|malcolm1:ctlTeethBt2Lf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE12_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Lf|malcolm1:ctlTeethBt2Lf.rotateX";
+createNode animCurveTA -n "DELETE_NODE12_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Lf|malcolm1:ctlTeethBt2Lf.rotateY";
+createNode animCurveTA -n "DELETE_NODE12_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Lf|malcolm1:ctlTeethBt2Lf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE13_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Rt|malcolm1:ctlTeethBt2Rt.translateX";
+createNode animCurveTL -n "DELETE_NODE13_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Rt|malcolm1:ctlTeethBt2Rt.translateY";
+createNode animCurveTL -n "DELETE_NODE13_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Rt|malcolm1:ctlTeethBt2Rt.translateZ";
+createNode animCurveTU -n "DELETE_NODE13_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Rt|malcolm1:ctlTeethBt2Rt.scaleX";
+createNode animCurveTU -n "DELETE_NODE13_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Rt|malcolm1:ctlTeethBt2Rt.scaleY";
+createNode animCurveTU -n "DELETE_NODE13_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Rt|malcolm1:ctlTeethBt2Rt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE13_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Rt|malcolm1:ctlTeethBt2Rt.rotateX";
+createNode animCurveTA -n "DELETE_NODE13_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Rt|malcolm1:ctlTeethBt2Rt.rotateY";
+createNode animCurveTA -n "DELETE_NODE13_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Rt|malcolm1:ctlTeethBt2Rt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE14_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtCt|malcolm1:ctlTeethBtCt.translateX";
+createNode animCurveTL -n "DELETE_NODE14_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtCt|malcolm1:ctlTeethBtCt.translateY";
+createNode animCurveTL -n "DELETE_NODE14_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtCt|malcolm1:ctlTeethBtCt.translateZ";
+createNode animCurveTU -n "DELETE_NODE14_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtCt|malcolm1:ctlTeethBtCt.scaleX";
+createNode animCurveTU -n "DELETE_NODE14_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtCt|malcolm1:ctlTeethBtCt.scaleY";
+createNode animCurveTU -n "DELETE_NODE14_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtCt|malcolm1:ctlTeethBtCt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE14_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtCt|malcolm1:ctlTeethBtCt.rotateX";
+createNode animCurveTA -n "DELETE_NODE14_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtCt|malcolm1:ctlTeethBtCt.rotateY";
+createNode animCurveTA -n "DELETE_NODE14_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtCt|malcolm1:ctlTeethBtCt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE15_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Rt|malcolm1:ctlTeethBtLower2Rt.translateX";
+createNode animCurveTL -n "DELETE_NODE15_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Rt|malcolm1:ctlTeethBtLower2Rt.translateY";
+createNode animCurveTL -n "DELETE_NODE15_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Rt|malcolm1:ctlTeethBtLower2Rt.translateZ";
+createNode animCurveTU -n "DELETE_NODE15_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Rt|malcolm1:ctlTeethBtLower2Rt.scaleX";
+createNode animCurveTU -n "DELETE_NODE15_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Rt|malcolm1:ctlTeethBtLower2Rt.scaleY";
+createNode animCurveTU -n "DELETE_NODE15_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Rt|malcolm1:ctlTeethBtLower2Rt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE15_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Rt|malcolm1:ctlTeethBtLower2Rt.rotateX";
+createNode animCurveTA -n "DELETE_NODE15_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Rt|malcolm1:ctlTeethBtLower2Rt.rotateY";
+createNode animCurveTA -n "DELETE_NODE15_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Rt|malcolm1:ctlTeethBtLower2Rt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE16_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Lf|malcolm1:ctlTeethBtLower2Lf.translateX";
+createNode animCurveTL -n "DELETE_NODE16_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Lf|malcolm1:ctlTeethBtLower2Lf.translateY";
+createNode animCurveTL -n "DELETE_NODE16_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Lf|malcolm1:ctlTeethBtLower2Lf.translateZ";
+createNode animCurveTU -n "DELETE_NODE16_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Lf|malcolm1:ctlTeethBtLower2Lf.scaleX";
+createNode animCurveTU -n "DELETE_NODE16_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Lf|malcolm1:ctlTeethBtLower2Lf.scaleY";
+createNode animCurveTU -n "DELETE_NODE16_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Lf|malcolm1:ctlTeethBtLower2Lf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE16_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Lf|malcolm1:ctlTeethBtLower2Lf.rotateX";
+createNode animCurveTA -n "DELETE_NODE16_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Lf|malcolm1:ctlTeethBtLower2Lf.rotateY";
+createNode animCurveTA -n "DELETE_NODE16_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Lf|malcolm1:ctlTeethBtLower2Lf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE17_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedLf|malcolm1:grp2Driven1LipBt2Lf|malcolm1:grp1Driven1LipBt2Lf|malcolm1:ctlLipBt2Lf.translateX";
+createNode animCurveTL -n "DELETE_NODE17_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedLf|malcolm1:grp2Driven1LipBt2Lf|malcolm1:grp1Driven1LipBt2Lf|malcolm1:ctlLipBt2Lf.translateY";
+createNode animCurveTL -n "DELETE_NODE17_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedLf|malcolm1:grp2Driven1LipBt2Lf|malcolm1:grp1Driven1LipBt2Lf|malcolm1:ctlLipBt2Lf.translateZ";
+createNode animCurveTU -n "DELETE_NODE17_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedLf|malcolm1:grp2Driven1LipBt2Lf|malcolm1:grp1Driven1LipBt2Lf|malcolm1:ctlLipBt2Lf.scaleX";
+createNode animCurveTU -n "DELETE_NODE17_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedLf|malcolm1:grp2Driven1LipBt2Lf|malcolm1:grp1Driven1LipBt2Lf|malcolm1:ctlLipBt2Lf.scaleY";
+createNode animCurveTU -n "DELETE_NODE17_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedLf|malcolm1:grp2Driven1LipBt2Lf|malcolm1:grp1Driven1LipBt2Lf|malcolm1:ctlLipBt2Lf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE17_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedLf|malcolm1:grp2Driven1LipBt2Lf|malcolm1:grp1Driven1LipBt2Lf|malcolm1:ctlLipBt2Lf.rotateX";
+createNode animCurveTA -n "DELETE_NODE17_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedLf|malcolm1:grp2Driven1LipBt2Lf|malcolm1:grp1Driven1LipBt2Lf|malcolm1:ctlLipBt2Lf.rotateY";
+createNode animCurveTA -n "DELETE_NODE17_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedLf|malcolm1:grp2Driven1LipBt2Lf|malcolm1:grp1Driven1LipBt2Lf|malcolm1:ctlLipBt2Lf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE18_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedRt|malcolm1:grp2Driven1LipBt2Rt|malcolm1:grp1Driven1LipBt2Rt|malcolm1:ctlLipBt2Rt.translateX";
+createNode animCurveTL -n "DELETE_NODE18_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedRt|malcolm1:grp2Driven1LipBt2Rt|malcolm1:grp1Driven1LipBt2Rt|malcolm1:ctlLipBt2Rt.translateY";
+createNode animCurveTL -n "DELETE_NODE18_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedRt|malcolm1:grp2Driven1LipBt2Rt|malcolm1:grp1Driven1LipBt2Rt|malcolm1:ctlLipBt2Rt.translateZ";
+createNode animCurveTU -n "DELETE_NODE18_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedRt|malcolm1:grp2Driven1LipBt2Rt|malcolm1:grp1Driven1LipBt2Rt|malcolm1:ctlLipBt2Rt.scaleX";
+createNode animCurveTU -n "DELETE_NODE18_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedRt|malcolm1:grp2Driven1LipBt2Rt|malcolm1:grp1Driven1LipBt2Rt|malcolm1:ctlLipBt2Rt.scaleY";
+createNode animCurveTU -n "DELETE_NODE18_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedRt|malcolm1:grp2Driven1LipBt2Rt|malcolm1:grp1Driven1LipBt2Rt|malcolm1:ctlLipBt2Rt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE18_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedRt|malcolm1:grp2Driven1LipBt2Rt|malcolm1:grp1Driven1LipBt2Rt|malcolm1:ctlLipBt2Rt.rotateX";
+createNode animCurveTA -n "DELETE_NODE18_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedRt|malcolm1:grp2Driven1LipBt2Rt|malcolm1:grp1Driven1LipBt2Rt|malcolm1:ctlLipBt2Rt.rotateY";
+createNode animCurveTA -n "DELETE_NODE18_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedRt|malcolm1:grp2Driven1LipBt2Rt|malcolm1:grp1Driven1LipBt2Rt|malcolm1:ctlLipBt2Rt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE19_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedLf|malcolm1:grp2Driven1LipBt1Lf|malcolm1:grp1Driven1LipBt1Lf|malcolm1:ctlLipBt1Lf.translateX";
+createNode animCurveTL -n "DELETE_NODE19_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedLf|malcolm1:grp2Driven1LipBt1Lf|malcolm1:grp1Driven1LipBt1Lf|malcolm1:ctlLipBt1Lf.translateY";
+createNode animCurveTL -n "DELETE_NODE19_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedLf|malcolm1:grp2Driven1LipBt1Lf|malcolm1:grp1Driven1LipBt1Lf|malcolm1:ctlLipBt1Lf.translateZ";
+createNode animCurveTU -n "DELETE_NODE19_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedLf|malcolm1:grp2Driven1LipBt1Lf|malcolm1:grp1Driven1LipBt1Lf|malcolm1:ctlLipBt1Lf.scaleX";
+createNode animCurveTU -n "DELETE_NODE19_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedLf|malcolm1:grp2Driven1LipBt1Lf|malcolm1:grp1Driven1LipBt1Lf|malcolm1:ctlLipBt1Lf.scaleY";
+createNode animCurveTU -n "DELETE_NODE19_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedLf|malcolm1:grp2Driven1LipBt1Lf|malcolm1:grp1Driven1LipBt1Lf|malcolm1:ctlLipBt1Lf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE19_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedLf|malcolm1:grp2Driven1LipBt1Lf|malcolm1:grp1Driven1LipBt1Lf|malcolm1:ctlLipBt1Lf.rotateX";
+createNode animCurveTA -n "DELETE_NODE19_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedLf|malcolm1:grp2Driven1LipBt1Lf|malcolm1:grp1Driven1LipBt1Lf|malcolm1:ctlLipBt1Lf.rotateY";
+createNode animCurveTA -n "DELETE_NODE19_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedLf|malcolm1:grp2Driven1LipBt1Lf|malcolm1:grp1Driven1LipBt1Lf|malcolm1:ctlLipBt1Lf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE20_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedRt|malcolm1:grp2Driven1LipBt1Rt|malcolm1:grp1Driven1LipBt1Rt|malcolm1:ctlLipBt1Rt.translateX";
+createNode animCurveTL -n "DELETE_NODE20_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedRt|malcolm1:grp2Driven1LipBt1Rt|malcolm1:grp1Driven1LipBt1Rt|malcolm1:ctlLipBt1Rt.translateY";
+createNode animCurveTL -n "DELETE_NODE20_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedRt|malcolm1:grp2Driven1LipBt1Rt|malcolm1:grp1Driven1LipBt1Rt|malcolm1:ctlLipBt1Rt.translateZ";
+createNode animCurveTU -n "DELETE_NODE20_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedRt|malcolm1:grp2Driven1LipBt1Rt|malcolm1:grp1Driven1LipBt1Rt|malcolm1:ctlLipBt1Rt.scaleX";
+createNode animCurveTU -n "DELETE_NODE20_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedRt|malcolm1:grp2Driven1LipBt1Rt|malcolm1:grp1Driven1LipBt1Rt|malcolm1:ctlLipBt1Rt.scaleY";
+createNode animCurveTU -n "DELETE_NODE20_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedRt|malcolm1:grp2Driven1LipBt1Rt|malcolm1:grp1Driven1LipBt1Rt|malcolm1:ctlLipBt1Rt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE20_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedRt|malcolm1:grp2Driven1LipBt1Rt|malcolm1:grp1Driven1LipBt1Rt|malcolm1:ctlLipBt1Rt.rotateX";
+createNode animCurveTA -n "DELETE_NODE20_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedRt|malcolm1:grp2Driven1LipBt1Rt|malcolm1:grp1Driven1LipBt1Rt|malcolm1:ctlLipBt1Rt.rotateY";
+createNode animCurveTA -n "DELETE_NODE20_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedRt|malcolm1:grp2Driven1LipBt1Rt|malcolm1:grp1Driven1LipBt1Rt|malcolm1:ctlLipBt1Rt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE21_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBtCtSpaced|malcolm1:grp2Driven1LipBtCt|malcolm1:grp1Driven1LipBtCt|malcolm1:ctlLipBtCt.translateX";
+createNode animCurveTL -n "DELETE_NODE21_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBtCtSpaced|malcolm1:grp2Driven1LipBtCt|malcolm1:grp1Driven1LipBtCt|malcolm1:ctlLipBtCt.translateY";
+createNode animCurveTL -n "DELETE_NODE21_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBtCtSpaced|malcolm1:grp2Driven1LipBtCt|malcolm1:grp1Driven1LipBtCt|malcolm1:ctlLipBtCt.translateZ";
+createNode animCurveTU -n "DELETE_NODE21_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBtCtSpaced|malcolm1:grp2Driven1LipBtCt|malcolm1:grp1Driven1LipBtCt|malcolm1:ctlLipBtCt.scaleX";
+createNode animCurveTU -n "DELETE_NODE21_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBtCtSpaced|malcolm1:grp2Driven1LipBtCt|malcolm1:grp1Driven1LipBtCt|malcolm1:ctlLipBtCt.scaleY";
+createNode animCurveTU -n "DELETE_NODE21_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBtCtSpaced|malcolm1:grp2Driven1LipBtCt|malcolm1:grp1Driven1LipBtCt|malcolm1:ctlLipBtCt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE21_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBtCtSpaced|malcolm1:grp2Driven1LipBtCt|malcolm1:grp1Driven1LipBtCt|malcolm1:ctlLipBtCt.rotateX";
+createNode animCurveTA -n "DELETE_NODE21_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBtCtSpaced|malcolm1:grp2Driven1LipBtCt|malcolm1:grp1Driven1LipBtCt|malcolm1:ctlLipBtCt.rotateY";
+createNode animCurveTA -n "DELETE_NODE21_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBtCtSpaced|malcolm1:grp2Driven1LipBtCt|malcolm1:grp1Driven1LipBtCt|malcolm1:ctlLipBtCt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE22_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot.translateX";
+createNode animCurveTL -n "DELETE_NODE22_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot.translateY";
+createNode animCurveTL -n "DELETE_NODE22_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot.translateZ";
+createNode animCurveTU -n "DELETE_NODE22_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot.scaleX";
+createNode animCurveTU -n "DELETE_NODE22_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot.scaleY";
+createNode animCurveTU -n "DELETE_NODE22_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot.scaleZ";
+createNode animCurveTA -n "DELETE_NODE22_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot.rotateX";
+createNode animCurveTA -n "DELETE_NODE22_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot.rotateY";
+createNode animCurveTA -n "DELETE_NODE22_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot.rotateZ";
+createNode animCurveTL -n "DELETE_NODE23_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipTpSkin1Driven|malcolm1:ctlLipTp.translateX";
+createNode animCurveTL -n "DELETE_NODE23_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipTpSkin1Driven|malcolm1:ctlLipTp.translateY";
+createNode animCurveTL -n "DELETE_NODE23_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipTpSkin1Driven|malcolm1:ctlLipTp.translateZ";
+createNode animCurveTU -n "DELETE_NODE23_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipTpSkin1Driven|malcolm1:ctlLipTp.scaleX";
+createNode animCurveTU -n "DELETE_NODE23_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipTpSkin1Driven|malcolm1:ctlLipTp.scaleY";
+createNode animCurveTU -n "DELETE_NODE23_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipTpSkin1Driven|malcolm1:ctlLipTp.scaleZ";
+createNode animCurveTA -n "DELETE_NODE23_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipTpSkin1Driven|malcolm1:ctlLipTp.rotateX";
+createNode animCurveTA -n "DELETE_NODE23_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipTpSkin1Driven|malcolm1:ctlLipTp.rotateY";
+createNode animCurveTA -n "DELETE_NODE23_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipTpSkin1Driven|malcolm1:ctlLipTp.rotateZ";
+createNode animCurveTL -n "DELETE_NODE24_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp.translateX";
+createNode animCurveTL -n "DELETE_NODE24_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp.translateY";
+createNode animCurveTL -n "DELETE_NODE24_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp.translateZ";
+createNode animCurveTU -n "DELETE_NODE24_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp.scaleX";
+createNode animCurveTU -n "DELETE_NODE24_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp.scaleY";
+createNode animCurveTU -n "DELETE_NODE24_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp.scaleZ";
+createNode animCurveTA -n "DELETE_NODE24_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp.rotateX";
+createNode animCurveTA -n "DELETE_NODE24_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp.rotateY";
+createNode animCurveTA -n "DELETE_NODE24_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp.rotateZ";
+createNode animCurveTL -n "DELETE_NODE25_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Lf|malcolm1:ctlTeethTp1Lf.translateX";
+createNode animCurveTL -n "DELETE_NODE25_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Lf|malcolm1:ctlTeethTp1Lf.translateY";
+createNode animCurveTL -n "DELETE_NODE25_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Lf|malcolm1:ctlTeethTp1Lf.translateZ";
+createNode animCurveTU -n "DELETE_NODE25_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Lf|malcolm1:ctlTeethTp1Lf.scaleX";
+createNode animCurveTU -n "DELETE_NODE25_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Lf|malcolm1:ctlTeethTp1Lf.scaleY";
+createNode animCurveTU -n "DELETE_NODE25_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Lf|malcolm1:ctlTeethTp1Lf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE25_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Lf|malcolm1:ctlTeethTp1Lf.rotateX";
+createNode animCurveTA -n "DELETE_NODE25_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Lf|malcolm1:ctlTeethTp1Lf.rotateY";
+createNode animCurveTA -n "DELETE_NODE25_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Lf|malcolm1:ctlTeethTp1Lf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE26_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Rt|malcolm1:ctlTeethTp1Rt.translateX";
+createNode animCurveTL -n "DELETE_NODE26_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Rt|malcolm1:ctlTeethTp1Rt.translateY";
+createNode animCurveTL -n "DELETE_NODE26_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Rt|malcolm1:ctlTeethTp1Rt.translateZ";
+createNode animCurveTU -n "DELETE_NODE26_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Rt|malcolm1:ctlTeethTp1Rt.scaleX";
+createNode animCurveTU -n "DELETE_NODE26_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Rt|malcolm1:ctlTeethTp1Rt.scaleY";
+createNode animCurveTU -n "DELETE_NODE26_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Rt|malcolm1:ctlTeethTp1Rt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE26_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Rt|malcolm1:ctlTeethTp1Rt.rotateX";
+createNode animCurveTA -n "DELETE_NODE26_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Rt|malcolm1:ctlTeethTp1Rt.rotateY";
+createNode animCurveTA -n "DELETE_NODE26_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Rt|malcolm1:ctlTeethTp1Rt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE27_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Lf|malcolm1:ctlTeethTp2Lf.translateX";
+createNode animCurveTL -n "DELETE_NODE27_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Lf|malcolm1:ctlTeethTp2Lf.translateY";
+createNode animCurveTL -n "DELETE_NODE27_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Lf|malcolm1:ctlTeethTp2Lf.translateZ";
+createNode animCurveTU -n "DELETE_NODE27_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Lf|malcolm1:ctlTeethTp2Lf.scaleX";
+createNode animCurveTU -n "DELETE_NODE27_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Lf|malcolm1:ctlTeethTp2Lf.scaleY";
+createNode animCurveTU -n "DELETE_NODE27_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Lf|malcolm1:ctlTeethTp2Lf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE27_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Lf|malcolm1:ctlTeethTp2Lf.rotateX";
+createNode animCurveTA -n "DELETE_NODE27_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Lf|malcolm1:ctlTeethTp2Lf.rotateY";
+createNode animCurveTA -n "DELETE_NODE27_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Lf|malcolm1:ctlTeethTp2Lf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE28_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Rt|malcolm1:ctlTeethTp2Rt.translateX";
+createNode animCurveTL -n "DELETE_NODE28_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Rt|malcolm1:ctlTeethTp2Rt.translateY";
+createNode animCurveTL -n "DELETE_NODE28_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Rt|malcolm1:ctlTeethTp2Rt.translateZ";
+createNode animCurveTU -n "DELETE_NODE28_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Rt|malcolm1:ctlTeethTp2Rt.scaleX";
+createNode animCurveTU -n "DELETE_NODE28_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Rt|malcolm1:ctlTeethTp2Rt.scaleY";
+createNode animCurveTU -n "DELETE_NODE28_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Rt|malcolm1:ctlTeethTp2Rt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE28_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Rt|malcolm1:ctlTeethTp2Rt.rotateX";
+createNode animCurveTA -n "DELETE_NODE28_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Rt|malcolm1:ctlTeethTp2Rt.rotateY";
+createNode animCurveTA -n "DELETE_NODE28_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Rt|malcolm1:ctlTeethTp2Rt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE29_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpCt|malcolm1:ctlTeethTpCt.translateX";
+createNode animCurveTL -n "DELETE_NODE29_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpCt|malcolm1:ctlTeethTpCt.translateY";
+createNode animCurveTL -n "DELETE_NODE29_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpCt|malcolm1:ctlTeethTpCt.translateZ";
+createNode animCurveTU -n "DELETE_NODE29_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpCt|malcolm1:ctlTeethTpCt.scaleX";
+createNode animCurveTU -n "DELETE_NODE29_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpCt|malcolm1:ctlTeethTpCt.scaleY";
+createNode animCurveTU -n "DELETE_NODE29_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpCt|malcolm1:ctlTeethTpCt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE29_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpCt|malcolm1:ctlTeethTpCt.rotateX";
+createNode animCurveTA -n "DELETE_NODE29_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpCt|malcolm1:ctlTeethTpCt.rotateY";
+createNode animCurveTA -n "DELETE_NODE29_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpCt|malcolm1:ctlTeethTpCt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE30_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Lf|malcolm1:ctlTeethTpUpper2Lf.translateX";
+createNode animCurveTL -n "DELETE_NODE30_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Lf|malcolm1:ctlTeethTpUpper2Lf.translateY";
+createNode animCurveTL -n "DELETE_NODE30_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Lf|malcolm1:ctlTeethTpUpper2Lf.translateZ";
+createNode animCurveTU -n "DELETE_NODE30_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Lf|malcolm1:ctlTeethTpUpper2Lf.scaleX";
+createNode animCurveTU -n "DELETE_NODE30_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Lf|malcolm1:ctlTeethTpUpper2Lf.scaleY";
+createNode animCurveTU -n "DELETE_NODE30_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Lf|malcolm1:ctlTeethTpUpper2Lf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE30_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Lf|malcolm1:ctlTeethTpUpper2Lf.rotateX";
+createNode animCurveTA -n "DELETE_NODE30_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Lf|malcolm1:ctlTeethTpUpper2Lf.rotateY";
+createNode animCurveTA -n "DELETE_NODE30_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Lf|malcolm1:ctlTeethTpUpper2Lf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE31_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Rt|malcolm1:ctlTeethTpUpper2Rt.translateX";
+createNode animCurveTL -n "DELETE_NODE31_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Rt|malcolm1:ctlTeethTpUpper2Rt.translateY";
+createNode animCurveTL -n "DELETE_NODE31_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Rt|malcolm1:ctlTeethTpUpper2Rt.translateZ";
+createNode animCurveTU -n "DELETE_NODE31_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Rt|malcolm1:ctlTeethTpUpper2Rt.scaleX";
+createNode animCurveTU -n "DELETE_NODE31_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Rt|malcolm1:ctlTeethTpUpper2Rt.scaleY";
+createNode animCurveTU -n "DELETE_NODE31_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Rt|malcolm1:ctlTeethTpUpper2Rt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE31_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Rt|malcolm1:ctlTeethTpUpper2Rt.rotateX";
+createNode animCurveTA -n "DELETE_NODE31_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Rt|malcolm1:ctlTeethTpUpper2Rt.rotateY";
+createNode animCurveTA -n "DELETE_NODE31_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Rt|malcolm1:ctlTeethTpUpper2Rt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE32_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt.translateX";
+createNode animCurveTL -n "DELETE_NODE32_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt.translateY";
+createNode animCurveTL -n "DELETE_NODE32_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt.translateZ";
+createNode animCurveTU -n "DELETE_NODE32_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt.scaleX";
+createNode animCurveTU -n "DELETE_NODE32_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt.scaleY";
+createNode animCurveTU -n "DELETE_NODE32_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE32_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt.rotateX";
+createNode animCurveTA -n "DELETE_NODE32_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt.rotateY";
+createNode animCurveTA -n "DELETE_NODE32_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt.rotateZ";
+createNode animCurveTU -n "DELETE_NODE32_puff";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt.puff";
+createNode animCurveTL -n "DELETE_NODE33_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf.translateX";
+createNode animCurveTL -n "DELETE_NODE33_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf.translateY";
+createNode animCurveTL -n "DELETE_NODE33_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf.translateZ";
+createNode animCurveTU -n "DELETE_NODE33_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf.scaleX";
+createNode animCurveTU -n "DELETE_NODE33_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf.scaleY";
+createNode animCurveTU -n "DELETE_NODE33_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE33_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf.rotateX";
+createNode animCurveTA -n "DELETE_NODE33_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf.rotateY";
+createNode animCurveTA -n "DELETE_NODE33_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf.rotateZ";
+createNode animCurveTU -n "DELETE_NODE33_puff";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf.puff";
+createNode animCurveTL -n "DELETE_NODE34_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:lipJointsSpacedRt_NeutralPose|malcolm1:lipJointsSpacedRt|malcolm1:grpLipTp2SpacedRt|malcolm1:grp2Driven1LipTp2Rt|malcolm1:grp1Driven1LipTp2Rt|malcolm1:ctlLipTp2Rt.translateX";
+createNode animCurveTL -n "DELETE_NODE34_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:lipJointsSpacedRt_NeutralPose|malcolm1:lipJointsSpacedRt|malcolm1:grpLipTp2SpacedRt|malcolm1:grp2Driven1LipTp2Rt|malcolm1:grp1Driven1LipTp2Rt|malcolm1:ctlLipTp2Rt.translateY";
+createNode animCurveTL -n "DELETE_NODE34_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:lipJointsSpacedRt_NeutralPose|malcolm1:lipJointsSpacedRt|malcolm1:grpLipTp2SpacedRt|malcolm1:grp2Driven1LipTp2Rt|malcolm1:grp1Driven1LipTp2Rt|malcolm1:ctlLipTp2Rt.translateZ";
+createNode animCurveTU -n "DELETE_NODE34_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:lipJointsSpacedRt_NeutralPose|malcolm1:lipJointsSpacedRt|malcolm1:grpLipTp2SpacedRt|malcolm1:grp2Driven1LipTp2Rt|malcolm1:grp1Driven1LipTp2Rt|malcolm1:ctlLipTp2Rt.scaleX";
+createNode animCurveTU -n "DELETE_NODE34_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:lipJointsSpacedRt_NeutralPose|malcolm1:lipJointsSpacedRt|malcolm1:grpLipTp2SpacedRt|malcolm1:grp2Driven1LipTp2Rt|malcolm1:grp1Driven1LipTp2Rt|malcolm1:ctlLipTp2Rt.scaleY";
+createNode animCurveTU -n "DELETE_NODE34_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:lipJointsSpacedRt_NeutralPose|malcolm1:lipJointsSpacedRt|malcolm1:grpLipTp2SpacedRt|malcolm1:grp2Driven1LipTp2Rt|malcolm1:grp1Driven1LipTp2Rt|malcolm1:ctlLipTp2Rt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE34_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:lipJointsSpacedRt_NeutralPose|malcolm1:lipJointsSpacedRt|malcolm1:grpLipTp2SpacedRt|malcolm1:grp2Driven1LipTp2Rt|malcolm1:grp1Driven1LipTp2Rt|malcolm1:ctlLipTp2Rt.rotateX";
+createNode animCurveTA -n "DELETE_NODE34_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:lipJointsSpacedRt_NeutralPose|malcolm1:lipJointsSpacedRt|malcolm1:grpLipTp2SpacedRt|malcolm1:grp2Driven1LipTp2Rt|malcolm1:grp1Driven1LipTp2Rt|malcolm1:ctlLipTp2Rt.rotateY";
+createNode animCurveTA -n "DELETE_NODE34_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:lipJointsSpacedRt_NeutralPose|malcolm1:lipJointsSpacedRt|malcolm1:grpLipTp2SpacedRt|malcolm1:grp2Driven1LipTp2Rt|malcolm1:grp1Driven1LipTp2Rt|malcolm1:ctlLipTp2Rt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE35_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTpCtSpaced|malcolm1:grp2Driven1LipTpCt|malcolm1:grp1Driven1LipTpCt|malcolm1:ctlLipTpCt.translateX";
+createNode animCurveTL -n "DELETE_NODE35_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTpCtSpaced|malcolm1:grp2Driven1LipTpCt|malcolm1:grp1Driven1LipTpCt|malcolm1:ctlLipTpCt.translateY";
+createNode animCurveTL -n "DELETE_NODE35_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTpCtSpaced|malcolm1:grp2Driven1LipTpCt|malcolm1:grp1Driven1LipTpCt|malcolm1:ctlLipTpCt.translateZ";
+createNode animCurveTU -n "DELETE_NODE35_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTpCtSpaced|malcolm1:grp2Driven1LipTpCt|malcolm1:grp1Driven1LipTpCt|malcolm1:ctlLipTpCt.scaleX";
+createNode animCurveTU -n "DELETE_NODE35_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTpCtSpaced|malcolm1:grp2Driven1LipTpCt|malcolm1:grp1Driven1LipTpCt|malcolm1:ctlLipTpCt.scaleY";
+createNode animCurveTU -n "DELETE_NODE35_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTpCtSpaced|malcolm1:grp2Driven1LipTpCt|malcolm1:grp1Driven1LipTpCt|malcolm1:ctlLipTpCt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE35_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTpCtSpaced|malcolm1:grp2Driven1LipTpCt|malcolm1:grp1Driven1LipTpCt|malcolm1:ctlLipTpCt.rotateX";
+createNode animCurveTA -n "DELETE_NODE35_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTpCtSpaced|malcolm1:grp2Driven1LipTpCt|malcolm1:grp1Driven1LipTpCt|malcolm1:ctlLipTpCt.rotateY";
+createNode animCurveTA -n "DELETE_NODE35_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTpCtSpaced|malcolm1:grp2Driven1LipTpCt|malcolm1:grp1Driven1LipTpCt|malcolm1:ctlLipTpCt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE36_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedLf|malcolm1:grp2Driven1LipTp1Lf|malcolm1:grp1Driven1LipTp1Lf|malcolm1:ctlLipTp1Lf.translateX";
+createNode animCurveTL -n "DELETE_NODE36_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedLf|malcolm1:grp2Driven1LipTp1Lf|malcolm1:grp1Driven1LipTp1Lf|malcolm1:ctlLipTp1Lf.translateY";
+createNode animCurveTL -n "DELETE_NODE36_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedLf|malcolm1:grp2Driven1LipTp1Lf|malcolm1:grp1Driven1LipTp1Lf|malcolm1:ctlLipTp1Lf.translateZ";
+createNode animCurveTU -n "DELETE_NODE36_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedLf|malcolm1:grp2Driven1LipTp1Lf|malcolm1:grp1Driven1LipTp1Lf|malcolm1:ctlLipTp1Lf.scaleX";
+createNode animCurveTU -n "DELETE_NODE36_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedLf|malcolm1:grp2Driven1LipTp1Lf|malcolm1:grp1Driven1LipTp1Lf|malcolm1:ctlLipTp1Lf.scaleY";
+createNode animCurveTU -n "DELETE_NODE36_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedLf|malcolm1:grp2Driven1LipTp1Lf|malcolm1:grp1Driven1LipTp1Lf|malcolm1:ctlLipTp1Lf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE36_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedLf|malcolm1:grp2Driven1LipTp1Lf|malcolm1:grp1Driven1LipTp1Lf|malcolm1:ctlLipTp1Lf.rotateX";
+createNode animCurveTA -n "DELETE_NODE36_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedLf|malcolm1:grp2Driven1LipTp1Lf|malcolm1:grp1Driven1LipTp1Lf|malcolm1:ctlLipTp1Lf.rotateY";
+createNode animCurveTA -n "DELETE_NODE36_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedLf|malcolm1:grp2Driven1LipTp1Lf|malcolm1:grp1Driven1LipTp1Lf|malcolm1:ctlLipTp1Lf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE37_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedRt|malcolm1:grp2Driven1LipTp1Rt|malcolm1:grp1Driven1LipTp1Rt|malcolm1:ctlLipTp1Rt.translateX";
+createNode animCurveTL -n "DELETE_NODE37_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedRt|malcolm1:grp2Driven1LipTp1Rt|malcolm1:grp1Driven1LipTp1Rt|malcolm1:ctlLipTp1Rt.translateY";
+createNode animCurveTL -n "DELETE_NODE37_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedRt|malcolm1:grp2Driven1LipTp1Rt|malcolm1:grp1Driven1LipTp1Rt|malcolm1:ctlLipTp1Rt.translateZ";
+createNode animCurveTU -n "DELETE_NODE37_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedRt|malcolm1:grp2Driven1LipTp1Rt|malcolm1:grp1Driven1LipTp1Rt|malcolm1:ctlLipTp1Rt.scaleX";
+createNode animCurveTU -n "DELETE_NODE37_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedRt|malcolm1:grp2Driven1LipTp1Rt|malcolm1:grp1Driven1LipTp1Rt|malcolm1:ctlLipTp1Rt.scaleY";
+createNode animCurveTU -n "DELETE_NODE37_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedRt|malcolm1:grp2Driven1LipTp1Rt|malcolm1:grp1Driven1LipTp1Rt|malcolm1:ctlLipTp1Rt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE37_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedRt|malcolm1:grp2Driven1LipTp1Rt|malcolm1:grp1Driven1LipTp1Rt|malcolm1:ctlLipTp1Rt.rotateX";
+createNode animCurveTA -n "DELETE_NODE37_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedRt|malcolm1:grp2Driven1LipTp1Rt|malcolm1:grp1Driven1LipTp1Rt|malcolm1:ctlLipTp1Rt.rotateY";
+createNode animCurveTA -n "DELETE_NODE37_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedRt|malcolm1:grp2Driven1LipTp1Rt|malcolm1:grp1Driven1LipTp1Rt|malcolm1:ctlLipTp1Rt.rotateZ";
+createNode animCurveTU -n "DELETE_NODE38_md";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.md";
+createNode animCurveTU -n "DELETE_NODE38_funnel";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.funnel";
+createNode animCurveTL -n "DELETE_NODE38_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.translateX";
+createNode animCurveTL -n "DELETE_NODE38_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0.027074020754017242 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.translateY";
+createNode animCurveTL -n "DELETE_NODE38_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 -0.0057109771758436824 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.translateZ";
+createNode animCurveTU -n "DELETE_NODE38_thicknessY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.thicknessY";
+createNode animCurveTU -n "DELETE_NODE38_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.scaleX";
+createNode animCurveTU -n "DELETE_NODE38_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.scaleY";
+createNode animCurveTU -n "DELETE_NODE38_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.scaleZ";
+createNode animCurveTA -n "DELETE_NODE38_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 -11.911318607773504 6 18.007232567490711
+ 10 18.007232567490711;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.rotateX";
+createNode animCurveTA -n "DELETE_NODE38_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.rotateY";
+createNode animCurveTA -n "DELETE_NODE38_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.rotateZ";
+createNode animCurveTU -n "DELETE_NODE38_peak";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.peak";
+createNode animCurveTU -n "DELETE_NODE38_press";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.press";
+createNode animCurveTU -n "DELETE_NODE38_puff";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.puff";
+createNode animCurveTU -n "DELETE_NODE38_thicknessZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.thicknessZ";
+createNode animCurveTL -n "DELETE_NODE39_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll.translateX";
+createNode animCurveTL -n "DELETE_NODE39_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll.translateY";
+createNode animCurveTL -n "DELETE_NODE39_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll.translateZ";
+createNode animCurveTU -n "DELETE_NODE39_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll.scaleX";
+createNode animCurveTU -n "DELETE_NODE39_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll.scaleY";
+createNode animCurveTU -n "DELETE_NODE39_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll.scaleZ";
+createNode animCurveTA -n "DELETE_NODE39_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll.rotateX";
+createNode animCurveTA -n "DELETE_NODE39_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll.rotateY";
+createNode animCurveTA -n "DELETE_NODE39_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll.rotateZ";
+createNode animCurveTL -n "DELETE_NODE40_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipTp2SpacedLf|malcolm1:grp2Driven1LipTp2Lf|malcolm1:grp1Driven1LipTp2Lf|malcolm1:ctlLipTp2Lf.translateX";
+createNode animCurveTL -n "DELETE_NODE40_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipTp2SpacedLf|malcolm1:grp2Driven1LipTp2Lf|malcolm1:grp1Driven1LipTp2Lf|malcolm1:ctlLipTp2Lf.translateY";
+createNode animCurveTL -n "DELETE_NODE40_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipTp2SpacedLf|malcolm1:grp2Driven1LipTp2Lf|malcolm1:grp1Driven1LipTp2Lf|malcolm1:ctlLipTp2Lf.translateZ";
+createNode animCurveTU -n "DELETE_NODE40_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipTp2SpacedLf|malcolm1:grp2Driven1LipTp2Lf|malcolm1:grp1Driven1LipTp2Lf|malcolm1:ctlLipTp2Lf.scaleX";
+createNode animCurveTU -n "DELETE_NODE40_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipTp2SpacedLf|malcolm1:grp2Driven1LipTp2Lf|malcolm1:grp1Driven1LipTp2Lf|malcolm1:ctlLipTp2Lf.scaleY";
+createNode animCurveTU -n "DELETE_NODE40_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipTp2SpacedLf|malcolm1:grp2Driven1LipTp2Lf|malcolm1:grp1Driven1LipTp2Lf|malcolm1:ctlLipTp2Lf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE40_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipTp2SpacedLf|malcolm1:grp2Driven1LipTp2Lf|malcolm1:grp1Driven1LipTp2Lf|malcolm1:ctlLipTp2Lf.rotateX";
+createNode animCurveTA -n "DELETE_NODE40_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipTp2SpacedLf|malcolm1:grp2Driven1LipTp2Lf|malcolm1:grp1Driven1LipTp2Lf|malcolm1:ctlLipTp2Lf.rotateY";
+createNode animCurveTA -n "DELETE_NODE40_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipTp2SpacedLf|malcolm1:grp2Driven1LipTp2Lf|malcolm1:grp1Driven1LipTp2Lf|malcolm1:ctlLipTp2Lf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE41_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnBtSpacedLf|malcolm1:ctlLipCrnBtLf.translateX";
+createNode animCurveTL -n "DELETE_NODE41_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnBtSpacedLf|malcolm1:ctlLipCrnBtLf.translateY";
+createNode animCurveTL -n "DELETE_NODE41_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnBtSpacedLf|malcolm1:ctlLipCrnBtLf.translateZ";
+createNode animCurveTU -n "DELETE_NODE41_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnBtSpacedLf|malcolm1:ctlLipCrnBtLf.scaleX";
+createNode animCurveTU -n "DELETE_NODE41_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnBtSpacedLf|malcolm1:ctlLipCrnBtLf.scaleY";
+createNode animCurveTU -n "DELETE_NODE41_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnBtSpacedLf|malcolm1:ctlLipCrnBtLf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE41_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnBtSpacedLf|malcolm1:ctlLipCrnBtLf.rotateX";
+createNode animCurveTA -n "DELETE_NODE41_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnBtSpacedLf|malcolm1:ctlLipCrnBtLf.rotateY";
+createNode animCurveTA -n "DELETE_NODE41_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnBtSpacedLf|malcolm1:ctlLipCrnBtLf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE42_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnTpSpacedLf|malcolm1:ctlLipCrnTpLf.translateX";
+createNode animCurveTL -n "DELETE_NODE42_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnTpSpacedLf|malcolm1:ctlLipCrnTpLf.translateY";
+createNode animCurveTL -n "DELETE_NODE42_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnTpSpacedLf|malcolm1:ctlLipCrnTpLf.translateZ";
+createNode animCurveTU -n "DELETE_NODE42_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnTpSpacedLf|malcolm1:ctlLipCrnTpLf.scaleX";
+createNode animCurveTU -n "DELETE_NODE42_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnTpSpacedLf|malcolm1:ctlLipCrnTpLf.scaleY";
+createNode animCurveTU -n "DELETE_NODE42_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnTpSpacedLf|malcolm1:ctlLipCrnTpLf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE42_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnTpSpacedLf|malcolm1:ctlLipCrnTpLf.rotateX";
+createNode animCurveTA -n "DELETE_NODE42_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnTpSpacedLf|malcolm1:ctlLipCrnTpLf.rotateY";
+createNode animCurveTA -n "DELETE_NODE42_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnTpSpacedLf|malcolm1:ctlLipCrnTpLf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE43_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf.translateX";
+createNode animCurveTL -n "DELETE_NODE43_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf.translateY";
+createNode animCurveTL -n "DELETE_NODE43_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf.translateZ";
+createNode animCurveTU -n "DELETE_NODE43_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf.scaleX";
+createNode animCurveTU -n "DELETE_NODE43_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf.scaleY";
+createNode animCurveTU -n "DELETE_NODE43_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE43_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf.rotateX";
+createNode animCurveTA -n "DELETE_NODE43_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf.rotateY";
+createNode animCurveTA -n "DELETE_NODE43_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE44_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnTpSpacedRt|malcolm1:ctlLipCrnTpRt.translateX";
+createNode animCurveTL -n "DELETE_NODE44_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnTpSpacedRt|malcolm1:ctlLipCrnTpRt.translateY";
+createNode animCurveTL -n "DELETE_NODE44_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnTpSpacedRt|malcolm1:ctlLipCrnTpRt.translateZ";
+createNode animCurveTU -n "DELETE_NODE44_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnTpSpacedRt|malcolm1:ctlLipCrnTpRt.scaleX";
+createNode animCurveTU -n "DELETE_NODE44_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnTpSpacedRt|malcolm1:ctlLipCrnTpRt.scaleY";
+createNode animCurveTU -n "DELETE_NODE44_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnTpSpacedRt|malcolm1:ctlLipCrnTpRt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE44_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnTpSpacedRt|malcolm1:ctlLipCrnTpRt.rotateX";
+createNode animCurveTA -n "DELETE_NODE44_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnTpSpacedRt|malcolm1:ctlLipCrnTpRt.rotateY";
+createNode animCurveTA -n "DELETE_NODE44_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnTpSpacedRt|malcolm1:ctlLipCrnTpRt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE45_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnBtSpacedRt|malcolm1:ctlLipCrnBtRt.translateX";
+createNode animCurveTL -n "DELETE_NODE45_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnBtSpacedRt|malcolm1:ctlLipCrnBtRt.translateY";
+createNode animCurveTL -n "DELETE_NODE45_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnBtSpacedRt|malcolm1:ctlLipCrnBtRt.translateZ";
+createNode animCurveTU -n "DELETE_NODE45_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnBtSpacedRt|malcolm1:ctlLipCrnBtRt.scaleX";
+createNode animCurveTU -n "DELETE_NODE45_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnBtSpacedRt|malcolm1:ctlLipCrnBtRt.scaleY";
+createNode animCurveTU -n "DELETE_NODE45_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnBtSpacedRt|malcolm1:ctlLipCrnBtRt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE45_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnBtSpacedRt|malcolm1:ctlLipCrnBtRt.rotateX";
+createNode animCurveTA -n "DELETE_NODE45_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnBtSpacedRt|malcolm1:ctlLipCrnBtRt.rotateY";
+createNode animCurveTA -n "DELETE_NODE45_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnBtSpacedRt|malcolm1:ctlLipCrnBtRt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE46_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt.translateX";
+createNode animCurveTL -n "DELETE_NODE46_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt.translateY";
+createNode animCurveTL -n "DELETE_NODE46_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt.translateZ";
+createNode animCurveTU -n "DELETE_NODE46_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt.scaleX";
+createNode animCurveTU -n "DELETE_NODE46_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt.scaleY";
+createNode animCurveTU -n "DELETE_NODE46_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE46_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt.rotateX";
+createNode animCurveTA -n "DELETE_NODE46_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt.rotateY";
+createNode animCurveTA -n "DELETE_NODE46_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE47_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt.translateX";
+createNode animCurveTL -n "DELETE_NODE47_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt.translateY";
+createNode animCurveTL -n "DELETE_NODE47_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt.translateZ";
+createNode animCurveTU -n "DELETE_NODE47_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt.scaleX";
+createNode animCurveTU -n "DELETE_NODE47_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt.scaleY";
+createNode animCurveTU -n "DELETE_NODE47_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE47_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt.rotateX";
+createNode animCurveTA -n "DELETE_NODE47_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt.rotateY";
+createNode animCurveTA -n "DELETE_NODE47_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE48_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1.translateX";
+createNode animCurveTL -n "DELETE_NODE48_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1.translateY";
+createNode animCurveTL -n "DELETE_NODE48_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1.translateZ";
+createNode animCurveTU -n "DELETE_NODE48_noseBrowCrunch";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1.noseBrowCrunch";
+createNode animCurveTU -n "DELETE_NODE48_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1.scaleX";
+createNode animCurveTU -n "DELETE_NODE48_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1.scaleY";
+createNode animCurveTU -n "DELETE_NODE48_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1.scaleZ";
+createNode animCurveTA -n "DELETE_NODE48_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 7.3329886924191845 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1.rotateX";
+createNode animCurveTA -n "DELETE_NODE48_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 1.9135552963620606 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1.rotateY";
+createNode animCurveTA -n "DELETE_NODE48_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 1.3626335147650102 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1.rotateZ";
+createNode animCurveTL -n "DELETE_NODE49_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0.026292450592984858 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseLf|malcolm1:ctlNoseLf.translateX";
+createNode animCurveTL -n "DELETE_NODE49_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0.10532761562485417 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseLf|malcolm1:ctlNoseLf.translateY";
+createNode animCurveTL -n "DELETE_NODE49_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseLf|malcolm1:ctlNoseLf.translateZ";
+createNode animCurveTU -n "DELETE_NODE49_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseLf|malcolm1:ctlNoseLf.scaleX";
+createNode animCurveTU -n "DELETE_NODE49_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseLf|malcolm1:ctlNoseLf.scaleY";
+createNode animCurveTU -n "DELETE_NODE49_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseLf|malcolm1:ctlNoseLf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE49_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseLf|malcolm1:ctlNoseLf.rotateX";
+createNode animCurveTA -n "DELETE_NODE49_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseLf|malcolm1:ctlNoseLf.rotateY";
+createNode animCurveTA -n "DELETE_NODE49_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseLf|malcolm1:ctlNoseLf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE50_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseRt|malcolm1:ctlNoseRt.translateX";
+createNode animCurveTL -n "DELETE_NODE50_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseRt|malcolm1:ctlNoseRt.translateY";
+createNode animCurveTL -n "DELETE_NODE50_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseRt|malcolm1:ctlNoseRt.translateZ";
+createNode animCurveTU -n "DELETE_NODE50_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseRt|malcolm1:ctlNoseRt.scaleX";
+createNode animCurveTU -n "DELETE_NODE50_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseRt|malcolm1:ctlNoseRt.scaleY";
+createNode animCurveTU -n "DELETE_NODE50_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseRt|malcolm1:ctlNoseRt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE50_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseRt|malcolm1:ctlNoseRt.rotateX";
+createNode animCurveTA -n "DELETE_NODE50_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseRt|malcolm1:ctlNoseRt.rotateY";
+createNode animCurveTA -n "DELETE_NODE50_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseRt|malcolm1:ctlNoseRt.rotateZ";
+createNode animCurveTU -n "DELETE_NODE51_nasoCrease";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.nasoCrease";
+createNode animCurveTU -n "DELETE_NODE51_cornerHeight";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.cornerHeight";
+createNode animCurveTL -n "DELETE_NODE51_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 1.0559747460952333 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.translateX";
+createNode animCurveTL -n "DELETE_NODE51_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 -0.41604976362508006 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.translateY";
+createNode animCurveTL -n "DELETE_NODE51_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.translateZ";
+createNode animCurveTA -n "DELETE_NODE51_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.rotateY";
+createNode animCurveTU -n "DELETE_NODE51_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.scaleX";
+createNode animCurveTU -n "DELETE_NODE51_pucker";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.pucker";
+createNode animCurveTU -n "DELETE_NODE51_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.scaleY";
+createNode animCurveTU -n "DELETE_NODE51_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE51_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.rotateX";
+createNode animCurveTU -n "DELETE_NODE51_cornerPinchIn";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.cornerPinchIn";
+createNode animCurveTA -n "DELETE_NODE51_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.rotateZ";
+createNode animCurveTU -n "DELETE_NODE51_disableAutoPucker";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.disableAutoPucker";
+createNode animCurveTU -n "DELETE_NODE51_cornerPinchOt";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.cornerPinchOt";
+createNode animCurveTU -n "DELETE_NODE52_nasoCrease";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.nasoCrease";
+createNode animCurveTU -n "DELETE_NODE52_cornerHeight";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.cornerHeight";
+createNode animCurveTL -n "DELETE_NODE52_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 1.0559747460952331 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.translateX";
+createNode animCurveTL -n "DELETE_NODE52_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 -0.41604976362508 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.translateY";
+createNode animCurveTL -n "DELETE_NODE52_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.translateZ";
+createNode animCurveTA -n "DELETE_NODE52_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.rotateY";
+createNode animCurveTU -n "DELETE_NODE52_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.scaleX";
+createNode animCurveTU -n "DELETE_NODE52_pucker";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.pucker";
+createNode animCurveTU -n "DELETE_NODE52_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.scaleY";
+createNode animCurveTU -n "DELETE_NODE52_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE52_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.rotateX";
+createNode animCurveTU -n "DELETE_NODE52_cornerPinchIn";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.cornerPinchIn";
+createNode animCurveTA -n "DELETE_NODE52_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.rotateZ";
+createNode animCurveTU -n "DELETE_NODE52_disableAutoPucker";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.disableAutoPucker";
+createNode animCurveTU -n "DELETE_NODE52_cornerPinchOt";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.cornerPinchOt";
+createNode animCurveTA -n "DELETE_NODE53_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp.rotateX";
+createNode animCurveTL -n "DELETE_NODE53_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp.translateX";
+createNode animCurveTL -n "DELETE_NODE53_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp.translateY";
+createNode animCurveTL -n "DELETE_NODE53_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp.translateZ";
+createNode animCurveTU -n "DELETE_NODE53_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp.scaleX";
+createNode animCurveTU -n "DELETE_NODE53_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp.scaleY";
+createNode animCurveTU -n "DELETE_NODE53_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp.scaleZ";
+createNode animCurveTU -n "DELETE_NODE53_squetch";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp.squetch";
+createNode animCurveTA -n "DELETE_NODE53_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp.rotateY";
+createNode animCurveTA -n "DELETE_NODE53_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp.rotateZ";
+createNode animCurveTL -n "DELETE_NODE54_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 8.8817841970009752e-016 6 8.8817841970009752e-016
+ 10 8.8817841970009752e-016;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInLf|malcolm1:ctlBrowInLf.translateX";
+createNode animCurveTL -n "DELETE_NODE54_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 1.304649902425564 6 0.88330452769852741
+ 10 0.88330452769852741;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInLf|malcolm1:ctlBrowInLf.translateY";
+createNode animCurveTL -n "DELETE_NODE54_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInLf|malcolm1:ctlBrowInLf.translateZ";
+createNode animCurveTU -n "DELETE_NODE54_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInLf|malcolm1:ctlBrowInLf.scaleX";
+createNode animCurveTU -n "DELETE_NODE54_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInLf|malcolm1:ctlBrowInLf.scaleY";
+createNode animCurveTU -n "DELETE_NODE54_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInLf|malcolm1:ctlBrowInLf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE54_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInLf|malcolm1:ctlBrowInLf.rotateX";
+createNode animCurveTA -n "DELETE_NODE54_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInLf|malcolm1:ctlBrowInLf.rotateY";
+createNode animCurveTA -n "DELETE_NODE54_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInLf|malcolm1:ctlBrowInLf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE55_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 4.4408920985004368e-016 6 4.4408920985004368e-016
+ 10 4.4408920985004368e-016;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdLf|malcolm1:ctlBrowMdLf.translateX";
+createNode animCurveTL -n "DELETE_NODE55_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 -0.11940397604903523 6 0.88330452769852819
+ 10 0.88330452769852819;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdLf|malcolm1:ctlBrowMdLf.translateY";
+createNode animCurveTL -n "DELETE_NODE55_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdLf|malcolm1:ctlBrowMdLf.translateZ";
+createNode animCurveTU -n "DELETE_NODE55_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdLf|malcolm1:ctlBrowMdLf.scaleX";
+createNode animCurveTU -n "DELETE_NODE55_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdLf|malcolm1:ctlBrowMdLf.scaleY";
+createNode animCurveTU -n "DELETE_NODE55_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdLf|malcolm1:ctlBrowMdLf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE55_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdLf|malcolm1:ctlBrowMdLf.rotateX";
+createNode animCurveTA -n "DELETE_NODE55_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdLf|malcolm1:ctlBrowMdLf.rotateY";
+createNode animCurveTA -n "DELETE_NODE55_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdLf|malcolm1:ctlBrowMdLf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE56_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 8.8817841970009802e-016 6 8.8817841970009802e-016
+ 10 8.8817841970009802e-016;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInRt|malcolm1:ctlBrowInRt.translateX";
+createNode animCurveTL -n "DELETE_NODE56_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 1.304649902425564 6 0.88330452769852763
+ 10 0.88330452769852763;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInRt|malcolm1:ctlBrowInRt.translateY";
+createNode animCurveTL -n "DELETE_NODE56_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInRt|malcolm1:ctlBrowInRt.translateZ";
+createNode animCurveTU -n "DELETE_NODE56_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInRt|malcolm1:ctlBrowInRt.scaleX";
+createNode animCurveTU -n "DELETE_NODE56_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInRt|malcolm1:ctlBrowInRt.scaleY";
+createNode animCurveTU -n "DELETE_NODE56_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInRt|malcolm1:ctlBrowInRt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE56_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInRt|malcolm1:ctlBrowInRt.rotateX";
+createNode animCurveTA -n "DELETE_NODE56_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInRt|malcolm1:ctlBrowInRt.rotateY";
+createNode animCurveTA -n "DELETE_NODE56_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInRt|malcolm1:ctlBrowInRt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE57_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 4.4408920985004368e-016 6 4.4408920985004368e-016
+ 10 4.4408920985004368e-016;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdRt|malcolm1:ctlBrowMdRt.translateX";
+createNode animCurveTL -n "DELETE_NODE57_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 -0.11940397604903506 6 0.88330452769852785
+ 10 0.88330452769852785;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdRt|malcolm1:ctlBrowMdRt.translateY";
+createNode animCurveTL -n "DELETE_NODE57_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdRt|malcolm1:ctlBrowMdRt.translateZ";
+createNode animCurveTU -n "DELETE_NODE57_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdRt|malcolm1:ctlBrowMdRt.scaleX";
+createNode animCurveTU -n "DELETE_NODE57_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdRt|malcolm1:ctlBrowMdRt.scaleY";
+createNode animCurveTU -n "DELETE_NODE57_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdRt|malcolm1:ctlBrowMdRt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE57_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdRt|malcolm1:ctlBrowMdRt.rotateX";
+createNode animCurveTA -n "DELETE_NODE57_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdRt|malcolm1:ctlBrowMdRt.rotateY";
+createNode animCurveTA -n "DELETE_NODE57_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdRt|malcolm1:ctlBrowMdRt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE58_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtRt|malcolm1:ctlBrowOtRt.translateX";
+createNode animCurveTL -n "DELETE_NODE58_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0.3507284991589627 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtRt|malcolm1:ctlBrowOtRt.translateY";
+createNode animCurveTL -n "DELETE_NODE58_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtRt|malcolm1:ctlBrowOtRt.translateZ";
+createNode animCurveTU -n "DELETE_NODE58_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtRt|malcolm1:ctlBrowOtRt.scaleX";
+createNode animCurveTU -n "DELETE_NODE58_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtRt|malcolm1:ctlBrowOtRt.scaleY";
+createNode animCurveTU -n "DELETE_NODE58_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtRt|malcolm1:ctlBrowOtRt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE58_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtRt|malcolm1:ctlBrowOtRt.rotateX";
+createNode animCurveTA -n "DELETE_NODE58_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtRt|malcolm1:ctlBrowOtRt.rotateY";
+createNode animCurveTA -n "DELETE_NODE58_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtRt|malcolm1:ctlBrowOtRt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE59_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedLf|malcolm1:ctlCheekTpOtLf.translateX";
+createNode animCurveTL -n "DELETE_NODE59_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedLf|malcolm1:ctlCheekTpOtLf.translateY";
+createNode animCurveTL -n "DELETE_NODE59_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedLf|malcolm1:ctlCheekTpOtLf.translateZ";
+createNode animCurveTU -n "DELETE_NODE59_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedLf|malcolm1:ctlCheekTpOtLf.scaleX";
+createNode animCurveTU -n "DELETE_NODE59_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedLf|malcolm1:ctlCheekTpOtLf.scaleY";
+createNode animCurveTU -n "DELETE_NODE59_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedLf|malcolm1:ctlCheekTpOtLf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE59_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedLf|malcolm1:ctlCheekTpOtLf.rotateX";
+createNode animCurveTA -n "DELETE_NODE59_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedLf|malcolm1:ctlCheekTpOtLf.rotateY";
+createNode animCurveTA -n "DELETE_NODE59_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedLf|malcolm1:ctlCheekTpOtLf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE60_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtLf|malcolm1:ctlBrowOtLf.translateX";
+createNode animCurveTL -n "DELETE_NODE60_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0.35072849915896281 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtLf|malcolm1:ctlBrowOtLf.translateY";
+createNode animCurveTL -n "DELETE_NODE60_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtLf|malcolm1:ctlBrowOtLf.translateZ";
+createNode animCurveTU -n "DELETE_NODE60_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtLf|malcolm1:ctlBrowOtLf.scaleX";
+createNode animCurveTU -n "DELETE_NODE60_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtLf|malcolm1:ctlBrowOtLf.scaleY";
+createNode animCurveTU -n "DELETE_NODE60_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtLf|malcolm1:ctlBrowOtLf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE60_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtLf|malcolm1:ctlBrowOtLf.rotateX";
+createNode animCurveTA -n "DELETE_NODE60_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtLf|malcolm1:ctlBrowOtLf.rotateY";
+createNode animCurveTA -n "DELETE_NODE60_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtLf|malcolm1:ctlBrowOtLf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE61_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedRt|malcolm1:ctlCheekTpOtRt.translateX";
+createNode animCurveTL -n "DELETE_NODE61_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedRt|malcolm1:ctlCheekTpOtRt.translateY";
+createNode animCurveTL -n "DELETE_NODE61_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedRt|malcolm1:ctlCheekTpOtRt.translateZ";
+createNode animCurveTU -n "DELETE_NODE61_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedRt|malcolm1:ctlCheekTpOtRt.scaleX";
+createNode animCurveTU -n "DELETE_NODE61_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedRt|malcolm1:ctlCheekTpOtRt.scaleY";
+createNode animCurveTU -n "DELETE_NODE61_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedRt|malcolm1:ctlCheekTpOtRt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE61_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedRt|malcolm1:ctlCheekTpOtRt.rotateX";
+createNode animCurveTA -n "DELETE_NODE61_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedRt|malcolm1:ctlCheekTpOtRt.rotateY";
+createNode animCurveTA -n "DELETE_NODE61_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedRt|malcolm1:ctlCheekTpOtRt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE62_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf|malcolm1:eyeLidDrivenLf|malcolm1:ctlEyeLidLf.translateX";
+createNode animCurveTL -n "DELETE_NODE62_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf|malcolm1:eyeLidDrivenLf|malcolm1:ctlEyeLidLf.translateY";
+createNode animCurveTL -n "DELETE_NODE62_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf|malcolm1:eyeLidDrivenLf|malcolm1:ctlEyeLidLf.translateZ";
+createNode animCurveTU -n "DELETE_NODE62_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf|malcolm1:eyeLidDrivenLf|malcolm1:ctlEyeLidLf.scaleX";
+createNode animCurveTU -n "DELETE_NODE62_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf|malcolm1:eyeLidDrivenLf|malcolm1:ctlEyeLidLf.scaleY";
+createNode animCurveTU -n "DELETE_NODE62_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf|malcolm1:eyeLidDrivenLf|malcolm1:ctlEyeLidLf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE62_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf|malcolm1:eyeLidDrivenLf|malcolm1:ctlEyeLidLf.rotateX";
+createNode animCurveTA -n "DELETE_NODE62_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf|malcolm1:eyeLidDrivenLf|malcolm1:ctlEyeLidLf.rotateY";
+createNode animCurveTA -n "DELETE_NODE62_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf|malcolm1:eyeLidDrivenLf|malcolm1:ctlEyeLidLf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE63_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf.translateX";
+createNode animCurveTL -n "DELETE_NODE63_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf.translateY";
+createNode animCurveTL -n "DELETE_NODE63_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf.translateZ";
+createNode animCurveTU -n "DELETE_NODE63_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf.scaleX";
+createNode animCurveTU -n "DELETE_NODE63_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1.1604626114368255 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf.scaleY";
+createNode animCurveTU -n "DELETE_NODE63_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE63_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf.rotateX";
+createNode animCurveTA -n "DELETE_NODE63_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf.rotateY";
+createNode animCurveTA -n "DELETE_NODE63_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE64_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.translateX";
+createNode animCurveTL -n "DELETE_NODE64_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 -0.24385272226567933 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.translateY";
+createNode animCurveTL -n "DELETE_NODE64_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.translateZ";
+createNode animCurveTU -n "DELETE_NODE64_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.scaleX";
+createNode animCurveTU -n "DELETE_NODE64_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.scaleY";
+createNode animCurveTU -n "DELETE_NODE64_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE64_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.rotateX";
+createNode animCurveTA -n "DELETE_NODE64_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.rotateY";
+createNode animCurveTA -n "DELETE_NODE64_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.rotateZ";
+createNode animCurveTU -n "DELETE_NODE64_lidCheek";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 1 6 1 10 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.lidCheek";
+createNode animCurveTU -n "DELETE_NODE64_squint";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.squint";
+createNode animCurveTL -n "DELETE_NODE65_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnInLf|malcolm1:ctlLidCrnInLf.translateX";
+createNode animCurveTL -n "DELETE_NODE65_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnInLf|malcolm1:ctlLidCrnInLf.translateY";
+createNode animCurveTL -n "DELETE_NODE65_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnInLf|malcolm1:ctlLidCrnInLf.translateZ";
+createNode animCurveTU -n "DELETE_NODE65_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnInLf|malcolm1:ctlLidCrnInLf.scaleX";
+createNode animCurveTU -n "DELETE_NODE65_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnInLf|malcolm1:ctlLidCrnInLf.scaleY";
+createNode animCurveTU -n "DELETE_NODE65_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnInLf|malcolm1:ctlLidCrnInLf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE65_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnInLf|malcolm1:ctlLidCrnInLf.rotateX";
+createNode animCurveTA -n "DELETE_NODE65_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnInLf|malcolm1:ctlLidCrnInLf.rotateY";
+createNode animCurveTA -n "DELETE_NODE65_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnInLf|malcolm1:ctlLidCrnInLf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE66_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnOtLf|malcolm1:ctlLidCrnOtLf.translateX";
+createNode animCurveTL -n "DELETE_NODE66_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnOtLf|malcolm1:ctlLidCrnOtLf.translateY";
+createNode animCurveTL -n "DELETE_NODE66_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnOtLf|malcolm1:ctlLidCrnOtLf.translateZ";
+createNode animCurveTU -n "DELETE_NODE66_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnOtLf|malcolm1:ctlLidCrnOtLf.scaleX";
+createNode animCurveTU -n "DELETE_NODE66_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnOtLf|malcolm1:ctlLidCrnOtLf.scaleY";
+createNode animCurveTU -n "DELETE_NODE66_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnOtLf|malcolm1:ctlLidCrnOtLf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE66_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnOtLf|malcolm1:ctlLidCrnOtLf.rotateX";
+createNode animCurveTA -n "DELETE_NODE66_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnOtLf|malcolm1:ctlLidCrnOtLf.rotateY";
+createNode animCurveTA -n "DELETE_NODE66_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnOtLf|malcolm1:ctlLidCrnOtLf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE67_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf.translateX";
+createNode animCurveTL -n "DELETE_NODE67_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 1.2069617148462117 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf.translateY";
+createNode animCurveTL -n "DELETE_NODE67_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf.translateZ";
+createNode animCurveTU -n "DELETE_NODE67_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf.scaleX";
+createNode animCurveTU -n "DELETE_NODE67_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf.scaleY";
+createNode animCurveTU -n "DELETE_NODE67_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE67_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf.rotateX";
+createNode animCurveTA -n "DELETE_NODE67_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf.rotateY";
+createNode animCurveTA -n "DELETE_NODE67_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf.rotateZ";
+createNode animCurveTU -n "DELETE_NODE67_squint";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf.squint";
+createNode animCurveTU -n "DELETE_NODE68_iris";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.iris";
+createNode animCurveTL -n "DELETE_NODE68_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.translateX";
+createNode animCurveTL -n "DELETE_NODE68_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.translateY";
+createNode animCurveTL -n "DELETE_NODE68_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.translateZ";
+createNode animCurveTU -n "DELETE_NODE68_eyeShaperVis";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr -s 3 ".kot[0:2]" 5 5 5;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.eyeShaperVis";
+createNode animCurveTU -n "DELETE_NODE68_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.scaleX";
+createNode animCurveTU -n "DELETE_NODE68_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.scaleY";
+createNode animCurveTU -n "DELETE_NODE68_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.scaleZ";
+createNode animCurveTU -n "DELETE_NODE68_aim";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.aim";
+createNode animCurveTA -n "DELETE_NODE68_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.rotateY";
+createNode animCurveTA -n "DELETE_NODE68_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.rotateZ";
+createNode animCurveTU -n "DELETE_NODE68_eyeBulge";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.eyeBulge";
+createNode animCurveTU -n "DELETE_NODE68_pupil";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.pupil";
+createNode animCurveTU -n "DELETE_NODE68_lidShaperVis";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr -s 3 ".kot[0:2]" 5 5 5;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.lidShaperVis";
+createNode animCurveTA -n "DELETE_NODE68_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.rotateX";
+createNode animCurveTL -n "DELETE_NODE69_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt|malcolm1:eyeLidDrivenRt|malcolm1:ctlEyeLidRt.translateX";
+createNode animCurveTL -n "DELETE_NODE69_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt|malcolm1:eyeLidDrivenRt|malcolm1:ctlEyeLidRt.translateY";
+createNode animCurveTL -n "DELETE_NODE69_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt|malcolm1:eyeLidDrivenRt|malcolm1:ctlEyeLidRt.translateZ";
+createNode animCurveTU -n "DELETE_NODE69_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt|malcolm1:eyeLidDrivenRt|malcolm1:ctlEyeLidRt.scaleX";
+createNode animCurveTU -n "DELETE_NODE69_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt|malcolm1:eyeLidDrivenRt|malcolm1:ctlEyeLidRt.scaleY";
+createNode animCurveTU -n "DELETE_NODE69_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt|malcolm1:eyeLidDrivenRt|malcolm1:ctlEyeLidRt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE69_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt|malcolm1:eyeLidDrivenRt|malcolm1:ctlEyeLidRt.rotateX";
+createNode animCurveTA -n "DELETE_NODE69_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt|malcolm1:eyeLidDrivenRt|malcolm1:ctlEyeLidRt.rotateY";
+createNode animCurveTA -n "DELETE_NODE69_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt|malcolm1:eyeLidDrivenRt|malcolm1:ctlEyeLidRt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE70_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt.translateX";
+createNode animCurveTL -n "DELETE_NODE70_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt.translateY";
+createNode animCurveTL -n "DELETE_NODE70_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt.translateZ";
+createNode animCurveTU -n "DELETE_NODE70_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt.scaleX";
+createNode animCurveTU -n "DELETE_NODE70_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1.1604626114368255 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt.scaleY";
+createNode animCurveTU -n "DELETE_NODE70_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE70_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt.rotateX";
+createNode animCurveTA -n "DELETE_NODE70_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt.rotateY";
+createNode animCurveTA -n "DELETE_NODE70_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE71_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.translateX";
+createNode animCurveTL -n "DELETE_NODE71_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 -0.24385272226567936 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.translateY";
+createNode animCurveTL -n "DELETE_NODE71_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.translateZ";
+createNode animCurveTU -n "DELETE_NODE71_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.scaleX";
+createNode animCurveTU -n "DELETE_NODE71_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.scaleY";
+createNode animCurveTU -n "DELETE_NODE71_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE71_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.rotateX";
+createNode animCurveTA -n "DELETE_NODE71_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.rotateY";
+createNode animCurveTA -n "DELETE_NODE71_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.rotateZ";
+createNode animCurveTU -n "DELETE_NODE71_lidCheek";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 1 6 1 10 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.lidCheek";
+createNode animCurveTU -n "DELETE_NODE71_squint";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.squint";
+createNode animCurveTL -n "DELETE_NODE72_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnInRt|malcolm1:ctlLidCrnInRt.translateX";
+createNode animCurveTL -n "DELETE_NODE72_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnInRt|malcolm1:ctlLidCrnInRt.translateY";
+createNode animCurveTL -n "DELETE_NODE72_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnInRt|malcolm1:ctlLidCrnInRt.translateZ";
+createNode animCurveTU -n "DELETE_NODE72_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnInRt|malcolm1:ctlLidCrnInRt.scaleX";
+createNode animCurveTU -n "DELETE_NODE72_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnInRt|malcolm1:ctlLidCrnInRt.scaleY";
+createNode animCurveTU -n "DELETE_NODE72_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnInRt|malcolm1:ctlLidCrnInRt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE72_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnInRt|malcolm1:ctlLidCrnInRt.rotateX";
+createNode animCurveTA -n "DELETE_NODE72_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnInRt|malcolm1:ctlLidCrnInRt.rotateY";
+createNode animCurveTA -n "DELETE_NODE72_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnInRt|malcolm1:ctlLidCrnInRt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE73_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnOtRt|malcolm1:ctlLidCrnOtRt.translateX";
+createNode animCurveTL -n "DELETE_NODE73_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnOtRt|malcolm1:ctlLidCrnOtRt.translateY";
+createNode animCurveTL -n "DELETE_NODE73_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnOtRt|malcolm1:ctlLidCrnOtRt.translateZ";
+createNode animCurveTU -n "DELETE_NODE73_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnOtRt|malcolm1:ctlLidCrnOtRt.scaleX";
+createNode animCurveTU -n "DELETE_NODE73_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnOtRt|malcolm1:ctlLidCrnOtRt.scaleY";
+createNode animCurveTU -n "DELETE_NODE73_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnOtRt|malcolm1:ctlLidCrnOtRt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE73_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnOtRt|malcolm1:ctlLidCrnOtRt.rotateX";
+createNode animCurveTA -n "DELETE_NODE73_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnOtRt|malcolm1:ctlLidCrnOtRt.rotateY";
+createNode animCurveTA -n "DELETE_NODE73_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnOtRt|malcolm1:ctlLidCrnOtRt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE74_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt.translateX";
+createNode animCurveTL -n "DELETE_NODE74_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 1.2069617148462115 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt.translateY";
+createNode animCurveTL -n "DELETE_NODE74_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt.translateZ";
+createNode animCurveTU -n "DELETE_NODE74_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt.scaleX";
+createNode animCurveTU -n "DELETE_NODE74_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt.scaleY";
+createNode animCurveTU -n "DELETE_NODE74_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE74_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt.rotateX";
+createNode animCurveTA -n "DELETE_NODE74_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt.rotateY";
+createNode animCurveTA -n "DELETE_NODE74_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt.rotateZ";
+createNode animCurveTU -n "DELETE_NODE74_squint";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt.squint";
+createNode animCurveTU -n "DELETE_NODE75_iris";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.iris";
+createNode animCurveTL -n "DELETE_NODE75_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.translateX";
+createNode animCurveTL -n "DELETE_NODE75_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.translateY";
+createNode animCurveTL -n "DELETE_NODE75_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.translateZ";
+createNode animCurveTU -n "DELETE_NODE75_eyeShaperVis";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr -s 3 ".kot[0:2]" 5 5 5;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.eyeShaperVis";
+createNode animCurveTU -n "DELETE_NODE75_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.scaleX";
+createNode animCurveTU -n "DELETE_NODE75_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.scaleY";
+createNode animCurveTU -n "DELETE_NODE75_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.scaleZ";
+createNode animCurveTU -n "DELETE_NODE75_aim";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.aim";
+createNode animCurveTA -n "DELETE_NODE75_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.rotateY";
+createNode animCurveTA -n "DELETE_NODE75_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.rotateZ";
+createNode animCurveTU -n "DELETE_NODE75_eyeBulge";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.eyeBulge";
+createNode animCurveTU -n "DELETE_NODE75_pupil";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.pupil";
+createNode animCurveTU -n "DELETE_NODE75_lidShaperVis";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr -s 3 ".kot[0:2]" 5 5 5;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.lidShaperVis";
+createNode animCurveTA -n "DELETE_NODE75_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.rotateX";
+createNode animCurveTL -n "DELETE_NODE76_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront.translateX";
+createNode animCurveTL -n "DELETE_NODE76_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront.translateY";
+createNode animCurveTL -n "DELETE_NODE76_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront.translateZ";
+createNode animCurveTU -n "DELETE_NODE76_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront.scaleX";
+createNode animCurveTU -n "DELETE_NODE76_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront.scaleY";
+createNode animCurveTU -n "DELETE_NODE76_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront.scaleZ";
+createNode animCurveTA -n "DELETE_NODE76_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront.rotateX";
+createNode animCurveTA -n "DELETE_NODE76_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront.rotateY";
+createNode animCurveTA -n "DELETE_NODE76_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront.rotateZ";
+createNode animCurveTL -n "DELETE_NODE77_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2.translateX";
+createNode animCurveTL -n "DELETE_NODE77_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2.translateY";
+createNode animCurveTL -n "DELETE_NODE77_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2.translateZ";
+createNode animCurveTU -n "DELETE_NODE77_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2.scaleX";
+createNode animCurveTU -n "DELETE_NODE77_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2.scaleY";
+createNode animCurveTU -n "DELETE_NODE77_visibility";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 9;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr -s 2 ".kot[0:1]" 5 5;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2.visibility";
+createNode animCurveTA -n "DELETE_NODE77_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2.rotateX";
+createNode animCurveTA -n "DELETE_NODE77_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2.rotateY";
+createNode animCurveTA -n "DELETE_NODE77_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2.rotateZ";
+createNode animCurveTU -n "DELETE_NODE77_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2.scaleZ";
+createNode animCurveTL -n "DELETE_NODE78_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperTpLf|malcolm1:ctlEyeShaperTpLf.translateX";
+createNode animCurveTL -n "DELETE_NODE78_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperTpLf|malcolm1:ctlEyeShaperTpLf.translateY";
+createNode animCurveTL -n "DELETE_NODE78_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperTpLf|malcolm1:ctlEyeShaperTpLf.translateZ";
+createNode animCurveTU -n "DELETE_NODE78_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperTpLf|malcolm1:ctlEyeShaperTpLf.scaleX";
+createNode animCurveTU -n "DELETE_NODE78_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperTpLf|malcolm1:ctlEyeShaperTpLf.scaleY";
+createNode animCurveTU -n "DELETE_NODE78_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperTpLf|malcolm1:ctlEyeShaperTpLf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE78_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperTpLf|malcolm1:ctlEyeShaperTpLf.rotateX";
+createNode animCurveTA -n "DELETE_NODE78_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperTpLf|malcolm1:ctlEyeShaperTpLf.rotateY";
+createNode animCurveTA -n "DELETE_NODE78_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperTpLf|malcolm1:ctlEyeShaperTpLf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE79_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperBtLf|malcolm1:ctlEyeShaperBtLf.translateX";
+createNode animCurveTL -n "DELETE_NODE79_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperBtLf|malcolm1:ctlEyeShaperBtLf.translateY";
+createNode animCurveTL -n "DELETE_NODE79_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperBtLf|malcolm1:ctlEyeShaperBtLf.translateZ";
+createNode animCurveTU -n "DELETE_NODE79_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperBtLf|malcolm1:ctlEyeShaperBtLf.scaleX";
+createNode animCurveTU -n "DELETE_NODE79_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperBtLf|malcolm1:ctlEyeShaperBtLf.scaleY";
+createNode animCurveTU -n "DELETE_NODE79_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperBtLf|malcolm1:ctlEyeShaperBtLf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE79_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperBtLf|malcolm1:ctlEyeShaperBtLf.rotateX";
+createNode animCurveTA -n "DELETE_NODE79_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperBtLf|malcolm1:ctlEyeShaperBtLf.rotateY";
+createNode animCurveTA -n "DELETE_NODE79_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperBtLf|malcolm1:ctlEyeShaperBtLf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE80_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperTpRt|malcolm1:ctlEyeShaperTpRt.translateX";
+createNode animCurveTL -n "DELETE_NODE80_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperTpRt|malcolm1:ctlEyeShaperTpRt.translateY";
+createNode animCurveTL -n "DELETE_NODE80_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperTpRt|malcolm1:ctlEyeShaperTpRt.translateZ";
+createNode animCurveTU -n "DELETE_NODE80_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperTpRt|malcolm1:ctlEyeShaperTpRt.scaleX";
+createNode animCurveTU -n "DELETE_NODE80_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperTpRt|malcolm1:ctlEyeShaperTpRt.scaleY";
+createNode animCurveTU -n "DELETE_NODE80_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperTpRt|malcolm1:ctlEyeShaperTpRt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE80_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperTpRt|malcolm1:ctlEyeShaperTpRt.rotateX";
+createNode animCurveTA -n "DELETE_NODE80_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperTpRt|malcolm1:ctlEyeShaperTpRt.rotateY";
+createNode animCurveTA -n "DELETE_NODE80_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperTpRt|malcolm1:ctlEyeShaperTpRt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE81_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperBtRt|malcolm1:ctlEyeShaperBtRt.translateX";
+createNode animCurveTL -n "DELETE_NODE81_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperBtRt|malcolm1:ctlEyeShaperBtRt.translateY";
+createNode animCurveTL -n "DELETE_NODE81_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperBtRt|malcolm1:ctlEyeShaperBtRt.translateZ";
+createNode animCurveTU -n "DELETE_NODE81_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperBtRt|malcolm1:ctlEyeShaperBtRt.scaleX";
+createNode animCurveTU -n "DELETE_NODE81_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperBtRt|malcolm1:ctlEyeShaperBtRt.scaleY";
+createNode animCurveTU -n "DELETE_NODE81_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperBtRt|malcolm1:ctlEyeShaperBtRt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE81_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperBtRt|malcolm1:ctlEyeShaperBtRt.rotateX";
+createNode animCurveTA -n "DELETE_NODE81_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperBtRt|malcolm1:ctlEyeShaperBtRt.rotateY";
+createNode animCurveTA -n "DELETE_NODE81_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperBtRt|malcolm1:ctlEyeShaperBtRt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE82_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf|malcolm1:grpEar2Lf|malcolm1:ctlEar2Lf.translateX";
+createNode animCurveTL -n "DELETE_NODE82_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf|malcolm1:grpEar2Lf|malcolm1:ctlEar2Lf.translateY";
+createNode animCurveTL -n "DELETE_NODE82_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf|malcolm1:grpEar2Lf|malcolm1:ctlEar2Lf.translateZ";
+createNode animCurveTU -n "DELETE_NODE82_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf|malcolm1:grpEar2Lf|malcolm1:ctlEar2Lf.scaleX";
+createNode animCurveTU -n "DELETE_NODE82_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf|malcolm1:grpEar2Lf|malcolm1:ctlEar2Lf.scaleY";
+createNode animCurveTU -n "DELETE_NODE82_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf|malcolm1:grpEar2Lf|malcolm1:ctlEar2Lf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE82_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf|malcolm1:grpEar2Lf|malcolm1:ctlEar2Lf.rotateX";
+createNode animCurveTA -n "DELETE_NODE82_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf|malcolm1:grpEar2Lf|malcolm1:ctlEar2Lf.rotateY";
+createNode animCurveTA -n "DELETE_NODE82_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf|malcolm1:grpEar2Lf|malcolm1:ctlEar2Lf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE83_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf.translateX";
+createNode animCurveTL -n "DELETE_NODE83_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf.translateY";
+createNode animCurveTL -n "DELETE_NODE83_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf.translateZ";
+createNode animCurveTU -n "DELETE_NODE83_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf.scaleX";
+createNode animCurveTU -n "DELETE_NODE83_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf.scaleY";
+createNode animCurveTU -n "DELETE_NODE83_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf.scaleZ";
+createNode animCurveTA -n "DELETE_NODE83_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf.rotateX";
+createNode animCurveTA -n "DELETE_NODE83_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf.rotateY";
+createNode animCurveTA -n "DELETE_NODE83_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf.rotateZ";
+createNode animCurveTL -n "DELETE_NODE84_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt|malcolm1:grpEar2Rt|malcolm1:ctlEar2Rt.translateX";
+createNode animCurveTL -n "DELETE_NODE84_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt|malcolm1:grpEar2Rt|malcolm1:ctlEar2Rt.translateY";
+createNode animCurveTL -n "DELETE_NODE84_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt|malcolm1:grpEar2Rt|malcolm1:ctlEar2Rt.translateZ";
+createNode animCurveTU -n "DELETE_NODE84_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt|malcolm1:grpEar2Rt|malcolm1:ctlEar2Rt.scaleX";
+createNode animCurveTU -n "DELETE_NODE84_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt|malcolm1:grpEar2Rt|malcolm1:ctlEar2Rt.scaleY";
+createNode animCurveTU -n "DELETE_NODE84_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt|malcolm1:grpEar2Rt|malcolm1:ctlEar2Rt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE84_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt|malcolm1:grpEar2Rt|malcolm1:ctlEar2Rt.rotateX";
+createNode animCurveTA -n "DELETE_NODE84_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt|malcolm1:grpEar2Rt|malcolm1:ctlEar2Rt.rotateY";
+createNode animCurveTA -n "DELETE_NODE84_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt|malcolm1:grpEar2Rt|malcolm1:ctlEar2Rt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE85_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt.translateX";
+createNode animCurveTL -n "DELETE_NODE85_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt.translateY";
+createNode animCurveTL -n "DELETE_NODE85_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt.translateZ";
+createNode animCurveTU -n "DELETE_NODE85_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt.scaleX";
+createNode animCurveTU -n "DELETE_NODE85_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt.scaleY";
+createNode animCurveTU -n "DELETE_NODE85_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE85_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt.rotateX";
+createNode animCurveTA -n "DELETE_NODE85_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt.rotateY";
+createNode animCurveTA -n "DELETE_NODE85_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt.rotateZ";
+createNode animCurveTL -n "DELETE_NODE86_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal.translateX";
+createNode animCurveTL -n "DELETE_NODE86_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal.translateY";
+createNode animCurveTL -n "DELETE_NODE86_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal.translateZ";
+createNode animCurveTU -n "DELETE_NODE86_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal.scaleX";
+createNode animCurveTU -n "DELETE_NODE86_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal.scaleY";
+createNode animCurveTU -n "DELETE_NODE86_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal.scaleZ";
+createNode animCurveTA -n "DELETE_NODE86_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal.rotateX";
+createNode animCurveTA -n "DELETE_NODE86_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal.rotateY";
+createNode animCurveTA -n "DELETE_NODE86_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal.rotateZ";
+createNode animCurveTL -n "DELETE_NODE87_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead.translateX";
+createNode animCurveTL -n "DELETE_NODE87_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead.translateY";
+createNode animCurveTL -n "DELETE_NODE87_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead.translateZ";
+createNode animCurveTU -n "DELETE_NODE87_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead.scaleX";
+createNode animCurveTU -n "DELETE_NODE87_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead.scaleY";
+createNode animCurveTU -n "DELETE_NODE87_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead.scaleZ";
+createNode animCurveTA -n "DELETE_NODE87_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 -4.1213113705648654 10 -4.1213113705648654;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead.rotateX";
+createNode animCurveTA -n "DELETE_NODE87_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 5.5893874365085248 10 5.5893874365085248;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead.rotateY";
+createNode animCurveTA -n "DELETE_NODE87_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 4.4369908596991907 10 4.4369908596991907;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead.rotateZ";
+createNode animCurveTU -n "DELETE_NODE87_orientToPlacement";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 1 6 1 10 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead.orientToPlacement";
+createNode animCurveTL -n "DELETE_NODE88_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpHeadOrient|malcolm1:ctlHeadOrient.translateX";
+createNode animCurveTL -n "DELETE_NODE88_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpHeadOrient|malcolm1:ctlHeadOrient.translateY";
+createNode animCurveTL -n "DELETE_NODE88_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpHeadOrient|malcolm1:ctlHeadOrient.translateZ";
+createNode animCurveTU -n "DELETE_NODE88_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpHeadOrient|malcolm1:ctlHeadOrient.scaleX";
+createNode animCurveTU -n "DELETE_NODE88_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpHeadOrient|malcolm1:ctlHeadOrient.scaleY";
+createNode animCurveTU -n "DELETE_NODE88_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpHeadOrient|malcolm1:ctlHeadOrient.scaleZ";
+createNode animCurveTA -n "DELETE_NODE88_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpHeadOrient|malcolm1:ctlHeadOrient.rotateX";
+createNode animCurveTA -n "DELETE_NODE88_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpHeadOrient|malcolm1:ctlHeadOrient.rotateY";
+createNode animCurveTA -n "DELETE_NODE88_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpHeadOrient|malcolm1:ctlHeadOrient.rotateZ";
+createNode animCurveTU -n "DELETE_NODE89_md";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.md";
+createNode animCurveTU -n "DELETE_NODE89_funnel";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.funnel";
+createNode animCurveTL -n "DELETE_NODE89_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.translateX";
+createNode animCurveTL -n "DELETE_NODE89_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 -0.041725743879269937 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.translateY";
+createNode animCurveTL -n "DELETE_NODE89_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.translateZ";
+createNode animCurveTU -n "DELETE_NODE89_thicknessY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.thicknessY";
+createNode animCurveTU -n "DELETE_NODE89_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.scaleX";
+createNode animCurveTU -n "DELETE_NODE89_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.scaleY";
+createNode animCurveTU -n "DELETE_NODE89_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.scaleZ";
+createNode animCurveTA -n "DELETE_NODE89_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 1.2258616735674603 10 1.2258616735674603;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.rotateX";
+createNode animCurveTA -n "DELETE_NODE89_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.rotateY";
+createNode animCurveTA -n "DELETE_NODE89_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.rotateZ";
+createNode animCurveTU -n "DELETE_NODE89_peak";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.peak";
+createNode animCurveTU -n "DELETE_NODE89_press";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.press";
+createNode animCurveTU -n "DELETE_NODE89_puff";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.puff";
+createNode animCurveTU -n "DELETE_NODE89_thicknessZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.thicknessZ";
+createNode animCurveTL -n "DELETE_NODE90_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpMentalis|malcolm1:ctlMentalis.translateX";
+createNode animCurveTL -n "DELETE_NODE90_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpMentalis|malcolm1:ctlMentalis.translateY";
+createNode animCurveTL -n "DELETE_NODE90_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpMentalis|malcolm1:ctlMentalis.translateZ";
+createNode animCurveTU -n "DELETE_NODE90_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpMentalis|malcolm1:ctlMentalis.scaleX";
+createNode animCurveTU -n "DELETE_NODE90_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpMentalis|malcolm1:ctlMentalis.scaleY";
+createNode animCurveTU -n "DELETE_NODE90_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpMentalis|malcolm1:ctlMentalis.scaleZ";
+createNode animCurveTA -n "DELETE_NODE90_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpMentalis|malcolm1:ctlMentalis.rotateX";
+createNode animCurveTA -n "DELETE_NODE90_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpMentalis|malcolm1:ctlMentalis.rotateY";
+createNode animCurveTA -n "DELETE_NODE90_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpMentalis|malcolm1:ctlMentalis.rotateZ";
+createNode animCurveTL -n "DELETE_NODE91_translateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grp1Chin1|malcolm1:grpChin1|malcolm1:ctlChin1.translateX";
+createNode animCurveTL -n "DELETE_NODE91_translateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grp1Chin1|malcolm1:grpChin1|malcolm1:ctlChin1.translateY";
+createNode animCurveTL -n "DELETE_NODE91_translateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grp1Chin1|malcolm1:grpChin1|malcolm1:ctlChin1.translateZ";
+createNode animCurveTU -n "DELETE_NODE91_scaleX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grp1Chin1|malcolm1:grpChin1|malcolm1:ctlChin1.scaleX";
+createNode animCurveTU -n "DELETE_NODE91_scaleY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grp1Chin1|malcolm1:grpChin1|malcolm1:ctlChin1.scaleY";
+createNode animCurveTU -n "DELETE_NODE91_scaleZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 2 ".ktv[0:1]" 1 1 6 1;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grp1Chin1|malcolm1:grpChin1|malcolm1:ctlChin1.scaleZ";
+createNode animCurveTA -n "DELETE_NODE91_rotateX";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grp1Chin1|malcolm1:grpChin1|malcolm1:ctlChin1.rotateX";
+createNode animCurveTA -n "DELETE_NODE91_rotateY";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grp1Chin1|malcolm1:grpChin1|malcolm1:ctlChin1.rotateY";
+createNode animCurveTA -n "DELETE_NODE91_rotateZ";
+ addAttr -ci true -sn "fullname" -ln "fullname" -dt "string";
+ setAttr ".tan" 18;
+ setAttr ".wgt" no;
+ setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0;
+ setAttr ".pre" 4;
+ setAttr ".pst" 4;
+ setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grp1Chin1|malcolm1:grpChin1|malcolm1:ctlChin1.rotateZ";
+select -ne :time1;
+ setAttr ".o" 9;
+ setAttr ".unw" 9;
+select -ne :renderPartition;
+ setAttr -s 230 ".st";
+select -ne :initialShadingGroup;
+ setAttr ".ro" yes;
+select -ne :initialParticleSE;
+ setAttr ".ro" yes;
+select -ne :defaultShaderList1;
+ setAttr -s 218 ".s";
+select -ne :postProcessList1;
+ setAttr -s 2 ".p";
+select -ne :defaultRenderUtilityList1;
+ setAttr -s 120 ".u";
+select -ne :defaultRenderingList1;
+ setAttr -s 6 ".r";
+select -ne :renderGlobalsList1;
+select -ne :hardwareRenderGlobals;
+ setAttr ".ctrs" 256;
+ setAttr ".btrs" 512;
+select -ne :defaultHardwareRenderGlobals;
+ setAttr ".fn" -type "string" "im";
+ setAttr ".res" -type "string" "ntsc_4d 646 485 1.333";
+select -ne :characterPartition;
+select -ne :ikSystem;
+ setAttr -s 7 ".sol";
+select -ne :hyperGraphLayout;
+ setAttr -s 3 ".hyp";
+// End of animation.ma
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.anim/pose.dict b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.anim/pose.dict
new file mode 100644
index 0000000..fee0538
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.anim/pose.dict
@@ -0,0 +1 @@
+{u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', -4.1213113705648654), u'rotateY': (u'doubleAngle', 5.5893874365085248), u'rotateZ': (u'doubleAngle', 4.4369908596991907), u'orientToPlacement': (u'double', 1.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Lf|malcolm1:ctlTeethTp1Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf|malcolm1:grpEar2Lf|malcolm1:ctlEar2Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpHeadOrient|malcolm1:ctlHeadOrient': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf|malcolm1:eyeLidDrivenLf|malcolm1:ctlEyeLidLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:lipJointsSpacedRt_NeutralPose|malcolm1:lipJointsSpacedRt|malcolm1:grpLipTp2SpacedRt|malcolm1:grp2Driven1LipTp2Rt|malcolm1:grp1Driven1LipTp2Rt|malcolm1:ctlLipTp2Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grp1Chin1|malcolm1:grpChin1|malcolm1:ctlChin1': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt': {u'nasoCrease': (u'double', 0.0), u'cornerHeight': (u'double', 0.0), u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'cornerPinchIn': (u'double', 0.0), u'pucker': (u'double', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'disableAutoPucker': (u'double', 0.0), u'cornerPinchOt': (u'double', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnInLf|malcolm1:ctlLidCrnInLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperBtLf|malcolm1:ctlEyeShaperBtLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'puff': (u'double', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTpCtSpaced|malcolm1:grp2Driven1LipTpCt|malcolm1:grp1Driven1LipTpCt|malcolm1:ctlLipTpCt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpCt|malcolm1:ctlTeethTpCt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInRt|malcolm1:ctlBrowInRt': {u'translateX': (u'doubleLinear', 8.8817841970009802e-16), u'translateY': (u'doubleLinear', 0.88330452769852763), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnOtLf|malcolm1:ctlLidCrnOtLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtCt|malcolm1:ctlTeethBtCt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Rt|malcolm1:ctlTeethBtLower2Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinLf|malcolm1:grp3LipCornerSkinLf|malcolm1:grp2LipCornerSkinLf|malcolm1:ctlLipCornerSkinLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnTpSpacedLf|malcolm1:ctlLipCrnTpLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt|malcolm1:grpEar2Rt|malcolm1:ctlEar2Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnInRt|malcolm1:ctlLidCrnInRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdLf|malcolm1:ctlBrowMdLf': {u'translateX': (u'doubleLinear', 4.4408920985004368e-16), u'translateY': (u'doubleLinear', 0.88330452769852819), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Lf|malcolm1:ctlTeethBtLower2Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperTpLf|malcolm1:ctlEyeShaperTpLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Rt|malcolm1:ctlTeethBt2Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedLf|malcolm1:grp2Driven1LipBt2Lf|malcolm1:grp1Driven1LipBt2Lf|malcolm1:ctlLipBt2Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'noseBrowCrunch': (u'double', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBtCtSpaced|malcolm1:grp2Driven1LipBtCt|malcolm1:grp1Driven1LipBtCt|malcolm1:ctlLipBtCt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinRt|malcolm1:grp3LipCornerSkinRt|malcolm1:grp2LipCornerSkinRt|malcolm1:ctlLipCornerSkinRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp': {u'md': (u'double', 0.0), u'funnel': (u'double', 0.0), u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'thicknessY': (u'double', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 18.007232567490711), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'peak': (u'double', 0.0), u'press': (u'double', 0.0), u'puff': (u'double', 0.0), u'thicknessZ': (u'double', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnTpSpacedRt|malcolm1:ctlLipCrnTpRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Lf|malcolm1:ctlTeethTpUpper2Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedLf|malcolm1:ctlCheekTpOtLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpMentalis|malcolm1:ctlMentalis': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Rt|malcolm1:ctlTeethTp2Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'puff': (u'double', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'lidCheek': (u'double', 1.0), u'squint': (u'double', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf': {u'nasoCrease': (u'double', 0.0), u'cornerHeight': (u'double', 0.0), u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'cornerPinchIn': (u'double', 0.0), u'pucker': (u'double', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'disableAutoPucker': (u'double', 0.0), u'cornerPinchOt': (u'double', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperBtRt|malcolm1:ctlEyeShaperBtRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Rt|malcolm1:ctlTeethBt1Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Rt|malcolm1:ctlTeethTp1Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'lidCheek': (u'double', 1.0), u'squint': (u'double', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:lipBtDriven|malcolm1:ctlLipBt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedRt|malcolm1:grp2Driven1LipBt1Rt|malcolm1:grp1Driven1LipBt1Rt|malcolm1:ctlLipBt1Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedLf|malcolm1:grp2Driven1LipBt1Lf|malcolm1:grp1Driven1LipBt1Lf|malcolm1:ctlLipBt1Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'squint': (u'double', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt|malcolm1:eyeLidDrivenRt|malcolm1:ctlEyeLidRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipTpSkin1Driven|malcolm1:ctlLipTp': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtRt|malcolm1:ctlBrowOtRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseRt|malcolm1:ctlNoseRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedRt|malcolm1:grp2Driven1LipBt2Rt|malcolm1:grp1Driven1LipBt2Rt|malcolm1:ctlLipBt2Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt': {u'iris': (u'double', 0.0), u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'eyeShaperVis': (u'bool', False), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'aim': (u'double', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'eyeBulge': (u'double', 0.0), u'pupil': (u'double', 0.0), u'lidShaperVis': (u'bool', False), u'rotateX': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipTp2SpacedLf|malcolm1:grp2Driven1LipTp2Lf|malcolm1:grp1Driven1LipTp2Lf|malcolm1:ctlLipTp2Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInLf|malcolm1:ctlBrowInLf': {u'translateX': (u'doubleLinear', 8.8817841970009752e-16), u'translateY': (u'doubleLinear', 0.88330452769852741), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Lf|malcolm1:ctlTeethBt1Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdRt|malcolm1:ctlBrowMdRt': {u'translateX': (u'doubleLinear', 4.4408920985004368e-16), u'translateY': (u'doubleLinear', 0.88330452769852785), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnBtSpacedLf|malcolm1:ctlLipCrnBtLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'visibility': (u'bool', True), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'scaleZ': (u'double', 1.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4|malcolm1:grpTongue5|malcolm1:ctlTongue5': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'squint': (u'double', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp': {u'squetch': (u'double', 0.0), u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Rt|malcolm1:ctlTeethTpUpper2Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperTpRt|malcolm1:ctlEyeShaperTpRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnOtRt|malcolm1:ctlLidCrnOtRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnBtSpacedRt|malcolm1:ctlLipCrnBtRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedRt|malcolm1:grp2Driven1LipTp1Rt|malcolm1:grp1Driven1LipTp1Rt|malcolm1:ctlLipTp1Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedRt|malcolm1:ctlCheekTpOtRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Lf|malcolm1:ctlTeethBt2Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtLf|malcolm1:ctlBrowOtLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 0.89602022283079519), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 0.89602022283079519), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf': {u'iris': (u'double', 0.0), u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'eyeShaperVis': (u'bool', False), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'aim': (u'double', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'eyeBulge': (u'double', 0.0), u'pupil': (u'double', 0.0), u'lidShaperVis': (u'bool', False), u'rotateX': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedLf|malcolm1:grp2Driven1LipTp1Lf|malcolm1:grp1Driven1LipTp1Lf|malcolm1:ctlLipTp1Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt': {u'md': (u'double', 0.0), u'funnel': (u'double', 0.0), u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'thicknessY': (u'double', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 1.2258616735674603), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'peak': (u'double', 0.0), u'press': (u'double', 0.0), u'puff': (u'double', 0.0), u'thicknessZ': (u'double', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Lf|malcolm1:ctlTeethTp2Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseLf|malcolm1:ctlNoseLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw': {u'jawStretch': (u'double', 0.0), u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0033959318634735991), u'translateZ': (u'doubleLinear', 0.037225733300033453), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'lipsSeal': (u'double', 0.0), u'rotateX': (u'doubleAngle', -5.2124021846970194), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'lipSealHeight': (u'double', 0.0)}}
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.dict b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.dict
new file mode 100644
index 0000000..d3fafbd
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.dict
@@ -0,0 +1,34 @@
+{'srcSphere:sphere': {
+ 'rotateX': ('doubleAngle', 45.0),
+ 'testEnum': ('enum', 1),
+ 'translateX': ('doubleLinear', 0.0),
+ 'translateY': ('doubleLinear', 8.0),
+ 'translateZ': ('doubleLinear', -12.0),
+ 'rotateY': ('doubleAngle', 50.0),
+ 'testFloat': ('double', 0.66600000000000004),
+ 'testAnimated': ('double', 0.0),
+ 'scaleX': ('double', 0.25),
+ 'scaleY': ('double', 4.6600000000000001),
+ 'visibility': ('bool', True),
+ 'testString': ('string', u'Hello world'),
+ 'testVectorX': ('double', 0.20000000000000001),
+ 'testVectorY': ('double', 1.3999999999999999),
+ 'rotateZ': ('doubleAngle', 90.0),
+ 'testVectorZ': ('double', 2.6000000000000001),
+ 'scaleZ': ('double', 0.5),
+ 'testInteger': ('long', 5),
+ 'testBoolean': ('bool', True),
+ 'testConnect': ('double', 8.0)
+},
+'srcSphere:lockedNode': {
+ 'translateX': ('doubleLinear', 0.0),
+ 'translateY': ('doubleLinear', 5.0),
+ 'translateZ': ('doubleLinear', 0.0),
+ 'scaleX': ('double', 1.0),
+ 'scaleY': ('double', 1.0),
+ 'visibility': ('bool', True),
+ 'rotateX': ('doubleAngle', 0.0),
+ 'rotateY': ('doubleAngle', 0.0),
+ 'rotateZ': ('doubleAngle', 0.0),
+ 'scaleZ': ('double', 1.0)
+}}
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_pose.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_pose.ma
new file mode 100644
index 0000000..f57ec86
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_pose.ma
@@ -0,0 +1,269 @@
+//Maya ASCII 2012 scene
+//Name: test_pose_attributes.ma
+//Last modified: Sun, May 11, 2014 11:20:29 AM
+//Codeset: 1252
+file -rdi 1 -ns "srcSphere" -rfn "srcSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma";
+file -rdi 1 -ns "dstSphere" -rfn "dstSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma";
+file -r -ns "srcSphere" -dr 1 -rfn "srcSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma";
+file -r -ns "dstSphere" -dr 1 -rfn "dstSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma";
+requires maya "2011";
+currentUnit -l centimeter -a degree -t film;
+fileInfo "application" "maya";
+fileInfo "product" "Maya 2014";
+fileInfo "version" "2014 x64";
+fileInfo "cutIdentifier" "201303010241-864206";
+fileInfo "osv" "Microsoft Windows 7 Ultimate Edition, 64-bit Windows 7 Service Pack 1 (Build 7601)\n";
+createNode transform -s -n "persp";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" -28.491244113009635 26.169676127690515 68.655966560486604 ;
+ setAttr ".r" -type "double3" -16.538352729583153 -22.60000000001666 4.306379281917478e-016 ;
+createNode camera -s -n "perspShape" -p "persp";
+ setAttr -k off ".v" no;
+ setAttr ".fl" 34.999999999999993;
+ setAttr ".coi" 76.176692107312178;
+ setAttr ".imn" -type "string" "persp";
+ setAttr ".den" -type "string" "persp_depth";
+ setAttr ".man" -type "string" "persp_mask";
+ setAttr ".hc" -type "string" "viewSet -p %camera";
+createNode transform -s -n "top";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" 0 100.1 0 ;
+ setAttr ".r" -type "double3" -89.999999999999986 0 0 ;
+createNode camera -s -n "topShape" -p "top";
+ setAttr -k off ".v" no;
+ setAttr ".rnd" no;
+ setAttr ".coi" 100.1;
+ setAttr ".ow" 30;
+ setAttr ".imn" -type "string" "top";
+ setAttr ".den" -type "string" "top_depth";
+ setAttr ".man" -type "string" "top_mask";
+ setAttr ".hc" -type "string" "viewSet -t %camera";
+ setAttr ".o" yes;
+createNode transform -s -n "front";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" 2.0350096678112575 0.39361762628711539 100.1 ;
+createNode camera -s -n "frontShape" -p "front";
+ setAttr -k off ".v" no;
+ setAttr ".rnd" no;
+ setAttr ".coi" 100.1;
+ setAttr ".ow" 61.766282942468983;
+ setAttr ".imn" -type "string" "front";
+ setAttr ".den" -type "string" "front_depth";
+ setAttr ".man" -type "string" "front_mask";
+ setAttr ".hc" -type "string" "viewSet -f %camera";
+ setAttr ".o" yes;
+createNode transform -s -n "side";
+ setAttr ".v" no;
+ setAttr ".t" -type "double3" 100.1 0 0 ;
+ setAttr ".r" -type "double3" 0 89.999999999999986 0 ;
+createNode camera -s -n "sideShape" -p "side";
+ setAttr -k off ".v" no;
+ setAttr ".rnd" no;
+ setAttr ".coi" 100.1;
+ setAttr ".ow" 30;
+ setAttr ".imn" -type "string" "side";
+ setAttr ".den" -type "string" "side_depth";
+ setAttr ".man" -type "string" "side_mask";
+ setAttr ".hc" -type "string" "viewSet -s %camera";
+ setAttr ".o" yes;
+createNode lightLinker -s -n "lightLinker1";
+ setAttr -s 2 ".lnk";
+ setAttr -s 2 ".slnk";
+createNode displayLayerManager -n "layerManager";
+createNode displayLayer -n "defaultLayer";
+createNode renderLayerManager -n "renderLayerManager";
+createNode renderLayer -n "defaultRenderLayer";
+ setAttr ".g" yes;
+createNode script -n "uiConfigurationScriptNode";
+ setAttr ".b" -type "string" (
+ "// Maya Mel UI Configuration File.\n//\n// This script is machine generated. Edit at your own risk.\n//\n//\n\nglobal string $gMainPane;\nif (`paneLayout -exists $gMainPane`) {\n\n\tglobal int $gUseScenePanelConfig;\n\tint $useSceneConfig = $gUseScenePanelConfig;\n\tint $menusOkayInPanels = `optionVar -q allowMenusInPanels`;\tint $nVisPanes = `paneLayout -q -nvp $gMainPane`;\n\tint $nPanes = 0;\n\tstring $editorName;\n\tstring $panelName;\n\tstring $itemFilterName;\n\tstring $panelConfig;\n\n\t//\n\t// get current state of the UI\n\t//\n\tsceneUIReplacement -update $gMainPane;\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Top View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n"
+ + " -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n"
+ + " -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n"
+ + " -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels $panelName;\n"
+ + "\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n"
+ + " -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n"
+ + " -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Side View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels `;\n"
+ + "\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n"
+ + " -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n"
+ + " -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n"
+ + " $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n"
+ + " -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n"
+ + " -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Front View\")) `;\n"
+ + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n"
+ + " -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n"
+ + " -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n"
+ + " -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n"
+ + " -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n"
+ + " -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n"
+ + " modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Persp View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n"
+ + " -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n"
+ + " -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 0\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 0\n -hairSystems 0\n -follicles 0\n -nCloths 0\n -nParticles 0\n -nRigids 0\n -dynamicConstraints 0\n -locators 1\n -manipulators 1\n -pluginShapes 1\n"
+ + " -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 0\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n"
+ + " -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n"
+ + " -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 0\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 0\n -hairSystems 0\n -follicles 0\n -nCloths 0\n -nParticles 0\n -nRigids 0\n -dynamicConstraints 0\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n"
+ + " -strokes 1\n -motionTrails 1\n -clipGhosts 0\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"Outliner\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `outlinerPanel -unParent -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n outlinerEditor -e \n -docTag \"isolOutln_fromSeln\" \n -showShapes 1\n -showReferenceNodes 1\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n"
+ + " -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n"
+ + " -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -docTag \"isolOutln_fromSeln\" \n -showShapes 1\n -showReferenceNodes 1\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n"
+ + " -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n"
+ + " -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\tif ($useSceneConfig) {\n\t\toutlinerPanel -e -to $panelName;\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"graphEditor\" (localizedPanelLabel(\"Graph Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"graphEditor\" -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showReferenceNodes 0\n -showReferenceMembers 1\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 1\n"
+ + " -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 1\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n"
+ + " -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n -mapMotionTrails 1\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 1\n -displayInfinities 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -showResults \"off\" \n -showBufferCurves \"off\" \n -smoothness \"fine\" \n -resultSamples 1\n"
+ + " -resultScreenSamples 0\n -resultUpdate \"delayed\" \n -showUpstreamCurves 1\n -stackedCurves 0\n -stackedCurvesMin -1\n -stackedCurvesMax 1\n -stackedCurvesSpace 0.2\n -displayNormalized 0\n -preSelectionHighlight 0\n -constrainDrag 0\n -classicMode 1\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showReferenceNodes 0\n -showReferenceMembers 1\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 1\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n"
+ + " -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 1\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n"
+ + " -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n -mapMotionTrails 1\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 1\n -displayInfinities 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -showResults \"off\" \n -showBufferCurves \"off\" \n -smoothness \"fine\" \n -resultSamples 1\n -resultScreenSamples 0\n -resultUpdate \"delayed\" \n -showUpstreamCurves 1\n -stackedCurves 0\n"
+ + " -stackedCurvesMin -1\n -stackedCurvesMax 1\n -stackedCurvesSpace 0.2\n -displayNormalized 0\n -preSelectionHighlight 0\n -constrainDrag 0\n -classicMode 1\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dopeSheetPanel\" (localizedPanelLabel(\"Dope Sheet\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dopeSheetPanel\" -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n"
+ + " -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 0\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n"
+ + " -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 1\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -outliner \"dopeSheetPanel1OutlineEd\" \n -showSummary 1\n -showScene 0\n -hierarchyBelow 0\n -showTicks 0\n -selectionWindow 0 0 0 0 \n"
+ + " $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 0\n -showCompounds 1\n -showLeafs 1\n"
+ + " -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 1\n $editorName;\n"
+ + "\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -outliner \"dopeSheetPanel1OutlineEd\" \n -showSummary 1\n -showScene 0\n -hierarchyBelow 0\n -showTicks 0\n -selectionWindow 0 0 0 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"clipEditorPanel\" (localizedPanelLabel(\"Trax Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"clipEditorPanel\" -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n"
+ + " clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"integer\" \n -manageSequencer 0 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"integer\" \n -manageSequencer 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n"
+ + "\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"sequenceEditorPanel\" (localizedPanelLabel(\"Camera Sequencer\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"sequenceEditorPanel\" -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -manageSequencer 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n"
+ + " -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -manageSequencer 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperGraphPanel\" (localizedPanelLabel(\"Hypergraph Hierarchy\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"hyperGraphPanel\" -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n -orientation \"horiz\" \n -mergeConnections 1\n -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n"
+ + " -showExpressions 0\n -showConstraints 0\n -showConnectionFromSelected 0\n -showConnectionToSelected 0\n -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -imagePosition 0 0 \n -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n"
+ + " -orientation \"horiz\" \n -mergeConnections 1\n -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n -showExpressions 0\n -showConstraints 0\n -showConnectionFromSelected 0\n -showConnectionToSelected 0\n -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -imagePosition 0 0 \n -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n"
+ + "\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperShadePanel\" (localizedPanelLabel(\"Hypershade\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"hyperShadePanel\" -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"visorPanel\" (localizedPanelLabel(\"Visor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"visorPanel\" -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n"
+ + "\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"nodeEditorPanel\" (localizedPanelLabel(\"Node Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"nodeEditorPanel\" -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -defaultPinnedState 0\n -ignoreAssets 1\n -additiveGraphingMode 0\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -keyReleaseCommand \"nodeEdKeyReleaseCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n"
+ + " -island 0\n -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -syncedSelection 1\n -extendToShapes 1\n $editorName;;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -defaultPinnedState 0\n -ignoreAssets 1\n -additiveGraphingMode 0\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -keyReleaseCommand \"nodeEdKeyReleaseCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n"
+ + " -gridVisibility 1\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -island 0\n -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -syncedSelection 1\n -extendToShapes 1\n $editorName;;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"createNodePanel\" (localizedPanelLabel(\"Create Node\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"createNodePanel\" -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"polyTexturePlacementPanel\" (localizedPanelLabel(\"UV Texture Editor\")) `;\n"
+ + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"polyTexturePlacementPanel\" -l (localizedPanelLabel(\"UV Texture Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"UV Texture Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"renderWindowPanel\" (localizedPanelLabel(\"Render View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"renderWindowPanel\" -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"blendShapePanel\" (localizedPanelLabel(\"Blend Shape\")) `;\n"
+ + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\tblendShapePanel -unParent -l (localizedPanelLabel(\"Blend Shape\")) -mbv $menusOkayInPanels ;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tblendShapePanel -edit -l (localizedPanelLabel(\"Blend Shape\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynRelEdPanel\" (localizedPanelLabel(\"Dynamic Relationships\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dynRelEdPanel\" -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"relationshipPanel\" (localizedPanelLabel(\"Relationship Editor\")) `;\n"
+ + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"relationshipPanel\" -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"referenceEditorPanel\" (localizedPanelLabel(\"Reference Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"referenceEditorPanel\" -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"componentEditorPanel\" (localizedPanelLabel(\"Component Editor\")) `;\n"
+ + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"componentEditorPanel\" -l (localizedPanelLabel(\"Component Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Component Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynPaintScriptedPanelType\" (localizedPanelLabel(\"Paint Effects\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dynPaintScriptedPanelType\" -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"scriptEditorPanel\" (localizedPanelLabel(\"Script Editor\")) `;\n"
+ + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"scriptEditorPanel\" -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\tif ($useSceneConfig) {\n\t\tscriptedPanel -e -to $panelName;\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"Stereo\" (localizedPanelLabel(\"Stereo\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"Stereo\" -l (localizedPanelLabel(\"Stereo\")) -mbv $menusOkayInPanels `;\nstring $editorName = ($panelName+\"Editor\");\n stereoCameraView -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n"
+ + " -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 4 4 \n -bumpResolution 4 4 \n"
+ + " -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 0\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n"
+ + " -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -displayMode \"centerEye\" \n -viewColor 0 0 0 1 \n -useCustomBackground 1\n $editorName;\n stereoCameraView -e -viewSelected 0 $editorName;\n stereoCameraView -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Stereo\")) -mbv $menusOkayInPanels $panelName;\n"
+ + "string $editorName = ($panelName+\"Editor\");\n stereoCameraView -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n"
+ + " -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 4 4 \n -bumpResolution 4 4 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 0\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n"
+ + " -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -displayMode \"centerEye\" \n -viewColor 0 0 0 1 \n -useCustomBackground 1\n $editorName;\n stereoCameraView -e -viewSelected 0 $editorName;\n"
+ + " stereoCameraView -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\tif ($useSceneConfig) {\n string $configName = `getPanel -cwl (localizedPanelLabel(\"Current Layout\"))`;\n if (\"\" != $configName) {\n\t\t\tpanelConfiguration -edit -label (localizedPanelLabel(\"Current Layout\")) \n\t\t\t\t-defaultImage \"vacantCell.xpm\"\n\t\t\t\t-image \"\"\n\t\t\t\t-sc false\n\t\t\t\t-configString \"global string $gMainPane; paneLayout -e -cn \\\"single\\\" -ps 1 100 100 $gMainPane;\"\n\t\t\t\t-removeAllPanels\n\t\t\t\t-ap false\n\t\t\t\t\t(localizedPanelLabel(\"Persp View\")) \n\t\t\t\t\t\"modelPanel\"\n"
+ + "\t\t\t\t\t\"$panelName = `modelPanel -unParent -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels `;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"wireframe\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 1\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 8192\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -maxConstantTransparency 1\\n -rendererName \\\"base_OpenGL_Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 0\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -fluids 0\\n -hairSystems 0\\n -follicles 0\\n -nCloths 0\\n -nParticles 0\\n -nRigids 0\\n -dynamicConstraints 0\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 0\\n -greasePencils 1\\n -shadows 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n"
+ + "\t\t\t\t\t\"modelPanel -edit -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels $panelName;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"wireframe\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 1\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 8192\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -maxConstantTransparency 1\\n -rendererName \\\"base_OpenGL_Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 0\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -fluids 0\\n -hairSystems 0\\n -follicles 0\\n -nCloths 0\\n -nParticles 0\\n -nRigids 0\\n -dynamicConstraints 0\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 0\\n -greasePencils 1\\n -shadows 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n"
+ + "\t\t\t\t$configName;\n\n setNamedPanelLayout (localizedPanelLabel(\"Current Layout\"));\n }\n\n panelHistory -e -clear mainPanelHistory;\n setFocus `paneLayout -q -p1 $gMainPane`;\n sceneUIReplacement -deleteRemaining;\n sceneUIReplacement -clear;\n\t}\n\n\ngrid -spacing 5 -size 12 -divisions 5 -displayAxes yes -displayGridLines yes -displayDivisionLines yes -displayPerspectiveLabels no -displayOrthographicLabels no -displayAxesBold yes -perspectiveLabelPosition axis -orthographicLabelPosition edge;\nviewManip -drawCompass 1 -compassAngle 0 -frontParameters \"\" -homeParameters \"\" -selectionLockParameters \"\";\n}\n");
+ setAttr ".st" 3;
+createNode script -n "sceneConfigurationScriptNode";
+ setAttr ".b" -type "string" "playbackOptions -min 1 -max 24 -ast 1 -aet 48 ";
+ setAttr ".st" 6;
+createNode reference -n "srcSphereRN";
+ setAttr ".ed" -type "dataReferenceEdits"
+ "srcSphereRN"
+ "srcSphereRN" 0
+ "srcSphereRN" 14
+ 2 "|srcSphere:group|srcSphere:sphere" "translate" " -type \"double3\" 0 8 -12"
+
+ 2 "|srcSphere:group|srcSphere:sphere" "rotate" " -type \"double3\" 45 25 90"
+
+ 2 "|srcSphere:group|srcSphere:sphere" "scale" " -type \"double3\" 0.25 1.5 0.5"
+
+ 2 "|srcSphere:group|srcSphere:sphere" "testVector" " -k 1 -type \"double3\" 0.2 1.4 2.6"
+
+ 2 "|srcSphere:group|srcSphere:sphere" "testVector" " -k 1"
+ 2 "|srcSphere:group|srcSphere:sphere" "testVectorX" " -k 1"
+ 2 "|srcSphere:group|srcSphere:sphere" "testVectorY" " -k 1"
+ 2 "|srcSphere:group|srcSphere:sphere" "testVectorZ" " -k 1"
+ 2 "|srcSphere:group|srcSphere:sphere" "testColor" " -type \"float3\" 0.18 0.6 0.18"
+
+ 2 "|srcSphere:group|srcSphere:sphere" "testString" " -k 1 -type \"string\" \"Hello world\""
+
+ 2 "|srcSphere:group|srcSphere:sphere" "testEnum" " -k 1 1"
+ 2 "|srcSphere:group|srcSphere:sphere" "testFloat" " -k 1 0.666"
+ 2 "|srcSphere:group|srcSphere:sphere" "testBoolean" " -k 1 1"
+ 2 "|srcSphere:group|srcSphere:sphere" "testInteger" " -k 1 5";
+ setAttr ".ptag" -type "string" "";
+lockNode -l 1 ;
+createNode reference -n "dstSphereRN";
+ setAttr ".ed" -type "dataReferenceEdits"
+ "dstSphereRN"
+ "dstSphereRN" 0
+ "dstSphereRN" 13
+ 2 "|dstSphere:group|dstSphere:sphere" "visibility" " 1"
+ 2 "|dstSphere:group|dstSphere:sphere" "translate" " -type \"double3\" 0 0 0"
+
+ 2 "|dstSphere:group|dstSphere:sphere" "rotate" " -type \"double3\" 0 0 0"
+
+ 2 "|dstSphere:group|dstSphere:sphere" "scale" " -type \"double3\" 1 1 1"
+ 2 "|dstSphere:group|dstSphere:sphere" "testVector" " -k 1 -type \"double3\" 0 0 0"
+
+ 2 "|dstSphere:group|dstSphere:sphere" "testVector" " -k 1"
+ 2 "|dstSphere:group|dstSphere:sphere" "testVectorX" " -k 1"
+ 2 "|dstSphere:group|dstSphere:sphere" "testVectorY" " -k 1"
+ 2 "|dstSphere:group|dstSphere:sphere" "testVectorZ" " -k 1"
+ 2 "|dstSphere:group|dstSphere:sphere" "testEnum" " -k 1 2"
+ 2 "|dstSphere:group|dstSphere:sphere" "testFloat" " -k 1 0"
+ 2 "|dstSphere:group|dstSphere:sphere" "testBoolean" " -k 1 0"
+ 2 "|dstSphere:group|dstSphere:sphere" "testInteger" " -k 1 0";
+ setAttr ".ptag" -type "string" "";
+lockNode -l 1 ;
+select -ne :time1;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr ".o" 1;
+ setAttr ".unw" 1;
+select -ne :renderPartition;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -s 2 ".st";
+select -ne :initialShadingGroup;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -s 2 ".dsm";
+ setAttr -k on ".mwc";
+ setAttr ".ro" yes;
+select -ne :initialParticleSE;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -k on ".mwc";
+ setAttr ".ro" yes;
+select -ne :defaultShaderList1;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -s 2 ".s";
+select -ne :postProcessList1;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -s 2 ".p";
+select -ne :defaultRenderingList1;
+ setAttr -s 3 ".r";
+select -ne :renderGlobalsList1;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+select -ne :defaultResolution;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -av ".w";
+ setAttr -av ".h";
+ setAttr -k on ".pa" 1;
+ setAttr -k on ".al";
+ setAttr -av ".dar";
+ setAttr -k on ".ldar";
+ setAttr -k on ".off";
+ setAttr -k on ".fld";
+ setAttr -k on ".zsl";
+select -ne :defaultLightSet;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr -k on ".mwc";
+ setAttr ".ro" yes;
+select -ne :hardwareRenderGlobals;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr ".ctrs" 256;
+ setAttr ".btrs" 512;
+select -ne :hardwareRenderingGlobals;
+ setAttr ".otfna" -type "stringArray" 18 "NURBS Curves" "NURBS Surfaces" "Polygons" "Subdiv Surfaces" "Particles" "Fluids" "Image Planes" "UI:" "Lights" "Cameras" "Locators" "Joints" "IK Handles" "Deformers" "Motion Trails" "Components" "Misc. UI" "Ornaments" ;
+ setAttr ".otfva" -type "Int32Array" 18 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 ;
+select -ne :defaultHardwareRenderGlobals;
+ setAttr -k on ".cch";
+ setAttr -k on ".nds";
+ setAttr ".fn" -type "string" "im";
+ setAttr ".res" -type "string" "ntsc_4d 646 485 1.333";
+relationship "link" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message";
+relationship "link" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message";
+relationship "shadowLink" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message";
+relationship "shadowLink" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message";
+connectAttr "layerManager.dli[0]" "defaultLayer.id";
+connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid";
+connectAttr "defaultRenderLayer.msg" ":defaultRenderingList1.r" -na;
+// End of test_pose_attributes.ma
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_pose.pose b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_pose.pose
new file mode 100644
index 0000000..e11829e
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_pose.pose
@@ -0,0 +1,151 @@
+{
+ "metadata": {
+ "mayaSceneFile": "C:/Users/hovel/Dropbox/git/site-packages/studiolibrary/packages/mutils/tests/data/test_pose.ma",
+ "version": "1.0.0",
+ "user": "Hovel",
+ "mayaVersion": "2017",
+ "ctime": "1518341544"
+ }
+,
+ "objects": {
+ "srcSphere:offset": {
+ "attrs": {}
+ },
+ "srcSphere:sphere": {
+ "attrs": {
+ "testInteger": {
+ "type": "long",
+ "value": 5
+ },
+ "testProxy": {
+ "type": "double",
+ "value": 1.0
+ },
+ "scaleY": {
+ "type": "double",
+ "value": 1.5
+ },
+ "testLimit": {
+ "type": "double",
+ "value": 10.0
+ },
+ "testConnect": {
+ "type": "double",
+ "value": 8.0
+ },
+ "testEnum": {
+ "type": "enum",
+ "value": 1
+ },
+ "scaleX": {
+ "type": "double",
+ "value": 0.25
+ },
+ "testString": {
+ "type": "string",
+ "value": "Hello world"
+ },
+ "scaleZ": {
+ "type": "double",
+ "value": 0.5
+ },
+ "rotateX": {
+ "type": "doubleAngle",
+ "value": 45.0
+ },
+ "rotateY": {
+ "type": "doubleAngle",
+ "value": 25.0
+ },
+ "rotateZ": {
+ "type": "doubleAngle",
+ "value": 90.0
+ },
+ "translateX": {
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "translateY": {
+ "type": "doubleLinear",
+ "value": 8.0
+ },
+ "translateZ": {
+ "type": "doubleLinear",
+ "value": -12.0
+ },
+ "visibility": {
+ "type": "bool",
+ "value": true
+ },
+ "testFloat": {
+ "type": "double",
+ "value": 0.666
+ },
+ "testAnimated": {
+ "type": "double",
+ "value": 0.0
+ },
+ "testVectorX": {
+ "type": "double",
+ "value": 0.2
+ },
+ "testVectorY": {
+ "type": "double",
+ "value": 1.4
+ },
+ "testVectorZ": {
+ "type": "double",
+ "value": 2.6
+ },
+ "testBoolean": {
+ "type": "bool",
+ "value": true
+ }
+ }
+ },
+ "srcSphere:lockedNode": {
+ "attrs": {
+ "translateX": {
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "translateY": {
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "translateZ": {
+ "type": "doubleLinear",
+ "value": 0.0
+ },
+ "scaleX": {
+ "type": "double",
+ "value": 1.0
+ },
+ "scaleY": {
+ "type": "double",
+ "value": 1.0
+ },
+ "visibility": {
+ "type": "bool",
+ "value": true
+ },
+ "rotateX": {
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "rotateY": {
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "rotateZ": {
+ "type": "doubleAngle",
+ "value": 0.0
+ },
+ "scaleZ": {
+ "type": "double",
+ "value": 1.0
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_poseplugin.pose/.studiolibrary/record.dict b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_poseplugin.pose/.studiolibrary/record.dict
new file mode 100644
index 0000000..709c5a9
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_poseplugin.pose/.studiolibrary/record.dict
@@ -0,0 +1 @@
+{'owner': 'hovel', 'ctime': '1437148163', 'mtime': '1437148163'}
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/run.py b/2023/scripts/animation_tools/studiolibrary/mutils/tests/run.py
new file mode 100644
index 0000000..71cf724
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/run.py
@@ -0,0 +1,75 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+"""
+# Example:
+# RUN TEST SUITE
+import mutils.tests
+reload(mutils.tests)
+mutils.tests.run()
+"""
+import unittest
+
+import logging
+
+
+logging.basicConfig(
+ filemode='w',
+ level=logging.DEBUG,
+ format='%(levelname)s: %(funcName)s: %(message)s',
+)
+
+
+def testSuite():
+ """
+ Return a test suite containing all the tests.
+
+ :rtype: unittest.TestSuite
+ """
+ import test_pose
+ import test_anim
+ import test_match
+ import test_utils
+ import test_attribute
+ import test_mirrortable
+
+ suite = unittest.TestSuite()
+
+ s = unittest.makeSuite(test_pose.TestPose, 'test')
+ suite.addTest(s)
+
+ s = unittest.makeSuite(test_anim.TestAnim, 'test')
+ suite.addTest(s)
+
+ s = unittest.makeSuite(test_utils.TestUtils, 'test')
+ suite.addTest(s)
+
+ s = unittest.makeSuite(test_match.TestMatch, 'test')
+ suite.addTest(s)
+
+ s = unittest.makeSuite(test_attribute.TestAttribute, 'test')
+ suite.addTest(s)
+
+ s = unittest.makeSuite(test_mirrortable.TestMirrorTable, 'test')
+ suite.addTest(s)
+
+ return suite
+
+
+def run():
+ """
+ Call from within Maya to run all valid tests.
+ """
+ import mutils.animation
+ mutils.animation.FIX_SAVE_ANIM_REFERENCE_LOCKED_ERROR = True
+
+ tests = unittest.TextTestRunner()
+ tests.run(testSuite())
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_anim.py b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_anim.py
new file mode 100644
index 0000000..0d6f54a
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_anim.py
@@ -0,0 +1,125 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import unittest
+
+import mutils
+
+import test_base
+
+
+class TestAnim(test_base.TestBase):
+
+ def setUp(self):
+ """
+ """
+
+ def save(self, bakeConnected=False):
+ """
+ Test saving the animation to disc.
+ """
+ self.open()
+ anim = mutils.Animation.fromObjects(self.srcObjects)
+ anim.save(self.dstPath, bakeConnected=bakeConnected)
+
+ # def test_older_version(self):
+ # """
+ # Test animation parser for an older animation format
+ # """
+ # srcPath = self.dataPath("test_older_version.anim")
+ # a = mutils.Animation.fromPath(srcPath)
+
+ def test_load_replace_completely(self):
+ """
+ Test loading the animation with replace completely option.
+ """
+ self.srcPath = self.dataPath("test_anim.ma")
+ self.dstPath = self.dataPath("test_load_replace_completely.anim")
+ self.save()
+
+ anim = mutils.Animation.fromPath(self.dstPath)
+ anim.load(self.dstObjects)
+
+ self.assertEqualAnimation()
+
+ def test_bake_connected(self):
+ """
+ Test saving animation with the option bake connected.
+ """
+ srcPath = self.dataPath("test_bake_connected.ma")
+ dstPath = self.dataPath("test_bake_connected.anim")
+
+ srcObjects = [
+ "srcSphere:group",
+ "srcSphere:lockedNode",
+ "srcSphere:offset",
+ "srcSphere:sphere"
+ ]
+
+ dstObjects = [
+ "dstSphere:group",
+ "dstSphere:lockedNode",
+ "dstSphere:offset",
+ "dstSphere:sphere"
+ ]
+
+ self.open(path=srcPath)
+
+ anim = mutils.Animation.fromObjects(srcObjects)
+ anim.save(dstPath, bakeConnected=True)
+
+ anim = mutils.Animation.fromPath(dstPath)
+ anim.load(dstObjects)
+
+ self.assertEqualAnimation()
+
+ def test_load_replace(self):
+ """
+ Test loading the animation with the option Replace.
+ """
+ self.srcPath = self.dataPath("test_anim.ma")
+ self.dstPath = self.dataPath("test_load_replace.anim")
+ self.save()
+
+ anim = mutils.Animation.fromPath(self.dstPath)
+ anim.load(self.dstObjects, option=mutils.PasteOption.Replace, startFrame=5)
+
+ def test_load_insert(self):
+ """
+ Test loading the animation with the option Insert.
+ """
+ self.srcPath = self.dataPath("test_anim.ma")
+ self.dstPath = self.dataPath("test_load_insert.anim")
+ self.save()
+
+ anim = mutils.Animation.fromPath(self.dstPath)
+ anim.load(self.dstObjects, option=mutils.PasteOption.Insert, startFrame=5)
+
+
+def testSuite():
+ """
+ Return the test suite for the test case.
+
+ :rtype: unittest.TestSuite
+ """
+ suite = unittest.TestSuite()
+ s = unittest.makeSuite(TestAnim, 'test')
+ suite.addTest(s)
+ return suite
+
+
+def run():
+ """
+ Call from within Maya to run all valid tests.
+ """
+ tests = unittest.TextTestRunner()
+ tests.run(testSuite())
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_attribute.py b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_attribute.py
new file mode 100644
index 0000000..be3090d
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_attribute.py
@@ -0,0 +1,168 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+"""
+# Example:
+import mutils.tests.test_attribute
+reload(mutils.tests.test_attribute)
+mutils.tests.test_attribute.run()
+"""
+import os
+import unittest
+
+import maya.cmds
+
+import mutils
+
+
+class TestAttribute(unittest.TestCase):
+
+ def setUp(self):
+ """
+ Open an existing maya test scene for testing.
+ """
+ dirname = os.path.dirname(mutils.__file__)
+ dirname = os.path.join(dirname, "tests", "data")
+ path = os.path.join(dirname, "sphere.ma")
+
+ maya.cmds.file(
+ path,
+ open=True,
+ force=True,
+ ignoreVersion=True,
+ executeScriptNodes=False,
+ )
+
+ def test_attribute_limit(self):
+ """
+ Test the attribute limit when setting the attribute value.
+ """
+ range_ = (-100, 100)
+ maya.cmds.cutKey("sphere", cl=True, time=range_, f=range_, at="testLimit")
+
+ attr = mutils.Attribute("sphere", "testLimit")
+ attr.set(200)
+
+ value = maya.cmds.getAttr("sphere.testLimit")
+ assert value == 10, "Maximum attibute limit was ignored when setting the attribute value"
+
+ def test_attribute_limit2(self):
+ """
+ Test the maximum attribute limit when setting a keyframe.
+ """
+ attr = mutils.Attribute("sphere", "testLimit")
+ attr.setKeyframe(200)
+
+ value = maya.cmds.keyframe("sphere.testLimit", query=True, eval=True)[0]
+ assert value == 10, "Maximum attibute limit was ignored when setting animation keyframe"
+
+ def test_attribute_limit3(self):
+ """
+ Test the minimum attribute limit when setting a keyframe.
+ """
+ attr = mutils.Attribute("sphere", "testLimit")
+ attr.setKeyframe(-200)
+
+ value = maya.cmds.keyframe("sphere.testLimit", query=True, eval=True)[0]
+ assert value == -10, "Minimum attibute limit was ignored when setting animation keyframe"
+
+ def test_non_keyable(self):
+ """
+ Test if non-keyable attributes can be keyed.
+ """
+ range_ = (-100, 100)
+ maya.cmds.cutKey("sphere", cl=True, time=range_, f=range_, at="testNonKeyable")
+
+ attr = mutils.Attribute("sphere", "testNonKeyable")
+ attr.setKeyframe(200)
+
+ value = maya.cmds.keyframe("sphere.testNonKeyable", query=True, eval=True)
+ assert value is None, "Non keyable attribute was keyed"
+
+ def test_anim_curve(self):
+ """
+ Test if get anim curve returns the right value.
+ """
+ msg = "Incorrect anim curve was returned when using attr.animCurve "
+
+ attr = mutils.Attribute("sphere", "testFloat")
+ curve = attr.animCurve()
+ assert curve is None, msg + "1"
+
+ attr = mutils.Attribute("sphere", "testConnected")
+ curve = attr.animCurve()
+ assert curve is None, msg + "2"
+
+ attr = mutils.Attribute("sphere", "testAnimated")
+ curve = attr.animCurve()
+ assert curve == "sphere_testAnimated", msg + "3"
+
+ def test_set_anim_curve(self):
+ """
+ Test if set anim curve
+ """
+ msg = "No anim curve was set"
+
+ attr = mutils.Attribute("sphere", "testAnimated")
+ srcCurve = attr.animCurve()
+
+ attr = mutils.Attribute("sphere", "testFloat")
+ attr.setAnimCurve(srcCurve, time=(1, 15), option="replace")
+ curve = attr.animCurve()
+ assert curve is not None, msg
+
+ attr = mutils.Attribute("sphere", "testFloat")
+ attr.setAnimCurve(srcCurve, time=(15, 15), option="replaceCompletely")
+ curve = attr.animCurve()
+ assert curve is not None, msg
+
+ def test_set_static_keyframe(self):
+ """
+ Test set static keyframes
+ """
+ msg = "The inserted static keys have different values"
+
+ attr = mutils.Attribute("sphere", "testAnimated", cache=False)
+ attr.setStaticKeyframe(value=2, time=(4, 6), option="replace")
+
+ maya.cmds.currentTime(4)
+ value1 = attr.value()
+
+ maya.cmds.currentTime(6)
+ value2 = attr.value()
+
+ assert value1 == value2, msg
+
+
+def testSuite():
+ """
+ Return the test suite for the TestAttribute.
+
+ :rtype: unittest.TestSuite
+ """
+ suite = unittest.TestSuite()
+ s = unittest.makeSuite(TestAttribute, 'test')
+ suite.addTest(s)
+ return suite
+
+
+def run():
+ """
+ Call from within Maya to run all valid tests.
+
+ Example:
+
+ import mutils.tests.test_attribute
+ reload(mutils.tests.test_attribute)
+ mutils.tests.test_attribute.run()
+ """
+ tests = unittest.TextTestRunner()
+ tests.run(testSuite())
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_base.py b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_base.py
new file mode 100644
index 0000000..e807d2d
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_base.py
@@ -0,0 +1,143 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import os
+import unittest
+
+import maya.cmds
+
+import mutils
+
+
+TEST_DATA_DIR = os.path.join(os.path.dirname(mutils.__file__), "tests", "data")
+
+
+class TestBase(unittest.TestCase):
+
+ def __init__(self, *args):
+ """
+ :type args: list
+ """
+ unittest.TestCase.__init__(self, *args)
+
+ self.srcPath = os.path.join(TEST_DATA_DIR, "test_pose.ma")
+ self.dstPath = os.path.join(TEST_DATA_DIR, "test_pose.pose")
+
+ self.srcObjects = [
+ "srcSphere:lockedNode",
+ "srcSphere:offset",
+ "srcSphere:sphere",
+ ]
+
+ self.dstObjects = [
+ "dstSphere:lockedNode",
+ "dstSphere:offset",
+ "dstSphere:sphere",
+ ]
+
+ self.srcNamespaces = ["srcSphere"]
+ self.dstNamespaces = ["dstSphere"]
+
+ def dataDir(self):
+ """
+ Return the location on disc to the test data.
+
+ :rtype: str
+ """
+ return os.path.join(os.path.dirname(mutils.__file__), "tests", "data")
+
+ def dataPath(self, fileName):
+ """
+ Return data location with the given fileName.
+
+ :rtype: str
+ """
+ return os.path.join(self.dataDir(), fileName)
+
+ def open(self, path=None):
+ """
+ Open the specified file in Maya.
+
+ :type path: str | None
+ """
+ if path is None:
+ path = self.srcPath
+
+ maya.cmds.file(
+ path,
+ open=True,
+ force=True,
+ ignoreVersion=True,
+ executeScriptNodes=False,
+ )
+
+ def listAttr(self, srcObjects=None, dstObjects=None):
+ """
+ Return the source & destination attributes for the given objects.
+
+ :rtype: list[(mutils.Attribute, mutils.Attribute)]
+ """
+ attrs = []
+ srcObjects = srcObjects or self.srcObjects
+ dstObjects = dstObjects or self.dstObjects
+
+ for i, srcObj in enumerate(srcObjects):
+ srcObj = srcObjects[i]
+ dstObj = dstObjects[i]
+
+ srcAttrs = maya.cmds.listAttr(srcObj, keyable=True, unlocked=True, scalar=True) or []
+
+ for srcAttr in srcAttrs:
+ srcAttribute = mutils.Attribute(srcObj, srcAttr)
+ dstAttribute = mutils.Attribute(dstObj, srcAttr)
+ attrs.append((srcAttribute, dstAttribute))
+
+ return attrs
+
+ def assertEqualAnimation(
+ self,
+ srcObjects=None,
+ dstObjects=None,
+ ):
+ """
+ Test that the animation for the given objects is equal.
+
+ If the animation curves do not compare equal, the test will fail.
+
+ :type srcObjects: list[str] | None
+ :type dstObjects: list[str] | None
+ """
+ for frame in [1, 10, 24]:
+ maya.cmds.currentTime(frame)
+ self.assertEqualAttributeValues(srcObjects, dstObjects)
+
+ def assertEqualAttributeValues(
+ self,
+ srcObjects=None,
+ dstObjects=None,
+ ):
+ """
+ Test that the attribute values for the given objects are equal.
+
+ If the values do not compare equal, the test will fail.
+
+ :type srcObjects: list[str] | None
+ :type dstObjects: list[str] | None
+ """
+ for srcAttribute, dstAttribute in self.listAttr(srcObjects, dstObjects):
+
+ if not dstAttribute.exists():
+ continue
+
+ msg = "Attribute value is not equal! {0} != {1}"
+ msg = msg.format(srcAttribute.fullname(), dstAttribute.fullname())
+ self.assertEqual(srcAttribute.value(), dstAttribute.value(), msg)
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_match.py b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_match.py
new file mode 100644
index 0000000..1405071
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_match.py
@@ -0,0 +1,230 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import mutils
+import test_base
+
+
+class TestMatch(test_base.TestBase):
+
+ def setUp(self):
+ """
+ """
+ pass
+
+ def matchNames(self, expectedResult, srcObjects=None, dstObjects=None, dstNamespaces=None):
+ """
+ """
+ result = []
+ for srcNode, dstNode in mutils.matchNames(srcObjects, dstObjects=dstObjects, dstNamespaces=dstNamespaces):
+ result.append((srcNode.name(), dstNode.name()))
+
+ if result != expectedResult:
+ raise Exception("Result does not match the expected result: %s != %s" % (str(result), expectedResult))
+
+ def test_match0(self):
+ """
+ Test no matches
+ """
+ srcObjects = ["control2", "control1", "control3"]
+ dstObjects = ["control4", "control5", "control6"]
+ expectedResult = []
+ self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects)
+
+ def test_match1(self):
+ """
+ Test simple match
+ """
+ srcObjects = ["control2", "control1", "control3"]
+ dstObjects = ["control1", "control2", "control3"]
+ expectedResult = [("control2", "control2"),
+ ("control1", "control1"),
+ ("control3", "control3")]
+ self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects)
+
+ def test_match2(self):
+ """
+ """
+ srcObjects = ["control1"]
+ dstObjects = ["character1:control1", "character2:control1"]
+ expectedResult = [("control1", "character1:control1"),
+ ("control1", "character2:control1")]
+ self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects)
+
+ def test_match3(self):
+ """
+ """
+ srcObjects = ["control1"]
+ dstNamespaces = ["character1", "character2"]
+ expectedResult = [("control1", "character1:control1"),
+ ("control1", "character2:control1")]
+ self.matchNames(expectedResult, srcObjects=srcObjects, dstNamespaces=dstNamespaces)
+
+ def test_match4(self):
+ """
+ """
+ srcObjects = ["character1:control1"]
+ dstNamespaces = [""]
+ expectedResult = [("character1:control1", "control1")]
+ self.matchNames(expectedResult, srcObjects=srcObjects, dstNamespaces=dstNamespaces)
+
+ def test_match5(self):
+ """
+ Test namespace
+ Test short name
+ Test multiple namespaces in source objects
+ """
+ srcObjects = ["character1:control1", "character1:control2"]
+ dstNamespaces = ["character2"]
+ expectedResult = [("character1:control1", "character2:control1"),
+ ("character1:control2", "character2:control2")]
+ self.matchNames(expectedResult, srcObjects=srcObjects, dstNamespaces=dstNamespaces)
+
+ def test_match6(self):
+ """
+ Test namespace
+ Test long name
+ Test namespace in source objects
+ Test namespace that is not in source objects
+ """
+ srcObjects = ["character1:group1|character1:control1", "character1:group2|character1:control1"]
+ dstNamespaces = ["character2"]
+ expectedResult = [("character1:group1|character1:control1", "character2:group1|character2:control1"),
+ ("character1:group2|character1:control1", "character2:group2|character2:control1")]
+ self.matchNames(expectedResult, srcObjects=srcObjects, dstNamespaces=dstNamespaces)
+
+ def test_match7(self):
+ """
+ Test namespace
+ Test multiple namespaces in source objects
+ Test only one destination namespace
+ """
+ srcObjects = ["character1:control1", "character2:control1"]
+ dstNamespaces = ["character2"]
+ expectedResult = [("character2:control1", "character2:control1")]
+ self.matchNames(expectedResult, srcObjects=srcObjects, dstNamespaces=dstNamespaces)
+
+ def test_match8(self):
+ """
+ Test multiple namespaces in source objects
+ Test namespace that is not in source objects
+ """
+ srcObjects = ["character1:control1", "character2:control1"]
+ dstNamespaces = ["character3"]
+ expectedResult = [("character1:control1", "character3:control1")]
+ self.matchNames(expectedResult, srcObjects=srcObjects, dstNamespaces=dstNamespaces)
+
+ def test_match9(self):
+ """
+ """
+ srcObjects = ["character1:group1|character1:control1",
+ "character1:group1|character1:control2"]
+ dstObjects = ["group1|control1",
+ "group1|control2"]
+ expectedResult = [("character1:group1|character1:control1", "group1|control1"),
+ ("character1:group1|character1:control2", "group1|control2")]
+ self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects)
+
+ def test_match10(self):
+ """
+ WARNING: The expected result is a little strange.
+ It will always match source objects without a namespace first.
+ expectedResult = [("group1|control1", "character2:group1|character2:control1")]
+ NOT
+ expectedResult = [("character1:group1|character1:control1", "character2:group1|character2:control1")]
+ """
+ srcObjects = ["character1:group1|character1:control1",
+ "group1|control1"]
+ dstNamespaces = ["character2"]
+ expectedResult = [("group1|control1", "character2:group1|character2:control1")]
+ self.matchNames(expectedResult, srcObjects=srcObjects, dstNamespaces=dstNamespaces)
+
+ def test_match11(self):
+ """
+ Match long name to short name.
+ """
+ srcObjects = ["|grpEyeAllLf|grpLidTpLf|ctlLidTpLf"]
+ dstObjects = ["ctlLidTpLf"]
+
+ expectedResult = [("|grpEyeAllLf|grpLidTpLf|ctlLidTpLf", "ctlLidTpLf")]
+ self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects)
+
+ def test_match12(self):
+ """
+ Match short name to long name.
+ """
+ srcObjects = ["ctlLidTpLf"]
+ dstObjects = ["|grpEyeAllLf|grpLidTpLf|ctlLidTpLf"]
+
+ expectedResult = [("ctlLidTpLf", "|grpEyeAllLf|grpLidTpLf|ctlLidTpLf")]
+ self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects)
+
+ def test_match13(self):
+ """
+ Match short name to long name with namespace.
+ """
+ srcObjects = ["ctlLidTpLf"]
+ dstObjects = ["|malcolm:grpEyeAllLf|malcolm:grpLidTpLf|malcolm:ctlLidTpLf"]
+
+ expectedResult = [("ctlLidTpLf", "|malcolm:grpEyeAllLf|malcolm:grpLidTpLf|malcolm:ctlLidTpLf")]
+ self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects)
+
+ def test_match14(self):
+ """
+ Match long name to short name with namespace.
+ """
+ srcObjects = ["|malcolm:grpEyeAllLf|malcolm:grpLidTpLf|malcolm:ctlLidTpLf"]
+ dstObjects = ["ctlLidTpLf"]
+
+ expectedResult = [("|malcolm:grpEyeAllLf|malcolm:grpLidTpLf|malcolm:ctlLidTpLf", "ctlLidTpLf")]
+ self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects)
+
+ def test_match15(self):
+ """
+ Testing multiple source namespace to only one destination namespace. They should not merge.
+ """
+ srcObjects = ["character1:group1|character1:control1",
+ "character2:group1|character2:control2"]
+ dstObjects = ["group1|control1",
+ "group1|control2"]
+ expectedResult = [("character1:group1|character1:control1", "group1|control1")]
+ self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects)
+
+ def test_match16(self):
+ """
+ Testing multiple source namespace and destination namespaces
+ """
+ srcObjects = ["character1:group1|character1:control1",
+ "character2:group1|character2:control1",
+ "character3:group1|character3:control1"]
+ dstObjects = ["character3:group1|character3:control1",
+ "character1:group1|character1:control1",
+ "character2:group1|character2:control1"]
+ expectedResult = [('character1:group1|character1:control1', 'character1:group1|character1:control1'),
+ ('character3:group1|character3:control1', 'character3:group1|character3:control1'),
+ ('character2:group1|character2:control1', 'character2:group1|character2:control1')]
+ self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects)
+
+ def test_match17(self):
+ """
+ Testing multiple source namespace and destination namespaces.
+ """
+ srcObjects = ["character1:group1|character1:control1",
+ "group1|control1",
+ "character3:group1|character3:control1"]
+ dstObjects = ["character3:group1|character3:control1",
+ "character1:group1|character1:control1",
+ "group1|control1"]
+ expectedResult = [('group1|control1', 'group1|control1'),
+ ('character1:group1|character1:control1', 'character1:group1|character1:control1'),
+ ('character3:group1|character3:control1', 'character3:group1|character3:control1')]
+ self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects)
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_mirrortable.py b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_mirrortable.py
new file mode 100644
index 0000000..f7ab2fd
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_mirrortable.py
@@ -0,0 +1,238 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import unittest
+
+from mutils.mirrortable import MirrorTable
+
+
+class TestMirrorTable(unittest.TestCase):
+
+ def test_find_left_side(self):
+ """
+ Test the clamp range command
+ """
+ msg = "Cannot find the left side from the given objects"
+
+ objects = ["Character3_Ctrl_LeftForeArm"]
+ assert "Left" == MirrorTable.findLeftSide(objects), msg
+
+ objects = ["r_cool_ik", "l_arm_cool_l"]
+ assert "l_*" == MirrorTable.findLeftSide(objects), msg
+
+ objects = ["r_cool_ik", "Character:l_arm_cool_ik"]
+ assert "l_*" == MirrorTable.findLeftSide(objects), msg
+
+ objects = ["r_cool_ik", "Group|l_arm_cool_ik"]
+ assert "l_*" == MirrorTable.findLeftSide(objects), msg
+
+ objects = ["r_cool_ik", "Group|arm_cool_l"]
+ assert "*_l" == MirrorTable.findLeftSide(objects), msg
+
+ objects = ["leftArm1_ArmCon"]
+ assert "left*" == MirrorTable.findLeftSide(objects), msg
+
+ objects = ["LLegCON", "LhandCON"]
+ assert "L*" == MirrorTable.findLeftSide(objects), msg
+
+ objects = ["r_cool_ik", "Group|left_arm_cool_ik"]
+ assert "left*" == MirrorTable.findLeftSide(objects), msg
+
+ objects = ["r_cool_ik", "Group|ctlHandLf"]
+ assert "*Lf" == MirrorTable.findLeftSide(objects), msg
+
+ objects = ["r_cool_ik", "malcolm:ctlArmIkLf"]
+ assert "*Lf" == MirrorTable.findLeftSide(objects), msg
+
+ objects = ["r_cool_ik", "IKExtraLegFront_L|IKLegFront_L"]
+ assert "*_L" == MirrorTable.findLeftSide(objects), msg
+
+ def test_find_right_side(self):
+ """
+ Test the clamp range command
+ """
+ msg = "Cannot find the right side from the given objects"
+
+ objects = ["Character3_Ctrl_RightForeArm"]
+ assert "Right" == MirrorTable.findRightSide(objects), msg
+
+ objects = ["l_car_ik", "r_arm_car_r"]
+ assert "r_*" == MirrorTable.findRightSide(objects), msg
+
+ objects = ["l_car_ik", "Character:r_arm_car_r"]
+ assert "r_*" == MirrorTable.findRightSide(objects), msg
+
+ objects = ["l_car_ik", "Group|r_arm_car_r"]
+ assert "r_*" == MirrorTable.findRightSide(objects), msg
+
+ objects = ["l_car_ik", "arm_car_r"]
+ assert "*_r" == MirrorTable.findRightSide(objects), msg
+
+ objects = ["l_car_ik", "Group|right_arm_car_ik"]
+ assert "right*" == MirrorTable.findRightSide(objects), msg
+
+ objects = ["CHR1:RIG:RLegCON", "CHR1:RIG:RhandCON"]
+ assert "R*" == MirrorTable.findRightSide(objects), msg
+
+ objects = ["RLegCON", "RhandCON"]
+ assert "R*" == MirrorTable.findRightSide(objects), msg
+
+ objects = ["l_car_ik", "Group|ctlHandRt"]
+ assert "*Rt" == MirrorTable.findRightSide(objects), msg
+
+ objects = ["l_car_ik", "malcolm:ctlArmIkRt"]
+ assert "*Rt" == MirrorTable.findRightSide(objects), msg
+
+ objects = ["l_car_ik", "IKExtraLegFront_R|IKLegFront_R"]
+ assert "*_R" == MirrorTable.findRightSide(objects), msg
+
+ objects = ["Rig_v01_ref:Rig_v01:leftArm1_UpperArmControl"]
+ assert "" == MirrorTable.findRightSide(objects), msg
+
+ def test_match_side(self):
+
+ msg = "Incorrect result from match side"
+
+ result = MirrorTable.matchSide("ctlArmIkRt", "*Rt")
+ assert result is True, msg
+
+ result = MirrorTable.matchSide("ctlArmIkRt", "Rt")
+ assert result is True, msg
+
+ result = MirrorTable.matchSide("CHR1:RIG:LRollCON", "L*")
+ assert result is True, msg
+
+ # This is no longer supported!
+ # result = MirrorTable.matchSide("CHR1:RIG:LRollCON", "RIG:L*")
+ # assert result is True, msg
+
+ result = MirrorTable.matchSide("Group|right_arm_car_ik", "right*")
+ assert result is True, msg
+
+ result = MirrorTable.matchSide("Group|IKLegFront_R", "*_R")
+ assert result is True, msg
+
+ def test_mirror_object(self):
+
+ msg = "Incorrect mirror name for object"
+
+ result = MirrorTable._mirrorObject("malcolm:ctlArmIkRt", "Rt", "Lf")
+ assert "malcolm:ctlArmIkLf" == result, msg
+
+ result = MirrorTable._mirrorObject("malcolm:ctlArmIkRt", "*Rt", "*Lf")
+ assert "malcolm:ctlArmIkLf" == result, msg
+
+ result = MirrorTable._mirrorObject("IKLegFront_R", "*_R", "*_L")
+ assert "IKLegFront_L" == result, msg
+
+ result = MirrorTable._mirrorObject("CHR1:RIG:RLegCON", "R*", "L*")
+ assert "CHR1:RIG:LLegCON" == result, msg
+
+ result = MirrorTable._mirrorObject("CHR1:RIG:RRollCON", "R*", "L*")
+ assert "CHR1:RIG:LRollCON" == result, msg
+
+ result = MirrorTable._mirrorObject("leftArm1_ArmCon", "left*", "right*")
+ assert "rightArm1_ArmCon" == result, msg
+
+ result = MirrorTable._mirrorObject("Rig:RArm1_UpperArmControl", "R*", "L*")
+ assert "Rig:LArm1_UpperArmControl" == result, msg
+
+ result = MirrorTable._mirrorObject("Group|Ch1:RIG:Offset|Ch1:RIG:RRoll", "R*", "L*")
+ assert "Group|Ch1:RIG:Offset|Ch1:RIG:LRoll" == result, msg
+
+ # This is no longer supported!
+ # result = MirrorTable._mirrorObject("Group|Ch1:RIG:RExtra|Ch1:RIG:RRoll", "RIG:R", "RIG:L")
+ # assert "Group|Ch1:RIG:LExtra|Ch1:RIG:LRoll" == result, msg
+
+ result = MirrorTable._mirrorObject("Group|Ch1:RIG:RExtra|Ch1:RIG:RRoll", "R*", "L*")
+ assert "Group|Ch1:RIG:LExtra|Ch1:RIG:LRoll" == result, msg
+
+ result = MirrorTable._mirrorObject("hand_R0_ctl", "_R", "_L")
+ assert "hand_L0_ctl" == result, msg
+
+ result = MirrorTable._mirrorObject("Lyle_R001:hand_R0_ctl", "_R", "_L")
+ assert "Lyle_R001:hand_L0_ctl" == result, msg
+
+ result = MirrorTable._mirrorObject("Lyle_R001:other_R0_ctl|Lyle_R001:hand_R0_ctl", "_R", "_L")
+ assert "Lyle_R001:other_L0_ctl|Lyle_R001:hand_L0_ctl" == result, msg
+
+ result = MirrorTable._mirrorObject("Character1:LfootRoll", "L*", "R*")
+ assert "Character1:RfootRoll" == result, msg
+
+ result = MirrorTable._mirrorObject("Group|LyleCharacter1:LfootRollExtra|LyleCharacter1:LfootRoll", "R*", "L*")
+ assert "Group|LyleCharacter1:RfootRollExtra|LyleCharacter1:RfootRoll" == result, msg
+
+ result = MirrorTable._mirrorObject("Character3_Ctrl_RightForeArm", "Right", "Left")
+ assert "Character3_Ctrl_LeftForeArm" == result, msg
+
+ result = MirrorTable._mirrorObject("r_arm_car_r", "r_*", "l_*")
+ assert "l_arm_car_r" == result, msg
+
+ result = MirrorTable._mirrorObject("Character:r_arm_car_r", "r_*", "l_*")
+ assert "Character:l_arm_car_r" == result, msg
+
+ result = MirrorTable._mirrorObject("Group|r_arm_car_r", "r_*", "l_*")
+ assert "Group|l_arm_car_r" == result, msg
+
+ result = MirrorTable._mirrorObject("arm_car_r", "*_r", "*_l")
+ assert "arm_car_l" == result, msg
+
+ result = MirrorTable._mirrorObject("Group|right_arm_car_ik", "right*", "left*")
+ assert "Group|left_arm_car_ik" == result, msg
+
+ result = MirrorTable._mirrorObject("CHR1:RIG:RLegCON", "R*", "L*")
+ assert "CHR1:RIG:LLegCON" == result, msg
+
+ result = MirrorTable._mirrorObject("RhandCON", "R*", "L*")
+ assert "LhandCON" == result, msg
+
+ result = MirrorTable._mirrorObject("Group|ctlHandRt", "*Rt", "*Lt")
+ assert "Group|ctlHandLt" == result, msg
+
+ result = MirrorTable._mirrorObject("malcolm:ctlArmIkRt", "*Rt", "*Lt")
+ assert "malcolm:ctlArmIkLt" == result, msg
+
+ result = MirrorTable._mirrorObject("IKExtraLegFront_R|IKLegFront_R", "*_R", "*_L")
+ assert "IKExtraLegFront_L|IKLegFront_L" == result, msg
+
+ result = MirrorTable._mirrorObject("Rig_v01_ref:Rig_v01:leftArm1_UpperArmControl", "_R", "_L")
+ assert None == result, msg
+
+
+def testSuite():
+ """
+ Return the test suite for this module.
+
+ :rtype: unittest.TestSuite
+ """
+ suite = unittest.TestSuite()
+ s = unittest.makeSuite(TestMirrorTable, 'test')
+ suite.addTest(s)
+ return suite
+
+
+def run():
+ """
+ Call from within Maya to run all valid tests.
+
+ Example:
+
+ import mutils.tests.test_attribute
+ reload(mutils.tests.test_attribute)
+ mutils.tests.test_attribute.run()
+ """
+ tests = unittest.TextTestRunner()
+ tests.run(testSuite())
+
+
+if __name__ == "__main__":
+ run()
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_pose.py b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_pose.py
new file mode 100644
index 0000000..3919b76
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_pose.py
@@ -0,0 +1,157 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+"""
+# Example:
+import mutils.tests.test_pose
+reload(mutils.tests.test_pose)
+mutils.tests.test_pose.run()
+"""
+import unittest
+
+import maya.cmds
+
+import mutils
+import test_base
+
+
+class TestPose(test_base.TestBase):
+
+ def setUp(self):
+ """
+ """
+ self.srcPath = self.dataPath("test_pose.ma")
+ self.dstPath = self.dataPath("test_pose.pose")
+
+ def test_save(self):
+ """
+ Test saving a pose to disc.
+ """
+ self.open()
+ pose = mutils.Pose.fromObjects(self.srcObjects)
+ pose.save(self.dstPath)
+
+ def test_load(self):
+ """
+ Test load the pose from disc.
+ """
+ self.open()
+ pose = mutils.Pose.fromPath(self.dstPath)
+ pose.load(self.dstObjects)
+ self.assertEqualAttributeValues()
+
+ def test_older_version(self):
+ """
+ Test parsing an older pose format
+ """
+ srcPath = self.dataPath("test_older_version.dict")
+
+ pose = mutils.Pose.fromPath(srcPath)
+ print(pose.objects())
+
+ def test_non_unique_names(self):
+ """
+ Test loading a pose to objects that do not have unique names.
+ """
+ srcPath = self.dataPath("test_non_unique_names.ma")
+ dstPath = self.dataPath("test_non_unique_names.pose")
+
+ srcObjects = [
+ "srcSphere:offset",
+ "srcSphere:lockedNode",
+ "srcSphere:sphere",
+ ]
+
+ dstObjects = [
+ 'group|offset',
+ 'group|offset|lockedNode',
+ 'group|offset|lockedNode|sphere',
+ ]
+
+ self.open(path=srcPath)
+
+ pose = mutils.Pose.fromObjects(srcObjects)
+ pose.save(dstPath)
+
+ pose = mutils.Pose.fromPath(dstPath)
+ pose.load(dstObjects)
+
+ self.assertEqualAttributeValues(srcObjects, dstObjects)
+
+ def test_blend(self):
+ """
+ Test pose blending for float values when loading a pose.
+ """
+ self.open()
+
+ for blend in [10, 30, 70, 90]:
+ dstObjects = {}
+ for srcAttribute, dstAttribute in self.listAttr():
+ if srcAttribute.type == "float":
+ values = (srcAttribute.value(), dstAttribute.value())
+ dstObjects[dstAttribute.fullname()] = values
+
+ pose = mutils.Pose.fromPath(self.dstPath)
+ pose.load(self.dstObjects, blend=blend)
+
+ for dstFullname in dstObjects.keys():
+ srcValue, dstValue = dstObjects[dstFullname]
+
+ value = (srcValue - dstValue) * (blend/100.00)
+ value = dstValue + value
+
+ dstValue = maya.cmds.getAttr(dstFullname)
+
+ msg = 'Incorrect value for {0} {1} != {2}'
+ msg = msg.format(dstFullname, value, dstValue)
+ self.assertEqual(value, maya.cmds.getAttr(dstFullname), msg)
+
+ def test_select(self):
+ """
+ Test selecting the controls from the pose.
+ """
+ self.open()
+
+ pose = mutils.Pose.fromPath(self.dstPath)
+ pose.select(namespaces=self.dstNamespaces)
+
+ selection = maya.cmds.ls(selection=True)
+ for dstName in self.dstObjects:
+ msg = "Did not select {0}".format(dstName)
+ self.assertIn(dstName, selection, msg)
+
+ def test_count(self):
+ """
+ Test the object count within in pose.
+ """
+ self.open()
+ pose = mutils.Pose.fromPath(self.dstPath)
+ self.assertEqual(pose.objectCount(), len(self.srcObjects))
+
+
+def testSuite():
+ """
+ Return the test suite for the test case.
+
+ :rtype: unittest.TestSuite
+ """
+ suite = unittest.TestSuite()
+ s = unittest.makeSuite(TestPose, 'test')
+ suite.addTest(s)
+ return suite
+
+
+def run():
+ """
+ Call from within Maya to run all valid tests.
+ """
+ tests = unittest.TextTestRunner()
+ tests.run(testSuite())
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_utils.py b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_utils.py
new file mode 100644
index 0000000..2498c7c
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_utils.py
@@ -0,0 +1,72 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import unittest
+
+import mutils.animation
+
+
+class TestUtils(unittest.TestCase):
+
+ def test_clamp_range(self):
+ """
+ Test the clamp range command
+ """
+ msg = "Incorrect clamp range"
+
+ # Test clamp range on both min and max
+ clampRange = mutils.animation.clampRange((15, 35), (20, 30))
+ assert (20, 30) == clampRange, msg
+
+ # Test clamp range on min time
+ clampRange = mutils.animation.clampRange((10, 25), (20, 30))
+ assert (20, 25) == clampRange, msg
+
+ # Test clamp range on man time
+ clampRange = mutils.animation.clampRange((25, 40), (20, 30))
+ assert (25, 30) == clampRange, msg
+
+ # Test min out of bounds error
+ def test_exception():
+ clampRange = mutils.animation.clampRange((5, 15), (20, 30))
+ self.assertRaises(mutils.animation.OutOfBoundsError, test_exception)
+
+ # Test max out of bounds error
+ def test_exception():
+ clampRange = mutils.animation.clampRange((65, 95), (20, 30))
+ self.assertRaises(mutils.animation.OutOfBoundsError, test_exception)
+
+
+def testSuite():
+ """
+ Return the test suite for this module.
+
+ :rtype: unittest.TestSuite
+ """
+ suite = unittest.TestSuite()
+ s = unittest.makeSuite(TestUtils, 'test')
+ suite.addTest(s)
+ return suite
+
+
+def run():
+ """
+ Call from within Maya to run all valid tests.
+
+ Example:
+
+ import mutils.tests.test_attribute
+ reload(mutils.tests.test_attribute)
+ mutils.tests.test_attribute.run()
+ """
+ tests = unittest.TextTestRunner()
+ tests.run(testSuite())
diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/transferobject.py b/2023/scripts/animation_tools/studiolibrary/mutils/transferobject.py
new file mode 100644
index 0000000..a849340
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/mutils/transferobject.py
@@ -0,0 +1,403 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+"""
+Base object for saving poses, animation, selection sets and mirror tables.
+
+Example:
+ import mutils
+
+ t = mutils.TransferObject.fromPath("/tmp/pose.json")
+ t = mutils.TransferObject.fromObjects(["object1", "object2"])
+
+ t.load(selection=True)
+ t.load(objects=["obj1", "obj2"])
+ t.load(namespaces=["namespace1", "namespace2"])
+
+ t.save("/tmp/pose.json")
+ t.read("/tmp/pose.json")
+"""
+import os
+import abc
+import json
+import time
+import locale
+import getpass
+import logging
+
+from studiovendor import six
+
+import mutils
+
+try:
+ import maya.cmds
+except Exception:
+ import traceback
+ traceback.print_exc()
+
+
+logger = logging.getLogger(__name__)
+
+
+class TransferObject(object):
+
+ @classmethod
+ def fromPath(cls, path):
+ """
+ Return a new transfer instance for the given path.
+
+ :type path: str
+ :rtype: TransferObject
+ """
+ t = cls()
+ t.setPath(path)
+ t.read()
+ return t
+
+ @classmethod
+ def fromObjects(cls, objects, **kwargs):
+ """
+ Return a new transfer instance for the given objects.
+
+ :type objects: list[str]
+ :rtype: TransferObject
+ """
+ t = cls(**kwargs)
+ for obj in objects:
+ t.add(obj)
+ return t
+
+ @staticmethod
+ def readJson(path):
+ """
+ Read the given json path
+
+ :type path: str
+ :rtype: dict
+ """
+ with open(path, "r") as f:
+ data = f.read() or "{}"
+
+ data = json.loads(data)
+
+ return data
+
+ @staticmethod
+ def readList(path):
+ """
+ Legacy method for reading older .list file type.
+
+ :rtype: dict
+ """
+ with open(path, "r") as f:
+ data = f.read()
+
+ data = eval(data, {})
+ result = {}
+ for obj in data:
+ result.setdefault(obj, {})
+
+ return {"objects": result}
+
+ @staticmethod
+ def readDict(path):
+ """
+ Legacy method for reading older .dict file type.
+
+ :rtype: dict
+ """
+ with open(path, "r") as f:
+ data = f.read()
+
+ data = eval(data, {})
+ result = {}
+ for obj in data:
+ result.setdefault(obj, {"attrs": {}})
+ for attr in data[obj]:
+ typ, val = data[obj][attr]
+ result[obj]["attrs"][attr] = {"type": typ, "value": val}
+
+ return {"objects": result}
+
+ def __init__(self):
+ self._path = None
+ self._namespaces = None
+ self._data = {"metadata": {}, "objects": {}}
+
+ def path(self):
+ """
+ Return the disc location for the transfer object.
+
+ :rtype: str
+ """
+ return self._path
+
+ def setPath(self, path):
+ """
+ Set the disc location for loading and saving the transfer object.
+
+ :type path: str
+ """
+ dictPath = path.replace(".json", ".dict")
+ listPath = path.replace(".json", ".list")
+
+ if not os.path.exists(path):
+
+ if os.path.exists(dictPath):
+ path = dictPath
+
+ elif os.path.exists(listPath):
+ path = listPath
+
+ self._path = path
+
+ def validate(self, **kwargs):
+ """
+ Validate the given kwargs for the current IO object.
+
+ :type kwargs: dict
+ """
+ namespaces = kwargs.get("namespaces")
+ if namespaces is not None:
+ sceneNamespaces = mutils.namespace.getAll() + [":"]
+ for namespace in namespaces:
+ if namespace and namespace not in sceneNamespaces:
+ msg = 'The namespace "{0}" does not exist in the scene! ' \
+ "Please choose a namespace which exists."
+ msg = msg.format(namespace)
+ raise ValueError(msg)
+
+ def mtime(self):
+ """
+ Return the modification datetime of self.path().
+
+ :rtype: float
+ """
+ return os.path.getmtime(self.path())
+
+ def ctime(self):
+ """
+ Return the creation datetime of self.path().
+
+ :rtype: float
+ """
+ return os.path.getctime(self.path())
+
+ def data(self):
+ """
+ Return all the data for the transfer object.
+
+ :rtype: dict
+ """
+ return self._data
+
+ def setData(self, data):
+ """
+ Set the data for the transfer object.
+
+ :type data:
+ """
+ self._data = data
+
+ def owner(self):
+ """
+ Return the user who created this item.
+
+ :rtype: str
+ """
+ return self.metadata().get("user", "")
+
+ def description(self):
+ """
+ Return the user description for this item.
+
+ :rtype: str
+ """
+ return self.metadata().get("description", "")
+
+ def objects(self):
+ """
+ Return all the object data.
+
+ :rtype: dict
+ """
+ return self.data().get("objects", {})
+
+ def object(self, name):
+ """
+ Return the data for the given object name.
+
+ :type name: str
+ :rtype: dict
+ """
+ return self.objects().get(name, {})
+
+ def createObjectData(self, name):
+ """
+ Create the object data for the given object name.
+
+ :type name: str
+ :rtype: dict
+ """
+ return {}
+
+ def namespaces(self):
+ """
+ Return the namespaces contained in the transfer object
+
+ :rtype: list[str]
+ """
+ if self._namespaces is None:
+ group = mutils.groupObjects(self.objects())
+ self._namespaces = group.keys()
+
+ return self._namespaces
+
+ def objectCount(self):
+ """
+ Return the number of objects in the transfer object.
+
+ :rtype: int
+ """
+ return len(self.objects() or [])
+
+ def add(self, objects):
+ """
+ Add the given objects to the transfer object.
+
+ :type objects: str | list[str]
+ """
+ if isinstance(objects, six.string_types):
+ objects = [objects]
+
+ for name in objects:
+ self.objects()[name] = self.createObjectData(name)
+
+ def remove(self, objects):
+ """
+ Remove the given objects to the transfer object.
+
+ :type objects: str | list[str]
+ """
+ if isinstance(objects, six.string_types):
+ objects = [objects]
+
+ for obj in objects:
+ del self.objects()[obj]
+
+ def setMetadata(self, key, value):
+ """
+ Set the given key and value in the metadata.
+
+ :type key: str
+ :type value: int | str | float | dict
+ """
+ self.data()["metadata"][key] = value
+
+ def updateMetadata(self, metadata):
+ """
+ Update the given key and value in the metadata.
+
+ :type metadata: dict
+ """
+ self.data()["metadata"].update(metadata)
+
+ def metadata(self):
+ """
+ Return the current metadata for the transfer object.
+
+ Example: print(self.metadata())
+ Result # {
+ "User": "",
+ "Scene": "",
+ "Reference": {"filename": "", "namespace": ""},
+ "Description": "",
+ }
+
+ :rtype: dict
+ """
+ return self.data().get("metadata", {})
+
+ def read(self, path=""):
+ """
+ Return the data from the path set on the Transfer object.
+
+ :type path: str
+ :rtype: dict
+ """
+ path = path or self.path()
+
+ if path.endswith(".dict"):
+ data = self.readDict(path)
+
+ elif path.endswith(".list"):
+ data = self.readList(path)
+
+ else:
+ data = self.readJson(path)
+
+ self.setData(data)
+
+ @abc.abstractmethod
+ def load(self, *args, **kwargs):
+ pass
+
+ @mutils.showWaitCursor
+ def save(self, path):
+ """
+ Save the current metadata and object data to the given path.
+
+ :type path: str
+ :rtype: None
+ """
+ logger.info("Saving pose: %s" % path)
+
+ user = getpass.getuser()
+ if user:
+ user = six.text_type(user)
+
+ ctime = str(time.time()).split(".")[0]
+ references = mutils.getReferenceData(self.objects())
+
+ self.setMetadata("user", user)
+ self.setMetadata("ctime", ctime)
+ self.setMetadata("version", "1.0.0")
+ self.setMetadata("references", references)
+ self.setMetadata("mayaVersion", maya.cmds.about(v=True))
+ self.setMetadata("mayaSceneFile", maya.cmds.file(q=True, sn=True))
+
+ # Move the metadata information to the top of the file
+ metadata = {"metadata": self.metadata()}
+ data = self.dump(metadata)[:-1] + ","
+
+ # Move the objects information to after the metadata
+ objects = {"objects": self.objects()}
+ data += self.dump(objects)[1:]
+
+ # Create the given directory if it doesn't exist
+ dirname = os.path.dirname(path)
+ if not os.path.exists(dirname):
+ os.makedirs(dirname)
+
+ with open(path, "w") as f:
+ f.write(str(data))
+
+ logger.info("Saved pose: %s" % path)
+
+ def dump(self, data=None):
+ """
+ :type data: str | dict
+ :rtype: str
+ """
+ if data is None:
+ data = self.data()
+
+ return json.dumps(data, indent=2)
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/__init__.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/__init__.py
new file mode 100644
index 0000000..2aa2d37
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/__init__.py
@@ -0,0 +1,30 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+__version__ = "2.20.2"
+
+
+def version():
+ """
+ Return the current version of the Studio Library
+
+ :rtype: str
+ """
+ return __version__
+
+
+from studiolibrary import config
+from studiolibrary import resource
+from studiolibrary.utils import *
+from studiolibrary.library import Library
+from studiolibrary.libraryitem import LibraryItem
+from studiolibrary.main import main
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/config.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/config.py
new file mode 100644
index 0000000..40dc872
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/config.py
@@ -0,0 +1,94 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import os
+import json
+
+
+_config = None
+
+
+def get(*args):
+ """
+ Get values from the config.
+
+ :rtype: str
+ """
+ global _config
+
+ if not _config:
+ _config = read(paths())
+
+ return _config.get(*args)
+
+
+def set(key, value):
+
+ global _config
+
+ if not _config:
+ _config = read(paths())
+
+ _config[key] = value
+
+
+def paths():
+ """
+ Return all possible config paths.
+
+ :rtype: list[str]
+ """
+ cwd = os.path.dirname(__file__)
+ paths_ = [os.path.join(cwd, "config", "default.json")]
+
+ path = os.environ.get("STUDIO_LIBRARY_CONFIG_PATH")
+ path = path or os.path.join(cwd, "config", "config.json")
+
+ if not os.path.exists(path):
+ cwd = os.path.dirname(os.path.dirname(cwd))
+ path = os.path.join(cwd, "config", "config.json")
+
+ if os.path.exists(path):
+ paths_.append(path)
+
+ return paths_
+
+
+def read(paths):
+ """
+ Read all paths and overwrite the keys with each successive file.
+
+ A custom config parser for passing JSON files.
+
+ We use this instead of the standard ConfigParser as the JSON format
+ can support list and dict types.
+
+ This parser can also support comments using the following style "//"
+
+ :type paths: list[str]
+ :rtype: dict
+ """
+ conf = {}
+
+ for path in paths:
+ lines = []
+
+ with open(path) as f:
+ for line in f.readlines():
+ if not line.strip().startswith('//'):
+ lines.append(line)
+
+ data = '\n'.join(lines)
+ if data:
+ conf.update(json.loads(data))
+
+ return conf
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/config/default.json b/2023/scripts/animation_tools/studiolibrary/studiolibrary/config/default.json
new file mode 100644
index 0000000..1d02168
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/config/default.json
@@ -0,0 +1,61 @@
+// This is the default config file and should NOT be changed.
+//
+// There are two ways to create a custom config.
+//
+// 1. You can create a "config.json" at repo/config/config.json.
+// This file will override any keys in this default.json file
+// and will be ignored by git.
+//
+// 2. The other way is to create an environment variable with the name
+// STUDIO_LIBRARY_CONFIG_PATH. The value of this variable should be the
+// full path to your config.json file.
+//
+// 3. Or you could use code to modify the config before loading the window.
+// import studiolibrary
+// studiolibrary.config.set("recursiveSearchDepth", 6)
+// studiolibrary.main()
+
+{
+ // The database path is used for caching the library items.
+ // You can use environment variables within the path. eg: {HOME}
+ "databasePath": "{root}/.studiolibrary/database.json",
+
+ // The temp location used for saving out items and thumbnails
+ "tempPath": "{temp}/StudioLibrary/{user}",
+
+ // The metadata path used for each item. Used for tags, item color etc
+ // eg: /library/data/animation/nemo/.metadata
+ "metadataPath": "{path}/.studiolibrary/metadata.json",
+
+ // Used for saving persistent user data
+ "settingsPath": "{local}/StudioLibrary/LibraryWidget.json",
+
+ // The maximum walking depth from the root directory
+ "recursiveSearchDepth": 5,
+
+ // A list of paths to ignore when walking the root directory
+ "ignorePaths": ["/."],
+
+ // The command used to show a path in the file explorer
+ //"showInFolderCmd": "konqueror \"{path}\"&",
+
+ // Enables the scale factor option in the setting dialog
+ // This might be useful when using high-DPI devices like a 4k monitor
+ "scaleFactorEnabled": true,
+
+ // Check if there are any new versions available on start up
+ "checkForUpdatesEnabled": true,
+
+ // A list of the default item plugins
+ "itemRegistry": [
+ // This is an example item for development
+ // "studiolibrarymaya.exampleitem.ExampleItem",
+ // The maya file item is in development
+ // "studiolibrarymaya.mayafileitem.MayaFileItem",
+ "studiolibrarymaya.poseitem.PoseItem",
+ "studiolibrarymaya.animitem.AnimItem",
+ "studiolibrarymaya.mirroritem.MirrorItem",
+ "studiolibrarymaya.setsitem.SetsItem",
+ "studiolibrary.folderitem.FolderItem"
+ ]
+}
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/folderitem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/folderitem.py
new file mode 100644
index 0000000..4956f37
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/folderitem.py
@@ -0,0 +1,367 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import os
+from datetime import datetime
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+import studioqt
+import studiolibrary
+import studiolibrary.widgets
+
+
+class FolderItem(studiolibrary.LibraryItem):
+
+ NAME = "Folder"
+ TYPE = "Folder"
+
+ MENU_ORDER = 0 # Show at the top of the menu
+ SYNC_ORDER = 100 # Last item to run when syncing
+
+ LOAD_WIDGET_CLASS = studiolibrary.widgets.PreviewWidget
+ ENABLE_NESTED_ITEMS = True
+
+ ICON_PATH = studiolibrary.resource.get("icons", "folder.svg")
+ TYPE_ICON_PATH = "" # Don't show a type icon for the folder item
+ THUMBNAIL_PATH = studiolibrary.resource.get("icons", "folder_item.png")
+
+ DEFAULT_ICON_COLOR = "rgba(150,150,150,100)"
+
+ DEFAULT_ICON_COLORS = [
+ "rgb(239, 112, 99)",
+ "rgb(239, 207, 103)",
+ "rgb(136, 200, 101)",
+ "rgb(111, 183, 239)",
+ "rgb(199, 142, 220)",
+ DEFAULT_ICON_COLOR,
+ ]
+
+ DEFAULT_ICONS = [
+ "folder.svg",
+ "user.svg",
+ "character.svg",
+ "users.svg",
+ "inbox.svg",
+ "favorite.svg",
+ "shot.svg",
+ "asset.svg",
+ "assets.svg",
+ "cloud.svg",
+ "book.svg",
+ "archive.svg",
+ "circle.svg",
+ "share.svg",
+ "tree.svg",
+ "environment.svg",
+ "vehicle.svg",
+ "trash.svg",
+ "layers.svg",
+ "database.svg",
+ "video.svg",
+ "face.svg",
+ "hand.svg",
+ "globe.svg",
+ ]
+
+ _THUMBNAIL_ICON_CACHE = {}
+
+ @classmethod
+ def match(cls, path):
+ """
+ Return True if the given path is supported by the item.
+
+ :type path: str
+ :rtype: bool
+ """
+ if os.path.isdir(path):
+ return True
+
+ def itemData(self):
+ """
+ Reimplementing this method to set a trash folder icon.
+
+ :rtype: dict
+ """
+ data = super(FolderItem, self).itemData()
+
+ if self.path().endswith("Trash") and not data.get("icon"):
+ data["icon"] = "trash.svg"
+
+ return data
+
+ def updatePermissionsEnabled(self):
+ return True
+
+ def updateMetadata(self, metadata):
+ """
+ Overriding this method to support updating the library widget directly.
+
+ :type metadata: dict
+ """
+ super(FolderItem, self).updateMetadata(metadata)
+
+ if self.libraryWindow():
+ self.libraryWindow().setFolderData(self.path(), self.itemData())
+ self.updateIcon()
+
+ def doubleClicked(self):
+ """Overriding this method to show the items contained in the folder."""
+ self.libraryWindow().selectFolderPath(self.path())
+
+ def createOverwriteMenu(self, menu):
+ """
+ Overwriting this method to ignore/hide the overwrite menu action.
+
+ :type menu: QtWidgets.QMenu
+ """
+ pass
+
+ def _showPreviewFromMenu(self):
+
+ self.libraryWindow().itemsWidget().clearSelection()
+ self.showPreviewWidget(self.libraryWindow())
+
+ def contextEditMenu(self, menu, items=None):
+ """
+ Called when creating the context menu for the item.
+
+ :type menu: QtWidgets.QMenu
+ :type items: list[FolderItem] or None
+ """
+ super(FolderItem, self).contextEditMenu(menu, items=items)
+
+ action = QtWidgets.QAction("Show in Preview", menu)
+
+ action.triggered.connect(self._showPreviewFromMenu)
+ menu.addAction(action)
+ menu.addSeparator()
+
+ action = studiolibrary.widgets.colorpicker.ColorPickerAction(menu)
+ action.picker().setColors(self.DEFAULT_ICON_COLORS)
+ action.picker().colorChanged.connect(self.setIconColor)
+ action.picker().setCurrentColor(self.iconColor())
+ action.picker().menuButton().hide()
+ menu.addAction(action)
+
+ iconName = self.itemData().get("icon", "")
+
+ action = studiolibrary.widgets.iconpicker.IconPickerAction(menu)
+ action.picker().setIcons(self.DEFAULT_ICONS)
+ action.picker().setCurrentIcon(iconName)
+ action.picker().iconChanged.connect(self.setCustomIcon)
+ action.picker().menuButton().hide()
+
+ menu.addAction(action)
+
+ def iconColor(self):
+ """
+ Get the icon color for the folder item.
+
+ :rtype: str
+ """
+ return self.itemData().get("color", "")
+
+ def setIconColor(self, color):
+ """
+ Set the icon color for the folder item.
+
+ :type color: str
+ """
+ if color == self.DEFAULT_ICON_COLOR:
+ color = ""
+
+ self.updateMetadata({"color": color})
+
+ def customIconPath(self):
+ """
+ Get the icon for the folder item.
+
+ :rtype: str
+ """
+ return self.itemData().get("icon", "")
+
+ def setCustomIcon(self, name):
+ """
+ Set the icon for the folder item.
+
+ :type name: str
+ """
+ if name == "folder.svg":
+ name = ""
+
+ self.updateMetadata({"icon": name})
+
+ def thumbnailIcon(self):
+ """
+ Overriding this method add support for dynamic icon colors.
+
+ :rtype: QtGui.QIcon
+ """
+ customPath = self.customIconPath()
+
+ if customPath and "/" not in customPath and "\\" not in customPath:
+ customPath = studiolibrary.resource.get("icons", customPath)
+
+ color = self.iconColor()
+ if not color:
+ color = self.DEFAULT_ICON_COLOR
+
+ key = customPath + color
+ icon = self._THUMBNAIL_ICON_CACHE.get(key)
+
+ if not icon:
+ color1 = studioqt.Color.fromString(color)
+ pixmap1 = studioqt.Pixmap(self.THUMBNAIL_PATH)
+ pixmap1.setColor(color1)
+ pixmap1 = pixmap1.scaled(
+ 128,
+ 128,
+ QtCore.Qt.KeepAspectRatio,
+ QtCore.Qt.SmoothTransformation
+ )
+
+ color2 = studioqt.Color.fromString("rgba(255,255,255,150)")
+ pixmap2 = studioqt.Pixmap(customPath)
+ pixmap2.setColor(color2)
+ pixmap2 = pixmap2.scaled(
+ 64,
+ 64,
+ QtCore.Qt.KeepAspectRatio,
+ QtCore.Qt.SmoothTransformation
+ )
+
+ x = (128 - pixmap2.width()) / 2
+ y = (128 - pixmap2.height()) / 2
+
+ painter = QtGui.QPainter(pixmap1)
+ painter.drawPixmap(x, y+5, pixmap2)
+ painter.end()
+
+ icon = studioqt.Icon(pixmap1)
+
+ self._THUMBNAIL_ICON_CACHE[key] = icon
+
+ return self._THUMBNAIL_ICON_CACHE.get(key)
+
+ def loadValidator(self, **kwargs):
+ """
+ The validator used for validating the load arguments.
+
+ :type kwargs: dict
+ """
+ if kwargs.get("fieldChanged") == "color":
+ self.setIconColor(kwargs.get("color"))
+
+ if kwargs.get("fieldChanged") == "icon":
+ self.setCustomIcon(kwargs.get("icon"))
+
+ def loadSchema(self):
+ """
+ Get the info to display to user.
+
+ :rtype: list[dict]
+ """
+ created = os.stat(self.path()).st_ctime
+ created = datetime.fromtimestamp(created).strftime("%Y-%m-%d %H:%M %p")
+
+ modified = os.stat(self.path()).st_mtime
+ modified = datetime.fromtimestamp(modified).strftime("%Y-%m-%d %H:%M %p")
+
+ iconName = self.itemData().get("icon", "")
+
+ return [
+ {
+ "name": "infoGroup",
+ "title": "Info",
+ "value": True,
+ "type": "group",
+ "persistent": True,
+ "persistentKey": "BaseItem",
+ },
+ {
+ "name": "name",
+ "value": self.name()
+ },
+ {
+ "name": "path",
+ "value": self.path()
+ },
+ {
+ "name": "created",
+ "value": created,
+ },
+ {
+ "name": "modified",
+ "value": modified,
+ },
+ {
+ "name": "optionsGroup",
+ "title": "Options",
+ "type": "group",
+ },
+
+ {
+ "name": "color",
+ "type": "color",
+ "value": self.iconColor(),
+ "layout": "vertical",
+ "label": {"visible": False},
+ "colors": self.DEFAULT_ICON_COLORS,
+ },
+
+ {
+ "name": "icon",
+ "type": "iconPicker",
+ "value": iconName,
+ "layout": "vertical",
+ "label": {"visible": False},
+ "items": self.DEFAULT_ICONS,
+ }
+ ]
+
+ @classmethod
+ def showSaveWidget(cls, libraryWindow):
+ """
+ Show the dialog for creating a new folder.
+
+ :rtype: None
+ """
+ path = libraryWindow.selectedFolderPath() or libraryWindow.path()
+
+ name, button = studiolibrary.widgets.MessageBox.input(
+ libraryWindow,
+ "Create folder",
+ "Create a new folder with the name:",
+ buttons=[
+ ("Create", QtWidgets.QDialogButtonBox.AcceptRole),
+ ("Cancel", QtWidgets.QDialogButtonBox.RejectRole)
+ ]
+ )
+
+ name = name.strip()
+
+ if name and button == "Create":
+ path = os.path.join(path, name)
+
+ item = cls(path, libraryWindow=libraryWindow)
+ item.safeSave()
+
+ if libraryWindow:
+ libraryWindow.refresh()
+ libraryWindow.selectFolderPath(path)
+
+ def save(self, *args, **kwargs):
+ """Adding this method to avoid NotImpementedError."""
+ pass
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/library.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/library.py
new file mode 100644
index 0000000..28a4160
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/library.py
@@ -0,0 +1,1081 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+import fnmatch
+import os
+import copy
+import re
+import time
+import logging
+import collections
+
+from studiovendor import six
+from studiovendor.Qt import QtCore
+
+import studiolibrary
+
+
+__all__ = [
+ "Library",
+]
+
+logger = logging.getLogger(__name__)
+
+
+class Library(QtCore.QObject):
+
+ Fields = [
+ {
+ "name": "icon",
+ "sortable": False,
+ "groupable": False,
+ },
+ {
+ "name": "name",
+ "sortable": True,
+ "groupable": False,
+ },
+ {
+ "name": "path",
+ "sortable": True,
+ "groupable": False,
+ },
+ {
+ "name": "type",
+ "sortable": True,
+ "groupable": True,
+ },
+ {
+ "name": "folder",
+ "sortable": True,
+ "groupable": False,
+ },
+ {
+ "name": "category",
+ "sortable": True,
+ "groupable": True,
+ },
+ {
+ "name": "modified",
+ "sortable": True,
+ "groupable": False,
+ },
+ {
+ "name": "Custom Order",
+ "sortable": True,
+ "groupable": False,
+ },
+ ]
+
+ dataChanged = QtCore.Signal()
+ searchStarted = QtCore.Signal()
+ searchFinished = QtCore.Signal()
+ searchTimeFinished = QtCore.Signal()
+
+ def __init__(self, path=None, libraryWindow=None, *args):
+ QtCore.QObject.__init__(self, *args)
+
+ self._path = path
+ self._mtime = None
+ self._data = {}
+ self._items = []
+ self._fields = []
+ self._sortBy = []
+ self._groupBy = []
+ self._results = []
+ self._queries = {}
+ self._globalQueries = {}
+ self._groupedResults = {}
+ self._searchTime = 0
+ self._searchEnabled = True
+ self._registeredItems = None
+ self._libraryWindow = libraryWindow
+
+ self.setPath(path)
+ self.setDirty(True)
+
+ def sortBy(self):
+ """
+ Get the list of fields to sort by.
+
+ :rtype: list[str]
+ """
+ return self._sortBy
+
+ def setSortBy(self, fields):
+ """
+ Set the list of fields to group by.
+
+ Example:
+ library.setSortBy(["name:asc", "type:asc"])
+
+ :type fields: list[str]
+ """
+ self._sortBy = fields
+
+ def groupBy(self):
+ """
+ Get the list of fields to group by.
+
+ :rtype: list[str]
+ """
+ return self._groupBy
+
+ def setGroupBy(self, fields):
+ """
+ Set the list of fields to group by.
+
+ Example:
+ library.setGroupBy(["name:asc", "type:asc"])
+
+ :type fields: list[str]
+ """
+ self._groupBy = fields
+
+ def settings(self):
+ """
+ Get the settings for the dataset.
+
+ :rtype: dict
+ """
+ return {
+ "sortBy": self.sortBy(),
+ "groupBy": self.groupBy()
+ }
+
+ def setSettings(self, settings):
+ """
+ Set the settings for the dataset object.
+
+ :type settings: dict
+ """
+ value = settings.get('sortBy')
+ if value is not None:
+ self.setSortBy(value)
+
+ value = settings.get('groupBy')
+ if value is not None:
+ self.setGroupBy(value)
+
+ def setSearchEnabled(self, enabled):
+ """Enable or disable the search the for the library."""
+ self._searchEnabled = enabled
+
+ def isSearchEnabled(self):
+ """Check if search is enabled for the library."""
+ return self._searchEnabled
+
+ def recursiveDepth(self):
+ """
+ Return the recursive search depth.
+
+ :rtype: int
+ """
+ return studiolibrary.config.get('recursiveSearchDepth')
+
+ def fields(self):
+ """
+ Get all the fields for the library.
+
+ :rtype: list[dict]
+ """
+ return self.Fields
+
+ def fieldNames(self):
+ """
+ Get all the field names for the library.
+
+ :rtype: list[str]
+ """
+ return [field["name"] for field in self.fields()]
+
+ def path(self):
+ """
+ Return the disc location of the db.
+
+ :rtype: str
+ """
+ return self._path
+
+ def setPath(self, path):
+ """
+ Set the disc location of the db.
+
+ :type path: str
+ """
+ self._path = path
+
+ def databasePath(self):
+ """
+ Return the path to the database.
+
+ :rtype: str
+ """
+ formatString = studiolibrary.config.get('databasePath')
+ return studiolibrary.formatPath(formatString, path=self.path())
+
+ def distinct(self, field, queries=None, sortBy="name"):
+ """
+ Get all the values for the given field.
+
+ :type field: str
+ :type queries None or list[dict]
+ :type sortBy: str
+ :rtype: list
+ """
+ results = {}
+ queries = queries or []
+ queries.extend(self._globalQueries.values())
+
+ items = self.createItems()
+ for item in items:
+ value = item.itemData().get(field)
+ if value:
+ results.setdefault(value, {'count': 0, 'name': value})
+ match = self.match(item.itemData(), queries)
+ if match:
+ results[value]['count'] += 1
+
+ def sortKey(facet):
+ return facet.get(sortBy)
+
+ return sorted(results.values(), key=sortKey)
+
+ def mtime(self):
+ """
+ Return when the database was last modified.
+
+ :rtype: float or None
+ """
+ path = self.databasePath()
+ mtime = None
+
+ if os.path.exists(path):
+ mtime = os.path.getmtime(path)
+
+ return mtime
+
+ def setDirty(self, value):
+ """
+ Update the model object with the current database timestamp.
+
+ :type: bool
+ """
+ if value:
+ self._mtime = None
+ else:
+ self._mtime = self.mtime()
+
+ def isDirty(self):
+ """
+ Return True if the database has changed on disc.
+
+ :rtype: bool
+ """
+ return not self._items or self._mtime != self.mtime()
+
+ def read(self):
+ """
+ Read the database from disc and return a dict object.
+
+ :rtype: dict
+ """
+ if self.path():
+ if self.isDirty():
+ self._data = studiolibrary.readJson(self.databasePath())
+ self.setDirty(False)
+ else:
+ logger.info('No path set for reading the data from disc.')
+
+ return self._data
+
+ def save(self, data):
+ """
+ Write the given dict object to the database on disc.
+
+ :type data: dict
+ :rtype: None
+ """
+ if self.path():
+ studiolibrary.saveJson(self.databasePath(), data)
+ self.setDirty(True)
+ self.updatePermissions(self.databasePath())
+ else:
+ logger.info('No path set for saving the data to disc.')
+
+ def clear(self):
+ """Clear all the item data."""
+ self._items = []
+ self._results = []
+ self._groupedResults = {}
+ self._registeredItems = None
+ self.dataChanged.emit()
+
+ def registeredItems(self):
+ """
+ Get registered items for the library.
+
+ :rtype: list[LibraryItem.__class__]
+ """
+ return studiolibrary.registeredItems()
+
+ def isValidPath(self, path):
+ """
+ Check if the given item path should be ignored.
+
+ :type path: str
+ :rtype: bool
+ """
+ patterns = studiolibrary.config.get('ignorePaths', [])
+ patterns.append("*/.*")
+ patterns.append("*.python")
+ patterns.append("*.playblast")
+ patterns.append("*.playblast_settings")
+
+ for pattern in patterns:
+ if fnmatch.fnmatch(path, pattern):
+ return False
+ return True
+
+ def walker(self, path):
+ """
+ Walk the given root path for valid items and return the item data.
+
+ :type path: str
+
+ :rtype: collections.Iterable[dict]
+ """
+ path = studiolibrary.normPath(path)
+ maxDepth = self.recursiveDepth()
+ startDepth = path.count(os.path.sep)
+
+ for root, dirs, files in os.walk(path, followlinks=True):
+
+ files.extend(dirs)
+
+ for filename in files:
+
+ # Normalise the path for consistent matching
+ path = studiolibrary.normPath(os.path.join(root, filename))
+
+ # Ignore any paths that have been specified in the config
+ remove = False
+ if not self.isValidPath(path):
+ remove = True
+ else:
+ # Match the path with a registered item
+ item = self.itemFromPath(path)
+ if item:
+
+ # Yield the item data that matches the current path
+ yield item.createItemData()
+
+ # Stop walking if the item doesn't support nested items
+ if not item.ENABLE_NESTED_ITEMS:
+ remove = True
+
+ if remove and filename in dirs:
+ dirs.remove(filename)
+
+ if maxDepth == 1:
+ break
+
+ # Stop walking the directory if the maximum depth has been reached
+ currentDepth = root.count(os.path.sep)
+ if (currentDepth - startDepth) >= maxDepth:
+ del dirs[:]
+
+ def sync(self, progressCallback=None):
+ """
+ Sync the file system with the database.
+
+ :type progressCallback: None or func
+ """
+ if not self.path():
+ logger.info('No path set for syncing data')
+ return
+
+ if progressCallback:
+ progressCallback("Syncing")
+
+ new = {}
+ old = self.read()
+ items = list(self.walker(self.path()))
+ count = len(items)
+
+ for i, item in enumerate(items):
+ percent = (float(i+1)/float(count))
+ if progressCallback:
+ percent *= 100
+ label = "{0:.0f}%".format(percent)
+ progressCallback(label, percent)
+
+ path = item.get("path")
+ new[path] = old.get(path, {})
+ new[path].update(item)
+
+ if progressCallback:
+ progressCallback("Post Callbacks")
+
+ self.postSync(new)
+
+ if progressCallback:
+ progressCallback("Saving Cache")
+
+ self.save(new)
+
+ self.dataChanged.emit()
+
+ def postSync(self, data):
+ """
+ Use this function to execute code on the data after sync, but before save and dataChanged.emit
+
+ :type data: dict
+ :rtype: None
+ """
+ pass
+
+ def createItems(self):
+ """
+ Create all the items for the model.
+
+ :rtype: list[studiolibrary.LibraryItem]
+ """
+ # Check if the cache has changed since the last read call
+ if self.isDirty():
+
+ logger.debug("Creating items")
+
+ self._items = []
+
+ data = self.read()
+
+ modules = []
+ for itemData in data.values():
+ if '__class__' in itemData:
+ modules.append(itemData.get("__class__"))
+ modules = set(modules)
+
+ classes = {}
+ for module in modules:
+ classes[module] = studiolibrary.resolveModule(module)
+
+ for path in data.keys():
+ module = data[path].get("__class__")
+ cls = classes.get(module)
+ if cls:
+ item = cls(path, library=self, libraryWindow=self._libraryWindow)
+ item.setItemData(data[path])
+ self._items.append(item)
+ else:
+ # This is to support the older database data before v2.6.
+ # Will remove in a later version.
+ item = self.itemFromPath(path, library=self, libraryWindow=self._libraryWindow)
+ if item:
+ item.setItemData(data[path])
+ self._items.append(item)
+
+ return self._items
+
+ def itemFromPath(self, path, **kwargs):
+ """
+ Return a new item instance for the given path.
+
+ :type path: str
+ :rtype: studiolibrary.LibraryItem or None
+ """
+ path = studiolibrary.normPath(path)
+
+ for cls in self.registeredItems():
+ if cls.match(path):
+ return cls(path, **kwargs)
+
+ def itemsFromPaths(self, paths, **kwargs):
+ """
+ Return new item instances for the given paths.
+
+ :type paths: list[str]:
+ :rtype: collections.Iterable[studiolibrary.LibraryItem]
+ """
+ for path in paths:
+ item = self.itemFromPath(path, **kwargs)
+ if item:
+ yield item
+
+ def itemsFromUrls(self, urls, **kwargs):
+ """
+ Return new item instances for the given QUrl objects.
+
+ :type urls: list[QtGui.QUrl]
+ :rtype: list[studiolibrary.LibraryItem]
+ """
+ items = []
+ for path in studiolibrary.pathsFromUrls(urls):
+
+ item = self.itemFromPath(path, **kwargs)
+
+ if item:
+ data = item.createItemData()
+ item.setItemData(data)
+
+ items.append(item)
+ else:
+ msg = 'Cannot find the item for path "{0}"'
+ msg = msg.format(path)
+ logger.warning(msg)
+
+ return items
+
+ def findItems(self, queries):
+ """
+ Get the items that match the given queries.
+
+ Examples:
+
+ queries = [
+ {
+ 'operator': 'or',
+ 'filters': [
+ ('folder', 'is' '/library/proj/test'),
+ ('folder', 'startswith', '/library/proj/test'),
+ ]
+ },
+ {
+ 'operator': 'and',
+ 'filters': [
+ ('path', 'contains' 'test'),
+ ('path', 'contains', 'run'),
+ ]
+ }
+ ]
+
+ print(library.find(queries))
+
+ :type queries: list[dict]
+ :rtype: list[studiolibrary.LibraryItem]
+ """
+ fields = []
+ results = []
+
+ queries = copy.copy(queries)
+ queries.extend(self._globalQueries.values())
+
+ logger.debug("Search queries:")
+ for query in queries:
+ logger.debug('Query: %s', query)
+
+ items = self.createItems()
+ for item in items:
+ match = self.match(item.itemData(), queries)
+ if match:
+ results.append(item)
+ fields.extend(item.itemData().keys())
+
+ self._fields = list(set(fields))
+
+ if self.sortBy():
+ results = self.sorted(results, self.sortBy())
+
+ return results
+
+ def queries(self, exclude=None):
+ """
+ Get all the queries for the dataset excluding the given ones.
+
+ :type exclude: list[str] or None
+
+ :rtype: list[dict]
+ """
+ queries = []
+ exclude = exclude or []
+
+ for query in self._queries.values():
+ if query.get('name') not in exclude:
+ queries.append(query)
+
+ return queries
+
+ def addGlobalQuery(self, query):
+ """
+ Add a global query to library.
+
+ :type query: dict
+ """
+ self._globalQueries[query["name"]] = query
+
+ def addQuery(self, query):
+ """
+ Add a search query to the library.
+
+ Examples:
+ addQuery({
+ 'name': 'My Query',
+ 'operator': 'or',
+ 'filters': [
+ ('folder', 'is' '/library/proj/test'),
+ ('folder', 'startswith', '/library/proj/test'),
+ ]
+ })
+
+ :type query: dict
+ """
+ self._queries[query["name"]] = query
+
+ def removeQuery(self, name):
+ """
+ Remove the query with the given name.
+
+ :type name: str
+ """
+ if name in self._queries:
+ del self._queries[name]
+
+ def queryExists(self, name):
+ """
+ Check if the given query name exists.
+
+ :type name: str
+ :rtype: bool
+ """
+ return name in self._queries
+
+ def search(self):
+ """Run a search using the queries added to this dataset."""
+ if not self.isSearchEnabled():
+ logger.debug('Search is disabled')
+ return
+
+ t = time.time()
+
+ logger.debug("Searching items")
+
+ self.searchStarted.emit()
+
+ self._results = self.findItems(self.queries())
+
+ self._groupedResults = self.groupItems(self._results, self.groupBy())
+
+ self.searchFinished.emit()
+
+ self._searchTime = time.time() - t
+
+ self.searchTimeFinished.emit()
+
+ logger.debug('Search time: %s', self._searchTime)
+
+ def results(self):
+ """
+ Return the items found after a search is ran.
+
+ :rtype: list[Item]
+ """
+ return self._results
+
+ def groupedResults(self):
+ """
+ Get the results grouped after a search is ran.
+
+ :rtype: dict
+ """
+ return self._groupedResults
+
+ def searchTime(self):
+ """
+ Return the time taken to run a search.
+
+ :rtype: float
+ """
+ return self._searchTime
+
+ def addItem(self, item):
+ """
+ Add the given item to the database.
+
+ :type item: studiolibrary.LibraryItem
+ :rtype: None
+ """
+ self.saveItemData([item])
+
+ def addItems(self, items):
+ """
+ Add the given items to the database.
+
+ :type items: list[studiolibrary.LibraryItem]
+ """
+ self.saveItemData(items)
+
+ def saveItemData(self, items, emitDataChanged=True):
+ """
+ Add the given items to the database.
+
+ :type items: list[studiolibrary.LibraryItem]
+ :type emitDataChanged: bool
+ """
+ logger.debug("Save item data %s", items)
+
+ data_ = self.read()
+
+ for item in items:
+ path = item.path()
+ data = item.itemData()
+ data_.setdefault(path, {})
+ data_[path].update(data)
+
+ self.save(data_)
+
+ if emitDataChanged:
+ self.search()
+ self.dataChanged.emit()
+
+ def addPaths(self, paths, data=None):
+ """
+ Add the given path and the given data to the database.
+
+ :type paths: list[str]
+ :type data: dict or None
+ :rtype: None
+ """
+ data = data or {}
+ self.updatePaths(paths, data)
+
+ def updatePaths(self, paths, data):
+ """
+ Update the given paths with the given data in the database.
+
+ :type paths: list[str]
+ :type data: dict
+ :rtype: None
+ """
+ data_ = self.read()
+ paths = studiolibrary.normPaths(paths)
+
+ for path in paths:
+ if path in data_:
+ data_[path].update(data)
+ else:
+ data_[path] = data
+
+ self.save(data_)
+
+ def copyPath(self, src, dst):
+ """
+ Copy the given source path to the given destination path.
+
+ :type src: str
+ :type dst: str
+ :rtype: str
+ """
+ self.addPaths([dst])
+ return dst
+
+ def renamePath(self, src, dst):
+ """
+ Rename the source path to the given name.
+
+ :type src: str
+ :type dst: str
+ :rtype: str
+ """
+ studiolibrary.renamePathInFile(self.databasePath(), src, dst)
+ self.setDirty(True)
+ self.updatePermissions(self.databasePath())
+ return dst
+
+ def updatePermissions(self, dst):
+ """
+ Update the permissions and ownership of the destination path to match the
+ root library path if running on a Linux system.
+
+ This helps with permission issues for shared libraries when using a default
+ umask of 022.
+
+ :type dst: str
+ :rtype: None
+ """
+ if not studiolibrary.isLinux():
+ return
+
+ stat = os.stat(self.path())
+
+ try:
+ os.chmod(dst, stat.st_mode)
+ except OSError as e:
+ logger.warning("Error changing permissions: %s", e)
+
+ try:
+ os.chown(dst, -1, stat.st_gid)
+ except OSError as e:
+ logger.warning("Error changing group ownership: %s", e)
+
+ def removePath(self, path):
+ """
+ Remove the given path from the database.
+
+ :type path: str
+ :rtype: None
+ """
+ self.removePaths([path])
+
+ def removePaths(self, paths):
+ """
+ Remove the given paths from the database.
+
+ :type paths: list[str]
+ :rtype: None
+ """
+ data = self.read()
+
+ paths = studiolibrary.normPaths(paths)
+
+ for path in paths:
+ if path in data:
+ del data[path]
+
+ self.save(data)
+
+ @staticmethod
+ def match(data, queries):
+ """
+ Match the given data with the given queries.
+
+ Examples:
+
+ queries = [
+ {
+ 'operator': 'or',
+ 'filters': [
+ ('folder', 'is' '/library/proj/test'),
+ ('folder', 'startswith', '/library/proj/test'),
+ ]
+ },
+ {
+ 'operator': 'and',
+ 'filters': [
+ ('path', 'contains' 'test'),
+ ('path', 'contains', 'run'),
+ ]
+ }
+ ]
+
+ print(library.find(queries))
+ """
+ matches = []
+
+ for query in queries:
+
+ filters = query.get('filters')
+ operator = query.get('operator', 'and')
+
+ if not filters:
+ continue
+
+ match = False
+
+ for key, cond, value in filters:
+
+ if key == '*':
+ itemValue = six.text_type(data)
+ else:
+ itemValue = data.get(key)
+
+ if isinstance(value, six.string_types):
+ value = value.lower()
+
+ if isinstance(itemValue, six.string_types):
+ itemValue = itemValue.lower()
+
+ if not itemValue:
+ match = False
+
+ elif cond == 'contains':
+ match = value in itemValue
+
+ elif cond == 'not_contains':
+ match = value not in itemValue
+
+ elif cond == 'is':
+ match = value == itemValue
+
+ elif cond == 'not':
+ match = value != itemValue
+
+ elif cond == 'startswith':
+ match = itemValue.startswith(value)
+
+ if operator == 'or' and match:
+ break
+
+ if operator == 'and' and not match:
+ break
+
+ matches.append(match)
+
+ return all(matches)
+
+ @staticmethod
+ def sorted(items, sortBy):
+ """
+ Return the given data sorted using the sortBy argument.
+
+ Example:
+ data = [
+ {'name':'red', 'index':1},
+ {'name':'green', 'index':2},
+ {'name':'blue', 'index':3},
+ ]
+
+ sortBy = ['index:asc', 'name']
+ # sortBy = ['index:dsc', 'name']
+
+ print(sortedData(data, sortBy))
+
+ :type items: list[Item]
+ :type sortBy: list[str]
+ :rtype: list[Item]
+ """
+ logger.debug('Sort by: %s', sortBy)
+
+ t = time.time()
+
+ for field in reversed(sortBy):
+
+ tokens = field.split(':')
+
+ reverse = False
+ if len(tokens) > 1:
+ field = tokens[0]
+ reverse = tokens[1] != 'asc'
+
+ def sortKey(item):
+
+ default = False if reverse else ''
+
+ return item.itemData().get(field, default)
+
+ items = sorted(items, key=sortKey, reverse=reverse)
+
+ logger.debug("Sort items took %s", time.time() - t)
+
+ return items
+
+ @staticmethod
+ def groupItems(items, fields):
+ """
+ Group the given items by the given field.
+
+ :type items: list[Item]
+ :type fields: list[str]
+ :rtype: dict
+ """
+ logger.debug('Group by: %s', fields)
+
+ # Only support for top level grouping at the moment.
+ if fields:
+ field = fields[0]
+ else:
+ return {'None': items}
+
+ t = time.time()
+
+ results_ = {}
+ tokens = field.split(':')
+
+ reverse = False
+ if len(tokens) > 1:
+ field = tokens[0]
+ reverse = tokens[1] != 'asc'
+
+ for item in items:
+ value = item.itemData().get(field)
+ if value:
+ results_.setdefault(value, [])
+ results_[value].append(item)
+
+ groups = sorted(results_.keys(), reverse=reverse)
+
+ results = collections.OrderedDict()
+ for group in groups:
+ results[group] = results_[group]
+
+ logger.debug("Group Items Took %s", time.time() - t)
+
+ return results
+
+
+def testsuite():
+
+ data = [
+ {'name': 'blue', 'index': 3},
+ {'name': 'red', 'index': 1},
+ {'name': 'green', 'index': 2},
+ ]
+
+ sortBy = ['index:asc', 'name']
+ data2 = (Library.sortedData(data, sortBy))
+
+ assert(data2[0].get('index') == 1)
+ assert(data2[1].get('index') == 2)
+ assert(data2[2].get('index') == 3)
+
+ sortBy = ['index:dsc', 'name']
+ data3 = (Library.sortedData(data, sortBy))
+
+ assert(data3[0].get('index') == 3)
+ assert(data3[1].get('index') == 2)
+ assert(data3[2].get('index') == 1)
+
+ data = {'name': 'blue', 'index': 3}
+ queries = [{'filters': [('name', 'is', 'blue')]}]
+ assert Library.match(data, queries)
+
+ data = {'name': 'red', 'index': 3}
+ queries = [{'filters': [('name', 'is', 'blue')]}]
+ assert not Library.match(data, queries)
+
+ data = {'name': 'red', 'index': 3}
+ queries = [{'filters': [('name', 'startswith', 're')]}]
+ assert Library.match(data, queries)
+
+ data = {'name': 'red', 'index': 3}
+ queries = [{'filters': [('name', 'startswith', 'ed')]}]
+ assert not Library.match(data, queries)
+
+ data = {'name': 'red', 'index': 3}
+ queries = [{
+ 'operator': 'or',
+ 'filters': [('name', 'is', 'pink'), ('name', 'is', 'red')]
+ }]
+ assert Library.match(data, queries)
+
+ data = {'name': 'red', 'index': 3}
+ queries = [{
+ 'operator': 'and',
+ 'filters': [('name', 'is', 'pink'), ('name', 'is', 'red')]
+ }]
+ assert not Library.match(data, queries)
+
+ data = {'name': 'red', 'index': 3}
+ queries = [{
+ 'operator': 'and',
+ 'filters': [('name', 'is', 'red'), ('index', 'is', 3)]
+ }]
+ assert Library.match(data, queries)
+
+ data = {'name': 'red', 'index': 3}
+ queries = [{
+ 'operator': 'and',
+ 'filters': [('name', 'is', 'red'), ('index', 'is', '3')]
+ }]
+ assert not Library.match(data, queries)
+
+
+if __name__ == "__main__":
+ testsuite()
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/libraryitem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/libraryitem.py
new file mode 100644
index 0000000..94dd429
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/libraryitem.py
@@ -0,0 +1,913 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import os
+import shutil
+import logging
+from functools import partial
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+import studiolibrary
+import studiolibrary.widgets
+import studiolibrary.librarywindow
+
+import studioqt
+
+
+logger = logging.getLogger(__name__)
+
+
+class ItemError(Exception):
+ """"""
+
+
+class ItemSaveError(ItemError):
+ """"""
+
+
+class ItemLoadError(ItemError):
+ """"""
+
+
+class LibraryItemSignals(QtCore.QObject):
+ """"""
+ saved = QtCore.Signal(object)
+ saving = QtCore.Signal(object)
+ loaded = QtCore.Signal(object)
+ copied = QtCore.Signal(object, object, object)
+ deleted = QtCore.Signal(object)
+ renamed = QtCore.Signal(object, object, object)
+ dataChanged = QtCore.Signal(object)
+
+# Note: We will be changing the base class in the near future
+class LibraryItem(studiolibrary.widgets.Item):
+
+ NAME = ""
+ TYPE = ""
+ THUMBNAIL_PATH = studiolibrary.resource.get("icons", "thumbnail.png")
+
+ EXTENSION = ""
+ EXTENSIONS = []
+
+ ENABLE_DELETE = False
+ ENABLE_NESTED_ITEMS = False
+
+ SYNC_ORDER = 10
+ MENU_ORDER = 10
+
+ SAVE_WIDGET_CLASS = None
+ LOAD_WIDGET_CLASS = None
+
+ _libraryItemSignals = LibraryItemSignals()
+
+ saved = _libraryItemSignals.saved
+ saving = _libraryItemSignals.saving
+ loaded = _libraryItemSignals.loaded
+ copied = _libraryItemSignals.renamed
+ renamed = _libraryItemSignals.renamed
+ deleted = _libraryItemSignals.deleted
+ dataChanged = _libraryItemSignals.dataChanged
+
+ def createItemData(self):
+ """
+ Called when syncing the given path with the library cache.
+
+ :rtype: dict
+ """
+ import studiolibrary.library
+
+ path = self.path()
+ path = studiolibrary.latestVersionPath(path) or path
+
+ if studiolibrary.isVersionPath(path):
+ dirname = os.path.dirname(path)
+ name = os.path.basename(dirname)
+ dirname, basename, extension = studiolibrary.splitPath(dirname)
+ else:
+ dirname, basename, extension = studiolibrary.splitPath(path)
+ name = os.path.basename(path)
+
+ category = os.path.basename(dirname) or dirname
+ modified = ""
+
+ if os.path.exists(path):
+ modified = os.path.getmtime(path)
+
+ itemData = dict(self.readMetadata())
+
+ itemData.update({
+ "name": name,
+ "path": path,
+ "type": self.TYPE or extension,
+ "folder": dirname,
+ "category": category,
+ "modified": modified,
+ "__class__": self.__class__.__module__ + "." + self.__class__.__name__
+ })
+
+ return itemData
+
+ @classmethod
+ def createAction(cls, menu, libraryWindow):
+ """
+ Return the action to be displayed when the user
+ ks the "plus" icon.
+
+ :type menu: QtWidgets.QMenu
+ :type libraryWindow: studiolibrary.LibraryWindow
+ :rtype: QtCore.QAction
+ """
+ if cls.NAME:
+
+ icon = QtGui.QIcon(cls.ICON_PATH)
+ callback = partial(cls.showSaveWidget, libraryWindow)
+
+ action = QtWidgets.QAction(icon, cls.NAME, menu)
+ action.triggered.connect(callback)
+
+ return action
+
+ @classmethod
+ def showSaveWidget(cls, libraryWindow, item=None):
+ """
+ Show the create widget for creating a new item.
+
+ :type libraryWindow: studiolibrary.LibraryWindow
+ :type item: studiolibrary.LibraryItem or None
+ """
+ item = item or cls()
+ widget = cls.SAVE_WIDGET_CLASS(item=item)
+ libraryWindow.setCreateWidget(widget)
+
+ @classmethod
+ def isValidPath(cls, path):
+ """
+ This method has been deprecated.
+
+ Please use LibraryItem.match(cls, path)
+
+ :type path: str
+ :rtype: bool
+ """
+ return cls.match(path)
+
+ @classmethod
+ def match(cls, path):
+ """
+ Return True if the given path location is supported by the item.
+
+ :type path: str
+ :rtype: bool
+ """
+ extensions = cls.EXTENSIONS
+ if not extensions and cls.EXTENSION:
+ extensions = [cls.EXTENSION]
+
+ for ext in extensions:
+ if path.endswith(ext):
+ return True
+
+ return False
+
+ def __init__(
+ self,
+ path="",
+ library=None,
+ libraryWindow=None,
+ ):
+ """
+ The LibraryItem class provides an item for use with the LibraryWindow.
+
+ :type path: str
+ :type library: studiolibrary.Library or None
+ :type libraryWindow: studiolibrary.LibraryWindow or None
+ """
+ super(LibraryItem, self).__init__()
+
+ self._path = path
+ self._modal = None
+ self._library = None
+ self._metadata = None
+ self._libraryWindow = None
+
+ self._readOnly = False
+ self._ignoreExistsDialog = False
+
+ if libraryWindow:
+ self.setLibraryWindow(libraryWindow)
+
+ if library:
+ self.setLibrary(library)
+
+ # if path:
+ # self.setPath(path)
+
+ def updatePermissionsEnabled(self):
+ return False
+
+ def setReadOnly(self, readOnly):
+ """
+ Set the item to read only.
+
+ :type readOnly: bool
+ """
+ self._readOnly = readOnly
+
+ def isReadOnly(self):
+ """
+ Check if the item is read only.
+
+ :rtype: bool
+ """
+ if self.isLocked():
+ return True
+
+ return self._readOnly
+
+ def isLocked(self):
+ """
+ Check if the item has been locked by the window.
+
+ :rtype: bool
+ """
+ locked = False
+ if self.libraryWindow():
+ locked = self.libraryWindow().isLocked()
+ return locked
+
+ def isDeletable(self):
+ """
+ Check if the item is deletable.
+
+ :rtype: bool
+ """
+ if self.isLocked():
+ return False
+
+ return self.ENABLE_DELETE
+
+ def overwrite(self):
+ """
+ Show the save widget with the input fields populated.
+ """
+ self._ignoreExistsDialog = True
+ widget = self.showSaveWidget(self.libraryWindow(), item=self)
+
+ def loadSchema(self):
+ """
+ Get the options used to load the item.
+
+ :rtype: list[dict]
+ """
+ return []
+
+ def loadValidator(self, **kwargs):
+ """
+ Validate the current load options.
+
+ :type kwargs: dict
+ :rtype: list[dict]
+ """
+ return []
+
+ def load(self, *args, **kwargs):
+ """
+ Reimplement this method for loading item data.
+
+ :type args: list
+ :type kwargs: dict
+ """
+ raise NotImplementedError("The load method has not been implemented!")
+
+ def id(self):
+ """
+ Return the unique id for the item.
+
+ :rtype: str
+ """
+ return self.path()
+
+ def showToastMessage(self, text):
+ """
+ A convenience method for showing the toast widget with the given text.
+
+ :type text: str
+ """
+ if self.libraryWindow():
+ self.libraryWindow().showToastMessage(text)
+
+ def showErrorDialog(self, title, text):
+ """
+ Convenience method for showing an error dialog to the user.
+
+ :type title: str
+ :type text: str
+ :rtype: QMessageBox.StandardButton or None
+ """
+ if self.libraryWindow():
+ self.libraryWindow().showErrorMessage(text)
+
+ button = None
+
+ if not self._modal:
+ self._modal = True
+
+ try:
+ button = studiolibrary.widgets.MessageBox.critical(self.libraryWindow(), title, text)
+ finally:
+ self._modal = False
+
+ return button
+
+ def showExceptionDialog(self, title, error):
+ """
+ Convenience method for showing a question dialog to the user.
+
+ :type title: str
+ :type error: Exception
+ :rtype: QMessageBox.StandardButton
+ """
+ logger.exception(error)
+ return self.showErrorDialog(title, error)
+
+ def showQuestionDialog(self, title, text):
+ """
+ Convenience method for showing a question dialog to the user.
+
+ :type title: str
+ :type text: str
+ :rtype: QMessageBox.StandardButton
+ """
+ return studiolibrary.widgets.MessageBox.question(self.libraryWindow(), title, text)
+
+ def thumbnailPath(self):
+ """
+ Return the thumbnail location on disc for this item.
+
+ :rtype: str
+ """
+ thumbnailPath = self.path() + "/thumbnail.jpg"
+ if os.path.exists(thumbnailPath):
+ return thumbnailPath
+
+ thumbnailPath = thumbnailPath.replace(".jpg", ".png")
+ if os.path.exists(thumbnailPath):
+ return thumbnailPath
+
+ return self.THUMBNAIL_PATH
+
+ def isTHUMBNAIL_PATH(self):
+ """
+ Check if the thumbnail path is the default path.
+
+ :rtype: bool
+ """
+ return self.thumbnailPath() == self.THUMBNAIL_PATH
+
+ def showPreviewWidget(self, libraryWindow):
+ """
+ Show the preview Widget for the item instance.
+
+ :type libraryWindow: studiolibrary.LibraryWindow
+ """
+ widget = self.previewWidget(libraryWindow)
+ libraryWindow.setPreviewWidget(widget)
+
+ def previewWidget(self, libraryWindow):
+ """
+ Return the widget to be shown when the user clicks on the item.
+
+ :type libraryWindow: studiolibrary.LibraryWindow
+ :rtype: QtWidgets.QWidget or None
+ """
+ widget = None
+
+ if self.LOAD_WIDGET_CLASS:
+ widget = self.LOAD_WIDGET_CLASS(item=self)
+
+ return widget
+
+ def isVersionPath(self):
+ return studiolibrary.isVersionPath(self.path())
+
+ def contextEditMenu(self, menu, items=None):
+ """
+ Called when the user would like to edit the item from the menu.
+
+ The given menu is shown as a submenu of the main context menu.
+
+ :type menu: QtWidgets.QMenu
+ :type items: list[LibraryItem] or None
+ """
+ # Adding a blank icon fixes the text alignment issue when using Qt 5.12.+
+ icon = studiolibrary.resource.icon("blank")
+ enabled = not self.isVersionPath()
+
+ action = QtWidgets.QAction("Rename", menu)
+ action.setEnabled(enabled)
+ action.setIcon(icon)
+ action.triggered.connect(self.showRenameDialog)
+ menu.addAction(action)
+
+ action = QtWidgets.QAction("Move to", menu)
+ action.setEnabled(enabled)
+ action.triggered.connect(self.showMoveDialog)
+ menu.addAction(action)
+
+ action = QtWidgets.QAction("Copy Path", menu)
+ action.triggered.connect(self.copyPathToClipboard)
+ action.setEnabled(enabled)
+ menu.addAction(action)
+
+ if self.libraryWindow():
+ action = QtWidgets.QAction("Select Folder", menu)
+ action.triggered.connect(self.selectFolder)
+ menu.addAction(action)
+
+ action = QtWidgets.QAction("Show in Folder", menu)
+ action.triggered.connect(self.showInFolder)
+ menu.addAction(action)
+
+ if self.isDeletable():
+ menu.addSeparator()
+ action = QtWidgets.QAction("Delete", menu)
+ action.setEnabled(enabled)
+ action.triggered.connect(self.showDeleteDialog)
+ menu.addAction(action)
+
+ self.createOverwriteMenu(menu)
+
+ def createOverwriteMenu(self, menu):
+ """
+ Create a menu or action to trigger the overwrite method.
+
+ :type menu: QtWidgets.QMenu
+ """
+ if not self.isReadOnly():
+ enabled = not self.isVersionPath()
+ menu.addSeparator()
+ action = QtWidgets.QAction("Overwrite", menu)
+ action.setEnabled(enabled)
+ action.triggered.connect(self.overwrite)
+ menu.addAction(action)
+
+ def copyPathToClipboard(self):
+ """Copy the item path to the system clipboard."""
+ cb = QtWidgets.QApplication.clipboard()
+ cb.clear(mode=cb.Clipboard)
+ cb.setText(self.path(), mode=cb.Clipboard)
+
+ def contextMenu(self, menu, items=None):
+ """
+ Called when the user right clicks on the item.
+
+ :type menu: QtWidgets.QMenu
+ :type items: list[LibraryItem]
+ :rtype: None
+ """
+ pass
+
+ def showInFolder(self):
+ """Open the file explorer at the given path location."""
+ path = self.path()
+ studiolibrary.showInFolder(path)
+
+ def selectFolder(self):
+ """select the folder in the library widget"""
+ if self.libraryWindow():
+ path = '/'.join(studiolibrary.normPath(self.path()).split('/')[:-1])
+ self.libraryWindow().selectFolderPath(path)
+
+ def url(self):
+ """Used by the mime data when dragging/dropping the item."""
+ return QtCore.QUrl("file:///" + self.path())
+
+ def setLibraryWindow(self, libraryWindow):
+ """
+ Set the library widget containing the item.
+
+ :rtype: studiolibrary.LibraryWindow or None
+ """
+ self._libraryWindow = libraryWindow
+
+ def libraryWindow(self):
+ """
+ Return the library widget containing the item.
+
+ :rtype: studiolibrary.LibraryWindow or None
+ """
+ return self._libraryWindow
+
+ def setLibrary(self, library):
+ """
+ Set the library model for the item.
+
+ :type library: studiolibrary.Library
+ """
+ self._library = library
+
+ def library(self):
+ """
+ Return the library model for the item.
+
+ :rtype: studiolibrary.Library or None
+ """
+ if not self._library and self.libraryWindow():
+ return self.libraryWindow().library()
+
+ return self._library
+
+ def setIconPath(self, path):
+ """
+ Set the icon path for the current item.
+
+ :type path: str
+ :rtype: None
+ """
+ self._iconPath = path
+
+ def iconPath(self):
+ """
+ Return the icon path for the current item.
+
+ :rtype: None
+ """
+ return self._iconPath
+
+ def mimeText(self):
+ """
+ :rtype: str
+ """
+ return self.path()
+
+ def path(self):
+ """
+ Get the path for the item.
+
+ :rtype: str
+ """
+ return self._path
+
+ def setPath(self, path):
+ """
+ Set the path for the item.
+
+ :rtype: str
+ """
+ self._path = studiolibrary.normPath(path)
+
+ def setMetadata(self, metadata):
+ """
+ Set the given metadata for the item.
+
+ :type metadata: dict
+ """
+ self._metadata = metadata
+
+ def metadata(self):
+ """
+ Get the metadata for the item from disc.
+
+ :rtype: dict
+ """
+ return self._metadata
+
+ def updateMetadata(self, metadata):
+ """
+ Update the current metadata from disc with the given metadata.
+
+ :type metadata: dict
+ """
+ metadata_ = self.readMetadata()
+ metadata_.update(metadata)
+ self.saveMetadata(metadata_)
+
+ def saveMetadata(self, metadata):
+ """
+ Save the given metadata to disc.
+
+ :type metadata: dict
+ """
+ formatString = studiolibrary.config.get('metadataPath')
+ path = studiolibrary.formatPath(formatString, self.path())
+ studiolibrary.saveJson(path, metadata)
+
+ if self.updatePermissionsEnabled():
+ self.library().updatePermissions(path)
+
+ self.setMetadata(metadata)
+ self.syncItemData(emitDataChanged=False)
+ self.dataChanged.emit(self)
+
+ def readMetadata(self):
+ """
+ Read the metadata for the item from disc.
+
+ :rtype: dict
+ """
+ if self._metadata is None:
+ formatString = studiolibrary.config.get('metadataPath')
+ path = studiolibrary.formatPath(formatString, self.path())
+
+ if os.path.exists(path):
+ self._metadata = studiolibrary.readJson(path)
+ else:
+ self._metadata = {}
+
+ return self._metadata
+
+ def syncItemData(self, emitDataChanged=True):
+ """Sync the item data to the database."""
+ data = self.createItemData()
+ self.setItemData(data)
+
+ if self.library():
+ self.library().saveItemData([self], emitDataChanged=emitDataChanged)
+
+ def saveSchema(self):
+ """
+ Get the schema used for saving the item.
+
+ :rtype: list[dict]
+ """
+ return []
+
+ def saveValidator(self, **fields):
+ """
+ Validate the given save fields.
+
+ :type fields: dict
+ :rtype: list[dict]
+ """
+ return []
+
+ @studioqt.showWaitCursor
+ def safeSave(self, *args, **kwargs):
+ """
+ Safe save the item.
+ """
+ dst = self.path()
+
+ if dst and not dst.endswith(self.EXTENSION):
+ dst += self.EXTENSION
+
+ self.setPath(dst)
+
+ logger.debug(u'Item Saving: {0}'.format(dst))
+ self.saving.emit(self)
+
+ if os.path.exists(dst):
+ if studiolibrary.latestVersionPath(self.path()):
+ raise NameError("You can only save items that were "
+ "created using Studio Library version 2!")
+ elif self._ignoreExistsDialog:
+ self._moveToTrash()
+ else:
+ self.showAlreadyExistsDialog()
+
+ tmp = studiolibrary.createTempPath(self.__class__.__name__)
+
+ self.setPath(tmp)
+
+ self.save(*args, **kwargs)
+
+ shutil.move(tmp, dst)
+ self.setPath(dst)
+
+ if self.updatePermissionsEnabled():
+ self.library().updatePermissions(dst)
+
+ self.syncItemData()
+
+ if self.libraryWindow():
+ self.libraryWindow().selectItems([self])
+
+ self.saved.emit(self)
+ logger.debug(u'Item Saved: {0}'.format(dst))
+
+ def save(self, *args, **kwargs):
+ """
+ Save the item io data to the given path.
+
+ :type args: list
+ :type kwargs: dict
+ """
+ raise NotImplementedError("The save method has not been implemented!")
+
+ # -----------------------------------------------------------------
+ # Support for copy and rename
+ # -----------------------------------------------------------------
+
+ def delete(self):
+ """
+ Delete the item from disc and the library model.
+
+ :rtype: None
+ """
+ studiolibrary.removePath(self.path())
+
+ if self.library():
+ self.library().removePath(self.path())
+
+ self.deleted.emit(self)
+
+ def copy(self, dst):
+ """
+ Make a copy/duplicate the current item to the given destination.
+
+ :type dst: str
+ :rtype: None
+ """
+ src = self.path()
+ dst = studiolibrary.copyPath(src, dst)
+
+ if self.library():
+ self.library().copyPath(src, dst)
+
+ self.copied.emit(self, src, dst)
+
+ if self.libraryWindow():
+ self.libraryWindow().refresh()
+
+ def move(self, dst):
+ """
+ Move the current item to the given destination.
+
+ :type dst: str
+ :rtype: None
+ """
+ self.rename(dst)
+
+ def rename(self, dst, extension=None):
+ """
+ Rename the current path to the given destination path.
+
+ :type dst: str
+ :type extension: bool or None
+ :rtype: None
+ """
+ extension = extension or self.EXTENSION
+ if dst and extension not in dst:
+ dst += extension
+
+ src = self.path()
+
+ # Rename the path on the filesystem
+ dst = studiolibrary.renamePath(src, dst)
+
+ # Rename the path inside the library database
+ if self.library():
+ self.library().renamePath(src, dst)
+
+ self._path = dst
+
+ self.syncItemData()
+
+ self.renamed.emit(self, src, dst)
+
+ def showRenameDialog(self, parent=None):
+ """
+ Show the rename dialog.
+
+ :type parent: QtWidgets.QWidget
+ """
+ if self.isVersionPath():
+ raise NameError("You can only rename items that were "
+ "created using Studio Library version 2!")
+
+ select = False
+
+ if self.libraryWindow():
+ parent = parent or self.libraryWindow()
+ select = self.libraryWindow().selectedFolderPath() == self.path()
+
+ name, button = studiolibrary.widgets.MessageBox.input(
+ parent,
+ "Rename item",
+ "Rename the current item to:",
+ inputText=self.name(),
+ buttons=[
+ ("Rename", QtWidgets.QDialogButtonBox.AcceptRole),
+ ("Cancel", QtWidgets.QDialogButtonBox.RejectRole)
+ ]
+ )
+
+ if button == "Rename":
+ try:
+ self.rename(name)
+
+ if select:
+ self.libraryWindow().selectFolderPath(self.path())
+
+ except Exception as error:
+ self.showExceptionDialog("Rename Error", error)
+ raise
+
+ return button
+
+ def showMoveDialog(self, parent=None):
+ """
+ Show the move to browser dialog.
+
+ :type parent: QtWidgets.QWidget
+ """
+ if self.isVersionPath():
+ raise NameError("You can only move items that were "
+ "created using Studio Library version 2!")
+
+ title = "Move To..."
+ path = os.path.dirname(os.path.dirname(self.path()))
+
+ dst = QtWidgets.QFileDialog.getExistingDirectory(None, title, path)
+
+ if dst:
+ dst = "{}/{}".format(dst, os.path.basename(self.path()))
+ try:
+ self.move(dst)
+ except Exception as error:
+ self.showExceptionDialog("Move Error", error)
+ raise
+
+ def showDeleteDialog(self):
+ """
+ Show the delete item dialog.
+
+ :rtype: None
+ """
+ if self.isVersionPath():
+ raise NameError("You can only delete items that were "
+ "created using Studio Library version 2!")
+
+ text = 'Are you sure you want to delete this item?'
+
+ button = self.showQuestionDialog("Delete Item", text)
+
+ if button == QtWidgets.QDialogButtonBox.Yes:
+ try:
+ self.delete()
+ except Exception as error:
+ self.showExceptionDialog("Delete Error", error)
+ raise
+
+ def showAlreadyExistsDialog(self):
+ """
+ Show a warning dialog if the item already exists on save.
+
+ :rtype: None
+ """
+ if self.isVersionPath():
+ raise NameError("You can only override items that were "
+ "created using Studio Library version 2!")
+
+ if not self.libraryWindow():
+ raise ItemSaveError("Item already exists!")
+
+ title = "Item already exists"
+ text = 'Would you like to move the existing item "{}" to the trash?'
+ text = text.format(os.path.basename(self.path()))
+
+ buttons = [
+ QtWidgets.QDialogButtonBox.Yes,
+ QtWidgets.QDialogButtonBox.Cancel
+ ]
+
+ try:
+ QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.ArrowCursor)
+ button = self.libraryWindow().showQuestionDialog(title, text, buttons)
+ finally:
+ QtWidgets.QApplication.restoreOverrideCursor()
+
+ if button == QtWidgets.QDialogButtonBox.Yes:
+ self._moveToTrash()
+ else:
+ raise ItemSaveError("You cannot save over an existing item.")
+
+ return button
+
+ # -----------------------------------------------------------------
+ # Support for painting the type icon
+ # -----------------------------------------------------------------
+
+ def _moveToTrash(self):
+ """
+ Move the current item to the trash.
+
+ This method should only be used when saving.
+ """
+ path = self.path()
+ library = self.library()
+ item = studiolibrary.LibraryItem(path, library=library)
+ self.libraryWindow().moveItemsToTrash([item])
+ # self.setPath(path)
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/librarywindow.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/librarywindow.py
new file mode 100644
index 0000000..ef3f41d
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/librarywindow.py
@@ -0,0 +1,2787 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import re
+import os
+import time
+import copy
+import logging
+import webbrowser
+from functools import partial
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+import studioqt
+import studiolibrary
+import studiolibrary.widgets
+
+
+__all__ = ["LibraryWindow"]
+
+
+logger = logging.getLogger(__name__)
+
+
+class PreviewFrame(QtWidgets.QFrame):
+ pass
+
+
+class SidebarFrame(QtWidgets.QFrame):
+ pass
+
+
+class GlobalSignal(QtCore.QObject):
+ """
+ Triggered for all library instance.
+ """
+ folderSelectionChanged = QtCore.Signal(object, object)
+
+
+class CheckForUpdate(QtCore.QThread):
+
+ finished = QtCore.Signal(object)
+
+ def __init__(self, url):
+ super(CheckForUpdate, self).__init__()
+ self.url = url
+
+ def run(self):
+ info = studiolibrary.checkForUpdates()
+ self.finished.emit(info)
+
+
+class LibraryWindow(QtWidgets.QWidget):
+
+ _instances = {}
+
+ DEFAULT_NAME = "Default"
+ DEFAULT_SETTINGS = {
+ "library": {
+ "sortBy": ["name:asc"],
+ "groupBy": ["category:asc"]
+ },
+ "paneSizes": [130, 280, 180],
+ "geometry": [-1, -1, 820, 780],
+ "trashFolderVisible": False,
+ "sidebarWidgetVisible": True,
+ "previewWidgetVisible": True,
+ "menuBarWidgetVisible": True,
+ "statusBarWidgetVisible": True,
+ "recursiveSearchEnabled": True,
+ "itemsWidget": {
+ "spacing": 2,
+ "padding": 6,
+ "zoomAmount": 80,
+ "textVisible": True,
+ },
+ "searchWidget": {
+ "text": "",
+ },
+ "filterByMenu": {
+ "Folder": False
+ },
+ "theme": {
+ "accentColor": "rgb(60, 160, 210)",
+ "backgroundColor": "rgb(50, 50, 60)",
+ }
+ }
+
+ TRASH_ENABLED = True
+ TEMP_PATH_MENU_ENABLED = False
+
+ DPI_ENABLED = studiolibrary.config.get("scaleFactorEnabled", False)
+
+ ICON_COLOR = QtGui.QColor(255, 255, 255, 200)
+ ICON_BADGE_COLOR = QtGui.QColor(230, 230, 0)
+
+ # Customize widget classes
+ SORTBY_MENU_CLASS = studiolibrary.widgets.SortByMenu
+ GROUPBY_MENU_CLASS = studiolibrary.widgets.GroupByMenu
+ FILTERBY_MENU_CLASS = studiolibrary.widgets.FilterByMenu
+
+ ITEMS_WIDGET_CLASS = studiolibrary.widgets.ItemsWidget
+ SEARCH_WIDGET_CLASS = studiolibrary.widgets.SearchWidget
+ STATUS_WIDGET_CLASS = studiolibrary.widgets.StatusWidget
+ MENUBAR_WIDGET_CLASS = studiolibrary.widgets.MenuBarWidget
+ SIDEBAR_WIDGET_CLASS = studiolibrary.widgets.SidebarWidget
+
+ # Customize library classe
+ LIBRARY_CLASS = studiolibrary.Library
+
+ globalSignal = GlobalSignal()
+
+ # Local signal
+ loaded = QtCore.Signal()
+ lockChanged = QtCore.Signal(object)
+
+ itemRenamed = QtCore.Signal(str, str)
+ itemSelectionChanged = QtCore.Signal(object)
+
+ folderRenamed = QtCore.Signal(str, str)
+ folderSelectionChanged = QtCore.Signal(object)
+
+ @staticmethod
+ def instances():
+ """
+ Return all the LibraryWindow instances that have been initialised.
+
+ :rtype: list[LibraryWindow]
+ """
+ return LibraryWindow._instances.values()
+
+ @staticmethod
+ def destroyInstances():
+ """Delete all library widget instances."""
+ for widget in LibraryWindow.instances():
+ widget.destroy()
+
+ LibraryWindow._instances = {}
+
+ @classmethod
+ def instance(
+ cls,
+ name="",
+ path="",
+ show=True,
+ lock=False,
+ superusers=None,
+ lockRegExp=None,
+ unlockRegExp=None,
+ **kwargs
+ ):
+ """
+ Return the library widget for the given name.
+
+ :type name: str
+ :type path: str
+ :type show: bool
+ :type lock: bool
+ :type superusers: list[str]
+ :type lockRegExp: str
+ :type unlockRegExp: str
+
+ :rtype: LibraryWindow
+ """
+ name = name or studiolibrary.defaultLibrary()
+
+ libraryWindow = LibraryWindow._instances.get(name)
+
+ if not libraryWindow:
+ studioqt.installFonts(studiolibrary.resource.get("fonts"))
+ libraryWindow = cls(name=name)
+ LibraryWindow._instances[name] = libraryWindow
+
+ kwargs_ = {
+ "lock": lock,
+ "show": show,
+ "superusers": superusers,
+ "lockRegExp": lockRegExp,
+ "unlockRegExp": unlockRegExp
+ }
+
+ libraryWindow.setKwargs(kwargs_)
+ libraryWindow.setLocked(lock)
+ libraryWindow.setSuperusers(superusers)
+ libraryWindow.setLockRegExp(lockRegExp)
+ libraryWindow.setUnlockRegExp(unlockRegExp)
+
+ if path:
+ libraryWindow.setPath(path)
+
+ if show:
+ libraryWindow.show(**kwargs)
+
+ return libraryWindow
+
+ def __init__(self, parent=None, name="", path=""):
+ """
+ Create a new instance of the Library Widget.
+
+ :type parent: QtWidgets.QWidget or None
+ :type name: str
+ :type path: str
+ """
+ QtWidgets.QWidget.__init__(self, parent)
+
+ self.setObjectName("studiolibrary")
+
+ version = studiolibrary.version()
+
+ self.setWindowIcon(studiolibrary.resource.icon("icon_black"))
+
+ self._dpi = 1.0
+ self._path = ""
+ self._items = []
+ self._name = name or self.DEFAULT_NAME
+ self._theme = None
+ self._kwargs = {}
+ self._isDebug = False
+ self._isLocked = False
+ self._isLoaded = False
+ self._previewWidget = None
+ self._currentItem = None
+ self._library = None
+ self._lightbox = None
+ self._refreshEnabled = False
+ self._progressBar = None
+ self._superusers = None
+ self._lockRegExp = None
+ self._unlockRegExp = None
+ self._settingsWidget = None
+
+ self._updateInfo = {}
+ self._checkForUpdateThread = CheckForUpdate(self)
+ self._checkForUpdateThread.finished.connect(self.checkForUpdateFinished)
+ self._checkForUpdateEnabled = True
+
+ self._trashEnabled = self.TRASH_ENABLED
+
+ self._itemsHiddenCount = 0
+ self._itemsVisibleCount = 0
+
+ self._isTrashFolderVisible = False
+ self._sidebarWidgetVisible = True
+ self._previewWidgetVisible = True
+ self._statusBarWidgetVisible = True
+
+ # --------------------------------------------------------------------
+ # Create Widgets
+ # --------------------------------------------------------------------
+
+ library = self.LIBRARY_CLASS(libraryWindow=self)
+ library.dataChanged.connect(self.refresh)
+ library.searchTimeFinished.connect(self._searchFinished)
+
+ self._sidebarFrame = SidebarFrame(self)
+ self._previewFrame = PreviewFrame(self)
+
+ self._itemsWidget = self.ITEMS_WIDGET_CLASS(self)
+ self._itemsWidget.installEventFilter(self)
+ self._itemsWidget.keyPressed.connect(self._keyPressed)
+
+ tip = "Search all current items."
+ self._searchWidget = self.SEARCH_WIDGET_CLASS(self)
+ self._searchWidget.setToolTip(tip)
+ self._searchWidget.setStatusTip(tip)
+
+ self._filterByMenu = self.FILTERBY_MENU_CLASS(self)
+ self._statusWidget = self.STATUS_WIDGET_CLASS(self)
+
+ # Add the update available button to the status widget
+ self._updateAvailableButton = QtWidgets.QPushButton(self._statusWidget)
+ self._updateAvailableButton.setObjectName("updateAvailableButton")
+ self._updateAvailableButton.setText("Update Available")
+ self._updateAvailableButton.setCursor(QtCore.Qt.PointingHandCursor)
+ self._updateAvailableButton.hide()
+ self._updateAvailableButton.clicked.connect(self.openReleasesUrl)
+
+ self.statusWidget().layout().addWidget(self._updateAvailableButton)
+
+ self._menuBarWidget = self.MENUBAR_WIDGET_CLASS(self)
+ self._sidebarWidget = self.SIDEBAR_WIDGET_CLASS(self)
+
+ self._filterByMenu.setDataset(library)
+ self._itemsWidget.setDataset(library)
+ self._searchWidget.setDataset(library)
+ self._sidebarWidget.setDataset(library)
+
+ self.setLibrary(library)
+
+ # --------------------------------------------------------------------
+ # Setup the menu bar buttons
+ # --------------------------------------------------------------------
+
+ iconColor = self.iconColor()
+
+ name = "New Item"
+ icon = studiolibrary.resource.icon("plus")
+ tip = "Add a new item to the selected folder"
+ self.addMenuBarAction(name, icon, tip, callback=self.showNewMenu)
+ self._menuBarWidget.addWidget(self._searchWidget)
+
+ name = "Filters"
+ icon = studiolibrary.resource.icon("filter")
+ tip = "Filter the current results by type.\n" \
+ "CTRL + Click will hide the others and show the selected one."
+ action = self.addMenuBarAction(name, icon, tip, callback=self.showFilterByMenu)
+
+ name = "Item View"
+ icon = studiolibrary.resource.icon("sliders")
+ tip = "Change the style of the item view"
+ self.addMenuBarAction(name, icon, tip, callback=self.showItemViewMenu)
+
+ name = "View"
+ icon = studiolibrary.resource.icon("columns-3")
+ tip = "Choose to show/hide both the preview and navigation pane.\n" \
+ "CTRL + Click will hide the menu bar as well."
+ self.addMenuBarAction(name, icon, tip, callback=self.toggleView)
+
+ name = "Sync items"
+ icon = studiolibrary.resource.icon("arrows-rotate")
+ tip = "Sync with the filesystem"
+ self.addMenuBarAction(name, icon, tip, callback=self.sync)
+
+ name = "Settings"
+ icon = studiolibrary.resource.icon("bars")
+ tip = "Settings menu"
+ self.addMenuBarAction(name, icon, tip, callback=self.showSettingsMenu)
+
+ # -------------------------------------------------------------------
+ # Setup Layout
+ # -------------------------------------------------------------------
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.setSpacing(0)
+ layout.setContentsMargins(0, 0, 0, 0)
+ self.setLayout(layout)
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.setContentsMargins(0, 1, 0, 0)
+ self._previewFrame.setLayout(layout)
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.setContentsMargins(0, 1, 0, 0)
+
+ self._sidebarFrame.setLayout(layout)
+ self._sidebarFrame.layout().addWidget(self._sidebarWidget)
+
+ self._splitter = QtWidgets.QSplitter(QtCore.Qt.Horizontal, self)
+ self._splitter.setSizePolicy(QtWidgets.QSizePolicy.Ignored,
+ QtWidgets.QSizePolicy.Expanding)
+ self._splitter.setHandleWidth(2)
+ self._splitter.setChildrenCollapsible(False)
+
+ self._splitter.insertWidget(0, self._sidebarFrame)
+ self._splitter.insertWidget(1, self._itemsWidget)
+ self._splitter.insertWidget(2, self._previewFrame)
+
+ self._splitter.setStretchFactor(0, False)
+ self._splitter.setStretchFactor(1, True)
+ self._splitter.setStretchFactor(2, False)
+
+ self.layout().addWidget(self._menuBarWidget)
+ self.layout().addWidget(self._splitter)
+ self.layout().addWidget(self._statusWidget)
+
+ vbox = QtWidgets.QVBoxLayout()
+ self._previewFrame.setLayout(vbox)
+ self._previewFrame.layout().setSpacing(0)
+ self._previewFrame.layout().setContentsMargins(0, 0, 0, 0)
+ self._previewFrame.setMinimumWidth(5)
+
+ # -------------------------------------------------------------------
+ # Setup Connections
+ # -------------------------------------------------------------------
+
+ itemsWidget = self.itemsWidget()
+ itemsWidget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
+ itemsWidget.itemMoved.connect(self._itemMoved)
+ itemsWidget.itemDropped.connect(self._itemDropped)
+ itemsWidget.itemSelectionChanged.connect(self._itemSelectionChanged)
+ itemsWidget.customContextMenuRequested.connect(self.showItemsContextMenu)
+
+ sidebarWidget = self.sidebarWidget()
+ sidebarWidget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
+ sidebarWidget.itemDropped.connect(self._itemDropped)
+ sidebarWidget.itemSelectionChanged.connect(self._folderSelectionChanged)
+ sidebarWidget.customContextMenuRequested.connect(self.showFolderMenu)
+ sidebarWidget.settingsMenuRequested.connect(self._foldersMenuRequested)
+
+ self.folderSelectionChanged.connect(self.updateLock)
+
+ self.updateMenuBar()
+ self.updatePreviewWidget()
+
+ if path:
+ self.setPath(path)
+
+ def _keyPressed(self, event):
+ """
+ Triggered from the items widget on key press event.
+
+ :type event: QKeyEvent
+ """
+ text = event.text().strip()
+
+ if not text.isalpha() and not text.isdigit():
+ return
+
+ if text and not self.searchWidget().hasFocus():
+ self.searchWidget().setFocus()
+ self.searchWidget().setText(text)
+
+ def _searchFinished(self):
+ self.showRefreshMessage()
+
+ def _foldersMenuRequested(self, menu):
+ """
+ Triggered when the folders settings menu has been requested.
+
+ :type menu: QtWidgets.QMenu
+ """
+ # Adding a blank icon fixes the text alignment issue when using Qt 5.12.+
+ icon = studiolibrary.resource.icon("blank")
+
+ action = QtWidgets.QAction("Change Path", menu)
+ action.triggered.connect(self.showChangePathDialog)
+ action.setIcon(icon)
+
+ menu.addAction(action)
+ menu.addSeparator()
+
+ def _itemMoved(self, item):
+ """
+ Triggered when the custom order has changed.
+
+ :type item: studiolibrary.LibraryItem
+ :rtype: None
+ """
+ self.saveCustomOrder()
+
+ def _itemSelectionChanged(self):
+ """
+ Triggered when an item is selected or deselected.
+
+ :rtype: None
+ """
+ item = self.itemsWidget().selectedItem()
+
+ self.setPreviewWidgetFromItem(item)
+ self.itemSelectionChanged.emit(item)
+
+ def _itemDropped(self, event):
+ """
+ Triggered when items are dropped on the items widget or sidebar widget.
+
+ :type event: QtCore.QEvent
+ :rtype: None
+ """
+ mimeData = event.mimeData()
+
+ if mimeData.hasUrls():
+ urls = mimeData.urls()
+ path = self.selectedFolderPath()
+ items = self.createItemsFromUrls(urls)
+
+ if self.isMoveItemsEnabled():
+ self.showMoveItemsDialog(items, dst=path)
+
+ elif not self.isCustomOrderEnabled():
+ msg = 'Please sort by "Custom Order" to reorder items!'
+ self.showInfoMessage(msg)
+
+ def _folderSelectionChanged(self):
+ """
+ Triggered when a folder is selected or deselected.
+
+ :rtype: None
+ """
+ path = self.selectedFolderPath()
+ self.folderSelectionChanged.emit(path)
+ self.globalSignal.folderSelectionChanged.emit(self, path)
+
+ def isUpdateAvailable(self):
+ return self._updateAvailable
+
+ def checkForUpdate(self):
+ """Check if there are any new versions available."""
+ self._updateAvailableButton.hide()
+ if self.isCheckForUpdateEnabled():
+ self._checkForUpdateThread.start()
+
+ def checkForUpdateFinished(self, info):
+ """Triggered when the check for update thread has finished."""
+ self._updateInfo = info or {}
+ if self._updateInfo.get("updateFound"):
+ self._updateAvailableButton.show()
+ else:
+ self._updateAvailableButton.hide()
+
+ def destroy(self):
+ """Destroy the current library window instance."""
+ self.hide()
+ self.closePreviewWidget()
+ self.close()
+ self.itemsWidget().clear()
+ self.library().clear()
+ super(LibraryWindow, self).destroy()
+
+ def setKwargs(self, kwargs):
+ """
+ Set the key word arguments used to open the window.
+
+ :type kwargs: dict
+ """
+ self._kwargs.update(kwargs)
+
+ def library(self):
+ """
+ Return the library model object.
+
+ :rtype: studiolibrary.Library
+ """
+ return self._library
+
+ def setLibrary(self, library):
+ """
+ Set the library model.
+
+ :type library: studiolibrary.Library
+ :rtype: None
+ """
+ self._library = library
+
+ def statusWidget(self):
+ """
+ Return the status widget.
+
+ :rtype: studioqt.StatusWidget
+ """
+ return self._statusWidget
+
+ def searchWidget(self):
+ """
+ Return the search widget.
+
+ :rtype: studioqt.SearchWidget
+ """
+ return self._searchWidget
+
+ def menuBarWidget(self):
+ """
+ Return the menu bar widget.
+
+ :rtype: MenuBarWidget
+ """
+ return self._menuBarWidget
+
+ def name(self):
+ """
+ Return the name of the library.
+
+ :rtype: str
+ """
+ return self._name
+
+ def path(self):
+ """
+ Return the root path for the library.
+
+ :rtype: str
+ """
+ return self._path
+
+ def setPath(self, path):
+ """
+ Set the root path for the library.
+
+ :type path: str
+ :rtype: None
+ """
+ path = studiolibrary.realPath(path)
+
+ if path == self.path():
+ logger.debug("The root path is already set.")
+ return
+
+ self._path = path
+
+ library = self.library()
+ library.setPath(path)
+
+ if not os.path.exists(library.databasePath()):
+ self.sync()
+
+ self.refresh()
+ self.library().search()
+ self.updatePreviewWidget()
+
+ @studioqt.showArrowCursor
+ def showPathErrorDialog(self):
+ """
+ Called when the current root path doesn't exist on refresh.
+
+ :rtype: None
+ """
+ path = self.path()
+
+ title = "Path Error"
+
+ text = 'The current root path does not exist "{path}". ' \
+ 'Please select a new root path to continue.'
+
+ text = text.format(path=path)
+
+ dialog = studiolibrary.widgets.createMessageBox(self, title, text)
+
+ dialog.setHeaderColor("rgb(230, 80, 80)")
+ dialog.show()
+
+ dialog.accepted.connect(self.showChangePathDialog)
+
+ @studioqt.showArrowCursor
+ def showWelcomeDialog(self):
+ """
+ Called when there is no root path set for the library.
+
+ :rtype: None
+ """
+ name = self.name()
+
+ title = "Welcome"
+ title = title.format(studiolibrary.version(), name)
+ text = "Before you get started please choose a folder " \
+ "location for storing the data. A network folder is " \
+ "recommended for sharing within a studio."
+
+ dialog = studiolibrary.widgets.createMessageBox(self, title, text)
+ dialog.show()
+
+ dialog.accepted.connect(self.showChangePathDialog)
+
+ def showChangePathDialog(self):
+ """
+ Show a file browser dialog for changing the root path.
+
+ :rtype: None
+ """
+ path = self._showChangePathDialog()
+ if path:
+ self.setPath(path)
+ else:
+ self.refresh()
+
+ @studioqt.showArrowCursor
+ def _showChangePathDialog(self):
+ """
+ Open the file dialog for setting a new root path.
+
+ :rtype: str
+ """
+ path = self.path()
+
+ if not path:
+ path = os.path.expanduser("~")
+
+ path = QtWidgets.QFileDialog.getExistingDirectory(
+ None,
+ "Choose a root folder location",
+ path
+ )
+
+ return studiolibrary.normPath(path)
+
+ def isRefreshEnabled(self):
+ """
+ Return True if the LibraryWindow can be refreshed.
+
+ :rtype: bool
+ """
+ return self._refreshEnabled
+
+ def setRefreshEnabled(self, enable):
+ """
+ If enable is False, all updates will be ignored.
+
+ :rtype: bool
+ """
+ self.library().setSearchEnabled(enable)
+ self._refreshEnabled = enable
+
+ @studioqt.showWaitCursor
+ def sync(self):
+ """
+ Sync any data that might be out of date with the model.
+
+ :rtype: None
+ """
+ progressBar = self.statusWidget().progressBar()
+
+ @studioqt.showWaitCursor
+ def _sync():
+ elapsedTime = time.time()
+ self.library().sync(progressCallback=self.setProgressBarValue)
+
+ elapsedTime = time.time() - elapsedTime
+
+ msg = "Synced items in {0:.3f} seconds."
+ msg = msg.format(elapsedTime)
+
+ self.statusWidget().showInfoMessage(msg)
+ self.setProgressBarValue("Done")
+
+ studioqt.fadeOut(progressBar, duration=500, onFinished=progressBar.close)
+
+ self.setProgressBarValue("Syncing")
+ studioqt.fadeIn(progressBar, duration=1, onFinished=_sync)
+
+ progressBar.show()
+
+ def setProgressBarValue(self, label, value=-1):
+ """Set the progress bar label and value"""
+
+ progressBar = self.statusWidget().progressBar()
+
+ if value == -1:
+ self.statusWidget().progressBar().reset()
+ value = 100
+
+ progressBar.setValue(value)
+ progressBar.setText(label)
+
+ def refresh(self):
+ """
+ Refresh all sidebar items and library items.
+
+ :rtype: None
+ """
+ if self.isRefreshEnabled():
+ self.update()
+
+ def update(self):
+ """Update the library widget and the data. """
+ self.refreshSidebar()
+ self.updateWindowTitle()
+
+ # -----------------------------------------------------------------
+ # Methods for the sidebar widget
+ # -----------------------------------------------------------------
+
+ def sidebarWidget(self):
+ """
+ Return the sidebar widget.
+
+ :rtype: studioqt.SidebarWidget
+ """
+ return self._sidebarWidget
+
+ def selectedFolderPath(self):
+ """
+ Return the selected folder items.
+
+ :rtype: str or None
+ """
+ return self.sidebarWidget().selectedPath()
+
+ def selectedFolderPaths(self):
+ """
+ Return the selected folder items.
+
+ :rtype: list[str]
+ """
+ return self.sidebarWidget().selectedPaths()
+
+ def selectFolderPath(self, path):
+ """
+ Select the given folder paths.
+
+ :type path: str
+ :rtype: None
+ """
+ self.selectFolderPaths([path])
+
+ def selectFolderPaths(self, paths):
+ """
+ Select the given folder paths.
+
+ :type paths: list[str]
+ :rtype: None
+ """
+ self.sidebarWidget().selectPaths(paths)
+
+ @studioqt.showWaitCursor
+ def refreshSidebar(self):
+ """
+ Refresh the state of the sidebar widget.
+
+ :rtype: None
+ """
+ path = self.path()
+
+ if not path:
+ return self.showWelcomeDialog()
+ elif not os.path.exists(path):
+ return self.showPathErrorDialog()
+
+ self.updateSidebar()
+
+ def updateSidebar(self):
+ """
+ Update the folders to be shown in the folders widget.
+
+ :rtype: None
+ """
+ data = {}
+ root = self.path()
+
+ queries = [{'filters': [('type', 'is', 'Folder')]}]
+
+ items = self.library().findItems(queries)
+
+ for item in items:
+ data[item.path()] = item.itemData()
+
+ self.sidebarWidget().setData(data, root=root)
+
+ def setFolderData(self, path, data):
+ """
+ Convenience method for setting folder data.
+
+ :type path: str
+ :type data: dict
+ """
+ self.sidebarWidget().setItemData(path, data)
+
+ def createFolderContextMenu(self):
+ """
+ Return the folder menu for the selected folders.
+
+ :rtype: QtWidgets.QMenu
+ """
+
+ path = self.selectedFolderPath()
+
+ items = []
+
+ if path:
+ queries = [{"filters": [("path", "is", path)]}]
+
+ items = self.library().findItems(queries)
+
+ if items:
+ self._items_ = items
+
+ return self.createItemContextMenu(items)
+
+ # -----------------------------------------------------------------
+ # Methods for the items widget
+ # -----------------------------------------------------------------
+
+ def itemsWidget(self):
+ """
+ Return the widget the contains all the items.
+
+ :rtype: studiolibrary.widgets.ItemsWidget
+ """
+ return self._itemsWidget
+
+ def selectPath(self, path):
+ """
+ Select the item with the given path.
+
+ :type path: str
+ :rtype: None
+ """
+ self.selectPaths([path])
+
+ def selectPaths(self, paths):
+ """
+ Select items with the given paths.
+
+ :type paths: list[str]
+ :rtype: None
+ """
+ selection = self.selectedItems()
+
+ self.clearPreviewWidget()
+ self.itemsWidget().clearSelection()
+ self.itemsWidget().selectPaths(paths)
+
+ if self.selectedItems() != selection:
+ self._itemSelectionChanged()
+
+ def selectItems(self, items):
+ """
+ Select the given items.
+
+ :type items: list[studiolibrary.LibraryItem]
+ :rtype: None
+ """
+ paths = [item.path() for item in items]
+ self.selectPaths(paths)
+
+ def scrollToSelectedItem(self):
+ """
+ Scroll the item widget to the selected item.
+
+ :rtype: None
+ """
+ self.itemsWidget().scrollToSelectedItem()
+
+ def refreshSelection(self):
+ """
+ Refresh the current item selection.
+
+ :rtype: None
+ """
+ items = self.selectedItems()
+ self.itemsWidget().clearSelection()
+ self.selectItems(items)
+
+ def selectedItems(self):
+ """
+ Return the selected items.
+
+ :rtype: list[studiolibrary.LibraryItem]
+ """
+ return self._itemsWidget.selectedItems()
+
+ def clearItems(self):
+ """
+ Remove all the loaded items.
+
+ :rtype: list[studiolibrary.LibraryItem]
+ """
+ self.itemsWidget().clear()
+
+ def items(self):
+ """
+ Return all the loaded items.
+
+ :rtype: list[studiolibrary.LibraryItem]
+ """
+ return self._items
+
+ def addItem(self, item, select=False):
+ """
+ Add the given item to the itemsWidget.
+
+ :type item: studiolibrary.LibraryItem
+ :type select: bool
+
+ :rtype: None
+ """
+ self.addItems([item], select=select)
+
+ def addItems(self, items, select=False):
+ """
+ Add the given items to the itemsWidget.
+
+ :type items: list[studiolibrary.LibraryItem]
+ :type select: bool
+
+ :rtype: None
+ """
+ self.itemsWidget().addItems(items)
+ self._items.extend(items)
+
+ if select:
+ self.selectItems(items)
+ self.scrollToSelectedItem()
+
+ def createItemsFromUrls(self, urls):
+ """
+ Return a new list of items from the given urls.
+
+ :rtype: list[studiolibrary.LibraryItem]
+ """
+ return self.library().itemsFromUrls(urls, libraryWindow=self)
+
+ # -----------------------------------------------------------------
+ # Support for custom context menus
+ # -----------------------------------------------------------------
+
+ def addMenuBarAction(self, name, icon, tip, callback=None):
+ """
+ Add a button/action to menu bar widget.
+
+ :type name: str
+ :type icon: QtWidget.QIcon
+ :type tip: str
+ :type callback: func
+ :type: QtWidget.QAction
+ """
+
+ # The method below is needed to fix an issue with PySide2.
+ def _callback():
+ callback()
+
+ action = self.menuBarWidget().addAction(name)
+
+ if icon:
+ action.setIcon(icon)
+
+ if tip:
+ action.setToolTip(tip)
+ action.setStatusTip(tip)
+
+ if callback:
+ action.triggered.connect(_callback)
+
+ return action
+
+ def showFilterByMenu(self):
+ """
+ Show the filters menu.
+
+ :rtype: None
+ """
+ widget = self.menuBarWidget().findToolButton("Filters")
+ point = widget.mapToGlobal(QtCore.QPoint(0, widget.height()))
+ self._filterByMenu.show(point)
+ self.updateMenuBar()
+
+ def showGroupByMenu(self):
+ """
+ Show the group by menu at the group button.
+
+ :rtype: None
+ """
+ widget = self.menuBarWidget().findToolButton("Group By")
+ point = widget.mapToGlobal(QtCore.QPoint(0, widget.height()))
+ self._groupByMenu.show(point)
+
+ def showSortByMenu(self):
+ """
+ Show the sort by menu at the sort button.
+
+ :rtype: None
+ """
+ widget = self.menuBarWidget().findToolButton("Sort By")
+ point = widget.mapToGlobal(QtCore.QPoint(0, widget.height()))
+ self._sortByMenu.show(point)
+
+ def showItemViewMenu(self):
+ """
+ Show the item settings menu.
+
+ :rtype: None
+ """
+ menu = self.itemsWidget().createSettingsMenu()
+ widget = self.menuBarWidget().findToolButton("Item View")
+
+ point = widget.mapToGlobal(QtCore.QPoint(0, widget.height()))
+ menu.exec_(point)
+
+ def createNewItemMenu(self):
+ """
+ Return the create new item menu for adding new folders and items.
+
+ :rtype: QtWidgets.QMenu
+ """
+ color = self.iconColor()
+
+ icon = studiolibrary.resource.icon("add", color=color)
+ menu = QtWidgets.QMenu(self)
+ menu.setIcon(icon)
+ menu.setTitle("New")
+
+ def _sortKey(item):
+ return item.MENU_ORDER
+
+ for cls in sorted(studiolibrary.registeredItems(), key=_sortKey):
+ action = cls.createAction(menu, self)
+
+ if action:
+ icon = studioqt.Icon(action.icon())
+ icon.setColor(self.iconColor())
+
+ action.setIcon(icon)
+ menu.addAction(action)
+
+ return menu
+
+ def settingsValidator(self, **kwargs):
+ """
+ The validator used for the settings dialog.
+
+ :type kwargs: dict
+ """
+ fields = []
+
+ color = kwargs.get("accentColor")
+ if color and self.theme().accentColor().toString() != color:
+ self.theme().setAccentColor(color)
+
+ color = kwargs.get("backgroundColor")
+ if color and self.theme().backgroundColor().toString() != color:
+ self.theme().setBackgroundColor(color)
+
+ path = kwargs.get("path", "")
+ if not os.path.exists(path):
+ fields.append(
+ {
+ "name": "path",
+ "value": path,
+ "error": "Path does not exists!"
+ }
+ )
+
+ scaleFactor = kwargs.get("scaleFactor")
+ scaleFactorMap = {"Small": 1.0, "Large": 1.5}
+ value = scaleFactorMap.get(scaleFactor, 1.0)
+
+ if value != self.dpi():
+ self.setDpi(value)
+
+ return fields
+
+ def settingsAccepted(self, **kwargs):
+ """
+ Called when the user has accepted the changes in the settings dialog.
+
+ :type kwargs: dict
+ """
+ path = kwargs.get("path")
+ if path and path != self.path():
+ self.setPath(path)
+
+ self.saveSettings()
+
+ def showSettingDialog(self):
+ """Show the settings dialog."""
+ accentColor = self.theme().accentColor().toString()
+ backgroundColor = self.theme().backgroundColor().toString()
+
+ form = {
+ "title": "Settings",
+ "description": "Your local settings",
+ "layout": "vertical",
+ "schema": [
+ # {"name": "name", "type": "string", "default": self.name()},
+ {"name": "path", "type": "path", "value": self.path()},
+ {
+ "name": "accentColor",
+ "type": "color",
+ "value": accentColor,
+ "colors": [
+ "rgb(225, 110, 110)",
+ # "rgb(220, 135, 100)",
+ "rgb(225, 150, 70)",
+ "rgb(225, 180, 35)",
+ "rgb(90, 175, 130)",
+ "rgb(100, 175, 160)",
+ "rgb(70, 160, 210)",
+ # "rgb(5, 135, 245)",
+ "rgb(30, 145, 245)",
+ "rgb(110, 125, 220)",
+ "rgb(100, 120, 150)",
+ ]
+ },
+ {
+ "name": "backgroundColor",
+ "type": "color",
+ "value": backgroundColor,
+ "colors": [
+ "rgb(45, 45, 48)",
+ "rgb(55, 55, 60)",
+ "rgb(68, 68, 70)",
+ "rgb(80, 60, 80)",
+ "rgb(85, 60, 60)",
+ "rgb(60, 75, 75)",
+ "rgb(60, 64, 79)",
+ "rgb(245, 245, 255)",
+ ]
+ },
+ ],
+ "validator": self.settingsValidator,
+ "accepted": self.settingsAccepted,
+ }
+
+ if self.DPI_ENABLED:
+ value = 'Large' if self.dpi() > 1 else "Small"
+
+ form["schema"].append(
+ {
+ "name": "scaleFactor",
+ "type": "buttonGroup",
+ "title": "Scale Factor (DPI)",
+ "value": value,
+ "items": [
+ "Small",
+ "Large",
+ ]
+ },
+ )
+
+ self._settingsWidget = studiolibrary.widgets.FormDialog(form=form)
+ self._settingsWidget.setObjectName("settingsDialog")
+ self._settingsWidget.acceptButton().setText("Save")
+
+ self._lightbox = studiolibrary.widgets.Lightbox(self)
+ self._lightbox.setWidget(self._settingsWidget)
+ self._lightbox.show()
+
+ def createSettingsMenu(self):
+ """
+ Return the settings menu for changing the library widget.
+
+ :rtype: studioqt.Menu
+ """
+ menu = studioqt.Menu("", self)
+ menu.setTitle("Settings")
+
+ # Adding a blank icon fixes the text alignment issue when using Qt 5.12.+
+ icon = studiolibrary.resource.icon("blank")
+
+ action = menu.addAction("Sync")
+ action.triggered.connect(self.sync)
+ action.setIcon(icon)
+
+ menu.addSeparator()
+ action = menu.addAction("Settings")
+ action.triggered.connect(self.showSettingDialog)
+
+ menu.addSeparator()
+
+ librariesMenu = studiolibrary.widgets.LibrariesMenu(libraryWindow=self)
+ menu.addMenu(librariesMenu)
+ menu.addSeparator()
+
+ action = QtWidgets.QAction("Show Menu", menu)
+ action.setCheckable(True)
+ action.setChecked(self.isMenuBarWidgetVisible())
+ action.triggered[bool].connect(self.setMenuBarWidgetVisible)
+ menu.addAction(action)
+
+ action = QtWidgets.QAction("Show Sidebar", menu)
+ action.setCheckable(True)
+ action.setChecked(self.isFoldersWidgetVisible())
+ action.triggered[bool].connect(self.setFoldersWidgetVisible)
+ menu.addAction(action)
+
+ action = QtWidgets.QAction("Show Preview", menu)
+ action.setCheckable(True)
+ action.setChecked(self.isPreviewWidgetVisible())
+ action.triggered[bool].connect(self.setPreviewWidgetVisible)
+ menu.addAction(action)
+
+ action = QtWidgets.QAction("Show Status", menu)
+ action.setCheckable(True)
+ action.setChecked(self.isStatusBarWidgetVisible())
+ action.triggered[bool].connect(self.setStatusBarWidgetVisible)
+ menu.addAction(action)
+
+ menu.addSeparator()
+
+ action = QtWidgets.QAction("Save Settings", menu)
+ action.triggered.connect(self.saveSettings)
+ menu.addAction(action)
+
+ action = QtWidgets.QAction("Reset Settings", menu)
+ action.triggered.connect(self.resetSettings)
+ menu.addAction(action)
+
+ action = QtWidgets.QAction("Open Settings", menu)
+ action.triggered.connect(self.openSettings)
+ menu.addAction(action)
+
+ if self.TEMP_PATH_MENU_ENABLED:
+ action = QtWidgets.QAction("Open Temp Path", menu)
+ action.triggered.connect(self.openTempPath)
+ menu.addAction(action)
+
+ menu.addSeparator()
+
+ if self.trashEnabled():
+ action = QtWidgets.QAction("Show Trash Folder", menu)
+ action.setEnabled(self.trashFolderExists())
+ action.setCheckable(True)
+ action.setChecked(self.isTrashFolderVisible())
+ action.triggered[bool].connect(self.setTrashFolderVisible)
+ menu.addAction(action)
+
+ menu.addSeparator()
+
+ action = QtWidgets.QAction("Enable Recursive Search", menu)
+ action.setCheckable(True)
+ action.setChecked(self.isRecursiveSearchEnabled())
+ action.triggered[bool].connect(self.setRecursiveSearchEnabled)
+ menu.addAction(action)
+
+ menu.addSeparator()
+
+ viewMenu = self.itemsWidget().createSettingsMenu()
+ menu.addMenu(viewMenu)
+
+ menu.addSeparator()
+
+ action = QtWidgets.QAction("Check For Updates", menu)
+ action.setCheckable(True)
+ action.setChecked(self.isCheckForUpdateEnabled())
+ action.triggered[bool].connect(self.setCheckForUpdateEnabled)
+ menu.addAction(action)
+
+ action = QtWidgets.QAction("Debug Mode", menu)
+ action.setCheckable(True)
+ action.setChecked(self.isDebug())
+ action.triggered[bool].connect(self.setDebugMode)
+ menu.addAction(action)
+
+ menu.addSeparator()
+
+ action = QtWidgets.QAction("Report Issue", menu)
+ action.triggered.connect(self.openReportUrl)
+ menu.addAction(action)
+
+ action = QtWidgets.QAction("Help", menu)
+ action.triggered.connect(self.openHelpUrl)
+ menu.addAction(action)
+
+ return menu
+
+ def showNewMenu(self):
+ """
+ Creates and shows the new menu at the new action button.
+
+ :rtype: QtWidgets.QAction
+ """
+ menu = self.createNewItemMenu()
+
+ point = self.menuBarWidget().rect().bottomLeft()
+ point = self.menuBarWidget().mapToGlobal(point)
+
+ return menu.exec_(point)
+
+ def showSettingsMenu(self):
+ """
+ Show the settings menu at the current cursor position.
+
+ :rtype: QtWidgets.QAction
+ """
+ menu = self.createSettingsMenu()
+
+ point = self.menuBarWidget().rect().bottomRight()
+ point = self.menuBarWidget().mapToGlobal(point)
+
+ # Align menu to the left of the cursor.
+ menu.move(-1000, -1000) # Fix display bug on linux
+ menu.show()
+ x = point.x() - menu.width()
+ point.setX(x)
+
+ return menu.exec_(point)
+
+ def showFolderMenu(self, pos=None):
+ """
+ Show the folder context menu at the current cursor position.
+
+ :type pos: None or QtCore.QPoint
+ :rtype: QtWidgets.QAction
+ """
+ menu = self.createFolderContextMenu()
+
+ point = QtGui.QCursor.pos()
+ point.setX(point.x() + 3)
+ point.setY(point.y() + 3)
+ action = menu.exec_(point)
+ menu.close()
+
+ return action
+
+ def showItemsContextMenu(self, pos=None):
+ """
+ Show the item context menu at the current cursor position.
+
+ :type pos: QtGui.QPoint
+ :rtype QtWidgets.QAction
+ """
+ items = self.itemsWidget().selectedItems()
+
+ menu = self.createItemContextMenu(items)
+
+ point = QtGui.QCursor.pos()
+ point.setX(point.x() + 3)
+ point.setY(point.y() + 3)
+ action = menu.exec_(point)
+ menu.close()
+
+ return action
+
+ def createItemContextMenu(self, items):
+ """
+ Return the item context menu for the given items.
+
+ :type items: list[studiolibrary.LibraryItem]
+ :rtype: studiolibrary.ContextMenu
+ """
+ menu = studioqt.Menu(self)
+
+ item = None
+
+ if items:
+ item = items[-1]
+ item.contextMenu(menu)
+
+ if not self.isLocked():
+ menu.addMenu(self.createNewItemMenu())
+
+ if item:
+ editMenu = studioqt.Menu(menu)
+ editMenu.setTitle("Edit")
+ menu.addMenu(editMenu)
+
+ item.contextEditMenu(editMenu)
+
+ if self.trashEnabled():
+ editMenu.addSeparator()
+
+ callback = partial(self.showMoveItemsToTrashDialog, items)
+
+ action = QtWidgets.QAction("Move to Trash", editMenu)
+ action.setEnabled(not self.isTrashSelected())
+ action.triggered.connect(callback)
+ editMenu.addAction(action)
+
+ menu.addSeparator()
+
+ sortByMenu = self.SORTBY_MENU_CLASS("Sort By", menu, self.library())
+ menu.addMenu(sortByMenu)
+
+ groupByMenu = self.GROUPBY_MENU_CLASS("Group By", menu, self.library())
+ menu.addMenu(groupByMenu)
+
+ menu.addSeparator()
+ menu.addMenu(self.createSettingsMenu())
+
+ return menu
+
+ def saveCustomOrder(self):
+ """
+ Convenience method for saving the custom order.
+
+ :rtype: None
+ """
+ self.library().saveItemData(self.library()._items, emitDataChanged=True)
+
+ # -------------------------------------------------------------------
+ # Support for moving items with drag and drop
+ # -------------------------------------------------------------------
+
+ def isCustomOrderEnabled(self):
+ """
+ Return True if sorting by "Custom Order" is enabled.
+
+ :rtype: bool
+ """
+ return 'Custom Order' in str(self.library().sortBy())
+
+ def isMoveItemsEnabled(self):
+ """
+ Return True if moving items via drag and drop is enabled.
+
+ :rtype: bool
+ """
+ paths = self.selectedFolderPaths()
+
+ if len(paths) != 1:
+ return False
+
+ if self.selectedItems():
+ return False
+
+ return True
+
+ def createMoveItemsDialog(self):
+ """
+ Create and return a dialog for moving items.
+
+ :rtype: studiolibrary.widgets.MessageBox
+ """
+ text = 'Would you like to copy or move the selected item/s?'
+
+ dialog = studiolibrary.widgets.createMessageBox(self, "Move or Copy items?", text)
+ dialog.buttonBox().clear()
+
+ dialog.addButton(u'Copy', QtWidgets.QDialogButtonBox.AcceptRole)
+ dialog.addButton(u'Move', QtWidgets.QDialogButtonBox.AcceptRole)
+ dialog.addButton(u'Cancel', QtWidgets.QDialogButtonBox.RejectRole)
+
+ return dialog
+
+ def showMoveItemsDialog(self, items, dst):
+ """
+ Show the move items dialog for the given items.
+
+ :type items: list[studiolibrary.LibraryItem]
+ :type dst: str
+ :rtype: None
+ """
+ Copy = 0
+ Cancel = 2
+
+ # Check if the items are moving to another folder.
+ for item in items:
+
+ if item.isVersionPath():
+ raise NameError("You can only save items that were "
+ "created using Studio Library version 2!")
+
+ if os.path.dirname(item.path()) == dst:
+ return
+
+ dialog = self.createMoveItemsDialog()
+ action = dialog.exec_()
+ dialog.close()
+
+ if action == Cancel:
+ return
+
+ copy = action == Copy
+
+ self.moveItems(items, dst, copy=copy)
+
+ def moveItems(self, items, dst, copy=False, force=False):
+ """
+ Move the given items to the destination folder path.
+
+ :type items: list[studiolibrary.LibraryItem]
+ :type dst: str
+ :type copy: bool
+ :type force: bool
+ :rtype: None
+ """
+ self.itemsWidget().clearSelection()
+
+ movedItems = []
+
+ try:
+ self.library().blockSignals(True)
+
+ for item in items:
+
+ path = dst + "/" + os.path.basename(item.path())
+
+ if force:
+ path = studiolibrary.generateUniquePath(path)
+
+ if copy:
+ item.copy(path)
+ else:
+ item.rename(path)
+
+ movedItems.append(item)
+
+ except Exception as error:
+ self.showExceptionDialog("Move Error", error)
+ raise
+ finally:
+ self.library().blockSignals(False)
+
+ self.refresh()
+ self.selectItems(movedItems)
+ self.scrollToSelectedItem()
+
+ # -----------------------------------------------------------------------
+ # Support for search
+ # -----------------------------------------------------------------------
+
+ def isPreviewWidgetVisible(self):
+ """
+ Return True if the PreviewWidget is visible, otherwise return False.
+
+ :rtype: bool
+ """
+ return self._previewWidgetVisible
+
+ def isFoldersWidgetVisible(self):
+ """
+ Return True if the FoldersWidget is visible, otherwise return False.
+
+ :rtype: bool
+ """
+ return self._sidebarWidgetVisible
+
+ def isStatusBarWidgetVisible(self):
+ """
+ Return True if the StatusWidget is visible, otherwise return False.
+
+ :rtype: bool
+ """
+ return self._statusBarWidgetVisible
+
+ def isMenuBarWidgetVisible(self):
+ """
+ Return True if the MenuBarWidget is visible, otherwise return False.
+
+ :rtype: bool
+ """
+ return self.menuBarWidget().isExpanded()
+
+ def setPreviewWidgetVisible(self, value):
+ """
+ If the value is True then show the PreviewWidget, otherwise hide.
+
+ :type value: bool
+ """
+ value = bool(value)
+ self._previewWidgetVisible = value
+
+ if value:
+ self._previewFrame.show()
+ else:
+ self._previewFrame.hide()
+
+ self.updateMenuBar()
+
+ def setFoldersWidgetVisible(self, value):
+ """
+ If the value is True then show the FoldersWidget, otherwise hide.
+
+ :type value: bool
+ """
+ value = bool(value)
+ self._sidebarWidgetVisible = value
+
+ if value:
+ self._sidebarFrame.show()
+ else:
+ self._sidebarFrame.hide()
+
+ self.updateMenuBar()
+
+ def setMenuBarWidgetVisible(self, value):
+ """
+ If the value is True then show the tMenuBarWidget, otherwise hide.
+
+ :type value: bool
+ """
+ value = bool(value)
+
+ if value:
+ self.menuBarWidget().expand()
+ else:
+ self.menuBarWidget().collapse()
+
+ def setStatusBarWidgetVisible(self, value):
+ """
+ If the value is True then show the StatusBarWidget, otherwise hide.
+
+ :type value: bool
+ """
+ value = bool(value)
+
+ self._statusBarWidgetVisible = value
+ if value:
+ self.statusWidget().show()
+ else:
+ self.statusWidget().hide()
+
+ # -----------------------------------------------------------------------
+ # Support for search
+ # -----------------------------------------------------------------------
+
+ def itemsVisibleCount(self):
+ """
+ Return the number of items visible.
+
+ :rtype: int
+ """
+ return self._itemsVisibleCount
+
+ def itemsHiddenCount(self):
+ """
+ Return the number of items hidden.
+
+ :rtype: int
+ """
+ return self._itemsHiddenCount
+
+ def setSearchText(self, text):
+ """
+ Set the search widget text..
+
+ :type text: str
+ :rtype: None
+ """
+ self.searchWidget().setText(text)
+
+ # -----------------------------------------------------------------------
+ # Support for custom preview widgets
+ # -----------------------------------------------------------------------
+
+ def setCreateWidget(self, widget):
+ """
+ :type widget: QtWidgets.QWidget
+ :rtype: None
+ """
+ self.setPreviewWidgetVisible(True)
+ self.itemsWidget().clearSelection()
+
+ # Force the preview pane to expand when creating a new item.
+ fsize, rsize, psize = self._splitter.sizes()
+ if psize < 150:
+ self.setSizes((fsize, rsize, 180))
+
+ self.setPreviewWidget(widget)
+
+ def clearPreviewWidget(self):
+ """
+ Set the default preview widget.
+ """
+ self._previewWidget = None
+ widget = studiolibrary.widgets.PlaceholderWidget()
+ self.setPreviewWidget(widget)
+
+ def updatePreviewWidget(self):
+ """Update the current preview widget."""
+ self.setPreviewWidgetFromItem(self._currentItem, force=True)
+
+ def setPreviewWidgetFromItem(self, item, force=False):
+ """
+ :type item: studiolibrary.LibraryItem
+ :rtype: None
+ """
+ if not force and self._currentItem == item:
+ logger.debug("The current item preview widget is already set.")
+ return
+
+ self._currentItem = item
+
+ if item:
+ self.closePreviewWidget()
+ try:
+ item.showPreviewWidget(self)
+ except Exception as error:
+ self.showErrorMessage(error)
+ self.clearPreviewWidget()
+ raise
+ else:
+ self.clearPreviewWidget()
+
+ def previewWidget(self):
+ """
+ Return the current preview widget.
+
+ :rtype: QtWidgets.QWidget
+ """
+ return self._previewWidget
+
+ def setPreviewWidget(self, widget):
+ """
+ Set the preview widget.
+
+ :type widget: QtWidgets.QWidget
+ :rtype: None
+ """
+ if self._previewWidget == widget:
+ msg = 'Preview widget already contains widget "{0}"'
+ msg.format(widget)
+ logger.debug(msg)
+ else:
+ self.closePreviewWidget()
+ self._previewWidget = widget
+ if self._previewWidget:
+ self._previewFrame.layout().addWidget(self._previewWidget)
+ self._previewWidget.show()
+
+ def closePreviewWidget(self):
+ """
+ Close and delete the preview widget.
+
+ :rtype: None
+ """
+ layout = self._previewFrame.layout()
+
+ while layout.count():
+ item = layout.takeAt(0)
+ item.widget().hide()
+ item.widget().close()
+ item.widget().deleteLater()
+
+ self._previewWidget = None
+
+ # -----------------------------------------------------------------------
+ # Support for saving and loading the widget state
+ # -----------------------------------------------------------------------
+
+ def resetSettings(self):
+ """
+ Reset the settings to the default settings.
+
+ :rtype: str
+ """
+ self.setSettings(self.DEFAULT_SETTINGS)
+
+ def geometrySettings(self):
+ """
+ Return the geometry values as a list.
+
+ :rtype: list[int]
+ """
+ settings = (
+ self.window().geometry().x(),
+ self.window().geometry().y(),
+ self.window().geometry().width(),
+ self.window().geometry().height()
+ )
+ return settings
+
+ def setGeometrySettings(self, settings):
+ """
+ Set the geometry of the widget with the given values.
+
+ :type settings: list[int]
+ :rtype: None
+ """
+ x, y, width, height = settings
+
+ pos = QtGui.QCursor.pos()
+ geometry = QtWidgets.QApplication.screenAt(pos).availableGeometry()
+ screenWidth = geometry.width()
+ screenHeight = geometry.height()
+
+ if x <= 0 or y <= 0 or x >= screenWidth or y >= screenHeight:
+ self.centerWindow(width, height)
+ else:
+ self.window().setGeometry(x, y, width, height)
+
+ def settings(self):
+ """
+ Return a dictionary with the widget settings.
+
+ :rtype: dict
+ """
+ settings = {}
+
+ settings['dpi'] = self.dpi()
+ settings['kwargs'] = self._kwargs
+ settings['geometry'] = self.geometrySettings()
+ settings['paneSizes'] = self._splitter.sizes()
+
+ if self.theme():
+ settings['theme'] = self.theme().settings()
+
+ settings["library"] = self.library().settings()
+ settings["trashFolderVisible"] = self.isTrashFolderVisible()
+ settings["sidebarWidgetVisible"] = self.isFoldersWidgetVisible()
+ settings["previewWidgetVisible"] = self.isPreviewWidgetVisible()
+ settings["menuBarWidgetVisible"] = self.isMenuBarWidgetVisible()
+ settings["statusBarWidgetVisible"] = self.isStatusBarWidgetVisible()
+
+ settings['itemsWidget'] = self.itemsWidget().settings()
+ settings['searchWidget'] = self.searchWidget().settings()
+ settings['sidebarWidget'] = self.sidebarWidget().settings()
+ settings["recursiveSearchEnabled"] = self.isRecursiveSearchEnabled()
+ settings["checkForUpdateEnabled"] = self.isCheckForUpdateEnabled()
+
+ settings['filterByMenu'] = self._filterByMenu.settings()
+
+ settings["path"] = self.path()
+
+ return settings
+
+ def setSettings(self, settings):
+ """
+ Set the widget settings from the given dictionary.
+
+ :type settings: dict
+ """
+ defaults = copy.deepcopy(self.DEFAULT_SETTINGS)
+ settings = studiolibrary.update(defaults, settings)
+
+ isRefreshEnabled = self.isRefreshEnabled()
+
+ try:
+ self.setRefreshEnabled(False)
+ self.itemsWidget().setToastEnabled(False)
+
+ geometry = settings.get("geometry")
+ if geometry:
+ self.setGeometrySettings(geometry)
+
+ themeSettings = settings.get("theme")
+ if themeSettings:
+ self.setThemeSettings(themeSettings)
+
+ if not self.path():
+ path = settings.get("path")
+ if path and os.path.exists(path):
+ self.setPath(path)
+
+ dpi = settings.get("dpi", 1.0)
+ self.setDpi(dpi)
+
+ sizes = settings.get('paneSizes')
+ if sizes and len(sizes) == 3:
+ self.setSizes(sizes)
+
+ value = settings.get("sidebarWidgetVisible")
+ if value is not None:
+ self.setFoldersWidgetVisible(value)
+
+ value = settings.get("menuBarWidgetVisible")
+ if value is not None:
+ self.setMenuBarWidgetVisible(value)
+
+ value = settings.get("previewWidgetVisible")
+ if value is not None:
+ self.setPreviewWidgetVisible(value)
+
+ value = settings.get("statusBarWidgetVisible")
+ if value is not None:
+ self.setStatusBarWidgetVisible(value)
+
+ value = settings.get('searchWidget')
+ if value is not None:
+ self.searchWidget().setSettings(value)
+
+ value = settings.get("recursiveSearchEnabled")
+ if value is not None:
+ self.setRecursiveSearchEnabled(value)
+
+ value = settings.get("checkForUpdateEnabled") or studiolibrary.config.get("checkForUpdateEnabled")
+ if value is not None:
+ self.setCheckForUpdateEnabled(value)
+
+ value = settings.get('filterByMenu')
+ if value is not None:
+ self._filterByMenu.setSettings(value)
+
+ finally:
+ self.reloadStyleSheet()
+ self.setRefreshEnabled(isRefreshEnabled)
+ self.refresh()
+
+ value = settings.get('library')
+ if value is not None:
+ self.library().setSettings(value)
+
+ value = settings.get('trashFolderVisible')
+ if value is not None:
+ self.setTrashFolderVisible(value)
+
+ value = settings.get('sidebarWidget', {})
+ self.sidebarWidget().setSettings(value)
+
+ value = settings.get('itemsWidget', {})
+ self.itemsWidget().setSettings(value)
+
+ self.itemsWidget().setToastEnabled(True)
+
+ self.updateMenuBar()
+
+ def updateSettings(self, settings):
+ """
+ Save the given path to the settings on disc.
+
+ :type settings: dict
+ :rtype: None
+ """
+ data = self.readSettings()
+ data.update(settings)
+ self.saveSettings(data)
+
+ def openTempPath(self):
+ """Launch the system explorer to the temp directory."""
+ path = studiolibrary.tempPath()
+ studiolibrary.showInFolder(path)
+
+ def openSettings(self):
+ """Launch the system explorer to the open directory."""
+ path = studiolibrary.settingsPath()
+ studiolibrary.showInFolder(path)
+
+ def saveSettings(self, data=None):
+ """
+ Save the settings to the settings path set in the config.
+
+ :type data: dict or None
+ :rtype: None
+ """
+ settings = studiolibrary.readSettings()
+
+ settings.setdefault(self.name(), {})
+ settings[self.name()].update(data or self.settings())
+
+ studiolibrary.saveSettings(settings)
+
+ self.showToastMessage("Saved")
+
+ @studioqt.showWaitCursor
+ def loadSettings(self):
+ """
+ Load the user settings from disc.
+
+ :rtype: None
+ """
+ self.reloadStyleSheet()
+ settings = self.readSettings()
+ self.setSettings(settings)
+
+ def readSettings(self):
+ """
+ Get the user settings from disc.
+
+ :rtype: dict
+ """
+ key = self.name()
+ data = studiolibrary.readSettings()
+ return data.get(key, {})
+
+ def isLoaded(self):
+ """
+ Return True if the Studio Library has been shown
+
+ :rtype: bool
+ """
+ return self._isLoaded
+
+ def setLoaded(self, loaded):
+ """
+ Set if the widget has been shown.
+
+ :type loaded: bool
+ :rtype: None
+ """
+ self._isLoaded = loaded
+
+ def setSizes(self, sizes):
+ """
+ :type sizes: (int, int, int)
+ :rtype: None
+ """
+ fSize, cSize, pSize = sizes
+
+ if pSize == 0:
+ pSize = 200
+
+ if fSize == 0:
+ fSize = 120
+
+ self._splitter.setSizes([fSize, cSize, pSize])
+ self._splitter.setStretchFactor(1, 1)
+
+ def centerWindow(self, width=None, height=None):
+ """
+ Center the widget to the center of the desktop.
+
+ :rtype: None
+ """
+ geometry = self.frameGeometry()
+
+ if width:
+ geometry.setWidth(width)
+
+ if height:
+ geometry.setHeight(height)
+
+ pos = QtGui.QCursor.pos()
+ screen = QtWidgets.QApplication.screenAt(pos)
+ centerPoint = screen.availableGeometry().center()
+
+ geometry.moveCenter(centerPoint)
+ self.window().setGeometry(geometry)
+
+ # -----------------------------------------------------------------------
+ # Overloading events
+ # -----------------------------------------------------------------------
+
+ def event(self, event):
+ """
+ :type event: QtWidgets.QEvent
+ :rtype: QtWidgets.QEvent
+ """
+ if isinstance(event, QtGui.QKeyEvent):
+ if studioqt.isControlModifier() and event.key() == QtCore.Qt.Key_F:
+ self.searchWidget().setFocus()
+
+ if isinstance(event, QtGui.QStatusTipEvent):
+ self.statusWidget().showInfoMessage(event.tip())
+
+ return QtWidgets.QWidget.event(self, event)
+
+ def keyReleaseEvent(self, event):
+ """
+ :type event: QtGui.QKeyEvent
+ :rtype: None
+ """
+ for item in self.selectedItems():
+ item.keyReleaseEvent(event)
+ QtWidgets.QWidget.keyReleaseEvent(self, event)
+
+ def closeEvent(self, event):
+ """
+ :type event: QtWidgets.QEvent
+ :rtype: None
+ """
+ self.saveSettings()
+ QtWidgets.QWidget.closeEvent(self, event)
+
+ def show(self, **kwargs):
+ """
+ Overriding this method to always raise_ the widget on show.
+
+ Developers can use the kwargs to set platform dependent show options used in subclasses.
+
+ :rtype: None
+ """
+ QtWidgets.QWidget.show(self)
+ self.setWindowState(QtCore.Qt.WindowNoState)
+ self.raise_()
+
+ def showEvent(self, event):
+ """
+ :type event: QtWidgets.QEvent
+ :rtype: None
+ """
+ QtWidgets.QWidget.showEvent(self, event)
+
+ if not self.isLoaded():
+ self.setLoaded(True)
+ self.setRefreshEnabled(True)
+ self.loadSettings()
+
+ # -----------------------------------------------------------------------
+ # Support for themes and custom style sheets
+ # -----------------------------------------------------------------------
+
+ def dpi(self):
+ """
+ Return the current dpi for the library widget.
+
+ :rtype: float
+ """
+ if not self.DPI_ENABLED:
+ return 1.0
+
+ return float(self._dpi)
+
+ def setDpi(self, dpi):
+ """
+ Set the current dpi for the library widget.
+
+ :rtype: float
+ """
+ if not self.DPI_ENABLED:
+ dpi = 1.0
+
+ self._dpi = dpi
+
+ self.itemsWidget().setDpi(dpi)
+ self.menuBarWidget().setDpi(dpi)
+ self.sidebarWidget().setDpi(dpi)
+ self.statusWidget().setFixedHeight(20 * dpi)
+
+ self._splitter.setHandleWidth(2 * dpi)
+
+ self.showToastMessage("DPI: {0}".format(int(dpi * 100)))
+
+ self.reloadStyleSheet()
+
+ def iconColor(self):
+ """
+ Return the icon color.
+
+ :rtype: studioqt.Color
+ """
+ return self.ICON_COLOR
+
+ def setThemeSettings(self, settings):
+ """
+ Set the theme from the given settings.
+
+ :type settings: dict
+ :rtype: None
+ """
+ theme = studiolibrary.widgets.Theme()
+ theme.setSettings(settings)
+ self.setTheme(theme)
+
+ def setTheme(self, theme):
+ """
+ Set the theme.
+
+ :type theme: studioqt.Theme
+ :rtype: None
+ """
+ self._theme = theme
+ self._theme.updated.connect(self.reloadStyleSheet)
+ self.reloadStyleSheet()
+
+ def theme(self):
+ """
+ Return the current theme.
+
+ :rtype: studioqt.Theme
+ """
+ if not self._theme:
+ self._theme = studiolibrary.widgets.Theme()
+
+ return self._theme
+
+ def reloadStyleSheet(self):
+ """
+ Reload the style sheet to the current theme.
+
+ :rtype: None
+ """
+ theme = self.theme()
+ theme.setDpi(self.dpi())
+
+ options = theme.options()
+ styleSheet = theme.styleSheet()
+
+ color = studioqt.Color.fromString(options["ITEM_TEXT_COLOR"])
+ self.itemsWidget().setTextColor(color)
+
+ color = studioqt.Color.fromString(options["ITEM_TEXT_SELECTED_COLOR"])
+ self.itemsWidget().setTextSelectedColor(color)
+
+ color = studioqt.Color.fromString(options["ITEM_BACKGROUND_COLOR"])
+ self.itemsWidget().setItemBackgroundColor(color)
+
+ color = studioqt.Color.fromString(options["BACKGROUND_COLOR"])
+ self.itemsWidget().setBackgroundColor(color)
+
+ color = studioqt.Color.fromString(
+ options["ITEM_BACKGROUND_HOVER_COLOR"])
+ self.itemsWidget().setBackgroundHoverColor(color)
+
+ color = studioqt.Color.fromString(
+ options["ITEM_BACKGROUND_SELECTED_COLOR"])
+ self.itemsWidget().setBackgroundSelectedColor(color)
+
+ self.setStyleSheet(styleSheet)
+
+ # Reloading the style sheets is needed for OSX
+ self.itemsWidget().setStyleSheet(self.itemsWidget().styleSheet())
+ self.searchWidget().setStyleSheet(self.searchWidget().styleSheet())
+ self.menuBarWidget().setStyleSheet(self.menuBarWidget().styleSheet())
+ self.sidebarWidget().setStyleSheet(self.sidebarWidget().styleSheet())
+ self.previewWidget().setStyleSheet(self.previewWidget().styleSheet())
+
+ if self._settingsWidget:
+ self._settingsWidget.setStyleSheet(self._settingsWidget.styleSheet())
+
+ self.searchWidget().update()
+ self.menuBarWidget().update()
+ self.sidebarWidget().update()
+
+ # -----------------------------------------------------------------------
+ # Support for the Trash folder.
+ # -----------------------------------------------------------------------
+
+ def trashEnabled(self):
+ """
+ Return True if moving items to trash.
+
+ :rtype: bool
+ """
+ return self._trashEnabled
+
+ def setTrashEnabled(self, enable):
+ """
+ Enable items to be trashed.
+
+ :type enable: bool
+ :rtype: None
+ """
+ self._trashEnabled = enable
+
+ def isPathInTrash(self, path):
+ """
+ Return True if the given path is in the Trash path.
+
+ :rtype: bool
+ """
+ return "trash" in path.lower()
+
+ def trashPath(self):
+ """
+ Return the trash path for the library.
+
+ :rtype: str
+ """
+ path = self.path()
+ return u'{0}/{1}'.format(path, "Trash")
+
+ def trashFolderExists(self):
+ """
+ Return True if the trash folder exists.
+
+ :rtype: bool
+ """
+ return os.path.exists(self.trashPath())
+
+ def createTrashFolder(self):
+ """
+ Create the trash folder if it does not exist.
+
+ :rtype: None
+ """
+ path = self.trashPath()
+ if not os.path.exists(path):
+ os.makedirs(path)
+
+ def isTrashFolderVisible(self):
+ """
+ Return True if the trash folder is visible to the user.
+
+ :rtype: bool
+ """
+ return self._isTrashFolderVisible
+
+ def setTrashFolderVisible(self, visible):
+ """
+ Enable the trash folder to be visible to the user.
+
+ :type visible: str
+ :rtype: None
+ """
+ self._isTrashFolderVisible = visible
+
+ if visible:
+ query = {
+ 'name': 'trash_query',
+ 'filters': []
+ }
+ else:
+ query = {
+ 'name': 'trash_query',
+ 'filters': [('path', 'not_contains', 'Trash')]
+ }
+
+ self.library().addGlobalQuery(query)
+ self.updateSidebar()
+ self.library().search()
+
+ def isTrashSelected(self):
+ """
+ Return True if the selected folders is in the trash.
+
+ :rtype: bool
+ """
+ folders = self.selectedFolderPaths()
+ for folder in folders:
+ if self.isPathInTrash(folder):
+ return True
+
+ items = self.selectedItems()
+ for item in items:
+ if self.isPathInTrash(item.path()):
+ return True
+
+ return False
+
+ def moveItemsToTrash(self, items):
+ """
+ Move the given items to trash path.
+
+ :items items: list[studiolibrary.LibraryItem]
+ :rtype: None
+ """
+ self.createTrashFolder()
+ self.moveItems(items, dst=self.trashPath(), force=True)
+
+ def showMoveItemsToTrashDialog(self, items=None):
+ """
+ Show the "Move to trash" dialog for the selected items.
+
+ :type items: list[studiolibrary.LibraryItem] or None
+ :rtype: None
+ """
+ items = items or self.selectedItems()
+
+ if items:
+ title = "Move to trash?"
+ text = "Are you sure you want to move the selected" \
+ "item/s to the trash?"
+
+ buttons = [
+ ("Move to Trash", QtWidgets.QDialogButtonBox.AcceptRole),
+ QtWidgets.QDialogButtonBox.Cancel
+ ]
+
+ result = studiolibrary.widgets.MessageBox.question(self, title, text, buttons=buttons)
+
+ if result != QtWidgets.QDialogButtonBox.Cancel:
+ self.moveItemsToTrash(items)
+
+ # -----------------------------------------------------------------------
+ # Support for message boxes
+ # -----------------------------------------------------------------------
+
+ def showToastMessage(self, text, duration=1000):
+ """
+ A convenience method for showing the toast widget with the given text.
+
+ :type text: str
+ :type duration: int
+ :rtype: None
+ """
+ self.itemsWidget().showToastMessage(text, duration)
+
+ def showInfoMessage(self, text):
+ """
+ A convenience method for showing an info message to the user.
+
+ :type text: str
+ :rtype: None
+ """
+ self.statusWidget().showInfoMessage(text)
+
+ def showErrorMessage(self, text):
+ """
+ A convenience method for showing an error message to the user.
+
+ :type text: str
+ :rtype: None
+ """
+ self.statusWidget().showErrorMessage(text)
+ self.setStatusBarWidgetVisible(True)
+
+ def showWarningMessage(self, text):
+ """
+ A convenience method for showing a warning message to the user.
+
+ :type text: str
+ :rtype: None
+ """
+ self.statusWidget().showWarningMessage(text)
+ self.setStatusBarWidgetVisible(True)
+
+ def showRefreshMessage(self):
+ """Show how long the current refresh took."""
+ itemCount = len(self.library().results())
+ elapsedTime = self.library().searchTime()
+
+ plural = ""
+ if itemCount > 1:
+ plural = "s"
+
+ msg = "Found {0} item{1} in {2:.3f} seconds."
+ msg = msg.format(itemCount, plural, elapsedTime)
+ self.statusWidget().showInfoMessage(msg)
+
+ logger.debug(msg)
+
+ def showInfoDialog(self, title, text):
+ """
+ A convenience method for showing an information dialog to the user.
+
+ :type title: str
+ :type text: str
+ :rtype: QMessageBox.StandardButton
+ """
+ buttons = QtWidgets.QDialogButtonBox.Ok
+
+ return studiolibrary.widgets.MessageBox.question(self, title, text, buttons=buttons)
+
+ def showErrorDialog(self, title, text):
+ """
+ A convenience method for showing an error dialog to the user.
+
+ :type title: str
+ :type text: str
+ :rtype: QMessageBox.StandardButton
+ """
+ self.showErrorMessage(text)
+ return studiolibrary.widgets.MessageBox.critical(self, title, text)
+
+ def showExceptionDialog(self, title, error):
+ """
+ A convenience method for showing an error dialog to the user.
+
+ :type title: str
+ :type error: Exception
+ :rtype: QMessageBox.StandardButton
+ """
+ logger.exception(error)
+ self.showErrorDialog(title, error)
+
+ def showQuestionDialog(self, title, text, buttons=None):
+ """
+ A convenience method for showing a question dialog to the user.
+
+ :type title: str
+ :type text: str
+ :type buttons: list[QMessageBox.StandardButton]
+ :rtype: QMessageBox.StandardButton
+ """
+ buttons = buttons or [
+ QtWidgets.QDialogButtonBox.Yes,
+ QtWidgets.QDialogButtonBox.No,
+ QtWidgets.QDialogButtonBox.Cancel
+ ]
+
+ return studiolibrary.widgets.MessageBox.question(self, title, text, buttons=buttons)
+
+ def updateWindowTitle(self):
+ """
+ Update the window title with the version and lock status.
+
+ :rtype: None
+ """
+ title = "Studio Library - "
+ title += studiolibrary.version() + " - " + self.name()
+
+ if self.isLocked():
+ title += " (Locked)"
+
+ self.setWindowTitle(title)
+
+ # -----------------------------------------------------------------------
+ # Support for locking via regex
+ # -----------------------------------------------------------------------
+
+ def isLocked(self):
+ """
+ Return lock state of the library.
+
+ :rtype: bool
+ """
+ return self._isLocked
+
+ def setLocked(self, value):
+ """
+ Set the state of the widget to not editable.
+
+ :type value: bool
+ :rtype: None
+ """
+ self._isLocked = value
+
+ self.sidebarWidget().setLocked(value)
+ self.itemsWidget().setLocked(value)
+
+ self.updateMenuBar()
+ self.updateWindowTitle()
+
+ self.lockChanged.emit(value)
+
+ def superusers(self):
+ """
+ Return the superusers for the widget.
+
+ :rtype: list[str]
+ """
+ return self._superusers
+
+ def setSuperusers(self, superusers):
+ """
+ Set the valid superusers for the library widget.
+
+ This will lock all folders unless the current user is a superuser.
+
+ :type superusers: list[str]
+ :rtype: None
+ """
+ self._superusers = superusers
+ self.updateLock()
+
+ def lockRegExp(self):
+ """
+ Return the lock regexp used for locking the widget.
+
+ :rtype: str
+ """
+ return self._lockRegExp
+
+ def setLockRegExp(self, regExp):
+ """
+ Set the lock regexp used for locking the widget.
+
+ Lock only folders that contain the given regExp in their path.
+
+ :type regExp: str
+ :rtype: None
+ """
+ self._lockRegExp = regExp
+ self.updateLock()
+
+ def unlockRegExp(self):
+ """
+ Return the unlock regexp used for unlocking the widget.
+
+ :rtype: str
+ """
+ return self._unlockRegExp
+
+ def setUnlockRegExp(self, regExp):
+ """
+ Return the unlock regexp used for locking the widget.
+
+ Unlock only folders that contain the given regExp in their path.
+
+ :type regExp: str
+ :rtype: None
+ """
+ self._unlockRegExp = regExp
+ self.updateLock()
+
+ def isLockRegExpEnabled(self):
+ """
+ Return True if either the lockRegExp or unlockRegExp has been set.
+
+ :rtype: bool
+ """
+ return not (
+ self.superusers() is None
+ and self.lockRegExp() is None
+ and self.unlockRegExp() is None
+ )
+
+ def updateLock(self):
+ """
+ Update the lock state for the library.
+
+ This is triggered when the user clicks on a folder.
+
+ :rtype: None
+ """
+ if not self.isLockRegExpEnabled():
+ return
+
+ superusers = self.superusers() or []
+ reLocked = re.compile(self.lockRegExp() or "")
+ reUnlocked = re.compile(self.unlockRegExp() or "")
+
+ if studiolibrary.user() in superusers:
+ self.setLocked(False)
+
+ elif reLocked.match("") and reUnlocked.match(""):
+
+ if superusers:
+ # Lock if only the superusers arg is used
+ self.setLocked(True)
+ else:
+ # Unlock if no keyword arguments are used
+ self.setLocked(False)
+
+ else:
+ folders = self.selectedFolderPaths()
+
+ # Lock the selected folders that match the reLocked regx
+ if not reLocked.match(""):
+ for folder in folders:
+ if reLocked.search(folder):
+ self.setLocked(True)
+ return
+
+ self.setLocked(False)
+
+ # Unlock the selected folders that match the reUnlocked regx
+ if not reUnlocked.match(""):
+ for folder in folders:
+ if reUnlocked.search(folder):
+ self.setLocked(False)
+ return
+
+ self.setLocked(True)
+
+ # -----------------------------------------------------------------------
+ # Misc
+ # -----------------------------------------------------------------------
+
+ def isCompactView(self):
+ """
+ Return True if both the folder and preview widget are hidden
+
+ :rtype: bool
+ """
+ return not self.isFoldersWidgetVisible() and not self.isPreviewWidgetVisible()
+
+ def toggleView(self):
+ """
+ Toggle the preview widget and folder widget visible.
+
+ :rtype: None
+ """
+ compact = self.isCompactView()
+
+ if studioqt.isControlModifier():
+ compact = False
+ self.setMenuBarWidgetVisible(compact)
+
+ self.setPreviewWidgetVisible(compact)
+ self.setFoldersWidgetVisible(compact)
+
+ def updateMenuBar(self):
+
+ # Update view icon
+ action = self.menuBarWidget().findAction("New Item")
+
+ if self.isLocked():
+ icon = studiolibrary.resource.icon("lock")
+ action.setEnabled(False)
+ else:
+ icon = studiolibrary.resource.icon("plus-large")
+ action.setEnabled(True)
+
+ action.setIcon(icon)
+
+ # Update view icon
+ action = self.menuBarWidget().findAction("View")
+
+ if not self.isCompactView():
+ icon = studiolibrary.resource.icon("eye")
+ else:
+ icon = studiolibrary.resource.icon("eye-slash")
+
+ action.setIcon(icon)
+
+ # Update filters icon
+ action = self.menuBarWidget().findAction("Filters")
+
+ if self._filterByMenu.isActive():
+ icon = studiolibrary.resource.icon("filter")
+ action._badgeColor = self.ICON_BADGE_COLOR
+ action._badgeEnabled = True
+ else:
+ icon = studiolibrary.resource.icon("filter")
+
+ action.setIcon(icon)
+
+ self.menuBarWidget().updateIconColor()
+
+ def isRecursiveSearchEnabled(self):
+ """
+ Return True if recursive search is enabled.
+
+ :rtype: bool
+ """
+ return self.sidebarWidget().isRecursive()
+
+ def setRecursiveSearchEnabled(self, value):
+ """
+ Enable recursive search for searching sub folders.
+
+ :type value: int
+
+ :rtype: None
+ """
+ self.sidebarWidget().setRecursive(value)
+
+ def openHelpUrl(self):
+ """Open the help URL in a web browse."""
+ webbrowser.open(self._updateInfo.get("helpUrl", "https://www.studiolibrary.com"))
+
+ def openReportUrl(self):
+ """Open the report URL in a web browse."""
+ webbrowser.open(self._updateInfo.get("reportUrl", "https://www.studiolibrary.com"))
+
+ def openReleasesUrl(self):
+ """Open the releases URL in a web browser."""
+ webbrowser.open(self._updateInfo.get("releasesUrl", "https://www.studiolibrary.com"))
+
+ def setDebugMode(self, value):
+ """
+ :type value: bool
+ """
+ self._isDebug = value
+ studiolibrary.setDebugMode(value)
+
+ def setCheckForUpdateEnabled(self, value):
+ self._checkForUpdateEnabled = value
+ self.checkForUpdate()
+
+ def isCheckForUpdateEnabled(self):
+ return self._checkForUpdateEnabled
+
+ def isDebug(self):
+ """
+ :rtype: bool
+ """
+ return self._isDebug
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/main.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/main.py
new file mode 100644
index 0000000..aabcc5c
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/main.py
@@ -0,0 +1,58 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import studioqt
+import studiolibrary
+
+
+def main(*args, **kwargs):
+ """
+ Convenience method for creating/showing a library widget instance.
+
+ return studiolibrary.LibraryWindow.instance(
+ name="",
+ path="",
+ show=True,
+ lock=False,
+ superusers=None,
+ lockRegExp=None,
+ unlockRegExp=None
+ )
+
+ :rtype: studiolibrary.LibraryWindow
+ """
+ # Reload all Studio Library modules when Shift is pressed.
+ # This is for developers to test their changes in a DCC application.
+ if studioqt.isShiftModifier():
+ import studiolibrary
+ studiolibrary.reload()
+
+ # Register all the items from the config file.
+ import studiolibrary
+ studiolibrary.registerItems()
+
+ if studiolibrary.isMaya():
+ from studiolibrarymaya import mayalibrarywindow
+ libraryWindow = mayalibrarywindow.MayaLibraryWindow.instance(*args, **kwargs)
+ else:
+ from studiolibrary import librarywindow
+ libraryWindow = librarywindow.LibraryWindow.instance(*args, **kwargs)
+
+ return libraryWindow
+
+
+if __name__ == "__main__":
+
+ # Run the Studio Library in a QApplication instance
+ import studioqt
+ with studioqt.app():
+ studiolibrary.main()
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource.py
new file mode 100644
index 0000000..7b71aa6
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource.py
@@ -0,0 +1,74 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import os
+
+from studioqt import Icon
+from studioqt import Pixmap
+
+from . import utils
+
+
+PATH = os.path.abspath(__file__)
+DIRNAME = os.path.dirname(PATH)
+RESOURCE_DIRNAME = os.path.join(DIRNAME, "resource")
+
+
+def get(*args):
+ """
+ This is a convenience function for returning the resource path.
+
+ :rtype: str
+ """
+ path = os.path.join(RESOURCE_DIRNAME, *args)
+ return utils.normPath(path)
+
+
+def icon(*args, **kwargs):
+ """
+ Return an Icon object from the given resource name.
+
+ :rtype: str
+ """
+ path = get("icons", *args)
+ return Icon(pixmap(path, **kwargs))
+
+
+def pixmap(name, scope="icons", extension="png", color=None):
+ """
+ Return a Pixmap object from the given resource name.
+
+ :type name: str
+ :type scope: str
+ :type extension: str
+ :type color: str
+ :rtype: QtWidgets.QPixmap
+ """
+ if name.endswith(".svg"):
+ extension = ""
+
+ path = ""
+
+ if os.path.exists(name):
+ path = name
+
+ elif extension:
+ path = get(scope, name + "." + extension)
+ if not os.path.exists(path):
+ path = get(scope, name + ".svg")
+
+ p = Pixmap(path)
+
+ if color:
+ p.setColor(color)
+
+ return p
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/css/default.css b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/css/default.css
new file mode 100644
index 0000000..5cb3cdc
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/css/default.css
@@ -0,0 +1,1515 @@
+
+/*
+ --------------------------------------------------------------------------
+ Base widgets
+ --------------------------------------------------------------------------
+*/
+
+QWidget {
+ font-size: 12px;
+ font-family: Open Sans;
+ color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 180);
+}
+
+QFrame {
+ background-color: BACKGROUND_COLOR;
+}
+
+QWidget:disabled {
+ color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 100);
+}
+
+QLineEdit, QPushButton, QToolBar, QToolButton, QTabBar, QTabBar::tab {
+ border: 0px;
+ background-color: BACKGROUND_COLOR;
+}
+
+MenuBarWidget, MenuBarWidget QToolButton {
+ color: ACCENT_FOREGROUND_COLOR;
+ background-color: ACCENT_COLOR;
+ qproperty-iconSize: 24px;
+}
+
+QToolBar {
+ spacing: 4px;
+}
+
+MenuBarWidget {
+ spacing: 2px;
+}
+
+MenuBarWidget QToolButton {
+ min-height: 28px;
+ max-height: 28px;
+ min-width: 28px;
+ max-width: 28px;
+ border-radius: 4px;
+ margin-left: 2px;
+ margin-right: 2px;
+}
+
+
+MenuBarWidget QToolButton:Hover {
+ background-color: rgba(255,255,255,55);
+}
+
+QToolTip {
+ background-color: rgb(255, 255, 204);
+ color: black;
+ border: black solid 1px;
+ margin: 2px;
+}
+
+
+/*
+ --------------------------------------------------------------------------
+ Push Button
+ --------------------------------------------------------------------------
+*/
+
+QPushButton:hover {
+ background-color: rgba(ACCENT_COLOR_R, ACCENT_COLOR_G, ACCENT_COLOR_B, 200);
+}
+
+QPushButton#updateButton {
+ color: ACCENT_COLOR;
+ height: 24px;
+ margin: 5px;
+ padding: 5px;
+ border-radius: 1px;
+ background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 220);
+}
+
+QPushButton#acceptButton {
+ font: bold 12px;
+ color: ACCENT_FOREGROUND_COLOR;
+ background-color: rgba(ACCENT_COLOR_R, ACCENT_COLOR_G, ACCENT_COLOR_B, 230);
+}
+
+QPushButton#acceptButton:hover {
+ background-color: rgba(ACCENT_COLOR_R, ACCENT_COLOR_G, ACCENT_COLOR_B, 250);
+}
+
+/*
+ --------------------------------------------------------------------------
+ Slider
+ --------------------------------------------------------------------------
+*/
+
+QSlider::groove:horizontal {
+ height: 3px; /* the groove expands to the size of the slider by default. by giving it a height, it has a fixed size */
+ background: rgba(0, 0, 0, 0);
+}
+
+QSlider::handle:horizontal {
+ background: ACCENT_COLOR;
+ width: 8px;
+ height: 2px;
+ margin: -4px 0; /* handle is placed by default on the contents rect of the groove. Expand outside the groove */
+ border-radius: 2px;
+ }
+
+QSlider::add-page:horizontal {
+ border: 0px solid #999999;
+ background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 50);
+}
+
+QSlider::sub-page:horizontal {
+ background-color: ACCENT_COLOR;
+ border-top: 1px solid ACCENT_COLOR;
+ border-bottom: 1px solid ACCENT_COLOR;
+}
+
+/*
+ --------------------------------------------------------------------------
+ Scroll Bar
+ --------------------------------------------------------------------------
+*/
+
+QScrollBar:vertical {
+ width: 8px;
+}
+
+QScrollBar:horizontal {
+ height: 8px;
+}
+
+QScrollBar:vertical,
+QScrollBar:horizontal {
+ margin: 0px;
+ border: 0px solid grey;
+ background: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 0);
+}
+
+QScrollBar::handle:vertical,
+QScrollBar::handle:horizontal{
+ min-height: 0px;
+ border-radius: 1px;
+ background: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 25);
+}
+
+QScrollBar::handle:vertical:hover,
+QScrollBar::handle:horizontal:hover {
+ background: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 75);
+}
+
+QScrollBar::add-line:vertical,
+QScrollBar::add-line:horizontal {
+ height: 0px;
+ border: 0px solid grey;
+ subcontrol-origin: margin;
+ subcontrol-position: bottom;
+ /*background: rgb(80, 80, 80);*/
+}
+
+QScrollBar::sub-line:vertical,
+QScrollBar::sub-line:horizontal {
+ height: 0px;
+ border: 0px solid grey;
+ subcontrol-position: top;
+ subcontrol-origin: margin;
+ /*background: rgb(80, 80, 80);*/
+}
+
+QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical {
+ width: 0px;
+ height: 0px;
+ border: 0px;
+ background: white;
+}
+
+QScrollBar::add-page:horizontal, QScrollBar::add-page:vertical,
+QScrollBar::sub-page:horizontal, QScrollBar::sub-page:vertical {
+ background: none;
+}
+
+/*
+ --------------------------------------------------------------------------
+ Header View
+ --------------------------------------------------------------------------
+*/
+
+/* style the sort indicator */
+ QHeaderView::up-arrow {
+ image: url("RESOURCE_DIRNAME/icons/up_arrow.png");
+ }
+
+QHeaderView::down-arrow {
+ image: url("RESOURCE_DIRNAME/icons/down_arrow.png");
+ }
+
+QAbstractItemView::separator{
+ height: 0px;
+ padding: 0px 0px 0px 0px;
+ background-color: transparent;
+}
+
+QListView::item, QTreeView::item {
+ border: 0px;
+ outline: none;
+ border-style: solid;
+ margin: 0px 0px 0px 0px;
+ padding: 0px 0px 0px 0px;
+ background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 10);
+}
+
+QHeaderView::section {
+ font: 12px;
+ height: 18px;
+ border: 0px;
+ border-right: 1px solid rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 20);
+ border-bottom: 1px solid rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 20);
+ padding: 5px;
+ background-color: rgba(0, 0, 0, 20);
+}
+
+/*
+ --------------------------------------------------------------------------
+ List/Tree View
+ --------------------------------------------------------------------------
+*/
+
+QTreeView {
+ color: FOREGROUND_COLOR;
+}
+
+QTreeView, QListView, QPushButton {
+ border: 0px;
+ outline: none;
+}
+
+QTreeView::item, QTreeView::branch {
+ height: 22px;
+ show-decoration-selected: 1; /* make the selection span the entire width of the view */
+ background-color: BACKGROUND_COLOR;
+}
+
+QTreeView::item:focus{
+ border: 0px;
+ outline: none;
+}
+
+QTreeView::branch:has-children:!has-siblings:closed,
+QTreeView::branch:closed:has-children:has-siblings {
+ border-image: none;
+ image: url("RESOURCE_DIRNAME/icons/branch_closed_DARKNESS.png");
+}
+
+QTreeView::branch:open:has-children:!has-siblings,
+QTreeView::branch:open:has-children:has-siblings {
+ border-image: none;
+ image: url("RESOURCE_DIRNAME/icons/branch_open_DARKNESS.png");
+}
+
+QMenu::separator, QListView::item:hover,
+QTreeView::branch:hover, QTreeView::item:hover {
+ background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 20);
+}
+
+QTreeView::branch:selected,
+QFrame#headerFrame > QWidget, QFrame#headerFrame, QMenu::item:selected {
+ color: ACCENT_FOREGROUND_COLOR;
+ background-color: ACCENT_COLOR;
+}
+
+QTreeView::item:selected, QTreeView::item:selected:active,
+QListView::item:selected, QListView::item:selected:active {
+ color: ACCENT_FOREGROUND_COLOR;
+ background-color: ACCENT_COLOR;
+}
+
+
+
+QCheckBox::indicator, QRadioButton::indicator {
+ width: 16px;
+ height: 16px;
+}
+
+QRadioButton::indicator:checked {
+ image: url("RESOURCE_DIRNAME/icons/radio_button_checked_DARKNESS.png");
+}
+
+QRadioButton::indicator:unchecked {
+ image: url("RESOURCE_DIRNAME/icons/radio_button_unchecked_DARKNESS.png");
+}
+
+QCheckBox::indicator:checked, QMenu::indicator:non-exclusive:checked {
+ image: url("RESOURCE_DIRNAME/icons/check_box_checked_DARKNESS.png");
+}
+
+QCheckBox::indicator:unchecked, QMenu::indicator:non-exclusive:unchecked {
+ image: url("RESOURCE_DIRNAME/icons/check_box_unchecked_DARKNESS.png");
+}
+
+QCheckBox::indicator:disabled, QMenu::indicator:non-exclusive:disabled {
+ image: url("RESOURCE_DIRNAME/icons/check_box_unchecked_DARKNESS.png");
+}
+
+
+/*
+ --------------------------------------------------------------------------
+ ComboBox
+ --------------------------------------------------------------------------
+*/
+
+QComboBox {
+ width: 10px;
+ border: 0px;
+ padding-left: 2px;
+ border-radius: 0px;
+ background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 15);
+}
+
+QComboBox::drop-down {
+ border: 0px;
+ padding-top: 2px;
+ background-color: rgba(255, 255, 255, 0);
+ image: url("RESOURCE_DIRNAME/icons/drop_arrow_DARKNESS.png");
+}
+
+/*QComboBox::down-arrow {*/
+ /*width: 1px;*/
+ /*image: url("RESOURCE_DIRNAME/icons/null.png");*/
+ /*background-color: rgba(255, 255, 255, 0);*/
+/*}*/
+
+
+QSpinBox,
+QLineEdit,
+QComboBox,
+QComboBox QAbstractItemView:item {
+ height: 24px;
+ padding: 0 4px;
+ border-radius: 0px;
+ background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 15);
+ border-bottom: 0px solid rgba(255, 255, 255, 50);
+ selection-color: rgba(255, 255, 255, 230);
+ selection-background-color: ACCENT_COLOR;
+}
+
+QComboBox,
+QLineEdit {
+ border: 0px;
+ border-bottom: 2px solid rgba(0,0,0,0);
+}
+
+QComboBox:hover,
+QLineEdit:hover {
+ border: 0px;
+ background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 35);
+}
+
+QComboBox:focus,
+QLineEdit:focus {
+ border: 0px;
+ border-bottom: 2px solid ACCENT_COLOR;
+ background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 30);
+}
+
+QLineEdit#filterEdit QAbstractItemView {
+ border: 2px solid darkgray;
+ selection-background-color: lightgray;
+}
+
+QComboBox QAbstractItemView {
+ selection-background-color: ACCENT_COLOR;
+ selection-color: ACCENT_FOREGROUND_COLOR;
+}
+
+QComboBox QAbstractItemView::item {
+}
+
+
+QLabel {
+ selection-color: ACCENT_FOREGROUND_COLOR;
+ selection-background-color: ACCENT_COLOR;
+}
+
+/*
+ --------------------------------------------------------------------------
+ Tab bar
+ --------------------------------------------------------------------------
+*/
+
+QTabBar {
+ qproperty-drawBase: 0;
+}
+
+QTabBar::tab {
+ border: 0px;
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+QTabBar::tab:first:selected {
+ background-color: rgba(0, 0, 0, 0);
+ border-left: 0px solid rgba(0, 0, 0, 0);
+}
+
+
+/*
+ --------------------------------------------------------------------------
+ Menu Item
+ --------------------------------------------------------------------------
+*/
+
+
+QMenu {
+ border: 1px solid rgba(250, 250, 250, 25);
+}
+
+QMenu, QMenu QWidget {
+ font: 12px;
+ color: FOREGROUND_COLOR;
+ background-color: BACKGROUND_COLOR;
+}
+
+QMenu::separator {
+ height: 1px;
+ padding: 0px 1px 0px 1px;
+}
+
+QMenu::icon {
+ padding: 4px;
+}
+
+QMenu::indicator:non-exclusive {
+ width: 14px;
+ height: 14px;
+ margin-left: 3px;
+}
+
+QMenu::item {
+ min-width: 124px;
+ color: FOREGROUND_COLOR;
+ padding: 3px;
+ border: 1px solid rgba(0, 0, 0, 0);
+}
+
+
+QMenu::item:disabled {
+ color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 50);
+}
+
+QMenu::item:selected {
+ color: ACCENT_FOREGROUND_COLOR;
+ background-color: ACCENT_COLOR;
+}
+
+QMenu::item:selected:disabled {
+ color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 50);
+ background-color: rgba(ACCENT_COLOR_R, ACCENT_COLOR_G, ACCENT_COLOR_B, 50);
+}
+
+/*
+ --------------------------------------------------------------------------
+ SearchWidget
+ --------------------------------------------------------------------------
+*/
+/*
+SearchWidget {
+ margin: 2px;
+ padding: 0px;
+ min-height: 22;
+ max-height: 22;
+ border-radius: 2px;
+}
+*/
+SearchWidget, SearchWidget QLabel {
+ font: 18px;
+ padding: 0px;
+ padding-top:2px;
+ color: ACCENT_FOREGROUND_COLOR;
+ background-color: rgba(255, 255, 255, 0);
+ selection-background-color: rgba(ACCENT_FOREGROUND_COLOR_R, ACCENT_FOREGROUND_COLOR_G, ACCENT_FOREGROUND_COLOR_B, 210);
+ selection-color: ACCENT_COLOR;
+}
+
+SearchWidget[hasText=true] {
+ background-color: rgba(255, 255, 255, 30);
+ border-bottom: 2px solid rgba(255, 255, 255, 80);
+}
+
+SearchWidget:focus {
+ border: 0px;
+ border-bottom: 2px solid rgba(255, 255, 255, 180);
+ background-color: rgba(255, 255, 255, 30);
+ selection-background-color: rgba(255, 255, 255, 240);
+ selection-color: ACCENT_COLOR;
+}
+
+SearchWidget QLabel {
+ border: 0px;
+ color: FOREGROUND_COLOR;
+}
+
+SearchWidget QPushButton, SearchWidget QPushButton:hover {
+ border: 0px;
+ padding: 0px;
+ color: ACCENT_FOREGROUND_COLOR;
+ background-color: rgba(255, 255, 255, 0);
+}
+
+SearchWidget QPushButton {
+ qproperty-iconSize: 24px;
+}
+/*
+ --------------------------------------------------------------------------
+ QSplitter
+ --------------------------------------------------------------------------
+*/
+
+QSplitter {
+ max-width: 2px;
+ background-color: BACKGROUND_COLOR;
+}
+
+QSplitter:handle {
+ background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 10);
+}
+
+QSplitter::handle:hover {
+ background-color: ACCENT_COLOR;
+}
+
+
+/*
+ --------------------------------------------------------------------------
+ Slider Widget Action
+ --------------------------------------------------------------------------
+*/
+
+SliderWidgetAction {
+ padding-top: 4px;
+ padding-left: 18px;
+ padding-right: 4px;
+}
+
+SliderWidgetAction QLabel {
+ min-width: 50px;
+}
+
+
+/*
+ --------------------------------------------------------------------------
+ Separator Widget Action
+ --------------------------------------------------------------------------
+*/
+
+SeparatorWidgetAction {
+ margin: 2px;
+ padding-left: 4px;
+ margin-right: 0px;
+}
+
+SeparatorWidgetAction Line {
+ min-height: 1px;
+ max-height: 1px;
+ background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 30);
+}
+
+SeparatorWidgetAction QLabel {
+ min-height:22px;
+ max-height:22px;
+ padding-right: 2px;
+ color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 80);
+}
+
+
+/*
+ --------------------------------------------------------------------------
+ Other
+ --------------------------------------------------------------------------
+*/
+
+
+NavigationFrame {
+ margin: 2px;
+}
+
+#actionWidget {
+ margin: 0px;
+ padding: 0px;
+}
+
+#actionLabel {
+ padding-left: 5px;
+ background-color: transparent;
+}
+
+#actionOption {
+ color: FOREGROUND_COLOR;
+ margin: 1px;
+ background-color: rgba(255, 255, 255, 5);
+}
+
+ToastWidget {
+ max-height: 48px;
+ font: bold 25px;
+ border-radius: 5px;
+ color: rgb(250, 250, 250);
+ background-color: rgba(0, 0, 0, 200);
+}
+
+/*
+ --------------------------------------------------------------------------
+ TESTING NEW STYLE
+ --------------------------------------------------------------------------
+*/
+/*!**/
+ /*--------------------------------------------------------------------------*/
+ /*Folders Widget*/
+ /*--------------------------------------------------------------------------*/
+/**!*/
+
+/*FoldersWidget,*/
+/*FoldersWidget:item,*/
+/*FoldersWidget:branch {*/
+ /*color: rgba(255, 255, 255, 150);*/
+ /*background-color: rgb(60, 60, 60);*/
+/*}*/
+
+
+
+
+
+
+
+/*!**/
+ /*--------------------------------------------------------------------------*/
+ /*Preview Frame*/
+ /*--------------------------------------------------------------------------*/
+/**!*/
+
+/*PreviewFrame {*/
+ /*margin: 2px;*/
+/*}*/
+
+/*PreviewFrame, PreviewFrame QWidget {*/
+ /*color: rgba(255, 255, 255, 150);*/
+ /*background-color: rgb(60, 60, 60);*/
+/*}*/
+
+PreviewFrame QWidget {
+ color: FOREGROUND_COLOR;
+}
+
+#previewButtons QPushButton {
+ color: ACCENT_FOREGROUND_COLOR;
+ background-color: ACCENT_COLOR;
+}
+
+PreviewFrame QPushButton {
+ color: FOREGROUND_COLOR;
+}
+
+PreviewFrame QPushButton:hover {
+ color: ACCENT_FOREGROUND_COLOR;
+}
+
+/*
+--------------------------------------------------------------------------
+Status Widget
+--------------------------------------------------------------------------
+*/
+
+StatusWidget {
+ color: FOREGROUND_COLOR;
+ background-color: BACKGROUND_COLOR;
+ border-top: 1px solid rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 10);
+}
+
+
+StatusWidget QLabel {
+ background-color: transparent;
+}
+
+StatusWidget[status="error"],
+StatusWidget[status="error"] QLabel {
+ color: rgb(240, 240, 240);
+ background-color: rgb(220, 40, 40);
+ selection-color: rgb(220, 40, 40);
+ selection-background-color: rgb(240, 240, 240);
+}
+
+StatusWidget[status="warning"] {
+ color: rgb(240, 240, 240);
+ background-color: rgb(240, 170, 0);
+}
+
+
+/*
+--------------------------------------------------------------------------
+UPDATE AVAILABLE WIDGET
+--------------------------------------------------------------------------
+*/
+
+#updateAvailableButton {
+ padding: 2px;
+ margin: 2px;
+ font-size: 11px;
+ color: BACKGROUND_COLOR;
+ background-color: rgba(FOREGROUND_COLOR_R,FOREGROUND_COLOR_G,FOREGROUND_COLOR_B,150);
+ border-radius: 2px;
+}
+
+#updateAvailableButton {
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+#updateAvailableButton:hover {
+ background-color: rgba(FOREGROUND_COLOR_R,FOREGROUND_COLOR_G,FOREGROUND_COLOR_B,200);
+}
+
+
+/*
+--------------------------------------------------------------------------
+PROGRESS WIDGET
+--------------------------------------------------------------------------
+*/
+
+ProgressBar,
+ProgressBar QLabel {
+ background-color: transparent;
+}
+
+ProgressBar QLabel {
+ margin: 0px;
+ padding: 1px;
+ min-width: 100px;
+}
+
+ProgressBar QProgressBar{
+ margin-top: 4px;
+ margin-right: 6px;
+ max-width: 200px;
+ min-width: 150px;
+ max-height: 4px;
+ padding: 0px;
+ color: rgba(0,0,0,200);
+ border-radius: 2px;
+ background-color: rgba(250,250,250,50);
+}
+
+ProgressBar QProgressBar::chunk {
+ color: white;
+ background-color: white;
+ margin: 0px;
+ max-height: 4px;
+ border-radius: 2px;
+}
+
+
+ /*--------------------------------------------------------------------------*/
+ /* CUSTOM MESSAGE BOX */
+ /*--------------------------------------------------------------------------*/
+
+MessageBox {
+ min-width: 320px;
+ min-height: 220px;
+}
+
+#messageBoxHeaderLabel {
+ font: 16px;
+ color: rgb(255,255,255);
+}
+
+#messageBoxHeaderFrame {
+ height: 46px;
+ border-top-left-radius: 5px;
+ border-top-right-radius: 5px;
+ background-color: rgba(0,0,0,0);
+}
+
+#messageBox {
+ border-radius: 7px;
+ background-color: rgba(255,255,255,255);
+}
+
+#messageBox QWidget {
+ background-color: rgba(255,255,255,0);
+}
+
+#messageBox #messageBoxTitle QLabel {
+ font: 16px;
+}
+
+#messageBox #messageBoxIcon {
+ width: 32px;
+ height: 32px;
+}
+
+#messageBox #messageBoxBody QLabel {
+ font: 12px;
+}
+
+#messageBox #messageBoxInputEdit {
+ min-height: 32px;
+ background-color: rgba(240, 240, 240, 180);
+}
+
+#messageBoxBody QWidget {
+ color: rgb(100,100,110);
+}
+
+#messageBox QPushButton {
+ font: 12px;
+ color: rgba(250, 250, 250, 250);
+ min-width: 72px;
+ min-height: 32px;
+ padding-left: 9px;
+ padding-right: 9px;
+ border-radius: 16px;
+ background-color: rgba(180, 180, 180, 230);
+}
+
+#messageBox QPushButton:focus, #messageBox QPushButton:hover {
+ color: ACCENT_FOREGROUND_COLOR;
+ background-color: ACCENT_COLOR;
+}
+
+#messageBox QRadioButton::indicator:checked {
+ image: url("RESOURCE_DIRNAME/icons/radio_button_checked_black.png");
+}
+
+#messageBox QRadioButton::indicator:unchecked {
+ image: url("RESOURCE_DIRNAME/icons/radio_button_unchecked_black.png");
+}
+
+#messageBox QCheckBox::indicator:checked {
+ image: url("RESOURCE_DIRNAME/icons/check_box_checked_black.png");
+}
+
+#messageBox QCheckBox::indicator:unchecked {
+ image: url("RESOURCE_DIRNAME/icons/check_box_unchecked_black.png");
+}
+
+#messageBox QCheckBox::indicator:disabled {
+ image: url("RESOURCE_DIRNAME/icons/check_box_unchecked_black.png");
+}
+
+#messageBoxFrame {
+ background-color: rgba(0,0,0,100);
+}
+
+#settingsDialog {
+ min-width: 300px;
+ min-height: 300px;
+ max-width: 400px;
+ max-height: 400px;
+}
+
+#filterByAction QWidget {
+ background-color: transparent;
+}
+
+#filterByAction:hover {
+ background-color: ACCENT_COLOR;
+ color: ACCENT_FOREGROUND_COLOR;
+}
+
+#filterByAction {
+ height: 22px;
+ padding: 3px;
+ background-color: transparent;
+}
+
+#filterByAction #actionCounter {
+ padding: 2px;
+ border-radius: 5px;
+ background-color: rgba(255,255,255,20);
+}
+
+#filterByAction QCheckBox {
+ width: 64px;
+}
+
+#filterByAction QCheckBox::indicator {
+ width: 14px;
+ height: 14px;
+ padding-left: 2px;
+}
+
+
+/*
+----------------------------------------
+Settings Dialog Color Picker
+----------------------------------------
+*/
+
+#settingsDialog ColorPickerWidget {
+ margin: 0px;
+ max-height: 24px;
+ min-height: 24px;
+ border-radius: 4px;
+}
+
+#settingsDialog ColorPickerWidget #colorButton[first=true] {
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 2px;
+}
+
+#settingsDialog ColorPickerWidget #colorButton[last=true] {
+ border-top-right-radius: 2px;
+ border-bottom-right-radius: 2px;
+}
+
+#settingsDialog ColorPickerWidget #colorButton:checked {
+ border-bottom: 3px solid rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 180);
+}
+
+/*
+----------------------------------------
+Preview Widget Color Picker
+----------------------------------------
+*/
+
+PreviewWidget ColorPickerWidget {
+ margin: 0px;
+ max-height: 14px;
+ min-height: 14px;
+}
+
+PreviewWidget ColorPickerWidget #colorButton {
+ max-width: 14px;
+ min-width: 14px;
+ border-radius: 7px;
+}
+
+PreviewWidget ColorPickerWidget #colorButton:checked {
+ border: 2px solid rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 255);
+}
+
+
+/*
+----------------------------------------
+Icon Picker Action
+----------------------------------------
+*/
+
+IconPickerWidget {
+ max-height: 156px;
+ min-height: 156px;
+}
+
+
+#iconPickerAction {
+ max-height: 120px;
+ min-height: 120px;
+ margin-left: 10px;
+ margin-bottom: 10px;
+}
+
+#iconPickerAction QToolButton {
+ qproperty-iconSize: 14px;
+}
+
+IconPickerWidget QToolButton {
+ margin: 5px;
+ padding: 2px;
+ align: center;
+ min-width: 20px;
+ min-height: 20px;
+ max-width: 20px;
+ max-height: 20px;
+ border-radius: 2px;
+ qproperty-iconSize: 18px;
+}
+
+IconPickerWidget QToolButton {
+ color: rgb(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B);
+}
+
+IconPickerWidget QToolButton:checked {
+ background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 50);
+}
+
+IconPickerWidget QToolButton:hover {
+ background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 75);
+}
+
+
+/*
+----------------------------------------
+Color Picker Action
+----------------------------------------
+*/
+
+#colorPickerAction {
+ max-height: 28px;
+ min-height: 28px;
+ margin-left: 10px;
+}
+
+#colorPickerAction #colorButton {
+ max-width: 12px;
+ min-width: 12px;
+ max-height: 12px;
+ min-height: 12px;
+ border-radius: 6px;
+}
+
+#colorPickerAction #colorButton:checked {
+ border: 2px solid rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 255);
+}
+
+Lightbox {
+ background-color: rgba(0, 0, 0, 100);
+}
+
+#menuButton,
+#editButton {
+ margin-left: 4px;
+ min-width: 25px;
+ max-width: 25px;
+ border-radius: 2px;
+ text-align: center;
+ background-color: rgba(0,0,0,20);
+}
+
+#menuButton:hover,
+#editButton:hover {
+ background-color: rgba(100,100,100,20);
+}
+
+#editButton {
+ min-height: 22px;
+}
+
+/*
+#errorLabel {
+ font-style: italic;
+}
+*/
+
+/*
+---------------------------
+Field Widgets
+---------------------------
+*/
+
+SeparatorFieldWidget > #widget {
+ min-height: 1px;
+ max-height: 1px;
+ font: bold;
+ margin: 4px;
+ background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 20);
+}
+
+TextFieldWidget QTextEdit {
+ max-height: 92px;
+}
+
+FormWidget QWidget {
+ text-align: left;
+}
+
+#fieldWidget[layout="vertical"] {
+ min-height: 44px;
+}
+
+FieldWidget[layout="vertical"] {
+ margin-bottom: 3px;
+}
+
+FieldWidget[layout="vertical"] #label {
+ margin-bottom: 2px;
+}
+
+FieldWidget[layout="horizontal"] {
+ margin-top: 3px;
+}
+
+FieldWidget[layout="horizontal"] #label {
+ margin: 0px;
+ margin-right: 4px;
+}
+
+LabelFieldWidget[layout="horizontal"] {
+ min-height: 16px;
+ max-height: 16px;
+ margin-top: 2px;
+ margin-bottom: 0px;
+}
+
+FieldWidget #label {
+ min-width: 72px;
+ color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 100);
+}
+
+FieldWidget #label:disabled {
+ color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 25);
+}
+
+FormWidget #titleWidget {
+ padding: 2px;
+ margin:0px;
+ padding-left: 5px;
+ background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 20);
+ border-bottom: 0px solid rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 20);
+}
+
+FormWidget #titleWidget:checked {
+ background-color: rgba(255, 255, 255, 5);
+}
+
+FormWidget #optionsFrame {
+ margin: 0px;
+}
+
+FieldWidget QComboBox {
+ border: 1px solid transparent;
+}
+
+/*
+---------------------------
+Group Box Widget
+---------------------------
+*/
+
+GroupFieldWidget[layout="horizontal"] {
+ margin-top: 2px;
+ margin-bottom: 0px;
+}
+
+GroupBoxWidget {
+ margin-top: 3px;
+}
+
+GroupBoxWidget #title {
+ padding: 2px;
+ padding-left: 5px;
+ text-align: left;
+ border-radius: 2px;
+ min-height: 18px;
+ max-height: 18px;
+ icon-size: 18px;
+ color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 150);
+ background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 10);
+}
+
+GroupBoxWidget #title:checked {
+ background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 15);
+}
+
+GroupBoxWidget #title:hover {
+ background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 20);
+}
+
+/*
+---------------------------
+Save Widget & Load Widget
+---------------------------
+*/
+
+BaseSaveWidget #fieldWidget {
+ margin-top: 4px;
+}
+
+PreviewWidget ImageSequenceWidget {
+ background-color: rgba(0,0,0,0);
+}
+
+PreviewWidget #titleLabel,
+BaseSaveWidget #titleLabel,
+BaseLoadWidget #titleLabel {
+ font-size: 14px;
+}
+
+BaseLoadWidget #blendEdit {
+ min-width: 32px;
+ max-width: 32px;
+}
+
+BaseSaveWidget #acceptButton,
+BaseLoadWidget #acceptButton {
+ min-width: 80px;
+ max-height: 35px;
+ max-width: 125px;
+ min-height: 35px;
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 2px;
+}
+
+BaseSaveWidget #selectionSetButton,
+BaseLoadWidget #selectionSetButton {
+ min-width: 35px;
+ max-width: 35px;
+ min-height: 35px;
+ max-height: 35px;
+ margin-left: 1px;
+ border-top-right-radius: 2px;
+ border-bottom-right-radius: 2px;
+}
+
+BaseSaveWidget ImageSequenceWidget {
+ border-radius: 2px;
+ color: rgb(40, 40, 40);
+ border: 1px solid rgba(254, 255, 230, 200);
+ background-color: rgba(254, 255, 230, 200);
+}
+
+BaseSaveWidget ImageSequenceWidget {
+ border: 0px solid rgba(254, 255, 230, 200);
+}
+
+/*
+---------------------------
+Form Widget
+---------------------------
+*/
+
+FormWidget #fieldWidget {
+ margin-top: 4px;
+}
+
+FormWidget #titleLabel,
+FormWidget #titleLabel,
+FormWidget #titleLabel {
+ font-size: 14px;
+}
+
+FormWidget QLineEdit,
+FormWidget QTextEdit,
+FormWidget QComboBox,
+FormWidget #thumbnailButton,
+FormWidget QLineEdit,
+FormWidget QTextEdit,
+FormWidget QComboBox,
+FormWidget #thumbnailButton,
+FormWidget QLineEdit,
+FormWidget QTextEdit,
+FormWidget QComboBox,
+FormWidget #thumbnailButton {
+ border-radius: 2px;
+}
+
+FormWidget QLineEdit,
+FormWidget QLineEdit:focus,
+FormWidget QLineEdit:hover,
+FormWidget QTextEdit,
+FormWidget QTextEdit:focus,
+FormWidget QTextEdit:hover,
+FormWidget QPlainTextEdit,
+FormWidget QPlainTextEdit:focus,
+FormWidget QPlainTextEdit:hover {
+ color: rgb(40, 40, 40);
+ border: 1px solid rgba(254, 255, 230, 200);
+ background-color: rgba(254, 255, 230, 200);
+}
+
+FormDialog {
+ padding: 5px;
+ border-radius:3px;
+}
+
+FormDialog #title {
+ padding: 4px;
+ font-size: 18px;
+}
+
+FormDialog FieldWidget QLabel {
+ background-color: rgba(200,200,100, 0);
+}
+
+FormDialog FieldWidget {
+ padding-bottom: 10px;
+}
+
+FormDialog #description {
+ padding: 4px;
+ padding-bottom: 9px;
+ margin-bottom: 10px;
+ border-bottom: 1px solid rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 15);
+}
+
+FormDialog #acceptButton,
+FormDialog #rejectButton {
+ margin: 2px;
+ font-size: 14px;
+ padding: 4px;
+ min-width: 72px;
+ min-height: 24px;
+ border-radius: 2px;
+}
+
+FormDialog #acceptButton,
+FormDialog #rejectButton {
+ background-color: rgba(0,0,0,0);
+}
+
+FormDialog #acceptButton:disabled,
+FormDialog #rejectButton:disabled {
+ color: rgba(250, 250, 250, 50);
+}
+
+#acceptButton,
+#rejectButton {
+ background-color: rgba(0,0,0,0);
+}
+
+#acceptButton:disabled,
+#rejectButton:disabled {
+ color: rgba(250,250,250,50);
+}
+
+#acceptButton {
+ color: FOREGROUND_COLOR;
+}
+
+#acceptButton:hover {
+ color: ACCENT_FOREGROUND_COLOR;
+ background-color: rgba(ACCENT_COLOR_R, ACCENT_COLOR_G, ACCENT_COLOR_B, 220);
+}
+
+FormDialog #acceptButton:pressed {
+ background-color: rgba(ACCENT_COLOR_R, ACCENT_COLOR_G, ACCENT_COLOR_B, 220);
+}
+
+FormDialog #rejectButton:hover {
+ background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 50);
+}
+
+#acceptButton:pressed {
+ background-color: rgba(ACCENT_COLOR_R, ACCENT_COLOR_G, ACCENT_COLOR_B, 220);
+}
+
+#rejectButton:hover {
+ background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B,50);
+}
+
+FormDialog FieldWidget QLineEdit,
+FormDialog FieldWidget QTextEdit {
+ border-radius: 3px;
+}
+
+FieldWidget[error=true] QLineEdit:focus,
+FieldWidget[error=true] QTextEdit:focus {
+ border-color: rgb(250, 80, 80);
+}
+
+FieldWidget[error=true] QLineEdit,
+FieldWidget[error=true] QTextEdit {
+ color: rgba(255,255,255,200);
+ border-color: rgb(230, 80, 80);
+ background-color: rgba(230, 80, 80, 50);
+}
+
+
+ButtonGroupFieldWidget QPushButton {
+ height: 24px;
+ margin: 1px;
+ text-align: center;
+ color: FOREGROUND_COLOR;
+ background-color: rgba(0, 0, 0, 30);
+}
+
+ButtonGroupFieldWidget QPushButton[first=true] {
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 2px;
+}
+
+ButtonGroupFieldWidget QPushButton[last=true] {
+ border-top-right-radius: 2px;
+ border-bottom-right-radius: 2px;
+}
+
+ButtonGroupFieldWidget QPushButton:checked {
+ color: ACCENT_FOREGROUND_COLOR;
+ background-color: rgba(ACCENT_COLOR_R, ACCENT_COLOR_G, ACCENT_COLOR_B, 220);
+}
+
+
+/*
+FieldWidget[default=false] QLineEdit,
+FieldWidget[default=false] QTextEdit {
+ border: 1px solid rgba(240, 150, 0, 255);
+ background-color: rgba(240, 150, 0, 100);
+}
+
+FieldWidget[default=true] QComboBox {
+ border-radius: 2px;
+ border: 1px solid rgba(150, 150, 150, 100);
+}
+
+FieldWidget[default=false] QComboBox {
+ border-radius: 2px;
+ border: 1px solid rgba(240, 150, 0, 255);
+ background-color: rgba(240, 150, 0, 100);
+}
+
+FieldWidget[default=false] QRadioButton:checked {
+ color: rgb(240, 150, 0);
+}
+
+FieldWidget[default=false] #label {
+ color: rgb(240, 150, 0);
+}
+
+
+FieldWidget[error=true] QRadioButton:checked {
+ color: rgb(240, 0, 0);
+}
+
+FieldWidget[error=true] #label {
+ color: rgb(240, 0, 0);
+}
+*/
+
+BaseLoadWidget ImageSequenceWidget {
+ background-color: rgba(0,0,0,0);
+}
+
+/*
+DIALOG
+*/
+
+QDialog QPushButton {
+ text-align: center;
+ min-height: 32px;
+ min-width: 80px;
+ border-radius: 2px;
+}
+
+QDialog QPushButton:focus {
+ color: ACCENT_FOREGROUND_COLOR;
+ background-color: ACCENT_COLOR;
+}
+
+QDialog QPushButton {
+ color: FOREGROUND_COLOR;
+ background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 30);
+}
+
+QDialog QPushButton:hover {
+ background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 50);
+}
+
+/*
+--------------------------------------------------------------------------
+TITLE WIDGET
+--------------------------------------------------------------------------
+*/
+#titleWidget #titleButton {
+ font: bold;
+ margin: 0px;
+ padding: 0px;
+ padding-left: 4px;
+ text-align: left;
+ font-size: 14px;
+ min-height: 28px;
+ color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 210);
+ background-color: transparent;
+}
+
+
+#titleWidget #titleButton:hover {
+ background-color: rgba(250,250,250,0);
+}
+
+#titleWidget #menuButton {
+ margin-left: 4px;
+ margin-right: 4px;
+ font-size: 14px;
+ max-height: 22px;
+ max-width: 22px;
+ background-color: transparent;
+}
+
+#titleWidget #menuButton:hover {
+ background-color: rgba(250,250,250,25);
+}
+
+
+
+#titleWidget
+{
+ margin: 0px;
+ min-height: 26px;
+ background-color: rgba(0,0,0,15);
+ border-bottom: 1px solid rgba(250, 250, 250, 20);
+}
+
+#titleWidget LineEdit {
+ margin-left: 4px;
+ margin-right: 4px;
+ margin-bottom: 4px;
+ min-height: 22px;
+ font-size: 12px;
+}
+
+#titleWidget LineEdit #icon {
+ margin-top: -3px;
+ margin-left: 4px;
+}
+
+#titleWidget LineEdit #clear {
+ margin-top: -3px;
+ margin-right: 2px;
+}
+
+SidebarWidget #titleWidget LineEdit {
+ border: 0px solid rbga(0,0,0,0);
+ border-radius: 3px;
+}
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/LICENSE.txt b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/LICENSE.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/LICENSE.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Bold.ttf b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Bold.ttf
new file mode 100644
index 0000000..7b52945
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Bold.ttf differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-BoldItalic.ttf b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-BoldItalic.ttf
new file mode 100644
index 0000000..a670e14
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-BoldItalic.ttf differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-ExtraBold.ttf b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-ExtraBold.ttf
new file mode 100644
index 0000000..3660681
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-ExtraBold.ttf differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-ExtraBoldItalic.ttf b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-ExtraBoldItalic.ttf
new file mode 100644
index 0000000..8c4c15d
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-ExtraBoldItalic.ttf differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Italic.ttf b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Italic.ttf
new file mode 100644
index 0000000..e6c5414
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Italic.ttf differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Light.ttf b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Light.ttf
new file mode 100644
index 0000000..563872c
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Light.ttf differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-LightItalic.ttf b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-LightItalic.ttf
new file mode 100644
index 0000000..5ebe2a2
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-LightItalic.ttf differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Regular.ttf b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Regular.ttf
new file mode 100644
index 0000000..2e31d02
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Regular.ttf differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-SemiBold.ttf b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-SemiBold.ttf
new file mode 100644
index 0000000..99db86a
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-SemiBold.ttf differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-SemiBoldItalic.ttf b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-SemiBoldItalic.ttf
new file mode 100644
index 0000000..8cad4e3
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-SemiBoldItalic.ttf differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/add.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/add.png
new file mode 100644
index 0000000..9ad0c7d
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/add.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/add_28.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/add_28.png
new file mode 100644
index 0000000..9b240ad
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/add_28.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/archive.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/archive.svg
new file mode 100644
index 0000000..394dad2
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/archive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/arrows-rotate.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/arrows-rotate.svg
new file mode 100644
index 0000000..e0cb3f2
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/arrows-rotate.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/asset.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/asset.svg
new file mode 100644
index 0000000..a627fd5
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/asset.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/assets.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/assets.svg
new file mode 100644
index 0000000..208f688
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/assets.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/bars.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/bars.svg
new file mode 100644
index 0000000..b8b779b
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/bars.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/blank.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/blank.png
new file mode 100644
index 0000000..d6fa80c
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/blank.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/book.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/book.svg
new file mode 100644
index 0000000..22e9c39
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/book.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_closed_black.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_closed_black.png
new file mode 100644
index 0000000..db2623f
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_closed_black.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_closed_white.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_closed_white.png
new file mode 100644
index 0000000..b8e3040
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_closed_white.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_open_black.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_open_black.png
new file mode 100644
index 0000000..4f273f4
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_open_black.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_open_white.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_open_white.png
new file mode 100644
index 0000000..efb5ce3
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_open_white.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/camera-alt.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/camera-alt.svg
new file mode 100644
index 0000000..d4772d3
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/camera-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/camera.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/camera.svg
new file mode 100644
index 0000000..dc9f608
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/camera.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cancel.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cancel.png
new file mode 100644
index 0000000..36116ed
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cancel.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/caret-down.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/caret-down.svg
new file mode 100644
index 0000000..b3ee2ea
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/caret-down.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/caret-right.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/caret-right.svg
new file mode 100644
index 0000000..bcd4cd1
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/caret-right.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/character.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/character.svg
new file mode 100644
index 0000000..631f168
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/character.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_checked_black.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_checked_black.png
new file mode 100644
index 0000000..f1b52d9
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_checked_black.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_checked_white.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_checked_white.png
new file mode 100644
index 0000000..734353c
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_checked_white.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_unchecked_black.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_unchecked_black.png
new file mode 100644
index 0000000..d8a0cf2
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_unchecked_black.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_unchecked_white.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_unchecked_white.png
new file mode 100644
index 0000000..d9ba062
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_unchecked_white.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/circle.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/circle.png
new file mode 100644
index 0000000..b896637
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/circle.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/circle.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/circle.svg
new file mode 100644
index 0000000..c2db0b2
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/circle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cloud.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cloud.svg
new file mode 100644
index 0000000..38d2dc5
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cloud.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cog.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cog.png
new file mode 100644
index 0000000..476d5c9
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cog.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/columns-3.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/columns-3.svg
new file mode 100644
index 0000000..8357340
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/columns-3.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/critical.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/critical.png
new file mode 100644
index 0000000..6dafd36
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/critical.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cross.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cross.png
new file mode 100644
index 0000000..8431b7b
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cross.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/database.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/database.svg
new file mode 100644
index 0000000..a6e4982
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/database.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/delete.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/delete.png
new file mode 100644
index 0000000..c75e834
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/delete.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/drop_arrow_black.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/drop_arrow_black.png
new file mode 100644
index 0000000..f3423c0
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/drop_arrow_black.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/drop_arrow_white.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/drop_arrow_white.png
new file mode 100644
index 0000000..527c786
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/drop_arrow_white.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/environment.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/environment.svg
new file mode 100644
index 0000000..2b7eda4
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/environment.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/error.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/error.png
new file mode 100644
index 0000000..2606a0a
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/error.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/expand.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/expand.svg
new file mode 100644
index 0000000..e8f812d
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/expand.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/eye-slash.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/eye-slash.svg
new file mode 100644
index 0000000..5ccdbf7
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/eye-slash.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/eye.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/eye.svg
new file mode 100644
index 0000000..e5e88aa
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/eye.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/face.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/face.svg
new file mode 100644
index 0000000..dc8784a
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/face.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/favorite.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/favorite.svg
new file mode 100644
index 0000000..d9fa587
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/favorite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/file-alt.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/file-alt.svg
new file mode 100644
index 0000000..e1f980c
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/file-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/file.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/file.svg
new file mode 100644
index 0000000..7f495dc
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/file.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/filter.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/filter.svg
new file mode 100644
index 0000000..c745e65
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/filter.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder.svg
new file mode 100644
index 0000000..c960768
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_collapsed.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_collapsed.png
new file mode 100644
index 0000000..fb701e0
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_collapsed.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_expanded.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_expanded.png
new file mode 100644
index 0000000..829a0de
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_expanded.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_item.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_item.png
new file mode 100644
index 0000000..67022c3
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_item.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_open.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_open.png
new file mode 100644
index 0000000..0bb4b74
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_open.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_open.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_open.svg
new file mode 100644
index 0000000..57dcfa6
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_open.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/globe.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/globe.svg
new file mode 100644
index 0000000..3e4462e
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/globe.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/groupby.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/groupby.png
new file mode 100644
index 0000000..76b5574
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/groupby.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/hand.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/hand.svg
new file mode 100644
index 0000000..8ed4eed
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/hand.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/header.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/header.png
new file mode 100644
index 0000000..4efcb57
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/header.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/icon.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/icon.png
new file mode 100644
index 0000000..298cfdf
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/icon.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/image.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/image.png
new file mode 100644
index 0000000..ebe206f
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/image.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/inbox.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/inbox.svg
new file mode 100644
index 0000000..761d6c7
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/inbox.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/info.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/info.png
new file mode 100644
index 0000000..abdc049
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/info.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/layers.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/layers.svg
new file mode 100644
index 0000000..08ca453
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/layers.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/lock.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/lock.svg
new file mode 100644
index 0000000..7d0e70b
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/lock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/logo.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/logo.png
new file mode 100644
index 0000000..298cfdf
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/logo.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/logo_high.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/logo_high.png
new file mode 100644
index 0000000..0e4f48c
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/logo_high.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/logo_white.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/logo_white.png
new file mode 100644
index 0000000..df7b607
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/logo_white.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/magnifying-glass.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/magnifying-glass.svg
new file mode 100644
index 0000000..49f991b
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/magnifying-glass.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/plus-large.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/plus-large.svg
new file mode 100644
index 0000000..e017935
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/plus-large.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/plus.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/plus.svg
new file mode 100644
index 0000000..2a81ab8
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/plus.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/preview_placeholder.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/preview_placeholder.png
new file mode 100644
index 0000000..cf1db0c
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/preview_placeholder.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/question.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/question.png
new file mode 100644
index 0000000..b6a03e5
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/question.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_checked_black.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_checked_black.png
new file mode 100644
index 0000000..c73830e
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_checked_black.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_checked_white.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_checked_white.png
new file mode 100644
index 0000000..b896637
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_checked_white.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_unchecked_black.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_unchecked_black.png
new file mode 100644
index 0000000..c2a78ca
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_unchecked_black.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_unchecked_white.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_unchecked_white.png
new file mode 100644
index 0000000..ae56b1f
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_unchecked_white.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/search.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/search.png
new file mode 100644
index 0000000..083a9ee
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/search.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/search.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/search.svg
new file mode 100644
index 0000000..acd3282
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/search.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/settings.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/settings.png
new file mode 100644
index 0000000..5ec088e
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/settings.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/share.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/share.svg
new file mode 100644
index 0000000..2f3151d
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/share.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/shot.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/shot.svg
new file mode 100644
index 0000000..823951e
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/shot.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/sliders.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/sliders.svg
new file mode 100644
index 0000000..bfca789
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/sliders.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/sortby.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/sortby.png
new file mode 100644
index 0000000..64c574f
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/sortby.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/sync.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/sync.png
new file mode 100644
index 0000000..93290a9
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/sync.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/tag.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/tag.png
new file mode 100644
index 0000000..81375f8
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/tag.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/thumbnail.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/thumbnail.png
new file mode 100644
index 0000000..c77cdf3
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/thumbnail.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/thumbnail_solid.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/thumbnail_solid.png
new file mode 100644
index 0000000..03dc926
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/thumbnail_solid.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/times.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/times.svg
new file mode 100644
index 0000000..c528bcd
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/times.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/trash.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/trash.svg
new file mode 100644
index 0000000..6305280
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/trash.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/tree.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/tree.svg
new file mode 100644
index 0000000..a3c7f93
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/tree.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/user.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/user.svg
new file mode 100644
index 0000000..591873a
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/user.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/users.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/users.svg
new file mode 100644
index 0000000..3f07aab
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/users.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/vehicle.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/vehicle.svg
new file mode 100644
index 0000000..9b23899
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/vehicle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/video.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/video.svg
new file mode 100644
index 0000000..e14b3b9
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/video.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/view_all.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/view_all.png
new file mode 100644
index 0000000..d17e015
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/view_all.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/view_compact.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/view_compact.png
new file mode 100644
index 0000000..5bc5688
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/view_compact.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/view_settings.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/view_settings.png
new file mode 100644
index 0000000..4ef173e
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/view_settings.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/warning.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/warning.png
new file mode 100644
index 0000000..cac8e85
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/warning.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/xmark.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/xmark.svg
new file mode 100644
index 0000000..008abc4
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/xmark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/utils.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/utils.py
new file mode 100644
index 0000000..f53e551
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/utils.py
@@ -0,0 +1,1739 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import re
+import os
+import sys
+import json
+import uuid
+import errno
+import ctypes
+import shutil
+import locale
+import logging
+import getpass
+import random
+import tempfile
+import platform
+import threading
+import traceback
+import collections
+import distutils.version
+
+from datetime import datetime
+
+try:
+ from collections import Mapping
+except ImportError:
+ from collections.abc import Mapping
+
+# Use the built-in version of scandir/walk if possible,
+# otherwise use the scandir module version
+try:
+ from scandir import walk
+except ImportError:
+ from os import walk
+
+import studiolibrary
+
+from studiovendor import six
+from studiovendor.six.moves import urllib
+
+
+__all__ = [
+ "reload",
+ "user",
+ "isMac",
+ "isMaya",
+ "isLinux",
+ "isWindows",
+ "addLibrary",
+ "setLibraries",
+ "removeLibrary",
+ "defaultLibrary",
+ "checkForUpdates",
+ "read",
+ "write",
+ "update",
+ "saveJson",
+ "readJson",
+ "updateJson",
+ "replaceJson",
+ "readSettings",
+ "saveSettings",
+ "updateSettings",
+ "settingsPath",
+ "relPath",
+ "absPath",
+ "tempPath",
+ "realPath",
+ "normPath",
+ "normPaths",
+ "copyPath",
+ "movePath",
+ "movePaths",
+ "listPaths",
+ "splitPath",
+ "localPath",
+ "removePath",
+ "renamePath",
+ "formatPath",
+ "pathsFromUrls",
+ "resolveModule",
+ "createTempPath",
+ "renamePathInFile",
+ "walkup",
+ "generateUniquePath",
+ "MovePathError",
+ "RenamePathError",
+ "timeAgo",
+ "modules",
+ "setDebugMode",
+ "showInFolder",
+ "stringToList",
+ "listToString",
+ "registerItem",
+ "registerItems",
+ "registeredItems",
+ "runTests",
+ "findItemsInFolders",
+ "isVersionPath",
+ "latestVersionPath",
+]
+
+
+logger = logging.getLogger(__name__)
+
+
+_itemClasses = collections.OrderedDict()
+
+
+class PathError(IOError):
+ """
+ Exception that supports unicode escape characters.
+ """
+ def __init__(self, msg):
+ """
+ :type: str or unicode
+ """
+ msg = six.text_type(msg)
+ super(PathError, self).__init__(msg)
+ self._msg = msg
+
+ def __unicode__(self):
+ """
+ Return the decoded message using 'unicode_escape'
+
+ :rtype: unicode
+ """
+ return six.text_type(self._msg)
+
+
+class MovePathError(PathError):
+ """"""
+
+
+class RenamePathError(PathError):
+ """"""
+
+
+def reload():
+ """
+ Removes all Studio Library modules from the Python cache.
+
+ You can use this function for developing within DCC applications, however,
+ it should not be used in production.
+
+ Example:
+ import studiolibrary
+ studiolibrary.reload()
+
+ import studiolibrary
+ studiolibrary.main()
+ """
+ os.environ["STUDIO_LIBRARY_RELOADED"] = "1"
+
+ from studiolibrary import librarywindow
+ librarywindow.LibraryWindow.destroyInstances()
+
+ names = modules()
+
+ for mod in list(sys.modules.keys()):
+ for name in names:
+ if mod in sys.modules and mod.startswith(name):
+ logger.info('Removing module: %s', mod)
+ del sys.modules[mod]
+
+
+def defaultLibrary():
+ """
+ Get the name of the default library.
+
+ :rtype: str
+ """
+ libraries = readSettings()
+
+ # Try to get the library that has been set to default
+ for name in libraries:
+ if libraries[name].get("default"):
+ return name
+
+ # Try to get the library named Default
+ if "Default" in libraries:
+ return "Default"
+
+ # Try to get a library
+ for name in libraries:
+ return name
+
+ # Otherwise just return the name "Default"
+ return "Default"
+
+
+def addLibrary(name, path, **settings):
+ """
+ Add a new library with the given name, path and settings.
+
+ :type name: str
+ :type path: path
+ :type settings: dict
+ """
+ libraries = readSettings()
+ libraries.setdefault(name, {})
+ libraries[name]["path"] = path
+
+ update(libraries[name], settings)
+
+ saveSettings(libraries)
+
+
+def removeLibrary(name):
+ """
+ Remove a library by name.
+
+ :type name: str
+ """
+ libraries = readSettings()
+ if name in libraries:
+ del libraries[name]
+ saveSettings(libraries)
+
+
+def setLibraries(libraries):
+ """
+ Remove existing libraries and set the new.
+
+ Example:
+ import studiolibrary
+
+ libraries = [
+ {"name":"test1", "path":r"D:\LibraryData", "default":True}},
+ {"name":"test2", "path":r"D:\LibraryData2"},
+ {"name":"Temp", "path":r"C:\temp"},
+ ]
+
+ studiolibrary.setLibraries(libraries)
+
+ :type libraries: list[dict]
+ """
+ for library in libraries:
+ addLibrary(**library)
+
+ old = readSettings().keys()
+ new = [library["name"] for library in libraries]
+
+ remove = set(old) - set(new)
+ for name in remove:
+ removeLibrary(name)
+
+
+def modules():
+ """
+ Get all the module names for the package.
+
+ :rtype: list[str]
+ """
+ names = []
+ dirname = os.path.dirname(os.path.dirname(__file__))
+ for filename in os.listdir(dirname):
+ names.append(filename)
+ return names
+
+
+def setDebugMode(level):
+ """
+ Set the logging level to debug.
+
+ :type level: int
+ :rtype: None
+ """
+ if level:
+ level = logging.DEBUG
+ else:
+ level = logging.INFO
+
+ for name in modules():
+ logger_ = logging.getLogger(name)
+ logger_.setLevel(level)
+
+
+def resolveModule(name):
+ """Resolve a dotted name to a global object."""
+ name = name.split('.')
+ used = name.pop(0)
+ found = __import__(used)
+ for n in name:
+ used = used + '.' + n
+ try:
+ found = getattr(found, n)
+ except AttributeError:
+ __import__(used)
+ found = getattr(found, n)
+ return found
+
+
+def registerItems():
+ """Register all the items from the config file."""
+ for name in studiolibrary.config.get("itemRegistry"):
+ cls = resolveModule(name)
+ studiolibrary.registerItem(cls)
+
+
+def registerItem(cls):
+ """
+ Register the given item class to the given extension.
+
+ :type cls: studiolibrary.LibraryItem
+ :rtype: None
+ """
+ global _itemClasses
+ _itemClasses[cls.__name__] = cls
+
+
+def registeredItems():
+ """
+ Return all registered library item classes.
+
+ :rtype: list[studiolibrary.LibraryItem]
+ """
+ return _itemClasses.values()
+
+
+def clearRegisteredItems():
+ """
+ Remove all registered item classes.
+
+ :rtype: None
+ """
+ global _itemClasses
+ _itemClasses = collections.OrderedDict()
+
+
+def tempPath(*args):
+ """
+ Get the temp directory set in the config.
+
+ :rtype: str
+ """
+ temp = studiolibrary.config.get("tempPath")
+ return normPath(os.path.join(formatPath(temp), *args))
+
+
+def createTempPath(name, clean=True, makedirs=True):
+ """
+ Create a temp directory with the given name.
+
+ :type name: str
+ :type clean: bool
+ :type makedirs: bool
+
+ :rtype: bool
+ """
+ path = tempPath(name)
+
+ if clean and os.path.exists(path):
+ if os.path.exists(path):
+ shutil.rmtree(path)
+
+ if makedirs and not os.path.exists(path):
+ os.makedirs(path)
+
+ return path
+
+
+def pathsFromUrls(urls):
+ """
+ Return the local file paths from the given QUrls
+
+ :type urls: list[QtGui.QUrl]
+ :rtype: collections.Iterable[str]
+ """
+ for url in urls:
+ path = url.toLocalFile()
+
+ # Fixes a bug when dragging from windows explorer on windows 10
+ if isWindows():
+ if path.startswith("/"):
+ path = path[1:]
+
+ yield path
+
+
+def findItems(path, depth=3, **kwargs):
+ """
+ Find and create items by walking the given path.
+
+ :type path: str
+ :type depth: int
+
+ :rtype: collections.Iterable[studiolibrary.LibraryItem]
+ """
+ path = normPath(path)
+
+ maxDepth = depth
+ startDepth = path.count(os.path.sep)
+
+ for root, dirs, files in walk(path, followlinks=True):
+
+ files.extend(dirs)
+
+ for filename in files:
+ remove = False
+
+ # Normalise the path for consistent matching
+ path = os.path.join(root, filename)
+ item = itemFromPath(path, **kwargs)
+
+ if item:
+ # Yield the item that matches/supports the current path
+ yield item
+
+ # Stop walking the dir if the item doesn't support nested items
+ if not item.ENABLE_NESTED_ITEMS:
+ remove = True
+
+ if remove and filename in dirs:
+ dirs.remove(filename)
+
+ if depth == 1:
+ break
+
+ # Stop walking the directory if the maximum depth has been reached
+ currentDepth = root.count(os.path.sep)
+ if (currentDepth - startDepth) >= maxDepth:
+ del dirs[:]
+
+
+def findItemsInFolders(folders, depth=3, **kwargs):
+ """
+ Find and create new item instances by walking the given paths.
+
+ :type folders: list[str]
+ :type depth: int
+
+ :rtype: collections.Iterable[studiolibrary.LibraryItem]
+ """
+ for folder in folders:
+ for item in findItems(folder, depth=depth, **kwargs):
+ yield item
+
+
+def user():
+ """
+ Return the current user name in lowercase.
+
+ :rtype: str
+ """
+ return getpass.getuser().lower()
+
+
+def system():
+ """
+ Return the current platform in lowercase.
+
+ :rtype: str
+ """
+ return platform.system().lower()
+
+
+def isMaya():
+ """
+ Return True if the current python session is in Maya.
+
+ :rtype: bool
+ """
+ try:
+ import maya.cmds
+ maya.cmds.about(batch=True)
+ return True
+ except ImportError:
+ return False
+
+
+def isMac():
+ """
+ Return True if the current OS is Mac.
+
+ :rtype: bool
+ """
+ return system().startswith("os") or \
+ system().startswith("mac") or \
+ system().startswith("darwin")
+
+
+def isWindows():
+ """
+ Return True if the current OS is windows.
+
+ :rtype: bool
+ """
+ return system().startswith("win")
+
+
+def isLinux():
+ """
+ Return True if the current OS is linux.
+
+ :rtype: bool
+ """
+ return system().startswith("lin")
+
+
+def localPath(*args):
+ """
+ Return the users preferred disc location.
+
+ :rtype: str
+ """
+ path = os.getenv('APPDATA') or os.getenv('HOME')
+ path = os.path.join(path, "StudioLibrary", *args)
+
+ return path
+
+
+def formatPath(formatString, path="", **kwargs):
+ """
+ Resolve the given string with the given path and kwargs.
+
+ Example:
+ print formatPath("{dirname}/meta.json", path="C:/hello/world.json")
+ # "C:/hello/meta.json"
+
+ :type formatString: str
+ :type path: str
+ :type kwargs: dict
+ :rtype: str
+ """
+ logger.debug("Format String: %s", formatString)
+
+ dirname, name, extension = splitPath(path)
+
+ encoding = locale.getpreferredencoding()
+
+ # Environment variables return raw strings so we need to convert them to
+ # unicode using the preferred system encoding
+
+ temp = tempfile.gettempdir()
+ if temp:
+
+ temp = six.text_type(temp)
+
+ username = user()
+ if username:
+ username = six.text_type(username)
+
+ local = os.getenv('APPDATA') or os.getenv('HOME')
+ if local:
+ local = six.text_type(local)
+
+ kwargs.update(os.environ)
+
+ labels = {
+ "name": name,
+ "path": path,
+ "root": path, # legacy
+ "user": username,
+ "temp": temp,
+ "home": local, # legacy
+ "local": local,
+ "dirname": dirname,
+ "extension": extension,
+ }
+
+ kwargs.update(labels)
+
+ resolvedString = six.text_type(formatString).format(**kwargs)
+
+ logger.debug("Resolved String: %s", resolvedString)
+
+ return normPath(resolvedString)
+
+
+def copyPath(src, dst, force=False):
+ """
+ Make a copy of the given src path to the given destination path.
+
+ :type src: str
+ :type dst: str
+ :type force: bool
+ :rtype: str
+ """
+ dirname = os.path.dirname(src)
+
+ if "/" not in dst:
+ dst = os.path.join(dirname, dst)
+
+ src = normPath(src)
+ dst = normPath(dst)
+
+ logger.info(u'Copying path "{0}" -> "{1}"'.format(src, dst))
+
+ if src == dst:
+ msg = u'The source path and destination path are the same: {0}'
+ raise IOError(msg.format(src))
+
+ if not force and os.path.exists(dst):
+ msg = u'Cannot copy over an existing path: "{0}"'
+ raise IOError(msg.format(dst))
+
+ if force and os.path.exists(dst):
+ if os.path.isdir(dst):
+ shutil.rmtree(dst)
+ else:
+ os.remove(dst)
+
+ # Make sure the destination directory exists
+ dstDir = os.path.dirname(dst)
+ if not os.path.exists(dstDir):
+ os.makedirs(dstDir)
+
+ if os.path.isfile(src):
+ shutil.copy(src, dst)
+ else:
+ shutil.copytree(src, dst)
+
+ logger.info("Copied path!")
+
+ return dst
+
+
+def movePath(src, dst):
+ """
+ Move the given source path to the given destination path.
+
+ :type src: str
+ :type dst: str
+ :rtype: str
+ """
+ src = six.text_type(src)
+ dirname, name, extension = splitPath(src)
+
+ if not os.path.exists(src):
+ raise MovePathError(u'No such file or directory: {0}'.format(src))
+
+ if os.path.isdir(src):
+ dst = u'{0}/{1}{2}'.format(dst, name, extension)
+ dst = generateUniquePath(dst)
+
+ shutil.move(src, dst)
+ return dst
+
+
+def movePaths(srcPaths, dst):
+ """
+ Move the given src paths to the given dst path.
+
+ :type srcPaths: list[str]
+ :type dst: str
+ """
+ if not os.path.exists(dst):
+ os.makedirs(dst)
+
+ for src in srcPaths or []:
+
+ if not src:
+ continue
+
+ basename = os.path.basename(src)
+
+ dst_ = os.path.join(dst, basename)
+ dst_ = normPath(dst_)
+
+ logger.info(u'Moving Content: {0} => {1}'.format(src, dst_))
+ shutil.move(src, dst_)
+
+
+def silentRemove(filename):
+ """
+ Silently remove a file, ignore if it doesn't exist.
+
+ Workaround for #237 where `os.path.exists` gave false
+ positives and removal of files failed because of it.
+
+ :type filename: str
+ :rtype: None
+
+ """
+ try:
+ os.remove(filename)
+ except OSError as e:
+ # Ignore case of no such file or directory
+ if e.errno != errno.ENOENT:
+ raise
+
+
+def removePath(path):
+ """
+ Delete the given path from disc.
+
+ :type path: str
+ :rtype: None
+ """
+ if os.path.isfile(path):
+ os.remove(path)
+ elif os.path.isdir(path):
+ shutil.rmtree(path)
+
+
+def renamePath(src, dst, extension=None, force=False):
+ """
+ Rename the given source path to the given destination path.
+
+ :type src: str
+ :type dst: str
+ :type extension: str
+ :type force: bool
+ :rtype: str
+ """
+ dirname = os.path.dirname(src)
+
+ if "/" not in dst:
+ dst = os.path.join(dirname, dst)
+
+ if extension and extension not in dst:
+ dst += extension
+
+ src = normPath(src)
+ dst = normPath(dst)
+
+ logger.debug(u'Renaming: {0} => {1}'.format(src, dst))
+
+ if src == dst and not force:
+ msg = u'The source path and destination path are the same: {0}'
+ raise RenamePathError(msg.format(src))
+
+ if os.path.exists(dst) and not force:
+ msg = u'Cannot save over an existing path: "{0}"'
+ raise RenamePathError(msg.format(dst))
+
+ if not os.path.exists(dirname):
+ msg = u'The system cannot find the specified path: "{0}".'
+ raise RenamePathError(msg.format(dirname))
+
+ if not os.path.exists(os.path.dirname(dst)) and force:
+ os.mkdir(os.path.dirname(dst))
+
+ if not os.path.exists(src):
+ msg = u'The system cannot find the specified path: "{0}"'
+ raise RenamePathError(msg.format(src))
+
+ os.rename(src, dst)
+
+ logger.debug(u'Renamed: {0} => {1}'.format(src, dst))
+
+ return dst
+
+
+def read(path):
+ """
+ Return the contents of the given file.
+
+ :type path: str
+ :rtype: str
+ """
+ data = ""
+ path = normPath(path)
+
+ if os.path.isfile(path):
+ with open(path) as f:
+ data = f.read() or data
+
+ data = absPath(data, path)
+
+ return data
+
+
+def write(path, data):
+ if six.PY2:
+ write2(path, data)
+ else:
+ write3(path, data)
+
+
+def write2(path, data):
+ """
+ Write the given data to the given file on disc.
+
+ :type path: str
+ :type data: str
+ :rtype: None
+ """
+ path = normPath(path)
+ data = relPath(data, path)
+
+ tmp = path + ".tmp"
+ bak = path + ".bak"
+
+ # Create the directory if it doesn't exists
+ dirname = os.path.dirname(path)
+ if not os.path.exists(dirname):
+ os.makedirs(dirname)
+
+ # Use the tmp file to check for concurrent writes
+ if os.path.exists(tmp):
+ msg = "The path is locked for writing and cannot be accessed {}"
+ msg = msg.format(tmp)
+ raise IOError(msg)
+
+ # Safely write the data to a tmp file and then rename to the given path
+ try:
+ # Create and write the new data
+ # to the path.tmp file
+ with open(tmp, "w") as f:
+ f.write(data)
+ f.flush()
+
+ # Remove any existing path.bak files
+ silentRemove(bak)
+
+ # Rename the existing path to path.bak
+ if os.path.exists(path):
+ os.rename(path, bak)
+
+ # Rename the tmp path to the given path
+ if os.path.exists(tmp):
+ os.rename(tmp, path)
+
+ # Clean up the bak file only if the given path exists
+ if os.path.exists(path) and os.path.exists(bak):
+ silentRemove(bak)
+
+ except:
+ # Remove the tmp file if there are any issues
+ silentRemove(tmp)
+
+ # Restore the path from the current .bak file
+ if not os.path.exists(path) and os.path.exists(bak):
+ os.rename(bak, path)
+
+ raise
+
+
+def write3(path, data):
+ """
+ Writes the given data to a file atomically by first writing to a
+ temp file and then renaming it.
+
+ This approach avoids using the tempfile module to keep permissions
+ consistent with the write2 function.
+ """
+ path = normPath(path)
+ data = relPath(data, path)
+
+ dirname = os.path.dirname(path)
+ if not os.path.exists(dirname):
+ os.makedirs(dirname)
+
+ tmp = None
+
+ try:
+
+ # Create a temporary file with a random name
+ characters = "abcdefghijklmnopqrstuvwxyz0123456789_"
+ name = ''.join(random.choice(characters) for _ in range(8))
+ tmp = os.path.join(dirname, name + ".delete")
+
+ with open(tmp, "w") as f:
+ f.write(data)
+ f.flush()
+
+ # Introduced in python 3.3
+ os.replace(tmp, path)
+
+ finally:
+ if tmp and os.path.exists(tmp):
+ os.remove(tmp)
+
+
+def update(data, other):
+ """
+ Update the value of a nested dictionary of varying depth.
+
+ :type data: dict
+ :type other: dict
+ :rtype: dict
+ """
+ for key, value in other.items():
+ if isinstance(value, Mapping):
+ data[key] = update(data.get(key, {}), value)
+ else:
+ data[key] = value
+ return data
+
+
+def updateJson(path, data):
+ """
+ Update a json file with the given data.
+
+ :type path: str
+ :type data: dict
+ :rtype: None
+ """
+ data_ = readJson(path)
+ data_ = update(data_, data)
+ saveJson(path, data_)
+
+
+def saveJson(path, data):
+ """
+ Serialize the data to a JSON string and write it to the given path.
+
+ :type path: str
+ :type data: dict
+ :rtype: None
+ """
+ path = normPath(path)
+
+ data = collections.OrderedDict(sorted(data.items(), key=lambda t: t[0]))
+ data = json.dumps(data, indent=4)
+ write(path, data)
+
+
+def readJson(path):
+ """
+ Read the given JSON file and deserialize to a Python object.
+
+ :type path: str
+ :rtype: dict
+ """
+ path = normPath(path)
+
+ logger.debug(u'Reading json file: {0}'.format(path))
+
+ data = read(path) or "{}"
+ data = json.loads(data)
+
+ return data
+
+
+def settingsPath():
+ """
+ Get the settings path from the config file.
+
+ :rtype: str
+ """
+ formatString = studiolibrary.config.get('settingsPath')
+ return studiolibrary.formatPath(formatString)
+
+
+def updateSettings(data):
+ """
+ Update the existing settings with the given data.
+
+ :type data: dict
+ """
+ settings = studiolibrary.readSettings()
+ update(settings, data)
+ studiolibrary.saveSettings(settings)
+
+
+def readSettings():
+ """
+ Get all the user settings.
+
+ :rtype: dict
+ """
+ path = settingsPath()
+
+ logger.debug(u'Reading settings from "%s"', path)
+
+ data = {}
+
+ try:
+ data = studiolibrary.readJson(path)
+ except Exception as error:
+ logger.exception('Cannot read settings from "%s"', path)
+
+ return data
+
+
+def saveSettings(data):
+ """
+ Save the given data to the settings path.
+
+ :type data:
+ """
+ path = settingsPath()
+
+ logger.debug(u'Saving settings to "%s"', path)
+
+ try:
+ studiolibrary.saveJson(path, data)
+ except Exception:
+ logger.exception(u'Cannot save settings to "%s"', path)
+
+
+def replaceJson(path, old, new, count=-1):
+ """
+ Replace the old value with the new value in the given json file.
+
+ :type path: str
+ :type old: str
+ :type new: str
+ :type count: int
+ :rtype: dict
+ """
+ old = six.text_type(old)
+ new = six.text_type(new)
+
+ data = read(path) or "{}"
+ data = data.replace(old, new, count)
+ data = json.loads(data)
+
+ saveJson(path, data)
+
+ return data
+
+
+def renamePathInFile(path, src, dst):
+ """
+ Rename the given src path to the given dst path.
+
+ :type path: str
+ :type src: str
+ :type dst: str
+ :rtype: None
+ """
+ src = normPath(src)
+ dst = normPath(dst)
+
+ src1 = '"' + src + '"'
+ dst2 = '"' + dst + '"'
+
+ # Replace paths that match exactly the given src and dst strings
+ replaceJson(path, src1, dst2)
+
+ src2 = '"' + src
+ dst2 = '"' + dst
+
+ # Add a slash as a suffix for better directory matching
+ if not src2.endswith("/"):
+ src2 += "/"
+
+ if not dst2.endswith("/"):
+ dst2 += "/"
+
+ # Replace all paths that start with the src path with the dst path
+ replaceJson(path, src2, dst2)
+
+
+def relPath(data, start):
+ """
+ Return a relative version of all the paths in data from the start path.
+
+ :type data: str
+ :type start: str
+ :rtype: str
+ """
+ rpath = start
+
+ for i in range(0, 3):
+
+ rpath = os.path.dirname(rpath)
+ token = os.path.relpath(rpath, start)
+
+ rpath = normPath(rpath)
+ token = normPath(token)
+
+ if rpath.endswith("/"):
+ rpath = rpath[:-1]
+
+ data = data.replace(rpath, token)
+
+ return data
+
+
+def absPath(data, start, depth=3):
+ """
+ Return an absolute version of all the paths in data using the start path.
+
+ :type data: str
+ :type start: str
+ :type depth: int
+ :rtype: str
+ """
+ token = ".."
+ pairs = []
+ path = normPath(os.path.dirname(start))
+
+ # First create a list of tokens and paths.
+ for i in range(1, depth+1):
+ rel = ((token + "/") * i)
+ pairs.append((rel, path))
+ path = normPath(os.path.dirname(path))
+
+ # Second replace the token with the paths.
+ for pair in reversed(pairs):
+ rel, path = pair
+
+ # Replace with the trailing slash
+ # '../../', 'P:/LibraryData/'
+ if not rel.endswith("/"):
+ rel += "/"
+
+ if not path.endswith("/"):
+ path += "/"
+
+ data = data.replace(rel, path)
+
+ # Replace without the trailing slash
+ # '../..', 'P:/LibraryData'
+ if rel.endswith("/"):
+ rel = rel[:-1]
+
+ if path.endswith("/"):
+ path = path[:-1]
+
+ data = data.replace(rel, path)
+
+ return data
+
+
+def realPath(path):
+ """
+ Return the given path eliminating any symbolic link.
+
+ :type path: str
+ :rtype: str
+ """
+ path = os.path.realpath(path)
+ path = os.path.expanduser(path)
+ return normPath(path)
+
+
+def normPath(path):
+ """
+ Return a normalized path containing only forward slashes.
+
+ :type path: str
+ :rtype: unicode
+ """
+ # Check and support the UNC path structure
+ unc = path.startswith("//") or path.startswith("\\\\")
+
+ path = path.replace("//", "/")
+ path = path.replace("\\", "/")
+
+ if path.endswith("/") and not path.endswith(":/"):
+ path = path.rstrip("/")
+
+ # Make sure we retain the UNC path structure
+ if unc and not path.startswith("//") and path.startswith("/"):
+ path = "/" + path
+
+ return path
+
+
+def normPaths(paths):
+ """
+ Normalize all the given paths to a consistent format.
+
+ :type paths: list[str]
+ :rtype: list[str]
+ """
+ return [normPath(path) for path in paths]
+
+
+def splitPath(path):
+ """
+ Split the given path into directory, basename and extension.
+
+ Example:
+ print splitPath("P:/production/rigs/character/mario.ma
+
+ # (u'P:/production/rigs/character', u'mario', u'.ma')
+
+ :type path: str
+ :rtype: list[str]
+ """
+ path = normPath(path)
+ filename, extension = os.path.splitext(path)
+ return os.path.dirname(filename), os.path.basename(filename), extension
+
+
+def listToString(data):
+ """
+ Return a string from the given list.
+
+ Example:
+ print listToString(['apple', 'pear', 'cherry'])
+
+ # apple,pear,cherry
+
+ :type data: list
+ :rtype: str
+ """
+ # Convert all items to string and remove 'u'
+ data = [str(item) for item in data]
+ data = str(data).replace("[", "").replace("]", "")
+ data = data.replace("'", "").replace('"', "")
+ return data
+
+
+def stringToList(data):
+ """
+ Return a list from the given string.
+
+ Example:
+ print listToString('apple, pear, cherry')
+
+ # ['apple', 'pear', 'cherry']
+
+ :type data: str
+ :rtype: list
+ """
+ data = '["' + str(data) + '"]'
+ data = data.replace(' ', '')
+ data = data.replace(',', '","')
+ return eval(data)
+
+
+def isVersionPath(path):
+ basename = path.rstrip('/').split('/')[-1]
+ if re.match(r'^v\d+$', basename):
+ return True
+ return False
+
+
+def latestVersionPath(path):
+ version = ""
+
+ for name in sorted(os.listdir(path), reverse=True):
+ if name.startswith("v"):
+ version = name
+ break
+
+ if version:
+ return "{}/{}".format(path, version)
+
+
+def listPaths(path):
+ """
+ Return a list of paths that are in the given directory.
+
+ :type path: str
+ :rtype: collections.Iterable[str]
+ """
+ for name in os.listdir(path):
+ value = path + "/" + name
+ yield value
+
+
+def generateUniquePath(path, attempts=1000):
+ """
+ Generate a unique path on disc.
+
+ Example:
+ # If the following files exist then the next unique path will be 3.
+ # C:/tmp/file.text
+ # C:/tmp/file (2).text
+
+ print generateUniquePath("C:/tmp/file.text")
+ # C:/tmp/file (3).text
+
+ :type path: str
+ :type attempts: int
+ :rtype: str
+ """
+ attempt = 1 # We start at one so that the first unique name is actually 2.
+ dirname, name, extension = splitPath(path)
+ path_ = u'{dirname}/{name} ({number}){extension}'
+
+ while os.path.exists(path):
+ attempt += 1
+
+ path = path_.format(
+ name=name,
+ number=attempt,
+ dirname=dirname,
+ extension=extension
+ )
+
+ if attempt >= attempts:
+ msg = u'Cannot generate unique name for path {path}'
+ msg = msg.format(path=path)
+ raise ValueError(msg)
+
+ return path
+
+
+def walkup(path, match=None, depth=3, sep="/"):
+ """
+ :type path: str
+ :type match: func
+ :type depth: int
+ :type sep: str
+ :rtype: collections.Iterable[str]
+ """
+ path = normPath(path)
+
+ if not path.endswith(sep):
+ path += sep
+
+ folders = path.split(sep)
+ depthCount = 0
+
+ for i, folder in enumerate(folders):
+ if not folder:
+ continue
+
+ if depthCount > depth:
+ break
+ depthCount += 1
+
+ folder = os.path.sep.join(folders[:i*-1])
+ if not os.path.isdir(folder):
+ continue
+ try:
+ filenames = os.listdir(folder)
+ except PermissionError:
+ continue # expected on network shares
+ except OSError as e:
+ if getattr(e, 'winerror', None) == 59:
+ continue # "An unexpected network error occurred"
+ if getattr(e, 'winerror', None) == 6:
+ # "The handle is invalid" - something weird on network share
+ continue
+ raise
+ for filename in filenames:
+ path = os.path.join(folder, filename)
+ if match is None or match(path):
+ yield normPath(path)
+
+
+def timeAgo(timeStamp):
+ """
+ Return a pretty string for how long ago the given timeStamp was.
+
+ Example:
+ print timeAgo("2015-04-27 22:29:55"
+ # 2 years ago
+
+ :type timeStamp: str
+ :rtype: str
+ """
+ t1 = int(timeStamp)
+ t1 = datetime.fromtimestamp(t1)
+
+ t2 = datetime.now()
+ diff = t2 - t1
+
+ dayDiff = diff.days
+ secondsDiff = diff.seconds
+
+ if dayDiff < 0:
+ return ''
+
+ if dayDiff == 0:
+ if secondsDiff < 10:
+ return "just now"
+ if secondsDiff < 60:
+ return "{:.0f} seconds ago".format(secondsDiff)
+ if secondsDiff < 120:
+ return "a minute ago"
+ if secondsDiff < 3600:
+ return "{:.0f} minutes ago".format(secondsDiff / 60)
+ if secondsDiff < 7200:
+ return "an hour ago"
+ if secondsDiff < 86400:
+ return "{:.0f} hours ago".format(secondsDiff / 3600)
+
+ if dayDiff == 1:
+ return "yesterday"
+
+ if dayDiff < 7:
+ return "{:.0f} days ago".format(dayDiff)
+
+ if dayDiff < 31:
+ v = dayDiff / 7
+ if v == 1:
+ return "{:.0f} week ago".format(v)
+ return "{:.0f} weeks ago".format(dayDiff / 7)
+
+ if dayDiff < 365:
+ v = dayDiff / 30
+ if v == 1:
+ return "{:.0f} month ago".format(v)
+ return "{:.0f} months ago".format(v)
+
+ v = dayDiff / 365
+ if v == 1:
+ return "{:.0f} year ago".format(v)
+ return "{:.0f} years ago".format(v)
+
+
+def userUuid():
+ """
+ Return a unique uuid4 for each user.
+
+ This does not compromise privacy as it generates a random uuid4 string
+ for the current user.
+
+ :rtype: str
+ """
+ path = os.path.join(localPath(), "settings.json")
+ userUuid_ = readJson(path).get("userUuid")
+
+ if not userUuid_:
+ updateJson(path, {"userUuid": str(uuid.uuid4())})
+
+ # Read the uuid again to make sure its persistent
+ userUuid_ = readJson(path).get("userUuid")
+
+ return userUuid_
+
+
+def showInFolder(path):
+ """
+ Show the given path in the system file explorer.
+
+ :type path: unicode
+ :rtype: None
+ """
+ if isWindows():
+ # os.system() and subprocess.call() can't pass command with
+ # non ascii symbols, use ShellExecuteW directly
+ cmd = ctypes.windll.shell32.ShellExecuteW
+ else:
+ cmd = os.system
+
+ args = studiolibrary.config.get('showInFolderCmd')
+
+ if args:
+ if isinstance(args, six.string_types):
+ args = [args]
+
+ elif isLinux():
+ args = [u'xdg-open "{path}"&']
+
+ elif isWindows():
+ args = [None, u'open', u'explorer', u'/select, "{path}"', None, 1]
+
+ elif isMac():
+ args = [u'open -R "{path}"']
+
+ # Normalize the pathname for windows
+ path = os.path.normpath(path)
+
+ for i, a in enumerate(args):
+ if isinstance(a, six.string_types) and '{path}' in a:
+ args[i] = a.format(path=path)
+
+ logger.info("Call: '%s' with arguments: %s", cmd.__name__, args)
+ cmd(*args)
+
+
+global DCC_INFO
+
+try:
+ import maya.cmds
+ DCC_INFO = {
+ "name": "maya",
+ "version": maya.cmds.about(q=True, version=True)
+ }
+except Exception as error:
+ DCC_INFO = {
+ "name": "undefined",
+ "version": "undefined",
+ }
+
+
+def osVersion():
+ try:
+ # Fix for Windows 11 returning the wrong version
+ if platform.system().lower() == "windows" and platform.release() == "10" and sys.getwindowsversion().build >= 22000:
+ return "11"
+ finally:
+ return platform.release().replace(' ', '%20')
+
+
+def checkForUpdates():
+ """
+ This function should only be used once every session unless specified by the user.
+
+ Returns True if a newer release is found for the given platform.
+
+ :rtype: dict
+ """
+ if os.environ.get("STUDIO_LIBRARY_RELOADED") == "1":
+ return {}
+
+ if not studiolibrary.config.get('checkForUpdatesEnabled', True):
+ return {}
+
+ # In python 2.7 the getdefaultlocale function could return a None "ul"
+ try:
+ ul, _ = locale.getdefaultlocale()
+ ul = ul or "undefined"
+ ul = ul.replace("_", "-").lower()
+ except Exception as error:
+ ul = "undefined"
+
+ try:
+ uid = userUuid() or "undefined"
+ url = "https://app.studiolibrary.com/releases?uid={uid}&v={v}&dv={dv}&dn={dn}&os={os}&ov={ov}&pv={pv}&ul={ul}"
+ url = url.format(
+ uid=uid,
+ v=studiolibrary.__version__,
+ dn=DCC_INFO.get("name").replace(' ', '%20'),
+ dv=DCC_INFO.get("version").replace(' ', '%20'),
+ os=platform.system().lower().replace(' ', '%20'),
+ ov=osVersion(),
+ pv=platform.python_version().replace(' ', '%20'),
+ ul=ul,
+ )
+
+ response = urllib.request.urlopen(url)
+
+ # Check the HTTP status code
+ if response.getcode() == 200:
+ json_content = response.read().decode('utf-8')
+ data = json.loads(json_content)
+ return data
+
+ except Exception as error:
+ logger.debug("Exception occurred:\n%s", traceback.format_exc())
+ pass
+
+ return {}
+
+
+def testNormPath():
+ """Test the norm path utility function. """
+
+ assert normPath("//win-q9lu/Library Data") == "//win-q9lu/Library Data"
+
+ assert normPath("////win-q9lu/Library Data/") == "//win-q9lu/Library Data"
+
+ assert normPath("\\\\win-q9l\\Library Data\\") == "//win-q9l/Library Data"
+
+ assert normPath(r"C:\folder//Library Data/") == "C:/folder/Library Data"
+
+ assert normPath(r"\folder//Library Data/") == "/folder/Library Data"
+
+ assert normPath("C:\\folder//Library Data/") == "C:/folder/Library Data"
+
+ assert normPath("\\folder//Library Data/") == "/folder/Library Data"
+
+ assert normPath("C:/") == "C:/"
+
+
+def testUpdate():
+ """
+ Test the update dictionary command
+
+ :rtype: None
+ """
+ testData1 = {
+ "../../images/beach.jpg": {
+ "Custom Order": "00001"
+ },
+ "../../images/sky.jpg": {
+ "Custom Order": "00019",
+ "Other": {"Paths": "../../images/bird2.mb"}
+ }
+ }
+
+ testData2 = {
+ "../../images/sky.jpg": {
+ "Labels": ["head", "face"],
+ },
+ }
+
+ expected = {
+ "../../images/beach.jpg": {
+ "Custom Order": "00001"
+ },
+ "../../images/sky.jpg": {
+ "Custom Order": "00019",
+ "Labels": ["head", "face"],
+ "Other": {"Paths": "../../images/bird2.mb"}
+ }
+ }
+
+ # Test updating/inserting a value in a dictionary.
+ result = update(testData1, testData2)
+
+ msg = "Data does not match {} {}".format(expected, result)
+ assert expected == result, msg
+
+ # Test the update command with an empty dictionary.
+ testData2 = {
+ "../../images/sky.jpg": {},
+ }
+
+ result = update(testData1, testData2)
+
+ msg = "Data does not match {} {}".format(expected, result)
+ assert expected == result, msg
+
+
+def testSplitPath():
+ """
+ Test he splitPath command.
+
+ :rtype: None
+ """
+ path = "P:/production/rigs/character/mario.ma"
+
+ result = splitPath(path)
+ expected = (u'P:/production/rigs/character', u'mario', u'.ma')
+
+ msg = "Data does not match {} {}".format(expected, result)
+ assert expected == result, msg
+
+
+def testFormatPath():
+ """
+ Test the formatPath command.
+
+ :rtype: None
+ """
+ formatString = "{dirname}/versions/{name}{extension}"
+
+ result = formatPath(formatString, path="P:/production/rigs/database.json")
+ expected = "P:/production/rigs/versions/database.json"
+
+ msg = "Data does not match {} {}".format(expected, result)
+ assert expected == result, msg
+
+
+def testRelativePaths():
+ """
+ Test absolute and relative paths.
+
+ :rtype: None
+ """
+ data = """
+ {
+ "P:/path/head.anim": {},
+ "P:/test/path/face.anim": {},
+ "P:/test/relative/path/hand.anim": {},
+ }
+ """
+
+ expected = """
+ {
+ "../../../path/head.anim": {},
+ "../../path/face.anim": {},
+ "../path/hand.anim": {},
+ }
+ """
+
+ data_ = relPath(data, "P:/test/relative/file.database")
+ msg = "Data does not match {} {}".format(expected, data_)
+ assert data_ == expected, msg
+
+ data = """
+ {
+ "P:/": {},
+ "P:/head.anim": {},
+ "P:/path/head.anim": {},
+ "P:/test/path/face.anim": {},
+ "P:/test/relative/path/hand.anim": {},
+ }
+ """
+
+ expected = """
+ {
+ "../../": {},
+ "../../head.anim": {},
+ "../../path/head.anim": {},
+ "../../test/path/face.anim": {},
+ "../../test/relative/path/hand.anim": {},
+ }
+ """
+
+ data_ = relPath(data, "P:/.studiolibrary/database.json")
+ msg = "Data does not match {} {}".format(expected, data_)
+ assert data_ == expected, msg
+
+ path = "P:/path/head.anim"
+ start = "P:/test/relative/file.database"
+ expected = "../../../path/head.anim"
+
+ result = relPath(path, start)
+ msg = 'Data does not match "{}" "{}"'.format(result, expected)
+ assert result == expected, msg
+
+ result = absPath(result, start)
+ msg = 'Data does not match "{}" "{}"'.format(result, path)
+ assert result == path, msg
+
+ data = """
+ {
+ "P:/LibraryData": {},
+ }
+ """
+
+ expected = """
+ {
+ "../..": {},
+ }
+ """
+
+ data_ = relPath(data, "P:/LibraryData/.studiolibrary/database.json")
+
+ print(data_)
+ msg = "Data does not match {} {}".format(expected, data_)
+ assert data_ == expected, msg
+
+ data = """
+ {
+ "../..": {},
+ }
+ """
+
+ expected = """
+ {
+ "P:/LibraryData": {},
+ }
+ """
+
+ data_ = absPath(data, "P:/LibraryData/.studiolibrary/database.json")
+
+ print(data_)
+ msg = "Data does not match {} {}".format(expected, data_)
+ assert data_ == expected, msg
+
+
+def runTests():
+ """Run all the tests for this file."""
+ testUpdate()
+ testSplitPath()
+ testFormatPath()
+ testRelativePaths()
+ testNormPath()
+
+
+if __name__ == "__main__":
+ runTests()
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/PlaceholderWidget.ui b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/PlaceholderWidget.ui
new file mode 100644
index 0000000..a9ab813
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/PlaceholderWidget.ui
@@ -0,0 +1,95 @@
+
+
+ Frame
+
+
+
+ 0
+ 0
+ 229
+ 639
+
+
+
+ Frame
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+ -
+
+
+
+ 0
+ 10
+
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
-
+
+
+
+ 96
+ 96
+
+
+
+
+ 96
+ 96
+
+
+
+
+
+
+ ../resource/icons/preview_placeholder.png
+
+
+ true
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 2
+
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+
+
+
+
+
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/PreviewWidget.ui b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/PreviewWidget.ui
new file mode 100644
index 0000000..1c18811
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/PreviewWidget.ui
@@ -0,0 +1,300 @@
+
+
+ Frame
+
+
+
+ 0
+ 0
+ 160
+ 479
+
+
+
+
+ 160
+ 0
+
+
+
+ Frame
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 2
+
+
+ 0
+
+ -
+
+
+
+ 0
+ 24
+
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 0
+
+
+ 0
+
+
+
+
+ -
+
+
+
+ 0
+ 16
+
+
+
+
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 0
+
+
+ 4
+
+
+ 2
+
+
+ 4
+
+
+ 2
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 5000
+ 5000
+
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 1
+
+
+
+
+ 50
+ 50
+
+
+
+
+ 5000
+ 5000
+
+
+
+
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 0
+
+
+ 4
+
+
+ 2
+
+
+ 4
+
+
+ 2
+
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 15
+
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 0
+
+
+ 4
+
+
+ 2
+
+
+ 4
+
+
+ 2
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ -
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 4
+
+
+ 4
+
+
-
+
+
+
+ 32
+ 32
+
+
+
+
+ 96
+ 96
+
+
+
+
+ 12
+ 50
+ false
+
+
+
+ Accept
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/__init__.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/__init__.py
new file mode 100644
index 0000000..c72ecb9
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/__init__.py
@@ -0,0 +1,37 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from .lightbox import Lightbox
+from .lineedit import LineEdit
+from .sortbymenu import SortByMenu
+from .groupbymenu import GroupByMenu
+from .filterbymenu import FilterByMenu
+from .messagebox import MessageBox, createMessageBox
+from .toastwidget import ToastWidget
+from .searchwidget import SearchWidget
+from .statuswidget import StatusWidget
+from .previewwidget import PreviewWidget
+from .menubarwidget import MenuBarWidget
+from .sidebarwidget import SidebarWidget
+from .groupboxwidget import GroupBoxWidget
+from .placeholderwidget import PlaceholderWidget
+from .itemswidget.item import Item
+from .itemswidget.groupitem import GroupItem
+from .itemswidget.itemswidget import ItemsWidget
+from .themesmenu import Theme, ThemesMenu
+from .librariesmenu import LibrariesMenu
+from .slideraction import SliderAction
+from .separatoraction import SeparatorAction
+from .iconpicker import IconPickerAction, IconPickerWidget
+from .colorpicker import ColorPickerAction, ColorPickerWidget
+from .sequencewidget import ImageSequenceWidget
+from .formwidget import FormWidget, FormDialog
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/colorpicker.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/colorpicker.py
new file mode 100644
index 0000000..60beab8
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/colorpicker.py
@@ -0,0 +1,408 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from functools import partial
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+import studioqt
+
+
+class ColorButton(QtWidgets.QPushButton):
+
+ def __init__(self, *args):
+ QtWidgets.QPushButton.__init__(self, *args)
+
+ self._color = None
+
+ self.setCheckable(True)
+ self.setCursor(QtCore.Qt.PointingHandCursor)
+
+ def setColor(self, color):
+ """
+ Set the color for the button.
+
+ :type color: QtGui.QColor
+ """
+ self._color = color
+
+ color = studioqt.Color.fromString(color)
+
+ rgb = "{0},{1},{2}"
+ rgb = rgb.format(color.red(), color.green(), color.blue())
+
+ css = """
+ ColorButton {
+ background-color: rgb(RGB);
+ }
+
+ ColorButton:hover {
+ background-color: rgba(RGB, 220);
+ }
+ """.replace("RGB", rgb)
+
+ self.setStyleSheet(css)
+
+ def color(self):
+ """
+ Get the color for the button.
+
+ :rtype: QtGui.QColor
+ """
+ return self._color
+
+
+class ColorPickerAction(QtWidgets.QWidgetAction):
+
+ def __init__(self, *args):
+ super(ColorPickerAction, self).__init__(*args)
+
+ self._picker = ColorPickerWidget()
+ self._picker.setMouseTracking(True)
+ self._picker.setObjectName("colorPickerAction")
+ self._picker.colorChanged.connect(self._triggered)
+
+ def picker(self):
+ """
+ Get the picker widget instance.
+
+ :rtype: ColorPickerWidget
+ """
+ return self._picker
+
+ def _triggered(self):
+ """Triggered when the checkbox value has changed."""
+ self.trigger()
+
+ if isinstance(self.parent().parent(), QtWidgets.QMenu):
+ self.parent().parent().close()
+
+ elif isinstance(self.parent(), QtWidgets.QMenu):
+ self.parent().close()
+
+ def createWidget(self, menu):
+ """
+ This method is called by the QWidgetAction base class.
+
+ :type menu: QtWidgets.QMenu
+ """
+ widget = QtWidgets.QFrame(menu)
+ widget.setObjectName("colorPickerAction")
+
+ actionLayout = QtWidgets.QHBoxLayout()
+ actionLayout.setContentsMargins(0, 0, 0, 0)
+ actionLayout.addWidget(self.picker(), stretch=1)
+ widget.setLayout(actionLayout)
+
+ return widget
+
+
+class ColorPickerWidget(QtWidgets.QFrame):
+
+ COLOR_BUTTON_CLASS = ColorButton
+
+ colorChanged = QtCore.Signal(object)
+
+ def __init__(self, *args):
+ QtWidgets.QFrame.__init__(self, *args)
+
+ self._buttons = []
+ self._currentColor = None
+ self._browserColors = None
+ self._menuButton = None
+
+ layout = QtWidgets.QHBoxLayout()
+ layout.setSpacing(0)
+ layout.setContentsMargins(0, 0, 0, 0)
+ self.setLayout(layout)
+
+ def enterEvent(self, event):
+ """
+ Overriding this method to fix a bug with custom actions.
+
+ :type event: QtCore.QEvent
+ """
+ if self.parent():
+ menu = self.parent().parent()
+ if isinstance(menu, QtWidgets.QMenu):
+ menu.setActiveAction(None)
+
+ def _colorChanged(self, color):
+ """
+ Triggered when the user clicks or browses for a color.
+
+ :type color: studioqt.Color
+ :rtype: None
+ """
+ self.setCurrentColor(color)
+ self.colorChanged.emit(color)
+
+ def menuButton(self):
+ """
+ Get the menu button used for browsing for custom colors.
+
+ :rtype: QtGui.QWidget
+ """
+ return self._menuButton
+
+ def deleteButtons(self):
+ """
+ Delete all the color buttons.
+
+ :rtype: None
+ """
+ layout = self.layout()
+ while layout.count():
+ item = layout.takeAt(0)
+ item.widget().deleteLater()
+
+ def currentColor(self):
+ """
+ Return the current color.
+
+ :rtype: studioqt.Color
+ """
+ return self._currentColor
+
+ def setCurrentColor(self, color):
+ """
+ Set the current color.
+
+ :type color: studioqt.Color
+ """
+ self._currentColor = color
+ self.refresh()
+
+ def refresh(self):
+ """Update the current state of the selected color."""
+ for button in self._buttons:
+ button.setChecked(button.color() == self.currentColor())
+
+ def setColors(self, colors):
+ """
+ Set the colors for the color bar.
+
+ :type colors: list[str] or list[studioqt.Color]
+ """
+ self.deleteButtons()
+
+ first = True
+ last = False
+
+ for i, color in enumerate(colors):
+
+ if i == len(colors)-1:
+ last = True
+
+ if not isinstance(color, str):
+ color = studioqt.Color(color)
+ color = color.toString()
+
+ callback = partial(self._colorChanged, color)
+
+ button = self.COLOR_BUTTON_CLASS(self)
+
+ button.setObjectName('colorButton')
+ button.setColor(color)
+
+ button.setSizePolicy(
+ QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Preferred
+ )
+
+ button.setProperty("first", first)
+ button.setProperty("last", last)
+
+ button.clicked.connect(callback)
+
+ self.layout().addWidget(button)
+
+ self._buttons.append(button)
+
+ first = False
+
+ self._menuButton = QtWidgets.QPushButton("...", self)
+ self._menuButton.setObjectName('menuButton')
+ self._menuButton.setSizePolicy(
+ QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Preferred
+ )
+
+ self._menuButton.clicked.connect(self.browseColor)
+ self.layout().addWidget(self._menuButton)
+ self.refresh()
+
+ def setBrowserColors(self, colors):
+ """
+ :type colors: list((int,int,int))
+ """
+ self._browserColors = colors
+
+ def browserColors(self):
+ """
+ Get the colors to be displayed in the browser
+
+ :rtype: list[studioqt.Color]
+ """
+ return self._browserColors
+
+ @QtCore.Slot()
+ def blankSlot(self):
+ """Blank slot to fix an issue with PySide2.QColorDialog.open()"""
+ pass
+
+ def browseColor(self):
+ """
+ Show the color dialog.
+
+ :rtype: None
+ """
+ color = self.currentColor()
+ if color:
+ color = studioqt.Color.fromString(color)
+
+ d = QtWidgets.QColorDialog(self)
+ d.setCurrentColor(color)
+
+ standardColors = self.browserColors()
+
+ if standardColors:
+ index = -1
+ for standardColor in standardColors:
+ index += 1
+
+ try:
+ # Support for new qt5 signature
+ standardColor = QtGui.QColor(standardColor)
+ d.setStandardColor(index, standardColor)
+ except:
+ # Support for new qt4 signature
+ standardColor = QtGui.QColor(standardColor).rgba()
+ d.setStandardColor(index, standardColor)
+
+ d.currentColorChanged.connect(self._colorChanged)
+
+ if d.exec_():
+ self._colorChanged(d.selectedColor())
+ else:
+ self._colorChanged(color)
+
+
+def example():
+ """
+ Example:
+
+ import studiolibrary.widgets.colorpicker
+ reload(studiolibrary.widgets.colorpicker)
+ studiolibrary.widgets.colorpicker.example()
+ """
+ def _colorChanged(color):
+ print("colorChanged:", color)
+
+ style = """
+ #colorButton {
+ margin: 5px;
+ min-width: 100px;
+ min-height: 100px;
+ }
+
+ #browseColorButton {
+ margin: 5px;
+ font-size: 45px;
+ min-width: 100px;
+ min-height: 100px;
+ }
+ """
+
+ colors = [
+ "rgba(230, 60, 60, 255)",
+ "rgb(255, 90, 40)",
+ "rgba(255, 125, 100, 255)",
+ "rgba(250, 200, 0, 255)",
+ "rgba(80, 200, 140, 255)",
+ "rgba(50, 180, 240, 255)",
+ "rgba(110, 110, 240, 255)",
+ ]
+
+ browserColors = []
+ browserColors_ = [
+ # Top row, Bottom row
+ (230, 60, 60), (250, 80, 130),
+ (255, 90, 40), (240, 100, 170),
+ (255, 125, 100), (240, 200, 150),
+ (250, 200, 0), (225, 200, 40),
+ (80, 200, 140), (80, 225, 120),
+ (50, 180, 240), (100, 200, 245),
+ (130, 110, 240), (180, 160, 255),
+ (180, 110, 240), (210, 110, 255)
+ ]
+
+ for colorR, colorG, colorB in browserColors_:
+ for i in range(0, 3):
+ color = QtGui.QColor(colorR, colorG, colorB)
+ browserColors.append(color)
+
+ picker = ColorPickerWidget()
+ picker.setColors(colors)
+ picker.setStyleSheet(style)
+ picker.setBrowserColors(browserColors)
+ picker.colorChanged.connect(_colorChanged)
+ picker.show()
+
+
+def example2():
+ """
+ Example:
+
+ import studiolibrary.widgets.colorpicker
+ reload(studiolibrary.widgets.colorpicker)
+ studiolibrary.widgets.colorpicker.example2()
+ """
+ menu = QtWidgets.QMenu()
+
+ colors = [
+ "rgb(230, 60, 60)",
+ "rgb(255, 90, 40)",
+ "rgb(255, 125, 100)",
+ "rgb(250, 200, 0)",
+ "rgb(80, 200, 140)",
+ "rgb(50, 180, 240)",
+ "rgb(110, 110, 240)",
+ ]
+
+ action = ColorPickerAction(menu)
+ action.picker().setColors(colors)
+ menu.addAction(action)
+
+ colors = [
+ "rgb(20, 20, 20)",
+ "rgb(20, 30, 40)",
+ "rgb(40, 40, 40)",
+ "rgb(40, 50, 60)",
+ "rgb(60, 60, 60)",
+ "rgb(60, 70, 80)",
+ "rgb(240, 240, 240)",
+ ]
+
+ action = ColorPickerAction(menu)
+ action.picker().setColors(colors)
+ menu.addAction(action)
+ menu.addSeparator()
+
+ menu.exec_()
+
+
+if __name__ == "__main__":
+ with studioqt.app():
+ example()
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/fieldwidgets.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/fieldwidgets.py
new file mode 100644
index 0000000..f5202d0
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/fieldwidgets.py
@@ -0,0 +1,1512 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import re
+import logging
+import functools
+
+from studiovendor import six
+from studiovendor.Qt import QtGui, QtCore, QtWidgets
+
+import studioqt
+
+from . import groupboxwidget
+from . import colorpicker
+from . import iconpicker
+from . import sequencewidget
+
+
+logger = logging.getLogger(__name__)
+
+
+def toTitle(name):
+ """Convert camel case strings to title strings"""
+ s1 = re.sub('(.)([A-Z][a-z]+)', r'\1 \2', name)
+ return re.sub('([a-z0-9])([A-Z])', r'\1 \2', s1).title()
+
+
+class FieldWidget(QtWidgets.QFrame):
+
+ """The base widget for all field widgets.
+
+ Examples:
+
+ data = {
+ 'name': 'startFrame',
+ 'type': 'int'
+ 'value': 1,
+ }
+
+ fieldWidget = FieldWidget(data)
+
+ """
+ valueChanged = QtCore.Signal()
+
+ DefaultLayout = "horizontal"
+
+ def __init__(self, parent=None, data=None, formWidget=None):
+ super(FieldWidget, self).__init__(parent)
+
+ self._data = data or {}
+ self._widget = None
+ self._default = None
+ self._required = None
+ self._collapsed = False
+ self._errorLabel = None
+ self._menuButton = None
+ self._actionResult = None
+ self._formWidget = None
+ self._validateEnabled = True
+
+ if formWidget:
+ self.setFormWidget(formWidget)
+
+ self.setObjectName("fieldWidget")
+
+ direction = self._data.get("layout", self.DefaultLayout)
+
+ if direction == "vertical":
+ layout = QtWidgets.QVBoxLayout()
+ else:
+ layout = QtWidgets.QHBoxLayout()
+
+ layout.setContentsMargins(0, 0, 0, 0)
+ layout.setSpacing(0)
+ self.setLayout(layout)
+
+ self.setContentsMargins(0, 0, 0, 0)
+
+ self._label = QtWidgets.QLabel(self)
+ self._label.setObjectName('label')
+ self._label.setSizePolicy(
+ QtWidgets.QSizePolicy.Preferred,
+ QtWidgets.QSizePolicy.Preferred,
+ )
+
+ layout.addWidget(self._label)
+
+ self._layout2 = QtWidgets.QHBoxLayout()
+ layout.addLayout(self._layout2)
+
+ if direction == "vertical":
+ self._label.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
+ else:
+ self._label.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
+
+ widget = self.createWidget()
+ if widget:
+ self.setWidget(widget)
+
+
+ def setValidateEnabled(self, v):
+ self._validateEnabled = v
+
+ def validateEnabled(self):
+ return self._validateEnabled
+
+ def name(self):
+ """
+ Get the name of field widget.
+
+ :rtype: str
+ """
+ return self.data()["name"]
+
+ def defaultData(self):
+ """
+ This is the default data used by the schema.
+
+ :rtype: dict
+ """
+ return {}
+
+ def setFormWidget(self, formWidget):
+ """
+ Set the form widget which contains the field widget.
+
+ :type formWidget: studiolibrary.widgets.formwidget.FormWidget
+ """
+ self._formWidget = formWidget
+
+ def formWidget(self):
+ """
+ Get the form widget the contains the field widget.
+
+ :return: studiolibrary.widgets.formwidget.FormWidget
+ """
+ return self._formWidget
+
+ def setCollapsed(self, collapsed):
+ """
+ Set the field widget collapsed used by the GroupFieldWidget.
+
+ :return: studiolibrary.widgets.formwidget.FormWidget
+ """
+ self._collapsed = collapsed
+
+ def isCollapsed(self):
+ """
+ Get the collapsed state of the field widget.
+
+ :return: studiolibrary.widgets.formwidget.FormWidget
+ """
+ return self._collapsed
+
+ def createWidget(self):
+ """
+ Create the widget to be used by the field.
+
+ :rtype: QtWidgets.Widget or None
+ """
+ return None
+
+ def label(self):
+ """
+ Get the label widget.
+
+ :rtype: QtWidgets.QLabel
+ """
+ return self._label
+
+ def state(self):
+ """
+ Get the current state of the data.
+
+ :rtype: dict
+ """
+ return {
+ "name": self._data["name"],
+ "value": self.value()
+ }
+
+ def data(self):
+ """
+ Get the data for the widget.
+
+ :rtype: dict
+ """
+ return self._data
+
+ def title(self):
+ """
+ Get the title to be displayed for the field.
+
+ :rtype: str
+ """
+ data = self.data()
+
+ title = data.get("title")
+ if title is None:
+ title = data.get("name", "")
+ title = toTitle(title)
+
+ if self.isRequired():
+ title += '*'
+
+ return title
+
+ def setData(self, data):
+ """
+ Set the current state of the field widget using a dictionary.
+
+ :type data: dict
+ """
+ self.blockSignals(True)
+
+ items = data.get('items')
+ if items is not None:
+ self.setItems(items)
+
+ value = data.get('value')
+ default = data.get('default')
+
+ # Must set the default before value
+ if default is not None:
+ self.setDefault(default)
+ elif value is not None:
+ self.setDefault(value)
+
+ if value is not None or (value and value != self.value()):
+ try:
+ self.setValue(value)
+ except TypeError as error:
+ logger.exception(error)
+
+ enabled = data.get('enabled')
+ if enabled is not None:
+ self.setEnabled(enabled)
+ self._label.setEnabled(enabled)
+
+ hidden = data.get('hidden')
+ if hidden is not None:
+ self.setHidden(hidden)
+
+ visible = data.get('visible')
+ if visible is not None and not self.isCollapsed():
+ self.setVisible(visible)
+
+ required = data.get('required')
+ if required is not None:
+ self.setRequired(required)
+
+ error = data.get('error')
+ if error is not None:
+ self.setError(error)
+
+ value = data.get('errorVisible')
+ if value is not None:
+ self.setErrorVisible(value)
+
+ toolTip = data.get('toolTip')
+ if toolTip is not None:
+ self.setToolTip(toolTip)
+ self.setStatusTip(toolTip)
+
+ placeholder = data.get("placeholder")
+ if placeholder is not None:
+ self.setPlaceholder(placeholder)
+
+ style = data.get("style")
+ if style is not None:
+ self.setStyleSheet(style)
+
+ title = self.title() or ""
+ self.setText(title)
+
+ label = data.get('label')
+ if label is not None:
+
+ text = label.get("name")
+ if text is not None:
+ self.setText(text)
+
+ visible = label.get('visible')
+ if visible is not None:
+ self.label().setVisible(visible)
+
+ # Menu Items
+ actions = data.get('actions')
+ if actions is not None:
+ self._menuButton.setVisible(True)
+
+ # Menu Button
+ menu = data.get('menu')
+ if menu is not None:
+ text = menu.get("name")
+ if text is not None:
+ self._menuButton.setText(text)
+
+ visible = menu.get("visible", True)
+ self._menuButton.setVisible(visible)
+
+ self._data.update(data)
+
+ self.refresh()
+
+ self.blockSignals(False)
+
+ def setPlaceholder(self, placeholder):
+ """
+ Set the placeholder text to be displayed for the widget.
+
+ :type placeholder: str
+ :raises: NotImplementedError
+ """
+ NotImplementedError('The method "setPlaceholder" needs to be implemented')
+
+ def hasError(self):
+ """
+ Check if the field contains any errors.
+
+ :rtype: bool
+ """
+ return bool(self.data().get("error"))
+
+ def setErrorVisible(self, visible):
+ """
+ Set the error message visibility.
+
+ :type visible: bool
+ """
+ self._data["errorVisible"] = visible
+ self.refreshError()
+
+ def setError(self, message):
+ """
+ Set the error message to be displayed for the field widget.
+
+ :type message: str
+ """
+ self._data["error"] = message
+ self.refreshError()
+
+ def refreshError(self):
+ """Refresh the error message with the current data."""
+ error = self.data().get("error")
+
+ if self.hasError() and self.data().get("errorVisible", False):
+ self._errorLabel.setText(error)
+ self._errorLabel.setHidden(False)
+ self.setToolTip(error)
+ else:
+ self._errorLabel.setText("")
+ self._errorLabel.setHidden(True)
+ self.setToolTip(self.data().get('toolTip'))
+
+ self.refresh()
+
+ def setText(self, text):
+ """
+ Set the label text for the field widget.
+
+ :type text: str
+ """
+ self._label.setText(text)
+
+ def setValue(self, value):
+ """
+ Set the value of the field widget.
+
+ Will emit valueChanged() if the new value is different from the old one.
+
+ :type value: object
+ """
+ self.emitValueChanged()
+
+ def value(self):
+ """
+ Get the value of the field widget.
+
+ :rtype: object
+ """
+ raise NotImplementedError('The method "value" needs to be implemented')
+
+ def setItems(self, items):
+ """
+ Set the items for the field widget.
+
+ :type items: list[str]
+ """
+ raise NotImplementedError('The method "setItems" needs to be implemented')
+
+ def reset(self):
+ """Reset the field widget back to the defaults."""
+ self.setState(self._data)
+
+ def setRequired(self, required):
+ """
+ Set True if a value is required for this field.
+
+ :type required: bool
+ """
+ self._required = required
+ self.setProperty('required', required)
+ self.setStyleSheet(self.styleSheet())
+
+ def isRequired(self):
+ """
+ Check if a value is required for the field widget.
+
+ :rtype: bool
+ """
+ return bool(self._required)
+
+ def setDefault(self, default):
+ """
+ Set the default value for the field widget.
+
+ :type default: object
+ """
+ self._default = default
+
+ def default(self):
+ """
+ Get the default value for the field widget.
+
+ :rtype: object
+ """
+ return self._default
+
+ def isDefault(self):
+ """
+ Check if the current value is the same as the default value.
+
+ :rtype: bool
+ """
+ return self.value() == self.default()
+
+ def emitValueChanged(self, *args):
+ """
+ Emit the value changed signal.
+
+ :type args: list
+ """
+ self.valueChanged.emit()
+ self.refresh()
+
+ def setWidget(self, widget):
+ """
+ Set the widget used to set and get the field value.
+
+ :type widget: QtWidgets.QWidget
+ """
+ widgetLayout = QtWidgets.QHBoxLayout()
+ widgetLayout.setContentsMargins(0, 0, 0, 0)
+ widgetLayout.setSpacing(0)
+
+ self._widget = widget
+ self._widget.setParent(self)
+ self._widget.setObjectName('widget')
+ self._widget.setSizePolicy(
+ QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Preferred,
+ )
+
+ self._menuButton = QtWidgets.QPushButton("...")
+ self._menuButton.setHidden(True)
+ self._menuButton.setObjectName("menuButton")
+ self._menuButton.clicked.connect(self._menuCallback)
+ self._menuButton.setSizePolicy(
+ QtWidgets.QSizePolicy.Preferred,
+ QtWidgets.QSizePolicy.Expanding,
+ )
+
+ widgetLayout.addWidget(self._widget)
+ widgetLayout.addWidget(self._menuButton)
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.setContentsMargins(0, 0, 0, 0)
+ layout.setSpacing(0)
+
+ self._errorLabel = QtWidgets.QLabel(self)
+ self._errorLabel.setHidden(True)
+ self._errorLabel.setObjectName("errorLabel")
+ self._errorLabel.setSizePolicy(
+ QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Preferred,
+ )
+
+ layout.addLayout(widgetLayout)
+ layout.addWidget(self._errorLabel)
+
+ self._layout2.addLayout(layout)
+
+ def _menuCallback(self):
+ callback = self.data().get("menu", {}).get("callback", self.showMenu)
+ callback()
+
+ def _actionCallback(self, callback):
+ """
+ Wrap schema callback to get the return value.
+
+ :type callback: func
+ """
+ self._actionResult = callback()
+
+ def showMenu(self):
+ """Show the menu using the actions from the data."""
+ menu = QtWidgets.QMenu(self)
+ actions = self.data().get("actions", [])
+
+ for action in actions:
+
+ name = action.get("name", "No name found")
+ enabled = action.get("enabled", True)
+ callback = action.get("callback")
+
+ func = functools.partial(self._actionCallback, callback)
+
+ action = menu.addAction(name)
+ action.setEnabled(enabled)
+ action.triggered.connect(func)
+
+ point = QtGui.QCursor.pos()
+ point.setX(point.x() + 3)
+ point.setY(point.y() + 3)
+
+ # Reset the action results
+ self._actionResult = None
+
+ menu.exec_(point)
+
+ if self._actionResult is not None:
+ self.setValue(self._actionResult)
+
+ def widget(self,):
+ """
+ Get the widget used to set and get the field value.
+
+ :rtype: QtWidgets.QWidget
+ """
+ return self._widget
+
+ def refresh(self):
+ """Refresh the style properties."""
+ direction = self._data.get("layout", self.DefaultLayout)
+
+ self.setProperty("layout", direction)
+ self.setProperty('default', self.isDefault())
+
+ if self.data().get("errorVisible", False):
+ self.setProperty('error', self.hasError())
+
+ self.setStyleSheet(self.styleSheet())
+
+
+class GroupFieldWidget(FieldWidget):
+
+ def __init__(self, *args, **kwargs):
+ super(GroupFieldWidget, self).__init__(*args, **kwargs)
+
+ widget = groupboxwidget.GroupBoxWidget(self.data().get("title"), None)
+ widget.setChecked(True)
+ widget.toggled.connect(self.setValue)
+
+ self.setWidget(widget)
+ self.setValidateEnabled(False)
+
+ self.label().hide()
+
+ def defaultData(self):
+ """
+ Get the default values for the group field.
+
+ :rtype: dict
+ """
+ return {
+ "value": True,
+ "persistent": True,
+ "validate": False,
+ "persistentKey": "BaseItem",
+ }
+
+ def value(self):
+ """
+ Get the value of the Group Field
+
+ :type: bool
+ """
+ return self.widget().isChecked()
+
+ def setValue(self, visible):
+ """
+ Set the value of the Group Field
+
+ :type visible: bool
+ """
+ self.widget().setChecked(visible)
+
+ isChild = False
+
+ if self.formWidget():
+ for fieldWidget in self.formWidget().fieldWidgets():
+
+ if fieldWidget.name() == self.name():
+ isChild = True
+ continue
+
+ if isChild:
+
+ if isinstance(fieldWidget, GroupFieldWidget):
+ break
+
+ fieldWidget.setCollapsed(not visible)
+
+ if visible and fieldWidget.data().get("visible") is not None:
+ fieldWidget.setVisible(fieldWidget.data().get("visible"))
+ else:
+ fieldWidget.setVisible(visible)
+
+
+class Label(QtWidgets.QLabel):
+
+ """A custom label which supports elide right."""
+
+ def __init__(self, *args):
+ super(Label, self).__init__(*args)
+ self._text = ''
+
+ def setText(self, text):
+ """
+ Overriding this method to store the original text.
+
+ :type text: str
+ """
+ self._text = text
+ QtWidgets.QLabel.setText(self, text)
+
+ def resizeEvent(self, event):
+ """Overriding this method to modify the text with elided text."""
+ metrics = QtGui.QFontMetrics(self.font())
+ elided = metrics.elidedText(self._text, QtCore.Qt.ElideRight, self.width())
+ QtWidgets.QLabel.setText(self, elided)
+
+
+class LabelFieldWidget(FieldWidget):
+
+ def __init__(self, *args, **kwargs):
+ super(LabelFieldWidget, self).__init__(*args, **kwargs)
+
+ widget = Label(self)
+ widget.setAlignment(QtCore.Qt.AlignVCenter)
+ widget.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse)
+ self.setWidget(widget)
+ self.setValidateEnabled(False)
+
+ def value(self):
+ """
+ Get the value of the label.
+
+ :rtype: str
+ """
+ return six.text_type(self.widget().text())
+
+ def setValue(self, value):
+ """
+ Set the value of the label.
+
+ :type value: str
+ """
+ self.widget().setText(six.text_type(value))
+ super(LabelFieldWidget, self).setValue(value)
+
+
+class ObjectsFieldWidget(FieldWidget):
+
+ def __init__(self, *args, **kwargs):
+ super(ObjectsFieldWidget, self).__init__(*args, **kwargs)
+
+ self._value = []
+
+ widget = Label(self)
+ widget.setAlignment(QtCore.Qt.AlignVCenter)
+ widget.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse)
+ self.setWidget(widget)
+
+ def value(self):
+ """
+ Get the objects
+
+ :rtype: list[str]
+ """
+ return self._value
+
+ def setValue(self, value):
+ """
+ Set the objects
+
+ :type value: list[str]
+ """
+ if value:
+ count = len(value)
+ plural = "s" if count > 1 else ""
+
+ msg = "{0} object{1} selected for saving"
+ msg = msg.format(str(count), plural)
+ else:
+ msg = "Nothing selected for saving"
+
+ self._value = value
+ self.widget().setText(msg)
+ super(ObjectsFieldWidget, self).setValue(value)
+
+
+class StringFieldWidget(FieldWidget):
+
+ def __init__(self, *args, **kwargs):
+ super(StringFieldWidget, self).__init__(*args, **kwargs)
+
+ widget = QtWidgets.QLineEdit(self)
+ widget.textChanged.connect(self.emitValueChanged)
+ self.setWidget(widget)
+
+ def value(self):
+ """
+ Get the value of the widget.
+
+ :rtype: unicode
+ """
+ return six.text_type(self.widget().text())
+
+ def setValue(self, value):
+ """
+ Set the string value for the widget.
+
+ :type value: unicode
+ """
+ pos = self.widget().cursorPosition()
+
+ self.widget().blockSignals(True)
+ try:
+ self.widget().setText(value)
+ finally:
+ self.widget().blockSignals(False)
+
+ self.widget().setCursorPosition(pos)
+
+ super(StringFieldWidget, self).setValue(value)
+
+
+class PathFieldWidget(StringFieldWidget):
+ def __init__(self, *args, **kwargs):
+ super(PathFieldWidget, self).__init__(*args, **kwargs)
+
+ def setData(self, data):
+ """
+ Overriding this method to add a browse to folder button.
+
+ :type data: dict
+ """
+ if "menu" not in data:
+ data["menu"] = {
+ "callback": self.browse
+ }
+
+ super(PathFieldWidget, self).setData(data)
+
+ def browse(self):
+ """Open the file dialog."""
+ path = self.value()
+ path = QtWidgets.QFileDialog.getExistingDirectory(
+ None,
+ "Browse Folder",
+ path
+ )
+ if path:
+ self.setValue(path)
+
+
+class TextFieldWidget(FieldWidget):
+
+ DefaultLayout = "Vertical"
+
+ def __init__(self, *args, **kwargs):
+ super(TextFieldWidget, self).__init__(*args, **kwargs)
+
+ widget = QtWidgets.QTextEdit(self)
+ widget.textChanged.connect(self.emitValueChanged)
+ self.setWidget(widget)
+
+ def value(self):
+ """
+ Get the text value of the text edit.
+
+ :rtype: unicode
+ """
+ return six.text_type(self.widget().toPlainText())
+
+ def setValue(self, value):
+ """
+ Set the text value for the text edit.
+
+ :type value: unicode
+ """
+ self.widget().setText(value)
+ super(TextFieldWidget, self).setValue(value)
+
+
+class IntFieldWidget(FieldWidget):
+
+ def __init__(self, *args, **kwargs):
+ super(IntFieldWidget, self).__init__(*args, **kwargs)
+
+ validator = QtGui.QIntValidator(-50000000, 50000000, self)
+
+ widget = QtWidgets.QLineEdit(self)
+ widget.setValidator(validator)
+ widget.textChanged.connect(self.emitValueChanged)
+ self.setWidget(widget)
+
+ def value(self):
+ """
+ Get the int value for the widget.
+
+ :rtype: int
+ """
+ value = self.widget().text()
+ if value.strip() == "":
+ value = self.default()
+
+ if value == "-":
+ value = 0
+
+ return int(str(value))
+
+ def setValue(self, value):
+ """
+ Set the int value for the widget.
+
+ :type value: int
+ """
+ if value == '':
+ value = self.default()
+
+ self.widget().setText(str(int(value)))
+
+
+class BoolFieldWidget(FieldWidget):
+
+ def __init__(self, *args, **kwargs):
+ super(BoolFieldWidget, self).__init__(*args, **kwargs)
+
+ widget = QtWidgets.QCheckBox(self)
+ widget.stateChanged.connect(self.emitValueChanged)
+
+ self.setWidget(widget)
+
+ def setText(self, text):
+ """
+ Overriding this method to add support for the inline key.
+
+ :type text: str
+ """
+ inline = self.data().get("inline")
+ if inline:
+ self.label().setText("")
+ self.widget().setText(text)
+ else:
+ super(BoolFieldWidget, self).setText(text)
+
+ def value(self):
+ """
+ Get the value of the checkbox.
+
+ :rtype: bool
+ """
+ return bool(self.widget().isChecked())
+
+ def setValue(self, value):
+ """
+ Set the value of the checkbox.
+
+ :type value: bool
+ """
+ self.widget().setChecked(value)
+ super(BoolFieldWidget, self).setValue(value)
+
+
+class RangeFieldWidget(FieldWidget):
+
+ def __init__(self, *args, **kwargs):
+ super(RangeFieldWidget, self).__init__(*args, **kwargs)
+
+ widget = QtWidgets.QFrame(self)
+ layout = QtWidgets.QHBoxLayout()
+ layout.setContentsMargins(0, 0, 0, 0)
+ layout.setSpacing(4)
+ widget.setLayout(layout)
+
+ validator = QtGui.QIntValidator(-50000000, 50000000, self)
+
+ self._minwidget = QtWidgets.QLineEdit(self)
+ self._minwidget.setValidator(validator)
+ self._minwidget.textChanged.connect(self.emitValueChanged)
+ widget.layout().addWidget(self._minwidget)
+
+ self._maxwidget = QtWidgets.QLineEdit(self)
+ self._maxwidget.setValidator(validator)
+ self._maxwidget.textChanged.connect(self.emitValueChanged)
+ widget.layout().addWidget(self._maxwidget)
+
+ self.setWidget(widget)
+
+ def value(self):
+ """
+ Get the current range.
+
+ :rtype: list[int]
+ """
+ min = int(float(self._minwidget.text() or "0"))
+ max = int(float(self._maxwidget.text() or "0"))
+
+ return min, max
+
+ def setValue(self, value):
+ """
+ Set the current range.
+
+ :type value: list[int]
+ """
+ minValue, maxValue = int(value[0]), int(value[1])
+
+ self._minwidget.setText(str(minValue))
+ self._maxwidget.setText(str(maxValue))
+
+ super(RangeFieldWidget, self).setValue(value)
+
+
+class StringDoubleFieldWidget(FieldWidget):
+
+ def __init__(self, *args, **kwargs):
+ super(StringDoubleFieldWidget, self).__init__(*args, **kwargs)
+
+ widget = QtWidgets.QFrame(self)
+ layout = QtWidgets.QHBoxLayout()
+ layout.setContentsMargins(0, 0, 0, 0)
+ layout.setSpacing(4)
+ widget.setLayout(layout)
+
+ self._widget1 = QtWidgets.QLineEdit(self)
+ self._widget1.textChanged.connect(self.emitValueChanged)
+ widget.layout().addWidget(self._widget1)
+
+ self._widget2 = QtWidgets.QLineEdit(self)
+ self._widget2.textChanged.connect(self.emitValueChanged)
+ widget.layout().addWidget(self._widget2)
+
+ self.setWidget(widget)
+
+ def setPlaceholder(self, value):
+ """
+ Overriding this method to add support for passing a lists or tuple
+
+ :type value: str or list or tuple
+ """
+ if isinstance(value, list) or isinstance(value, tuple):
+ if len(value) >= 1:
+ self._widget1.setPlaceholderText(value[0])
+
+ if len(value) >= 2:
+ self._widget2.setPlaceholderText(value[1])
+ else:
+ self._widget1.setPlaceholderText(str(value))
+
+ def value(self):
+ """
+ Get the current string double value.
+
+ :rtype: (str, str)
+ """
+ value1 = self._widget1.text() or ""
+ value2 = self._widget2.text() or ""
+
+ return value1, value2
+
+ def setValue(self, value):
+ """
+ Set the current string double value.
+
+ :type value: (str, str)
+ """
+ value1, value2 = value[0], value[1]
+
+ self._widget1.setText(str(value1))
+ self._widget2.setText(str(value2))
+
+ super(StringDoubleFieldWidget, self).setValue(value)
+
+
+class EnumFieldWidget(FieldWidget):
+
+ def __init__(self, *args, **kwargs):
+ super(EnumFieldWidget, self).__init__(*args, **kwargs)
+
+ widget = QtWidgets.QComboBox(self)
+ widget.currentIndexChanged.connect(self.emitValueChanged)
+
+ self.setWidget(widget)
+
+ def value(self):
+ """
+ Get the value of the combobox.
+
+ :rtype: unicode
+ """
+ return six.text_type(self.widget().currentText())
+
+ def setState(self, state):
+ """
+ Set the current state with support for editable.
+
+ :type state: dict
+ """
+ super(EnumFieldWidget, self).setState(state)
+
+ editable = state.get('editable')
+ if editable is not None:
+ self.widget().setEditable(editable)
+
+ def setValue(self, item):
+ """
+ Set the current value of the combobox.
+
+ :type item: unicode
+ """
+ self.setCurrentText(item)
+
+ def setCurrentText(self, text):
+ """
+ This method supports Qt4 and Qt5 when settings the current text.
+
+ :type text: str
+ """
+ index = self.widget().findText(text, QtCore.Qt.MatchExactly)
+ if index != -1:
+ self.widget().setCurrentIndex(index)
+ else:
+ msg = 'Cannot set the current text to "{0}" for the field "{1}".'
+ msg = msg.format(text, self.name())
+ logger.warning(msg)
+
+ def setItems(self, items):
+ """
+ Set the current items of the combobox.
+
+ :type items: list[unicode]
+ """
+ self.widget().clear()
+ self.widget().addItems(items)
+
+
+class TagsFieldWidget(FieldWidget):
+
+ def __init__(self, *args, **kwargs):
+ super(TagsFieldWidget, self).__init__(*args, **kwargs)
+
+ widget = QtWidgets.QComboBox(self)
+ widget.setEditable(True)
+ widget.editTextChanged.connect(self.emitValueChanged)
+ widget.currentIndexChanged.connect(self.emitValueChanged)
+
+ self.setWidget(widget)
+
+ def listToString(self, data):
+ """
+ Return a string from the given list.
+
+ Example:
+ print listToString(['apple', 'pear', 'cherry'])
+
+ # apple,pear,cherry
+
+ :type data: list
+ :rtype: str
+ """
+ # Convert all items to string and remove 'u'
+ data = [str(item) for item in data]
+ data = str(data).replace("[", "").replace("]", "")
+ data = data.replace("'", "").replace('"', "")
+ return data
+
+ def stringToList(self, data):
+ """
+ Return a list from the given string.
+
+ Example:
+ print listToString('apple, pear, cherry')
+
+ # ['apple', 'pear', 'cherry']
+
+ :type data: str
+ :rtype: list
+ """
+ data = '["' + str(data) + '"]'
+ data = data.replace(' ', '')
+ data = data.replace(',', '","')
+ return eval(data)
+
+ def value(self):
+ """
+ Get the value of the combobox.
+
+ :rtype: list[str]
+ """
+ return self.stringToList(self.widget().currentText())
+
+ def setValue(self, value):
+ """
+ Set the current value of the combobox.
+
+ :type value: list[str]
+ """
+ text = self.listToString(value)
+ self.widget().setEditText(text)
+
+ def setItems(self, items):
+ """
+ Set the current items of the combobox.
+
+ :type items: list[unicode]
+ """
+ self.widget().clear()
+ self.widget().addItems(items)
+
+
+class RadioFieldWidget(FieldWidget):
+
+ def __init__(self, *args, **kwargs):
+ super(RadioFieldWidget, self).__init__(*args, **kwargs)
+
+ self._radioButtons = []
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.setContentsMargins(0, 0, 0, 0)
+
+ self._radioFrame = QtWidgets.QFrame(self)
+ self._radioFrame.setLayout(layout)
+
+ self.setWidget(self._radioFrame)
+
+ self.label().setStyleSheet("margin-top:2px;")
+ self.widget().setStyleSheet("margin-top:2px;")
+
+ self.label().setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTop)
+
+ def value(self):
+ """
+ Get the text of checked radio button.
+
+ :return: str
+ """
+ for radioButton in self._radioButtons:
+ if radioButton.isChecked():
+ return radioButton.text()
+ return ""
+
+ def setValue(self, value):
+ """
+ Set the radio button checked with the given text.
+
+ :type: str
+ """
+ for radioButton in self._radioButtons:
+ checked = radioButton.text() == value
+ radioButton.setChecked(checked)
+
+ def clear(self):
+ """Destroy all the radio buttons."""
+ for radioButton in self._radioButtons:
+ radioButton.destroy()
+ radioButton.close()
+ radioButton.hide()
+
+ def setItems(self, items):
+ """
+ Set the items used to create the radio buttons.
+
+ items: list[str]
+ """
+ self.clear()
+
+ for item in items:
+ widget = QtWidgets.QRadioButton(self)
+ widget.clicked.connect(self.emitValueChanged)
+ widget.setText(item)
+
+ self._radioButtons.append(widget)
+ self._radioFrame.layout().addWidget(widget)
+
+
+class ButtonGroupFieldWidget(FieldWidget):
+ """A simple button group field."""
+
+ def __init__(self, *args, **kwargs):
+ super(ButtonGroupFieldWidget, self).__init__(*args, **kwargs)
+
+ self._value = ""
+ self._buttons = {}
+
+ items = self.data().get('items')
+
+ widget = QtWidgets.QFrame()
+ layout = QtWidgets.QHBoxLayout()
+ layout.setSpacing(0)
+ layout.setContentsMargins(0, 0, 0, 0)
+ widget.setLayout(layout)
+
+ i = 0
+ for item in items:
+ i += 1
+
+ button = QtWidgets.QPushButton(item, self)
+ button.setCheckable(True)
+
+ callback = functools.partial(self.setValue, item)
+ button.clicked.connect(callback)
+
+ self._buttons[item] = button
+
+ if i == 1:
+ button.setProperty('first', True)
+
+ if i == len(items):
+ button.setProperty('last', True)
+
+ widget.layout().addWidget(button)
+
+ self.setWidget(widget)
+
+ def setItems(self, items):
+ """Overriding this method to avoid the not implemented error."""
+ pass
+
+ def setValue(self, value):
+ """
+ Set the current value.
+
+ :type value: str
+ """
+ self._value = value
+
+ self.blockSignals(True)
+
+ for button in self._buttons.values():
+ button.setChecked(False)
+
+ if value in self._buttons:
+ self._buttons[value].setChecked(True)
+
+ self.blockSignals(False)
+
+ super(ButtonGroupFieldWidget, self).setValue(value)
+
+ def value(self):
+ """
+ Get the current value.
+
+ :rtype: str
+ """
+ return self._value
+
+
+class SeparatorFieldWidget(FieldWidget):
+
+ def __init__(self, *args, **kwargs):
+ super(SeparatorFieldWidget, self).__init__(*args, **kwargs)
+
+ widget = QtWidgets.QLabel(self)
+ widget.setObjectName('widget')
+ widget.setSizePolicy(
+ QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Preferred
+ )
+
+ self.setWidget(widget)
+
+ if not self.data().get("title"):
+ self.label().hide()
+
+ def setValue(self, value):
+ """
+ Set the current text of the separator.
+
+ :type value: unicode
+ """
+ self.widget().setText(value)
+
+ def value(self):
+ """
+ Get the current text of the separator.
+
+ :rtype: unicode
+ """
+ return self.widget().text()
+
+
+class SliderFieldWidget(FieldWidget):
+
+ def __init__(self, *args, **kwargs):
+ super(SliderFieldWidget, self).__init__(*args, **kwargs)
+
+ widget = QtWidgets.QSlider(self)
+ widget.setOrientation(QtCore.Qt.Horizontal)
+ widget.setObjectName('widget')
+ widget.setSizePolicy(
+ QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Preferred
+ )
+ widget.valueChanged.connect(self.emitValueChanged)
+
+ self.setWidget(widget)
+
+ def setValue(self, value):
+ """
+ Set the current value for the slider.
+
+ :type value: int
+ """
+ self.widget().setValue(value)
+
+ def value(self):
+ """
+ Get the current value for the slider.
+
+ :rtype: int
+ """
+ return self.widget().value()
+
+
+class ColorFieldWidget(FieldWidget):
+
+ def __init__(self, *args, **kwargs):
+ super(ColorFieldWidget, self).__init__(*args, **kwargs)
+
+ self._value = "rgb(100,100,100)"
+
+ widget = colorpicker.ColorPickerWidget()
+ widget.setObjectName('widget')
+ widget.setSizePolicy(
+ QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Preferred
+ )
+ widget.colorChanged.connect(self._colorChanged)
+ self.setWidget(widget)
+
+ def setData(self, data):
+ """
+ Overriding this method to add support for a "colors" key.
+
+ :type data: dict
+ """
+ colors = data.get("colors")
+ if colors:
+ self.widget().setColors(colors)
+
+ super(ColorFieldWidget, self).setData(data)
+
+ def _colorChanged(self, color):
+ """
+ Triggered when the color changes from the color browser.
+
+ :type color: QtGui.QColor
+ """
+ if isinstance(color, QtGui.QColor):
+ color = studioqt.Color(color).toString()
+
+ self.setValue(color)
+ self.emitValueChanged()
+
+ def setItems(self, items):
+ self.widget().setColors(items)
+
+ def setValue(self, value):
+ """
+ Set the current value for the slider.
+
+ :type value: str
+ """
+ self.widget().setCurrentColor(value)
+
+ def value(self):
+ """
+ Get the current value for the slider.
+
+ :rtype: str
+ """
+ return self.widget().currentColor()
+
+
+class IconPickerFieldWidget(FieldWidget):
+
+ def __init__(self, *args, **kwargs):
+ super(IconPickerFieldWidget, self).__init__(*args, **kwargs)
+
+ widget = iconpicker.IconPickerWidget(self)
+ widget.setObjectName('widget')
+ widget.setSizePolicy(
+ QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Preferred
+ )
+ widget.iconChanged.connect(self._iconChanged)
+ self.setWidget(widget)
+
+ def _iconChanged(self, icon):
+ """
+ Triggered when the color changes from the color browser.
+
+ :type icon: QtGui.QColor
+ """
+ self.setValue(icon)
+ self.emitValueChanged()
+
+ def setValue(self, value):
+ """
+ Set the current value for the slider.
+
+ :type value: str
+ """
+ self.widget().setCurrentIcon(value)
+
+ def setItems(self, items):
+ """
+ Set the icons to be displayed in the picker.
+
+ :type items: str
+ """
+ self.widget().setIcons(items)
+ self.widget().menuButton().setVisible(False)
+
+ def value(self):
+ """
+ Get the current value for the slider.
+
+ :rtype: str
+ """
+ return self.widget().currentIcon()
+
+
+class ImageFieldWidget(FieldWidget):
+
+ def __init__(self, *args, **kwargs):
+ super(ImageFieldWidget, self).__init__(*args, **kwargs)
+
+ self._value = ""
+ self._pixmap = None
+
+ widget = QtWidgets.QLabel(self)
+ self.setStyleSheet("min-height: 32px;")
+ widget.setScaledContents(False)
+ widget.setObjectName('widget')
+ widget.setAlignment(QtCore.Qt.AlignHCenter)
+
+ self.setWidget(widget)
+ self.layout().addStretch()
+
+ def setValue(self, value):
+ """
+ Set the path on disc for the image.
+
+ :type value: str
+ """
+ self._value = value
+ self._pixmap = QtGui.QPixmap(value)
+ self.update()
+
+ def value(self):
+ """
+ Get the path on disc for the image.
+
+ :rtype: str
+ """
+ return self._value
+
+ def resizeEvent(self, event):
+ """
+ Called when the field widget is resizing.
+
+ :type event: QtCore.QEvent
+ """
+ self.update()
+
+ def update(self):
+ """Update the image depending on the size."""
+ if self._pixmap:
+ width = self.widget().height()
+ transformation = QtCore.Qt.SmoothTransformation
+
+ if self.widget().width() > self.widget().height():
+ pixmap = self._pixmap.scaledToWidth(width, transformation)
+ else:
+ pixmap = self._pixmap.scaledToHeight(width, transformation)
+
+ self.widget().setPixmap(pixmap)
+ self.widget().setAlignment(QtCore.Qt.AlignLeft)
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/filterbymenu.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/filterbymenu.py
new file mode 100644
index 0000000..49f1202
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/filterbymenu.py
@@ -0,0 +1,310 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from functools import partial
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+import studioqt
+
+from .separatoraction import SeparatorAction
+
+
+NEW_STYLE = True
+
+
+class LabelAction(QtWidgets.QWidgetAction):
+
+ def _triggered(self, checked=None):
+ """Triggered when the checkbox value has changed."""
+ self.triggered.emit()
+ self.parent().close()
+
+ def createWidget(self, menu):
+ """
+ This method is called by the QWidgetAction base class.
+
+ :type menu: QtWidgets.QMenu
+ """
+ widget = QtWidgets.QFrame(self.parent())
+ widget.setObjectName("filterByAction")
+
+ title = self._name
+
+ # Using a checkbox so that the text aligns with the other actions
+ label = QtWidgets.QCheckBox(widget)
+ label.setText(title)
+ label.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents)
+ label.toggled.connect(self._triggered)
+ label.setStyleSheet("""
+#QCheckBox::indicator:checked {
+ image: url(none.png)
+}
+QCheckBox::indicator:unchecked {
+ image: url(none.png)
+}
+""")
+ actionLayout = QtWidgets.QHBoxLayout()
+ actionLayout.setContentsMargins(0, 0, 0, 0)
+ actionLayout.addWidget(label, stretch=1)
+ widget.setLayout(actionLayout)
+
+ return widget
+
+
+class FilterByAction(QtWidgets.QWidgetAction):
+
+ def __init__(self, parent=None):
+ """
+ :type parent: QtWidgets.QMenu
+ """
+ QtWidgets.QWidgetAction.__init__(self, parent)
+
+ self._facet = None
+ self._checked = False
+
+ def setChecked(self, checked):
+ self._checked = checked
+
+ def setFacet(self, facet):
+ self._facet = facet
+
+ def _triggered(self, checked=None):
+ """Triggered when the checkbox value has changed."""
+ self.triggered.emit()
+ self.parent().close()
+
+ def createWidget(self, menu):
+ """
+ This method is called by the QWidgetAction base class.
+
+ :type menu: QtWidgets.QMenu
+ """
+ widget = QtWidgets.QFrame(self.parent())
+ widget.setObjectName("filterByAction")
+
+ facet = self._facet
+
+ name = facet.get("name") or ""
+ count = str(facet.get("count", 0))
+
+ title = name.replace(".", "").title()
+
+ label = QtWidgets.QCheckBox(widget)
+ label.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents)
+ label.setText(title)
+ label.installEventFilter(self)
+ label.toggled.connect(self._triggered)
+ label.setChecked(self._checked)
+
+ label2 = QtWidgets.QLabel(widget)
+ label2.setObjectName("actionCounter")
+ label2.setText(count)
+
+ layout = QtWidgets.QHBoxLayout()
+ layout.setSpacing(0)
+ layout.setContentsMargins(0, 0, 0, 0)
+ layout.addWidget(label, stretch=1)
+ layout.addWidget(label2)
+ widget.setLayout(layout)
+
+ return widget
+
+
+class FilterByMenu(QtWidgets.QMenu):
+
+ def __init__(self, *args, **kwargs):
+ super(FilterByMenu, self).__init__(*args, **kwargs)
+
+ self._facets = []
+ self._dataset = None
+ self._options = {"field": "type"}
+ self._settings = {}
+
+ def name(self):
+ """
+ The name of the filter used by the dataset.
+
+ :rtype: str
+ """
+ return self._options.get("field") + "FilterMenu"
+
+ def _actionChecked(self, name, checked):
+ """
+ Triggered when an action has been clicked.
+
+ :type name: str
+ :type checked: bool
+ """
+ if studioqt.isControlModifier():
+ self.setAllEnabled(False)
+ self._settings[name] = True
+ else:
+ self._settings[name] = checked
+
+ self.dataset().search()
+
+ def _showAllClicked(self):
+ """Triggered when the user clicks the show all action."""
+ self.setAllEnabled(True)
+ self.dataset().search()
+
+ def setAllEnabled(self, enabled):
+ """
+ Set all the filters enabled.
+
+ :type enabled: bool
+ """
+ for facet in self._facets:
+ self._settings[facet.get("name")] = enabled
+
+ def isShowAllEnabled(self):
+ """
+ Check if all the current filters are enabled.
+
+ :rtype: bool
+ """
+ for facet in self._facets:
+ if not self._settings.get(facet.get("name"), True):
+ return False
+ return True
+
+ def isActive(self):
+ """
+ Check if there are any filters currently active using the settings.
+
+ :rtype: bool
+ """
+ settings = self.settings()
+ for name in settings:
+ if not settings.get(name):
+ return True
+ return False
+
+ def setOptions(self, options):
+ """
+ Set the options to be used by the filters menu.
+
+ :type options: dict
+ """
+ self._options = options
+
+ def dataset(self):
+ """
+ Get the dataset model for the menu.
+
+ :rtype: studiolibrary.Dataset
+ """
+ return self._dataset
+
+ def settings(self):
+ """
+ Get the settings for the filter menu.
+
+ :rtype: dict
+ """
+ return self._settings
+
+ def setSettings(self, settings):
+ """
+ Set the settings filter menu.
+
+ :type settings: dict
+ """
+ self._settings = settings
+
+ def setDataset(self, dataset):
+ """
+ Set the dataset model for the menu:
+
+ :type dataset: studiolibrary.Dataset
+ """
+ self._dataset = dataset
+ dataset.searchStarted.connect(self.searchInit)
+
+ def searchInit(self):
+ """Triggered before each search to update the filter menu query."""
+ filters = []
+
+ settings = self.settings()
+ field = self._options.get("field")
+
+ for name in settings:
+ checked = settings.get(name, True)
+ if not checked:
+ filters.append((field, "not", name))
+
+ query = {
+ "name": self.name(),
+ "operator": "and",
+ "filters": filters
+ }
+
+ self.dataset().addQuery(query)
+
+ def show(self, point=None):
+ """
+ Show the menu options.
+
+ :type point: QtGui.QPoint or None
+ """
+ self.clear()
+
+ field = self._options.get("field")
+ queries = self.dataset().queries(exclude=self.name())
+
+ self._facets = self.dataset().distinct(field, queries=queries)
+
+ action = SeparatorAction("Show " + field.title(), self)
+ self.addAction(action)
+
+ if NEW_STYLE:
+ action = LabelAction(self)
+ action._name = "Show All"
+ self.addAction(action)
+ else:
+ action = self.addAction("Show All")
+
+ action.setEnabled(not self.isShowAllEnabled())
+ callback = partial(self._showAllClicked)
+ action.triggered.connect(callback)
+
+ self.addSeparator()
+
+ for facet in self._facets:
+
+ name = facet.get("name") or ""
+ count = facet.get("count", 0)
+ checked = self.settings().get(name, True)
+
+ title = "{name}\t({count})"
+ title = title.format(name=name.replace(".", "").title(), count=count)
+
+ if NEW_STYLE:
+ action = FilterByAction(self)
+ action.setFacet(facet)
+ action.setChecked(checked)
+ self.addAction(action)
+ else:
+ action = self.addAction(title)
+ action.setCheckable(True)
+ action.setChecked(checked)
+
+ callback = partial(self._actionChecked, name, not checked)
+ action.triggered.connect(callback)
+
+ if not point:
+ point = QtGui.QCursor.pos()
+
+ self.exec_(point)
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/formwidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/formwidget.py
new file mode 100644
index 0000000..11f28b0
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/formwidget.py
@@ -0,0 +1,785 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import re
+import logging
+import functools
+
+from studiovendor.Qt import QtGui, QtCore, QtWidgets
+
+from . import settings
+from . import fieldwidgets
+
+
+__all__ = [
+ "FormWidget",
+ "FormDialog",
+ "FIELD_WIDGET_REGISTRY"
+]
+
+
+logger = logging.getLogger(__name__)
+
+
+FIELD_WIDGET_REGISTRY = {
+ "int": fieldwidgets.IntFieldWidget,
+ "bool": fieldwidgets.BoolFieldWidget,
+ "enum": fieldwidgets.EnumFieldWidget,
+ "text": fieldwidgets.TextFieldWidget,
+ "path": fieldwidgets.PathFieldWidget,
+ "tags": fieldwidgets.TagsFieldWidget,
+ "image": fieldwidgets.ImageFieldWidget,
+ "label": fieldwidgets.LabelFieldWidget,
+ "range": fieldwidgets.RangeFieldWidget,
+ "color": fieldwidgets.ColorFieldWidget,
+ "group": fieldwidgets.GroupFieldWidget,
+ "string": fieldwidgets.StringFieldWidget,
+ "radio": fieldwidgets.RadioFieldWidget,
+ "stringDouble": fieldwidgets.StringDoubleFieldWidget,
+ "slider": fieldwidgets.SliderFieldWidget,
+ "objects": fieldwidgets.ObjectsFieldWidget,
+ "separator": fieldwidgets.SeparatorFieldWidget,
+ "iconPicker": fieldwidgets.IconPickerFieldWidget,
+ "buttonGroup": fieldwidgets.ButtonGroupFieldWidget,
+}
+
+
+def toTitle(name):
+ """Convert camel case strings to title strings"""
+ s1 = re.sub("(.)([A-Z][a-z]+)", r"\1 \2", name)
+ return re.sub("([a-z0-9])([A-Z])", r"\1 \2", s1).title()
+
+
+class FormWidget(QtWidgets.QFrame):
+
+ accepted = QtCore.Signal(object)
+ stateChanged = QtCore.Signal()
+ validated = QtCore.Signal()
+
+ def __init__(self, *args, **kwargs):
+ super(FormWidget, self).__init__(*args, **kwargs)
+
+ self._schema = []
+ self._widgets = []
+ self._validator = None
+ self._validatorEnabled = True
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.setContentsMargins(0, 0, 0, 0)
+ layout.setSpacing(0)
+
+ self.setLayout(layout)
+
+ self._fieldsFrame = QtWidgets.QFrame(self)
+ self._fieldsFrame.setObjectName("optionsFrame")
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.setContentsMargins(0, 0, 0, 0)
+ layout.setSpacing(0)
+
+ self._fieldsFrame.setLayout(layout)
+
+ self._titleWidget = QtWidgets.QPushButton(self)
+ self._titleWidget.setCheckable(True)
+ self._titleWidget.setObjectName("titleWidget")
+ self._titleWidget.toggled.connect(self._titleClicked)
+ self._titleWidget.hide()
+
+ self.layout().addWidget(self._titleWidget)
+ self.layout().addWidget(self._fieldsFrame)
+
+ def _titleClicked(self, toggle):
+ """Triggered when the user clicks the title widget."""
+ self.setExpanded(toggle)
+ self.stateChanged.emit()
+
+ def titleWidget(self):
+ """
+ Get the title widget.
+
+ :rtype: QWidget
+ """
+ return self._titleWidget
+
+ def setTitle(self, title):
+ """
+ Set the text for the title widget.
+
+ :type title: str
+ """
+ self.titleWidget().setText(title)
+
+ def setExpanded(self, expand):
+ """
+ Expands the options if expand is true, otherwise collapses the options.
+
+ :type expand: bool
+ """
+ self._titleWidget.blockSignals(True)
+
+ try:
+ self._titleWidget.setChecked(expand)
+ self._fieldsFrame.setVisible(expand)
+ finally:
+ self._titleWidget.blockSignals(False)
+
+ def isExpanded(self):
+ """
+ Returns true if the item is expanded, otherwise returns false.
+
+ :rtype: bool
+ """
+ return self._titleWidget.isChecked()
+
+ def setTitleVisible(self, visible):
+ """
+ A convenience method for setting the title visible.
+
+ :type visible: bool
+ """
+ self.titleWidget().setVisible(visible)
+
+ def reset(self):
+ """Reset all option widgets back to their default value."""
+ for widget in self._widgets:
+ widget.reset()
+ self.validate()
+
+ def savePersistentValues(self):
+ """
+ Triggered when the user changes the options.
+ """
+ data = {}
+
+ for widget in self._widgets:
+ name = widget.data().get("name")
+ if name and widget.data().get("persistent"):
+
+ key = self.objectName() or "FormWidget"
+ key = widget.data().get("persistentKey", key)
+
+ data.setdefault(key, {})
+ data[key][name] = widget.value()
+
+ for key in data:
+ settings.set(key, data[key])
+
+ def loadPersistentValues(self):
+ """
+ Get the options from the user settings.
+
+ :rtype: dict
+ """
+ values = {}
+ defaultValues = self.defaultValues()
+
+ for field in self.schema():
+ name = field.get("name")
+ persistent = field.get("persistent")
+
+ if persistent:
+ key = self.objectName() or "FormWidget"
+ key = field.get("persistentKey", key)
+ value = settings.get(key, {}).get(name)
+ else:
+ value = defaultValues.get(name)
+
+ if value is not None:
+ values[name] = value
+
+ self.setValues(values)
+
+ def schema(self):
+ """
+ Get the schema for the form.
+
+ :rtype: dict
+ """
+ return self._schema
+
+ def _sortSchema(self, schema):
+ """
+ Sort the schema depending on the group order.
+
+ :type schema: list[dict]
+ :rtype: list[dict]
+ """
+ order = 0
+
+ for i, field in enumerate(schema):
+ if field.get("type") == "group":
+ order = field.get("order", order)
+ field["order"] = order
+
+ def _key(field):
+ return field["order"]
+
+ return sorted(schema, key=_key)
+
+ def setSchema(self, schema, layout=None, errorsVisible=False):
+ """
+ Set the schema for the widget.
+
+ :type schema: list[dict]
+ :type layout: None or str
+ :type errorsVisible: bool
+ """
+ self._schema = self._sortSchema(schema)
+
+ for field in self._schema:
+
+ cls = FIELD_WIDGET_REGISTRY.get(field.get("type", "label"))
+
+ if not cls:
+ logger.warning("Cannot find widget for %s", field)
+ continue
+
+ if layout and not field.get("layout"):
+ field["layout"] = layout
+
+ errorVisible = field.get("errorVisible")
+ if errorVisible is not None:
+ field["errorVisible"] = errorVisible
+ else:
+ field["errorVisible"] = errorsVisible
+
+ widget = cls(data=field, parent=self._fieldsFrame, formWidget=self)
+
+ data_ = widget.defaultData()
+ data_.update(field)
+
+ widget.setData(data_)
+
+ value = field.get("value")
+ default = field.get("default")
+ if value is None and default is not None:
+ widget.setValue(default)
+
+ self._widgets.append(widget)
+
+ callback = functools.partial(self._fieldChanged, widget)
+ widget.valueChanged.connect(callback)
+
+ self._fieldsFrame.layout().addWidget(widget)
+
+ self.loadPersistentValues()
+
+ def _fieldChanged(self, widget):
+ """
+ Triggered when the given option widget changes value.
+
+ :type widget: FieldWidget
+ """
+ self.validate(widget=widget)
+
+ def accept(self):
+ """Accept the current options"""
+ self.emitAcceptedCallback()
+ self.savePersistentValues()
+
+ def closeEvent(self, event):
+ """Called when the widget is closed."""
+ self.savePersistentValues()
+ super(FormWidget, self).closeEvent(event)
+
+ def errors(self):
+ """
+ Get all the errors.
+
+ :rtype: list[str]
+ """
+ errors = []
+ for widget in self._widgets:
+ error = widget.data().get("error")
+ if error:
+ errors.append(error)
+ return errors
+
+ def hasErrors(self):
+ """
+ Return True if the form contains any errors.
+
+ :rtype: bool
+ """
+ return bool(self.errors())
+
+ def setValidatorEnabled(self, enabled):
+ self._validatorEnabled = enabled
+
+ def setValidator(self, validator):
+ """
+ Set the validator for the options.
+
+ :type validator: func
+ """
+ self._validator = validator
+
+ def validator(self):
+ """
+ Return the validator for the form.
+
+ :rtype: func
+ """
+ return self._validator
+
+ def validate(self, widget=None):
+ """Validate the current options using the validator."""
+
+ if self._validator and self._validatorEnabled:
+
+ logger.debug("Running validator: form.validate(widget=%s)", widget)
+
+ values = {}
+
+ for name, value in self.values().items():
+ data = self.widget(name).data()
+ if data.get("validate", True):
+ values[name] = value
+
+ if widget:
+ values["fieldChanged"] = widget.name()
+
+ fields = self._validator(**values)
+ if fields is not None:
+ self._setState(fields)
+
+ self.validated.emit()
+
+ else:
+ logger.debug("No validator set.")
+
+ def setData(self, name, data):
+ """
+ Set the data for the given field name.
+
+ :type name: str
+ :type data: dict
+ """
+ widget = self.widget(name)
+ widget.setData(data)
+
+ def setValue(self, name, value):
+ """
+ Set the value for the given field name and value
+
+ :type name: str
+ :type value: object
+ """
+ widget = self.widget(name)
+ widget.setValue(value)
+
+ def value(self, name):
+ """
+ Get the value for the given widget name.
+
+ :type name: str
+ :rtype: object
+ """
+ widget = self.widget(name)
+ return widget.value()
+
+ def widget(self, name):
+ """
+ Get the widget for the given widget name.
+
+ :type name: str
+ :rtype: FieldWidget
+ """
+ for widget in self._widgets:
+ if widget.data().get("name") == name:
+ return widget
+
+ def fields(self):
+ """
+ Get all the field data for the form.
+
+ :rtype: dict
+ """
+ fields = []
+ for widget in self._widgets:
+ fields.append(widget.data())
+ return fields
+
+ def fieldWidgets(self):
+ """
+ Get all the field widgets.
+
+ :rtype: list[FieldWidget]
+ """
+ return self._widgets
+
+ def setValues(self, values):
+ """
+ Set the field values for the current form.
+
+ :type values: dict
+ """
+ state = []
+ for name in values:
+ state.append({"name": name, "value": values[name]})
+ self._setState(state)
+
+ def values(self):
+ """
+ Get the all the field values indexed by the field name.
+
+ :rtype: dict
+ """
+ values = {}
+ for widget in self._widgets:
+ name = widget.data().get("name")
+ if name and widget.validateEnabled():
+ values[name] = widget.value()
+ return values
+
+ def defaultValues(self):
+ """
+ Get the all the default field values indexed by the field name.
+
+ :rtype: dict
+ """
+ values = {}
+ for widget in self._widgets:
+ name = widget.data().get("name")
+ if name:
+ values[name] = widget.default()
+ return values
+
+ def state(self):
+ """
+ Get the current state.
+
+ :rtype: dict
+ """
+ fields = []
+
+ for widget in self._widgets:
+ fields.append(widget.state())
+
+ state = {
+ "fields": fields,
+ "expanded": self.isExpanded()
+ }
+
+ return state
+
+ def setState(self, state):
+ """
+ Set the current state.
+
+ :type state: dict
+ """
+ expanded = state.get("expanded")
+ if expanded is not None:
+ self.setExpanded(expanded)
+
+ fields = state.get("fields")
+ if fields is not None:
+ self._setState(fields)
+
+ self.validate()
+
+ def _setState(self, fields):
+ """
+ Set the state while blocking all signals.
+
+ :type fields: list[dict]
+ """
+ for widget in self._widgets:
+ widget.blockSignals(True)
+
+ for widget in self._widgets:
+ widget.setError("")
+ for field in fields:
+ if field.get("name") == widget.data().get("name"):
+ widget.setData(field)
+
+ for widget in self._widgets:
+ widget.blockSignals(False)
+
+ self.stateChanged.emit()
+
+
+class FormDialog(QtWidgets.QFrame):
+
+ accepted = QtCore.Signal(object)
+ rejected = QtCore.Signal(object)
+
+ def __init__(self, parent=None, form=None):
+ super(FormDialog, self).__init__(parent)
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.setContentsMargins(0, 0, 0, 0)
+ layout.setSpacing(0)
+
+ self.setLayout(layout)
+
+ self._widgets = []
+ self._validator = None
+
+ self._title = QtWidgets.QLabel(self)
+ self._title.setObjectName('title')
+ self._title.setText('FORM')
+ self.layout().addWidget(self._title)
+
+ self._description = QtWidgets.QLabel(self)
+ self._description.setObjectName('description')
+ self.layout().addWidget(self._description)
+
+ self._formWidget = FormWidget(self)
+ self._formWidget.setObjectName("formWidget")
+ self._formWidget.validated.connect(self._validated)
+ self.layout().addWidget(self._formWidget)
+
+ self.layout().addStretch(1)
+
+ buttonLayout = QtWidgets.QHBoxLayout()
+ buttonLayout.setContentsMargins(0, 0, 0, 0)
+ buttonLayout.setSpacing(0)
+
+ self.layout().addLayout(buttonLayout)
+
+ buttonLayout.addStretch(1)
+
+ self._acceptButton = QtWidgets.QPushButton(self)
+ self._acceptButton.setObjectName('acceptButton')
+ self._acceptButton.setText('Submit')
+ self._acceptButton.clicked.connect(self.accept)
+
+ self._rejectButton = QtWidgets.QPushButton(self)
+ self._rejectButton.setObjectName('rejectButton')
+ self._rejectButton.setText('Cancel')
+ self._rejectButton.clicked.connect(self.reject)
+
+ buttonLayout.addWidget(self._acceptButton)
+ buttonLayout.addWidget(self._rejectButton)
+
+ if form:
+ self.setSettings(form)
+ # buttonLayout.addStretch(1)
+
+ def _validated(self):
+ """Triggered when the form has been validated"""
+ self._acceptButton.setEnabled(not self._formWidget.hasErrors())
+
+ def acceptButton(self):
+ """
+ Return the accept button.
+
+ :rtype: QWidgets.QPushButton
+ """
+ return self._acceptButton
+
+ def rejectButton(self):
+ """
+ Return the reject button.
+
+ :rtype: QWidgets.QPushButton
+ """
+ return self._rejectButton
+
+ def validateAccepted(self, **kwargs):
+ """
+ Triggered when the accept button has been clicked.
+
+ :type kwargs: The values of the fields
+ """
+ self._formWidget.validator()(**kwargs)
+
+ def validateRejected(self, **kwargs):
+ """
+ Triggered when the reject button has been clicked.
+
+ :type kwargs: The default values of the fields
+ """
+ self._formWidget.validator()(**kwargs)
+
+ def setSettings(self, settings):
+
+ self._settings = settings
+
+ title = settings.get("title")
+ if title is not None:
+ self._title.setText(title)
+
+ callback = settings.get("accepted")
+ if not callback:
+ self._settings["accepted"] = self.validateAccepted
+
+ callback = settings.get("rejected")
+ if not callback:
+ self._settings["rejected"] = self.validateRejected
+
+ description = settings.get("description")
+ if description is not None:
+ self._description.setText(description)
+
+ validator = settings.get("validator")
+ if validator is not None:
+ self._formWidget.setValidator(validator)
+
+ layout = settings.get("layout")
+
+ schema = settings.get("schema")
+ if schema is not None:
+ self._formWidget.setSchema(schema, layout=layout)
+
+ def accept(self):
+ """Call this method to accept the dialog."""
+ callback = self._settings.get("accepted")
+ if callback:
+ callback(**self._formWidget.values())
+ self.close()
+
+ def reject(self):
+ """Call this method to rejected the dialog."""
+ callback = self._settings.get("rejected")
+ if callback:
+ callback(**self._formWidget.defaultValues())
+ self.close()
+
+
+STYLE = """
+
+FormWidget QWidget {
+ /*font-size: 12px;*/
+ text-align: left;
+}
+
+FieldWidget {
+ min-height: 16px;
+ margin-bottom: 3px;
+}
+
+FieldWidget[layout=vertical] #label {
+ margin-bottom: 4px;
+}
+
+FieldWidget[layout=horizontal] #label {
+ margin-left: 4px;
+}
+
+FieldWidget #menuButton {
+ margin-left: 4px;
+ border-radius: 2px;
+ min-width: 25px;
+ max-height: 25px;
+ text-align: center;
+ background-color: rgba(0,0,0,20);
+}
+
+FieldWidget #label {
+ min-width: 72px;
+ color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 100);
+}
+
+FormWidget #titleWidget {
+ font-size: 12px;
+ padding: 2px;
+ padding-left: 5px;
+ background-color: rgba(255, 255, 255, 20);
+ border-bottom: 0px solid rgba(255, 255, 255, 20);
+}
+
+FormWidget #titleWidget:checked {
+ background-color: rgba(255, 255, 255, 5);
+}
+
+FormWidget #optionsFrame {
+ margin: 2px;
+}
+
+FieldWidget QComboBox {
+ border: 1px solid transparent;
+}
+"""
+
+
+def example():
+ """
+ import studiolibrary
+ studiolibrary.reload()
+
+ import studiolibrary
+ studiolibrary.widgets.formwidget.example()
+ """
+ import studiolibrary
+ image = studiolibrary.resource.get("icons", "icon.png")
+
+ schema = [
+ {
+ "name": "name",
+ "value": "Face.anim",
+ "type": "string",
+ },
+ {
+ "name": "objects",
+ "value": "125 objects",
+ "type": "label",
+ },
+ {
+ "name": "sep1",
+ "type": "separator",
+ },
+ {
+ "name": "color",
+ "type": "color",
+ },
+ {
+ "name": "blend",
+ "type": "slider",
+ },
+ {
+ "name": "Bake",
+ "type": "bool",
+ },
+ {
+ "name": "image",
+ "type": "image",
+ "value": image
+ },
+ {
+ "name": "frameRange",
+ "type": "range"
+ },
+ {
+ "name": "option",
+ "type": "enum",
+ "items": ["Test1", "Test2", "Test4"]
+ },
+ {
+ "name": "comment",
+ "value": "this is a comment",
+ "type": "text",
+ "layout": "vertical"
+ },
+ ]
+
+ def validator(**fields):
+ print(fields)
+
+ w = FormWidget()
+ w.setValidator(validator)
+ w.setSchema(schema)
+ w.setStyleSheet(STYLE)
+ w.show()
+
+ return w
+
+
+if __name__ == "__main__":
+ import studioqt
+ with studioqt.app():
+ w = example()
+
+
+
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/groupboxwidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/groupboxwidget.py
new file mode 100644
index 0000000..179c703
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/groupboxwidget.py
@@ -0,0 +1,150 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import logging
+
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+from . import settings
+
+import studioqt
+import studiolibrary
+
+
+logger = logging.getLogger(__name__)
+
+
+class GroupBoxWidget(QtWidgets.QFrame):
+
+ toggled = QtCore.Signal(bool)
+
+ def __init__(self, title, widget, persistent=False, *args, **kwargs):
+ super(GroupBoxWidget, self).__init__(*args, **kwargs)
+
+ self._widget = None
+ self._persistent = None
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.setContentsMargins(0, 0, 0, 0)
+ layout.setSpacing(0)
+
+ self.setLayout(layout)
+
+ self._titleWidget = QtWidgets.QPushButton(self)
+ self._titleWidget.setCheckable(True)
+ self._titleWidget.setText(title)
+ self._titleWidget.setObjectName("title")
+ self._titleWidget.toggled.connect(self._toggled)
+
+ on_path = studiolibrary.resource.get("icons", "caret-down.svg")
+ off_path = studiolibrary.resource.get("icons", "caret-right.svg")
+ icon = studioqt.Icon.fa(on_path, color="rgba(255,255,255,200)", off=off_path)
+ self._titleWidget.setIcon(icon)
+
+ self.layout().addWidget(self._titleWidget)
+
+ self._widgetFrame = QtWidgets.QFrame(self)
+ self._widgetFrame.setObjectName("frame")
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.setContentsMargins(0, 0, 0, 0)
+ layout.setSpacing(0)
+
+ self._widgetFrame.setLayout(layout)
+
+ self.layout().addWidget(self._widgetFrame)
+
+ if widget:
+ self.setWidget(widget)
+
+ self.setPersistent(persistent)
+
+ def setPersistent(self, persistent):
+ """
+ Save and load the state of the widget to disk.
+
+ :type persistent: bool
+ """
+ self._persistent = persistent
+ self.loadSettings()
+
+ def title(self):
+ """
+ Get the title for the group box.
+
+ :rtype: str
+ """
+ return self._titleWidget.text()
+
+ def setWidget(self, widget):
+ """
+ Set the widget to hide when the user clicks the title.
+
+ :type widget: QWidgets.QWidget
+ """
+ self._widget = widget
+ # self._widget.setParent(self._widgetFrame)
+ # self._widgetFrame.layout().addWidget(self._widget)
+
+ def _toggled(self, visible):
+ """
+ Triggered when the user clicks the title.
+
+ :type visible: bool
+ """
+ self.saveSettings()
+ self.setChecked(visible)
+ self.toggled.emit(visible)
+
+ def isChecked(self):
+ """
+ Check the checked state for the group box.
+
+ :rtype: bool
+ """
+ return self._titleWidget.isChecked()
+
+ def setChecked(self, checked):
+ """
+ Overriding this method to hide the widget when the state changes.
+
+ :type checked: bool
+ """
+ self._titleWidget.setChecked(checked)
+ if self._widget:
+ self._widget.setVisible(checked)
+
+ def saveSettings(self):
+ """Save the state to disc."""
+ if self._persistent:
+
+ if not self.objectName():
+ raise NameError("No object name set for persistent widget.")
+
+ data = {self.objectName(): {"checked": self.isChecked()}}
+ settings.save(data)
+
+ def loadSettings(self):
+ """Load the state to disc."""
+ if self._persistent:
+
+ if not self.objectName():
+ raise NameError("No object name set for persistent widget.")
+
+ data = settings.read()
+ data = data.get(self.objectName(), {})
+
+ if isinstance(data, dict):
+ checked = data.get("checked", True)
+ self.setChecked(checked)
+
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/groupbymenu.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/groupbymenu.py
new file mode 100644
index 0000000..4f52c78
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/groupbymenu.py
@@ -0,0 +1,121 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from functools import partial
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtWidgets
+
+from .separatoraction import SeparatorAction
+
+
+class GroupByMenu(QtWidgets.QMenu):
+
+ def __init__(self, name, parent, dataset):
+ super(GroupByMenu, self).__init__(name, parent)
+
+ self._dataset = dataset
+ self.aboutToShow.connect(self.populateMenu)
+
+ def setDataset(self, dataset):
+ """
+ Set the dataset model for the menu:
+
+ :type dataset: studiolibrary.Dataset
+ """
+ self._dataset = dataset
+
+ def dataset(self):
+ """
+ Get the dataset model for the menu.
+
+ :rtype: studiolibrary.Dataset
+ """
+ return self._dataset
+
+ def setGroupBy(self, groupName, groupOrder):
+ """
+ Set the group by value for the dataset.
+
+ :type groupName: str
+ :type groupOrder: str
+ """
+ if groupName:
+ value = [groupName + ":" + groupOrder]
+ else:
+ value = None
+
+ self.dataset().setGroupBy(value)
+ self.dataset().search()
+
+ def populateMenu(self):
+ """
+ Show the menu options.
+ """
+ self.clear()
+
+ groupBy = self.dataset().groupBy()
+ if groupBy:
+ currentField = groupBy[0].split(":")[0]
+ currentOrder = "dsc" if "dsc" in groupBy[0] else "asc"
+ else:
+ currentField = ""
+ currentOrder = ""
+
+ action = SeparatorAction("Group By", self)
+ self.addAction(action)
+
+ action = self.addAction("None")
+ action.setCheckable(True)
+
+ if not currentField:
+ action.setChecked(True)
+
+ callback = partial(self.setGroupBy, None, None)
+ action.triggered.connect(callback)
+
+ fields = self.dataset().fields()
+
+ for field in fields:
+
+ if not field.get("groupable"):
+ continue
+
+ name = field.get("name")
+
+ action = self.addAction(name.title())
+ action.setCheckable(True)
+
+ if currentField == name:
+ action.setChecked(True)
+ else:
+ action.setChecked(False)
+
+ callback = partial(self.setGroupBy, name, currentOrder)
+ action.triggered.connect(callback)
+
+ action = SeparatorAction("Group Order", self)
+ self.addAction(action)
+
+ action = self.addAction("Ascending")
+ action.setCheckable(True)
+ action.setChecked(currentOrder == "asc")
+
+ callback = partial(self.setGroupBy, currentField, "asc")
+ action.triggered.connect(callback)
+
+ action = self.addAction("Descending")
+ action.setCheckable(True)
+ action.setChecked(currentOrder == "dsc")
+
+ callback = partial(self.setGroupBy, currentField, "dsc")
+ action.triggered.connect(callback)
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/iconpicker.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/iconpicker.py
new file mode 100644
index 0000000..fa0f54a
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/iconpicker.py
@@ -0,0 +1,324 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from functools import partial
+
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+import studioqt
+
+from studiolibrary import resource
+
+
+class IconButton(QtWidgets.QToolButton):
+
+ def __init__(self, *args):
+ super(IconButton, self).__init__(*args)
+
+ self.setObjectName('iconButton')
+
+ self._iconPath = None
+
+ self.setCheckable(True)
+ self.setCursor(QtCore.Qt.PointingHandCursor)
+
+ def setIconPath(self, path):
+ """
+ Set the path for the button.
+
+ :type path: str
+ """
+ self._iconPath = path
+ self.updateIcon()
+
+ def updateIcon(self):
+
+ self.setToolTip(self._iconPath)
+ self.setStatusTip(self._iconPath)
+
+ color = self.palette().color(self.foregroundRole())
+ color = studioqt.Color.fromColor(color)
+
+ icon = resource.icon(self._iconPath, color=color)
+ self.setIcon(icon)
+
+ def iconPath(self):
+ """
+ Get the color for the button.
+
+ :rtype: str
+ """
+ return self._iconPath
+
+
+class IconPickerAction(QtWidgets.QWidgetAction):
+
+ def __init__(self, *args):
+ super(IconPickerAction, self).__init__(*args)
+
+ self._picker = IconPickerWidget()
+ self._picker.setMouseTracking(True)
+ self._picker.setObjectName("iconPickerAction")
+ self._picker.iconChanged.connect(self._triggered)
+
+ def picker(self):
+ """
+ Get the picker widget instance.
+
+ :rtype: IconPickerWidget
+ """
+ return self._picker
+
+ def _triggered(self):
+ """Triggered when the checkbox value has changed."""
+ self.trigger()
+
+ if isinstance(self.parent().parent(), QtWidgets.QMenu):
+ self.parent().parent().close()
+
+ elif isinstance(self.parent(), QtWidgets.QMenu):
+ self.parent().close()
+
+ def createWidget(self, menu):
+ """
+ This method is called by the QWidgetAction base class.
+
+ :type menu: QtWidgets.QMenu
+ """
+ widget = QtWidgets.QFrame(menu)
+ widget.setObjectName("iconPickerAction")
+
+ self.picker().setParent(widget)
+
+ actionLayout = QtWidgets.QHBoxLayout()
+ actionLayout.setContentsMargins(0, 0, 0, 0)
+ actionLayout.addWidget(self.picker(), stretch=1)
+ widget.setLayout(actionLayout)
+
+ return widget
+
+
+class IconPickerWidget(QtWidgets.QFrame):
+
+ BUTTON_CLASS = IconButton
+
+ iconChanged = QtCore.Signal(object)
+
+ def __init__(self, *args):
+ QtWidgets.QFrame.__init__(self, *args)
+
+ self._buttons = []
+ self._currentIcon = None
+ self._menuButton = None
+
+ layout = QtWidgets.QGridLayout()
+ layout.setSpacing(0)
+ layout.setContentsMargins(0, 0, 0, 0)
+ self.setLayout(layout)
+
+ def enterEvent(self, event):
+ """
+ Overriding this method to fix a bug with custom actions.
+
+ :type event: QtCore.QEvent
+ """
+ if self.parent():
+ menu = self.parent().parent()
+ if isinstance(menu, QtWidgets.QMenu):
+ menu.setActiveAction(None)
+
+ def _iconChanged(self, iconPath):
+ """
+ Triggered when the user clicks or browses for a color.
+
+ :type iconPath: str
+ :rtype: None
+ """
+ self.setCurrentIcon(iconPath)
+ self.iconChanged.emit(iconPath)
+
+ def menuButton(self):
+ """
+ Get the menu button used for browsing for custom colors.
+
+ :rtype: QtGui.QWidget
+ """
+ return self._menuButton
+
+ def deleteButtons(self):
+ """
+ Delete all the color buttons.
+
+ :rtype: None
+ """
+ layout = self.layout()
+ while layout.count():
+ item = layout.takeAt(0)
+ item.widget().deleteLater()
+
+ def currentIcon(self):
+ """
+ Return the current color.
+
+ :rtype: studioqt.Color
+ """
+ return self._currentIcon
+
+ def setCurrentIcon(self, color):
+ """
+ Set the current color.
+
+ :type color: studioqt.Color
+ """
+ self._currentIcon = color
+ self.refresh()
+
+ def refresh(self):
+ """Update the current state of the selected color."""
+ for button in self._buttons:
+ button.setChecked(button.iconPath() == self.currentIcon())
+
+ def updateTheme(self):
+ for button in self._buttons:
+ button.updateIcon()
+
+ def setIcons(self, icons):
+ """
+ Set the colors for the color bar.
+
+ :type icons: list[str] or list[studioqt.Icon]
+ """
+ self.deleteButtons()
+
+ i = 0
+ first = True
+ last = False
+
+ positions = [(i, j) for i in range(5) for j in range(5)]
+ for position, iconPath in zip(positions, icons):
+ i += 1
+
+ if i == len(icons) - 1:
+ last = True
+
+ callback = partial(self._iconChanged, iconPath)
+
+ button = self.BUTTON_CLASS(self)
+ button.setIconPath(iconPath)
+ # button.setIconSize(QtCore.QSize(16, 16))
+
+ button.setSizePolicy(
+ QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Preferred
+ )
+
+ button.setProperty("first", first)
+ button.setProperty("last", last)
+
+ button.clicked.connect(callback)
+
+ self.layout().addWidget(button, *position)
+
+ self._buttons.append(button)
+
+ first = False
+
+ self._menuButton = QtWidgets.QPushButton("...", self)
+ self._menuButton.setObjectName('menuButton')
+ self._menuButton.setSizePolicy(
+ QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Preferred
+ )
+
+ self._menuButton.clicked.connect(self.browseColor)
+ self.layout().addWidget(self._menuButton)
+
+ self.refresh()
+ self.updateTheme()
+
+ @QtCore.Slot()
+ def blankSlot(self):
+ """Blank slot to fix an issue with PySide2.QColorDialog.open()"""
+ pass
+
+ def browseColor(self):
+ """
+ Show the color dialog.
+
+ :rtype: None
+ """
+ pass
+ # color = self.currentColor()
+ # if color:
+ # color = studioqt.Color.fromString(color)
+ #
+ # d = QtWidgets.QColorDialog(self)
+ # d.setCurrentColor(color)
+ #
+ # d.currentColorChanged.connect(self._colorChanged)
+ #
+ # if d.exec_():
+ # self._colorChanged(d.selectedColor())
+ # else:
+ # self._colorChanged(color)
+
+
+def example():
+ """
+ Example:
+
+ import studiolibrary.widgets.colorpicker
+ reload(studiolibrary.widgets.colorpicker)
+ studiolibrary.widgets.colorpicker.example()
+ """
+
+ def _iconChanged(icon):
+ print("iconChanged:", icon)
+
+ style = """
+ #iconButton {
+ margin: 2px;
+ min-width: 18px;
+ min-height: 18px;
+ background-color: rgba(0,0,0,0);
+ }
+ """
+
+ from studiolibrary import resource
+
+ icons = []
+ names = [
+ "folder.svg",
+ "user.svg",
+ "character.svg",
+ "users.svg",
+ "inbox.svg",
+ "favorite.svg",
+ "shot.svg",
+ "asset.svg",
+ "assets.svg",
+ ]
+
+ for name in names:
+ icons.append(resource.icon(name, color="rgb(255,255,255)"))
+
+ picker = IconPickerWidget()
+ picker.setStyleSheet(style)
+ picker.setIcons(icons)
+ picker.iconChanged.connect(_iconChanged)
+ picker.show()
+
+
+if __name__ == "__main__":
+ with studioqt.app():
+ example()
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/__init__.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/__init__.py
new file mode 100644
index 0000000..fa43df4
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/__init__.py
@@ -0,0 +1,11 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/groupitem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/groupitem.py
new file mode 100644
index 0000000..6ee2d3b
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/groupitem.py
@@ -0,0 +1,216 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+from .item import Item
+
+
+class GroupItem(Item):
+
+ DEFAULT_FONT_SIZE = 18
+ PADDING_LEFT = 2
+ PADDING_RIGHT = 20
+ HEIGHT = 28
+
+ def __init__(self, *args):
+ super(GroupItem, self).__init__(*args)
+
+ self._children = []
+
+ self._font = self.font(0)
+ self._font.setBold(True)
+
+ self.setFont(0, self._font)
+ self.setFont(1, self._font)
+ self.setDragEnabled(False)
+
+ def setChildren(self, children):
+ """
+ Set the children for the group.
+
+ :type children: list[Item]
+ :rtype: None
+ """
+ self._children = children
+
+ def children(self):
+ """
+ Return the children for the group.
+
+ :rtype: list[Item]
+ """
+ return self._children
+
+ def childrenHidden(self):
+ """
+ Return True if all children are hidden.
+
+ :rtype: bool
+ """
+ for child in self.children():
+ if not child.isHidden():
+ return False
+ return True
+
+ def updateChildren(self):
+ """
+ Update the visibility if all children are hidden.
+
+ :rtype: bool
+ """
+ if self.childrenHidden():
+ self.setHidden(True)
+ else:
+ self.setHidden(False)
+
+ def textAlignment(self, column):
+ """
+ Return the font alignment for the given column.
+
+ :type column: int
+ """
+ return QtWidgets.QTreeWidgetItem.textAlignment(self, column)
+
+ def sizeHint(self, column=0):
+ """
+ Return the size of the item.
+
+ :rtype: QtCore.QSize
+ """
+ padding = self.PADDING_RIGHT * self.dpi()
+ width = self.itemsWidget().width() - padding
+ return QtCore.QSize(width, self.HEIGHT * self.dpi())
+
+ def visualRect(self, option):
+ """
+ Return the visual rect for the item.
+
+ :type option: QtWidgets.QStyleOptionViewItem
+ :rtype: QtCore.QRect
+ """
+ rect = QtCore.QRect(option.rect)
+ rect.setX(self.PADDING_LEFT * self.dpi())
+ rect.setWidth(self.sizeHint().width())
+ return rect
+
+ def isTextVisible(self):
+ """
+ Return True if the text is visible.
+
+ :rtype: bool
+ """
+ return True
+
+ def textSelectedColor(self):
+ """
+ Return the selected text color for the item.
+
+ :rtype: QtWidgets.QtColor
+ """
+ return self.itemsWidget().textColor()
+
+ def backgroundColor(self):
+ """
+ Return the background color for the item.
+
+ :rtype: QtWidgets.QtColor
+ """
+ return QtGui.QColor(0, 0, 0, 0)
+
+ def backgroundHoverColor(self):
+ """
+ Return the background color when the mouse is over the item.
+
+ :rtype: QtWidgets.QtColor
+ """
+ return QtGui.QColor(0, 0, 0, 0)
+
+ def backgroundSelectedColor(self):
+ """
+ Return the background color when the item is selected.
+
+ :rtype: QtWidgets.QtColor
+ """
+ return QtGui.QColor(0, 0, 0, 0)
+
+ def paintRow(self, painter, option, index):
+ """
+ Paint performs low-level painting for the item.
+
+ :type painter: QtWidgets.QPainter
+ :type option: QtWidgets.QStyleOptionViewItem
+ :type index: QtCore.QModelIndex
+ :rtype: None
+ """
+ self.setRect(QtCore.QRect(option.rect))
+
+ painter.save()
+
+ try:
+ self.paintBackground(painter, option, index)
+
+ if self.isTextVisible():
+ self._paintText(painter, option, 1)
+
+ finally:
+ painter.restore()
+
+ def isLabelOverItem(self):
+ """Overriding this method to ignore this feature for group items."""
+ return False
+
+ def isLabelUnderItem(self):
+ """Overriding this method to ignore this feature for group items."""
+ return False
+
+ def icon(self, *args):
+ """
+ Overriding the icon method, so that an icon is not displayed.
+ """
+ return None
+
+ def paintBackground(self, painter, option, index):
+ """
+ Draw the background for the item.
+
+ :type painter: QtWidgets.QPainter
+ :type option: QtWidgets.QStyleOptionViewItem
+ :type index: QtCore.QModelIndex
+ :rtype: None
+ """
+ super(GroupItem, self).paintBackground(painter, option, index)
+
+ painter.setPen(QtGui.QPen(QtCore.Qt.NoPen))
+ visualRect = self.visualRect(option)
+
+ text = self.name()
+ metrics = QtGui.QFontMetricsF(self._font)
+ textWidth = metrics.boundingRect(text).width()
+
+ padding = (25 * self.dpi())
+
+ visualRect.setX(textWidth + padding)
+ visualRect.setY(visualRect.y() + (visualRect.height() / 2))
+ visualRect.setHeight(2 * self.dpi())
+ visualRect.setWidth(visualRect.width() - padding)
+
+ color = QtGui.QColor(
+ self.textColor().red(),
+ self.textColor().green(),
+ self.textColor().blue(), 10
+ )
+ painter.setBrush(QtGui.QBrush(color))
+
+ painter.drawRect(visualRect)
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/item.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/item.py
new file mode 100644
index 0000000..f040023
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/item.py
@@ -0,0 +1,1513 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import os
+import math
+import logging
+
+from studiovendor import six
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+import studioqt
+import studiolibrary
+
+
+logger = logging.getLogger(__name__)
+
+
+class GlobalSignals(QtCore.QObject):
+ """"""
+ sliderChanged = QtCore.Signal(float)
+
+
+class WorkerSignals(QtCore.QObject):
+ triggered = QtCore.Signal(object)
+
+
+class LabelDisplayOption:
+
+ Hide = "hide label"
+ Over = "label over item"
+ Under = "label under item"
+
+ @staticmethod
+ def values():
+ return [
+ LabelDisplayOption.Hide,
+ LabelDisplayOption.Over,
+ LabelDisplayOption.Under,
+ ]
+
+
+class ImageWorker(QtCore.QRunnable):
+ """A convenience class for loading an image in a thread."""
+
+ def __init__(self, *args):
+ QtCore.QRunnable.__init__(self, *args)
+
+ self._path = None
+ self.signals = WorkerSignals()
+
+ def setPath(self, path):
+ """
+ Set the image path to be processed.
+
+ :type path: str
+ """
+ self._path = path
+
+ def run(self):
+ """The starting point for the thread."""
+ try:
+ if self._path:
+ image = QtGui.QImage(six.text_type(self._path))
+ self.signals.triggered.emit(image)
+ except Exception as error:
+ logger.exception("Cannot load thumbnail image.")
+
+
+class Item(QtWidgets.QTreeWidgetItem):
+ """The Item is used to hold rows of information for an item view."""
+
+ ICON_PATH = None
+ TYPE_ICON_PATH = None
+
+ ThreadPool = QtCore.QThreadPool()
+ THUMBNAIL_PATH = ""
+
+ MAX_ICON_SIZE = 256
+
+ DEFAULT_FONT_SIZE = 12
+ DEFAULT_PLAYHEAD_COLOR = QtGui.QColor(255, 255, 255, 220)
+
+ THUMBNAIL_COLUMN = 0
+ ENABLE_THUMBNAIL_THREAD = True
+ PAINT_SLIDER = False
+
+ _TYPE_PIXMAP_CACHE = {}
+
+ _globalSignals = GlobalSignals()
+ sliderChanged = _globalSignals.sliderChanged
+
+ def __init__(self, *args):
+ QtWidgets.QTreeWidgetItem.__init__(self, *args)
+
+ self._url = None
+ self._path = None
+ self._size = None
+ self._rect = None
+ self._textColumnOrder = []
+
+ self._data = {}
+ self._itemData = {}
+
+ self._icon = {}
+ self._fonts = {}
+ self._thread = None
+ self._pixmap = {}
+ self._pixmapRect = None
+ self._pixmapScaled = None
+
+ self._iconPath = None
+ self._typePixmap = None
+
+ self._thumbnailIcon = None
+
+ self._underMouse = False
+ self._searchText = None
+ self._infoWidget = None
+
+ self._groupItem = None
+ self._groupColumn = 0
+
+ self._mimeText = None
+ self._itemsWidget = None
+ self._stretchToWidget = None
+
+ self._dragEnabled = True
+
+ self._imageSequence = None
+ self._imageSequencePath = ""
+
+ self._sliderDown = False
+ self._sliderValue = 0.0
+ self._sliderPreviousValue = 0.0
+ self._sliderPosition = None
+ self._sliderEnabled = False
+
+ self._worker = ImageWorker()
+ self._worker.setAutoDelete(False)
+ self._worker.signals.triggered.connect(self._thumbnailFromImage)
+ self._workerStarted = False
+
+ def __eq__(self, other):
+ return id(other) == id(self)
+
+ def __ne__(self, other):
+ return id(other) != id(self)
+
+ def __hash__(self):
+ return hash(id(self))
+
+ def __del__(self):
+ """
+ Make sure the sequence is stopped when deleted.
+
+ :rtype: None
+ """
+ self.stop()
+
+ def columnFromLabel(self, label):
+ if self.treeWidget():
+ return self.treeWidget().columnFromLabel(label)
+ else:
+ return None
+
+ def labelFromColumn(self, column):
+ if self.treeWidget():
+ return self.treeWidget().labelFromColumn(column)
+ else:
+ return None
+
+ def mimeText(self):
+ """
+ Return the mime text for drag and drop.
+
+ :rtype: str
+ """
+ return self._mimeText or self.text(0)
+
+ def setMimeText(self, text):
+ """
+ Set the mime text for drag and drop.
+
+ :type text: str
+ :rtype: None
+ """
+ self._mimeText = text
+
+ def setHidden(self, value):
+ """
+ Set the item hidden.
+
+ :type value: bool
+ :rtype: None
+ """
+ QtWidgets.QTreeWidgetItem.setHidden(self, value)
+ row = self.treeWidget().indexFromItem(self).row()
+ self.itemsWidget().listView().setRowHidden(row, value)
+
+ def setDragEnabled(self, value):
+ """
+ Set True if the item can be dragged.
+
+ :type value: bool
+ :rtype: None
+ """
+ self._dragEnabled = value
+
+ def dragEnabled(self):
+ """
+ Return True if the item can be dragged.
+
+ :rtype: bool
+ """
+ return self._dragEnabled
+
+ def setIcon(self, column, icon, color=None):
+ """
+ Set the icon to be displayed in the given column.
+
+ :type column: int or str
+ :type icon: QtGui.QIcon
+ :type color: QtGui.QColor or None
+ :rtype: None
+ """
+ # Safe guard for when the class is being used without the gui.
+ isAppRunning = bool(QtWidgets.QApplication.instance())
+ if not isAppRunning:
+ return
+
+ if isinstance(icon, six.string_types):
+ if not os.path.exists(icon):
+ color = color or studioqt.Color(255, 255, 255, 20)
+ icon = studiolibrary.resource.icon("image", color=color)
+ else:
+ icon = QtGui.QIcon(icon)
+
+ if isinstance(column, six.string_types):
+ self._icon[column] = icon
+ else:
+ self._pixmap[column] = None
+ QtWidgets.QTreeWidgetItem.setIcon(self, column, icon)
+
+ self.updateIcon()
+
+ def setItemData(self, data):
+ """
+ Set the given dictionary as the data for the item.
+
+ :type data: dict
+ :rtype: None
+ """
+ self._itemData = data
+
+ def itemData(self):
+ """
+ Return the item data for this item.
+
+ :rtype: dict
+ """
+ return self._itemData
+
+ def setName(self, text):
+ """
+ Set the name that is shown under the icon and in the Name column.
+
+ :type text: str
+ :rtype: None
+ """
+ itemData = self.itemData()
+ itemData['icon'] = text
+ itemData['name'] = text
+
+ def name(self):
+ """
+ Return text for the Name column.
+
+ :rtype: str
+ """
+ return self.itemData().get("name")
+
+ def displayText(self, label):
+ """
+ Return the sort data for the given column.
+
+ :type label: str
+ :rtype: str
+ """
+ return six.text_type(self.itemData().get(label, ''))
+
+ def sortText(self, label):
+ """
+ Return the sort data for the given column.
+
+ :type label: str
+ :rtype: str
+ """
+ return six.text_type(self.itemData().get(label, ''))
+
+ def update(self):
+ """
+ Refresh the visual state of the icon.
+
+ :rtype: None
+ """
+ self.updateIcon()
+ self.updateFrame()
+
+ def updateIcon(self):
+ """
+ Clear the pixmap cache for the item.
+
+ :rtype: None
+ """
+ self.clearCache()
+
+ def clearCache(self):
+ """Clear the thumbnail cache."""
+ self._pixmap = {}
+ self._pixmapRect = None
+ self._pixmapScaled = None
+ self._thumbnailIcon = None
+
+ def dpi(self):
+ """
+ Used for high resolution devices.
+
+ :rtype: int
+ """
+ if self.itemsWidget():
+ return self.itemsWidget().dpi()
+ else:
+ return 1
+
+ def clicked(self):
+ """
+ Triggered when an item is clicked.
+
+ :rtype: None
+ """
+ pass
+
+ def takeFromTree(self):
+ """
+ Takes this item from the tree.
+ """
+ tree = self.treeWidget()
+ parent = self.parent()
+
+ if parent:
+ parent.takeChild(parent.indexOfChild(self))
+ else:
+ tree.takeTopLevelItem(tree.indexOfTopLevelItem(self))
+
+ def selectionChanged(self):
+ """
+ Triggered when an item has been either selected or deselected.
+
+ :rtype: None
+ """
+ self.resetSlider()
+
+ def doubleClicked(self):
+ """
+ Triggered when an item is double clicked.
+
+ :rtype: None
+ """
+ pass
+
+ def setGroupItem(self, groupItem):
+ """
+ Set the group item that this item is a child to.
+
+ :type groupItem: groupitem.GroupItem
+ """
+ self._groupItem = groupItem
+
+ def groupItem(self):
+ """
+ Get the group item that this item is a child to.
+
+ :rtype: groupitem.GroupItem
+ """
+ return self._groupItem
+
+ def itemsWidget(self):
+ """
+ Returns the items widget that contains the items.
+
+ :rtype: ItemsWidget
+ """
+ itemsWidget = None
+
+ if self.treeWidget():
+ itemsWidget = self.treeWidget().parent()
+
+ return itemsWidget
+
+ def url(self):
+ """
+ Return the url object for the given item.
+
+ :rtype: QtCore.QUrl or None
+ """
+ if not self._url:
+ self._url = QtCore.QUrl(self.text(0))
+ return self._url
+
+ def setUrl(self, url):
+ """
+ Set the url object for the item.
+
+ :type: QtCore.QUrl or None
+ :rtype: None
+ """
+ self._url = url
+
+ def searchText(self):
+ """
+ Return the search string used for finding the item.
+
+ :rtype: str
+ """
+ if not self._searchText:
+ self._searchText = six.text_type(self._data)
+
+ return self._searchText
+
+ def setStretchToWidget(self, widget):
+ """
+ Set the width of the item to the width of the given widget.
+
+ :type widget: QtWidgets.QWidget
+ :rtype: None
+ """
+ self._stretchToWidget = widget
+
+ def stretchToWidget(self):
+ """
+ Return the sretchToWidget.
+
+ :rtype: QtWidgets.QWidget
+ """
+ return self._stretchToWidget
+
+ def setSize(self, size):
+ """
+ Set the size for the item.
+
+ :type size: QtCore.QSize
+ :rtype: None
+ """
+ self._size = size
+
+ def sizeHint(self, column=0):
+ """
+ Return the current size of the item.
+
+ :type column: int
+ :rtype: QtCore.QSize
+ """
+ if self.stretchToWidget():
+ if self._size:
+ size = self._size
+ else:
+ size = self.itemsWidget().iconSize()
+
+ w = self.stretchToWidget().width()
+ h = size.height()
+ return QtCore.QSize(w - 20, h)
+
+ if self._size:
+ return self._size
+ else:
+ iconSize = self.itemsWidget().iconSize()
+
+ if self.isLabelUnderItem():
+ w = iconSize.width()
+ h = iconSize.width() + self.textHeight()
+ iconSize = QtCore.QSize(w, h)
+
+ return iconSize
+
+ def setPixmap(self, column, pixmap):
+ """
+ Set the pixmap to be displayed in the given column.
+
+ :type column: int
+ :type pixmap: QtWidgets.QPixmap
+ :rtype: None
+ """
+ self._pixmap[column] = pixmap
+
+ def thumbnailPath(self):
+ """
+ Return the thumbnail path on disk.
+
+ :rtype: None or str
+ """
+ return ""
+
+ def _thumbnailFromImage(self, image):
+ """
+ Called after the given image object has finished loading.
+
+ :type image: QtGui.QImage
+ :rtype: None
+ """
+ self.clearCache()
+
+ pixmap = QtGui.QPixmap()
+ pixmap.convertFromImage(image)
+ icon = QtGui.QIcon(pixmap)
+
+ self._thumbnailIcon = icon
+ if self.itemsWidget():
+ self.itemsWidget().update()
+
+ def defaultThumbnailPath(self):
+ """
+ Get the default thumbnail path.
+
+ :rtype: str
+ """
+ return self.THUMBNAIL_PATH
+
+ def defaultThumbnailIcon(self):
+ """
+ Get the default thumbnail icon.
+
+ :rtype: QtGui.QIcon
+ """
+ return QtGui.QIcon(self.defaultThumbnailPath())
+
+ def thumbnailIcon(self):
+ """
+ Return the thumbnail icon.
+
+ :rtype: QtGui.QIcon
+ """
+ thumbnailPath = self.thumbnailPath()
+
+ if not self._thumbnailIcon:
+ if self.ENABLE_THUMBNAIL_THREAD and not self._workerStarted:
+ self._workerStarted = True
+ self._worker.setPath(thumbnailPath)
+
+ self.ThreadPool.start(self._worker)
+
+ self._thumbnailIcon = self.defaultThumbnailIcon()
+ else:
+ self._thumbnailIcon = QtGui.QIcon(thumbnailPath)
+
+ return self._thumbnailIcon
+
+ def icon(self, column):
+ """
+ Overriding the icon method to add support for the thumbnail icon.
+
+ :type column: int
+ :rtype: QtGui.QIcon
+ """
+ icon = QtWidgets.QTreeWidgetItem.icon(self, column)
+
+ if not icon and column == self.THUMBNAIL_COLUMN:
+ icon = self.thumbnailIcon()
+
+ return icon
+
+ def pixmap(self, column):
+ """
+ Return the pixmap for the given column.
+
+ :type column: int
+ :rtype: QtWidgets.QPixmap
+ """
+
+ if not self._pixmap.get(column):
+
+ icon = self.icon(column)
+ if icon:
+ size = QtCore.QSize(self.MAX_ICON_SIZE, self.MAX_ICON_SIZE)
+ iconSize = icon.actualSize(size)
+ self._pixmap[column] = icon.pixmap(iconSize)
+
+ return self._pixmap.get(column)
+
+ def padding(self):
+ """
+ Return the padding/border size for the item.
+
+ :rtype: int
+ """
+ return self.itemsWidget().padding()
+
+ def textHeight(self):
+ """
+ Return the height of the text for the item.
+
+ :rtype: int
+ """
+ return self.itemsWidget().itemTextHeight()
+
+ def isTextVisible(self):
+ """
+ Check if the label should be displayed.
+
+ :rtype: bool
+ """
+ return self.labelDisplayOption() != LabelDisplayOption.Hide
+
+ def isLabelOverItem(self):
+ """
+ Check if the label should be displayed over the item.
+
+ :rtype: bool
+ """
+ return self.labelDisplayOption() == LabelDisplayOption.Over
+
+ def isLabelUnderItem(self):
+ """
+ Check if the label should be displayed under the item.
+
+ :rtype: bool
+ """
+ return self.labelDisplayOption() == LabelDisplayOption.Under
+
+ def labelDisplayOption(self):
+ """
+ Return True if the text is visible.
+
+ :rtype: bool
+ """
+ return self.itemsWidget().labelDisplayOption()
+
+ def textAlignment(self, column):
+ """
+ Return the text alignment for the label in the given column.
+
+ :type column: int
+ :rtype: QtCore.Qt.AlignmentFlag
+ """
+ if self.itemsWidget().isIconView():
+ return QtCore.Qt.AlignCenter
+ else:
+ return QtWidgets.QTreeWidgetItem.textAlignment(self, column)
+
+ # -----------------------------------------------------------------------
+ # Support for mouse and key events
+ # -----------------------------------------------------------------------
+
+ def underMouse(self):
+ """Return True if the item is under the mouse cursor."""
+ return self._underMouse
+
+ def contextMenu(self, menu):
+ """
+ Return the context menu for the item.
+
+ Reimplement in a subclass to return a custom context menu for the item.
+
+ :rtype: QtWidgets.QMenu
+ """
+ pass
+
+ def dropEvent(self, event):
+ """
+ Reimplement in a subclass to receive drop events for the item.
+
+ :type event: QtWidgets.QDropEvent
+ :rtype: None
+ """
+
+ def mouseLeaveEvent(self, event):
+ """
+ Reimplement in a subclass to receive mouse leave events for the item.
+
+ :type event: QtWidgets.QMouseEvent
+ :rtype: None
+ """
+ self._underMouse = False
+ self.stop()
+
+ def mouseEnterEvent(self, event):
+ """
+ Reimplement in a subclass to receive mouse enter events for the item.
+
+ :type event: QtWidgets.QMouseEvent
+ :rtype: None
+ """
+ self._underMouse = True
+ self.play()
+
+ def mouseMoveEvent(self, event):
+ """
+ Reimplement in a subclass to receive mouse move events for the item.
+
+ :type event: QtWidgets.QMouseEvent
+ :rtype: None
+ """
+ self.sliderEvent(event)
+ self.imageSequenceEvent(event)
+
+ def mousePressEvent(self, event):
+ """
+ Reimplement in a subclass to receive mouse press events for the item.
+
+ :type event: QtWidgets.QMouseEvent
+ :rtype: None
+ """
+ if event.button() == QtCore.Qt.MiddleButton:
+ if self.isSliderEnabled():
+ self.setSliderDown(True)
+ self._sliderPosition = event.pos()
+
+ def mouseReleaseEvent(self, event):
+ """
+ Reimplement in a subclass to receive mouse release events for the item.
+
+ :type event: QtWidgets.QMouseEvent
+ :rtype: None
+ """
+ if self.isSliderDown():
+ self._sliderPreviousValue = self.sliderValue()
+ self._sliderPosition = None
+
+ self.treeWidget()._itemSliderReleased(self, self.sliderValue())
+ self.setSliderDown(False)
+
+ def keyPressEvent(self, event):
+ """
+ Reimplement in a subclass to receive key press events for the item.
+
+ :type event: QtWidgets.QKeyEvent
+ :rtype: None
+ """
+ pass
+
+ def keyReleaseEvent(self, event):
+ """
+ Reimplement in a subclass to receive key release events for the item.
+
+ :type event: QtWidgets.QKeyEvent
+ :rtype: None
+ """
+ pass
+
+ # -----------------------------------------------------------------------
+ # Support for custom painting
+ # -----------------------------------------------------------------------
+
+ def textColor(self):
+ """
+ Return the text color for the item.
+
+ :rtype: QtWidgets.QtColor
+ """
+ # This will be changed to use the palette soon.
+ # Note: There were problems with older versions of Qt's palette (Maya 2014).
+ # Eg:
+ # return self.itemsWidget().palette().color(self.itemsWidget().foregroundRole())
+ return self.itemsWidget().textColor()
+
+ def textSelectedColor(self):
+ """
+ Return the selected text color for the item.
+
+ :rtype: QtWidgets.QtColor
+ """
+ return self.itemsWidget().textSelectedColor()
+
+ def backgroundColor(self):
+ """
+ Return the background color for the item.
+
+ :rtype: QtWidgets.QtColor
+ """
+ return self.itemsWidget().itemBackgroundColor()
+
+ def backgroundHoverColor(self):
+ """
+ Return the background color when the mouse is over the item.
+
+ :rtype: QtWidgets.QtColor
+ """
+ return self.itemsWidget().backgroundHoverColor()
+
+ def backgroundSelectedColor(self):
+ """
+ Return the background color when the item is selected.
+
+ :rtype: QtWidgets.QtColor
+ """
+ return self.itemsWidget().backgroundSelectedColor()
+
+ def rect(self):
+ """
+ Return the rect for the current paint frame.
+
+ :rtype: QtCore.QRect
+ """
+ return self._rect
+
+ def setRect(self, rect):
+ """
+ Set the rect for the current paint frame.
+
+ :type rect: QtCore.QRect
+ :rtype: None
+ """
+ self._rect = rect
+
+ def visualRect(self, option):
+ """
+ Return the visual rect for the item.
+
+ :type option: QtWidgets.QStyleOptionViewItem
+ :rtype: QtCore.QRect
+ """
+ return QtCore.QRect(option.rect)
+
+ def paintRow(self, painter, option, index):
+ """
+ Paint performs low-level painting for the item.
+
+ :type painter: QtWidgets.QPainter
+ :type option: QtWidgets.QStyleOptionViewItem
+ :type index: QtCore.QModelIndex
+ :rtype: None
+ """
+ QtWidgets.QTreeWidget.drawRow(
+ self.treeWidget(),
+ painter,
+ option,
+ index
+ )
+
+ def paint(self, painter, option, index):
+ """
+ Paint performs low-level painting for the item.
+
+ :type painter: QtWidgets.QPainter
+ :type option: QtWidgets.QStyleOptionViewItem
+ :type index: QtCore.QModelIndex
+ :rtype: None
+ """
+ self.setRect(QtCore.QRect(option.rect))
+
+ painter.save()
+
+ try:
+ self.paintBackground(painter, option, index)
+
+ self.paintIcon(painter, option, index)
+
+ if index.column() == 0 and self.sliderValue() != 0:
+ self.paintSlider(painter, option, index)
+
+ if self.isTextVisible():
+ self.paintText(painter, option, index)
+
+ if index.column() == 0:
+ self.paintTypeIcon(painter, option)
+
+ if index.column() == 0 and self.imageSequence():
+ self.paintPlayhead(painter, option)
+
+ finally:
+ painter.restore()
+
+ def paintBackground(self, painter, option, index):
+ """
+ Draw the background for the item.
+
+ :type painter: QtWidgets.QPainter
+ :type option: QtWidgets.QStyleOptionViewItem
+ :type index: QtCore.QModelIndex
+ """
+ isSelected = option.state & QtWidgets.QStyle.State_Selected
+ isMouseOver = option.state & QtWidgets.QStyle.State_MouseOver
+ painter.setPen(QtGui.QPen(QtCore.Qt.NoPen))
+
+ visualRect = self.visualRect(option)
+
+ if isSelected:
+ color = self.backgroundSelectedColor()
+ painter.setBrush(QtGui.QBrush(color))
+ elif isMouseOver:
+ color = self.backgroundHoverColor()
+ painter.setBrush(QtGui.QBrush(color))
+ else:
+ color = self.backgroundColor()
+ painter.setBrush(QtGui.QBrush(color))
+
+ if not self.itemsWidget().isIconView():
+ spacing = 1 * self.dpi()
+ height = visualRect.height() - spacing
+ visualRect.setHeight(height)
+
+ painter.drawRect(visualRect)
+
+ def paintSlider(self, painter, option, index):
+ """
+ Draw the virtual slider for the item.
+
+ :type painter: QtWidgets.QPainter
+ :type option: QtWidgets.QStyleOptionViewItem
+ :type index: QtCore.QModelIndex
+ """
+ if not self.PAINT_SLIDER:
+ return
+
+ if not self.itemsWidget().isIconView():
+ return
+
+ # Draw slider background
+ painter.setPen(QtGui.QPen(QtCore.Qt.NoPen))
+
+ rect = self.visualRect(option)
+
+ color = self.itemsWidget().backgroundColor().toRgb()
+ color.setAlpha(75)
+ painter.setBrush(QtGui.QBrush(color))
+
+ height = rect.height()
+
+ ratio = self.sliderValue()
+
+ if ratio < 0:
+ width = 0
+ elif ratio > 100:
+ width = rect.width()
+ else:
+ width = rect.width() * (float(ratio) / 100)
+
+ rect.setWidth(width)
+ rect.setHeight(height)
+
+ painter.drawRect(rect)
+
+ # Draw slider value
+ rect = self.visualRect(option)
+ rect.setY(rect.y() + (4 * self.dpi()))
+
+ color = self.itemsWidget().textColor().toRgb()
+ color.setAlpha(220)
+ pen = QtGui.QPen(color)
+ align = QtCore.Qt.AlignTop | QtCore.Qt.AlignHCenter
+
+ painter.setPen(pen)
+ painter.drawText(rect, align, str(self.sliderValue()) + "%")
+
+ def iconRect(self, option):
+ """
+ Return the icon rect for the item.
+
+ :type option: QtWidgets.QStyleOptionViewItem
+ :rtype: QtCore.QRect
+ """
+ padding = self.padding()
+ rect = self.visualRect(option)
+ width = rect.width()
+ height = rect.height()
+
+ if self.isLabelUnderItem():
+ height -= self.textHeight()
+
+ width -= padding
+ height -= padding
+
+ rect.setWidth(width)
+ rect.setHeight(height)
+
+ x = 0
+ x += float(padding) / 2
+ x += float((width - rect.width())) / 2
+
+ y = float((height - rect.height())) / 2
+ y += float(padding) / 2
+
+ rect.translate(x, y)
+ return rect
+
+ def scalePixmap(self, pixmap, rect):
+ """
+ Scale the given pixmap to the give rect size.
+
+ This method will cache the scaled pixmap if called with the same size.
+
+ :type pixmap: QtGui.QPixmap
+ :type rect: QtCore.QRect
+ :rtype: QtGui.QPixmap
+ """
+ rectChanged = True
+
+ if self._pixmapRect:
+ widthChanged = self._pixmapRect.width() != rect.width()
+ heightChanged = self._pixmapRect.height() != rect.height()
+
+ rectChanged = widthChanged or heightChanged
+
+ if not self._pixmapScaled or rectChanged:
+
+ self._pixmapScaled = pixmap.scaled(
+ rect.width(),
+ rect.height(),
+ QtCore.Qt.KeepAspectRatio,
+ QtCore.Qt.SmoothTransformation,
+ )
+
+ self._pixmapRect = rect
+
+ return self._pixmapScaled
+
+ def paintIcon(self, painter, option, index, align=None):
+ """
+ Draw the icon for the item.
+
+ :type painter: QtWidgets.QPainter
+ :type option: QtWidgets.QStyleOptionViewItem
+ :rtype: None
+ """
+ column = index.column()
+ pixmap = self.pixmap(column)
+
+ if not pixmap:
+ return
+
+ rect = self.iconRect(option)
+ pixmap = self.scalePixmap(pixmap, rect)
+
+ pixmapRect = QtCore.QRect(rect)
+ pixmapRect.setWidth(pixmap.width())
+ pixmapRect.setHeight(pixmap.height())
+
+ align = QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter
+
+ x, y = 0, 0
+
+ isAlignBottom = align == QtCore.Qt.AlignBottom | QtCore.Qt.AlignLeft \
+ or align == QtCore.Qt.AlignBottom | QtCore.Qt.AlignHCenter \
+ or align == QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight
+
+ isAlignHCenter = align == QtCore.Qt.AlignHCenter \
+ or align == QtCore.Qt.AlignCenter \
+ or align == QtCore.Qt.AlignHCenter | QtCore.Qt.AlignBottom \
+ or align == QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop
+
+ isAlignVCenter = align == QtCore.Qt.AlignVCenter \
+ or align == QtCore.Qt.AlignCenter \
+ or align == QtCore.Qt.AlignVCenter | QtCore.Qt.AlignLeft \
+ or align == QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight
+
+ if isAlignHCenter:
+ x += float(rect.width() - pixmap.width()) / 2
+
+ if isAlignVCenter:
+ y += float(rect.height() - pixmap.height()) / 2
+
+ elif isAlignBottom:
+ y += float(rect.height() - pixmap.height())
+
+ pixmapRect.translate(x, y)
+ painter.drawPixmap(pixmapRect, pixmap)
+
+ def drawIconBorder(self, painter, pixmapRect):
+ """
+ Draw a border around the icon.
+
+ :type painter: QtWidgets.QPainter
+ :type pixmapRect: QtWidgets.QRect
+ :rtype: None
+ """
+ pixmapRect = QtCore.QRect(pixmapRect)
+ pixmapRect.setX(pixmapRect.x() - 5)
+ pixmapRect.setY(pixmapRect.y() - 5)
+ pixmapRect.setWidth(pixmapRect.width() + 5)
+ pixmapRect.setHeight(pixmapRect.height() + 5)
+
+ color = QtGui.QColor(255, 255, 255, 10)
+ painter.setPen(QtGui.QPen(QtCore.Qt.NoPen))
+ painter.setBrush(QtGui.QBrush(color))
+
+ painter.drawRect(pixmapRect)
+
+ def fontSize(self):
+ """
+ Return the font size for the item.
+
+ :rtype: int
+ """
+ return self.DEFAULT_FONT_SIZE
+
+ def font(self, column):
+ """
+ Return the font for the given column.
+
+ :type column: int
+ :rtype: QtWidgets.QFont
+ """
+ default = QtWidgets.QTreeWidgetItem.font(self, column)
+
+ font = self._fonts.get(column, default)
+
+ font.setPixelSize(self.fontSize() * self.dpi())
+ return font
+
+ def setFont(self, column, font):
+ """
+ Set the font for the given column.
+
+ :type column: int
+ :type font: QtWidgets.QFont
+ :rtype: Noen
+ """
+ self._fonts[column] = font
+
+ def paintText(self, painter, option, index):
+ """
+ Draw the text for the item.
+
+ :type painter: QtWidgets.QPainter
+ :type option: QtWidgets.QStyleOptionViewItem
+ :rtype: None
+ """
+ column = index.column()
+
+ if column == 0 and self.itemsWidget().isTableView():
+ return
+
+ self._paintText(painter, option, column)
+
+ def textWidth(self, column):
+ text = self.text(column)
+
+ font = self.font(column)
+ metrics = QtGui.QFontMetricsF(font)
+ textWidth = metrics.width(text)
+ return textWidth
+
+ def _paintText(self, painter, option, column):
+
+ if self.itemsWidget().isIconView():
+ text = self.name()
+ else:
+ label = self.labelFromColumn(column)
+ text = self.displayText(label)
+
+ isSelected = option.state & QtWidgets.QStyle.State_Selected
+
+ if isSelected:
+ color = self.textSelectedColor()
+ else:
+ color = self.textColor()
+
+ visualRect = self.visualRect(option)
+
+ width = visualRect.width()
+ height = visualRect.height()
+
+ padding = self.padding()
+ x = padding / 2
+ y = padding / 2
+
+ visualRect.translate(x, y)
+ visualRect.setWidth(width - padding)
+ visualRect.setHeight(height - padding)
+
+ font = self.font(column)
+ align = self.textAlignment(column)
+ metrics = QtGui.QFontMetricsF(font)
+
+ if text:
+ textWidth = metrics.boundingRect(text).width()
+ else:
+ textWidth = 1
+
+ # # Check if the current text fits within the rect.
+ if textWidth > visualRect.width() - padding:
+ visualWidth = visualRect.width()
+ text = metrics.elidedText(text, QtCore.Qt.ElideRight, visualWidth)
+ align = QtCore.Qt.AlignLeft
+
+ align = align | QtCore.Qt.AlignVCenter
+
+ rect = QtCore.QRect(visualRect)
+
+ if self.itemsWidget().isIconView():
+
+ if self.isLabelOverItem() or self.isLabelUnderItem():
+ padding = 8 if padding < 8 else padding
+
+ height = metrics.height() + (padding / 2)
+ y = (rect.y() + rect.height()) - height
+
+ rect.setY(y)
+ rect.setHeight(height)
+
+ if self.isLabelOverItem():
+ color2 = self.itemsWidget().backgroundColor().toRgb()
+ color2.setAlpha(200)
+
+ painter.setPen(QtCore.Qt.NoPen)
+ painter.setBrush(QtGui.QBrush(color2))
+ painter.drawRect(rect)
+
+ pen = QtGui.QPen(color)
+ painter.setPen(pen)
+ painter.setFont(font)
+ painter.drawText(rect, align, text)
+
+ # ------------------------------------------------------------------------
+ # Support for middle mouse slider
+ # ------------------------------------------------------------------------
+
+ def setSliderEnabled(self, enabled):
+ """
+ Set if middle mouse slider is enabled.
+
+ :type enabled: bool
+ """
+ self._sliderEnabled = enabled
+
+ def isSliderEnabled(self):
+ """
+ Return true if middle mouse slider is enabled.
+
+ :rtype: bool
+ """
+ return self._sliderEnabled
+
+ def sliderEvent(self, event):
+ """
+ Called when the mouse moves while the middle mouse button is held down.
+
+ :param event: QtGui.QMouseEvent
+ """
+ if self.isSliderDown() and self.sliderPosition():
+ value = (event.pos().x() - self.sliderPosition().x()) / 1.5
+ value = math.ceil(value) + self.sliderPreviousValue()
+ if value != self.sliderValue():
+ try:
+ self.setSliderValue(value)
+ except Exception:
+ self.setSliderDown(False)
+
+ def resetSlider(self):
+ """Reset the slider value to zero."""
+ self._sliderValue = 0.0
+ self._sliderPreviousValue = 0.0
+
+ def setSliderDown(self, down):
+ """Called when the middle mouse button is released."""
+ self._sliderDown = down
+ if not down:
+ self._sliderPosition = None
+ self._sliderPreviousValue = self.sliderValue()
+
+ def isSliderDown(self):
+ """
+ Return True if blending.
+
+ :rtype: bool
+ """
+ return self._sliderDown
+
+ def setSliderValue(self, value):
+ """
+ Set the blend value.
+
+ :type value: float
+ :rtype: bool
+ """
+ if self.isSliderEnabled():
+
+ if self._sliderValue == None:
+ return
+
+ if value == self.sliderValue():
+ return
+
+ self._sliderValue = value
+
+ if self.PAINT_SLIDER:
+ self.update()
+
+ self.sliderChanged.emit(value)
+
+ if self.treeWidget():
+ self.treeWidget()._itemSliderMoved(self, value)
+
+ if self.PAINT_SLIDER:
+ self.update()
+
+ logger.debug("Blending:" + str(value))
+
+ def sliderValue(self):
+ """
+ Return the blend value.
+
+ :rtype: float
+ """
+ return self._sliderValue
+
+ def sliderPreviousValue(self):
+ """
+ :rtype: float
+ """
+ return self._sliderPreviousValue
+
+ def sliderPosition(self):
+ """
+ :rtype: QtGui.QPoint
+ """
+ return self._sliderPosition
+
+ # ------------------------------------------------------------------------
+ # Support animated image sequence
+ # ------------------------------------------------------------------------
+
+ def imageSequenceEvent(self, event):
+ """
+ :type event: QtCore.QEvent
+ :rtype: None
+ """
+ if self.imageSequence():
+ if studioqt.isControlModifier():
+ if self.rect():
+ x = event.pos().x() - self.rect().x()
+ width = self.rect().width()
+ percent = 1.0 - (float(width - x) / float(width))
+ frame = int(self.imageSequence().frameCount() * percent)
+ self.imageSequence().jumpToFrame(frame)
+ self.updateFrame()
+
+ def resetImageSequence(self):
+ self._imageSequence = None
+
+ def imageSequence(self):
+ """
+ :rtype: studioqt.ImageSequence
+ """
+ return self._imageSequence
+
+ def setImageSequence(self, value):
+ """
+ :type value: studioqt.ImageSequence
+ """
+ self._imageSequence = value
+
+ def setImageSequencePath(self, path):
+ """
+ :type path: str
+ """
+ self._imageSequencePath = path
+
+ def imageSequencePath(self):
+ """
+ :rtype: str
+ """
+ return self._imageSequencePath
+
+ def stop(self):
+ """Stop playing the image sequence movie."""
+ if self.imageSequence():
+ self.imageSequence().stop()
+
+ def play(self):
+ """Start playing the image sequence movie."""
+ self.resetImageSequence()
+ path = self.imageSequencePath() or self.thumbnailPath()
+
+ movie = None
+
+ if os.path.isfile(path) and path.lower().endswith(".gif"):
+
+ movie = QtGui.QMovie(path)
+ movie.setCacheMode(QtGui.QMovie.CacheAll)
+ movie.frameChanged.connect(self._frameChanged)
+
+ elif os.path.isdir(path):
+
+ if not self.imageSequence():
+ movie = studioqt.ImageSequence(path)
+ movie.frameChanged.connect(self._frameChanged)
+
+ if movie:
+ self.setImageSequence(movie)
+ self.imageSequence().start()
+
+ def _frameChanged(self, frame=None):
+ """Triggered when the movie object updates to the given frame."""
+ if not studioqt.isControlModifier():
+ self.updateFrame()
+
+ def updateFrame(self):
+ """Triggered when the movie object updates the current frame."""
+ if self.imageSequence():
+ pixmap = self.imageSequence().currentPixmap()
+ self.setIcon(0, pixmap)
+
+ def playheadColor(self):
+ """
+ Return the playhead color.
+
+ :rtype: QtGui.Color
+ """
+ return self.DEFAULT_PLAYHEAD_COLOR
+
+ def paintPlayhead(self, painter, option):
+ """
+ Paint the playhead if the item has an image sequence.
+
+ :type painter: QtWidgets.QPainter
+ :type option: QtWidgets.QStyleOptionViewItem
+ :rtype: None
+ """
+ imageSequence = self.imageSequence()
+
+ if imageSequence and self.underMouse():
+
+ count = imageSequence.frameCount()
+ current = imageSequence.currentFrameNumber()
+
+ if count > 0:
+ percent = float((count + current) + 1) / count - 1
+ else:
+ percent = 0
+
+ r = self.iconRect(option)
+ c = self.playheadColor()
+
+ painter.setPen(QtCore.Qt.NoPen)
+ painter.setBrush(QtGui.QBrush(c))
+
+ if percent <= 0:
+ width = 0
+ elif percent >= 1:
+ width = r.width()
+ else:
+ width = (percent * r.width()) - 1
+
+ height = 3 * self.dpi()
+ y = r.y() + r.height() - (height - 1)
+
+ painter.drawRect(r.x(), y, width, height)
+
+ def typeIconPath(self):
+ """
+ Return the type icon path on disc.
+
+ :rtype: path or None
+ """
+ if self.TYPE_ICON_PATH is None:
+ return self.ICON_PATH
+
+ return self.TYPE_ICON_PATH
+
+ def typePixmap(self):
+ """
+ Return the type pixmap for the plugin.
+
+ :rtype: QtWidgets.QPixmap
+ """
+ path = self.typeIconPath()
+ pixmap = self._TYPE_PIXMAP_CACHE.get(path)
+
+ if not pixmap and path and os.path.exists(path):
+ self._TYPE_PIXMAP_CACHE[path] = QtGui.QPixmap(path)
+
+ return self._TYPE_PIXMAP_CACHE.get(path)
+
+ def typeIconRect(self, option):
+ """
+ Return the type icon rect.
+
+ :rtype: QtGui.QRect
+ """
+ padding = 2 * self.dpi()
+ r = self.iconRect(option)
+
+ x = r.x() + padding
+ y = r.y() + padding
+ rect = QtCore.QRect(x, y, 13 * self.dpi(), 13 * self.dpi())
+
+ return rect
+
+ def paintTypeIcon(self, painter, option):
+ """
+ Draw the item type icon at the top left.
+
+ :type painter: QtWidgets.QPainter
+ :type option: QtWidgets.QStyleOptionViewItem
+ :rtype: None
+ """
+ rect = self.typeIconRect(option)
+ typePixmap = self.typePixmap()
+ if typePixmap:
+ painter.setOpacity(0.5)
+ painter.drawPixmap(rect, typePixmap)
+ painter.setOpacity(1)
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/itemdelegate.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/itemdelegate.py
new file mode 100644
index 0000000..da1a9af
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/itemdelegate.py
@@ -0,0 +1,71 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from studiovendor.Qt import QtWidgets
+
+from .groupitem import GroupItem
+
+
+class ItemDelegate(QtWidgets.QStyledItemDelegate):
+
+ def __init__(self):
+ """
+ This class is used to display data for the items in a ItemsWidget.
+ """
+ QtWidgets.QStyledItemDelegate.__init__(self)
+
+ self._itemsWidget = None
+
+ def itemsWidget(self):
+ """
+ Return the ItemsWidget that contains the item delegate.
+
+ :rtype: studioqt.ItemsWidget
+ """
+ return self._itemsWidget
+
+ def setItemsWidget(self, itemsWidget):
+ """
+ Set the ItemsWidget for the delegate.
+
+ :type itemsWidget: studioqt.ItemsWidget
+ :rtype: None
+ """
+ self._itemsWidget = itemsWidget
+
+ def sizeHint(self, option, index):
+ """
+ Return the size for the given index.
+
+ :type option: QtWidgets.QStyleOptionViewItem
+ :type index: QtCore.QModelIndex
+ :rtype: QtCore.QSize
+ """
+ #This will be called for each row.
+ item = self.itemsWidget().itemFromIndex(index)
+
+ if isinstance(item, GroupItem):
+ return item.sizeHint()
+
+ return self.itemsWidget().itemSizeHint(index)
+
+ def paint(self, painter, option, index):
+ """
+ Paint performs low-level painting for the given model index.
+
+ :type painter: QtWidgets.QPainter
+ :type option: QtWidgets.QStyleOptionViewItem
+ :type index: QtCore.QModelIndex
+ :rtype: None
+ """
+ item = self.itemsWidget().itemFromIndex(index)
+ item.paint(painter, option, index)
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/itemswidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/itemswidget.py
new file mode 100644
index 0000000..6b3edb5
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/itemswidget.py
@@ -0,0 +1,1160 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import logging
+import functools
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+from .item import Item
+from .item import LabelDisplayOption
+from .listview import ListView
+from .groupitem import GroupItem
+from .treewidget import TreeWidget
+from .itemdelegate import ItemDelegate
+from ..toastwidget import ToastWidget
+from ..slideraction import SliderAction
+from ..separatoraction import SeparatorAction
+
+logger = logging.getLogger(__name__)
+
+
+class ItemsWidget(QtWidgets.QWidget):
+
+ IconMode = "icon"
+ TableMode = "table"
+
+ DEFAULT_PADDING = 5
+
+ DEFAULT_ZOOM_AMOUNT = 90
+ DEFAULT_TEXT_HEIGHT = 20
+ DEFAULT_WHEEL_SCROLL_STEP = 2
+
+ DEFAULT_MIN_SPACING = 0
+ DEFAULT_MAX_SPACING = 50
+
+ DEFAULT_MIN_LIST_SIZE = 25
+ DEFAULT_MIN_ICON_SIZE = 50
+
+ LABEL_DISPLAY_OPTION = LabelDisplayOption.Under
+
+ keyPressed = QtCore.Signal(object)
+
+ itemClicked = QtCore.Signal(object)
+ itemDoubleClicked = QtCore.Signal(object)
+
+ zoomChanged = QtCore.Signal(object)
+ spacingChanged = QtCore.Signal(object)
+
+ groupClicked = QtCore.Signal(object)
+
+ itemSliderMoved = QtCore.Signal(object)
+ itemSliderReleased = QtCore.Signal()
+
+ def __init__(self, *args):
+ QtWidgets.QWidget.__init__(self, *args)
+
+ self._dpi = 1
+ self._padding = self.DEFAULT_PADDING
+
+ w, h = self.DEFAULT_ZOOM_AMOUNT, self.DEFAULT_ZOOM_AMOUNT
+
+ self._iconSize = QtCore.QSize(w, h)
+ self._itemSizeHint = QtCore.QSize(w, h)
+
+ self._zoomAmount = self.DEFAULT_ZOOM_AMOUNT
+ self._labelDisplayOption = self.LABEL_DISPLAY_OPTION
+
+ self._dataset = None
+ self._treeWidget = TreeWidget(self)
+
+ self._listView = ListView(self)
+ self._listView.setTreeWidget(self._treeWidget)
+ self._listView.installEventFilter(self)
+
+ self._delegate = ItemDelegate()
+ self._delegate.setItemsWidget(self)
+
+ self._listView.setItemDelegate(self._delegate)
+ self._treeWidget.setItemDelegate(self._delegate)
+ self._treeWidget.installEventFilter(self)
+
+ self._toastWidget = ToastWidget(self)
+ self._toastWidget.hide()
+ self._toastEnabled = True
+
+ self._textColor = QtGui.QColor(255, 255, 255, 200)
+ self._textSelectedColor = QtGui.QColor(255, 255, 255, 200)
+ self._itemBackgroundColor = QtGui.QColor(255, 255, 255, 30)
+ self._backgroundHoverColor = QtGui.QColor(255, 255, 255, 35)
+ self._backgroundSelectedColor = QtGui.QColor(30, 150, 255)
+
+ layout = QtWidgets.QHBoxLayout()
+ layout.setContentsMargins(0, 0, 0, 0)
+ layout.addWidget(self._treeWidget)
+ layout.addWidget(self._listView)
+
+ header = self.treeWidget().header()
+ header.sortIndicatorChanged.connect(self._sortIndicatorChanged)
+
+ self.setLayout(layout)
+
+ self.listView().itemClicked.connect(self._itemClicked)
+ self.listView().itemDoubleClicked.connect(self._itemDoubleClicked)
+
+ self.treeWidget().itemClicked.connect(self._itemClicked)
+ self.treeWidget().itemDoubleClicked.connect(self._itemDoubleClicked)
+ self.treeWidget().itemSliderMoved.connect(self._itemSliderMoved)
+ self.treeWidget().itemSliderReleased.connect(self._itemSliderReleased)
+
+ self.itemMoved = self._listView.itemMoved
+ self.itemDropped = self._listView.itemDropped
+ self.itemSelectionChanged = self._treeWidget.itemSelectionChanged
+
+ def _itemSliderMoved(self, item, value):
+ self.itemSliderMoved.emit(value)
+
+ def _itemSliderReleased(self, item, value):
+ self.itemSliderReleased.emit()
+
+ def eventFilter(self, obj, event):
+ if event.type() == QtCore.QEvent.KeyPress:
+ self.keyPressed.emit(event)
+
+ return super(ItemsWidget, self).eventFilter(obj, event)
+
+ def _sortIndicatorChanged(self):
+ """
+ Triggered when the sort indicator changes.
+
+ :rtype: None
+ """
+ pass
+
+ def _itemClicked(self, item):
+ """
+ Triggered when the given item has been clicked.
+
+ :type item: studioqt.ItemsWidget
+ :rtype: None
+ """
+ if isinstance(item, GroupItem):
+ self.groupClicked.emit(item)
+ else:
+ self.itemClicked.emit(item)
+
+ def _itemDoubleClicked(self, item):
+ """
+ Triggered when the given item has been double clicked.
+
+ :type item: studioqt.Item
+ :rtype: None
+ """
+ self.itemDoubleClicked.emit(item)
+
+ def setDataset(self, dataset):
+ self._dataset = dataset
+ self.setColumnLabels(dataset.fieldNames())
+ dataset.searchFinished.connect(self.updateItems)
+
+ def dataset(self):
+ return self._dataset
+
+ def updateItems(self):
+ """Sets the items to the widget."""
+ selectedItems = self.selectedItems()
+
+ self.treeWidget().blockSignals(True)
+
+ try:
+ self.clearSelection()
+
+ results = self.dataset().groupedResults()
+
+ items = []
+
+ for group in results:
+ if group != "None":
+ groupItem = self.createGroupItem(group)
+ items.append(groupItem)
+ items.extend(results[group])
+
+ self.treeWidget().setItems(items)
+
+ if selectedItems:
+ self.selectItems(selectedItems)
+ self.scrollToSelectedItem()
+
+ finally:
+ self.treeWidget().blockSignals(False)
+ self.itemSelectionChanged.emit()
+
+ def createGroupItem(self, text, children=None):
+ """
+ Create a new group item for the given text and children.
+
+ :type text: str
+ :type children: list[studioqt.Item]
+
+ :rtype: GroupItem
+ """
+ groupItem = GroupItem()
+ groupItem.setName(text)
+ groupItem.setStretchToWidget(self)
+ groupItem.setChildren(children)
+
+ return groupItem
+
+ def setToastEnabled(self, enabled):
+ """
+ :type enabled: bool
+ :rtype: None
+ """
+ self._toastEnabled = enabled
+
+ def toastEnabled(self):
+ """
+ :rtype: bool
+ """
+ return self._toastEnabled
+
+ def showToastMessage(self, text, duration=500):
+ """
+ Show a toast with the given text for the given duration.
+
+ :type text: str
+ :type duration: None or int
+ :rtype: None
+ """
+ if self.toastEnabled():
+ self._toastWidget.setDuration(duration)
+ self._toastWidget.setText(text)
+ self._toastWidget.show()
+
+ def columnFromLabel(self, *args):
+ """
+ Reimplemented for convenience.
+
+ :return: int
+ """
+ return self.treeWidget().columnFromLabel(*args)
+
+ def setColumnHidden(self, column, hidden):
+ """
+ Reimplemented for convenience.
+
+ Calls self.treeWidget().setColumnHidden(column, hidden)
+ """
+ self.treeWidget().setColumnHidden(column, hidden)
+
+ def setLocked(self, value):
+ """
+ Disables drag and drop.
+
+ :Type value: bool
+ :rtype: None
+ """
+ self.listView().setDragEnabled(not value)
+ self.listView().setDropEnabled(not value)
+
+ def verticalScrollBar(self):
+ """
+ Return the active vertical scroll bar.
+
+ :rtype: QtWidget.QScrollBar
+ """
+ if self.isTableView():
+ return self.treeWidget().verticalScrollBar()
+ else:
+ return self.listView().verticalScrollBar()
+
+ def visualItemRect(self, item):
+ """
+ Return the visual rect for the item.
+
+ :type item: QtWidgets.QTreeWidgetItem
+ :rtype: QtCore.QRect
+ """
+ if self.isTableView():
+ visualRect = self.treeWidget().visualItemRect(item)
+ else:
+ index = self.treeWidget().indexFromItem(item)
+ visualRect = self.listView().visualRect(index)
+
+ return visualRect
+
+ def isItemVisible(self, item):
+ """
+ Return the visual rect for the item.
+
+ :type item: QtWidgets.QTreeWidgetItem
+ :rtype: bool
+ """
+ height = self.height()
+ itemRect = self.visualItemRect(item)
+ scrollBarY = self.verticalScrollBar().value()
+
+ y = (scrollBarY - itemRect.y()) + height
+ return y > scrollBarY and y < scrollBarY + height
+
+ def scrollToItem(self, item):
+ """
+ Ensures that the item is visible.
+
+ :type item: QtWidgets.QTreeWidgetItem
+ :rtype: None
+ """
+ position = QtWidgets.QAbstractItemView.PositionAtCenter
+
+ if self.isTableView():
+ self.treeWidget().scrollToItem(item, position)
+ elif self.isIconView():
+ self.listView().scrollToItem(item, position)
+
+ def scrollToSelectedItem(self):
+ """
+ Ensures that the item is visible.
+
+ :rtype: None
+ """
+ item = self.selectedItem()
+ if item:
+ self.scrollToItem(item)
+
+ def dpi(self):
+ """
+ return the zoom multiplier.
+
+ Used for high resolution devices.
+
+ :rtype: int
+ """
+ return self._dpi
+
+ def setDpi(self, dpi):
+ """
+ Set the zoom multiplier.
+
+ Used for high resolution devices.
+
+ :type dpi: int
+ """
+ self._dpi = dpi
+ self.refreshSize()
+
+ def itemAt(self, pos):
+ """
+ Return the current item at the given pos.
+
+ :type pos: QtWidgets.QPoint
+ :rtype: studioqt.Item
+ """
+ if self.isIconView():
+ return self.listView().itemAt(pos)
+ else:
+ return self.treeView().itemAt(pos)
+
+ def insertItems(self, items, itemAt=None):
+ """
+ Insert the given items at the given itemAt position.
+
+ :type items: list[studioqt.Item]
+ :type itemAt: studioqt.Item
+ :rtype: Nones
+ """
+ self.addItems(items)
+ self.moveItems(items, itemAt=itemAt)
+ self.treeWidget().setItemsSelected(items, True)
+
+ def moveItems(self, items, itemAt=None):
+ """
+ Move the given items to the given itemAt position.
+
+ :type items: list[studioqt.Item]
+ :type itemAt: studioqt.Item
+ :rtype: None
+ """
+ self.listView().moveItems(items, itemAt=itemAt)
+
+ def listView(self):
+ """
+ Return the list view that contains the items.
+
+ :rtype: ListView
+ """
+ return self._listView
+
+ def treeWidget(self):
+ """
+ Return the tree widget that contains the items.
+
+ :rtype: TreeWidget
+ """
+ return self._treeWidget
+
+ def clear(self):
+ """
+ Reimplemented for convenience.
+
+ Calls self.treeWidget().clear()
+ """
+ self.treeWidget().clear()
+
+ def refresh(self):
+ """Refresh the item size."""
+ self.refreshSize()
+
+ def refreshSize(self):
+ """
+ Refresh the size of the items.
+
+ :rtype: None
+ """
+ self.setZoomAmount(self.zoomAmount() + 1)
+ self.setZoomAmount(self.zoomAmount() - 1)
+ self.repaint()
+
+ def itemFromIndex(self, index):
+ """
+ Return a pointer to the QTreeWidgetItem assocated with the given index.
+
+ :type index: QtCore.QModelIndex
+ :rtype: QtWidgets.QTreeWidgetItem
+ """
+ return self._treeWidget.itemFromIndex(index)
+
+ def textFromItems(self, *args, **kwargs):
+ """
+ Return all data for the given items and given column.
+
+ :rtype: list[str]
+ """
+ return self.treeWidget().textFromItems(*args, **kwargs)
+
+ def textFromColumn(self, *args, **kwargs):
+ """
+ Return all data for the given column.
+
+ :rtype: list[str]
+ """
+ return self.treeWidget().textFromColumn(*args, **kwargs)
+
+ def setLabelDisplayOption(self, value):
+ """
+ Set the label display option.
+
+ :type value: LabelDisplayOption
+ """
+ self._labelDisplayOption = value
+ self.refreshSize()
+
+ def labelDisplayOption(self):
+ """
+ Return the visibility of the item text.
+
+ :rtype: LabelDisplayOption
+ """
+ if self.isIconView():
+ return self._labelDisplayOption
+
+ def itemTextHeight(self):
+ """
+ Return the height of the item text.
+
+ :rtype: int
+ """
+ return self.DEFAULT_TEXT_HEIGHT * self.dpi()
+
+ def itemDelegate(self):
+ """
+ Return the item delegate for the views.
+
+ :rtype: ItemDelegate
+ """
+ return self._delegate
+
+ def settings(self):
+ """
+ Return the current state of the widget.
+
+ :rtype: dict
+ """
+ settings = {}
+
+ settings["columnLabels"] = self.columnLabels()
+ settings["padding"] = self.padding()
+ settings["spacing"] = self.spacing()
+ settings["zoomAmount"] = self.zoomAmount()
+ settings["selectedPaths"] = self.selectedPaths()
+ settings["labelDisplayOption"] = self._labelDisplayOption
+ settings.update(self.treeWidget().settings())
+
+ return settings
+
+ def setSettings(self, settings):
+ """
+ Set the current state of the widget.
+
+ :type settings: dict
+ :rtype: None
+ """
+ self.setToastEnabled(False)
+
+ padding = settings.get("padding", 5)
+ self.setPadding(padding)
+
+ spacing = settings.get("spacing", 2)
+ self.setSpacing(spacing)
+
+ zoomAmount = settings.get("zoomAmount", 100)
+ self.setZoomAmount(zoomAmount)
+
+ selectedPaths = settings.get("selectedPaths", [])
+ self.selectPaths(selectedPaths)
+
+ value = settings.get("labelDisplayOption", self.LABEL_DISPLAY_OPTION)
+ self.setLabelDisplayOption(value)
+
+ self.treeWidget().setSettings(settings)
+
+ self.setToastEnabled(True)
+
+ return settings
+
+ def createCopyTextMenu(self):
+ return self.treeWidget().createCopyTextMenu()
+
+ def createSettingsMenu(self):
+
+ menu = QtWidgets.QMenu("Item View", self)
+
+ action = SeparatorAction("View Settings", menu)
+ menu.addAction(action)
+
+ action = SliderAction("Size", menu)
+ action.slider().setMinimum(10)
+ action.slider().setMaximum(200)
+ action.slider().setValue(self.zoomAmount())
+ action.slider().valueChanged.connect(self.setZoomAmount)
+ menu.addAction(action)
+
+ action = SliderAction("Border", menu)
+ action.slider().setMinimum(0)
+ action.slider().setMaximum(20)
+ action.slider().setValue(self.padding())
+ action.slider().valueChanged.connect(self.setPadding)
+ menu.addAction(action)
+ #
+ action = SliderAction("Spacing", menu)
+ action.slider().setMinimum(self.DEFAULT_MIN_SPACING)
+ action.slider().setMaximum(self.DEFAULT_MAX_SPACING)
+ action.slider().setValue(self.spacing())
+ action.slider().valueChanged.connect(self.setSpacing)
+ menu.addAction(action)
+
+ action = SeparatorAction("Label Options", menu)
+ menu.addAction(action)
+
+ for option in LabelDisplayOption.values():
+ action = QtWidgets.QAction(option.title(), menu)
+ action.setCheckable(True)
+ action.setChecked(option == self.labelDisplayOption())
+ callback = functools.partial(self.setLabelDisplayOption, option)
+ action.triggered.connect(callback)
+ menu.addAction(action)
+
+ return menu
+
+ def createItemsMenu(self, items=None):
+ """
+ Create the item menu for given item.
+
+ :rtype: QtWidgets.QMenu
+ """
+ item = items or self.selectedItem()
+
+ menu = QtWidgets.QMenu(self)
+
+ if item:
+ try:
+ item.contextMenu(menu)
+ except Exception as error:
+ logger.exception(error)
+ else:
+ action = QtWidgets.QAction(menu)
+ action.setText("No Item selected")
+ action.setDisabled(True)
+
+ menu.addAction(action)
+
+ return menu
+
+ def createContextMenu(self):
+ """
+ Create and return the context menu for the widget.
+
+ :rtype: QtWidgets.QMenu
+ """
+ menu = self.createItemsMenu()
+
+ settingsMenu = self.createSettingsMenu()
+ menu.addMenu(settingsMenu)
+
+ return menu
+
+ def contextMenuEvent(self, event):
+ """
+ Show the context menu.
+
+ :type event: QtCore.QEvent
+ :rtype: None
+ """
+ menu = self.createContextMenu()
+ point = QtGui.QCursor.pos()
+ return menu.exec_(point)
+
+ # ------------------------------------------------------------------------
+ # Support for saving the current item order.
+ # ------------------------------------------------------------------------
+
+ def itemData(self, columnLabels):
+ """
+ Return all column data for the given column labels.
+
+ :type columnLabels: list[str]
+ :rtype: dict
+
+ """
+ data = {}
+
+ for item in self.items():
+ key = item.id()
+
+ for columnLabel in columnLabels:
+ column = self.treeWidget().columnFromLabel(columnLabel)
+ value = item.data(column, QtCore.Qt.EditRole)
+
+ data.setdefault(key, {})
+ data[key].setdefault(columnLabel, value)
+
+ return data
+
+ def setItemData(self, data):
+ """
+ Set the item data for all the current items.
+
+ :type data: dict
+ :rtype: None
+ """
+ for item in self.items():
+ key = item.id()
+ if key in data:
+ item.setItemData(data[key])
+
+ def updateColumns(self):
+ """
+ Update the column labels with the current item data.
+
+ :rtype: None
+ """
+ self.treeWidget().updateHeaderLabels()
+
+ def columnLabels(self):
+ """
+ Set all the column labels.
+
+ :rtype: list[str]
+ """
+ return self.treeWidget().columnLabels()
+
+ def _removeDuplicates(self, labels):
+ """
+ Removes duplicates from a list in Python, whilst preserving order.
+
+ :type labels: list[str]
+ :rtype: list[str]
+ """
+ s = set()
+ sadd = s.add
+ return [x for x in labels if x.strip() and not (x in s or sadd(x))]
+
+ def setColumnLabels(self, labels):
+ """
+ Set the columns for the widget.
+
+ :type labels: list[str]
+ :rtype: None
+ """
+ labels = self._removeDuplicates(labels)
+
+ if "Custom Order" not in labels:
+ labels.append("Custom Order")
+
+ # if "Search Order" not in labels:
+ # labels.append("Search Order")
+
+ self.treeWidget().setHeaderLabels(labels)
+
+ self.setColumnHidden("Custom Order", True)
+ # self.setColumnHidden("Search Order", True)
+
+ def items(self):
+ """
+ Return all the items in the widget.
+
+ :rtype: list[studioqt.Item]
+ """
+ return self._treeWidget.items()
+
+ def addItems(self, items):
+ """
+ Add the given items to the items widget.
+
+ :type items: list[studioqt.Item]
+ :rtype: None
+ """
+ self._treeWidget.addTopLevelItems(items)
+
+ def addItem(self, item):
+ """
+ Add the item to the tree widget.
+
+ :type item: Item
+ :rtype: None
+ """
+ self.addItems([item])
+
+ def columnLabelsFromItems(self):
+ """
+ Return the column labels from all the items.
+
+ :rtype: list[str]
+ """
+ seq = []
+ for item in self.items():
+ seq.extend(item._textColumnOrder)
+
+ seen = set()
+ return [x for x in seq if x not in seen and not seen.add(x)]
+
+ def refreshColumns(self):
+ self.setColumnLabels(self.columnLabelsFromItems())
+
+ def padding(self):
+ """
+ Return the item padding.
+
+ :rtype: int
+ """
+ return self._padding
+
+ def setPadding(self, value):
+ """
+ Set the item padding.
+
+ :type: int
+ :rtype: None
+ """
+ if value % 2 == 0:
+ self._padding = value
+ else:
+ self._padding = value + 1
+ self.repaint()
+
+ self.showToastMessage("Border: " + str(value))
+
+ def spacing(self):
+ """
+ Return the spacing between the items.
+
+ :rtype: int
+ """
+ return self._listView.spacing()
+
+ def setSpacing(self, spacing):
+ """
+ Set the spacing between the items.
+
+ :type spacing: int
+ :rtype: None
+ """
+ self._listView.setSpacing(spacing)
+ self.scrollToSelectedItem()
+
+ self.showToastMessage("Spacing: " + str(spacing))
+
+ def itemSizeHint(self, index=None):
+ """
+ Get the item size hint.
+
+ :type index: QtWidgets.QModelIndex
+ :rtype: QtCore.QSize
+ """
+ return self._itemSizeHint
+
+ def iconSize(self):
+ """
+ Return the icon size for the views.
+
+ :rtype: QtCore.QSize
+ """
+ return self._iconSize
+
+ def setIconSize(self, size):
+ """
+ Set the icon size for the views.
+
+ :type size: QtCore.QSize
+ :rtype: None
+ """
+ self._iconSize = size
+
+ if self.labelDisplayOption() == LabelDisplayOption.Under:
+ w = size.width()
+ h = size.width() + self.itemTextHeight()
+ self._itemSizeHint = QtCore.QSize(w, h)
+ elif size.height() < self.itemTextHeight():
+ self._itemSizeHint = QtCore.QSize(size.width(), self.itemTextHeight())
+ else:
+ self._itemSizeHint = size
+
+ self._listView.setIconSize(size)
+ self._treeWidget.setIconSize(size)
+
+ def clearSelection(self):
+ """
+ Clear the user selection.
+
+ :rtype: None
+ """
+ self._treeWidget.clearSelection()
+
+ def wheelScrollStep(self):
+ """
+ Return the wheel scroll step amount.
+
+ :rtype: int
+ """
+ return self.DEFAULT_WHEEL_SCROLL_STEP
+
+ def model(self):
+ """
+ Return the model that this view is presenting.
+
+ :rtype: QAbstractItemModel
+ """
+ return self._treeWidget.model()
+
+ def indexFromItem(self, item):
+ """
+ Return the QModelIndex assocated with the given item.
+
+ :type item: QtWidgets.QTreeWidgetItem.
+ :rtype: QtCore.QModelIndex
+ """
+ return self._treeWidget.indexFromItem(item)
+
+ def selectionModel(self):
+ """
+ Return the current selection model.
+
+ :rtype: QtWidgets.QItemSelectionModel
+ """
+ return self._treeWidget.selectionModel()
+
+ def selectedItem(self):
+ """
+ Return the last selected non-hidden item.
+
+ :rtype: QtWidgets.QTreeWidgetItem
+ """
+ return self._treeWidget.selectedItem()
+
+ def selectedItems(self):
+ """
+ Return a list of all selected non-hidden items.
+
+ :rtype: list[QtWidgets.QTreeWidgetItem]
+ """
+ return self._treeWidget.selectedItems()
+
+ def setItemHidden(self, item, value):
+ """
+ Set the visibility of given item.
+
+ :type item: QtWidgets.QTreeWidgetItem
+ :type value: bool
+ :rtype: None
+ """
+ item.setHidden(value)
+
+ def setItemsHidden(self, items, value):
+ """
+ Set the visibility of given items.
+
+ :type items: list[QtWidgets.QTreeWidgetItem]
+ :type value: bool
+ :rtype: None
+ """
+ for item in items:
+ self.setItemHidden(item, value)
+
+ def selectedPaths(self):
+ """
+ Return the selected item paths.
+
+ :rtype: list[str]
+ """
+ paths = []
+ for item in self.selectedItems():
+ path = item.url().toLocalFile()
+ paths.append(path)
+ return paths
+
+ def selectPaths(self, paths):
+ """
+ Selected the items that have the given paths.
+
+ :type paths: list[str]
+ :rtype: None
+ """
+ for item in self.items():
+ path = item.id()
+ if path in paths:
+ item.setSelected(True)
+
+ def selectItems(self, items):
+ """
+ Select the given items.
+
+ :type items: list[studiolibrary.LibraryItem]
+ :rtype: None
+ """
+ paths = [item.id() for item in items]
+ self.selectPaths(paths)
+
+ def isIconView(self):
+ """
+ Return True if widget is in Icon mode.
+
+ :rtype: bool
+ """
+ return not self._listView.isHidden()
+
+ def isTableView(self):
+ """
+ Return True if widget is in List mode.
+
+ :rtype: bool
+ """
+ return not self._treeWidget.isHidden()
+
+ def setViewMode(self, mode):
+ """
+ Set the view mode for this widget.
+
+ :type mode: str
+ :rtype: None
+ """
+ if mode == self.IconMode:
+ self.setZoomAmount(self.DEFAULT_MIN_ICON_SIZE)
+ elif mode == self.TableMode:
+ self.setZoomAmount(self.DEFAULT_MIN_ICON_SIZE)
+
+ def _setViewMode(self, mode):
+ """
+ Set the view mode for this widget.
+
+ :type mode: str
+ :rtype: None
+ """
+ if mode == self.IconMode:
+ self.setIconMode()
+ elif mode == self.TableMode:
+ self.setListMode()
+
+ def setListMode(self):
+ """
+ Set the tree widget visible.
+
+ :rtype: None
+ """
+ self._listView.hide()
+ self._treeWidget.show()
+ self._treeWidget.setFocus()
+
+ def setIconMode(self):
+ """
+ Set the list view visible.
+
+ :rtype: None
+ """
+ self._treeWidget.hide()
+ self._listView.show()
+ self._listView.setFocus()
+
+ def zoomAmount(self):
+ """
+ Return the zoom amount for the widget.
+
+ :rtype: int
+ """
+ return self._zoomAmount
+
+ def setZoomAmount(self, value):
+ """
+ Set the zoom amount for the widget.
+
+ :type value: int
+ :rtype: None
+ """
+ if value < self.DEFAULT_MIN_LIST_SIZE:
+ value = self.DEFAULT_MIN_LIST_SIZE
+
+ self._zoomAmount = value
+ size = QtCore.QSize(value * self.dpi(), value * self.dpi())
+ self.setIconSize(size)
+
+ if value >= self.DEFAULT_MIN_ICON_SIZE:
+ self._setViewMode(self.IconMode)
+ else:
+ self._setViewMode(self.TableMode)
+
+ columnWidth = value * self.dpi() + self.itemTextHeight()
+
+ self._treeWidget.setIndentation(0)
+ self._treeWidget.setColumnWidth(0, columnWidth)
+ self.scrollToSelectedItem()
+
+ msg = "Size: {0}%".format(value)
+ self.showToastMessage(msg)
+
+ def wheelEvent(self, event):
+ """
+ Triggered on any wheel events for the current viewport.
+
+ :type event: QtWidgets.QWheelEvent
+ :rtype: None
+ """
+ modifier = QtWidgets.QApplication.keyboardModifiers()
+
+ validModifiers = (
+ QtCore.Qt.AltModifier,
+ QtCore.Qt.ControlModifier,
+ )
+
+ if modifier in validModifiers:
+ numDegrees = event.angleDelta().y() / 8
+ numSteps = numDegrees / 15
+
+ delta = (numSteps * self.wheelScrollStep())
+ value = self.zoomAmount() + delta
+ self.setZoomAmount(value)
+
+ def setTextColor(self, color):
+ """
+ Set the item text color.
+
+ :type color: QtWidgets.QtColor
+ """
+ self._textColor = color
+
+ def setTextSelectedColor(self, color):
+ """
+ Set the text color when an item is selected.
+
+ :type color: QtWidgets.QtColor
+ """
+ self._textSelectedColor = color
+
+ def setBackgroundColor(self, color):
+ """
+ Set the item background color.
+
+ :type color: QtWidgets.QtColor
+ """
+ self._backgroundColor = color
+
+ def setItemBackgroundColor(self, color):
+ """
+ Set the item background color.
+
+ :type color: QtWidgets.QtColor
+ """
+ self._itemBackgroundColor = color
+
+ def setBackgroundHoverColor(self, color):
+ """
+ Set the background color when the mouse hovers over the item.
+
+ :type color: QtWidgets.QtColor
+ """
+ self._backgroundHoverColor = color
+
+ def setBackgroundSelectedColor(self, color):
+ """
+ Set the background color when an item is selected.
+
+ :type color: QtWidgets.QtColor
+ """
+ self._backgroundSelectedColor = color
+ self._listView.setRubberBandColor(QtGui.QColor(200, 200, 200, 255))
+
+ def textColor(self):
+ """
+ Return the item text color.
+
+ :rtype: QtGui.QColor
+ """
+ return self._textColor
+
+ def textSelectedColor(self):
+ """
+ Return the item text color when selected.
+
+ :rtype: QtGui.QColor
+ """
+ return self._textSelectedColor
+
+ def backgroundColor(self):
+ """
+ Return the item background color.
+
+ :rtype: QtWidgets.QtColor
+ """
+ return self._backgroundColor
+
+ def itemBackgroundColor(self):
+ """
+ Return the item background color.
+
+ :rtype: QtWidgets.QtColor
+ """
+ return self._itemBackgroundColor
+
+ def backgroundHoverColor(self):
+ """
+ Return the background color for when the mouse is over an item.
+
+ :rtype: QtWidgets.QtColor
+ """
+ return self._backgroundHoverColor
+
+ def backgroundSelectedColor(self):
+ """
+ Return the background color when an item is selected.
+
+ :rtype: QtWidgets.QtColor
+ """
+ return self._backgroundSelectedColor
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/itemviewmixin.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/itemviewmixin.py
new file mode 100644
index 0000000..ad6f550
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/itemviewmixin.py
@@ -0,0 +1,306 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import logging
+
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+import studioqt
+
+
+logger = logging.getLogger(__name__)
+
+
+class ItemViewMixin(object):
+
+ """
+ The ItemViewMixin class is a mixin for any widgets that
+ inherit from the QAbstractItemView class. This class should be used
+ for similar methods between views.
+ """
+
+ def __init__(self, *args):
+ self._hoverItem = None
+ self._mousePressButton = None
+ self._currentItem = None
+ self._currentSelection = []
+
+ def cleanDirtyObjects(self):
+ """
+ Remove any objects that may have been deleted.
+
+ :rtype: None
+ """
+ if self._currentItem:
+ try:
+ self._currentItem.text(0)
+ except RuntimeError:
+ self._hoverItem = None
+ self._currentItem = None
+ self._currentSelection = None
+
+ def itemsWidget(self):
+ """
+ Return True if a control modifier is currently active.
+
+ :rtype: studioqt.ItemsWidget
+ """
+ return self.parent()
+
+ def isControlModifier(self):
+ """
+ Return True if a control modifier is currently active.
+
+ :rtype: bool
+ """
+ modifiers = QtWidgets.QApplication.keyboardModifiers()
+ isAltModifier = modifiers == QtCore.Qt.AltModifier
+ isControlModifier = modifiers == QtCore.Qt.ControlModifier
+ return isAltModifier or isControlModifier
+
+ def itemsFromIndexes(self, indexes):
+ """
+ Return a list of Tree Widget Items assocated with the given indexes.
+
+ :type indexes: list[QtCore.QModelIndex]
+ :rtype: list[QtWidgets.QTreeWidgetItem]
+ """
+ items = {}
+ for index in indexes:
+ item = self.itemFromIndex(index)
+ items[id(item)] = item
+
+ return items.values()
+
+ def selectionChanged(self, selected, deselected):
+ """
+ Triggered when the current item has been selected or deselected.
+
+ :type selected: QtWidgets.QItemSelection
+ :type deselected: QtWidgets.QItemSelection
+ """
+ selectedItems_ = self.selectedItems()
+
+ if self._currentSelection != selectedItems_:
+ self._currentSelection = selectedItems_
+
+ indexes1 = selected.indexes()
+ selectedItems = self.itemsFromIndexes(indexes1)
+
+ indexes2 = deselected.indexes()
+ deselectedItems = self.itemsFromIndexes(indexes2)
+
+ items = list(selectedItems) + list(deselectedItems)
+ for item in items:
+ item.selectionChanged()
+ #
+ QtWidgets.QAbstractItemView.selectionChanged(self, selected, deselected)
+
+ def mousePressButton(self):
+ """
+ Return the mouse button that has been pressed.
+
+ :rtype: None or QtCore.Qt.MouseButton
+ """
+ return self._mousePressButton
+
+ def wheelEvent(self, event):
+ """
+ Triggered on any wheel events for the current viewport.
+
+ :type event: QtWidgets.QWheelEvent
+ :rtype: None
+ """
+ if self.isControlModifier():
+ event.ignore()
+ else:
+ QtWidgets.QAbstractItemView.wheelEvent(self, event)
+
+ item = self.itemAt(QtCore.QPoint(event.position().toPoint()))
+ self.itemUpdateEvent(item, event)
+
+ def keyPressEvent(self, event):
+ """
+ Triggered on user key press events for the current viewport.
+
+ :type event: QtCore.QKeyEvent
+ :rtype: None
+ """
+ item = self.selectedItem()
+ if item:
+ self.itemKeyPressEvent(item, event)
+
+ validKeys = [
+ QtCore.Qt.Key_Up,
+ QtCore.Qt.Key_Left,
+ QtCore.Qt.Key_Down,
+ QtCore.Qt.Key_Right,
+ ]
+
+ if event.isAccepted():
+ if event.key() in validKeys:
+ QtWidgets.QAbstractItemView.keyPressEvent(self, event)
+
+ def mousePressEvent(self, event):
+ """
+ Triggered on user mouse press events for the current viewport.
+
+ :type event: QtWidgets.QMouseEvent
+ :rtype: None
+ """
+ self._mousePressButton = event.button()
+
+ item = self.itemAt(event.pos())
+
+ if item:
+ self.itemMousePressEvent(item, event)
+
+ QtWidgets.QAbstractItemView.mousePressEvent(self, event)
+
+ def mouseReleaseEvent(self, event):
+ """
+ Triggered on user mouse release events for the current viewport.
+
+ :type event: QtWidgets.QMouseEvent
+ :rtype: None
+ """
+ self._mousePressButton = None
+
+ item = self.selectedItem()
+ if item:
+ self.itemMouseReleaseEvent(item, event)
+
+ def mouseMoveEvent(self, event):
+ """
+ Triggered on user mouse move events for the current viewport.
+
+ :type event: QtCore.QMouseEvent
+ :rtype: None
+ """
+ if self._mousePressButton == QtCore.Qt.MiddleButton:
+ item = self.selectedItem()
+ else:
+ item = self.itemAt(event.pos())
+
+ self.itemUpdateEvent(item, event)
+
+ def leaveEvent(self, event):
+ """
+ Triggered when the mouse leaves the widget.
+
+ :type event: QtCore.QMouseEvent
+ :rtype: None
+ """
+ if self._mousePressButton != QtCore.Qt.MiddleButton:
+ self.itemUpdateEvent(None, event)
+
+ QtWidgets.QAbstractItemView.leaveEvent(self, event)
+
+ def itemUpdateEvent(self, item, event):
+ """
+ Triggered on user key press events for the current viewport.
+
+ :type item: studioqt.Item
+ :type event: QtCore.QKeyEvent
+ :rtype: None
+ """
+ self.cleanDirtyObjects()
+
+ if id(self._currentItem) != id(item):
+
+ if self._currentItem:
+ self.itemMouseLeaveEvent(self._currentItem, event)
+ self._currentItem = None
+
+ if item and not self._currentItem:
+ self._currentItem = item
+ self.itemMouseEnterEvent(item, event)
+
+ if self._currentItem:
+ self.itemMouseMoveEvent(item, event)
+
+ def itemMouseEnterEvent(self, item, event):
+ """
+ Triggered when the mouse enters the given item.
+
+ :type item: QtWidgets.QTreeWidgetItem
+ :type event: QtWidgets.QMouseEvent
+ :rtype: None
+ """
+ item.mouseEnterEvent(event)
+ logger.debug("Mouse Enter: " + item.text(0))
+
+ def itemMouseLeaveEvent(self, item, event):
+ """
+ Triggered when the mouse leaves the given item.
+
+ :type item: QtWidgets.QTreeWidgetItem
+ :type event: QtWidgets.QMouseEvent
+ :rtype: None
+ """
+ item.mouseLeaveEvent(event)
+ logger.debug("Mouse Leave: " + item.text(0))
+
+ def itemMouseMoveEvent(self, item, event):
+ """
+ Triggered when the mouse moves within the given item.
+
+ :type item: QtWidgets.QTreeWidgetItem
+ :type event: QtWidgets.QMouseEvent
+ :rtype: None
+ """
+ item.mouseMoveEvent(event)
+
+ def itemMousePressEvent(self, item, event):
+ """
+ Triggered when the mouse is pressed on the given item.
+
+ :type item: QtWidgets.QTreeWidgetItem
+ :type event: QtWidgets.QMouseEvent
+ :rtype: None
+ """
+ item.mousePressEvent(event)
+ logger.debug("Mouse Press: " + item.text(0))
+
+ def itemMouseReleaseEvent(self, item, event):
+ """
+ Triggered when the mouse is released on the given item.
+
+ :type item: QtWidgets.QTreeWidgetItem
+ :type event: QtWidgets.QMouseEvent
+ :rtype: None
+ """
+ item.mouseReleaseEvent(event)
+ logger.debug("Mouse Released: " + item.text(0))
+
+ def itemKeyPressEvent(self, item, event):
+ """
+ Triggered when a key is pressed for the selected item.
+
+ :type item: QtWidgets.QTreeWidgetItem
+ :type event: QtWidgets.QKeyEvent
+ :rtype: None
+ """
+ item.keyPressEvent(event)
+ logger.debug("Key Press: " + item.text(0))
+
+ def itemKeyReleaseEvent(self, item, event):
+ """
+ Triggered when a key is released for the selected item.
+
+ :type item: QtWidgets.QTreeWidgetItem
+ :type event: QtWidgets.QKeyEvent
+ :rtype: None
+ """
+ item.keyReleaseEvent(event)
+ logger.debug("Key Release: " + item.text(0))
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/listview.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/listview.py
new file mode 100644
index 0000000..c58bd80
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/listview.py
@@ -0,0 +1,630 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import logging
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+
+from .itemviewmixin import ItemViewMixin
+
+
+logger = logging.getLogger(__name__)
+
+
+class ListView(ItemViewMixin, QtWidgets.QListView):
+
+ itemMoved = QtCore.Signal(object)
+ itemDropped = QtCore.Signal(object)
+ itemClicked = QtCore.Signal(object)
+ itemDoubleClicked = QtCore.Signal(object)
+
+ DEFAULT_DRAG_THRESHOLD = 10
+
+ def __init__(self, *args):
+ QtWidgets.QListView.__init__(self, *args)
+ ItemViewMixin.__init__(self)
+
+ self._treeWidget = None
+ self._rubberBand = None
+ self._rubberBandStartPos = None
+ self._rubberBandColor = QtGui.QColor(QtCore.Qt.white)
+ self._customSortOrder = []
+
+ self._drag = None
+ self._dragStartPos = None
+ self._dragStartIndex = None
+ self._dropEnabled = True
+
+ self.setSpacing(5)
+
+ self.setMouseTracking(True)
+ self.setSelectionRectVisible(True)
+ self.setViewMode(QtWidgets.QListView.IconMode)
+ self.setResizeMode(QtWidgets.QListView.Adjust)
+ self.setSelectionMode(QtWidgets.QListWidget.ExtendedSelection)
+ self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+
+ self.setAcceptDrops(True)
+ self.setDragEnabled(True)
+ self.setDragDropMode(QtWidgets.QAbstractItemView.DragDrop)
+
+ self.clicked.connect(self._indexClicked)
+ self.doubleClicked.connect(self._indexDoubleClicked)
+
+ def _indexClicked(self, index):
+ """
+ Triggered when the user clicks on an index.
+
+ :type index: QtCore.QModelIndex
+ :rtype: None
+ """
+ item = self.itemFromIndex(index)
+ item.clicked()
+ self.setItemsSelected([item], True)
+ self.itemClicked.emit(item)
+
+ def _indexDoubleClicked(self, index):
+ """
+ Triggered when the user double clicks on an index.
+
+ :type index: QtCore.QModelIndex
+ :rtype: None
+ """
+ item = self.itemFromIndex(index)
+ self.setItemsSelected([item], True)
+ item.doubleClicked()
+ self.itemDoubleClicked.emit(item)
+
+ def treeWidget(self):
+ """
+ Return the tree widget that contains the item.
+
+ :rtype: QtWidgets.QTreeWidget
+ """
+ return self._treeWidget
+
+ def setTreeWidget(self, treeWidget):
+ """
+ Set the tree widget that contains the item.
+
+ :type treeWidget: QtWidgets.QTreeWidget
+ :rtype: None
+ """
+ self._treeWidget = treeWidget
+ self.setModel(treeWidget.model())
+ self.setSelectionModel(treeWidget.selectionModel())
+
+ def scrollToItem(self, item, pos=None):
+ """
+ Ensures that the item is visible.
+
+ :type item: QtWidgets.QTreeWidgetItem
+ :type pos: QtCore.QPoint or None
+ :rtype: None
+ """
+ index = self.indexFromItem(item)
+ pos = pos or QtWidgets.QAbstractItemView.PositionAtCenter
+
+ self.scrollTo(index, pos)
+
+ def items(self):
+ """
+ Return all the items.
+
+ :rtype: list[QtWidgets.QTreeWidgetItem]
+ """
+ return self.treeWidget().items()
+
+ def itemAt(self, pos):
+ """
+ Return a pointer to the item at the coordinates p.
+
+ The coordinates are relative to the tree widget's viewport().
+
+ :type pos: QtCore.QPoint
+ :rtype: QtWidgets.QTreeWidgetItem
+ """
+ index = self.indexAt(pos)
+ return self.itemFromIndex(index)
+
+ def indexFromItem(self, item):
+ """
+ Return the QModelIndex assocated with the given item.
+
+ :type item: QtWidgets.QTreeWidgetItem.
+ :rtype: QtCore.QModelIndex
+ """
+ return self.treeWidget().indexFromItem(item)
+
+ def itemFromIndex(self, index):
+ """
+ Return a pointer to the QTreeWidgetItem assocated with the given index.
+
+ :type index: QtCore.QModelIndex
+ :rtype: QtWidgets.QTreeWidgetItem
+ """
+ return self.treeWidget().itemFromIndex(index)
+
+ def insertItem(self, row, item):
+ """
+ Inserts the item at row in the top level in the view.
+
+ :type row: int
+ :type item: QtWidgets.QTreeWidgetItem
+ :rtype: None
+ """
+ self.treeWidget().insertTopLevelItem(row, item)
+
+ def takeItems(self, items):
+ """
+ Removes and returns the items from the view
+
+ :type items: list[QtWidgets.QTreeWidgetItem]
+ :rtype: list[QtWidgets.QTreeWidgetItem]
+ """
+ for item in items:
+ row = self.treeWidget().indexOfTopLevelItem(item)
+ self.treeWidget().takeTopLevelItem(row)
+
+ return items
+
+ def selectedItem(self):
+ """
+ Return the last selected non-hidden item.
+
+ :rtype: QtWidgets.QTreeWidgetItem
+ """
+ return self.treeWidget().selectedItem()
+
+ def selectedItems(self):
+ """
+ Return a list of all selected non-hidden items.
+
+ :rtype: list[QtWidgets.QTreeWidgetItem]
+ """
+ return self.treeWidget().selectedItems()
+
+ def setIndexesSelected(self, indexes, value):
+ """
+ Set the selected state for the given indexes.
+
+ :type indexes: list[QtCore.QModelIndex]
+ :type value: bool
+ :rtype: None
+ """
+ items = self.itemsFromIndexes(indexes)
+ self.setItemsSelected(items, value)
+
+ def setItemsSelected(self, items, value):
+ """
+ Set the selected state for the given items.
+
+ :type items: list[studioqt.WidgetItem]
+ :type value: bool
+ :rtype: None
+ """
+ self.treeWidget().blockSignals(True)
+ for item in items:
+ item.setSelected(value)
+ self.treeWidget().blockSignals(False)
+
+ def moveItems(self, items, itemAt):
+ """
+ Move the given items to the position of the destination row.
+
+ :type items: list[studioqt.Item]
+ :type itemAt: studioqt.Item
+ :rtype: None
+ """
+ scrollValue = self.verticalScrollBar().value()
+
+ self.treeWidget().moveItems(items, itemAt)
+ self.itemMoved.emit(items[-1])
+
+ self.verticalScrollBar().setValue(scrollValue)
+
+ # ---------------------------------------------------------------------
+ # Support for a custom colored rubber band.
+ # ---------------------------------------------------------------------
+
+ def createRubberBand(self):
+ """
+ Create a new instance of the selection rubber band.
+
+ :rtype: QtWidgets.QRubberBand
+ """
+ rubberBand = QtWidgets.QRubberBand(QtWidgets.QRubberBand.Rectangle, self)
+ palette = QtGui.QPalette()
+ color = self.rubberBandColor()
+ palette.setBrush(QtGui.QPalette.Highlight, QtGui.QBrush(color))
+ rubberBand.setPalette(palette)
+ return rubberBand
+
+ def setRubberBandColor(self, color):
+ """
+ Set the color for the rubber band.
+
+ :type color: QtGui.QColor
+ :rtype: None
+ """
+ self._rubberBand = None
+ self._rubberBandColor = color
+
+ def rubberBandColor(self):
+ """
+ Return the rubber band color for this widget.
+
+ :rtype: QtGui.QColor
+ """
+ return self._rubberBandColor
+
+ def rubberBand(self):
+ """
+ Return the selection rubber band for this widget.
+
+ :rtype: QtWidgets.QRubberBand
+ """
+ if not self._rubberBand:
+ self.setSelectionRectVisible(False)
+ self._rubberBand = self.createRubberBand()
+
+ return self._rubberBand
+
+ # ---------------------------------------------------------------------
+ # Events
+ # ---------------------------------------------------------------------
+
+ def validateDragEvent(self, event):
+ """
+ Validate the drag event.
+
+ :type event: QtWidgets.QMouseEvent
+ :rtype: bool
+ """
+ return QtCore.Qt.LeftButton == event.mouseButtons()
+
+ def mousePressEvent(self, event):
+ """
+ Triggered when the user presses the mouse button for the viewport.
+
+ :type event: QtWidgets.QMouseEvent
+ :rtype: None
+ """
+ item = self.itemAt(event.pos())
+ if not item:
+ self.clearSelection()
+
+ ItemViewMixin.mousePressEvent(self, event)
+ if event.isAccepted():
+ QtWidgets.QListView.mousePressEvent(self, event)
+ if item:
+ item.setSelected(True)
+
+ self.endDrag()
+ self._dragStartPos = event.pos()
+
+ isLeftButton = self.mousePressButton() == QtCore.Qt.LeftButton
+ isItemDraggable = item and item.dragEnabled()
+ isSelectionEmpty = not self.selectedItems()
+
+ if isLeftButton and (isSelectionEmpty or not isItemDraggable):
+ self.rubberBandStartEvent(event)
+
+ def mouseMoveEvent(self, event):
+ """
+ Triggered when the user moves the mouse over the current viewport.
+
+ :type event: QtWidgets.QMouseEvent
+ :rtype: None
+ """
+ if not self.isDraggingItems():
+
+ isLeftButton = self.mousePressButton() == QtCore.Qt.LeftButton
+
+ if isLeftButton and self.rubberBand().isHidden() and self.selectedItems():
+ self.startDrag(event)
+ else:
+ ItemViewMixin.mouseMoveEvent(self, event)
+ QtWidgets.QListView.mouseMoveEvent(self, event)
+
+ if isLeftButton:
+ self.rubberBandMoveEvent(event)
+
+ def mouseReleaseEvent(self, event):
+ """
+ Triggered when the user releases the mouse button for this viewport.
+
+ :type event: QtWidgets.QMouseEvent
+ :rtype: None
+ """
+ item = self.itemAt(event.pos())
+ items = self.selectedItems()
+
+ ItemViewMixin.mouseReleaseEvent(self, event)
+
+ if item not in items:
+ if event.button() != QtCore.Qt.MiddleButton:
+ QtWidgets.QListView.mouseReleaseEvent(self, event)
+ elif not items:
+ QtWidgets.QListView.mouseReleaseEvent(self, event)
+
+ self.endDrag()
+ self.rubberBand().hide()
+
+ def rubberBandStartEvent(self, event):
+ """
+ Triggered when the user presses an empty area.
+
+ :type event: QtWidgets.QMouseEvent
+ :rtype: None
+ """
+ self._rubberBandStartPos = event.pos()
+ rect = QtCore.QRect(self._rubberBandStartPos, QtCore.QSize())
+
+ rubberBand = self.rubberBand()
+ rubberBand.setGeometry(rect)
+ rubberBand.show()
+
+ def rubberBandMoveEvent(self, event):
+ """
+ Triggered when the user moves the mouse over the current viewport.
+
+ :type event: QtWidgets.QMouseEvent
+ :rtype: None
+ """
+ if self.rubberBand() and self._rubberBandStartPos:
+ rect = QtCore.QRect(self._rubberBandStartPos, event.pos())
+ rect = rect.normalized()
+ self.rubberBand().setGeometry(rect)
+
+ # -----------------------------------------------------------------------
+ # Support for drag and drop
+ # -----------------------------------------------------------------------
+
+ def rowAt(self, pos):
+ """
+ Return the row for the given pos.
+
+ :type pos: QtCore.QPoint
+ :rtype: int
+ """
+ return self.treeWidget().rowAt(pos)
+
+ def itemsFromUrls(self, urls):
+ """
+ Return items from the given url objects.
+
+ :type urls: list[QtCore.QUrl]
+ :rtype: list[studioqt.Item]
+ """
+ items = []
+ for url in urls:
+ item = self.itemFromUrl(url)
+ if item:
+ items.append(item)
+ return items
+
+ def itemFromUrl(self, url):
+ """
+ Return the item from the given url object.
+
+ :type url: QtCore.QUrl
+ :rtype: studioqt.Item
+ """
+ return self.itemFromPath(url.path())
+
+ def itemsFromPaths(self, paths):
+ """
+ Return the items from the given paths.
+
+ :type paths: list[str]
+ :rtype: list[studioqt.Item]
+ """
+ items = []
+ for path in paths:
+ item = self.itemFromPath(path)
+ if item:
+ items.append(item)
+ return items
+
+ def itemFromPath(self, path):
+ """
+ Return the item from the given path.
+
+ :type path: str
+ :rtype: studioqt.Item
+ """
+ for item in self.items():
+ path_ = item.url().path()
+ if path_ and path_ == path:
+ return item
+
+ def setDropEnabled(self, value):
+ """
+ :type value: bool
+ :rtype: None
+ """
+ self._dropEnabled = value
+
+ def dropEnabled(self):
+ """
+ :rtype: bool
+ """
+ return self._dropEnabled
+
+ def dragThreshold(self):
+ """
+ :rtype: int
+ """
+ return self.DEFAULT_DRAG_THRESHOLD
+
+ def mimeData(self, items):
+ """
+ :type items: list[studioqt.Item]
+ :rtype: QtCore.QMimeData
+ """
+ mimeData = QtCore.QMimeData()
+
+ urls = [item.url() for item in items]
+ text = "\n".join([item.mimeText() for item in items])
+
+ mimeData.setUrls(urls)
+ mimeData.setText(text)
+
+ return mimeData
+
+ def dropEvent(self, event):
+ """
+ This event handler is called when the drag is dropped on this widget.
+
+ :type event: QtWidgets.QDropEvent
+ :rtype: None
+ """
+ item = self.itemAt(event.pos())
+ selectedItems = self.selectedItems()
+
+ if selectedItems and item:
+ if self.treeWidget().isSortByCustomOrder():
+ self.moveItems(selectedItems, item)
+ else:
+ msg = "You can only re-order items when sorting by custom order."
+ logger.info(msg)
+
+ if item:
+ item.dropEvent(event)
+
+ self.itemDropped.emit(event)
+
+ def dragMoveEvent(self, event):
+ """
+ This event handler is called if a drag is in progress.
+
+ :type event: QtGui.QDragMoveEvent
+ :rtype: None
+ """
+ mimeData = event.mimeData()
+
+ if (mimeData.hasText() or mimeData.hasUrls()) and self.dropEnabled():
+ event.accept()
+ else:
+ event.ignore()
+
+ def dragEnterEvent(self, event):
+ """
+ This event handler is called when the mouse enters this widget
+ while a drag is in pregress.
+
+ :type event: QtGui.QDragEnterEvent
+ :rtype: None
+ """
+ mimeData = event.mimeData()
+
+ if (mimeData.hasText() or mimeData.hasUrls()) and self.dropEnabled():
+ event.accept()
+ else:
+ event.ignore()
+
+ def isDraggingItems(self):
+ """
+ Return true if the user is currently dragging items.
+
+ :rtype: bool
+ """
+ return bool(self._drag)
+
+ def startDrag(self, event):
+ """
+ Starts a drag using the given event.
+
+ :type event: QtCore.QEvent
+ :rtype: None
+ """
+ if not self.dragEnabled():
+ return
+
+ if self._dragStartPos and hasattr(event, "pos"):
+
+ item = self.itemAt(event.pos())
+
+ if item and item.dragEnabled():
+
+ self._dragStartIndex = self.indexAt(event.pos())
+
+ point = self._dragStartPos - event.pos()
+ dt = self.dragThreshold()
+
+ if point.x() > dt or point.y() > dt or point.x() < -dt or point.y() < -dt:
+
+ items = self.selectedItems()
+ mimeData = self.mimeData(items)
+
+ pixmap = self.dragPixmap(item, items)
+ hotSpot = QtCore.QPoint(pixmap.width() / 2, pixmap.height() / 2)
+
+ self._drag = QtGui.QDrag(self)
+ self._drag.setPixmap(pixmap)
+ self._drag.setHotSpot(hotSpot)
+ self._drag.setMimeData(mimeData)
+ self._drag.exec_(QtCore.Qt.MoveAction)
+
+ def endDrag(self):
+ """
+ Ends the current drag.
+
+ :rtype: None
+ """
+ logger.debug("End Drag")
+ self._dragStartPos = None
+ self._dragStartIndex = None
+ if self._drag:
+ del self._drag
+ self._drag = None
+
+ def dragPixmap(self, item, items):
+ """
+ Show the drag pixmap for the given item.
+
+ :type item: studioqt.Item
+ :type items: list[studioqt.Item]
+
+ :rtype: QtGui.QPixmap
+ """
+ rect = self.visualRect(self.indexFromItem(item))
+
+ # pixmap = QtGui.QPixmap()
+ pixmap = self.grab(rect)
+
+ if len(items) > 1:
+ cWidth = 35
+ cPadding = 5
+ cText = str(len(items))
+ cX = pixmap.rect().center().x() - float(cWidth / 2)
+ cY = pixmap.rect().top() + cPadding
+ cRect = QtCore.QRect(cX, cY, cWidth, cWidth)
+
+ painter = QtGui.QPainter(pixmap)
+ painter.setRenderHint(QtGui.QPainter.Antialiasing)
+
+ painter.setPen(QtCore.Qt.NoPen)
+ painter.setBrush(self.itemsWidget().backgroundSelectedColor())
+ painter.drawEllipse(cRect.center(), float(cWidth / 2),
+ float(cWidth / 2))
+
+ font = QtGui.QFont('Serif', 12, QtGui.QFont.Light)
+ painter.setFont(font)
+ painter.setPen(self.itemsWidget().textSelectedColor())
+ painter.drawText(cRect, QtCore.Qt.AlignCenter, str(cText))
+
+ return pixmap
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/treewidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/treewidget.py
new file mode 100644
index 0000000..61b8fa5
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/treewidget.py
@@ -0,0 +1,685 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import logging
+from functools import partial
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+from studiovendor import six
+
+import studioqt
+
+from .groupitem import GroupItem
+from .itemviewmixin import ItemViewMixin
+
+
+logger = logging.getLogger(__name__)
+
+
+class TreeWidget(ItemViewMixin, QtWidgets.QTreeWidget):
+
+ itemSliderMoved = QtCore.Signal(object, object)
+ itemSliderReleased = QtCore.Signal(object, object)
+
+ def __init__(self, *args):
+ QtWidgets.QTreeWidget.__init__(self, *args)
+ ItemViewMixin.__init__(self)
+
+ self._headerLabels = []
+ self._hiddenColumns = {}
+
+ self.setAutoScroll(False)
+ self.setMouseTracking(True)
+ self.setSortingEnabled(False)
+ self.setSelectionMode(QtWidgets.QListWidget.ExtendedSelection)
+ self.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel)
+
+ header = self.header()
+ header.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
+ header.customContextMenuRequested.connect(self.showHeaderMenu)
+
+ self.itemClicked.connect(self._itemClicked)
+ self.itemDoubleClicked.connect(self._itemDoubleClicked)
+
+ def _itemSliderMoved(self, item, value):
+ self.itemSliderMoved.emit(item, value)
+
+ def _itemSliderReleased(self, item, value):
+ self.itemSliderReleased.emit(item, value)
+
+ def drawRow(self, painter, options, index):
+ item = self.itemFromIndex(index)
+ item.paintRow(painter, options, index)
+
+ def settings(self):
+ """
+ Return the current state of the widget.
+
+ :rtype: dict
+ """
+ settings = {}
+
+ # settings["headerState"] = self.header().saveState()
+
+ settings["columnSettings"] = self.columnSettings()
+
+ return settings
+
+ def setSettings(self, settings):
+ """
+ Set the current state of the widget.
+
+ :type settings: dict
+ :rtype: None
+ """
+ columnSettings = settings.get("columnSettings", {})
+ self.setColumnSettings(columnSettings)
+
+ return settings
+
+ def _itemClicked(self, item):
+ """
+ Triggered when the user clicks on an item.
+
+ :type item: QtWidgets.QTreeWidgetItem
+ :rtype: None
+ """
+ item.clicked()
+
+ def _itemDoubleClicked(self, item):
+ """
+ Triggered when the user double clicks on an item.
+
+ :type item: QtWidgets.QTreeWidgetItem
+ :rtype: None
+ """
+ item.doubleClicked()
+
+ def clear(self, *args):
+ """
+ Reimplementing so that all dirty objects can be removed.
+
+ :param args:
+ :rtype: None
+ """
+ QtWidgets.QTreeWidget.clear(self, *args)
+ self.cleanDirtyObjects()
+
+ def setItems(self, items):
+ selectedItems = self.selectedItems()
+ self.takeTopLevelItems()
+ self.addTopLevelItems(items)
+ self.setItemsSelected(selectedItems, True)
+
+ def setItemsSelected(self, items, value, scrollTo=True):
+ """
+ Select the given items.
+
+ :type items: list[studioqt.ItemsWidget]
+ :type value: bool
+ :type scrollTo: bool
+
+ :rtype: None
+ """
+ for item in items:
+ item.setSelected(value)
+
+ if scrollTo:
+ self.itemsWidget().scrollToSelectedItem()
+
+ def selectedItem(self):
+ """
+ Return the last selected non-hidden item.
+
+ :rtype: studioqt.Item
+ """
+ items = self.selectedItems()
+
+ if items:
+ return items[-1]
+
+ return None
+
+ def selectedItems(self):
+ """
+ Return all the selected items.
+
+ :rtype: list[studioqt.Item]
+ """
+ items = []
+ items_ = QtWidgets.QTreeWidget.selectedItems(self)
+
+ for item in items_:
+ if not isinstance(item, GroupItem):
+ items.append(item)
+
+ return items
+
+ def rowAt(self, pos):
+ """
+ Return the row for the given pos.
+
+ :type pos: QtCore.QPoint
+ :rtype: int
+ """
+ item = self.itemAt(pos)
+ return self.itemRow(item)
+
+ def itemRow(self, item):
+ """
+ Return the row for the given item.
+
+ :type item: studioqt.TreeWidgetItem
+ :rtype: int
+ """
+ index = self.indexFromItem(item)
+ return index.row()
+
+ def items(self):
+ """
+ Return a list of all the items in the tree widget.
+
+ :rtype: lsit[studioqt.TreeWidgetItem]
+ """
+ items = []
+
+ for item in self._items():
+ if not isinstance(item, GroupItem):
+ items.append(item)
+
+ return items
+
+ def _items(self):
+ """
+ Return a list of all the items in the tree widget.
+
+ :rtype: lsit[studioqt.TreeWidgetItem]
+ """
+ return self.findItems(
+ "*",
+ QtCore.Qt.MatchWildcard | QtCore.Qt.MatchRecursive
+ )
+
+ def takeTopLevelItems(self):
+ """
+ Take all items from the tree widget.
+
+ :rtype: list[QtWidgets.QTreeWidgetItem]
+ """
+ items = []
+ for item in self._items():
+ # For some reason its faster to take from index 1.
+ items.append(self.takeTopLevelItem(1))
+ items.append(self.takeTopLevelItem(0))
+ return items
+
+ def textFromColumn(self, column, split=None, duplicates=False):
+ """
+ Return all the data for the given column
+
+ :type column: int or str
+ :type split: str
+ :type duplicates: bool
+ :rtype: list[str]
+ """
+ items = self.items()
+ results = self.textFromItems(
+ items,
+ column,
+ split=split,
+ duplicates=duplicates,
+ )
+ return results
+
+ def textFromItems(self, items, column, split=None, duplicates=False):
+ """
+ Return all the text data for the given items and given column
+
+ :type items: list[Item]
+ :type column: int or str
+ :type split: str
+ :type duplicates: bool
+ :rtype: list[str]
+ """
+ results = []
+
+ for item in items:
+ text = item.text(column)
+
+ if text and split:
+ results.extend(text.split(split))
+ elif text:
+ results.append(text)
+
+ if not duplicates:
+ results = list(set(results))
+
+ return results
+
+ def columnLabels(self):
+ """
+ Return all header labels for the tree widget.
+
+ :rtype: list[str]
+ """
+ return self.headerLabels()
+
+ def labelFromColumn(self, column):
+ """
+ Return the column label for the given column.
+
+ :type column: int
+ :rtype: str
+ """
+ if column is not None:
+ return self.headerItem().text(column)
+
+ def headerLabels(self):
+ """
+ Return all the header labels.
+
+ :rtype: str
+ """
+ return self._headerLabels
+
+ def isHeaderLabel(self, label):
+ """
+ Return True if the given label is a valid header label.
+
+ :type label: str
+ :rtype: None
+ """
+ return label in self._headerLabels
+
+ def _removeDuplicates(self, labels):
+ """
+ Removes duplicates from a list in Python, whilst preserving order.
+
+ :type labels: list[str]
+ :rtype: list[str]
+ """
+ s = set()
+ sadd = s.add
+ return [x for x in labels if x.strip() and not (x in s or sadd(x))]
+
+ def setHeaderLabels(self, labels):
+ """
+ Set the header for each item in the given label list.
+
+ :type labels: list[str]
+ :rtype: None
+ """
+ labels = self._removeDuplicates(labels)
+
+ if "Custom Order" not in labels:
+ labels.append("Custom Order")
+
+ self.setColumnHidden("Custom Order", True)
+
+ columnSettings = self.columnSettings()
+
+ QtWidgets.QTreeWidget.setHeaderLabels(self, labels)
+
+ self._headerLabels = labels
+ self.updateColumnHidden()
+
+ self.setColumnSettings(columnSettings)
+
+ def columnFromLabel(self, label):
+ """
+ Return the column for the given label.
+
+ :type label: str
+ :rtype: int
+ """
+ try:
+ return self._headerLabels.index(label)
+ except ValueError:
+ return -1
+
+ def showAllColumns(self):
+ """
+ Show all available columns.
+
+ :rtype: None
+ """
+ for column in range(self.columnCount()):
+ self.setColumnHidden(column, False)
+
+ def hideAllColumns(self):
+ """
+ Hide all available columns.
+
+ :rtype: None
+ """
+ for column in range(1, self.columnCount()):
+ self.setColumnHidden(column, True)
+
+ def updateColumnHidden(self):
+ """
+ Update the hidden state for all the current columns.
+
+ :rtype: None
+ """
+ self.showAllColumns()
+ columnLabels = self._hiddenColumns.keys()
+
+ for columnLabel in columnLabels:
+ self.setColumnHidden(columnLabel, self._hiddenColumns[columnLabel])
+
+ def setColumnHidden(self, column, value):
+ """
+ Set the give column to show or hide depending on the specified value.
+
+ :type column: int or str
+ :type value: bool
+ :rtype: None
+ """
+ if isinstance(column, six.string_types):
+ column = self.columnFromLabel(column)
+
+ label = self.labelFromColumn(column)
+ self._hiddenColumns[label] = value
+
+ QtWidgets.QTreeWidget.setColumnHidden(self, column, value)
+
+ # Make sure the column is not collapsed
+ width = self.columnWidth(column)
+ if width < 5:
+ width = 100
+ self.setColumnWidth(column, width)
+
+ def resizeColumnToContents(self, column):
+ """
+ Resize the given column to the data of that column.
+
+ :type column: int or text
+ :rtype: None
+ """
+ width = 0
+ for item in self.items():
+ text = item.text(column)
+ font = item.font(column)
+ metrics = QtGui.QFontMetricsF(font)
+ textWidth = metrics.width(text) + item.padding()
+ width = max(width, textWidth)
+
+ self.setColumnWidth(column, width)
+
+ # ----------------------------------------------------------------------
+ # Support for custom orders
+ # ----------------------------------------------------------------------
+
+ def isSortByCustomOrder(self):
+ """
+ Return true if items are currently sorted by custom order.
+
+ :rtype: bool
+ """
+ return "Custom Order" in str(self.itemsWidget().dataset().sortBy())
+
+ def setItemsCustomOrder(self, items, row=1, padding=5):
+ """
+ Set the custom order for the given items by their list order.
+
+ :rtype: None
+ """
+ for item in items:
+ item.itemData()["Custom Order"] = str(row).zfill(padding)
+ row += 1
+
+ # def updateCustomOrder(self):
+ # """
+ # Update any empty custom orders.
+ #
+ # :rtype: None
+ # """
+ # row = 1
+ # padding = 5
+ #
+ # items = self.items()
+ # columnLabel = "Custom Order"
+ #
+ # for item in items:
+ # customOrder = item.text(columnLabel)
+ #
+ # if not customOrder:
+ # item.setText(columnLabel, str(row).zfill(padding))
+ # row += 1
+
+ def itemsCustomOrder(self):
+ """
+ Return the items sorted by the custom order data.
+
+ :rtype: list[studioqt.Item]
+ """
+ items = self.items()
+
+ def sortKey(item):
+ return item.itemData().get("Custom Order", "00000")
+
+ customOrder = sorted(items, key=sortKey)
+
+ return customOrder
+
+ def moveItems(self, items, itemAt):
+ """
+ Move the given items to the position of the destination row.
+
+ :type items: list[studioqt.Item]
+ :type itemAt: studioqt.Item
+ :rtype: None
+ """
+ row = 0
+ orderedItems = self.itemsCustomOrder()
+
+ if itemAt:
+ row = orderedItems.index(itemAt)
+
+ removedItems = []
+ for item in items:
+ index = orderedItems.index(item)
+ removedItems.append(orderedItems.pop(index))
+
+ for item in removedItems:
+ orderedItems.insert(row, item)
+
+ self.setItemsCustomOrder(orderedItems)
+
+ for item in items:
+ item.setSelected(True)
+
+ self.itemsWidget().scrollToSelectedItem()
+
+ # ----------------------------------------------------------------------
+ # Support for menus
+ # ----------------------------------------------------------------------
+
+ def showHeaderMenu(self, pos):
+ """
+ Creates and show the header menu at the cursor pos.
+
+ :rtype: QtWidgets.QMenu
+ """
+ header = self.header()
+ column = header.logicalIndexAt(pos)
+
+ menu = self.createHeaderMenu(column)
+
+ menu.addSeparator()
+
+ submenu = self.createHideColumnMenu()
+ menu.addMenu(submenu)
+
+ point = QtGui.QCursor.pos()
+ menu.exec_(point)
+
+ def createHeaderMenu(self, column):
+ """
+ Creates a new header menu.
+
+ :rtype: QtWidgets.QMenu
+ """
+ menu = QtWidgets.QMenu(self)
+ label = self.labelFromColumn(column)
+
+ action = menu.addAction("Hide '{0}'".format(label))
+ callback = partial(self.setColumnHidden, column, True)
+ action.triggered.connect(callback)
+
+ menu.addSeparator()
+
+ action = menu.addAction('Resize to Contents')
+ callback = partial(self.resizeColumnToContents, column)
+ action.triggered.connect(callback)
+
+ return menu
+
+ def columnSettings(self):
+ """
+ Return the settings for each column.
+
+ :rtype: dict
+ """
+ columnSettings = {}
+
+ for column in range(self.columnCount()):
+
+ label = self.labelFromColumn(column)
+ hidden = self.isColumnHidden(column)
+ width = self.columnWidth(column)
+
+ columnSettings[label] = {
+ "hidden": hidden,
+ "width": width,
+ "index": column,
+ }
+
+ return columnSettings
+
+ def setColumnSettings(self, settings):
+ """
+ Set the settings for each column.
+
+ :type settings: dict
+ :type: None
+ """
+ for label in settings:
+ if self.isHeaderLabel(label):
+ column = self.columnFromLabel(label)
+
+ width = settings[label].get("width", 100)
+ if width < 5:
+ width = 100
+ self.setColumnWidth(column, width)
+
+ hidden = settings[label].get("hidden", False)
+ self.setColumnHidden(column, hidden)
+ else:
+ msg = 'Cannot set the column setting for the header label "%s"'
+ logger.debug(msg, label)
+
+ def createHideColumnMenu(self):
+ """
+ Create the hide column menu.
+
+ :rtype: QtWidgets.QMenu
+ """
+ menu = QtWidgets.QMenu("Show/Hide Column", self)
+
+ action = menu.addAction("Show All")
+ action.triggered.connect(self.showAllColumns)
+
+ action = menu.addAction("Hide All")
+ action.triggered.connect(self.hideAllColumns)
+
+ menu.addSeparator()
+
+ for column in range(self.columnCount()):
+
+ label = self.labelFromColumn(column)
+ isHidden = self.isColumnHidden(column)
+
+ action = menu.addAction(label)
+ action.setCheckable(True)
+ action.setChecked(not isHidden)
+
+ callback = partial(self.setColumnHidden, column, not isHidden)
+ action.triggered.connect(callback)
+
+ return menu
+
+ # ----------------------------------------------------------------------
+ # Support for copying item data to the clipboard.
+ # ----------------------------------------------------------------------
+
+ def createCopyTextMenu(self):
+ """
+ Create a menu to copy the selected items data to the clipboard.
+
+ :rtype: QtWidgets.QMenu
+ """
+ menu = QtWidgets.QMenu("Copy Text", self)
+
+ if self.selectedItems():
+
+ for column in range(self.columnCount()):
+ label = self.labelFromColumn(column)
+ action = menu.addAction(label)
+ callback = partial(self.copyText, column)
+ action.triggered.connect(callback)
+
+ else:
+ action = menu.addAction("No items selected")
+ action.setEnabled(False)
+
+ return menu
+
+ def copyText(self, column):
+ """
+ Copy the given column text to clipboard.
+
+ :type column: int or text
+ :rtype: None
+ """
+ items = self.selectedItems()
+ text = "\n".join([item.text(column) for item in items])
+
+ clipBoard = QtWidgets.QApplication.clipboard()
+ clipBoard.setText(text, QtGui.QClipboard.Clipboard)
+
+ # ----------------------------------------------------------------------
+ # Override events for mixin.
+ # ----------------------------------------------------------------------
+
+ def mouseMoveEvent(self, event):
+ """
+ Triggered when the user moves the mouse over the current viewport.
+
+ :type event: QtWidgets.QMouseEvent
+ :rtype: None
+ """
+ ItemViewMixin.mouseMoveEvent(self, event)
+ QtWidgets.QTreeWidget.mouseMoveEvent(self, event)
+
+ def mouseReleaseEvent(self, event):
+ """
+ Triggered when the user releases the mouse button on the viewport.
+
+ :type event: QtWidgets.QMouseEvent
+ :rtype: None
+ """
+ ItemViewMixin.mouseReleaseEvent(self, event)
+ QtWidgets.QTreeWidget.mouseReleaseEvent(self, event)
+
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/librariesmenu.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/librariesmenu.py
new file mode 100644
index 0000000..7a02536
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/librariesmenu.py
@@ -0,0 +1,67 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+"""
+Example:
+
+ from PySide2 import QtGui
+ import studiolibrary.widgets
+ menu = studiolibrary.widgets.LibrariesMenu()
+ point = QtGui.QCursor.pos()
+ menu.exec_(point)
+"""
+from functools import partial
+
+from studiovendor.Qt import QtWidgets
+
+import studiolibrary
+
+
+class LibrariesMenu(QtWidgets.QMenu):
+
+ def __init__(self, libraryWindow=None):
+ super(LibrariesMenu, self).__init__(libraryWindow)
+
+ self.setTitle('Libraries')
+
+ libraries = studiolibrary.readSettings()
+ default = studiolibrary.defaultLibrary()
+
+ for name in libraries:
+
+ library = libraries[name]
+
+ path = library.get('path', '')
+ kwargs = library.get('kwargs', {})
+
+ enabled = True
+ if libraryWindow:
+ enabled = name != libraryWindow.name()
+
+ text = name
+ if name == default and name.lower() != "default":
+ text = name + " (default)"
+
+ action = QtWidgets.QAction(text, self)
+ action.setEnabled(enabled)
+ callback = partial(self.showLibrary, name, path, **kwargs)
+ action.triggered.connect(callback)
+ self.addAction(action)
+
+ def showLibrary(self, name, path, **kwargs):
+ """
+ Show the library window which has given name and path.
+
+ :type name: str
+ :type path: str
+ :type kwargs: dict
+ """
+ studiolibrary.main(name, path, **kwargs)
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/lightbox.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/lightbox.py
new file mode 100644
index 0000000..5df1694
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/lightbox.py
@@ -0,0 +1,228 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+import studioqt
+
+
+class Lightbox(QtWidgets.QFrame):
+
+ DEFAULT_DURATION = 400
+
+ def __init__(
+ self,
+ parent,
+ widget=None,
+ duration=DEFAULT_DURATION,
+ ):
+
+ super(Lightbox, self).__init__(parent)
+ self.setObjectName("lightbox")
+
+ self._widget = None
+ self._accepted = False
+ self._rejected = False
+ self._animation = None
+ self._duration = duration
+
+ layout = QtWidgets.QGridLayout(self)
+ self.setLayout(layout)
+
+ layout.setRowStretch(0, 1)
+ layout.setRowStretch(1, 5)
+ layout.setRowStretch(2, 1)
+
+ layout.setColumnStretch(0, 1)
+ layout.setColumnStretch(1, 5)
+ layout.setColumnStretch(2, 1)
+
+ layout.addWidget(QtWidgets.QWidget(), 0, 0)
+ layout.addWidget(QtWidgets.QWidget(), 0, 1)
+ layout.addWidget(QtWidgets.QWidget(), 0, 2)
+
+ layout.addWidget(QtWidgets.QWidget(), 1, 0)
+ layout.addWidget(QtWidgets.QWidget(), 1, 2)
+
+ layout.addWidget(QtWidgets.QWidget(), 2, 0)
+ layout.addWidget(QtWidgets.QWidget(), 2, 1)
+ layout.addWidget(QtWidgets.QWidget(), 2, 2)
+
+ if widget:
+ self.setWidget(widget)
+
+ parent = self.parent()
+ parent.installEventFilter(self)
+
+ def widget(self):
+ """
+ Get the current widget for the light box.
+
+ :rtype: QtWidgets.QWidget
+ """
+ return self._widget
+
+ def setWidget(self, widget):
+ """
+ Set the widget for the lightbox.
+
+ :type widget: QWidgets.QWidget
+ """
+ if self._widget:
+ self.layout().removeWidget(self._widget)
+
+ widget.setParent(self)
+ widget.accept = self.accept
+ widget.reject = self.reject
+
+ self.layout().addWidget(widget, 1, 1)
+
+ self._widget = widget
+
+ def mousePressEvent(self, event):
+ """
+ Hide the light box if the user clicks on it.
+
+ :type event: QEvent
+ """
+ if not self.widget().underMouse():
+ self.reject()
+
+ def eventFilter(self, object, event):
+ """
+ Update the geometry when the parent widget changes size.
+
+ :type object: QtWidget.QWidget
+ :type event: QtCore.QEvent
+ :rtype: bool
+ """
+ if event.type() == QtCore.QEvent.Resize:
+ self.updateGeometry()
+
+ return super(Lightbox, self).eventFilter(object, event)
+
+ def showEvent(self, event):
+ """
+ Fade in the dialog on show.
+
+ :type event: QtCore.QEvent
+ :rtype: None
+ """
+ self.updateGeometry()
+ self.fadeIn(self._duration)
+
+ def updateGeometry(self):
+ """
+ Update the geometry to be in the center of it's parent.
+
+ :rtype: None
+ """
+ self.setGeometry(self.parent().geometry())
+ self.move(0, 0)
+
+ geometry = self.geometry()
+ centerPoint = self.geometry().center()
+ geometry.moveCenter(centerPoint)
+ geometry.setY(geometry.y())
+
+ self.move(geometry.topLeft())
+
+ def fadeIn(self, duration=200):
+ """
+ Fade in the dialog using the opacity effect.
+
+ :type duration: int
+ :rtype: QtCore.QPropertyAnimation
+ """
+ self._animation = studioqt.fadeIn(self, duration=duration)
+ return self._animation
+
+ def fadeOut(self, duration=200):
+ """
+ Fade out the dialog using the opacity effect.
+
+ :type duration: int
+ :rtype: QtCore.QPropertyAnimation
+ """
+ self._animation = studioqt.fadeOut(self, duration=duration)
+ return self._animation
+
+ def accept(self):
+ """
+ Triggered when the DialogButtonBox has been accepted.
+
+ :rtype: None
+ """
+ if not self._accepted:
+ self._accepted = True
+ animation = self.fadeOut(self._duration)
+
+ if animation:
+ animation.finished.connect(self._acceptAnimationFinished)
+ else:
+ self._acceptAnimationFinished()
+
+ def reject(self):
+ """
+ Triggered when the DialogButtonBox has been rejected.
+
+ :rtype: None
+ """
+ if not self._rejected:
+ self._rejected = True
+ animation = self.fadeOut(self._duration)
+
+ if animation:
+ animation.finished.connect(self._rejectAnimationFinished)
+ else:
+ self._rejectAnimationFinished()
+
+ def _acceptAnimationFinished(self):
+ """
+ Triggered when the animation has finished on accepted.
+
+ :rtype: None
+ """
+ try:
+ self.widget().__class__.accept(self.widget())
+ finally:
+ self.close()
+
+ def _rejectAnimationFinished(self):
+ """
+ Triggered when the animation has finished on rejected.
+
+ :rtype: None
+ """
+ try:
+ self.widget().__class__.reject(self.widget())
+ finally:
+ self.close()
+
+
+def example():
+
+ widget = QtWidgets.QFrame()
+ widget.setStyleSheet("border-radius:3px;background-color:white;")
+ widget.setMinimumWidth(300)
+ widget.setMinimumHeight(300)
+ widget.setMaximumWidth(500)
+
+ lightbox = Lightbox()
+ lightbox.setWidget(widget)
+ lightbox.show()
+
+
+if __name__ == "__main__":
+ with studioqt.app():
+ w = example()
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/lineedit.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/lineedit.py
new file mode 100644
index 0000000..b9fa71d
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/lineedit.py
@@ -0,0 +1,183 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import logging
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+import studioqt
+import studiolibrary
+
+logger = logging.getLogger(__name__)
+
+
+class LineEdit(QtWidgets.QLineEdit):
+
+ def __init__(self, *args):
+ QtWidgets.QLineEdit.__init__(self, *args)
+
+ icon = studiolibrary.resource.icon("search.svg")
+ self._iconButton = QtWidgets.QPushButton(self)
+ self._iconButton.setObjectName("icon")
+ self._iconButton.clicked.connect(self._iconClicked)
+ self._iconButton.setIcon(icon)
+ self._iconButton.setStyleSheet("QPushButton{background-color: transparent;}")
+
+ icon = studiolibrary.resource.icon("times.svg")
+
+ self._clearButton = QtWidgets.QPushButton(self)
+ self._clearButton.setObjectName("clear")
+ self._clearButton.setCursor(QtCore.Qt.ArrowCursor)
+ self._clearButton.setIcon(icon)
+ self._clearButton.setToolTip("Clear all search text")
+ self._clearButton.clicked.connect(self._clearClicked)
+ self._clearButton.setStyleSheet("QPushButton{background-color: transparent;}")
+
+ self.textChanged.connect(self._textChanged)
+
+ color = studioqt.Color.fromString("rgba(250,250,250,115)")
+ self.setIconColor(color)
+
+ self.update()
+
+ def update(self):
+ self.updateIconColor()
+ self.updateClearButton()
+
+ def _textChanged(self, text):
+ """
+ Triggered when the text changes.
+
+ :type text: str
+ :rtype: None
+ """
+ self.updateClearButton()
+
+ def _clearClicked(self):
+ """
+ Triggered when the user clicks the cross icon.
+
+ :rtype: None
+ """
+ self.setText("")
+ self.setFocus()
+
+ def _iconClicked(self):
+ """
+ Triggered when the user clicks on the icon.
+
+ :rtype: None
+ """
+ if not self.hasFocus():
+ self.setFocus()
+
+ def updateClearButton(self):
+ """
+ Update the clear button depending on the current text.
+
+ :rtype: None
+ """
+ text = self.text()
+ if text:
+ self._clearButton.show()
+ else:
+ self._clearButton.hide()
+
+ def contextMenuEvent(self, event):
+ """
+ Triggered when the user right clicks on the search widget.
+
+ :type event: QtCore.QEvent
+ :rtype: None
+ """
+ self.showContextMenu()
+
+ def setIcon(self, icon):
+ """
+ Set the icon for the search widget.
+
+ :type icon: QtWidgets.QIcon
+ :rtype: None
+ """
+ self._iconButton.setIcon(icon)
+
+ def setIconColor(self, color):
+ """
+ Set the icon color for the search widget icon.
+
+ :type color: QtGui.QColor
+ :rtype: None
+ """
+ icon = self._iconButton.icon()
+ icon = studioqt.Icon(icon)
+ icon.setColor(color)
+ self._iconButton.setIcon(icon)
+
+ icon = self._clearButton.icon()
+ icon = studioqt.Icon(icon)
+ icon.setColor(color)
+ self._clearButton.setIcon(icon)
+
+ def updateIconColor(self):
+ """
+ Update the icon colors to the current foregroundRole.
+
+ :rtype: None
+ """
+ color = self.palette().color(self.foregroundRole())
+ color = studioqt.Color.fromColor(color)
+ self.setIconColor(color)
+
+ def settings(self):
+ """
+ Return a dictionary of the current widget state.
+
+ :rtype: dict
+ """
+ settings = {
+ "text": self.text(),
+ }
+ return settings
+
+ def setSettings(self, settings):
+ """
+ Restore the widget state from a settings dictionary.
+
+ :type settings: dict
+ :rtype: None
+ """
+ text = settings.get("text", "")
+ self.setText(text)
+
+ def resizeEvent(self, event):
+ """
+ Reimplemented so the icon maintains the same height as the widget.
+
+ :type event: QtWidgets.QResizeEvent
+ :rtype: None
+ """
+ QtWidgets.QLineEdit.resizeEvent(self, event)
+
+ height = self.height()
+ size = QtCore.QSize(16, 16)
+
+ self.setTextMargins(20, 0, 0, 0)
+
+ self._iconButton.setIconSize(size)
+ self._iconButton.setGeometry(0, 0, height, height)
+
+ x = self.width() - height
+
+ self._clearButton.setIconSize(size)
+ self._clearButton.setGeometry(x, 0, height, height)
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/menubarwidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/menubarwidget.py
new file mode 100644
index 0000000..288905e
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/menubarwidget.py
@@ -0,0 +1,274 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import logging
+
+from studiovendor import six
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+import studioqt
+import studiolibrary
+
+
+logger = logging.getLogger(__name__)
+
+
+class MenuBarWidget(QtWidgets.QToolBar):
+
+ DEFAULT_EXPANDED_HEIGHT = 32
+ DEFAULT_COLLAPSED_HEIGHT = 10
+ ICON_SIZE = 28
+
+ def __init__(self, parent=None):
+ QtWidgets.QToolBar.__init__(self, parent)
+
+ self._dpi = 1
+ self._isExpanded = True
+ self._expandHeight = self.DEFAULT_EXPANDED_HEIGHT
+ self._collapseHeight = self.DEFAULT_COLLAPSED_HEIGHT
+
+ def dpi(self):
+ """
+ Return the zoom multiplier.
+
+ :rtype: float
+ """
+ return self._dpi
+
+ def setDpi(self, dpi):
+ """
+ Set the zoom multiplier.
+
+ Used for high resolution devices.
+
+ :type dpi: float
+ :rtype: None
+ """
+ self._dpi = dpi
+ if self.isExpanded():
+ self.expand()
+ else:
+ self.collapse()
+
+ def mousePressEvent(self, *args):
+ if not self.isExpanded():
+ self.expand()
+
+ def isExpanded(self):
+ """
+ Return True if the menuBarWidget is expanded.
+
+ :rtype: bool
+ """
+ return self._isExpanded
+
+ def expandHeight(self):
+ """
+ Return the height of widget when expanded.
+
+ :rtype: int
+ """
+ return int(self._expandHeight * self.dpi())
+
+ def collapseHeight(self):
+ """
+ Return the height of widget when collapsed.
+
+ :rtype: int
+ """
+ return int(self._collapseHeight * self.dpi())
+
+ def setFixedHeight(self, value):
+ """
+ Overriding this method to also set the height for all child widgets.
+
+ :type value: bool
+ :rtype: None
+ """
+ self.setChildrenHeight(value)
+ QtWidgets.QToolBar.setFixedHeight(self, value)
+
+ def setChildrenHidden(self, value):
+ """
+ Set all child widgets to hidden.
+
+ :type value: bool
+ :rtype: None
+ """
+ for w in self.widgets():
+ w.setHidden(value)
+
+ def setChildrenHeight(self, height):
+ """
+ Set the height of all the child widgets to the given height.
+
+ :type height: int
+ :rtype: None
+ """
+ for w in self.widgets():
+ w.setFixedHeight(height)
+
+ def expand(self):
+ """
+ Expand the MenuBar to the expandHeight.
+
+ :rtype: None
+ """
+ self._isExpanded = True
+ height = self.expandHeight()
+ self.setFixedHeight(height)
+ self.setChildrenHidden(False)
+
+ def collapse(self):
+ """
+ Collapse the MenuBar to the collapseHeight.
+
+ :rtype: None
+ """
+ self._isExpanded = False
+ height = self.collapseHeight()
+ self.setFixedHeight(height)
+ self.setChildrenHeight(0)
+ self.setChildrenHidden(True)
+
+ def updateIconColor(self):
+ color = self.palette().color(self.foregroundRole())
+ color = studioqt.Color.fromColor(color)
+
+ for action in self.actions():
+
+ icon = studioqt.Icon(action.icon())
+
+ try:
+ icon.setBadgeColor(action._badgeColor)
+ icon.setBadgeEnabled(action._badgeEnabled)
+ except AttributeError as error:
+ pass
+
+ icon.setColor(color)
+ action.setIcon(icon)
+
+ def widgets(self):
+ """
+ Return all the widget that are a child of the MenuBarWidget.
+
+ :rtype: list[QtWidgets.QWidget]
+ """
+ widgets = []
+
+ for i in range(0, self.layout().count()):
+ w = self.layout().itemAt(i).widget()
+ if isinstance(w, QtWidgets.QWidget):
+ widgets.append(w)
+
+ return widgets
+
+ def actions(self):
+ """
+ Return all the actions that are a child of the MenuBarWidget.
+
+ :rtype: list[QtWidgets.QAction]
+ """
+ actions = []
+
+ for child in self.children():
+ if isinstance(child, QtWidgets.QAction):
+ actions.append(child)
+
+ return actions
+
+ def findAction(self, text):
+ """
+ Find the action with the given text.
+
+ :rtype: QtWidgets.QAction or None
+ """
+ for child in self.children():
+ if isinstance(child, QtWidgets.QAction):
+ if child.text() == text:
+ return child
+
+ def findToolButton(self, text):
+ """
+ Find the QToolButton with the given text.
+
+ :rtype: QtWidgets.QToolButton or None
+ """
+ for child in self.children():
+ if isinstance(child, QtWidgets.QAction):
+ if child.text() == text:
+ return self.widgetForAction(child)
+
+ def insertAction(self, before, action):
+ """
+ Overriding this method to support the before argument as string.
+
+ :type before: QtWidgets.QAction or str
+ :type action: QtWidgets.QAction
+ :rtype: QtWidgets.QAction
+ """
+ action.setParent(self)
+
+ if isinstance(before, six.string_types):
+ before = self.findAction(before)
+
+ action = QtWidgets.QToolBar.insertAction(self, before, action)
+
+ return action
+
+
+def showExample():
+ """
+ Run a simple example of the widget.
+
+ :rtype: QtWidgets.QWidget
+ """
+
+ with studioqt.app():
+
+ menuBarWidget = MenuBarWidget(None)
+
+ def setIconColor():
+ menuBarWidget.setIconColor(QtGui.QColor(255, 255, 0))
+
+ def collapse():
+ menuBarWidget.collapse()
+
+ menuBarWidget.show()
+
+ action = menuBarWidget.addAction("Collapse")
+ action.triggered.connect(collapse)
+
+ w = QtWidgets.QLineEdit()
+ menuBarWidget.addWidget(w)
+
+ icon = studiolibrary.resource.icon("add")
+ menuBarWidget.addAction(icon, "Plus")
+ menuBarWidget.setStyleSheet("""
+background-color: rgb(0,200,100);
+spacing:5px;
+ """)
+
+ menuBarWidget.setChildrenHeight(50)
+
+ action = QtWidgets.QAction("Yellow", None)
+ action.triggered.connect(setIconColor)
+ menuBarWidget.insertAction("Plus", action)
+ menuBarWidget.setGeometry(400, 400, 400, 100)
+
+ menuBarWidget.expand()
+
+
+if __name__ == "__main__":
+ showExample()
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/messagebox.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/messagebox.py
new file mode 100644
index 0000000..392cd21
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/messagebox.py
@@ -0,0 +1,778 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from .themesmenu import Theme
+
+from studiovendor import six
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+import studioqt
+import studiolibrary
+
+from . import settings
+
+
+def createMessageBox(
+ parent,
+ title,
+ text,
+ width=None,
+ height=None,
+ buttons=None,
+ headerIcon=None,
+ headerColor=None,
+ enableInputEdit=False,
+ enableDontShowCheckBox=False
+):
+ """
+ Open a question message box with the given options.
+
+ :type parent: QWidget
+ :type title: str
+ :type text: str
+ :type buttons: list[QMessageBox.StandardButton]
+ :type headerIcon: str
+ :type headerColor: str
+ :type enableDontShowCheckBox: bool
+
+ :rtype: MessageBox
+ """
+ mb = MessageBox(
+ parent,
+ width=width,
+ height=height,
+ enableInputEdit=enableInputEdit,
+ enableDontShowCheckBox=enableDontShowCheckBox
+ )
+
+ mb.setText(text)
+
+ buttons = buttons or [QtWidgets.QDialogButtonBox.Ok]
+ mb.setButtons(buttons)
+
+ if headerIcon:
+ p = studiolibrary.resource.pixmap(headerIcon)
+ mb.setPixmap(p)
+
+ try:
+ theme = parent.theme()
+ except AttributeError:
+ theme = Theme()
+
+ mb.setStyleSheet(theme.styleSheet())
+
+ headerColor = headerColor or theme.accentColor().toString()
+ headerColor = headerColor or "rgb(50, 150, 200)"
+
+ mb.setHeaderColor(headerColor)
+
+ mb.setWindowTitle(title)
+ mb.setTitleText(title)
+
+ return mb
+
+
+def showMessageBox(
+ parent,
+ title,
+ text,
+ width=None,
+ height=None,
+ buttons=None,
+ headerIcon=None,
+ headerColor=None,
+ enableDontShowCheckBox=False,
+ force=False
+):
+ """
+ Open a question message box with the given options.
+
+ :type parent: QWidget
+ :type title: str
+ :type text: str
+ :type buttons: list[QMessageBox.StandardButton]
+ :type headerIcon: str
+ :type headerColor: str
+ :type enableDontShowCheckBox: bool
+ :type force: bool
+
+ :rtype: MessageBox
+ """
+ key = '{0}MessageBox'.format(title.replace(" ", ""))
+ data = settings.get(key, {})
+
+ clickedButton = data.get("clickedButton", -1)
+ dontShowAgain = data.get("dontShowAgain", False)
+
+ # Force show the dialog if the user is holding the ctrl key down
+ if studioqt.isControlModifier() or studioqt.isAltModifier():
+ force = True
+
+ if force or not dontShowAgain or not enableDontShowCheckBox:
+
+ mb = createMessageBox(
+ parent,
+ title,
+ text,
+ width=width,
+ height=height,
+ buttons=buttons,
+ headerIcon=headerIcon,
+ headerColor=headerColor,
+ enableDontShowCheckBox=enableDontShowCheckBox
+ )
+
+ mb.exec_()
+ mb.close()
+
+ clickedButton = mb.clickedStandardButton()
+ if clickedButton != QtWidgets.QDialogButtonBox.Cancel:
+
+ # Save the button that was clicked by the user
+ settings.set(key,
+ {
+ "clickedButton": mb.clickedIndex(),
+ "dontShowAgain": bool(mb.isDontShowCheckboxChecked()),
+ }
+ )
+
+ return clickedButton
+
+
+class MessageBox(QtWidgets.QDialog):
+
+ @staticmethod
+ def input(
+ parent,
+ title,
+ text,
+ inputText="",
+ width=None,
+ height=None,
+ buttons=None,
+ headerIcon=None,
+ headerColor=None,
+ ):
+ """
+ Convenience dialog to get a single text value from the user.
+
+ :type parent: QWidget
+ :type title: str
+ :type text: str
+ :type width: int
+ :type height: int
+ :type buttons: list[QMessageBox.StandardButton]
+ :type headerIcon: str
+ :type headerColor: str
+ :rtype: QMessageBox.StandardButton
+ """
+ buttons = buttons or [
+ QtWidgets.QDialogButtonBox.Ok,
+ QtWidgets.QDialogButtonBox.Cancel
+ ]
+
+ dialog = createMessageBox(
+ parent,
+ title,
+ text,
+ width=width,
+ height=height,
+ buttons=buttons,
+ headerIcon=headerIcon,
+ headerColor=headerColor,
+ enableInputEdit=True,
+ )
+
+ dialog.setInputText(inputText)
+ dialog.exec_()
+
+ return dialog.inputText(), dialog.clickedText()
+
+ @staticmethod
+ def question(
+ parent,
+ title,
+ text,
+ width=None,
+ height=None,
+ buttons=None,
+ headerIcon=None,
+ headerColor=None,
+ enableDontShowCheckBox=False
+ ):
+ """
+ Open a question message box with the given options.
+
+ :type parent: QWidget
+ :type title: str
+ :type text: str
+ :type headerIcon: str
+ :type headerColor: str
+ :type buttons: list[QMessageBox.StandardButton]
+
+ :rtype: QMessageBox.StandardButton
+ """
+ buttons = buttons or [
+ QtWidgets.QDialogButtonBox.Yes,
+ QtWidgets.QDialogButtonBox.No,
+ QtWidgets.QDialogButtonBox.Cancel
+ ]
+
+ clickedButton = showMessageBox(
+ parent,
+ title,
+ text,
+ width=width,
+ height=height,
+ buttons=buttons,
+ headerIcon=headerIcon,
+ headerColor=headerColor,
+ enableDontShowCheckBox=enableDontShowCheckBox,
+ )
+
+ return clickedButton
+
+ @staticmethod
+ def warning(
+ parent,
+ title,
+ text,
+ width=None,
+ height=None,
+ buttons=None,
+ headerIcon=None,
+ headerColor="rgb(250, 160, 0)",
+ enableDontShowCheckBox=False,
+ force=False,
+ ):
+ """
+ Open a warning message box with the given options.
+
+ :type parent: QWidget
+ :type title: str
+ :type text: str
+ :type buttons: list[QMessageBox.StandardButton]
+ :type headerIcon: str
+ :type headerColor: str
+ :type enableDontShowCheckBox: bool
+ :type force: bool
+
+ :rtype: (QMessageBox.StandardButton, bool)
+ """
+ buttons = buttons or [
+ QtWidgets.QDialogButtonBox.Yes,
+ QtWidgets.QDialogButtonBox.No
+ ]
+
+ clickedButton = showMessageBox(
+ parent,
+ title,
+ text,
+ width=width,
+ height=height,
+ buttons=buttons,
+ headerIcon=headerIcon,
+ headerColor=headerColor,
+ enableDontShowCheckBox=enableDontShowCheckBox,
+ force=force
+ )
+
+ return clickedButton
+
+ @staticmethod
+ def critical(
+ parent,
+ title,
+ text,
+ width=None,
+ height=None,
+ buttons=None,
+ headerIcon=None,
+ headerColor="rgb(230, 80, 80)"
+ ):
+ """
+ Open a critical message box with the given options.
+
+ :type parent: QWidget
+ :type title: str
+ :type text: str
+ :type headerIcon: str
+ :type headerColor: str
+ :type buttons: list[QMessageBox.StandardButton]
+
+ :rtype: QMessageBox.StandardButton
+ """
+ buttons = buttons or [QtWidgets.QDialogButtonBox.Ok]
+
+ clickedButton = showMessageBox(
+ parent,
+ title,
+ text,
+ width=width,
+ height=height,
+ buttons=buttons,
+ headerIcon=headerIcon,
+ headerColor=headerColor
+ )
+
+ return clickedButton
+
+ def __init__(
+ self,
+ parent=None,
+ width=None,
+ height=None,
+ enableInputEdit=False,
+ enableDontShowCheckBox=False
+ ):
+ super(MessageBox, self).__init__(parent)
+ self.setObjectName("messageBox")
+
+ self._frame = None
+ self._animation = None
+ self._dontShowCheckbox = False
+ self._clickedButton = None
+ self._clickedStandardButton = None
+
+ if width:
+ self.setMinimumWidth(width)
+
+ if height:
+ self.setMinimumHeight(height)
+
+ parent = self.parent()
+
+ if parent:
+ parent.installEventFilter(self)
+ self._frame = QtWidgets.QFrame(parent)
+ self._frame.setObjectName("messageBoxFrame")
+ self._frame.show()
+ self.setParent(self._frame)
+
+ self._header = QtWidgets.QFrame(self)
+ self._header.setObjectName("messageBoxHeaderFrame")
+ self._header.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Fixed)
+
+ self._icon = QtWidgets.QLabel(self._header)
+ self._icon.setObjectName("messageBoxIcon")
+ self._icon.hide()
+ self._icon.setScaledContents(True)
+ self._icon.setAlignment(QtCore.Qt.AlignTop)
+ self._icon.setSizePolicy(QtWidgets.QSizePolicy.Preferred,
+ QtWidgets.QSizePolicy.Preferred)
+
+ self._title = QtWidgets.QLabel(self._header)
+ self._title.setObjectName("messageBoxHeaderLabel")
+ self._title.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Expanding)
+
+ hlayout = QtWidgets.QHBoxLayout()
+ hlayout.setContentsMargins(15, 7, 15, 10)
+ hlayout.setSpacing(10)
+ hlayout.addWidget(self._icon)
+ hlayout.addWidget(self._title)
+
+ self._header.setLayout(hlayout)
+
+ bodyLayout = QtWidgets.QVBoxLayout()
+
+ self._body = QtWidgets.QFrame(self)
+ self._body.setObjectName("messageBoxBody")
+ self._body.setLayout(bodyLayout)
+
+ self._message = QtWidgets.QLabel(self._body)
+ self._message.setWordWrap(True)
+ self._message.setMinimumHeight(15)
+ self._message.setAlignment(QtCore.Qt.AlignLeft)
+ self._message.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse)
+ self._message.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Expanding)
+
+ bodyLayout.addWidget(self._message)
+ bodyLayout.setContentsMargins(15, 15, 15, 15)
+
+ if enableInputEdit:
+ self._inputEdit = QtWidgets.QLineEdit(self._body)
+ self._inputEdit.setObjectName("messageBoxInputEdit")
+ self._inputEdit.setFocus()
+
+ bodyLayout.addStretch(1)
+ bodyLayout.addWidget(self._inputEdit)
+ bodyLayout.addStretch(10)
+
+ if enableDontShowCheckBox:
+ msg = "Don't show this message again"
+ self._dontShowCheckbox = QtWidgets.QCheckBox(msg, self._body)
+
+ bodyLayout.addStretch(10)
+ bodyLayout.addWidget(self._dontShowCheckbox)
+ bodyLayout.addStretch(2)
+
+ self._buttonBox = QtWidgets.QDialogButtonBox(None, QtCore.Qt.Horizontal, self)
+ self._buttonBox.clicked.connect(self._clicked)
+ self._buttonBox.accepted.connect(self._accept)
+ self._buttonBox.rejected.connect(self._reject)
+
+ vlayout1 = QtWidgets.QVBoxLayout()
+ vlayout1.setContentsMargins(0, 0, 0, 0)
+
+ vlayout1.addWidget(self._header)
+ vlayout1.addWidget(self._body)
+ bodyLayout.addWidget(self._buttonBox)
+
+ self.setLayout(vlayout1)
+ self.updateGeometry()
+
+ def buttonBox(self):
+ """
+ Return the button box widget for the dialog.
+
+ :rtype: QtGui.QDialogButtonBox
+ """
+ return self._buttonBox
+
+ def addButton(self, *args):
+ """Create a push button with the given text and role"""
+ self.buttonBox().addButton(*args)
+
+ def eventFilter(self, object, event):
+ """
+ Update the geometry when the parent widget changes size.
+
+ :type object: QtWidget.QWidget
+ :type event: QtCore.QEvent
+ :rtype: bool
+ """
+ if event.type() == QtCore.QEvent.Resize:
+ self.updateGeometry()
+ return super(MessageBox, self).eventFilter(object, event)
+
+ def showEvent(self, event):
+ """
+ Fade in the dialog on show.
+
+ :type event: QtCore.QEvent
+ :rtype: None
+ """
+ self.updateGeometry()
+ self.fadeIn()
+
+ def updateGeometry(self):
+ """
+ Update the geometry to be in the center of it's parent.
+
+ :rtype: None
+ """
+ frame = self._frame
+
+ if frame:
+ frame.setGeometry(self._frame.parent().geometry())
+ frame.move(0, 0)
+
+ geometry = self.geometry()
+ centerPoint = frame.geometry().center()
+ geometry.moveCenter(centerPoint)
+ geometry.setY(geometry.y() - 50)
+ self.move(geometry.topLeft())
+
+ def fadeIn(self, duration=400):
+ """
+ Fade in the dialog using the opacity effect.
+
+ :type duration: int
+ :rtype: QtCore.QPropertyAnimation
+ """
+ if self._frame:
+ self._animation = studioqt.fadeIn(self._frame, duration=duration)
+ return self._animation
+
+ def fadeOut(self, duration=400):
+ """
+ Fade out the dialog using the opacity effect.
+
+ :type duration: int
+ :rtype: QtCore.QPropertyAnimation
+ """
+ if self._frame:
+ self._animation = studioqt.fadeOut(self._frame, duration=duration)
+ return self._animation
+
+ def _accept(self):
+ """
+ Triggered when the DialogButtonBox has been accepted.
+
+ :rtype: None
+ """
+ animation = self.fadeOut()
+
+ if animation:
+ animation.finished.connect(self._acceptAnimationFinished)
+ else:
+ self._acceptAnimationFinished()
+
+ def _reject(self):
+ """
+ Triggered when the DialogButtonBox has been rejected.
+
+ :rtype: None
+ """
+ animation = self.fadeOut()
+
+ if animation:
+ animation.finished.connect(self._rejectAnimationFinished)
+ else:
+ self._rejectAnimationFinished()
+
+ def _acceptAnimationFinished(self):
+ """
+ Triggered when the animation has finished on accepted.
+
+ :rtype: None
+ """
+ parent = self._frame or self
+ parent.close()
+ self.accept()
+
+ def _rejectAnimationFinished(self):
+ """
+ Triggered when the animation has finished on rejected.
+
+ :rtype: None
+ """
+ parent = self._frame or self
+ parent.close()
+ self.reject()
+
+ def header(self):
+ """
+ Return the header frame.
+
+ :rtype: QtWidgets.QFrame
+ """
+ return self._header
+
+ def setTitleText(self, text):
+ """
+ Set the title text to be displayed.
+
+ :type text: str
+ :rtype: None
+ """
+ self._title.setText(text)
+
+ def setText(self, text):
+ """
+ Set the text message to be displayed.
+
+ :type text: str
+ :rtype: None
+ """
+ text = six.text_type(text)
+ self._message.setText(text)
+
+ def inputText(self):
+ """
+ Return the text that the user has given the input edit.
+
+ :rtype: str
+ """
+ return self._inputEdit.text()
+
+ def setInputText(self, text):
+ """
+ Set the input text.
+
+ :type text: str
+ """
+ self._inputEdit.setText(text)
+
+ def setButtons(self, buttons):
+ """
+ Set the buttons to be displayed in message box.
+
+ :type buttons: QMessageBox.StandardButton
+ :rtype: None
+ """
+ for button in buttons:
+ if isinstance(button, list) or isinstance(button, tuple):
+ self.buttonBox().addButton(button[0], button[1])
+ else:
+ self.buttonBox().addButton(button)
+
+ def setHeaderColor(self, color):
+ """
+ Set the header color for the message box.
+
+ :type color: str
+ :rtype: None
+ """
+ self.header().setStyleSheet("background-color:" + color)
+
+ def setPixmap(self, pixmap):
+ """
+ Set the pixmap for the message box.
+
+ :type pixmap: QWidgets.QPixmap
+ :rtype: None
+ """
+ self._icon.setPixmap(pixmap)
+ self._icon.show()
+
+ def _clicked(self, button):
+ """
+ Triggered when the user clicks a button.
+
+ :type button: QWidgets.QPushButton
+ :rtype: None
+ """
+ self._clickedButton = button
+ self._clickedStandardButton = self.buttonBox().standardButton(button)
+
+ def clickedIndex(self):
+ """
+ Return the button that was clicked by its index.
+
+ :rtype: int or None
+ """
+ for i, button in enumerate(self.buttonBox().buttons()):
+ if button == self.clickedButton():
+ return i
+
+ def clickedButton(self):
+ """
+ Return the button that was clicked.
+
+ :rtype: QtWidgets.QPushButton or None
+ """
+ return self._clickedButton
+
+ def clickedText(self):
+ return self._clickedButton.text()
+
+ def clickedStandardButton(self):
+ """
+ Return the button that was clicked by the user.
+
+ :rtype: QMessageBox.StandardButton or None
+ """
+ return self._clickedStandardButton
+
+ def isDontShowCheckboxChecked(self):
+ """
+ Return the checked state of the Dont show again checkbox.
+
+ :rtype: bool
+ """
+ if self._dontShowCheckbox:
+ return self._dontShowCheckbox.isChecked()
+ else:
+ return False
+
+ def exec_(self):
+ """
+ Shows the dialog as a modal dialog
+
+ :rtype: int or None
+ """
+ QtWidgets.QDialog.exec_(self)
+ return self.clickedIndex()
+
+
+def testMessageBox():
+
+ with studioqt.app():
+
+ title = "Test question dialog"
+ text = "Would you like to create a snapshot icon?"
+
+ buttons = [
+ QtWidgets.QDialogButtonBox.Yes,
+ QtWidgets.QDialogButtonBox.Ignore,
+ QtWidgets.QDialogButtonBox.Cancel
+ ]
+
+ result = MessageBox.question(None, title, text, buttons=buttons)
+ print(result)
+
+ title = "Test long text message"
+ text = "This is to test a very long message. " \
+ "This is to test a very long message. " \
+ "This is to test a very long message. " \
+ "This is to test a very long message. " \
+ "This is to test a very long message. "
+
+ buttons = [
+ QtWidgets.QDialogButtonBox.Yes,
+ QtWidgets.QDialogButtonBox.Ignore,
+ QtWidgets.QDialogButtonBox.Cancel
+ ]
+
+ result = MessageBox.question(None, title, text, buttons=buttons)
+ print(result)
+
+ title = "Test checkbox"
+ text = "Testing the don't show check box. "
+
+ buttons = [
+ QtWidgets.QDialogButtonBox.Ok,
+ QtWidgets.QDialogButtonBox.Cancel
+ ]
+
+ print(studiolibrary.widgets.MessageBox.input(
+ None,
+ "Rename",
+ "Rename the selected item?",
+ inputText="face.anim",
+ ))
+
+ result = MessageBox.question(
+ None,
+ title,
+ text,
+ buttons=buttons,
+ enableDontShowCheckBox=True
+ )
+ print(result)
+
+ title = "Create a new thumbnail icon"
+ text = "This will override the existing thumbnail. " \
+ "Are you sure you would like to continue?"
+
+ buttons = [
+ QtWidgets.QDialogButtonBox.Yes,
+ QtWidgets.QDialogButtonBox.No
+ ]
+
+ result = MessageBox.warning(
+ None,
+ title,
+ text,
+ buttons=buttons,
+ enableDontShowCheckBox=True
+ )
+ print(result)
+
+ title = "Error saving item!"
+ text = "An error has occurred while saving an item."
+ result = MessageBox.critical(None, title, text)
+ print(result)
+
+ if result == QtWidgets.QDialogButtonBox.Yes:
+ title = "Error while saving!"
+ text = "There was an error while saving"
+ MessageBox.critical(None, title, text)
+
+
+if __name__ == "__main__":
+ testMessageBox()
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/placeholderwidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/placeholderwidget.py
new file mode 100644
index 0000000..4b88ab9
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/placeholderwidget.py
@@ -0,0 +1,22 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from studiovendor.Qt import QtWidgets
+
+import studioqt
+
+
+class PlaceholderWidget(QtWidgets.QWidget):
+
+ def __init__(self, *args):
+ QtWidgets.QWidget.__init__(self, *args)
+ studioqt.loadUi(self)
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/previewwidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/previewwidget.py
new file mode 100644
index 0000000..88b9a66
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/previewwidget.py
@@ -0,0 +1,213 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import os
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+import studioqt
+import studiolibrary.widgets
+
+
+class PreviewWidget(QtWidgets.QWidget):
+
+ def __init__(self, item, *args):
+ QtWidgets.QWidget.__init__(self, *args)
+ studioqt.loadUi(self)
+
+ self._item = item
+
+ widget = self.createTitleWidget()
+ widget.ui.menuButton.clicked.connect(self.showMenu)
+
+ self.ui.titleFrame.layout().addWidget(widget)
+
+ iconGroupBoxWidget = studiolibrary.widgets.GroupBoxWidget("Icon", self.ui.iconGroup)
+ iconGroupBoxWidget.setObjectName("iconGroupBoxWidget")
+ iconGroupBoxWidget.setPersistent(True)
+ self.ui.iconTitleFrame.layout().addWidget(iconGroupBoxWidget)
+
+ schema = item.loadSchema()
+ if schema:
+ self._formWidget = studiolibrary.widgets.FormWidget(self)
+ self._formWidget.setObjectName(item.__class__.__name__ + "Form")
+ self._formWidget.setSchema(item.loadSchema())
+ self._formWidget.setValidator(self.validator)
+
+ self.ui.formFrame.layout().addWidget(self._formWidget)
+
+ self.ui.acceptButton.hide()
+ self.ui.acceptButton.setText("Load")
+ self.ui.acceptButton.clicked.connect(self.accept)
+
+ self.createSequenceWidget()
+
+ self._item.dataChanged.connect(self._itemDataChanged)
+
+ self.updateThumbnailSize()
+
+ def item(self):
+ """
+ Get the current item in preview.
+
+ :rtype: studiolibrary.LibraryItem
+ """
+ return self._item
+
+ def showMenu(self):
+ """
+ Show the edit menu at the current cursor position.
+
+ :rtype: QtWidgets.QAction
+ """
+ menu = QtWidgets.QMenu(self)
+
+ self.item().contextEditMenu(menu)
+
+ point = QtGui.QCursor.pos()
+ point.setX(point.x() + 3)
+ point.setY(point.y() + 3)
+
+ return menu.exec_(point)
+
+ def createTitleWidget(self):
+ """
+ Create a new instance of the title bar widget.
+
+ :rtype: QtWidgets.QFrame
+ """
+ class UI(object):
+ """Proxy class for attaching ui widgets as properties."""
+ pass
+
+ titleWidget = QtWidgets.QFrame(self)
+ titleWidget.setObjectName("titleWidget")
+ titleWidget.ui = UI()
+
+ vlayout = QtWidgets.QVBoxLayout()
+ vlayout.setSpacing(0)
+ vlayout.setContentsMargins(0, 0, 0, 0)
+
+ hlayout = QtWidgets.QHBoxLayout()
+ hlayout.setSpacing(0)
+ hlayout.setContentsMargins(0, 0, 0, 0)
+
+ vlayout.addLayout(hlayout)
+
+ titleButton = QtWidgets.QLabel(self)
+ titleButton.setText(self.item().NAME)
+ titleButton.setObjectName("titleButton")
+ titleWidget.ui.titleButton = titleButton
+
+ hlayout.addWidget(titleButton)
+
+ menuButton = QtWidgets.QPushButton(self)
+ menuButton.setText("...")
+ menuButton.setObjectName("menuButton")
+ titleWidget.ui.menuButton = menuButton
+
+ hlayout.addWidget(menuButton)
+
+ titleWidget.setLayout(vlayout)
+
+ return titleWidget
+
+ def _itemDataChanged(self, *args, **kwargs):
+ """
+ Triggered when the current item data changes.
+
+ :type args: list
+ :type kwargs: dict
+ """
+ self.updateIcon()
+
+ def setTitle(self, title):
+ """
+ Set the title of the preview widget.
+
+ :type title: str
+ """
+ self.ui.titleLabel.setText(title)
+
+ def validator(self, **kwargs):
+ """
+ Validator used for validating the load arguments.
+
+ :type kwargs: dict
+ """
+ self._item.loadValidator(**kwargs)
+ self.updateIcon()
+
+ def createSequenceWidget(self):
+ """
+ Create a sequence widget to replace the static thumbnail widget.
+
+ :rtype: None
+ """
+ self.ui.sequenceWidget = studiolibrary.widgets.ImageSequenceWidget(self.ui.iconFrame)
+
+ self.ui.iconFrame.layout().insertWidget(0, self.ui.sequenceWidget)
+
+ self.updateIcon()
+
+ def updateIcon(self):
+ """Update the thumbnail icon."""
+ icon = self._item.thumbnailIcon()
+ if icon:
+ self.ui.sequenceWidget.setIcon(icon)
+
+ if self._item.imageSequencePath():
+ self.ui.sequenceWidget.setDirname(self.item().imageSequencePath())
+
+ def close(self):
+ """
+ Overriding the close method so save the persistent data.
+
+ :rtype: None
+ """
+ if self._formWidget:
+ self._formWidget.savePersistentValues()
+ QtWidgets.QWidget.close(self)
+
+ def resizeEvent(self, event):
+ """
+ Overriding to adjust the image size when the widget changes size.
+
+ :type event: QtCore.QSizeEvent
+ """
+ self.updateThumbnailSize()
+
+ def updateThumbnailSize(self):
+ """
+ Update the thumbnail button to the size of the widget.
+
+ :rtype: None
+ """
+ width = self.width() - 5
+ if width > 150:
+ width = 150
+
+ size = QtCore.QSize(width, width)
+
+ self.ui.iconFrame.setMaximumSize(size)
+ self.ui.iconGroup.setMaximumHeight(width)
+
+ self.ui.sequenceWidget.setIconSize(size)
+ self.ui.sequenceWidget.setMinimumSize(size)
+ self.ui.sequenceWidget.setMaximumSize(size)
+
+ def accept(self):
+ """Called when the user clicks the load button."""
+ kwargs = self._formWidget.values()
+ self._item.load(**kwargs)
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/searchwidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/searchwidget.py
new file mode 100644
index 0000000..6a73661
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/searchwidget.py
@@ -0,0 +1,356 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import logging
+from functools import partial
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+import studioqt
+import studiolibrary
+
+logger = logging.getLogger(__name__)
+
+
+class SearchWidget(QtWidgets.QLineEdit):
+
+ SPACE_OPERATOR = "and"
+ PLACEHOLDER_TEXT = "Search"
+
+ searchChanged = QtCore.Signal()
+
+ def __init__(self, *args):
+ QtWidgets.QLineEdit.__init__(self, *args)
+
+ self._dataset = None
+ self._spaceOperator = "and"
+ self._iconButton = QtWidgets.QPushButton(self)
+ self._iconButton.setObjectName("searchIconWidget")
+ self._iconButton.clicked.connect(self._iconClicked)
+
+ icon = studiolibrary.resource.icon("magnifying-glass.svg")
+ self.setIcon(icon)
+
+ self._clearButton = QtWidgets.QPushButton(self)
+ self._clearButton.setCursor(QtCore.Qt.ArrowCursor)
+ icon = studiolibrary.resource.icon("xmark")
+ self._clearButton.setIcon(icon)
+ self._clearButton.setToolTip("Clear all search text")
+ self._clearButton.clicked.connect(self._clearClicked)
+ self._clearButton.setStyleSheet("QFrame {background-color: transparent;}")
+
+ self.setPlaceholderText(self.PLACEHOLDER_TEXT)
+ self.textChanged.connect(self._textChanged)
+
+ self.update()
+
+ def update(self):
+ self.updateIconColor()
+ self.updateClearButton()
+
+ def setDataset(self, dataset):
+ """
+ Set the data set for the search widget:
+
+ :type dataset: studiolibrary.Dataset
+ """
+ self._dataset = dataset
+
+ def dataset(self):
+ """
+ Get the data set for the search widget.
+
+ :rtype: studiolibrary.Dataset
+ """
+ return self._dataset
+
+ def _clearClicked(self):
+ """
+ Triggered when the user clicks the cross icon.
+
+ :rtype: None
+ """
+ self.setText("")
+ self.setFocus()
+
+ def _iconClicked(self):
+ """
+ Triggered when the user clicks on the icon.
+
+ :rtype: None
+ """
+ if not self.hasFocus():
+ self.setFocus()
+
+ def _textChanged(self, text):
+ """
+ Triggered when the text changes.
+
+ :type text: str
+ :rtype: None
+ """
+ self.search()
+
+ def search(self):
+ """Run the search query on the data set."""
+ if self.dataset():
+ self.dataset().addQuery(self.query())
+ self.dataset().search()
+ else:
+ logger.info("No dataset found the the search widget.")
+
+ self.updateClearButton()
+ self.searchChanged.emit()
+
+ def query(self):
+ """
+ Get the query used for the data set.
+
+ :rtype: dict
+ """
+ text = str(self.text())
+
+ filters = []
+ for filter_ in text.split(' '):
+ if filter_.split():
+ filters.append(('*', 'contains', filter_))
+
+ uniqueName = 'searchwidget' + str(id(self))
+
+ return {
+ 'name': uniqueName,
+ 'operator': self.spaceOperator(),
+ 'filters': filters
+ }
+
+ def updateClearButton(self):
+ """
+ Update the clear button depending on the current text.
+
+ :rtype: None
+ """
+ text = self.text()
+ if text:
+ self._clearButton.show()
+ else:
+ self._clearButton.hide()
+
+ self.setProperty('hasText', bool(self.text()))
+ self.setStyleSheet(self.styleSheet())
+
+ def contextMenuEvent(self, event):
+ """
+ Triggered when the user right clicks on the search widget.
+
+ :type event: QtCore.QEvent
+ :rtype: None
+ """
+ self.showContextMenu()
+
+ def spaceOperator(self):
+ """
+ Get the space operator for the search widget.
+
+ :rtype: str
+ """
+ return self._spaceOperator
+
+ def setSpaceOperator(self, operator):
+ """
+ Set the space operator for the search widget.
+
+ :type operator: str
+ """
+ self._spaceOperator = operator
+ self.search()
+
+ def createSpaceOperatorMenu(self, parent=None):
+ """
+ Return the menu for changing the space operator.
+
+ :type parent: QGui.QMenu
+ :rtype: QGui.QMenu
+ """
+ menu = QtWidgets.QMenu(parent)
+ menu.setTitle("Space Operator")
+
+ # Create the space operator for the OR operator
+ action = QtWidgets.QAction(menu)
+ action.setText("OR")
+ action.setCheckable(True)
+
+ callback = partial(self.setSpaceOperator, "or")
+ action.triggered.connect(callback)
+
+ if self.spaceOperator() == "or":
+ action.setChecked(True)
+
+ menu.addAction(action)
+
+ # Create the space operator for the AND operator
+ action = QtWidgets.QAction(menu)
+ action.setText("AND")
+ action.setCheckable(True)
+
+ callback = partial(self.setSpaceOperator, "and")
+ action.triggered.connect(callback)
+
+ if self.spaceOperator() == "and":
+ action.setChecked(True)
+
+ menu.addAction(action)
+
+ return menu
+
+ def showContextMenu(self):
+ """
+ Create and show the context menu for the search widget.
+
+ :rtype QtWidgets.QAction
+ """
+ menu = QtWidgets.QMenu(self)
+
+ # Adding a blank icon fixes the text alignment issue when using Qt 5.12.+
+ icon = studiolibrary.resource.icon("blank")
+
+ subMenu = self.createStandardContextMenu()
+ subMenu.setTitle("Edit")
+ subMenu.setIcon(icon)
+
+ menu.addMenu(subMenu)
+
+ subMenu = self.createSpaceOperatorMenu(menu)
+ menu.addMenu(subMenu)
+
+ point = QtGui.QCursor.pos()
+ action = menu.exec_(point)
+
+ return action
+
+ def setIcon(self, icon):
+ """
+ Set the icon for the search widget.
+
+ :type icon: QtWidgets.QIcon
+ :rtype: None
+ """
+ self._iconButton.setIcon(icon)
+
+ def setIconColor(self, color):
+ """
+ Set the icon color for the search widget icon.
+
+ :type color: QtGui.QColor
+ :rtype: None
+ """
+ icon = self._iconButton.icon()
+ icon = studioqt.Icon(icon)
+ icon.setColor(color)
+ self._iconButton.setIcon(icon)
+
+ icon = self._clearButton.icon()
+ icon = studioqt.Icon(icon)
+ icon.setColor(color)
+ self._clearButton.setIcon(icon)
+
+ def updateIconColor(self):
+ """
+ Update the icon colors to the current foregroundRole.
+
+ :rtype: None
+ """
+ color = self.palette().color(self.foregroundRole())
+ color = studioqt.Color.fromColor(color)
+ self.setIconColor(color)
+
+ def settings(self):
+ """
+ Return a dictionary of the current widget state.
+
+ :rtype: dict
+ """
+ settings = {
+ "text": self.text(),
+ "spaceOperator": self.spaceOperator(),
+ }
+ return settings
+
+ def setSettings(self, settings):
+ """
+ Restore the widget state from a settings dictionary.
+
+ :type settings: dict
+ :rtype: None
+ """
+ text = settings.get("text", "")
+ self.setText(text)
+
+ spaceOperator = settings.get("spaceOperator")
+ if spaceOperator:
+ self.setSpaceOperator(spaceOperator)
+
+ def resizeEvent(self, event):
+ """
+ Reimplemented so the icon maintains the same height as the widget.
+
+ :type event: QtWidgets.QResizeEvent
+ :rtype: None
+ """
+ QtWidgets.QLineEdit.resizeEvent(self, event)
+
+ self.setTextMargins(self.height(), 0, 0, 0)
+ size = QtCore.QSize(self.height(), self.height())
+
+ self._iconButton.setFixedSize(size)
+
+ x = self.width() - self.height()
+ self._clearButton.setGeometry(x, 0, self.height(), self.height())
+
+
+def showExample():
+ """
+ Run a simple example of the search widget.
+
+ :rtype: SearchWidget
+ """
+
+ with studioqt.app():
+
+ def searchFinished():
+ print('-' * 25)
+ print('Found: {}'.format(len(dataset.results())))
+
+ for data in dataset.results():
+ print('Match:', data)
+
+ data = [
+ {'text': 'This is a dog'},
+ {'text': 'I love cats'},
+ {'text': 'How man eggs can you eat?'},
+ ]
+
+ dataset = studiolibrary.Dataset()
+ dataset.setData(data)
+ dataset.searchFinished.connect(searchFinished)
+
+ widget = SearchWidget()
+ widget.setDataset(dataset)
+ widget.show()
+
+ return widget
+
+
+
+if __name__ == '__main__':
+ showExample()
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/separatoraction.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/separatoraction.py
new file mode 100644
index 0000000..50934d5
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/separatoraction.py
@@ -0,0 +1,93 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from studiovendor.Qt import QtWidgets
+
+
+__all__ = ["SeparatorAction"]
+
+
+class Line(QtWidgets.QFrame):
+ pass
+
+
+class SeparatorWidgetAction(QtWidgets.QFrame):
+ pass
+
+
+class SeparatorAction(QtWidgets.QWidgetAction):
+
+ def __init__(self, label="", parent=None):
+ """
+ :type parent: QtWidgets.QMenu
+ """
+ QtWidgets.QWidgetAction.__init__(self, parent)
+
+ self._widget = SeparatorWidgetAction(parent)
+
+ self._label = QtWidgets.QLabel(self._widget)
+ self._label.setText(label)
+
+ self._line = Line(self._widget)
+ self._line.setSizePolicy(
+ QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Expanding
+ )
+
+ def setText(self, text):
+ """
+ Set the text of the separator.
+
+ :type text: str
+ :rtype: None
+ """
+ self.label().setText(text)
+
+ def widget(self):
+ """
+ Return the QFrame object.
+
+ :rtype: Frame
+ """
+ return self._widget
+
+ def label(self):
+ """
+ Return the QLabel object.
+
+ :rtype: QtWidgets.QLabel
+ """
+ return self._label
+
+ def line(self):
+ """
+ Return the line widget.
+
+ :rtype: Line
+ """
+ return self._line
+
+ def createWidget(self, menu):
+ """
+ This method is called by the QWidgetAction base class.
+
+ :type menu: QtWidgets.QMenu
+ """
+ actionWidget = self.widget()
+
+ actionLayout = QtWidgets.QHBoxLayout()
+ actionLayout.setContentsMargins(0, 0, 0, 0)
+ actionLayout.addWidget(self.label())
+ actionLayout.addWidget(self.line())
+ actionWidget.setLayout(actionLayout)
+
+ return actionWidget
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sequencewidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sequencewidget.py
new file mode 100644
index 0000000..40577e4
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sequencewidget.py
@@ -0,0 +1,308 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+from studioqt import ImageSequence
+import studioqt
+
+
+__all__ = ['ImageSequenceWidget']
+
+
+STYLE = """
+QToolBar {
+ border: 0px solid black;
+ border-radius:2px;
+ background-color: rgba(0,0,0,100);
+}
+
+QToolButton {
+ background-color: transparent;
+}
+"""
+
+
+class ImageSequenceWidget(QtWidgets.QToolButton):
+
+ DEFAULT_PLAYHEAD_COLOR = QtGui.QColor(255, 255, 255, 220)
+
+ def __init__(self, parent=None, theme=None):
+ QtWidgets.QToolButton.__init__(self, parent)
+
+ self._theme = theme
+
+ self._imageSequence = ImageSequence("")
+ self._imageSequence.frameChanged.connect(self._frameChanged)
+
+ self._toolBar = QtWidgets.QToolBar(self)
+ self._toolBar.setStyleSheet(STYLE)
+
+ studioqt.fadeOut(self._toolBar, duration=0)
+
+ spacer = QtWidgets.QWidget()
+ spacer.setMaximumWidth(4)
+ spacer.setSizePolicy(
+ QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Preferred
+ )
+ self._toolBar.addWidget(spacer)
+
+ spacer = QtWidgets.QWidget()
+ spacer.setMaximumWidth(4)
+ spacer.setSizePolicy(
+ QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Preferred
+ )
+ self._firstSpacer = self._toolBar.addWidget(spacer)
+
+ self.setSize(150, 150)
+ self.setMouseTracking(True)
+
+ def hasFrames(self):
+ """
+ Check if the images sequence has any frames.
+
+ :rtype: bool
+ """
+ return bool(self.firstFrame())
+
+ def firstFrame(self):
+ """
+ Get the first frame in the image sequence.
+
+ :rtype: str
+ """
+ return self._imageSequence.firstFrame()
+
+ def isSequence(self):
+ """
+ Check if the image sequence has more than one frame.
+
+ :rtype: bool
+ """
+ return bool(self._imageSequence.frameCount() > 1)
+
+ def dirname(self):
+ """
+ Get the directory to the image sequence on disk.
+
+ :rtype: str
+ """
+ return self._imageSequence.dirname()
+
+ def addAction(self, path, text, tip, callback):
+ """
+ Add an action to the tool bar.
+
+ :type path: str
+ :type text: str
+ :type tip: str
+ :type callback: func
+
+ :rtype: QtWidgets.QAction
+ """
+ icon = studioqt.Icon.fa(
+ path,
+ color="rgba(250,250,250,160)",
+ color_active="rgba(250,250,250,250)",
+ color_disabled="rgba(0,0,0,20)"
+ )
+
+ action = QtWidgets.QAction(icon, text, self._toolBar)
+ action.setToolTip(tip)
+ # action.setStatusTip(tip)
+ # action.setWhatsThis(tip)
+
+ self._toolBar.insertAction(self._firstSpacer, action)
+ action.triggered.connect(callback)
+
+ return action
+
+ def actions(self):
+ """
+ Get all the actions that are a child of the ToolBar.
+
+ :rtype: list[QtWidgets.QAction]
+ """
+ actions = []
+
+ for child in self._toolBar.children():
+ if isinstance(child, QtWidgets.QAction):
+ actions.append(child)
+
+ return actions
+
+ def resizeEvent(self, event):
+ """
+ Called when the widget is resized.
+
+ :type event: QtWidgets.QResizeEvent
+ """
+ self.updateToolBar()
+
+ def updateToolBar(self):
+ """Update the tool bar size depending on the number of actions."""
+ dpi = 1.0
+ if self._theme:
+ dpi = self._theme.dpi()
+
+ self._toolBar.setIconSize(QtCore.QSize(16*dpi, 16*dpi))
+
+ count = (len(self.actions())) - 3
+ width = ((26*dpi) * count)
+
+ self._toolBar.setGeometry(0, 0, width, 25*dpi)
+
+ x = self.rect().center().x() - (self._toolBar.width()/2)
+ y = self.height() - self._toolBar.height() - (12*dpi)
+ width = self._toolBar.width()
+
+ self._toolBar.setGeometry(x, y, width, self._toolBar.height())
+
+ def isControlModifier(self):
+ """
+ Check if the control modifier is active.
+
+ :rtype: bool
+ """
+ modifiers = QtWidgets.QApplication.keyboardModifiers()
+ return modifiers == QtCore.Qt.ControlModifier
+
+ def setSize(self, w, h):
+ """
+ Reimplemented so that the icon size is set at the same time.
+
+ :type w: int
+ :type h: int
+ :rtype: None
+ """
+ self._size = QtCore.QSize(w, h)
+ self.setIconSize(self._size)
+ self.setFixedSize(self._size)
+
+ def setPath(self, path):
+ """
+ Set a single frame image sequence.
+
+ :type path: str
+ """
+ self._imageSequence.setPath(path)
+ self.updateIcon()
+
+ def setDirname(self, dirname):
+ """
+ This method has been deprecated.
+
+ Please use setPath instead.
+
+ :type dirname: str
+ """
+ self._imageSequence.setPath(dirname)
+ self.updateIcon()
+
+ def updateIcon(self):
+ """Update the icon for the current frame."""
+ if self._imageSequence.frames():
+ icon = self._imageSequence.currentIcon()
+ self.setIcon(icon)
+
+ def enterEvent(self, event):
+ """
+ Start playing the image sequence when the mouse enters the widget.
+
+ :type event: QtCore.QEvent
+ :rtype: None
+ """
+ self._imageSequence.start()
+ studioqt.fadeIn(self._toolBar, duration=300)
+
+ def leaveEvent(self, event):
+ """
+ Stop playing the image sequence when the mouse leaves the widget.
+
+ :type event: QtCore.QEvent
+ :rtype: None
+ """
+ self._imageSequence.pause()
+ studioqt.fadeOut(self._toolBar, duration=300)
+
+ def mouseMoveEvent(self, event):
+ """
+ Reimplemented to add support for scrubbing.
+
+ :type event: QtCore.QEvent
+ :rtype: None
+ """
+ if self.isControlModifier() and self._imageSequence.frameCount() > 1:
+ percent = 1.0 - (float(self.width() - event.pos().x()) / float(self.width()))
+ frame = int(self._imageSequence.frameCount() * percent)
+ self._imageSequence.jumpToFrame(frame)
+ icon = self._imageSequence.currentIcon()
+ self.setIcon(icon)
+
+ def _frameChanged(self, frame=None):
+ """
+ Triggered when the image sequence changes frame.
+
+ :type frame: int or None
+ :rtype: None
+ """
+ if not self.isControlModifier():
+ icon = self._imageSequence.currentIcon()
+ self.setIcon(icon)
+
+ def currentFilename(self):
+ """
+ Return the current image location.
+
+ :rtype: str
+ """
+ return self._imageSequence.currentFilename()
+
+ def playheadHeight(self):
+ """
+ Return the height of the playhead.
+
+ :rtype: int
+ """
+ return 4
+
+ def paintEvent(self, event):
+ """
+ Triggered on frame changed.
+
+ :type event: QtCore.QEvent
+ :rtype: None
+ """
+ QtWidgets.QToolButton.paintEvent(self, event)
+
+ painter = QtGui.QPainter()
+ painter.begin(self)
+
+ if self.currentFilename() and self._imageSequence.frameCount() > 1:
+
+ r = event.rect()
+
+ playheadHeight = self.playheadHeight()
+ playheadPosition = self._imageSequence.percent() * r.width()-1
+
+ x = r.x()
+ y = self.height() - playheadHeight
+
+ painter.setPen(QtCore.Qt.NoPen)
+ painter.setBrush(QtGui.QBrush(self.DEFAULT_PLAYHEAD_COLOR))
+ painter.drawRect(x, y, playheadPosition, playheadHeight)
+
+ painter.end()
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/settings.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/settings.py
new file mode 100644
index 0000000..41179f2
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/settings.py
@@ -0,0 +1,78 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import studiolibrary
+
+_settings = None
+
+
+def path():
+ """
+ Get the settings path.
+
+ :rtype: str
+ """
+ return studiolibrary.localPath("widgets2.json")
+
+
+def get(key, default=None):
+ """
+ Convenience function for getting the a value from disc.
+
+ :type key: str
+ :type default: object
+ :rtype: object
+ """
+ return read().get(key, default)
+
+
+def set(key, value):
+ """
+ Convenience function for setting key values to disc.
+
+ :type key: str
+ :type value: object
+ """
+ save({key: value})
+
+
+def read():
+ """
+ Return the local settings from the location of the SETTING_PATH.
+
+ :rtype: dict
+ """
+ global _settings
+
+ if not _settings:
+ _settings = studiolibrary.readJson(path())
+
+ return _settings
+
+
+def save(data):
+ """
+ Save the given dict to the local location of the SETTING_PATH.
+
+ :type data: dict
+ :rtype: None
+ """
+ global _settings
+ _settings = None
+ studiolibrary.updateJson(path(), data)
+
+
+def reset():
+ """Remove and reset the item settings."""
+ global _settings
+ _settings = None
+ studiolibrary.removePath(path())
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sidebarwidget/__init__.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sidebarwidget/__init__.py
new file mode 100644
index 0000000..ab543dd
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sidebarwidget/__init__.py
@@ -0,0 +1,12 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+from .sidebarwidget import SidebarWidget
\ No newline at end of file
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sidebarwidget/sidebarwidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sidebarwidget/sidebarwidget.py
new file mode 100644
index 0000000..3362f15
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sidebarwidget/sidebarwidget.py
@@ -0,0 +1,1256 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import time
+import logging
+import functools
+import collections
+
+from studiovendor import six
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+import studioqt
+import studiolibrary
+import studiolibrary.widgets
+
+from .sidebarwidgetitem import SidebarWidgetItem
+
+
+__all__ = ["SidebarWidget"]
+
+logger = logging.getLogger(__name__)
+
+
+DEFAULT_SEPARATOR = "/"
+
+
+def pathsToDict(paths, root="", separator=None):
+ """
+ Return the given paths as a nested dict.
+
+ Example:
+ paths = ["/fruit/apple", "/fruit/orange"]
+ print pathsToDict(paths)
+ # Result: {"fruit" : {"apple":{}}, {"orange":{}}}
+
+ :type paths: list[str]
+ :type root: str
+ :type separator: str or None
+ :rtype: dict
+ """
+ separator = separator or DEFAULT_SEPARATOR
+ results = collections.OrderedDict()
+ paths = studiolibrary.normPaths(paths)
+
+ for path in paths:
+ p = results
+
+ # This is to add support for grouping by the given root path.
+ if root and root in path:
+ path = path.replace(root, "")
+ p = p.setdefault(root, collections.OrderedDict())
+
+ keys = path.split(separator)[0:]
+
+ for key in keys:
+ if key:
+ p = p.setdefault(key, collections.OrderedDict())
+
+ return results
+
+
+def findRoot(paths, separator=None):
+ """
+ Find the common path for the given paths.
+
+ Example:
+ paths = [
+ '/fruit/apple',
+ '/fruit/orange',
+ '/fruit/banana'
+ ]
+ print(findRoot(paths))
+ # '/fruit'
+
+ :type paths: list[str]
+ :type separator: str
+ :rtype: str
+ """
+ if paths:
+ path = list(paths)[0] # Only need one from the list to verify the common path.
+ else:
+ path = ""
+
+ result = None
+ separator = separator or DEFAULT_SEPARATOR
+
+ tokens = path.split(separator)
+
+ for i, token in enumerate(tokens):
+ root = separator.join(tokens[:i+1])
+ match = True
+
+ for path in paths:
+ if not path.startswith(root + separator):
+ match = False
+ break
+
+ if not match:
+ break
+
+ result = root
+
+ return result
+
+
+
+class SidebarWidget(QtWidgets.QWidget):
+
+ itemDropped = QtCore.Signal(object)
+ itemRenamed = QtCore.Signal(str, str)
+ itemSelectionChanged = QtCore.Signal()
+ settingsMenuRequested = QtCore.Signal(object)
+
+ def __init__(self, *args):
+ super(SidebarWidget, self).__init__(*args)
+
+ self._dataset = None
+ self._lineEdit = None
+ self._previousFilterText = ""
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.setSpacing(0)
+ layout.setContentsMargins(0,0,0,0)
+
+ self.setLayout(layout)
+
+ self._treeWidget = TreeWidget(self)
+ self._treeWidget.itemDropped = self.itemDropped
+ self._treeWidget.itemRenamed = self.itemRenamed
+ self._treeWidget.itemSelectionChanged.connect(self._itemSelectionChanged)
+
+ self._titleWidget = self.createTitleWidget()
+ self._titleWidget.ui.menuButton.clicked.connect(self.showSettingsMenu)
+ self._titleWidget.ui.titleButton.clicked.connect(self.clearSelection)
+
+ self.layout().addWidget(self._titleWidget)
+ self.layout().addWidget(self._treeWidget)
+
+ self._treeWidget.installEventFilter(self)
+
+ def _itemSelectionChanged(self, *args):
+ self.itemSelectionChanged.emit()
+
+ def eventFilter(self, obj, event):
+ """Using an event filter to show the search widget on key press."""
+ if event.type() == QtCore.QEvent.KeyPress:
+ self._keyPressEvent(event)
+
+ return super(SidebarWidget, self).eventFilter(obj, event)
+
+ def _keyPressEvent(self, event):
+ """
+ Triggered from the tree widget key press event.
+
+ :type event: QKeyEvent
+ """
+ text = event.text().strip()
+
+ if not text.isalpha() and not text.isdigit():
+ return
+
+ if text and not self._titleWidget.ui.filterEdit.hasFocus():
+ self._titleWidget.ui.filterEdit.setText(text)
+
+ self.setFilterVisible(True)
+
+ self._previousFilterText = text
+
+ def _filterVisibleTrigger(self, visible):
+ """
+ Triggered by the filter visible action.
+
+ :type visible: bool
+ """
+ self.setFilterVisible(visible)
+ self._titleWidget.ui.filterEdit.selectAll()
+
+ def createTitleWidget(self):
+ """
+ Create a new instance of the title bar widget.
+
+ :rtype: QtWidgets.QFrame
+ """
+
+ class UI(object):
+ """Proxy class for attaching ui widgets as properties."""
+ pass
+
+ titleWidget = QtWidgets.QFrame(self)
+ titleWidget.setObjectName("titleWidget")
+ titleWidget.ui = UI()
+
+ vlayout = QtWidgets.QVBoxLayout()
+ vlayout.setSpacing(0)
+ vlayout.setContentsMargins(0,0,0,0)
+
+ hlayout = QtWidgets.QHBoxLayout()
+ hlayout.setSpacing(0)
+ hlayout.setContentsMargins(0,0,0,0)
+
+ vlayout.addLayout(hlayout)
+
+ titleButton = QtWidgets.QPushButton(self)
+ titleButton.setText("Folders")
+ titleButton.setObjectName("titleButton")
+ titleWidget.ui.titleButton = titleButton
+
+ hlayout.addWidget(titleButton)
+
+ menuButton = QtWidgets.QPushButton(self)
+ menuButton.setText("...")
+ menuButton.setObjectName("menuButton")
+ titleWidget.ui.menuButton = menuButton
+
+ hlayout.addWidget(menuButton)
+
+ self._lineEdit = studiolibrary.widgets.LineEdit(self)
+ self._lineEdit.hide()
+ self._lineEdit.setObjectName("filterEdit")
+ self._lineEdit.setText(self.treeWidget().filterText())
+ self._lineEdit.textChanged.connect(self.searchChanged)
+ titleWidget.ui.filterEdit = self._lineEdit
+
+ vlayout.addWidget(self._lineEdit)
+
+ titleWidget.setLayout(vlayout)
+
+ return titleWidget
+
+ def _dataChanged(self):
+ pass
+
+ def setDataset(self, dataset):
+ """
+ Set the dataset for the search widget:
+
+ :type dataset: studioqt.Dataset
+ """
+ self._dataset = dataset
+ self._dataset.dataChanged.connect(self._dataChanged)
+ self._dataChanged()
+
+ def dataset(self):
+ """
+ Get the dataset for the search widget.
+
+ :rtype: studioqt.Dataset
+ """
+ return self._dataset
+
+ def search(self):
+ """Run the dataset search."""
+ if self.dataset():
+ self.dataset().addQuery(self.query())
+ self.dataset().search()
+ else:
+ logger.info('No dataset found for the sidebar widget.')
+
+ def query(self):
+ """
+ Get the query for the sidebar widget.
+
+ :rtype: dict
+ """
+ filters = []
+
+ for path in self.selectedPaths():
+ if self.isRecursive():
+ suffix = "" if path.endswith("/") else "/"
+
+ filter_ = ('folder', 'startswith', path + suffix)
+ filters.append(filter_)
+
+ filter_ = ('folder', 'is', path)
+ filters.append(filter_)
+
+ uniqueName = 'sidebar_widget_' + str(id(self))
+ return {'name': uniqueName, 'operator': 'or', 'filters': filters}
+
+ def searchChanged(self, text):
+ """
+ Triggered when the search filter has changed.
+
+ :type text: str
+ """
+ self.refreshFilter()
+ if text:
+ self.setFilterVisible(True)
+ else:
+ self.treeWidget().setFocus()
+ self.setFilterVisible(False)
+
+ def showSettingsMenu(self):
+ """Create and show a new settings menu instance."""
+
+ menu = studioqt.Menu(self)
+
+ self.settingsMenuRequested.emit(menu)
+
+ self.createSettingsMenu(menu)
+
+ point = QtGui.QCursor.pos()
+ point.setX(point.x() + 3)
+ point.setY(point.y() + 3)
+ action = menu.exec_(point)
+ menu.close()
+
+ def createSettingsMenu(self, menu):
+ """
+ Create a new settings menu instance.
+
+ :rtype: QMenu
+ """
+ action = menu.addAction("Show Filter")
+ action.setCheckable(True)
+ action.setChecked(self.isFilterVisible())
+
+ callback = functools.partial(self._filterVisibleTrigger, not self.isFilterVisible())
+ action.triggered.connect(callback)
+
+ action = menu.addAction("Show Icons")
+ action.setCheckable(True)
+ action.setChecked(self.iconsVisible())
+
+ callback = functools.partial(self.setIconsVisible, not self.iconsVisible())
+ action.triggered.connect(callback)
+
+ action = menu.addAction("Show Root Folder")
+ action.setCheckable(True)
+ action.setChecked(self.isRootVisible())
+
+ callback = functools.partial(self.setRootVisible, not self.isRootVisible())
+ action.triggered.connect(callback)
+
+ return menu
+
+ def setFilterVisible(self, visible):
+ """
+ Set the filter widget visible
+
+ :type visible: bool
+ """
+ self._titleWidget.ui.filterEdit.setVisible(visible)
+ self._titleWidget.ui.filterEdit.setFocus()
+
+ if not visible and bool(self.treeWidget().filterText()):
+ self.treeWidget().setFilterText("")
+ else:
+ self.refreshFilter()
+
+ def setSettings(self, settings):
+ """
+ Set the settings for the widget.
+
+ :type settings: dict
+ """
+ self.treeWidget().setSettings(settings)
+
+ value = settings.get("filterVisible")
+ if value is not None:
+ self.setFilterVisible(value)
+
+ value = settings.get("filterText")
+ if value is not None:
+ self.setFilterText(value)
+
+ def settings(self):
+ """
+ Get the settings for the widget.
+
+ :rtype: dict
+ """
+ settings = self.treeWidget().settings()
+
+ settings["filterText"] = self.filterText()
+ settings["filterVisible"] = self.isFilterVisible()
+
+ return settings
+
+ # --------------------------------
+ # convenience methods
+ # --------------------------------
+
+ def filterText(self):
+ return self.treeWidget().filterText()
+
+ def setFilterText(self, text):
+ self._titleWidget.ui.filterEdit.setText(text)
+
+ def refreshFilter(self):
+ self.treeWidget().setFilterText(self._titleWidget.ui.filterEdit.text())
+
+ def isFilterVisible(self):
+ return bool(self.treeWidget().filterText()) or self._titleWidget.ui.filterEdit.isVisible()
+
+ def setIconsVisible(self, visible):
+ self.treeWidget().setIconsVisible(visible)
+
+ def iconsVisible(self):
+ return self.treeWidget().iconsVisible()
+
+ def setRootVisible(self, visible):
+ self.treeWidget().setRootVisible(visible)
+
+ def isRootVisible(self):
+ return self.treeWidget().isRootVisible()
+
+ def treeWidget(self):
+ return self._treeWidget
+
+ def setDpi(self, dpi):
+ self.treeWidget().setDpi(dpi)
+
+ def setRecursive(self, enabled):
+ self.treeWidget().setRecursive(enabled)
+
+ def isRecursive(self):
+ return self.treeWidget().isRecursive()
+
+ def setData(self, *args, **kwargs):
+ self.treeWidget().setData(*args, **kwargs)
+
+ def setItemData(self, id, data):
+ self.treeWidget().setPathSettings(id, data)
+
+ def setLocked(self, locked):
+ self.treeWidget().setLocked(locked)
+
+ def selectedPath(self):
+ return self.treeWidget().selectedPath()
+
+ def selectPaths(self, paths):
+ self.treeWidget().selectPaths(paths)
+
+ def selectedPaths(self):
+ return self.treeWidget().selectedPaths()
+
+ def clearSelection(self):
+ self.treeWidget().clearSelection()
+
+
+class TreeWidget(QtWidgets.QTreeWidget):
+
+ itemDropped = QtCore.Signal(object)
+ itemRenamed = QtCore.Signal(str, str)
+ itemSelectionChanged = QtCore.Signal()
+
+ def __init__(self, *args):
+ super(TreeWidget, self).__init__(*args)
+
+ self._dpi = 1
+ self._data = []
+ self._items = []
+ self._index = {}
+ self._locked = False
+ self._dataset = None
+ self._recursive = True
+ self._filterText = ""
+ self._rootVisible = False
+ self._iconsVisible = True
+
+ self._options = {
+ 'field': 'path',
+ 'separator': '/',
+ 'recursive': True,
+ 'autoRootPath': True,
+ 'rootText': 'FOLDERS',
+ 'sortBy': None,
+ 'queries': [{'filters': [('type', 'is', 'Folder')]}]
+ }
+
+ self.itemExpanded.connect(self.update)
+ self.itemCollapsed.connect(self.update)
+
+ self.setDpi(1)
+
+ self.setAcceptDrops(True)
+ self.setHeaderHidden(True)
+ self.setFrameShape(QtWidgets.QFrame.NoFrame)
+ self.setSelectionMode(QtWidgets.QTreeWidget.ExtendedSelection)
+ self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+ self.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel)
+
+ def filterText(self):
+ """
+ Get the current filter text.
+
+ :rtype: bool
+ """
+ return self._filterText
+
+ def setFilterText(self, text):
+ """
+ Triggered when the search filter has changed.
+
+ :type text: str
+ """
+ self._filterText = text.strip()
+ self.refreshFilter()
+
+ def refreshFilter(self):
+ """Refresh the current item filter."""
+ items = self.items()
+
+ for item in items:
+ if self._filterText.lower() in item.text(0).lower():
+ item.setHidden(False)
+ for parent in item.parents():
+ parent.setHidden(False)
+ else:
+ item.setHidden(True)
+
+ def clear(self):
+ """Clear all the items from the tree widget."""
+ self._items = []
+ self._index = {}
+ super(TreeWidget, self).clear()
+
+ def setRootVisible(self, visible):
+ """
+ Set the root item visible.
+
+ :type visible: bool
+ """
+ self._rootVisible = visible
+ self.refreshData()
+
+ def isRootVisible(self):
+ """
+ Check if the root item is visible
+
+ :rtype: bool
+ """
+ return self._rootVisible
+
+ def setIconsVisible(self, visible):
+ """
+ Set all icons visible.
+
+ :type visible: bool
+ """
+ self._iconsVisible = visible
+ self.refreshData()
+
+ def iconsVisible(self):
+ """
+ Check if all the icons are visible.
+
+ :rtype: bool
+ """
+ return self._iconsVisible
+
+ def selectionChanged(self, *args):
+ """Triggered the current selection has changed."""
+ self.parent().search()
+
+ def setRecursive(self, enable):
+ """
+ Set the search query on the dataset to be recursive.
+
+ :type enable: bool
+ """
+ self._recursive = enable
+ self.parent().search()
+
+ def isRecursive(self):
+ """
+ Get the recursive query enable state.
+
+ :rtype: bool
+ """
+ return self._recursive
+
+ def sortBy(self):
+ """
+ Get the sortby field.
+
+ :rtype: str
+ """
+ return self._options.get('sortBy', [self.field()])
+
+ def field(self):
+ """
+ Get the field.
+
+ :rtype: str
+ """
+ return self._options.get('field', '')
+
+ def rootText(self):
+ """
+ Get the root text.
+
+ :rtype: str
+ """
+ return self._options.get('rootText')
+
+ def separator(self):
+ """
+ Get the separator used in the fields to separate level values.
+
+ :rtype: str
+ """
+ return self._options.get('separator', DEFAULT_SEPARATOR)
+
+ def _dataChanged(self):
+ """Triggered when the data set has changed."""
+ pass
+ # data = collections.OrderedDict()
+ # queries = self._options.get("queries")
+ #
+ # items = self.dataset().findItems(queries)
+ #
+ # for item in items:
+ # itemData = item.itemData()
+ # value = itemData.get(self.field())
+ # data[value] = {'iconPath': itemData.get('iconPath')}
+ #
+ # if data:
+ # root = findRoot(data.keys(), separator=self.separator())
+ # self.setPaths(data, root=root)
+
+ def setLocked(self, locked):
+ """
+ Set the widget items to read only mode.
+
+ :type locked: bool
+ :rtype: None
+ """
+ self._locked = locked
+
+ def isLocked(self):
+ """
+ Return True if the items are in read only mode
+
+ :rtype: bool
+ """
+ return self._locked
+
+ def itemAt(self, pos):
+ """
+ :type pos: QtGui.QPoint
+ :rtype: None or Folder
+ """
+ index = self.indexAt(pos)
+ if not index.isValid():
+ return
+
+ item = self.itemFromIndex(index)
+ return item
+
+ def dropEvent(self, event):
+ """
+ :type event: QtCore.QEvent
+ :rtype: None
+ """
+ if self.isLocked():
+ logger.debug("Folder is locked! Cannot accept drop!")
+ return
+
+ self.itemDropped.emit(event)
+
+ def dragMoveEvent(self, event):
+ """
+ :type event: QtCore.QEvent
+ :rtype: None
+ """
+ mimeData = event.mimeData()
+
+ if mimeData.hasUrls():
+ event.accept()
+ else:
+ event.ignore()
+
+ item = self.itemAt(event.pos())
+ if item:
+ self.selectPaths([item.path()])
+
+ def dragEnterEvent(self, event):
+ """
+ :type event: QtCore.QEvent
+ :rtype: None
+ """
+ event.accept()
+
+ def selectItem(self, item):
+ """
+ :type item: NavigationWidgetItem
+ :rtype: None
+ """
+ self.selectPaths([item.path()])
+
+ def dpi(self):
+ """
+ Return the dots per inch multiplier.
+
+ :rtype: float
+ """
+ return self._dpi
+
+ def setDpi(self, dpi):
+ """
+ Set the dots per inch multiplier.
+
+ :type dpi: float
+ :rtype: None
+ """
+ self._dpi = dpi
+
+ width = 20 * dpi
+ height = 18 * dpi
+
+ self.setIndentation(9 * dpi)
+ self.setMinimumWidth(20 * dpi)
+ self.setIconSize(QtCore.QSize(width, height))
+ self.setStyleSheet("height: {height}px;".format(height=height))
+
+ def update(self, *args):
+ """
+ :rtype: None
+ """
+ for item in self.items():
+ item.update()
+
+ def items(self):
+ """
+ Return a list of all the items in the tree widget.
+
+ :rtype: list[NavigationWidgetItem]
+ """
+ items = self.findItems(
+ "*",
+ QtCore.Qt.MatchWildcard | QtCore.Qt.MatchRecursive
+ )
+
+ return items
+
+ def itemFromUrl(self, url):
+ """
+ Return the item for the given url.
+
+ :type url: QtCore.QUrl
+ :rtype: NavigationWidgetItem
+ """
+ for item in self.items():
+ if url == item.url():
+ return item
+
+ def itemFromPath(self, path):
+ """
+ Return the item for the given path.
+
+ :type path: str
+ :rtype: NavigationWidgetItem
+ """
+ return self._index.get(path)
+
+ def settings(self):
+ """
+ Return a dictionary of the settings for this widget.
+
+ :rtype: dict
+ """
+ settings = {}
+
+ scrollBar = self.verticalScrollBar()
+ settings["verticalScrollBar"] = {
+ "value": scrollBar.value()
+ }
+
+ scrollBar = self.horizontalScrollBar()
+ settings["horizontalScrollBar"] = {
+ "value": scrollBar.value()
+ }
+
+ for item in self.items():
+ itemSettings = item.settings()
+ if itemSettings:
+ settings[item.path()] = item.settings()
+
+ return settings
+
+ def setSettings(self, settings):
+ """
+ Set the settings for this widget
+
+ :type settings: dict
+ """
+ for path in sorted(settings.keys()):
+ s = settings.get(path, None)
+ self.setPathSettings(path, s)
+
+ scrollBarSettings = settings.get("verticalScrollBar", {})
+ value = scrollBarSettings.get("value")
+ if value:
+ self.verticalScrollBar().setValue(value)
+
+ scrollBarSettings = settings.get("horizontalScrollBar", {})
+ value = scrollBarSettings.get("value")
+ if value:
+ self.horizontalScrollBar().setValue(value)
+
+ self.setDpi(self.dpi())
+
+ def setPathSettings(self, path, settings):
+ """
+ Show the context menu at the given position.
+
+ :type path: str
+ :type settings: dict
+ :rtype: None
+ """
+ item = self.itemFromPath(path)
+ if item and settings:
+ item.setSettings(settings)
+
+ def showContextMenu(self, position):
+ """
+ Show the context menu at the given position.
+
+ :type position: QtCore.QPoint
+ :rtype: None
+ """
+ menu = self.createContextMenu()
+ menu.exec_(self.viewport().mapToGlobal(position))
+
+ def expandedItems(self):
+ """
+ Return all the expanded items.
+
+ :rtype: list[NavigationWidgetItem]
+ """
+ for item in self.items():
+ if self.isItemExpanded(item):
+ yield item
+
+ def expandedPaths(self):
+ """
+ Return all the expanded paths.
+
+ :rtype: list[NavigationWidgetItem]
+ """
+ for item in self.expandedItems():
+ yield item.url()
+
+ def setExpandedPaths(self, paths):
+ """
+ Set the given paths to expanded.
+
+ :type paths: list[str]
+ """
+ for item in self.items():
+ if item.url() in paths:
+ item.setExpanded(True)
+
+ def selectedItem(self):
+ """
+ Return the last selected item
+
+ :rtype: SidebarWidgetItem
+ """
+ path = self.selectedPath()
+ return self.itemFromPath(path)
+
+ def selectedPath(self):
+ """
+ Return the last selected path
+
+ :rtype: str or None
+ """
+ paths = self.selectedPaths()
+ if paths:
+ return paths[-1]
+
+ def selectedPaths(self):
+ """
+ Return the paths that are selected.
+
+ :rtype: list[str]
+ """
+ paths = []
+ items = self.selectedItems()
+ for item in items:
+ path = item.path()
+ paths.append(path)
+ return studiolibrary.normPaths(paths)
+
+
+ def selectPath(self, path):
+ """
+ Select the given path
+
+ :type: str
+ :rtype: None
+ """
+ self.selectPaths([path])
+
+ def selectPaths(self, paths):
+ """
+ Select the items with the given paths.
+
+ :type paths: list[str]
+ :rtype: None
+ """
+ paths = studiolibrary.normPaths(paths)
+ items = self.items()
+ for item in items:
+ if studiolibrary.normPath(item.path()) in paths:
+ item.setSelected(True)
+ else:
+ item.setSelected(False)
+
+ def selectUrl(self, url):
+ """
+ Select the item with the given url.
+
+ :type url: str
+ :rtype: None
+ """
+ items = self.items()
+
+ for item in items:
+ if item.url() == url:
+ item.setSelected(True)
+ else:
+ item.setSelected(False)
+
+ def selectedUrls(self):
+ """
+ Return the urls for the selected items.
+
+ :rtype: list[str]
+ """
+ urls = []
+ items = self.selectedItems()
+ for item in items:
+ urls.append(item.url())
+ return urls
+
+ def setPaths(self, *args, **kwargs):
+ """
+ This method has been deprecated.
+ """
+ logger.warning("This method has been deprecated!")
+ self.setData(*args, **kwargs)
+
+ def refreshData(self):
+ self.setData(self._data)
+
+ def setData(self, data, root="", split=None):
+ """
+ Set the items to the given items.
+
+ :type data: list[str]
+ :type root: str
+ :type split: str
+ :rtype: None
+ """
+ self._data = data
+
+ settings = self.settings()
+
+ self.blockSignals(True)
+
+ self.clear()
+
+ if not root:
+ root = findRoot(data.keys(), self.separator())
+
+ self.addPaths(data, root=root, split=split)
+
+ self.setSettings(settings)
+
+ self.blockSignals(False)
+
+ self.parent().search()
+
+ def addPaths(self, paths, root="", split=None):
+ """
+ Set the given items as a flat list.
+
+ :type paths: list[str]
+ :type root: str or None
+ :type split: str or None
+ """
+ data = pathsToDict(paths, root=root, separator=split)
+ self.createItems(data, split=split)
+
+ if isinstance(paths, dict):
+ self.setSettings(paths)
+
+ def createItems(self, data, split=None):
+ """
+ Create the items from the given data dict
+
+ :type data: dict
+ :type split: str or None
+
+ :rtype: None
+ """
+ split = split or DEFAULT_SEPARATOR
+
+ self._index = {}
+
+ for key in data:
+
+ root = split.join([key])
+
+ item = None
+
+ if self.isRootVisible():
+
+ text = key.split(split)
+ if text:
+ text = text[-1]
+ else:
+ text = key
+
+ item = SidebarWidgetItem(self)
+ item.setText(0, six.text_type(text))
+ item.setPath(root)
+ item.setExpanded(True)
+
+ self._index[root] = item
+
+ def _recursive(parent, children, split=None, root=""):
+ for text, val in sorted(children.items()):
+
+ if not parent:
+ parent = self
+
+ path = split.join([root, text])
+ path = studiolibrary.normPath(path)
+
+ child = SidebarWidgetItem(parent)
+ child.setText(0, six.text_type(text))
+ child.setPath(path)
+
+ self._index[path] = child
+
+ _recursive(child, val, split=split, root=path)
+
+ _recursive(item, data[key], split=split, root=root)
+
+ self.update()
+ self.refreshFilter()
+
+
+class ExampleWindow(QtWidgets.QWidget):
+
+ def __init__(self, *args):
+ QtWidgets.QWidget.__init__(self, *args)
+
+ layout = QtWidgets.QVBoxLayout()
+ self.setLayout(layout)
+
+ self._lineEdit = QtWidgets.QLineEdit()
+ self._lineEdit.textChanged.connect(self.searchChanged)
+ self._treeWidget = TreeWidget(self)
+
+ self._slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
+ self._slider.valueChanged.connect(self._valueChanged)
+ self._slider.setRange(50, 200)
+ self._slider.setValue(100)
+ self._slider.setFixedHeight(18)
+
+ layout.addWidget(self._slider)
+ layout.addWidget(self._lineEdit)
+ layout.addWidget(self._treeWidget)
+
+ self._treeWidget.itemClicked.connect(self.itemClicked)
+ self._treeWidget.itemSelectionChanged.connect(self.selectionChanged)
+
+ self.update()
+
+ def _valueChanged(self, value):
+ self.update()
+
+ def update(self):
+ import studiolibrary
+
+ value = self._slider.value()
+ value = value / 100.0
+
+ theme = studiolibrary.widgets.Theme()
+ theme.setDpi(value)
+
+ self._treeWidget.setDpi(value)
+ self._treeWidget.setStyleSheet(theme.styleSheet())
+
+ def setData(self, *args, **kwargs):
+ self._treeWidget.setData(*args, **kwargs)
+
+ def itemClicked(self):
+ print("ITEM CLICKED")
+ print(self._treeWidget.settings())
+
+ items = self._treeWidget.selectedItems()
+ for item in items:
+ print(item.path())
+
+ def selectionChanged(self, *args):
+ print("SELECTION CHANGED", args)
+
+ def searchChanged(self, text):
+ print("SEARCH CHANGED", text)
+
+ items = self._treeWidget.items()
+
+ t = time.time()
+
+ self._treeWidget.expandAll()
+
+ for item in items:
+ if text.lower() in item.text(0).lower():
+ item.setHidden(False)
+ for parent in item.parents():
+ parent.setHidden(False)
+ else:
+ item.setHidden(True)
+
+ print(time.time() - t)
+
+
+def runTests():
+
+ paths = [
+ '/fruit/apple',
+ '/fruit/orange',
+ '/fruit/banana'
+ ]
+
+ assert findRoot(paths) == '/fruit'
+
+ paths = [
+ '/fruit/apple',
+ '/fruit/orange',
+ '/fruit/banana',
+ '/tesla/cars'
+ ]
+
+ assert findRoot(paths) == ''
+
+ data = pathsToDict(paths)
+
+ assert 'fruit' in data
+ assert 'apple' in data.get('fruit')
+ assert 'orange' in data.get('fruit')
+ assert 'banana' in data.get('fruit')
+ assert 'cars' in data.get('tesla')
+
+ paths = [
+ '>tesla>car>modelS',
+ '>tesla>car>modelX',
+ '>tesla>car>model3',
+ ]
+
+ assert findRoot(paths, separator='>') == '>tesla>car'
+
+ data = pathsToDict(paths, separator='>')
+
+ assert 'tesla' in data
+ assert 'modelS' in data.get('tesla').get('car')
+ assert 'modelX' in data.get('tesla').get('car')
+ assert 'model3' in data.get('tesla').get('car')
+
+
+def showExampleWindow():
+
+ data = {
+ "P:/production/shared/anim": {
+ "text": "FOLDERS",
+ "bold": True,
+ "isExpanded": True,
+ "iconPath": "none",
+ "iconColor": "rgb(100, 100, 150)",
+ "textColor": "rgba(100, 100, 150, 150)"
+ },
+
+ "P:/production/shared/anim/walks/fast.anim": {},
+ "P:/production/shared/anim/walks/slow.anim": {},
+ "P:/production/shared/anim/rigs/prop.rig": {},
+ "P:/production/shared/anim/rigs/character.rig": {},
+
+ "Users/libraries/animation/Character/Boris/stressed.pose": {},
+ "Users/libraries/animation/Character/Boris/smile.pose": {},
+ "Users/libraries/animation/Character/Cornilous/normal.pose": {},
+ "Users/libraries/animation/Character/Cornilous/relaxed.pose": {},
+ "Users/libraries/animation/Character/Cornilous/surprised.pose": {},
+ "Users/libraries/animation/Character/Figaro/test.anim": {},
+ "Users/libraries/animation/Character/Figaro/anim/hiccup.anim": {},
+
+ "props/car/color/red": {},
+ "props/car/color/orange": {},
+ "props/car/color/yellow": {},
+ "props/plane/color/blue": {},
+ "props/plane/color/green": {},
+
+ "/": {},
+ "/Hello": {},
+ "/Hello/World": {},
+ "/Test/World": {},
+
+ "tags": {
+ "text": "TAGS",
+ "bold": True,
+ "isExpanded": True,
+ "iconPath": "none",
+ "iconColor": "rgb(100, 100, 150)",
+ "textColor": "rgba(100, 100, 150, 150)"
+ },
+ "tags/red": {
+ "iconColor": "rgb(200, 50, 50)",
+ "iconPath": "../../resource/icons/circle.png"
+ },
+ "tags/orange": {
+ "bold": True,
+ "textColor": "rgb(250, 150, 50)",
+ "iconColor": "rgb(250, 150, 50)",
+ "iconPath": "../../resource/icons/circle.png"
+ },
+ "tags/yellow": {
+ "iconColor": "rgb(250, 200, 0)",
+ "iconPath": "../../resource/icons/circle.png"
+ },
+ "tags/blue": {
+ "iconColor": "rgb(50, 150, 250)",
+ "iconPath": "../../resource/icons/circle.png"
+ },
+ "tags/green": {
+ "iconColor": "rgb(100, 200, 0)",
+ "iconPath": "../../resource/icons/circle.png"
+ }
+ }
+
+ window = ExampleWindow(None)
+ window.setData(data)
+ window.show()
+ window.setGeometry(300, 300, 300, 600)
+ return window
+
+
+if __name__ == "__main__":
+ with studioqt.app():
+ w = showExampleWindow()
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sidebarwidget/sidebarwidgetitem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sidebarwidget/sidebarwidgetitem.py
new file mode 100644
index 0000000..76ae166
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sidebarwidget/sidebarwidgetitem.py
@@ -0,0 +1,392 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import os
+import logging
+
+from studiovendor import six
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+import studioqt
+import studiolibrary
+
+
+__all__ = ["SidebarWidgetItem"]
+
+
+logger = logging.getLogger(__name__)
+
+
+class SidebarWidgetItem(QtWidgets.QTreeWidgetItem):
+
+ PIXMAP_CACHE = {}
+
+ def __init__(self, *args):
+ QtWidgets.QTreeWidgetItem.__init__(self, *args)
+
+ self._path = ""
+ self._bold = None
+ self._iconVisible = True
+ self._iconPath = None
+ self._iconColor = None
+ self._textColor = None
+ self._iconKey = None
+ self._expandedIconPath = None
+ self._collapsedIconPath = None
+
+ self._settings = {}
+
+ def iconPath(self):
+ """
+ Return the icon path for the item.
+
+ :rtype: str
+ """
+ return self._iconPath or self.defaultIconPath()
+
+ def createPixmap(self, path, color):
+ """
+ Create a new Pixmap from the given path.
+
+ :type path: str
+ :type color: str or QtCore.QColor
+ :rtype: QtCore.QPixmap
+ """
+ dpi = self.treeWidget().dpi()
+ key = path + color + "DPI-" + str(dpi)
+ pixmap = self.PIXMAP_CACHE.get(key)
+
+ if not pixmap:
+
+ width = 20 * dpi
+ height = 18 * dpi
+
+ if "/" not in path and "\\" not in path:
+ path = studiolibrary.resource.get("icons", path)
+
+ if not os.path.exists(path):
+ path = self.defaultIconPath()
+
+ pixmap2 = studioqt.Pixmap(path)
+ pixmap2.setColor(color)
+ pixmap2 = pixmap2.scaled(
+ 16 * dpi,
+ 16 * dpi,
+ QtCore.Qt.KeepAspectRatio,
+ QtCore.Qt.SmoothTransformation
+ )
+
+ x = (width - pixmap2.width()) / 2
+ y = (height - pixmap2.height()) / 2
+
+ pixmap = QtGui.QPixmap(QtCore.QSize(width, height))
+ pixmap.fill(QtCore.Qt.transparent)
+
+ painter = QtGui.QPainter(pixmap)
+ painter.drawPixmap(x, y, pixmap2)
+ painter.end()
+
+ self.PIXMAP_CACHE[key] = pixmap
+
+ return pixmap
+
+ def expandedIconPath(self):
+ """
+ Return the icon path to be shown when expanded.
+
+ :rtype: str
+ """
+ return self._iconPath or studiolibrary.resource.get("icons", "folder_open.png")
+
+ def collapsedIconPath(self):
+ """
+ Return the icon path to be shown when collapsed.
+
+ :rtype: str
+ """
+ return self._iconPath or self.defaultIconPath()
+
+ def defaultIconPath(self):
+ """
+ Return the default icon path.
+
+ :rtype: str
+ """
+ return studiolibrary.resource.get("icons", "folder.svg")
+
+ def setIconPath(self, path):
+ """
+ Return the icon path for the item.
+
+ :type path: str
+ :rtype: None
+ """
+ self._iconPath = path
+ self.updateIcon()
+
+ def setIconVisible(self, visible):
+ """
+ Set the icon visibility for the folder item
+
+ :type visible: bool
+ """
+ self._iconVisible = visible
+
+ def isIconVisible(self):
+ """
+ Check if the icon is visible.
+
+ :rtype: bool
+ """
+ return self.treeWidget().iconsVisible() and self._iconVisible
+
+ def iconColor(self):
+ """
+ Return the icon color.
+
+ :rtype: QtGui.QColor or None
+ """
+ return self._iconColor or self.defaultIconColor()
+
+ def defaultIconColor(self):
+ """
+ Return the default icon color.
+
+ :rtype: QtGui.QColor or None
+ """
+ palette = self.treeWidget().palette()
+
+ color = palette.color(self.treeWidget().foregroundRole())
+ color = studioqt.Color.fromColor(color).toString()
+
+ return str(color)
+
+ def setIconColor(self, color):
+ """
+ Set the icon color.
+
+ :type color: QtGui.QColor or str
+ :rtype: None
+ """
+ if color:
+
+ if isinstance(color, QtGui.QColor):
+ color = studioqt.Color.fromColor(color)
+
+ elif isinstance(color, six.string_types):
+ color = studioqt.Color.fromString(color)
+
+ self._iconColor = color.toString()
+ else:
+ self._iconColor = None
+
+ self.updateIcon()
+
+ def setPath(self, path):
+ """
+ Set the path for the navigation item.
+
+ :type path: str
+ :rtype: None
+ """
+ self._path = path
+
+ def path(self):
+ """
+ Return the item path.
+
+ :rtype: str
+ """
+ return self._path
+
+ def parents(self):
+ """
+ Return all item parents.
+
+ :rtype: list[SidebarWidgetItem]
+ """
+ parents = []
+ parent = self.parent()
+
+ if parent:
+ parents.append(parent)
+
+ while parent.parent():
+ parent = parent.parent()
+ parents.append(parent)
+
+ return parents
+
+ def url(self):
+ """
+ Return the url path.
+
+ :rtype: str
+ """
+ return QtCore.QUrl(self.path())
+
+ def update(self):
+ """
+ :rtype: None
+ """
+ self.updateIcon()
+
+ def updateIcon(self):
+ """
+ Force the icon to update.
+
+ :rtype: None
+ """
+ if self.isIconVisible():
+ if self.isExpanded():
+ path = self.expandedIconPath()
+ else:
+ path = self.collapsedIconPath()
+
+ pixmap = self.createPixmap(path, self.iconColor())
+
+ self.setIcon(0, pixmap)
+
+ def bold(self):
+ """
+ Returns true if weight() is a value greater than QFont::Normal
+
+ :rtype: bool
+ """
+ return self.font(0).bold()
+
+ def setBold(self, enable):
+ """
+ If enable is true sets the font's weight to
+
+ :rtype: bool
+ """
+ if enable:
+ self._settings["bold"] = enable
+
+ font = self.font(0)
+ font.setBold(enable)
+ self.setFont(0, font)
+
+ def setTextColor(self, color):
+ """
+ Set the foreground color to the given color
+
+ :type color: QtGui.QColor or str
+ :rtype: None
+ """
+ if isinstance(color, QtGui.QColor):
+ color = studioqt.Color.fromColor(color)
+
+ elif isinstance(color, six.string_types):
+ color = studioqt.Color.fromString(color)
+
+ self._settings["textColor"] = color.toString()
+
+ brush = QtGui.QBrush()
+ brush.setColor(color)
+ self.setForeground(0, brush)
+
+ def textColor(self):
+ """
+ Return the foreground color the item.
+
+ :rtype: QtGui.QColor
+ """
+ color = self.foreground(0).color()
+ return studioqt.Color.fromColor(color)
+
+ def settings(self):
+ """
+ Return the current state of the item as a dictionary.
+
+ :rtype: dict
+ """
+ settings = {}
+
+ isSelected = self.isSelected()
+ if isSelected:
+ settings["selected"] = isSelected
+
+ isExpanded = self.isExpanded()
+ if isExpanded:
+ settings["expanded"] = isExpanded
+
+ bold = self._settings.get("bold")
+ if bold:
+ settings["bold"] = bold
+
+ textColor = self._settings.get("textColor")
+ if textColor:
+ settings["textColor"] = textColor
+
+ return settings
+
+ def setExpandedParents(self, expanded):
+ """
+ Set all the parents of the item to the value of expanded.
+
+ :type expanded: bool
+ :rtype: None
+ """
+ parents = self.parents()
+ for parent in parents:
+ parent.setExpanded(expanded)
+
+ def setSelected(self, select):
+ """
+ Sets the selected state of the item to select.
+
+ :type select: bool
+ :rtype: None
+ """
+ QtWidgets.QTreeWidgetItem.setSelected(self, select)
+
+ if select:
+ self.setExpandedParents(select)
+
+ def setSettings(self, settings):
+ """
+ Set the current state of the item from a dictionary.
+
+ :type settings: dict
+ """
+ text = settings.get("text")
+ if text:
+ self.setText(0, text)
+
+ iconPath = settings.get("icon")
+ if iconPath is not None:
+ self.setIconPath(iconPath)
+
+ iconColor = settings.get("color")
+ if iconColor is not None:
+ self.setIconColor(iconColor)
+
+ selected = settings.get("selected")
+ if selected is not None:
+ self.setSelected(selected)
+
+ expanded = settings.get("expanded")
+ if expanded is not None and self.childCount() > 0:
+ self.setExpanded(expanded)
+ self.updateIcon()
+
+ bold = settings.get("bold")
+ if bold is not None:
+ self.setBold(bold)
+
+ textColor = settings.get("textColor")
+ if textColor:
+ self.setTextColor(textColor)
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/slideraction.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/slideraction.py
new file mode 100644
index 0000000..7cc92e2
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/slideraction.py
@@ -0,0 +1,81 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+
+__all__ = ["SliderAction"]
+
+
+class SliderWidgetAction(QtWidgets.QFrame):
+ pass
+
+
+class SliderAction(QtWidgets.QWidgetAction):
+
+ def __init__(self, label="", parent=None):
+ """
+ :type parent: QtWidgets.QMenu
+ """
+ QtWidgets.QWidgetAction.__init__(self, parent)
+
+ self._widget = SliderWidgetAction(parent)
+ self._label = QtWidgets.QLabel(label, self._widget)
+
+ self._slider = QtWidgets.QSlider(QtCore.Qt.Horizontal, self._widget)
+ self._slider.setSizePolicy(
+ QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Expanding
+ )
+
+ self.valueChanged = self._slider.valueChanged
+
+ def widget(self):
+ """
+ Return the widget for this action.
+
+ :rtype: QtWidgets.QWidget
+ """
+ return self._widget
+
+ def label(self):
+ """
+ Return the QLabel object.
+
+ :rtype: QtWidgets.QLabel
+ """
+ return self._label
+
+ def slider(self):
+ """
+ Return the QLabel object.
+
+ :rtype: QtWidgets.QSlider
+ """
+ return self._slider
+
+ def createWidget(self, menu):
+ """
+ This method is called by the QWidgetAction base class.
+
+ :type menu: QtWidgets.QMenu
+ """
+ actionWidget = self.widget()
+
+ actionLayout = QtWidgets.QHBoxLayout()
+ actionLayout.setContentsMargins(0, 0, 0, 0)
+ actionLayout.addWidget(self.label())
+ actionLayout.addWidget(self.slider())
+ actionWidget.setLayout(actionLayout)
+
+ return actionWidget
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sortbymenu.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sortbymenu.py
new file mode 100644
index 0000000..586aa0a
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sortbymenu.py
@@ -0,0 +1,111 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from functools import partial
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtWidgets
+
+from .separatoraction import SeparatorAction
+
+
+class SortByMenu(QtWidgets.QMenu):
+
+ def __init__(self, name, parent, dataset):
+ super(SortByMenu, self).__init__(name, parent)
+
+ self._dataset = dataset
+ self.aboutToShow.connect(self.populateMenu)
+
+ def setDataset(self, dataset):
+ """
+ Set the dataset model for the menu:
+
+ :type dataset: studiolibrary.Dataset
+ """
+ self._dataset = dataset
+
+ def dataset(self):
+ """
+ Get the dataset model for the menu.
+
+ :rtype: studiolibrary.Dataset
+ """
+ return self._dataset
+
+ def setSortBy(self, sortName, sortOrder):
+ """
+ Set the sort by value for the dataset.
+
+ :type sortName: str
+ :type sortOrder: str
+ """
+ if sortName == "Custom Order":
+ sortOrder = "asc"
+
+ value = sortName + ":" + sortOrder
+ self.dataset().setSortBy([value])
+ self.dataset().search()
+
+ def populateMenu(self):
+ """
+ Show the menu options.
+ """
+ self.clear()
+
+ sortby = self.dataset().sortBy()
+ if sortby:
+ currentField = self.dataset().sortBy()[0].split(":")[0]
+ currentOrder = "dsc" if "dsc" in self.dataset().sortBy()[0] else "asc"
+ else:
+ currentField = ""
+ currentOrder = ""
+
+ action = SeparatorAction("Sort By", self)
+ self.addAction(action)
+
+ fields = self.dataset().fields()
+
+ for field in fields:
+
+ if not field.get("sortable"):
+ continue
+
+ name = field.get("name")
+
+ action = self.addAction(name.title())
+ action.setCheckable(True)
+
+ if currentField == name:
+ action.setChecked(True)
+ else:
+ action.setChecked(False)
+
+ callback = partial(self.setSortBy, name, currentOrder)
+ action.triggered.connect(callback)
+
+ action = SeparatorAction("Sort Order", self)
+ self.addAction(action)
+
+ action = self.addAction("Ascending")
+ action.setCheckable(True)
+ action.setChecked(currentOrder == "asc")
+
+ callback = partial(self.setSortBy, currentField, "asc")
+ action.triggered.connect(callback)
+
+ action = self.addAction("Descending")
+ action.setCheckable(True)
+ action.setChecked(currentOrder == "dsc")
+
+ callback = partial(self.setSortBy, currentField, "dsc")
+ action.triggered.connect(callback)
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/statuswidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/statuswidget.py
new file mode 100644
index 0000000..f004d71
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/statuswidget.py
@@ -0,0 +1,235 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from studiovendor import six
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+import studiolibrary
+
+
+class ProgressBar(QtWidgets.QFrame):
+
+ def __init__(self, *args):
+ QtWidgets.QFrame.__init__(self, *args)
+
+ layout = QtWidgets.QHBoxLayout()
+ layout.setSpacing(0)
+ layout.setContentsMargins(0, 0, 0, 0)
+
+ self._label = QtWidgets.QLabel("", self)
+ self._label.setAlignment(
+ QtCore.Qt.AlignRight |
+ QtCore.Qt.AlignVCenter
+ )
+ self._label.setSizePolicy(
+ QtWidgets.QSizePolicy.Preferred,
+ QtWidgets.QSizePolicy.Preferred
+ )
+
+ layout.addWidget(self._label)
+
+ self._progressBar = QtWidgets.QProgressBar(self)
+ self._progressBar.setFormat("")
+ self._progressBar.setRange(0, 100)
+ self._progressBar.setSizePolicy(
+ QtWidgets.QSizePolicy.Preferred,
+ QtWidgets.QSizePolicy.Preferred
+ )
+
+ layout.addWidget(self._progressBar)
+
+ self.setLayout(layout)
+
+ def reset(self):
+ """Reimplementing for convenience"""
+ self._progressBar.reset()
+
+ def setText(self, text):
+ """
+ Reimplementing for convenience
+
+ :type text: str
+ """
+ self._label.setText(text)
+
+ def setValue(self, value):
+ """
+ Reimplementing for convenience
+
+ :type value: float or int
+ """
+ self._progressBar.setValue(value)
+
+ def setRange(self, min_, max_):
+ """
+ Reimplementing for convenience
+
+ :type min_: int
+ :type max_: int
+ """
+ self._progressBar.setRange(min_, max_)
+
+
+class StatusWidget(QtWidgets.QFrame):
+
+ DEFAULT_DISPLAY_TIME = 10000 # Milliseconds, 15 secs
+
+ def __init__(self, *args):
+ QtWidgets.QFrame.__init__(self, *args)
+
+ self.setObjectName("statusWidget")
+ self.setFrameShape(QtWidgets.QFrame.NoFrame)
+
+ self._blocking = False
+ self._timer = QtCore.QTimer(self)
+
+ self._label = QtWidgets.QLabel("", self)
+ self._label.setCursor(QtCore.Qt.IBeamCursor)
+ self._label.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse)
+ self._label.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Preferred)
+
+ self._button = QtWidgets.QPushButton(self)
+ self._button.setMaximumSize(QtCore.QSize(17, 17))
+ self._button.setIconSize(QtCore.QSize(17, 17))
+
+ self._progressBar = ProgressBar(self)
+ self._progressBar.hide()
+
+ layout = QtWidgets.QHBoxLayout()
+ layout.setContentsMargins(1, 0, 0, 0)
+
+ layout.addWidget(self._button)
+ layout.addWidget(self._label)
+ layout.addWidget(self._progressBar)
+
+ self.setLayout(layout)
+ self.setFixedHeight(19)
+ self.setMinimumWidth(5)
+
+ self._timer.timeout.connect(self.reset)
+
+ def progressBar(self):
+ """
+ Get the progress widget
+
+ rtype: QtWidgets.QProgressBar
+ """
+ return self._progressBar
+
+ def isBlocking(self):
+ """
+ Return true if the status widget is blocking, otherwise return false.
+ :rtype: bool
+ """
+ return self._blocking
+
+ def showInfoMessage(self, message, msecs=None):
+ """
+ Set an info message to be displayed in the status widget.
+
+ :type message: str
+ :type msecs: int
+
+ :rtype: None
+ """
+ if self.isBlocking():
+ return
+
+ self.setProperty("status", "info")
+
+ icon = studiolibrary.resource.icon("info")
+ self.showMessage(message, icon, msecs)
+
+ def setProperty(self, *args):
+ """
+ Overriding this method to force the style sheet to reload.
+
+ :type args: list
+ """
+ super(StatusWidget, self).setProperty(*args)
+ self.setStyleSheet(self.styleSheet())
+
+ def showErrorMessage(self, message, msecs=None):
+ """
+ Set an error to be displayed in the status widget.
+
+ :type message: str
+ :type msecs: int
+
+ :rtype: None
+ """
+ self.setProperty("status", "error")
+
+ icon = studiolibrary.resource.icon("error")
+ self.showMessage(message, icon, msecs, blocking=True)
+
+ def showWarningMessage(self, message, msecs=None):
+ """
+ Set a warning to be displayed in the status widget.
+
+ :type message: str
+ :type msecs: int
+
+ :rtype: None
+ """
+ if self.isBlocking():
+ return
+
+ self.setProperty("status", "warning")
+
+ icon = studiolibrary.resource.icon("warning")
+ self.showMessage(message, icon, msecs)
+
+ def showMessage(self, message, icon, msecs=None, blocking=False):
+ """
+ Set the given text to be displayed in the status widget.
+
+ :type message: str
+ :type icon: icon
+ :type msecs: int
+
+ :rtype: None
+ """
+ msecs = msecs or self.DEFAULT_DISPLAY_TIME
+
+ self._blocking = blocking
+
+ if icon:
+ self._button.setIcon(icon)
+ self._button.show()
+ else:
+ self._button.hide()
+
+ if message:
+ self._label.setText(six.text_type(message))
+ self._timer.stop()
+ self._timer.start(msecs)
+ else:
+ self.reset()
+
+ self.update()
+
+ def reset(self):
+ """
+ Called when the current animation has finished.
+
+ :rtype: None
+ """
+ self._timer.stop()
+ self._button.hide()
+ self._label.setText("")
+ icon = studiolibrary.resource.icon("blank")
+ self._button.setIcon(icon)
+ self.setProperty("status", "")
+ self._blocking = False
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/themesmenu.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/themesmenu.py
new file mode 100644
index 0000000..8c4d7b1
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/themesmenu.py
@@ -0,0 +1,658 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+from studiovendor import six
+
+import studioqt
+import studiolibrary
+
+from .separatoraction import SeparatorAction
+
+
+__all__ = ["Theme", "ThemeAction", "ThemesMenu"]
+
+
+THEME_PRESETS = [
+ {
+ "name": "Blue",
+ "accentColor": "rgba(50, 180, 240, 255)",
+ "backgroundColor": None,
+ },
+ {
+ "name": "Green",
+ "accentColor": "rgba(80, 200, 140, 255)",
+ "backgroundColor": None,
+ },
+ {
+ "name": "Yellow",
+ "accentColor": "rgb(250, 200, 0)",
+ "backgroundColor": None,
+ },
+ {
+ "name": "Orange",
+ "accentColor": "rgb(255, 170, 0)",
+ "backgroundColor": None,
+ },
+ {
+ "name": "Peach",
+ "accentColor": "rgb(255, 125, 100)",
+ "backgroundColor": None,
+ },
+ {
+ "name": "Red",
+ "accentColor": "rgb(230, 60, 60)",
+ "backgroundColor": None,
+ },
+ {
+ "name": "Pink",
+ "accentColor": "rgb(255, 87, 123)",
+ "backgroundColor": None,
+ },
+ {
+ "name": "Purple",
+ "accentColor": "rgb(110, 110, 240)",
+ "backgroundColor": None,
+ },
+ {
+ "name": "Dark",
+ "accentColor": None,
+ "backgroundColor": "rgb(60, 64, 79)",
+ },
+ {
+ "name": "Grey",
+ "accentColor": None,
+ "backgroundColor": "rgb(60, 60, 60)",
+ },
+ {
+ "name": "Light",
+ "accentColor": None,
+ "backgroundColor": "rgb(245, 245, 255)",
+ },
+]
+
+
+def themePresets():
+ """
+ Return the default theme presets.
+
+ :rtype list[Theme]
+ """
+ themes = []
+
+ for data in THEME_PRESETS:
+ theme = Theme()
+
+ theme.setName(data.get("name"))
+ theme.setAccentColor(data.get("accentColor"))
+ theme.setBackgroundColor(data.get("backgroundColor"))
+
+ themes.append(theme)
+
+ return themes
+
+
+class ThemeAction(QtWidgets.QAction):
+
+ def __init__(self, theme, *args):
+ """
+ :type theme: Theme
+ :type menu: QtWidgets.QMenu
+ :rtype: QtWidgets.QAction
+ """
+ QtWidgets.QAction.__init__(self, theme.name(), *args)
+ self._theme = theme
+
+ if theme.accentColor():
+ color = theme.accentColor()
+ elif theme.backgroundColor():
+ color = theme.backgroundColor()
+ else:
+ color = "rgb(255,255,255)"
+
+ icon = studiolibrary.resource.icon(ThemesMenu.THEME_ICON, color=color)
+ self.setIcon(icon)
+
+ def theme(self):
+ """
+ Return the theme object for the action.
+
+ :rtype: Theme
+ """
+ return self._theme
+
+
+class ThemesMenu(QtWidgets.QMenu):
+
+ THEME_ICON = "radio_button_checked_white"
+
+ ENABLE_CUSTOM_ACTION = True
+
+ def __init__(self, parent, theme, themes=None):
+ """
+ :type themes: list[Theme]
+ :rtype: QtWidgets.QMenu
+ """
+ QtWidgets.QMenu.__init__(self, "Themes", parent)
+
+ self._theme = theme
+ self._themes = themes
+
+ self.createActions()
+
+ def createActions(self):
+ """
+ Crate the actions to be shown in the menu.
+
+ :rtype: None
+ """
+ # Create the menu actions for setting the accent color
+ action = SeparatorAction("Accent", self)
+ self.addAction(action)
+
+ themes = self._themes
+
+ if not themes:
+ themes = themePresets()
+
+ for theme in themes:
+ if theme.accentColor():
+ action = ThemeAction(theme, self)
+ self.addAction(action)
+
+ if self.ENABLE_CUSTOM_ACTION:
+ action = QtWidgets.QAction("Custom", self)
+ action.triggered.connect(self.theme().browseAccentColor)
+ color = self.theme().accentColor().toString()
+ icon = studiolibrary.resource.icon(ThemesMenu.THEME_ICON, color=color)
+ action.setIcon(icon)
+ self.addAction(action)
+
+ # Create the menu actions for setting the background color
+ action = SeparatorAction("Background", self)
+ self.addAction(action)
+
+ for theme in themes:
+ if not theme.accentColor() and theme.backgroundColor():
+ action = ThemeAction(theme, self)
+ self.addAction(action)
+
+ if self.ENABLE_CUSTOM_ACTION:
+ action = QtWidgets.QAction("Custom", self)
+ action.triggered.connect(self._theme.browseBackgroundColor)
+ color = self._theme.backgroundColor().toString()
+ icon = studiolibrary.resource.icon(ThemesMenu.THEME_ICON, color=color)
+ action.setIcon(icon)
+ self.addAction(action)
+
+ self.triggered.connect(self._triggered)
+
+ def theme(self):
+ """
+ Return the current theme for the menu.
+
+ :rtype: studioqt.Theme
+ """
+ return self._theme
+
+ def setTheme(self, theme):
+ """
+ Set the current theme for the menu.
+
+ :type theme: studioqt.Theme
+ :rtype: None
+ """
+ self._theme = theme
+
+ def _triggered(self, action):
+ """
+ Triggered when a theme has been clicked.
+
+ :type action: Action
+ :rtype: None
+ """
+ theme = self.theme()
+ if not theme:
+ raise Exception("Please set the current theme for the menu.")
+
+ if not isinstance(action, ThemeAction):
+ return
+
+ if action.theme().accentColor():
+ theme.setAccentColor(action.theme().accentColor())
+
+ if action.theme().backgroundColor():
+ theme.setBackgroundColor(action.theme().backgroundColor())
+
+
+def showThemesMenu(parent=None, themes=None):
+ """
+ Show a menu with the given themes.
+
+ :type themes: list[Theme]
+ :type parent: QtWidgets.QWidget
+ :rtype: QtWidgets.QAction
+ """
+ theme = Theme()
+ menu = ThemesMenu(parent=parent, theme=theme, themes=themes)
+ position = QtGui.QCursor().pos()
+ action = menu.exec_(position)
+ return theme
+
+
+class Theme(QtCore.QObject):
+
+ updated = QtCore.Signal()
+
+ DEFAULT_DARK_COLOR = QtGui.QColor(60, 60, 60)
+ DEFAULT_LIGHT_COLOR = QtGui.QColor(220, 220, 220)
+
+ DEFAULT_ACCENT_COLOR = QtGui.QColor(30, 145, 245)
+ DEFAULT_BACKGROUND_COLOR = QtGui.QColor(50, 50, 60)
+
+ def __init__(self):
+ QtCore.QObject.__init__(self)
+
+ self._dpi = 1
+
+ self._name = "Default"
+ self._accentColor = None
+ self._backgroundColor = None
+
+ self.setAccentColor(self.DEFAULT_ACCENT_COLOR)
+ self.setBackgroundColor(self.DEFAULT_BACKGROUND_COLOR)
+
+ def settings(self):
+ """
+ Return a dictionary of settings for the current Theme.
+
+ :rtype: dict
+ """
+ settings = {}
+
+ settings["name"] = self.name()
+
+ accentColor = self.accentColor()
+ settings["accentColor"] = accentColor.toString()
+
+ backgroundColor = self.backgroundColor()
+ settings["backgroundColor"] = backgroundColor.toString()
+
+ return settings
+
+ def setSettings(self, settings):
+ """
+ Set a dictionary of settings for the current Theme.
+
+ :type settings: dict
+ :rtype: None
+ """
+ name = settings.get("name")
+ self.setName(name)
+
+ color = settings.get("accentColor")
+ if color:
+ color = studioqt.Color.fromString(color)
+ self.setAccentColor(color)
+
+ color = settings.get("backgroundColor")
+ if color:
+ color = studioqt.Color.fromString(color)
+ self.setBackgroundColor(color)
+
+ def dpi(self):
+ """
+ Return the dpi for the Theme
+
+ :rtype: float
+ """
+ return self._dpi
+
+ def setDpi(self, dpi):
+ """
+ Set the dpi for the Theme
+
+ :type dpi: float
+ :rtype: None
+ """
+ self._dpi = dpi
+
+ def name(self):
+ """
+ Return the name for the Theme
+
+ :rtype: str
+ """
+ return self._name
+
+ def setName(self, name):
+ """
+ Set the name for the Theme
+
+ :type name: str
+ :rtype: None
+ """
+ self._name = name
+
+ def isDark(self):
+ """
+ Return True if the current theme is dark.
+
+ rtype: bool
+ """
+ # The luminance for digital formats are (0.299, 0.587, 0.114)
+ red = self.backgroundColor().redF() * 0.299
+ green = self.backgroundColor().greenF() * 0.587
+ blue = self.backgroundColor().blueF() * 0.114
+
+ darkness = red + green + blue
+
+ if darkness < 0.6:
+ return True
+
+ return False
+
+ def setDark(self):
+ """
+ Set the current theme to the default dark color.
+
+ :rtype: None
+ """
+ self.setBackgroundColor(self.DEFAULT_DARK_COLOR)
+
+ def setLight(self):
+ """
+ Set the current theme to the default light color.
+
+ :rtype: None
+ """
+ self.setBackgroundColor(self.DEFAULT_LIGHT_COLOR)
+
+ def iconColor(self):
+ """
+ Return the icon color for the theme.
+
+ :rtype: studioqt.Color
+ """
+ return self.foregroundColor()
+
+ def accentForgroundColor(self):
+ """
+ Return the foreground color for the accent color.
+
+ :rtype: studioqt.Color
+ """
+ return studioqt.Color(255, 255, 255, 255)
+
+ def foregroundColor(self):
+ """
+ Return the foreground color for the theme.
+
+ :rtype: studioqt.Color
+ """
+ if self.isDark():
+ return studioqt.Color(250, 250, 250, 225)
+ else:
+ return studioqt.Color(0, 40, 80, 180)
+
+ def itemBackgroundColor(self):
+ """
+ Return the item background color.
+
+ :rtype: studioqt.Color
+ """
+ if self.isDark():
+ return studioqt.Color(255, 255, 255, 20)
+ else:
+ return studioqt.Color(255, 255, 255, 120)
+
+ def itemBackgroundHoverColor(self):
+ """
+ Return the item background color when the mouse hovers over the item.
+
+ :rtype: studioqt.Color
+ """
+ return studioqt.Color(255, 255, 255, 60)
+
+ def accentColor(self):
+ """
+ Return the accent color for the theme.
+
+ :rtype: studioqt.Color or None
+ """
+ return self._accentColor
+
+ def backgroundColor(self):
+ """
+ Return the background color for the theme.
+
+ :rtype: studioqt.Color or None
+ """
+ return self._backgroundColor
+
+ def setAccentColor(self, color):
+ """
+ Set the accent color for the theme.
+
+ :type color: studioqt.Color | QtGui.QColor
+ """
+ if isinstance(color, six.string_types):
+ color = studioqt.Color.fromString(color)
+
+ if isinstance(color, QtGui.QColor):
+ color = studioqt.Color.fromColor(color)
+
+ self._accentColor = color
+
+ self.updated.emit()
+
+ def setBackgroundColor(self, color):
+ """
+ Set the background color for the theme.
+
+ :type color: studioqt.Color | QtGui.QColor
+ """
+ if isinstance(color, six.string_types):
+ color = studioqt.Color.fromString(color)
+
+ if isinstance(color, QtGui.QColor):
+ color = studioqt.Color.fromColor(color)
+
+ self._backgroundColor = color
+
+ self.updated.emit()
+
+ def createColorDialog(
+ self,
+ parent,
+ standardColors=None,
+ currentColor=None,
+ ):
+ """
+ Create a new instance of the color dialog.
+
+ :type parent: QtWidgets.QWidget
+ :type standardColors: list[int]
+ :rtype: QtWidgets.QColorDialog
+ """
+ dialog = QtWidgets.QColorDialog(parent)
+
+ if standardColors:
+ index = -1
+ for colorR, colorG, colorB in standardColors:
+ index += 1
+
+ color = QtGui.QColor(colorR, colorG, colorB).rgba()
+
+ try:
+ # Support for new qt5 signature
+ color = QtGui.QColor(color)
+ dialog.setStandardColor(index, color)
+ except:
+ # Support for new qt4 signature
+ color = QtGui.QColor(color).rgba()
+ dialog.setStandardColor(index, color)
+
+ # PySide2 doesn't support d.open(), so we need to pass a blank slot.
+ dialog.open(self, QtCore.SLOT("blankSlot()"))
+
+ if currentColor:
+ dialog.setCurrentColor(currentColor)
+
+ return dialog
+
+ def browseAccentColor(self, parent=None):
+ """
+ Show the color dialog for changing the accent color.
+
+ :type parent: QtWidgets.QWidget
+ :rtype: None
+ """
+ standardColors = [
+ (230, 60, 60), (210, 40, 40), (190, 20, 20), (250, 80, 130),
+ (230, 60, 110), (210, 40, 90), (255, 90, 40), (235, 70, 20),
+ (215, 50, 0), (240, 100, 170), (220, 80, 150), (200, 60, 130),
+ (255, 125, 100), (235, 105, 80), (215, 85, 60), (240, 200, 150),
+ (220, 180, 130), (200, 160, 110), (250, 200, 0), (230, 180, 0),
+ (210, 160, 0), (225, 200, 40), (205, 180, 20), (185, 160, 0),
+ (80, 200, 140), (60, 180, 120), (40, 160, 100), (80, 225, 120),
+ (60, 205, 100), (40, 185, 80), (50, 180, 240), (30, 160, 220),
+ (10, 140, 200), (100, 200, 245), (80, 180, 225), (60, 160, 205),
+ (130, 110, 240), (110, 90, 220), (90, 70, 200), (180, 160, 255),
+ (160, 140, 235), (140, 120, 215), (180, 110, 240), (160, 90, 220),
+ (140, 70, 200), (210, 110, 255), (190, 90, 235), (170, 70, 215)
+ ]
+
+ currentColor = self.accentColor()
+
+ dialog = self.createColorDialog(parent, standardColors, currentColor)
+ dialog.currentColorChanged.connect(self.setAccentColor)
+
+ if dialog.exec_():
+ self.setAccentColor(dialog.selectedColor())
+ else:
+ self.setAccentColor(currentColor)
+
+ def browseBackgroundColor(self, parent=None):
+ """
+ Show the color dialog for changing the background color.
+
+ :type parent: QtWidgets.QWidget
+ :rtype: None
+ """
+ standardColors = [
+ (0, 0, 0), (20, 20, 20), (40, 40, 40), (60, 60, 60),
+ (80, 80, 80), (100, 100, 100), (20, 20, 30), (40, 40, 50),
+ (60, 60, 70), (80, 80, 90), (100, 100, 110), (120, 120, 130),
+ (0, 30, 60), (20, 50, 80), (40, 70, 100), (60, 90, 120),
+ (80, 110, 140), (100, 130, 160), (0, 60, 60), (20, 80, 80),
+ (40, 100, 100), (60, 120, 120), (80, 140, 140), (100, 160, 160),
+ (0, 60, 30), (20, 80, 50), (40, 100, 70), (60, 120, 90),
+ (80, 140, 110), (100, 160, 130), (60, 0, 10), (80, 20, 30),
+ (100, 40, 50), (120, 60, 70), (140, 80, 90), (160, 100, 110),
+ (60, 0, 40), (80, 20, 60), (100, 40, 80), (120, 60, 100),
+ (140, 80, 120), (160, 100, 140), (40, 15, 5), (60, 35, 25),
+ (80, 55, 45), (100, 75, 65), (120, 95, 85), (140, 115, 105)
+ ]
+
+ currentColor = self.backgroundColor()
+
+ dialog = self.createColorDialog(parent, standardColors, currentColor)
+ dialog.currentColorChanged.connect(self.setBackgroundColor)
+
+ if dialog.exec_():
+ self.setBackgroundColor(dialog.selectedColor())
+ else:
+ self.setBackgroundColor(currentColor)
+
+ def options(self):
+ """
+ Return the variables used to customise the style sheet.
+
+ :rtype: dict
+ """
+ accentColor = self.accentColor()
+ accentForegroundColor = self.accentForgroundColor()
+
+ foregroundColor = self.foregroundColor()
+ backgroundColor = self.backgroundColor()
+
+ itemBackgroundColor = self.itemBackgroundColor()
+ itemBackgroundHoverColor = self.itemBackgroundHoverColor()
+
+ if self.isDark():
+ darkness = "white"
+ else:
+ darkness = "black"
+
+ resourceDirname = studiolibrary.resource.RESOURCE_DIRNAME
+ resourceDirname = resourceDirname.replace("\\", "/")
+
+ options = {
+ "DARKNESS": darkness,
+ "RESOURCE_DIRNAME": resourceDirname,
+
+ "ACCENT_COLOR": accentColor.toString(),
+ "ACCENT_COLOR_R": str(accentColor.red()),
+ "ACCENT_COLOR_G": str(accentColor.green()),
+ "ACCENT_COLOR_B": str(accentColor.blue()),
+
+ "ACCENT_FOREGROUND_COLOR": accentForegroundColor.toString(),
+
+ "FOREGROUND_COLOR": foregroundColor.toString(),
+ "FOREGROUND_COLOR_R": str(foregroundColor.red()),
+ "FOREGROUND_COLOR_G": str(foregroundColor.green()),
+ "FOREGROUND_COLOR_B": str(foregroundColor.blue()),
+
+ "BACKGROUND_COLOR": backgroundColor.toString(),
+ "BACKGROUND_COLOR_R": str(backgroundColor.red()),
+ "BACKGROUND_COLOR_G": str(backgroundColor.green()),
+ "BACKGROUND_COLOR_B": str(backgroundColor.blue()),
+
+ "ITEM_TEXT_COLOR": foregroundColor.toString(),
+ "ITEM_TEXT_SELECTED_COLOR": accentForegroundColor.toString(),
+
+ "ITEM_BACKGROUND_COLOR": itemBackgroundColor.toString(),
+ "ITEM_BACKGROUND_HOVER_COLOR": itemBackgroundHoverColor.toString(),
+ "ITEM_BACKGROUND_SELECTED_COLOR": accentColor.toString(),
+ }
+
+ return options
+
+ def styleSheet(self):
+ """
+ Return the style sheet for this theme.
+
+ :rtype: str
+ """
+ options = self.options()
+ path = studiolibrary.resource.get("css", "default.css")
+ styleSheet = studioqt.StyleSheet.fromPath(path, options=options, dpi=self.dpi())
+ return styleSheet.data()
+
+
+def example():
+ """
+ Run a simple example of theme menu.
+
+ :rtype: None
+ """
+ theme = showThemesMenu()
+ print("Accent color:", theme.accentColor())
+ print("Background color:", theme.backgroundColor())
+
+
+if __name__ == "__main__":
+ with studioqt.app():
+ example()
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/toastwidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/toastwidget.py
new file mode 100644
index 0000000..481193b
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/toastwidget.py
@@ -0,0 +1,160 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+import studioqt
+
+
+class ToastWidget(QtWidgets.QLabel):
+ """
+ A toast is a widget containing a quick little message for the user.
+
+ The toast class helps you create and show those.
+
+ Example:
+ toast = studiolibrary.widgets.ToastWidget(parent)
+ toast.setDuration(1000) # Show for 1 second
+ toast.setText("Hello world")
+ toast.show()
+ """
+
+ DEFAULT_DURATION = 500 # 0.5 seconds
+
+ def __init__(self, *args):
+ QtWidgets.QLabel.__init__(self, *args)
+
+ self._timer = QtCore.QTimer(self)
+ self._timer.setSingleShot(True)
+ self._timer.timeout.connect(self.fadeOut)
+
+ self._duration = self.DEFAULT_DURATION
+
+ self.setMouseTracking(True)
+ self.setAlignment(QtCore.Qt.AlignCenter)
+ self.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents)
+
+ if self.parent():
+ self.parent().installEventFilter(self)
+
+ def eventFilter(self, obj, event):
+ """
+ Update the geometry when the parent widget changes size.
+
+ :type obj: QWidgets.QWidget
+ :type event: QtCore.QEvent
+
+ :rtype: bool
+ """
+ if event.type() == QtCore.QEvent.Resize:
+ self.updateGeometry()
+ return QtWidgets.QLabel.eventFilter(self, obj, event)
+
+ def updateGeometry(self):
+ """
+ Update and align the geometry to the parent widget.
+
+ :rtype: None
+ """
+ padding = 30
+ widget = self.parent()
+
+ width = self.textWidth() + padding
+ height = self.textHeight() + padding
+
+ x = widget.width() / 2 - width / 2
+ y = (widget.height() - height) / 1.2
+
+ self.setGeometry(x, y, width, height)
+
+ def duration(self):
+ """
+ Return the duration.
+
+ :rtype: int
+ """
+ return self._duration
+
+ def setDuration(self, duration):
+ """
+ Set how long to show the toast for in milliseconds.
+
+ :type duration: int
+ :rtype: None
+ """
+ self._duration = duration
+
+ def fadeOut(self, duration=250):
+ """
+ Fade out the toast message.
+
+ :type duration: int
+ :rtype: None
+ """
+ studioqt.fadeOut(self, duration=duration, onFinished=self.hide)
+
+ def textRect(self):
+ """
+ Return the bounding box rect for the text.
+
+ :rtype: QtCore.QRect
+ """
+ text = self.text()
+ font = self.font()
+ metrics = QtGui.QFontMetricsF(font)
+ return metrics.boundingRect(text)
+
+ def textWidth(self):
+ """
+ Return the width of the text.
+
+ :rtype: int
+ """
+ textWidth = self.textRect().width()
+ return max(0, textWidth)
+
+ def textHeight(self):
+ """
+ Return the height of the text.
+
+ :rtype: int
+ """
+ textHeight = self.textRect().height()
+ return max(0, textHeight)
+
+ def setText(self, text):
+ """
+ Overriding this method to update the size depending on the text width.
+
+ :type text: str
+ :rtype: None
+ """
+ QtWidgets.QLabel.setText(self, text)
+ self.updateGeometry()
+
+ def show(self):
+ """
+ Overriding this method to start the timer to hide the toast.
+
+ :rtype: None
+ """
+ duration = self.duration()
+
+ self._timer.stop()
+ self._timer.start(duration)
+
+ if not self.isVisible():
+ # Fade in will reset the alpha effect back to 1.
+ studioqt.fadeIn(self, duration=0)
+ QtWidgets.QLabel.show(self)
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/BaseLoadWidget.ui b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/BaseLoadWidget.ui
new file mode 100644
index 0000000..48d47fe
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/BaseLoadWidget.ui
@@ -0,0 +1,454 @@
+
+
+ Form
+
+
+
+ 0
+ 0
+ 160
+ 560
+
+
+
+
+ 0
+ 0
+
+
+
+
+ 160
+ 560
+
+
+
+
+ 16777215
+ 16777215
+
+
+
+ Form
+
+
+
+
+
+
+ 2
+
+
+ QLayout::SetDefaultConstraint
+
+
+ 0
+
+ -
+
+
+
+ 0
+ 24
+
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Raised
+
+
+
+ 0
+
+
+ 0
+
+
+
+
+ -
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 0
+
+
+ 4
+
+
+ 2
+
+
+ 4
+
+
+ 2
+
+
-
+
+
+
+ 0
+ 16
+
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 0
+
+
+ 0
+
+
+
+
+ -
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 1
+
+
+
+
+ 50
+ 50
+
+
+
+
+ 150
+ 150
+
+
+
+
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 0
+
+
+ 0
+
+
+ 4
+
+
+ 0
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 16
+
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 0
+
+
+ 0
+
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Raised
+
+
+ 0
+
+
+
+ 0
+
+
+ 0
+
+
+
+
+ -
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 1
+
+
-
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 80
+ 35
+
+
+
+
+ 125
+ 35
+
+
+
+
+ Arial
+ 12
+ 50
+ false
+
+
+
+
+
+
+
+
+
+ Apply
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 35
+ 35
+
+
+
+
+ 35
+ 16777215
+
+
+
+
+
+
+
+ icons/selectionSet2.pngicons/selectionSet2.png
+
+
+
+ 25
+ 25
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 2
+
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+
+
+
+
+
+ snapshot()
+ apply()
+ edit()
+ showContextMenu()
+
+
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/BaseSaveWidget.ui b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/BaseSaveWidget.ui
new file mode 100644
index 0000000..5ac4599
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/BaseSaveWidget.ui
@@ -0,0 +1,304 @@
+
+
+ Form
+
+
+
+ 0
+ 0
+ 167
+ 473
+
+
+
+
+ 0
+ 0
+
+
+
+
+ 160
+ 0
+
+
+
+
+ 16777215
+ 16777215
+
+
+
+ Create Item
+
+
+
+
+
+
+ 4
+
+
+ 0
+
+ -
+
+
+
+ 0
+ 24
+
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Raised
+
+
+
+ 0
+
+
+ 0
+
+
+
+
+ -
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 50
+ 150
+
+
+
+
+ 150
+ 150
+
+
+
+
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 0
+
+
+ 0
+
+
+ 2
+
+
+ 0
+
+
+ 2
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 16
+
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 0
+
+
+ 4
+
+
+ 2
+
+
+ 4
+
+
+ 2
+
+
+
+
+ -
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 0
+
+
-
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 80
+ 35
+
+
+
+
+ 140
+ 35
+
+
+
+
+ Arial
+ 12
+ 50
+ false
+
+
+
+
+
+
+
+
+
+ Save
+
+
+
+ -
+
+
+
+ 35
+ 35
+
+
+
+
+ 5
+ 16777215
+
+
+
+
+
+
+
+ icons/selectionSet2.pngicons/selectionSet2.png
+
+
+
+ 25
+ 25
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 2
+
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+
+
+
+
+
+
+ snapshot()
+ save()
+
+
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/README.md b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/README.md
new file mode 100644
index 0000000..e4d8bd7
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/README.md
@@ -0,0 +1,109 @@
+# Studio Library Items
+
+Items are used for loading and saving data.
+
+
+### Pose Item
+
+Saving and loading a pose items
+
+```python
+from studiolibrarymaya import poseitem
+
+path = "/AnimLibrary/Characters/Malcolm/malcolm.pose"
+objects = maya.cmds.ls(selection=True) or []
+namespaces = []
+
+# Saving a pose item
+poseitem.save(path, objects=objects)
+
+# Loading a pose item
+poseitem.load(path, objects=objects, namespaces=namespaces, key=True, mirror=False)
+```
+
+### Animation Item
+
+Saving and loading animation items
+
+```python
+from studiolibrarymaya import animitem
+
+path = "/AnimLibrary/Characters/Malcolm/malcolm.anim"
+objects = maya.cmds.ls(selection=True) or []
+
+# Saving an animation item
+animitem.save(path, objects=objects, frameRange=(0, 200), bakeConnected=False)
+
+# Loading an animation item
+animitem.load(path, objects=objects, option="replace all", connect=False, currentTime=False)
+```
+
+Loading an animation to multiple namespaces
+
+```python
+from studiolibrarymaya import animitem
+animitem.load(path, namespaces=["character1", "character2"], option="replace all")
+```
+
+### Mirror Table Item
+
+Saving and loading mirror tables
+
+```python
+from studiolibrarymaya import mirroritem
+
+path = "/AnimLibrary/Characters/Malcolm/malcolm.mirror"
+objects = maya.cmds.ls(selection=True) or []
+
+# Saving a mirror table item
+mirroritem.save(path, objects=objects, leftSide="Lf", rightSide="Rf")
+
+# Loading a mirror table item
+mirroritem.load(path, objects=objects, namespaces=[], option="swap", animation=True, time=None)
+```
+
+### Selection Set Item
+
+Saving and loading selection sets
+
+```python
+from studiolibrarymaya import setsitem
+
+path = "/AnimLibrary/Characters/Malcolm/malcolm.set"
+objects = maya.cmds.ls(selection=True) or []
+
+# Saving a selection sets item
+setsitem.save(path, objects=objects)
+
+# Loading a selection sets item
+setsitem.load(path, objects=objects, namespaces=[])
+```
+
+
+### Maya File Item (Development)
+
+Saving and loading a Maya file item
+
+This item can be used to load and save any Maya nodes. For example:
+locators and geometry.
+
+```python
+from studiolibrarymaya import mayafileitem
+
+path = "/AnimLibrary/Characters/Malcolm/malcolm.mayafile"
+objects = maya.cmds.ls(selection=True) or []
+
+# Saving the item to disc
+mayafileitem.save(path, objects=objects)
+
+# Loading the item from disc
+mayafileitem.load(path)
+```
+
+### Example Item
+
+If you would like to create a custom item for saving and loading different data types, then please have a look at the [exampleitem.py](exampleitem.py)
+
+When developing a new item you can "Shift + Click" on the shelf icon which will reload all Studio Library modules including your changes to the item.
+
+Make sure you register any new items using either the "itemRegistry" key in the [config file](../studiolibrary/config/default.json) or by calling `studiolibrary.registerItem(cls)`.
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/__init__.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/__init__.py
new file mode 100644
index 0000000..fa43df4
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/__init__.py
@@ -0,0 +1,11 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/animitem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/animitem.py
new file mode 100644
index 0000000..fc92c85
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/animitem.py
@@ -0,0 +1,273 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import os
+import logging
+
+from studiolibrarymaya import baseitem
+
+try:
+ import mutils
+ import mutils.gui
+ import maya.cmds
+except ImportError as error:
+ print(error)
+
+
+logger = logging.getLogger(__name__)
+
+
+def save(path, *args, **kwargs):
+ """Convenience function for saving an AnimItem."""
+ AnimItem(path).safeSave(*args, **kwargs)
+
+
+def load(path, *args, **kwargs):
+ """Convenience function for loading an AnimItem."""
+ AnimItem(path).load(*args, **kwargs)
+
+
+class AnimItem(baseitem.BaseItem):
+
+ NAME = "Animation"
+ EXTENSION = ".anim"
+ ICON_PATH = os.path.join(os.path.dirname(__file__), "icons", "animation.png")
+ TRANSFER_CLASS = mutils.Animation
+
+ def imageSequencePath(self):
+ """
+ Return the image sequence location for playing the animation preview.
+
+ :rtype: str
+ """
+ return self.path() + "/sequence"
+
+ def loadSchema(self):
+ """
+ Get schema used to load the animation item.
+
+ :rtype: list[dict]
+ """
+ schema = super(AnimItem, self).loadSchema()
+
+ anim = mutils.Animation.fromPath(self.path())
+
+ startFrame = anim.startFrame() or 0
+ endFrame = anim.endFrame() or 0
+
+ value = "{0} - {1}".format(startFrame, endFrame)
+ schema.insert(3, {"name": "Range", "value": value})
+
+ schema.extend([
+ {
+ "name": "optionsGroup",
+ "title": "Options",
+ "type": "group",
+ "order": 2,
+ },
+ {
+ "name": "connect",
+ "type": "bool",
+ "inline": True,
+ "default": False,
+ "persistent": True,
+ "label": {"name": ""}
+ },
+ {
+ "name": "currentTime",
+ "type": "bool",
+ "inline": True,
+ "default": True,
+ "persistent": True,
+ "label": {"name": ""}
+ },
+ {
+ "name": "sourceTime",
+ "title": "source",
+ "type": "range",
+ "default": [startFrame, endFrame],
+ },
+ {
+ "name": "option",
+ "type": "enum",
+ "default": "replace all",
+ "items": ["replace", "replace all", "insert", "merge"],
+ "persistent": True,
+ },
+ ])
+
+ return schema
+
+ def load(self, **kwargs):
+ """
+ Load the animation for the given objects and options.
+
+ :type kwargs: dict
+ """
+ anim = mutils.Animation.fromPath(self.path())
+ anim.load(
+ objects=kwargs.get("objects"),
+ namespaces=kwargs.get("namespaces"),
+ attrs=kwargs.get("attrs"),
+ startFrame=kwargs.get("startFrame"),
+ sourceTime=kwargs.get("sourceTime"),
+ option=kwargs.get("option"),
+ connect=kwargs.get("connect"),
+ mirrorTable=kwargs.get("mirrorTable"),
+ currentTime=kwargs.get("currentTime")
+ )
+
+ def saveSchema(self):
+ """
+ Get the schema for saving an animation item.
+
+ :rtype: list[dict]
+ """
+ start, end = (1, 100)
+
+ try:
+ start, end = mutils.currentFrameRange()
+ except NameError as error:
+ logger.exception(error)
+
+ return [
+ {
+ "name": "folder",
+ "type": "path",
+ "layout": "vertical",
+ "visible": False,
+ },
+ {
+ "name": "name",
+ "type": "string",
+ "layout": "vertical"
+ },
+ {
+ "name": "fileType",
+ "type": "enum",
+ "layout": "vertical",
+ "default": "mayaAscii",
+ "items": ["mayaAscii", "mayaBinary"],
+ "persistent": True
+ },
+ {
+ "name": "frameRange",
+ "type": "range",
+ "layout": "vertical",
+ "default": [start, end],
+ "actions": [
+ {
+ "name": "From Timeline",
+ "callback": mutils.playbackFrameRange
+ },
+ {
+ "name": "From Selected Timeline",
+ "callback": mutils.selectedFrameRange
+ },
+ {
+ "name": "From Selected Objects",
+ "callback": mutils.selectedObjectsFrameRange
+ },
+ ]
+ },
+ {
+ "name": "byFrame",
+ "type": "int",
+ "default": 1,
+ "layout": "vertical",
+ "persistent": True
+ },
+ {
+ "name": "comment",
+ "type": "text",
+ "layout": "vertical"
+ },
+ {
+ "name": "bakeConnected",
+ "type": "bool",
+ "default": False,
+ "persistent": True,
+ "inline": True,
+ "label": {"visible": False}
+ },
+ {
+ "name": "objects",
+ "type": "objects",
+ "label": {
+ "visible": False
+ }
+ },
+ ]
+
+ def saveValidator(self, **kwargs):
+ """
+ The save validator is called when an input field has changed.
+
+ :type kwargs: dict
+ :rtype: list[dict]
+ """
+ fields = super(AnimItem, self).saveValidator(**kwargs)
+
+ # Validate the by frame field
+ if kwargs.get("byFrame") == '' or kwargs.get("byFrame", 1) < 1:
+ fields.extend([
+ {
+ "name": "byFrame",
+ "error": "The by frame value cannot be less than 1!"
+ }
+ ])
+
+ # Validate the frame range field
+ start, end = kwargs.get("frameRange", (0, 1))
+ if start >= end:
+ fields.extend([
+ {
+ "name": "frameRange",
+ "error": "The start frame cannot be greater "
+ "than or equal to the end frame!"
+ }
+ ])
+
+ # Validate the current selection field
+ objects = kwargs.get("objects")
+ if objects and mutils.getDurationFromNodes(objects, time=[start, end]) <= 0:
+ fields.extend([
+ {
+ "name": "objects",
+ "error": "No animation was found on the selected object/s!"
+ "Please create a pose instead!",
+ }
+ ])
+
+ return fields
+
+ def save(self, objects, sequencePath="", **kwargs):
+ """
+ Save the animation from the given objects to the item path.
+
+ :type objects: list[str]
+ :type sequencePath: str
+ :type kwargs: dict
+ """
+ super(AnimItem, self).save(**kwargs)
+
+ # Save the animation to the given path location on disc
+ mutils.saveAnim(
+ objects,
+ self.path(),
+ time=kwargs.get("frameRange"),
+ fileType=kwargs.get("fileType"),
+ iconPath=kwargs.get("thumbnail"),
+ metadata={"description": kwargs.get("comment", "")},
+ sequencePath=sequencePath,
+ bakeConnected=kwargs.get("bakeConnected")
+ )
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/baseitem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/baseitem.py
new file mode 100644
index 0000000..0f236b4
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/baseitem.py
@@ -0,0 +1,445 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import os
+import shutil
+import logging
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+
+import studiolibrary
+
+from studiolibrarymaya import basesavewidget
+from studiolibrarymaya import baseloadwidget
+
+try:
+ import mutils
+ import mutils.gui
+ import maya.cmds
+except ImportError as error:
+ print(error)
+
+
+logger = logging.getLogger(__name__)
+
+
+class BaseItemSignals(QtCore.QObject):
+ """"""
+ loadValueChanged = QtCore.Signal(object, object)
+
+
+class BaseItem(studiolibrary.LibraryItem):
+
+ _baseItemSignals = BaseItemSignals()
+
+ loadValueChanged = _baseItemSignals.loadValueChanged
+
+ """Base class for anim, pose, mirror and sets transfer items."""
+ SAVE_WIDGET_CLASS = basesavewidget.BaseSaveWidget
+ LOAD_WIDGET_CLASS = baseloadwidget.BaseLoadWidget
+
+ TRANSFER_CLASS = None
+ TRANSFER_BASENAME = ""
+
+ def createLoadWidget(self, parent=None):
+ widget = self.LOAD_WIDGET_CLASS(item=self, parent=parent)
+ return widget
+
+ @classmethod
+ def createSaveWidget(cls, parent=None, item=None):
+ item = item or cls()
+ widget = cls.SAVE_WIDGET_CLASS(item=item, parent=parent)
+ return widget
+
+ @classmethod
+ def showSaveWidget(cls, libraryWindow=None, item=None):
+ """
+ Overriding this method to set the destination location
+ for the save widget.
+
+ Triggered when the user clicks the item action in the new item menu.
+
+ :type libraryWindow: studiolibrary.LibraryWindow
+ :type item: studiolibrary.LibraryItem or None
+ """
+ item = item or cls()
+ widget = cls.SAVE_WIDGET_CLASS(item=item, parent=libraryWindow)
+
+ if libraryWindow:
+ path = libraryWindow.selectedFolderPath()
+
+ widget.setFolderPath(path)
+ widget.setLibraryWindow(libraryWindow)
+
+ libraryWindow.setCreateWidget(widget)
+ libraryWindow.folderSelectionChanged.connect(widget.setFolderPath)
+
+ def __init__(self, *args, **kwargs):
+ """
+ Initialise a new instance for the given path.
+
+ :type path: str
+ :type args: list
+ :type kwargs: dict
+ """
+ self._transferObject = None
+ self._currentLoadValues = {}
+
+ studiolibrary.LibraryItem.__init__(self, *args, **kwargs)
+
+ def emitLoadValueChanged(self, field, value):
+ """
+ Emit the load value changed to be validated.
+
+ :type field: str
+ :type value: object
+ """
+ self.loadValueChanged.emit(field, value)
+
+ def namespaces(self):
+ """
+ Return the namesapces for this item depending on the namespace option.
+
+ :rtype: list[str] or None
+ """
+ return self.currentLoadValue("namespaces")
+
+ def namespaceOption(self):
+ """
+ Return the namespace option for this item.
+
+ :rtype: NamespaceOption or None
+ """
+ return self.currentLoadValue("namespaceOption")
+
+ def doubleClicked(self):
+ """
+ This method is called when the user double clicks the item.
+
+ :rtype: None
+ """
+ self.loadFromCurrentValues()
+
+ def transferPath(self):
+ """
+ Return the disc location to transfer path.
+
+ :rtype: str
+ """
+ if self.TRANSFER_BASENAME:
+ return os.path.join(self.path(), self.TRANSFER_BASENAME)
+ else:
+ return self.path()
+
+ def transferObject(self):
+ """
+ Return the transfer object used to read and write the data.
+
+ :rtype: mutils.TransferObject
+ """
+ if not self._transferObject:
+ path = self.transferPath()
+ self._transferObject = self.TRANSFER_CLASS.fromPath(path)
+ return self._transferObject
+
+ def currentLoadValue(self, name):
+ """
+ Get the current field value for the given name.
+
+ :type name: str
+ :rtype: object
+ """
+ return self._currentLoadValues.get(name)
+
+ def setCurrentLoadValues(self, values):
+ """
+ Set the current field values for the the item.
+
+ :type values: dict
+ """
+ self._currentLoadValues = values
+
+ def loadFromCurrentValues(self):
+ """Load the mirror table using the settings for this item."""
+ kwargs = self._currentLoadValues
+ objects = maya.cmds.ls(selection=True) or []
+
+ try:
+ self.load(objects=objects, **kwargs)
+ except Exception as error:
+ self.showErrorDialog("Item Error", str(error))
+ raise
+
+ def contextMenu(self, menu, items=None):
+ """
+ This method is called when the user right clicks on this item.
+
+ :type menu: QtWidgets.QMenu
+ :type items: list[BaseItem]
+ :rtype: None
+ """
+ from studiolibrarymaya import setsmenu
+
+ action = setsmenu.selectContentAction(self, parent=menu)
+ menu.addAction(action)
+ menu.addSeparator()
+
+ subMenu = self.createSelectionSetsMenu(menu, enableSelectContent=False)
+ menu.addMenu(subMenu)
+ menu.addSeparator()
+
+ studiolibrary.LibraryItem.contextMenu(self, menu, items=items)
+
+ def showSelectionSetsMenu(self, **kwargs):
+ """
+ Show the selection sets menu for this item at the cursor position.
+
+ :rtype: QtWidgets.QAction
+ """
+ menu = self.createSelectionSetsMenu(**kwargs)
+ position = QtGui.QCursor().pos()
+ action = menu.exec_(position)
+ return action
+
+ def createSelectionSetsMenu(self, parent=None, enableSelectContent=True):
+ """
+ Get a new instance of the selection sets menu.
+
+ :type parent: QtWidgets.QWidget
+ :type enableSelectContent: bool
+ :rtype: QtWidgets.QMenu
+ """
+ from . import setsmenu
+
+ parent = parent or self.libraryWindow()
+
+ namespaces = self.namespaces()
+
+ menu = setsmenu.SetsMenu(
+ item=self,
+ parent=parent,
+ namespaces=namespaces,
+ enableSelectContent=enableSelectContent,
+ )
+
+ return menu
+
+ def selectContent(self, namespaces=None, **kwargs):
+ """
+ Select the contents of this item in the Maya scene.
+
+ :type namespaces: list[str]
+ """
+ namespaces = namespaces or self.namespaces()
+
+ kwargs = kwargs or mutils.selectionModifiers()
+
+ msg = "Select content: Item.selectContent(namespacea={0}, kwargs={1})"
+ msg = msg.format(namespaces, kwargs)
+ logger.debug(msg)
+
+ try:
+ self.transferObject().select(namespaces=namespaces, **kwargs)
+ except Exception as error:
+ self.showErrorDialog("Item Error", str(error))
+ raise
+
+ def loadSchema(self):
+ """
+ Get schema used to load the item.
+
+ :rtype: list[dict]
+ """
+ modified = self.itemData().get("modified")
+ if modified:
+ modified = studiolibrary.timeAgo(modified)
+
+ count = self.transferObject().objectCount()
+ plural = "s" if count > 1 else ""
+ contains = str(count) + " Object" + plural
+
+ return [
+ {
+ "name": "infoGroup",
+ "title": "Info",
+ "type": "group",
+ "order": 1,
+ },
+ {
+ "name": "name",
+ "value": self.name(),
+ },
+ {
+ "name": "owner",
+ "value": self.transferObject().owner(),
+ },
+ {
+ "name": "created",
+ "value": modified,
+ },
+ {
+ "name": "contains",
+ "value": contains,
+ },
+ {
+ "name": "comment",
+ "value": self.transferObject().description() or "No comment",
+ },
+ {
+ "name": "namespaceGroup",
+ "title": "Namespace",
+ "type": "group",
+ "order": 10,
+ },
+ {
+ "name": "namespaceOption",
+ "title": "",
+ "type": "radio",
+ "value": "From file",
+ "items": ["From file", "From selection", "Use custom"],
+ "persistent": True,
+ "persistentKey": "BaseItem",
+ },
+ {
+ "name": "namespaces",
+ "title": "",
+ "type": "tags",
+ "value": [],
+ "items": mutils.namespace.getAll(),
+ "persistent": True,
+ "label": {"visible": False},
+ "persistentKey": "BaseItem",
+ },
+ ]
+
+ def loadValidator(self, **values):
+ """
+ Called when the load fields change.
+
+ :type values: dict
+ """
+ namespaces = values.get("namespaces")
+ namespaceOption = values.get("namespaceOption")
+
+ if namespaceOption == "From file":
+ namespaces = self.transferObject().namespaces()
+ elif namespaceOption == "From selection":
+ namespaces = mutils.namespace.getFromSelection()
+
+ fieldChanged = values.get("fieldChanged")
+ if fieldChanged == "namespaces":
+ values["namespaceOption"] = "Use custom"
+ else:
+ values["namespaces"] = namespaces
+
+ self._currentLoadValues = values
+
+ return [
+ {
+ "name": "namespaces",
+ "value": values.get("namespaces"),
+ },
+ {
+ "name": "namespaceOption",
+ "value": values.get("namespaceOption"),
+ },
+ ]
+
+ def load(self, **kwargs):
+ """
+ Load the data from the transfer object.
+
+ :rtype: None
+ """
+ logger.debug(u'Loading: {0}'.format(self.transferPath()))
+
+ self.transferObject().load(**kwargs)
+
+ logger.debug(u'Loading: {0}'.format(self.transferPath()))
+
+ def saveSchema(self):
+ """
+ The base save schema.
+
+ :rtype: list[dict]
+ """
+ return [
+ {
+ "name": "folder",
+ "type": "path",
+ "layout": "vertical",
+ "visible": False,
+ },
+ {
+ "name": "name",
+ "type": "string",
+ "layout": "vertical",
+ },
+ {
+ "name": "comment",
+ "type": "text",
+ "layout": "vertical"
+ },
+ {
+ "name": "objects",
+ "type": "objects",
+ "label": {"visible": False}
+ },
+ ]
+
+ def saveValidator(self, **kwargs):
+ """
+ The save validator is called when an input field has changed.
+
+ :type kwargs: dict
+ :rtype: list[dict]
+ """
+ fields = []
+
+ if not kwargs.get("folder"):
+ fields.append({
+ "name": "folder",
+ "error": "No folder selected. Please select a destination folder.",
+ })
+
+ if not kwargs.get("name"):
+ fields.append({
+ "name": "name",
+ "error": "No name specified. Please set a name before saving.",
+ })
+
+ selection = maya.cmds.ls(selection=True) or []
+ msg = ""
+ if not selection:
+ msg = "No objects selected. Please select at least one object."
+
+ fields.append({
+ "name": "objects",
+ "value": selection,
+ "error": msg,
+ },
+ )
+
+ return fields
+
+ def save(self, thumbnail="", **kwargs):
+ """
+ Save all the given object data to the item path on disc.
+
+ :type thumbnail: str
+ :type kwargs: dict
+ """
+ # Copy the icon path to the given path
+ if thumbnail:
+ basename = os.path.basename(thumbnail)
+ shutil.copyfile(thumbnail, self.path() + "/" + basename)
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/baseloadwidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/baseloadwidget.py
new file mode 100644
index 0000000..5598e5c
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/baseloadwidget.py
@@ -0,0 +1,255 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import os
+import logging
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+import studioqt
+import studiolibrary
+import studiolibrary.widgets
+
+try:
+ import mutils
+ import mutils.gui
+ import maya.cmds
+except ImportError as error:
+ print(error)
+
+
+logger = logging.getLogger(__name__)
+
+
+class BaseLoadWidget(QtWidgets.QWidget):
+
+ """Base widget for loading items."""
+
+ def __init__(self, item, parent=None):
+ """
+ :type item: studiolibrarymaya.BaseItem
+ :type parent: QtWidgets.QWidget or None
+ """
+ QtWidgets.QWidget.__init__(self, parent)
+
+ self.setObjectName("studioLibraryBaseLoadWidget")
+ self.setWindowTitle("Load Item")
+
+ self.loadUi()
+
+ self._item = item
+ self._scriptJob = None
+ self._formWidget = None
+
+ widget = self.createTitleWidget()
+ widget.ui.menuButton.clicked.connect(self.showMenu)
+
+ self.ui.titleFrame.layout().addWidget(widget)
+
+ # Create the icon group box
+ groupBox = studiolibrary.widgets.GroupBoxWidget("Icon", self.ui.iconFrame)
+ groupBox.setObjectName("iconGroupBoxWidget")
+ groupBox.setPersistent(True)
+ self.ui.iconTitleFrame.layout().addWidget(groupBox)
+
+ # Create the thumbnail widget and set the image
+ self.ui.thumbnailButton = studiolibrary.widgets.ImageSequenceWidget(self)
+ self.ui.thumbnailButton.setObjectName("thumbnailButton")
+ self.ui.thumbnailFrame.layout().insertWidget(0, self.ui.thumbnailButton)
+
+ if os.path.exists(item.imageSequencePath()):
+ self.ui.thumbnailButton.setPath(item.imageSequencePath())
+
+ elif os.path.exists(item.thumbnailPath()):
+ self.ui.thumbnailButton.setPath(item.thumbnailPath())
+
+ # Create the load widget and set the load schema
+ self._formWidget = studiolibrary.widgets.FormWidget(self)
+ self._formWidget.setObjectName(item.__class__.__name__ + "Form")
+ self._formWidget.setSchema(item.loadSchema())
+ self._formWidget.setValidator(self.loadValidator)
+ self._formWidget.validate()
+
+ self.ui.formFrame.layout().addWidget(self._formWidget)
+
+ try:
+ self.selectionChanged()
+ self.setScriptJobEnabled(True)
+ except NameError as error:
+ logger.exception(error)
+
+ self.updateThumbnailSize()
+
+ self._item.loadValueChanged.connect(self._itemValueChanged)
+ self.ui.acceptButton.clicked.connect(self.accept)
+ self.ui.selectionSetButton.clicked.connect(self.showSelectionSetsMenu)
+
+ def loadValidator(self, *args, **kwargs):
+ return self.item().loadValidator(*args, **kwargs)
+
+ def createTitleWidget(self):
+ """
+ Create a new instance of the title bar widget.
+
+ :rtype: QtWidgets.QFrame
+ """
+ class UI(object):
+ """Proxy class for attaching ui widgets as properties."""
+ pass
+
+ titleWidget = QtWidgets.QFrame(self)
+ titleWidget.setObjectName("titleWidget")
+ titleWidget.ui = UI()
+
+ vlayout = QtWidgets.QVBoxLayout()
+ vlayout.setSpacing(0)
+ vlayout.setContentsMargins(0, 0, 0, 0)
+
+ hlayout = QtWidgets.QHBoxLayout()
+ hlayout.setSpacing(0)
+ hlayout.setContentsMargins(0, 0, 0, 0)
+
+ vlayout.addLayout(hlayout)
+
+ titleButton = QtWidgets.QLabel(self)
+ titleButton.setText(self.item().NAME)
+ titleButton.setObjectName("titleButton")
+ titleWidget.ui.titleButton = titleButton
+
+ hlayout.addWidget(titleButton)
+
+ menuButton = QtWidgets.QPushButton(self)
+ menuButton.setText("...")
+ menuButton.setObjectName("menuButton")
+ titleWidget.ui.menuButton = menuButton
+
+ hlayout.addWidget(menuButton)
+
+ titleWidget.setLayout(vlayout)
+
+ return titleWidget
+
+ def _itemValueChanged(self, field, value):
+ """
+ Triggered when the a field value has changed.
+
+ :type field: str
+ :type value: object
+ """
+ self._formWidget.setValue(field, value)
+
+ def showMenu(self):
+ """
+ Show the edit menu at the current cursor position.
+
+ :rtype: QtWidgets.QAction
+ """
+ menu = QtWidgets.QMenu(self)
+
+ self.item().contextEditMenu(menu)
+
+ point = QtGui.QCursor.pos()
+ point.setX(point.x() + 3)
+ point.setY(point.y() + 3)
+
+ return menu.exec_(point)
+
+ def loadUi(self):
+ """Convenience method for loading the .ui file."""
+ studioqt.loadUi(self, cls=BaseLoadWidget)
+
+ def formWidget(self):
+ """
+ Get the form widget instance.
+
+ :rtype: studiolibrary.widgets.formwidget.FormWidget
+ """
+ return self._formWidget
+
+ def setCustomWidget(self, widget):
+ """Convenience method for adding a custom widget when loading."""
+ self.ui.customWidgetFrame.layout().addWidget(widget)
+
+ def item(self):
+ """
+ Get the library item to be created.
+
+ :rtype: studiolibrarymaya.BaseItem
+ """
+ return self._item
+
+ def showSelectionSetsMenu(self):
+ """Show the selection sets menu."""
+ item = self.item()
+ item.showSelectionSetsMenu()
+
+ def resizeEvent(self, event):
+ """
+ Overriding to adjust the image size when the widget changes size.
+
+ :type event: QtCore.QSizeEvent
+ """
+ self.updateThumbnailSize()
+
+ def updateThumbnailSize(self):
+ """Update the thumbnail button to the size of the widget."""
+ width = self.width() - 10
+ if width > 250:
+ width = 250
+
+ size = QtCore.QSize(width, width)
+ self.ui.thumbnailButton.setIconSize(size)
+ self.ui.thumbnailButton.setMaximumSize(size)
+ self.ui.thumbnailFrame.setMaximumSize(size)
+
+ def close(self):
+ """Overriding this method to disable the script job when closed."""
+ self.setScriptJobEnabled(False)
+
+ if self.formWidget():
+ self.formWidget().savePersistentValues()
+
+ QtWidgets.QWidget.close(self)
+
+ def scriptJob(self):
+ """
+ Get the script job object used when the users selection changes.
+
+ :rtype: mutils.ScriptJob
+ """
+ return self._scriptJob
+
+ def setScriptJobEnabled(self, enabled):
+ """
+ Enable the script job used when the users selection changes.
+
+ :type enabled: bool
+ """
+ if enabled:
+ if not self._scriptJob:
+ event = ['SelectionChanged', self.selectionChanged]
+ self._scriptJob = mutils.ScriptJob(event=event)
+ else:
+ sj = self.scriptJob()
+ if sj:
+ sj.kill()
+ self._scriptJob = None
+
+ def selectionChanged(self):
+ """Triggered when the users Maya selection has changed."""
+ self.formWidget().validate()
+
+ def accept(self):
+ """Called when the user clicks the apply button."""
+ self.item().loadFromCurrentValues()
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/basesavewidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/basesavewidget.py
new file mode 100644
index 0000000..e14210c
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/basesavewidget.py
@@ -0,0 +1,488 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import os
+import logging
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+import studioqt
+import studiolibrary.widgets
+
+try:
+ import mutils
+ import mutils.gui
+ import maya.cmds
+except ImportError as error:
+ print(error)
+
+
+logger = logging.getLogger(__name__)
+
+
+class BaseSaveWidget(QtWidgets.QWidget):
+
+ """Base widget for saving new items."""
+
+ def __init__(self, item, parent=None):
+ """
+ :type item: studiolibrarymaya.BaseItem
+ :type parent: QtWidgets.QWidget or None
+ """
+ QtWidgets.QWidget.__init__(self, parent)
+
+ self.setObjectName("studioLibraryBaseSaveWidget")
+ self.setWindowTitle("Save Item")
+
+ studioqt.loadUi(self)
+
+ self._item = item
+ self._scriptJob = None
+ self._formWidget = None
+
+ widget = self.createTitleWidget()
+ widget.ui.menuButton.hide()
+ self.ui.titleFrame.layout().addWidget(widget)
+
+ self.ui.acceptButton.clicked.connect(self.accept)
+ self.ui.selectionSetButton.clicked.connect(self.showSelectionSetsMenu)
+
+ try:
+ self.setScriptJobEnabled(True)
+ except NameError as error:
+ logger.exception(error)
+
+ self.createSequenceWidget()
+ self.updateThumbnailSize()
+ self.setItem(item)
+
+ def showMenu(self):
+ """
+ Show the edit menu at the current cursor position.
+
+ :rtype: QtWidgets.QAction
+ """
+ raise NotImplementedError("The title menu is not implemented")
+
+ def createTitleWidget(self):
+ """
+ Create a new instance of the title bar widget.
+
+ :rtype: QtWidgets.QFrame
+ """
+
+ class UI(object):
+ """Proxy class for attaching ui widgets as properties."""
+ pass
+
+ titleWidget = QtWidgets.QFrame(self)
+ titleWidget.setObjectName("titleWidget")
+ titleWidget.ui = UI()
+
+ vlayout = QtWidgets.QVBoxLayout()
+ vlayout.setSpacing(0)
+ vlayout.setContentsMargins(0, 0, 0, 0)
+
+ hlayout = QtWidgets.QHBoxLayout()
+ hlayout.setSpacing(0)
+ hlayout.setContentsMargins(0, 0, 0, 0)
+
+ vlayout.addLayout(hlayout)
+
+ titleButton = QtWidgets.QLabel(self)
+ titleButton.setText(self.item().NAME)
+ titleButton.setObjectName("titleButton")
+ titleWidget.ui.titleButton = titleButton
+
+ hlayout.addWidget(titleButton)
+
+ menuButton = QtWidgets.QPushButton(self)
+ menuButton.setText("...")
+ menuButton.setObjectName("menuButton")
+ titleWidget.ui.menuButton = menuButton
+
+ hlayout.addWidget(menuButton)
+
+ titleWidget.setLayout(vlayout)
+
+ return titleWidget
+
+ def createSequenceWidget(self):
+ """Create a sequence widget to replace the static thumbnail widget."""
+ theme = None
+ if self.parent():
+ try:
+ theme = self.parent().theme()
+ except AttributeError as error:
+ logger.debug("Cannot find theme for parent.")
+
+ self.ui.thumbnailButton = studiolibrary.widgets.ImageSequenceWidget(self, theme=theme)
+ self.ui.thumbnailButton.setObjectName("thumbnailButton")
+ self.ui.thumbnailFrame.layout().insertWidget(0, self.ui.thumbnailButton)
+ self.ui.thumbnailButton.clicked.connect(self.thumbnailCapture)
+
+ text = "Click to capture a thumbnail from the current model panel.\n" \
+ "CTRL + Click to show the capture window for better framing."
+
+ self.ui.thumbnailButton.setToolTip(text)
+
+ path = studiolibrary.resource.get("icons", "camera.svg")
+ self.ui.thumbnailButton.addAction(
+ path,
+ "Capture new image",
+ "Capture new image",
+ self.thumbnailCapture
+ )
+
+ path = studiolibrary.resource.get("icons", "expand.svg")
+ self.ui.thumbnailButton.addAction(
+ path,
+ "Show Capture window",
+ "Show Capture window",
+ self.showCaptureWindow
+ )
+
+ path = studiolibrary.resource.get("icons", "folder.svg")
+ self.ui.thumbnailButton.addAction(
+ path,
+ "Load image from disk",
+ "Load image from disk",
+ self.showBrowseImageDialog
+ )
+
+ icon = studiolibrary.resource.icon("thumbnail_solid.png")
+ self.ui.thumbnailButton.setIcon(icon)
+
+ def setLibraryWindow(self, libraryWindow):
+ """
+ Set the library widget for the item.
+
+ :type libraryWindow: studiolibrary.LibraryWindow
+ :rtype: None
+ """
+ self.item().setLibraryWindow(libraryWindow)
+
+ def libraryWindow(self):
+ """
+ Get the library widget for the item.
+
+ :rtype: libraryWindow: studiolibrary.LibraryWindow
+ """
+ return self.item().libraryWindow()
+
+ def formWidget(self):
+ """
+ Get the form widget instance.
+
+ :rtype: studiolibrary.widgets.formwidget.FormWidget
+ """
+ return self._formWidget
+
+ def item(self):
+ """
+ Get the library item to be created.
+
+ :rtype: studiolibrarymaya.BaseItem
+ """
+ return self._item
+
+ def setItem(self, item):
+ """
+ Set the item to be created.
+
+ :type item: studiolibrarymaya.BaseItem
+ """
+ self._item = item
+
+ if os.path.exists(item.imageSequencePath()):
+ self.setThumbnailPath(item.imageSequencePath())
+ elif not item.isTHUMBNAIL_PATH():
+ self.setThumbnailPath(item.thumbnailPath())
+
+ schema = item.saveSchema()
+ if schema:
+ formWidget = studiolibrary.widgets.FormWidget(self)
+ formWidget.setSchema(schema)
+ formWidget.setValidator(item.saveValidator)
+
+ # Used when overriding the item
+ name = os.path.basename(item.path())
+ formWidget.setValues({"name": name})
+
+ self.ui.optionsFrame.layout().addWidget(formWidget)
+ self._formWidget = formWidget
+
+ formWidget.validate()
+ else:
+ self.ui.optionsFrame.setVisible(False)
+
+ def showSelectionSetsMenu(self):
+ """
+ Show the selection sets menu for the current folder path.
+
+ :rtype: None
+ """
+ from studiolibrarymaya import setsmenu
+
+ path = self.folderPath()
+ position = QtGui.QCursor().pos()
+ libraryWindow = self.libraryWindow()
+
+ menu = setsmenu.SetsMenu.fromPath(path, libraryWindow=libraryWindow)
+ menu.exec_(position)
+
+ def close(self):
+ """Overriding the close method to disable the script job on close."""
+ self._formWidget.savePersistentValues()
+ self.setScriptJobEnabled(False)
+ QtWidgets.QWidget.close(self)
+
+ def scriptJob(self):
+ """
+ Get the script job object used when the users selection changes.
+
+ :rtype: mutils.ScriptJob
+ """
+ return self._scriptJob
+
+ def setScriptJobEnabled(self, enabled):
+ """Set the script job used when the users selection changes."""
+ if enabled:
+ if not self._scriptJob:
+ event = ['SelectionChanged', self.selectionChanged]
+ self._scriptJob = mutils.ScriptJob(event=event)
+ else:
+ sj = self.scriptJob()
+ if sj:
+ sj.kill()
+ self._scriptJob = None
+
+ def resizeEvent(self, event):
+ """
+ Overriding to adjust the image size when the widget changes size.
+
+ :type event: QtCore.QSizeEvent
+ """
+ self.updateThumbnailSize()
+
+ def updateThumbnailSize(self):
+ """Update the thumbnail button to the size of the widget."""
+ width = self.width() - 10
+ if width > 250:
+ width = 250
+
+ size = QtCore.QSize(width, width)
+ self.ui.thumbnailButton.setIconSize(size)
+ self.ui.thumbnailButton.setMaximumSize(size)
+ self.ui.thumbnailFrame.setMaximumSize(size)
+
+ def setFolderPath(self, path):
+ """
+ Set the destination folder path.
+
+ :type path: str
+ """
+ self.formWidget().setValue("folder", path)
+
+ def folderPath(self):
+ """
+ Return the folder path.
+
+ :rtype: str
+ """
+ return self.formWidget().value("folder")
+
+ def selectionChanged(self):
+ """Triggered when the Maya selection changes."""
+ if self.formWidget():
+ self.formWidget().validate()
+
+ def showByFrameDialog(self):
+ """
+ Show the by frame dialog.
+
+ :rtype: None or QtWidgets.QDialogButtonBox.StandardButton
+ """
+ result = None
+ text = 'To help speed up the playblast you can set the "by frame" ' \
+ 'to a number greater than 1. For example if the "by frame" ' \
+ 'is set to 2 it will playblast every second frame.'
+
+ options = self.formWidget().values()
+ byFrame = options.get("byFrame", 1)
+ startFrame, endFrame = options.get("frameRange", [None, None])
+
+ duration = 1
+ if startFrame is not None and endFrame is not None:
+ duration = endFrame - startFrame
+
+ if duration > 100 and byFrame == 1:
+
+ buttons = [
+ QtWidgets.QDialogButtonBox.Ok,
+ QtWidgets.QDialogButtonBox.Cancel
+ ]
+
+ result = studiolibrary.widgets.MessageBox.question(
+ self.libraryWindow(),
+ title="Playblast Tip",
+ text=text,
+ buttons=buttons,
+ enableDontShowCheckBox=True,
+ )
+
+ return result
+
+ def showBrowseImageDialog(self):
+ """Show a file dialog for choosing an image from disc."""
+ fileDialog = QtWidgets.QFileDialog(
+ self,
+ caption="Open Image",
+ filter="Image Files (*.png *.jpg)"
+ )
+
+ fileDialog.fileSelected.connect(self.setThumbnailPath)
+ fileDialog.exec_()
+
+ def showCaptureWindow(self):
+ """Show the capture window for framing."""
+ self.thumbnailCapture(show=True)
+
+ def setThumbnailPath(self, path):
+ """
+ Set the path to the thumbnail image or the image sequence directory.
+
+ :type path: str
+ """
+ filename, extension = os.path.splitext(path)
+ dst = studiolibrary.tempPath("thumbnail" + extension)
+
+ studiolibrary.copyPath(path, dst, force=True)
+
+ self.ui.thumbnailButton.setPath(dst)
+
+ def _capturedCallback(self, src):
+ """
+ Triggered when capturing a thumbnail snapshot.
+
+ :type src: str
+ """
+ path = os.path.dirname(src)
+ self.setThumbnailPath(path)
+
+ def thumbnailCapture(self, show=False):
+ """Capture a playblast and save it to the temp thumbnail path."""
+ options = self.formWidget().values()
+ startFrame, endFrame = options.get("frameRange", [None, None])
+ step = options.get("byFrame", 1)
+
+ # Ignore the by frame dialog when the control modifier is pressed.
+ if not studioqt.isControlModifier():
+ result = self.showByFrameDialog()
+ if result == QtWidgets.QDialogButtonBox.Cancel:
+ return
+
+ try:
+ path = studiolibrary.tempPath("sequence", "thumbnail.jpg")
+ mutils.gui.thumbnailCapture(
+ show=show,
+ path=path,
+ startFrame=startFrame,
+ endFrame=endFrame,
+ step=step,
+ clearCache=True,
+ captured=self._capturedCallback,
+ )
+
+ except Exception as e:
+ title = "Error while capturing thumbnail"
+ studiolibrary.widgets.MessageBox.critical(self.libraryWindow(), title, str(e))
+ raise
+
+ def showThumbnailCaptureDialog(self):
+ """
+ Ask the user if they would like to capture a thumbnail.
+
+ :rtype: int
+ """
+ title = "Create a thumbnail"
+ text = "Would you like to capture a thumbnail?"
+
+ buttons = [
+ QtWidgets.QDialogButtonBox.Yes,
+ QtWidgets.QDialogButtonBox.Ignore,
+ QtWidgets.QDialogButtonBox.Cancel
+ ]
+
+
+ parent = self.item().libraryWindow()
+ button = studiolibrary.widgets.MessageBox.question(
+ parent,
+ title,
+ text,
+ buttons=buttons
+ )
+
+ if button == QtWidgets.QDialogButtonBox.Yes:
+ self.thumbnailCapture()
+
+ return button
+
+ def accept(self):
+ """Triggered when the user clicks the save button."""
+ try:
+ self.formWidget().validate()
+
+ if self.formWidget().hasErrors():
+ raise Exception("\n".join(self.formWidget().errors()))
+
+ hasFrames = self.ui.thumbnailButton.hasFrames()
+ if not hasFrames:
+ button = self.showThumbnailCaptureDialog()
+ if button == QtWidgets.QDialogButtonBox.Cancel:
+ return
+
+ name = self.formWidget().value("name")
+ folder = self.formWidget().value("folder")
+ path = folder + "/" + name
+ thumbnail = self.ui.thumbnailButton.firstFrame()
+
+ self.save(path=path, thumbnail=thumbnail)
+
+ except Exception as e:
+ studiolibrary.widgets.MessageBox.critical(
+ self.libraryWindow(),
+ "Error while saving",
+ str(e),
+ )
+ raise
+
+ def save(self, path, thumbnail):
+ """
+ Save the item with the given objects to the given disc location path.
+
+ :type path: str
+ :type thumbnail: str
+ """
+ kwargs = self.formWidget().values()
+ sequencePath = self.ui.thumbnailButton.dirname()
+
+ item = self.item()
+ item.setPath(path)
+ item.safeSave(
+ thumbnail=thumbnail,
+ sequencePath=sequencePath,
+ **kwargs
+ )
+ self.close()
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/exampleitem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/exampleitem.py
new file mode 100644
index 0000000..1ea28f2
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/exampleitem.py
@@ -0,0 +1,92 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+"""
+NOTE: Make sure you register this item in the config.
+"""
+
+import os
+import logging
+
+from studiolibrarymaya import baseitem
+
+
+logger = logging.getLogger(__name__)
+
+
+class ExampleItem(baseitem.BaseItem):
+
+ NAME = "Example"
+ EXTENSION = ".example"
+ ICON_PATH = os.path.join(os.path.dirname(__file__), "icons", "pose.png")
+
+ def loadSchema(self, **kwargs):
+ """
+ Get the schema used for loading the example item.
+
+ :rtype: list[dict]
+ """
+ return [
+ {
+ "name": "option",
+ "type": "bool",
+ "default": False,
+ "persistent": True,
+ },
+ ]
+
+ def load(self, **kwargs):
+ """
+ The load method is called with the user values from the load schema.
+
+ :type kwargs: dict
+ """
+ logger.info("Loading %s %s", self.path(), kwargs)
+ raise NotImplementedError("The load method is not implemented!")
+
+ def saveSchema(self, **kwargs):
+ """
+ Get the schema used for saving the example item.
+
+ :rtype: list[dict]
+ """
+ return [
+ # The 'name' field and the 'folder' field are both required by
+ # the BaseItem. How this is handled may change in the future.
+ {
+ "name": "folder",
+ "type": "path",
+ "layout": "vertical",
+ "visible": False,
+ },
+ {
+ "name": "name",
+ "type": "string",
+ "layout": "vertical"
+ },
+ {
+ "name": "fileType",
+ "type": "enum",
+ "layout": "vertical",
+ "default": "mayaAscii",
+ "items": ["mayaAscii", "mayaBinary"],
+ "persistent": True
+ },
+ ]
+
+ def save(self, **kwargs):
+ """
+ The save method is called with the user values from the save schema.
+
+ :type kwargs: dict
+ """
+ logger.info("Saving %s %s", self.path(), kwargs)
+ raise NotImplementedError("The save method is not implemented!")
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/animation.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/animation.png
new file mode 100644
index 0000000..84d7e62
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/animation.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/arrow.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/arrow.png
new file mode 100644
index 0000000..2765a8c
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/arrow.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/file.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/file.png
new file mode 100644
index 0000000..0b457eb
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/file.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/insert.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/insert.png
new file mode 100644
index 0000000..08c1ee5
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/insert.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/insertConnect.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/insertConnect.png
new file mode 100644
index 0000000..a13e7d4
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/insertConnect.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/merge.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/merge.png
new file mode 100644
index 0000000..1a54b82
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/merge.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/mergeConnect.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/mergeConnect.png
new file mode 100644
index 0000000..cb3bdcc
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/mergeConnect.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/mirrortable.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/mirrortable.png
new file mode 100644
index 0000000..bbe1b62
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/mirrortable.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/pose.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/pose.png
new file mode 100644
index 0000000..ff4dfd6
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/pose.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/replace.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/replace.png
new file mode 100644
index 0000000..de47f6c
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/replace.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/replaceCompletely.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/replaceCompletely.png
new file mode 100644
index 0000000..3bea03c
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/replaceCompletely.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/replaceConnect.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/replaceConnect.png
new file mode 100644
index 0000000..68fa7d1
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/replaceConnect.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/selectionSet.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/selectionSet.png
new file mode 100644
index 0000000..fa2d0b6
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/selectionSet.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/selectionSet2.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/selectionSet2.png
new file mode 100644
index 0000000..4a03dcb
Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/selectionSet2.png differ
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/mayafileitem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/mayafileitem.py
new file mode 100644
index 0000000..9565d78
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/mayafileitem.py
@@ -0,0 +1,105 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+"""
+NOTE: Make sure you register this item in the config.
+"""
+
+import os
+import logging
+
+import maya.cmds
+
+from studiolibrarymaya import baseitem
+
+
+logger = logging.getLogger(__name__)
+
+
+class MayaFileItem(baseitem.BaseItem):
+
+ NAME = "Maya File"
+ TYPE = NAME
+ EXTENSION = ".mayafile"
+ ICON_PATH = os.path.join(os.path.dirname(__file__), "icons", "file.png")
+
+ def transferPath(self):
+ return self.path() + "/mayafile.ma"
+
+ def loadSchema(self, **kwargs):
+ """
+ Get the schema used for loading the example item.
+
+ :rtype: list[dict]
+ """
+ return []
+
+ def load(self, **kwargs):
+ """
+ The load method is called with the user values from the load schema.
+
+ :type kwargs: dict
+ """
+ logger.info("Loading %s %s", self.path(), kwargs)
+
+ maya.cmds.file(
+ self.transferPath(),
+ i=True,
+ type="mayaAscii",
+ options="v=0;",
+ preserveReferences=True,
+ mergeNamespacesOnClash=False,
+ )
+
+ def saveSchema(self, **kwargs):
+ """
+ Get the schema used for saving the example item.
+
+ :rtype: list[dict]
+ """
+ return [
+ # The 'name' field and the 'folder' field are both required by
+ # the BaseItem. How this is handled may change in the future.
+ {
+ "name": "folder",
+ "type": "path",
+ "layout": "vertical",
+ "visible": False,
+ },
+ {
+ "name": "name",
+ "type": "string",
+ "layout": "vertical"
+ },
+ {
+ "name": "objects",
+ "type": "objects",
+ "layout": "vertical"
+ },
+ ]
+
+ def save(self, **kwargs):
+ """
+ The save method is called with the user values from the save schema.
+
+ :type kwargs: dict
+ """
+ logger.info("Saving %s %s", self.path(), kwargs)
+
+ super(MayaFileItem, self).save(**kwargs)
+
+ maya.cmds.file(
+ self.transferPath(),
+ type="mayaAscii",
+ options="v=0;",
+ preserveReferences=True,
+ exportSelected=True
+ )
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/mayalibrarywindow.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/mayalibrarywindow.py
new file mode 100644
index 0000000..6abc13a
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/mayalibrarywindow.py
@@ -0,0 +1,195 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import uuid
+import logging
+
+import maya.cmds
+from maya.app.general.mayaMixin import MayaQWidgetDockableMixin
+
+import studiolibrary
+from studiolibrary import librarywindow
+
+import mutils
+
+
+logger = logging.getLogger(__name__)
+
+
+_mayaCloseScriptJob = None
+
+
+def enableMayaClosedEvent():
+ """
+ Create a Maya script job to trigger on the event "quitApplication".
+
+ Enable the Maya closed event to save the library settings on close
+
+ :rtype: None
+ """
+ global _mayaCloseScriptJob
+
+ if not _mayaCloseScriptJob:
+ event = ['quitApplication', mayaClosedEvent]
+ try:
+ _mayaCloseScriptJob = mutils.ScriptJob(event=event)
+ logger.debug("Maya close event enabled")
+ except NameError as error:
+ logging.exception(error)
+
+
+def disableMayaClosedEvent():
+ """Disable the maya closed event."""
+ global _mayaCloseScriptJob
+
+ if _mayaCloseScriptJob:
+ _mayaCloseScriptJob.kill()
+ _mayaCloseScriptJob = None
+ logger.debug("Maya close event disabled")
+
+
+def mayaClosedEvent():
+ """
+ Create a Maya script job to trigger on the event "quitApplication".
+
+ :rtype: None
+ """
+ for libraryWindow in librarywindow.LibraryWindow.instances():
+ libraryWindow.saveSettings()
+
+
+class MayaLibraryWindow(MayaQWidgetDockableMixin, librarywindow.LibraryWindow):
+
+ def destroy(self):
+ """
+ Overriding this method to avoid multiple script jobs when developing.
+ """
+ disableMayaClosedEvent()
+ librarywindow.LibraryWindow.destroy(self)
+
+ def setObjectName(self, name):
+ """
+ Overriding to ensure the widget has a unique name for Maya.
+
+ :type name: str
+ :rtype: None
+ """
+ name = '{0}_{1}'.format(name, uuid.uuid4())
+
+ librarywindow.LibraryWindow.setObjectName(self, name)
+
+ def tabWidget(self):
+ """
+ Return the tab widget for the library widget.
+
+ :rtype: QtWidgets.QTabWidget or None
+ """
+ if self.isDockable():
+ return self.parent().parent().parent()
+ else:
+ return None
+
+ def workspaceControlName(self):
+ """
+ Return the workspaceControl name for the widget.
+
+ :rtype: str or None
+ """
+ if self.isDockable() and self.parent():
+ return self.parent().objectName()
+ else:
+ return None
+
+ def isDocked(self):
+ """
+ Convenience method to return if the widget is docked.
+
+ :rtype: bool
+ """
+ return not self.isFloating()
+
+ def isFloating(self):
+ """
+ Return True if the widget is a floating window.
+
+ :rtype: bool
+ """
+ name = self.workspaceControlName()
+ if name:
+ try:
+ return maya.cmds.workspaceControl(name, q=True, floating=True)
+ except AttributeError:
+ msg = 'The "maya.cmds.workspaceControl" ' \
+ 'command is not supported!'
+
+ logger.warning(msg)
+
+ return True
+
+ def window(self):
+ """
+ Overriding this method to return itself when docked.
+
+ This is used for saving the correct window position and size settings.
+
+ :rtype: QWidgets.QWidget
+ """
+ if self.isDocked():
+ return self
+ else:
+ return librarywindow.LibraryWindow.window(self)
+
+ def show(self, **kwargs):
+ """
+ Show the library widget as a dockable window.
+
+ Set dockable=False in kwargs if you want to show the widget as a floating window.
+
+ :rtype: None
+ """
+ dockable = kwargs.get('dockable', True)
+ MayaQWidgetDockableMixin.show(self, dockable=dockable)
+ self.raise_()
+ self.fixBorder()
+
+ def resizeEvent(self, event):
+ """
+ Override method to remove the border when the window size has changed.
+
+ :type event: QtCore.QEvent
+ :rtype: None
+ """
+ if event.isAccepted():
+ if not self.isLoaded():
+ self.fixBorder()
+
+ def floatingChanged(self, isFloating):
+ """
+ Override method to remove the grey border when the parent has changed.
+
+ Only supported/triggered in Maya 2018
+
+ :rtype: None
+ """
+ self.fixBorder()
+
+ def fixBorder(self):
+ """
+ Remove the grey border around the tab widget.
+
+ :rtype: None
+ """
+ if self.tabWidget():
+ self.tabWidget().setStyleSheet("border:0px;")
+
+
+enableMayaClosedEvent()
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/mirroritem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/mirroritem.py
new file mode 100644
index 0000000..a563198
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/mirroritem.py
@@ -0,0 +1,231 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import os
+import logging
+
+from studiolibrarymaya import baseitem
+
+try:
+ import mutils
+ import maya.cmds
+except ImportError as error:
+ print(error)
+
+
+logger = logging.getLogger(__name__)
+
+
+def save(path, *args, **kwargs):
+ """Convenience function for saving a MirrorItem."""
+ MirrorItem(path).safeSave(*args, **kwargs)
+
+
+def load(path, *args, **kwargs):
+ """Convenience function for loading a MirrorItem."""
+ MirrorItem(path).load(*args, **kwargs)
+
+
+class MirrorItem(baseitem.BaseItem):
+
+ NAME = "Mirror Table"
+ EXTENSION = ".mirror"
+ ICON_PATH = os.path.join(os.path.dirname(__file__), "icons", "mirrortable.png")
+ TRANSFER_CLASS = mutils.MirrorTable
+ TRANSFER_BASENAME = "mirrortable.json"
+
+ def __init__(self, *args, **kwargs):
+ """
+ :type args: list
+ :type kwargs: dict
+ """
+ super(MirrorItem, self).__init__(*args, **kwargs)
+
+ self._validatedObjects = []
+
+ def loadSchema(self):
+ """
+ Get schema used to load the mirror table item.
+
+ :rtype: list[dict]
+ """
+ schema = super(MirrorItem, self).loadSchema()
+
+ mt = self.transferObject()
+
+ schema.insert(2, {"name": "Left", "value": mt.leftSide()})
+ schema.insert(3, {"name": "Right", "value": mt.rightSide()})
+
+ schema.extend([
+ {
+ "name": "optionsGroup",
+ "title": "Options",
+ "type": "group",
+ "order": 2,
+ },
+ {
+ "name": "keysOption",
+ "title": "Keys",
+ "type": "radio",
+ "value": "Selected Range",
+ "items": ["All Keys", "Selected Range"],
+ "persistent": True,
+ },
+ {
+ "name": "option",
+ "type": "enum",
+ "default": "swap",
+ "items": ["swap", "left to right", "right to left"],
+ "persistent": True
+ },
+ ])
+
+ return schema
+
+ def load(self, **kwargs):
+ """
+ Load the current mirror table to the given objects.
+
+ :type kwargs: dict
+ """
+ mt = mutils.MirrorTable.fromPath(self.path() + "/mirrortable.json")
+ mt.load(
+ objects=kwargs.get("objects"),
+ namespaces=kwargs.get("namespaces"),
+ option=kwargs.get("option"),
+ keysOption=kwargs.get("keysOption"),
+ time=kwargs.get("time")
+ )
+
+ def saveSchema(self):
+ """
+ Get the fields used to save the item.
+
+ :rtype: list[dict]
+ """
+ return [
+ {
+ "name": "folder",
+ "type": "path",
+ "layout": "vertical",
+ "visible": False,
+ },
+ {
+ "name": "name",
+ "type": "string",
+ "layout": "vertical"
+ },
+ {
+ "name": "mirrorPlane",
+ "type": "buttonGroup",
+ "default": "YZ",
+ "layout": "vertical",
+ "items": ["YZ", "XY", "XZ"],
+ },
+ {
+ "name": "leftSide",
+ "type": "string",
+ "layout": "vertical",
+ "menu": {
+ "name": "0"
+ }
+ },
+ {
+ "name": "rightSide",
+ "type": "string",
+ "layout": "vertical",
+ "menu": {
+ "name": "0"
+ }
+ },
+ {
+ "name": "comment",
+ "type": "text",
+ "layout": "vertical"
+ },
+ {
+ "name": "objects",
+ "type": "objects",
+ "label": {
+ "visible": False
+ }
+ },
+ ]
+
+ def saveValidator(self, **kwargs):
+ """
+ The save validator is called when an input field has changed.
+
+ :type kwargs: dict
+ :rtype: list[dict]
+ """
+ results = super(MirrorItem, self).saveValidator(**kwargs)
+
+ objects = maya.cmds.ls(selection=True) or []
+
+ dirty = kwargs.get("fieldChanged") in ["leftSide", "rightSide"]
+ dirty = dirty or self._validatedObjects != objects
+
+ if dirty:
+ self._validatedObjects = objects
+
+ leftSide = kwargs.get("leftSide", "")
+ if not leftSide:
+ leftSide = mutils.MirrorTable.findLeftSide(objects)
+
+ rightSide = kwargs.get("rightSide", "")
+ if not rightSide:
+ rightSide = mutils.MirrorTable.findRightSide(objects)
+
+ mt = mutils.MirrorTable.fromObjects(
+ [],
+ leftSide=leftSide,
+ rightSide=rightSide
+ )
+
+ results.extend([
+ {
+ "name": "leftSide",
+ "value": leftSide,
+ "menu": {
+ "name": str(mt.leftCount(objects))
+ }
+ },
+ {
+ "name": "rightSide",
+ "value": rightSide,
+ "menu": {
+ "name": str(mt.rightCount(objects))
+ }
+ },
+ ])
+
+ return results
+
+ def save(self, objects, **kwargs):
+ """
+ Save the given objects to the item path on disc.
+
+ :type objects: list[str]
+ :type kwargs: dict
+ """
+ super(MirrorItem, self).save(**kwargs)
+
+ # Save the mirror table to the given location
+ mutils.saveMirrorTable(
+ self.path() + "/mirrortable.json",
+ objects,
+ metadata={"description": kwargs.get("comment", "")},
+ leftSide=kwargs.get("leftSide"),
+ rightSide=kwargs.get("rightSide"),
+ mirrorPlane=kwargs.get("mirrorPlane"),
+ )
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/poseitem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/poseitem.py
new file mode 100644
index 0000000..39050f8
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/poseitem.py
@@ -0,0 +1,392 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import os
+import logging
+
+import studiolibrary
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+from studiolibrarymaya import baseitem
+from studiolibrarymaya import baseloadwidget
+
+try:
+ import mutils
+ import maya.cmds
+except ImportError as error:
+ print(error)
+
+
+logger = logging.getLogger(__name__)
+
+
+def save(path, *args, **kwargs):
+ """Convenience function for saving a PoseItem."""
+ PoseItem(path).safeSave(*args, **kwargs)
+
+
+def load(path, *args, **kwargs):
+ """Convenience function for loading a PoseItem."""
+ PoseItem(path).load(*args, **kwargs)
+
+
+class PoseLoadWidget(baseloadwidget.BaseLoadWidget):
+
+ @classmethod
+ def createFromPath(cls, path, theme=None):
+
+ item = PoseItem(path)
+ widget = cls(item)
+
+ if not theme:
+ import studiolibrary.widgets
+ theme = studiolibrary.widgets.Theme()
+ widget.setStyleSheet(theme.styleSheet())
+
+ widget.show()
+
+ def __init__(self, *args, **kwargs):
+ super(PoseLoadWidget, self).__init__(*args, **kwargs)
+
+ self._options = None
+ self._pose = mutils.Pose.fromPath(self.item().transferPath())
+
+ self.ui.blendFrame = QtWidgets.QFrame(self)
+
+ layout = QtWidgets.QHBoxLayout()
+ self.ui.blendFrame.setLayout(layout)
+
+ if self.item().libraryWindow():
+ self.item().libraryWindow().itemsWidget().itemSliderMoved.connect(self._sliderMoved)
+ self.item().libraryWindow().itemsWidget().itemSliderReleased.connect(self._sliderReleased)
+ self.item().libraryWindow().itemsWidget().itemDoubleClicked.connect(self._itemDoubleClicked)
+
+ self.ui.blendSlider = QtWidgets.QSlider(self)
+ self.ui.blendSlider.setObjectName("blendSlider")
+ self.ui.blendSlider.setMinimum(-30)
+ self.ui.blendSlider.setMaximum(130)
+ self.ui.blendSlider.setOrientation(QtCore.Qt.Horizontal)
+ self.ui.blendSlider.sliderMoved.connect(self._sliderMoved)
+ self.ui.blendSlider.sliderReleased.connect(self._sliderReleased)
+
+ self.ui.blendEdit = QtWidgets.QLineEdit(self)
+ self.ui.blendEdit.setObjectName("blendEdit")
+ self.ui.blendEdit.setText("0")
+ self.ui.blendEdit.editingFinished.connect(self._blendEditChanged)
+
+ validator = QtGui.QIntValidator(-200, 200, self)
+ self.ui.blendEdit.setValidator(validator)
+
+ layout.addWidget(self.ui.blendSlider)
+ layout.addWidget(self.ui.blendEdit)
+
+ self.setCustomWidget(self.ui.blendFrame)
+
+ def _itemDoubleClicked(self):
+ """Triggered when the user double-clicks a pose."""
+ self.accept()
+
+ def _sliderMoved(self, value):
+ """Triggered when the user moves the slider handle."""
+ self.load(blend=value, batchMode=True)
+
+ def _sliderReleased(self):
+ """Triggered when the user releases the slider handle."""
+ try:
+ self.load(blend=self.ui.blendSlider.value(), refresh=False)
+ self._options = {}
+ except Exception as error:
+ self.item().showErrorDialog("Item Error", str(error))
+ raise
+
+ def _blendEditChanged(self, *args):
+ """Triggered when the user changes the blend edit value."""
+ try:
+ self._options = {}
+ self.load(blend=int(self.ui.blendEdit.text()), clearSelection=False)
+ except Exception as error:
+ self.item().showErrorDialog("Item Error", str(error))
+ raise
+
+ def loadValidator(self, *args, **kwargs):
+ self._options = {}
+ return super(PoseLoadWidget, self).loadValidator(*args, **kwargs)
+
+ def accept(self):
+ """Triggered when the user clicks the apply button."""
+ try:
+ self._options = {}
+ self.load(clearCache=True, clearSelection=False)
+ except Exception as error:
+ self.item().showErrorDialog("Item Error", str(error))
+ raise
+
+ def load(
+ self,
+ blend=100.0,
+ refresh=True,
+ batchMode=False,
+ clearCache=False,
+ clearSelection=True,
+ ):
+ """
+ Load the pose item with the current user settings from disc.
+
+ :type blend: float
+ :type refresh: bool
+ :type batchMode: bool
+ :type clearCache: bool
+ :type clearSelection: bool
+ """
+ if batchMode:
+ self.formWidget().setValidatorEnabled(False)
+ else:
+ self.formWidget().setValidatorEnabled(True)
+
+ if not self._options:
+
+ self._options = self.formWidget().values()
+ self._options['mirrorTable'] = self.item().mirrorTable()
+ self._options['objects'] = maya.cmds.ls(selection=True) or []
+
+ if not self._options["searchAndReplaceEnabled"]:
+ self._options["searchAndReplace"] = None
+
+ del self._options["namespaceOption"]
+ del self._options["searchAndReplaceEnabled"]
+
+ self.ui.blendEdit.blockSignals(True)
+ self.ui.blendSlider.setValue(blend)
+ self.ui.blendEdit.setText(str(int(blend)))
+ self.ui.blendEdit.blockSignals(False)
+
+ if self.item().libraryWindow():
+
+ self.item().libraryWindow().itemsWidget().blockSignals(True)
+ self.item().setSliderValue(blend)
+ self.item().libraryWindow().itemsWidget().blockSignals(False)
+
+ if batchMode:
+ self.item().libraryWindow().showToastMessage("Blend: {0}%".format(blend))
+
+ try:
+ self._pose.load(
+ blend=blend,
+ refresh=refresh,
+ batchMode=batchMode,
+ clearCache=clearCache,
+ clearSelection=clearSelection,
+ **self._options
+ )
+ finally:
+ self.item().setSliderDown(batchMode)
+
+
+def findMirrorTable(path):
+ """
+ Get the mirror table object for this item.
+
+ :rtype: mutils.MirrorTable or None
+ """
+ mirrorTable = None
+
+ mirrorTablePaths = list(studiolibrary.walkup(
+ path,
+ match=lambda path: path.endswith(".mirror"),
+ depth=10,
+ )
+ )
+
+ if mirrorTablePaths:
+ mirrorTablePath = mirrorTablePaths[0]
+
+ path = os.path.join(mirrorTablePath, "mirrortable.json")
+
+ if path:
+ mirrorTable = mutils.MirrorTable.fromPath(path)
+
+ return mirrorTable
+
+
+class PoseItem(baseitem.BaseItem):
+
+ NAME = "Pose"
+ EXTENSION = ".pose"
+ ICON_PATH = os.path.join(os.path.dirname(__file__), "icons", "pose.png")
+ LOAD_WIDGET_CLASS = PoseLoadWidget
+ TRANSFER_CLASS = mutils.Pose
+ TRANSFER_BASENAME = "pose.json"
+
+ def __init__(self, *args, **kwargs):
+ """
+ Create a new instance of the pose item from the given path.
+
+ :type path: str
+ :type args: list
+ :type kwargs: dict
+ """
+ super(PoseItem, self).__init__(*args, **kwargs)
+
+ self.setSliderEnabled(True)
+
+ def mirrorTableSearchAndReplace(self):
+ """
+ Get the values for search and replace from the mirror table.
+
+ :rtype: (str, str)
+ """
+ mirrorTable = findMirrorTable(self.path())
+
+ return mirrorTable.leftSide(), mirrorTable.rightSide()
+
+ def switchSearchAndReplace(self):
+ """
+ Switch the values of the search and replace field.
+
+ :rtype: (str, str)
+ """
+ values = self.currentLoadValue("searchAndReplace")
+ return values[1], values[0]
+
+ def clearSearchAndReplace(self):
+ """
+ Clear the search and replace field.
+
+ :rtype: (str, str)
+ """
+ return '', ''
+
+ def doubleClicked(self):
+ """Triggered when the user double-click the item."""
+ pass
+
+ def loadSchema(self):
+ """
+ Get schema used to load the pose item.
+
+ :rtype: list[dict]
+ """
+ schema = [
+ {
+ "name": "optionsGroup",
+ "title": "Options",
+ "type": "group",
+ "order": 2,
+ },
+ {
+ "name": "key",
+ "type": "bool",
+ "inline": True,
+ "default": False,
+ "persistent": True,
+ },
+ {
+ "name": "mirror",
+ "type": "bool",
+ "inline": True,
+ "default": False,
+ "persistent": True,
+ },
+ {
+ "name": "additive",
+ "type": "bool",
+ "inline": True,
+ "default": False,
+ "persistent": True,
+ },
+ {
+ "name": "searchAndReplaceEnabled",
+ "title": "Search and Replace",
+ "type": "bool",
+ "inline": True,
+ "default": False,
+ "persistent": True,
+ },
+ {
+ "name": "searchAndReplace",
+ "title": "",
+ "type": "stringDouble",
+ "default": ("", ""),
+ "placeholder": ("search", "replace"),
+ "persistent": True,
+ "actions": [
+ {
+ "name": "Switch",
+ "callback": self.switchSearchAndReplace,
+ },
+ {
+ "name": "Clear",
+ "callback": self.clearSearchAndReplace,
+ },
+ {
+ "name": "From Mirror Table",
+ "enabled": bool(findMirrorTable(self.path())),
+ "callback": self.mirrorTableSearchAndReplace,
+ },
+ ]
+ },
+ ]
+
+ schema.extend(super(PoseItem, self).loadSchema())
+
+ return schema
+
+ def mirrorTable(self):
+ return findMirrorTable(self.path())
+
+ def loadValidator(self, **values):
+ """
+ Using the validator to change the state of the mirror option.
+
+ :type values: dict
+ :rtype: list[dict]
+ """
+ # Mirror check box
+ mirrorTip = "Cannot find a mirror table!"
+ mirrorTable = findMirrorTable(self.path())
+ if mirrorTable:
+ mirrorTip = "Using mirror table: %s" % mirrorTable.path()
+
+ fields = [
+ {
+ "name": "mirror",
+ "toolTip": mirrorTip,
+ "enabled": mirrorTable is not None,
+ },
+ {
+ "name": "searchAndReplace",
+ "visible": values.get("searchAndReplaceEnabled")
+ },
+ ]
+
+ fields.extend(super(PoseItem, self).loadValidator(**values))
+
+ return fields
+
+ def save(self, objects, **kwargs):
+ """
+ Save all the given object data to the item path on disc.
+
+ :type objects: list[str]
+ :type kwargs: dict
+ """
+ super(PoseItem, self).save(**kwargs)
+
+ # Save the pose to the temp location
+ mutils.savePose(
+ self.transferPath(),
+ objects,
+ metadata={"description": kwargs.get("comment", "")}
+ )
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/setsitem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/setsitem.py
new file mode 100644
index 0000000..b84ba01
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/setsitem.py
@@ -0,0 +1,65 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import os
+
+try:
+ import mutils
+except ImportError as error:
+ print(error)
+
+from studiolibrarymaya import baseitem
+
+
+def save(path, *args, **kwargs):
+ """Convenience function for saving a SetsItem."""
+ SetsItem(path).safeSave(*args, **kwargs)
+
+
+def load(path, *args, **kwargs):
+ """Convenience function for loading a SetsItem."""
+ SetsItem(path).load(*args, **kwargs)
+
+
+class SetsItem(baseitem.BaseItem):
+
+ NAME = "Selection Set"
+ EXTENSION = ".set"
+ ICON_PATH = os.path.join(os.path.dirname(__file__), "icons", "selectionSet.png")
+ TRANSFER_CLASS = mutils.SelectionSet
+ TRANSFER_BASENAME = "set.json"
+
+ def loadFromCurrentValues(self):
+ """Load the selection set using the settings for this item."""
+ self.load(namespaces=self.namespaces())
+
+ def load(self, namespaces=None):
+ """
+ :type namespaces: list[str] | None
+ """
+ self.selectContent(namespaces=namespaces)
+
+ def save(self, objects, **kwargs):
+ """
+ Save all the given object data to the item path on disc.
+
+ :type objects: list[str]
+ :type kwargs: dict
+ """
+ super(SetsItem, self).save(**kwargs)
+
+ # Save the selection set to the given path
+ mutils.saveSelectionSet(
+ self.path() + "/set.json",
+ objects,
+ metadata={"description": kwargs.get("comment", "")}
+ )
diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/setsmenu.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/setsmenu.py
new file mode 100644
index 0000000..79a5420
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/setsmenu.py
@@ -0,0 +1,167 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import os
+import logging
+from functools import partial
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtWidgets
+
+import studiolibrary
+
+from studiolibrarymaya import setsitem
+
+
+logger = logging.getLogger(__name__)
+
+
+DIRNAME = os.path.dirname(__file__)
+ARROW_ICON_PATH = os.path.join(DIRNAME, "icons", "arrow.png")
+
+
+def selectContentAction(item, parent=None):
+ """
+ :param item: mayabaseitem.MayaBaseItem
+ :param parent: QtWidgets.QMenu
+ """
+ arrowIcon = QtGui.QIcon(ARROW_ICON_PATH)
+ action = QtWidgets.QAction(arrowIcon, "Select content", parent)
+ action.triggered.connect(item.selectContent)
+ return action
+
+
+def showSetsMenu(path, **kwargs):
+ """
+ Show the frame range menu at the current cursor position.
+
+ :type path: str
+ :rtype: QtWidgets.QAction
+ """
+ menu = SetsMenu.fromPath(path, **kwargs)
+ position = QtGui.QCursor().pos()
+ action = menu.exec_(position)
+ return action
+
+
+class SetsMenu(QtWidgets.QMenu):
+
+ @classmethod
+ def fromPath(cls, path, parent=None, libraryWindow=None, **kwargs):
+ """
+ Return a new SetMenu instance from the given path.
+
+ :type path: str
+ :type parent: QtWidgets.QMenu or None
+ :type libraryWindow: studiolibrary.LibraryWindow or None
+ :type kwargs: dict
+ :rtype: QtWidgets.QAction
+ """
+ item = setsitem.SetsItem(path, libraryWindow=libraryWindow)
+ return cls(item, parent, enableSelectContent=False, **kwargs)
+
+ def __init__(
+ self,
+ item,
+ parent=None,
+ namespaces=None,
+ enableSelectContent=True,
+ ):
+ """
+ :type item: studiolibrarymaya.BaseItem
+ :type parent: QtWidgets.QMenu or None
+ :type namespaces: list[str] or None
+ :type enableSelectContent: bool
+ """
+ parent = parent or item.libraryWindow()
+ QtWidgets.QMenu.__init__(self, "Selection Sets", parent)
+
+ icon = QtGui.QIcon(setsitem.SetsItem.ICON_PATH)
+ self.setIcon(icon)
+
+ self._item = item
+ self._namespaces = namespaces
+ self._enableSelectContent = enableSelectContent
+ self.reload()
+
+ def item(self):
+ """
+ :rtype: mayabaseitem.MayaBaseItem
+ """
+ return self._item
+
+ def namespaces(self):
+ """
+ :rtype: list[str]
+ """
+ return self._namespaces
+
+ def selectContent(self):
+ """
+ :rtype: None
+ """
+ self.item().selectContent(namespaces=self.namespaces())
+
+ def selectionSets(self):
+ """
+ :rtype: list[setsitem.SetsItem]
+ """
+ path = self.item().path()
+
+ paths = studiolibrary.walkup(
+ path,
+ match=lambda path: path.endswith(".set"),
+ depth=10,
+ )
+
+ items = []
+ paths = list(paths)
+ libraryWindow = self.item().libraryWindow()
+
+ for path in paths:
+ item = setsitem.SetsItem(path)
+ item.setLibraryWindow(libraryWindow)
+ items.append(item)
+
+ return items
+
+ def reload(self):
+ """
+ :rtype: None
+ """
+ self.clear()
+
+ if self._enableSelectContent:
+ action = selectContentAction(item=self.item(), parent=self)
+ self.addAction(action)
+ self.addSeparator()
+
+ selectionSets = self.selectionSets()
+
+ if selectionSets:
+ for selectionSet in selectionSets:
+
+ dirname = os.path.basename(os.path.dirname(selectionSet.path()))
+
+ basename = os.path.basename(selectionSet.path())
+ basename = basename.replace(selectionSet.EXTENSION, "")
+
+ nicename = dirname + ": " + basename
+
+ action = QtWidgets.QAction(nicename, self)
+ callback = partial(selectionSet.load, namespaces=self.namespaces())
+ action.triggered.connect(callback)
+ self.addAction(action)
+ else:
+ action = QtWidgets.QAction("No selection sets found!", self)
+ action.setEnabled(False)
+ self.addAction(action)
diff --git a/2023/scripts/animation_tools/studiolibrary/studioqt/__init__.py b/2023/scripts/animation_tools/studiolibrary/studioqt/__init__.py
new file mode 100644
index 0000000..9465a48
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studioqt/__init__.py
@@ -0,0 +1,21 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from studioqt.utils import *
+from studioqt.icon import Icon
+from studioqt.menu import Menu
+from studioqt.color import Color
+from studioqt.pixmap import Pixmap
+from studioqt.stylesheet import StyleSheet
+from studioqt.decorators import showWaitCursor
+from studioqt.decorators import showArrowCursor
+from studioqt.imagesequence import ImageSequence
diff --git a/2023/scripts/animation_tools/studiolibrary/studioqt/color.py b/2023/scripts/animation_tools/studiolibrary/studioqt/color.py
new file mode 100644
index 0000000..5a2a920
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studioqt/color.py
@@ -0,0 +1,78 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from studiovendor.Qt import QtGui
+
+
+COLORS = [
+ {"name": "red", "color": "rgb(255, 115, 100)"},
+ {"name": "orange", "color": "rgb(255, 150, 100)"},
+ {"name": "yellow", "color": "rgb(255, 210, 103)"},
+ {"name": "green", "color": "rgb(140, 220, 140)"},
+ {"name": "blue", "color": "rgb(110, 175, 255)"},
+ {"name": "purple", "color": "rgb(160, 120, 255)"},
+ {"name": "pink", "color": "rgb(230, 130, 180)"},
+ {"name": "grey", "color": "rgb(125, 125, 140)"},
+]
+
+COLORS_INDEXED = {c["name"]: c for c in COLORS}
+
+
+class Color(QtGui.QColor):
+
+ @classmethod
+ def fromColor(cls, color):
+ """
+ :type color: QtGui.QColor
+ """
+ color = ('rgba(%d, %d, %d, %d)' % color.getRgb())
+ return cls.fromString(color)
+
+ @classmethod
+ def fromString(cls, c):
+ """
+ :type c: str
+ """
+ a = 255
+
+ c = c.replace(";", "")
+ if not c.startswith("rgb"):
+ c = COLORS_INDEXED.get(c)
+ if c:
+ c = c.get("color")
+ else:
+ return cls(0, 0, 0, 255)
+
+ try:
+ r, g, b, a = c.replace("rgb(", "").replace("rgba(", "").replace(")", "").split(",")
+ except ValueError:
+ r, g, b = c.replace("rgb(", "").replace(")", "").split(",")
+
+ return cls(int(r), int(g), int(b), int(a))
+
+ def __eq__(self, other):
+ if isinstance(other, Color):
+ return self.toString() == other.toString()
+ else:
+ return QtGui.QColor.__eq__(self, other)
+
+ def toString(self):
+ """
+ :type: str
+ """
+ return 'rgba(%d, %d, %d, %d)' % self.getRgb()
+
+ def isDark(self):
+ """
+ :type: bool
+ """
+ return self.red() < 125 and self.green() < 125 and self.blue() < 125
diff --git a/2023/scripts/animation_tools/studiolibrary/studioqt/decorators.py b/2023/scripts/animation_tools/studiolibrary/studioqt/decorators.py
new file mode 100644
index 0000000..ed9c4eb
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studioqt/decorators.py
@@ -0,0 +1,47 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtWidgets
+
+
+def showWaitCursor(fn):
+
+ def wrapped(*args, **kwargs):
+ cursor = QtGui.QCursor(QtCore.Qt.WaitCursor)
+ QtWidgets.QApplication.setOverrideCursor(cursor)
+ try:
+ return fn(*args, **kwargs)
+ finally:
+ QtWidgets.QApplication.restoreOverrideCursor()
+
+ wrapped.__name__ = fn.__name__
+ wrapped.__doc__ = fn.__doc__
+
+ return wrapped
+
+
+def showArrowCursor(fn):
+
+ def wrapped(*args, **kwargs):
+ cursor = QtGui.QCursor(QtCore.Qt.ArrowCursor)
+ QtWidgets.QApplication.setOverrideCursor(cursor)
+ try:
+ return fn(*args, **kwargs)
+ finally:
+ QtWidgets.QApplication.restoreOverrideCursor()
+
+ wrapped.__name__ = fn.__name__
+ wrapped.__doc__ = fn.__doc__
+
+ return wrapped
diff --git a/2023/scripts/animation_tools/studiolibrary/studioqt/icon.py b/2023/scripts/animation_tools/studiolibrary/studioqt/icon.py
new file mode 100644
index 0000000..a6b59dc
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studioqt/icon.py
@@ -0,0 +1,185 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import copy
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+
+import studioqt
+
+
+class Icon(QtGui.QIcon):
+
+ @classmethod
+ def fa(cls, path, **kwargs):
+ """
+ Create a new icon with the given path, options and state.
+
+ Example:
+ icon = studioqt.Icon.fa(
+ path,
+ color="rgb(255,255,255)"
+ color_disabled="rgba(0,200,200,20)",
+ )
+
+ :type path: str
+ :type kwargs: dict
+
+ :rtype: studioqt.Icon
+ """
+ color = kwargs.get('color', QtGui.QColor(0, 0, 0))
+
+ pixmap = studioqt.Pixmap(path)
+ pixmap.setColor(color)
+
+ valid_options = [
+ 'active',
+ 'selected',
+ 'disabled',
+ 'on',
+ 'off',
+ 'on_active',
+ 'on_selected',
+ 'on_disabled',
+ 'off_active',
+ 'off_selected',
+ 'off_disabled',
+ 'color',
+ 'color_on',
+ 'color_off',
+ 'color_active',
+ 'color_selected',
+ 'color_disabled',
+ 'color_on_selected',
+ 'color_on_active',
+ 'color_on_disabled',
+ 'color_off_selected',
+ 'color_off_active',
+ 'color_off_disabled',
+ ]
+
+ default = {
+ "on_active": kwargs.get("active", studioqt.Pixmap(path)),
+ "off_active": kwargs.get("active", studioqt.Pixmap(path)),
+ "on_disabled": kwargs.get("disabled", studioqt.Pixmap(path)),
+ "off_disabled": kwargs.get("disabled", studioqt.Pixmap(path)),
+ "on_selected": kwargs.get("selected", studioqt.Pixmap(path)),
+ "off_selected": kwargs.get("selected", studioqt.Pixmap(path)),
+ "color_on_active": kwargs.get("color_active", color),
+ "color_off_active": kwargs.get("color_active", color),
+ "color_on_disabled": kwargs.get("color_disabled", color),
+ "color_off_disabled": kwargs.get("color_disabled", color),
+ "color_on_selected": kwargs.get("color_selected", color),
+ "color_off_selected": kwargs.get("color_selected", color),
+ }
+
+ default.update(kwargs)
+ kwargs = copy.copy(default)
+
+ for option in valid_options:
+ if 'color' in option:
+ kwargs[option] = kwargs.get(option, color)
+ else:
+ svg_path = kwargs.get(option, path)
+ kwargs[option] = studioqt.Pixmap(svg_path)
+
+ options = {
+ QtGui.QIcon.On: {
+ QtGui.QIcon.Normal: (kwargs['color_on'], kwargs['on']),
+ QtGui.QIcon.Active: (kwargs['color_on_active'], kwargs['on_active']),
+ QtGui.QIcon.Disabled: (kwargs['color_on_disabled'], kwargs['on_disabled']),
+ QtGui.QIcon.Selected: (kwargs['color_on_selected'], kwargs['on_selected'])
+ },
+
+ QtGui.QIcon.Off: {
+ QtGui.QIcon.Normal: (kwargs['color_off'], kwargs['off']),
+ QtGui.QIcon.Active: (kwargs['color_off_active'], kwargs['off_active']),
+ QtGui.QIcon.Disabled: (kwargs['color_off_disabled'], kwargs['off_disabled']),
+ QtGui.QIcon.Selected: (kwargs['color_off_selected'], kwargs['off_selected'])
+ }
+ }
+
+ icon = cls(pixmap)
+
+ for state in options:
+ for mode in options[state]:
+ color, pixmap = options[state][mode]
+
+ pixmap = studioqt.Pixmap(pixmap)
+ pixmap.setColor(color)
+
+ icon.addPixmap(pixmap, mode, state)
+
+ return icon
+
+ def setColor(self, color, size=None):
+ """
+ :type color: QtGui.QColor
+ :rtype: None
+ """
+ icon = self
+ size = size or icon.actualSize(QtCore.QSize(256, 256))
+ pixmap = icon.pixmap(size)
+
+ if not self.isNull():
+ painter = QtGui.QPainter(pixmap)
+ painter.setCompositionMode(QtGui.QPainter.CompositionMode_SourceIn)
+ painter.setBrush(color)
+ painter.setPen(color)
+ painter.drawRect(pixmap.rect())
+ painter.end()
+
+ icon = QtGui.QIcon(pixmap)
+ self.swap(icon)
+
+ if self._badgeEnabled:
+ self.updateBadge()
+
+ def __init__(self, *args, **kwargs):
+ super(Icon, self).__init__(*args, **kwargs)
+
+ self._badgeColor = None
+ self._badgeEnabled = False
+
+ def badgeColor(self):
+ return self._badgeColor
+
+ def setBadgeColor(self, color):
+ self._badgeColor = color
+
+ def badgeEnabled(self):
+ return self._badgeEnabled
+
+ def setBadgeEnabled(self, enabled):
+ self._badgeEnabled = enabled
+
+ def updateBadge(self):
+ """
+ """
+ color = self.badgeColor() or QtGui.QColor(240, 240, 100)
+ size = self.actualSize(QtCore.QSize(256, 256))
+
+ pixmap = self.pixmap(size)
+ painter = QtGui.QPainter(pixmap)
+
+ pen = QtGui.QPen(color)
+ pen.setWidth(0)
+ painter.setPen(pen)
+
+ painter.setBrush(color)
+ painter.setRenderHint(QtGui.QPainter.Antialiasing)
+ painter.drawEllipse(0, 0, size.height()/3.0, size.width()/3.0)
+ painter.end()
+
+ icon = QtGui.QIcon(pixmap)
+ self.swap(icon)
diff --git a/2023/scripts/animation_tools/studiolibrary/studioqt/imagesequence.py b/2023/scripts/animation_tools/studiolibrary/studioqt/imagesequence.py
new file mode 100644
index 0000000..67eaa03
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studioqt/imagesequence.py
@@ -0,0 +1,230 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import re
+import os
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+
+
+__all__ = ['ImageSequence', 'ImageSequenceWidget']
+
+
+class ImageSequence(QtCore.QObject):
+
+ DEFAULT_FPS = 24
+
+ frameChanged = QtCore.Signal(int)
+
+ def __init__(self, path, *args):
+ QtCore.QObject.__init__(self, *args)
+
+ self._timer = None
+ self._frame = 0
+ self._frames = []
+ self._dirname = None
+ self._paused = False
+
+ if path:
+ self.setPath(path)
+
+ def firstFrame(self):
+ """
+ Get the path to the first frame.
+
+ :rtype: str
+ """
+ if self._frames:
+ return self._frames[0]
+ return ""
+
+ def setPath(self, path):
+ """
+ Set a single frame or a directory to an image sequence.
+
+ :type path: str
+ """
+ if os.path.isfile(path):
+ self._frame = 0
+ self._frames = [path]
+ elif os.path.isdir(path):
+ self.setDirname(path)
+
+ def setDirname(self, dirname):
+ """
+ Set the location to the image sequence.
+
+ :type dirname: str
+ :rtype: None
+ """
+ def naturalSortItems(items):
+ """
+ Sort the given list in the way that humans expect.
+ """
+ convert = lambda text: int(text) if text.isdigit() else text
+ alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
+ items.sort(key=alphanum_key)
+
+ self._dirname = dirname
+ if os.path.isdir(dirname):
+ self._frames = [dirname + "/" + filename for filename in os.listdir(dirname)]
+ naturalSortItems(self._frames)
+
+ def dirname(self):
+ """
+ Return the location to the image sequence.
+
+ :rtype: str
+ """
+ return self._dirname
+
+ def reset(self):
+ """
+ Stop and reset the current frame to 0.
+
+ :rtype: None
+ """
+ if not self._timer:
+ self._timer = QtCore.QTimer(self.parent())
+ self._timer.setSingleShot(False)
+ self._timer.timeout.connect(self._frameChanged)
+
+ if not self._paused:
+ self._frame = 0
+ self._timer.stop()
+
+ def pause(self):
+ """
+ ImageSequence will enter Paused state.
+
+ :rtype: None
+ """
+ self._paused = True
+ self._timer.stop()
+
+ def resume(self):
+ """
+ ImageSequence will enter Playing state.
+
+ :rtype: None
+ """
+ if self._paused:
+ self._paused = False
+ self._timer.start()
+
+ def stop(self):
+ """
+ Stops the movie. ImageSequence enters NotRunning state.
+
+ :rtype: None
+ """
+ self._timer.stop()
+
+ def start(self):
+ """
+ Starts the movie. ImageSequence will enter Running state
+
+ :rtype: None
+ """
+ self.reset()
+ if self._timer:
+ import studiolibrary
+ fps = studiolibrary.config.get("playbackFrameRate", self.DEFAULT_FPS)
+ self._timer.start(1000.0 / fps)
+
+ def frames(self):
+ """
+ Return all the filenames in the image sequence.
+
+ :rtype: list[str]
+ """
+ return self._frames
+
+ def _frameChanged(self):
+ """
+ Triggered when the current frame changes.
+
+ :rtype: None
+ """
+ if not self._frames:
+ return
+
+ frame = self._frame
+ frame += 1
+ self.jumpToFrame(frame)
+
+ def percent(self):
+ """
+ Return the current frame position as a percentage.
+
+ :rtype: None
+ """
+ if len(self._frames) == self._frame + 1:
+ _percent = 1
+ else:
+ _percent = float((len(self._frames) + self._frame)) / len(self._frames) - 1
+ return _percent
+
+ def frameCount(self):
+ """
+ Return the number of frames.
+
+ :rtype: int
+ """
+ return len(self._frames)
+
+ def currentIcon(self):
+ """
+ Returns the current frame as a QIcon.
+
+ :rtype: QtGui.QIcon
+ """
+ return QtGui.QIcon(self.currentFilename())
+
+ def currentPixmap(self):
+ """
+ Return the current frame as a QPixmap.
+
+ :rtype: QtGui.QPixmap
+ """
+ return QtGui.QPixmap(self.currentFilename())
+
+ def currentFilename(self):
+ """
+ Return the current file name.
+
+ :rtype: str or None
+ """
+ try:
+ return self._frames[self.currentFrameNumber()]
+ except IndexError:
+ pass
+
+ def currentFrameNumber(self):
+ """
+ Return the current frame.
+
+ :rtype: int or None
+ """
+ return self._frame
+
+ def jumpToFrame(self, frame):
+ """
+ Set the current frame.
+
+ :rtype: int or None
+ """
+ if frame >= self.frameCount():
+ frame = 0
+ self._frame = frame
+ self.frameChanged.emit(frame)
diff --git a/2023/scripts/animation_tools/studiolibrary/studioqt/menu.py b/2023/scripts/animation_tools/studiolibrary/studioqt/menu.py
new file mode 100644
index 0000000..e7e3e0c
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studioqt/menu.py
@@ -0,0 +1,81 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from studiovendor import six
+from studiovendor.Qt import QtWidgets
+
+
+class Menu(QtWidgets.QMenu):
+
+ def __init__(self, *args):
+ QtWidgets.QMenu.__init__(self, *args)
+
+ def findAction(self, text):
+ """
+ Return the action that contains the given text.
+
+ :type text: str
+
+ :rtype: QtWidgets.QAction
+ """
+ for child in self.children():
+
+ action = None
+
+ if isinstance(child, QtWidgets.QMenu):
+ action = child.menuAction()
+ elif isinstance(child, QtWidgets.QAction):
+ action = child
+
+ if action and action.text().lower() == text.lower():
+ return action
+
+ def insertAction(self, before, *args):
+ """
+ Add support for finding the before action by the given string.
+
+ :type before: str or QtWidget.QAction
+ :type args: list
+
+ :rtype: QtWidgets.QAction
+ """
+ if isinstance(before, six.string_types):
+ before = self.findAction(before)
+
+ return QtWidgets.QMenu.insertAction(self, before, *args)
+
+ def insertMenu(self, before, menu):
+ """
+ Add support for finding the before action by the given string.
+
+ :type before: str or QtWidget.QAction
+ :type menu: QtWidgets.QMenu
+
+ :rtype: QtWidgets.QAction
+ """
+ if isinstance(before, six.string_types):
+ before = self.findAction(before)
+
+ QtWidgets.QMenu.insertMenu(self, before, menu)
+
+ def insertSeparator(self, before):
+ """
+ Add support for finding the before action by the given string.
+
+ :type before: str or QtWidget.QAction
+
+ :rtype: QtWidgets.QAction
+ """
+ if isinstance(before, six.string_types):
+ before = self.findAction(before)
+
+ return QtWidgets.QMenu.insertSeparator(self, before)
diff --git a/2023/scripts/animation_tools/studiolibrary/studioqt/pixmap.py b/2023/scripts/animation_tools/studiolibrary/studioqt/pixmap.py
new file mode 100644
index 0000000..c897939
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studioqt/pixmap.py
@@ -0,0 +1,40 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+from studiovendor import six
+from studiovendor.Qt import QtGui
+
+import studioqt
+
+
+class Pixmap(QtGui.QPixmap):
+
+ def __init__(self, *args):
+ QtGui.QPixmap.__init__(self, *args)
+
+ self._color = None
+
+ def setColor(self, color):
+ """
+ :type color: QtGui.QColor
+ :rtype: None
+ """
+ if isinstance(color, six.string_types):
+ color = studioqt.Color.fromString(color)
+
+ if not self.isNull():
+ painter = QtGui.QPainter(self)
+ painter.setCompositionMode(QtGui.QPainter.CompositionMode_SourceIn)
+ painter.setBrush(color)
+ painter.setPen(color)
+ painter.drawRect(self.rect())
+ painter.end()
diff --git a/2023/scripts/animation_tools/studiolibrary/studioqt/stylesheet.py b/2023/scripts/animation_tools/studiolibrary/studioqt/stylesheet.py
new file mode 100644
index 0000000..b0a2eb4
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studioqt/stylesheet.py
@@ -0,0 +1,102 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import os
+import re
+
+import studioqt
+
+
+class StyleSheet(object):
+
+ @classmethod
+ def fromPath(cls, path, **kwargs):
+ """
+ :type path: str
+ :rtype: str
+ """
+ styleSheet = cls()
+ data = styleSheet.read(path)
+ data = StyleSheet.format(data, **kwargs)
+ styleSheet.setData(data)
+ return styleSheet
+
+ @classmethod
+ def fromText(cls, text, options=None):
+ """
+ :type text: str
+ :rtype: str
+ """
+ styleSheet = cls()
+ data = StyleSheet.format(text, options=options)
+ styleSheet.setData(data)
+ return styleSheet
+
+ def __init__(self):
+ self._data = ""
+
+ def setData(self, data):
+ """
+ :type data: str
+ """
+ self._data = data
+
+ def data(self):
+ """
+ :rtype: str
+ """
+ return self._data
+
+ @staticmethod
+ def read(path):
+ """
+ :type path: str
+ :rtype: str
+ """
+ data = ""
+
+ if os.path.isfile(path):
+ with open(path, "r") as f:
+ data = f.read()
+
+ return data
+
+ @staticmethod
+ def format(data=None, options=None, dpi=1):
+ """
+ :type data:
+ :type options: dict
+ :rtype: str
+ """
+ if options is not None:
+ keys = list(options.keys())
+ keys.sort(key=len, reverse=True)
+ for key in keys:
+ data = data.replace(key, options[key])
+
+ reDpi = re.compile("[0-9]+px")
+ newData = []
+
+ for line in data.split("\n"):
+ dpi_ = reDpi.search(line)
+
+ if dpi_:
+ new = dpi_.group().replace("px", "")
+ val = int(new)
+ if val > 0:
+ val = int(val * dpi)
+ line = line.replace(dpi_.group(), str(val) + "px")
+
+ newData.append(line)
+
+ data = "\n".join(newData)
+ return data
diff --git a/2023/scripts/animation_tools/studiolibrary/studioqt/utils.py b/2023/scripts/animation_tools/studiolibrary/studioqt/utils.py
new file mode 100644
index 0000000..57169d6
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studioqt/utils.py
@@ -0,0 +1,230 @@
+# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
+#
+# This library is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version. This library is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see .
+
+import os
+import sys
+import inspect
+import logging
+import contextlib
+
+from studiovendor.Qt import QtGui
+from studiovendor.Qt import QtCore
+from studiovendor.Qt import QtCompat
+from studiovendor.Qt import QtWidgets
+
+import studioqt
+
+
+__all__ = [
+ "app",
+ "fadeIn",
+ "fadeOut",
+ "loadUi",
+ "installFonts",
+ "isAltModifier",
+ "isShiftModifier",
+ "isControlModifier",
+]
+
+logger = logging.getLogger(__name__)
+
+
+@contextlib.contextmanager
+def app():
+ """
+
+ .. code-block:: python
+ import studioqt
+
+ with studioqt.app():
+ widget = QWidget(None)
+ widget.show()
+
+ :rtype: None
+ """
+ app_ = None
+
+ isAppRunning = bool(QtWidgets.QApplication.instance())
+ if not isAppRunning:
+ app_ = QtWidgets.QApplication(sys.argv)
+
+ yield None
+
+ if not isAppRunning:
+ sys.exit(app_.exec_())
+
+
+def uiPath(cls):
+ """
+ Return the ui path for the given widget class.
+
+ :type cls: type
+ :rtype: str
+ """
+ name = cls.__name__
+ path = inspect.getfile(cls)
+ dirname = os.path.dirname(path)
+
+ path = dirname + "/resource/ui/" + name + ".ui"
+
+ if not os.path.exists(path):
+ path = dirname + "/ui/" + name + ".ui"
+
+ if not os.path.exists(path):
+ path = dirname + "/" + name + ".ui"
+
+ return path
+
+
+def loadUi(widget, path=None, cls=None):
+ """
+ .. code-block:: python
+ import studioqt
+
+ class Widget(QtWidgets.QWidget):
+ def __init__(self)
+ super(Widget, self).__init__()
+ studioqt.loadUi(self)
+
+ with studioqt.app():
+ widget = Widget()
+ widget.show()
+
+ :type widget: QWidget or QDialog
+ :type path: str
+ :type cls: object
+ :rtype: None
+ """
+ if cls:
+ path = uiPath(cls)
+ elif not path:
+ path = uiPath(widget.__class__)
+
+ cwd = os.getcwd()
+ try:
+ os.chdir(os.path.dirname(path))
+ widget.ui = QtCompat.loadUi(path, widget)
+ finally:
+ os.chdir(cwd)
+
+
+def isModifier():
+ """
+ Return True if either the alt key or control key is down.
+
+ :rtype: bool
+ """
+ return isAltModifier() or isControlModifier()
+
+
+def isAltModifier():
+ """
+ Return True if the alt key is down.
+
+ :rtype: bool
+ """
+ modifiers = QtWidgets.QApplication.keyboardModifiers()
+ return modifiers == QtCore.Qt.AltModifier
+
+
+def isControlModifier():
+ """
+ Return True if the control key is down.
+
+ :rtype: bool
+ """
+ modifiers = QtWidgets.QApplication.keyboardModifiers()
+ return modifiers == QtCore.Qt.ControlModifier
+
+
+def isShiftModifier():
+ """
+ Return True if the shift key is down.
+
+ :rtype: bool
+ """
+ modifiers = QtWidgets.QApplication.keyboardModifiers()
+ return modifiers == QtCore.Qt.ShiftModifier
+
+
+def fadeIn(widget, duration=200, onFinished=None):
+ """
+ Fade in the given widget using the opacity effect.
+
+ :type widget: QtWidget.QWidgets
+ :type duration: int
+ :type onFinished: func
+ :rtype: QtCore.QPropertyAnimation
+ """
+ widget._fadeInEffect_ = QtWidgets.QGraphicsOpacityEffect()
+ widget.setGraphicsEffect(widget._fadeInEffect_)
+ animation = QtCore.QPropertyAnimation(widget._fadeInEffect_, b"opacity")
+ animation.setDuration(duration)
+ animation.setStartValue(0.0)
+ animation.setEndValue(1.0)
+ animation.setEasingCurve(QtCore.QEasingCurve.InOutCubic)
+ animation.start()
+
+ if onFinished:
+ animation.finished.connect(onFinished)
+
+ widget._fadeIn_ = animation
+
+ return animation
+
+
+def fadeOut(widget, duration=200, onFinished=None):
+ """
+ Fade out the given widget using the opacity effect.
+
+ :type widget: QtWidget.QWidgets
+ :type duration: int
+ :type onFinished: func
+ :rtype: QtCore.QPropertyAnimation
+ """
+ widget._fadeOutEffect_ = QtWidgets.QGraphicsOpacityEffect()
+ widget.setGraphicsEffect(widget._fadeOutEffect_)
+ animation = QtCore.QPropertyAnimation(widget._fadeOutEffect_, b"opacity")
+ animation.setDuration(duration)
+ animation.setStartValue(1.0)
+ animation.setEndValue(0.0)
+ animation.setEasingCurve(QtCore.QEasingCurve.InOutCubic)
+ animation.start()
+
+ if onFinished:
+ animation.finished.connect(onFinished)
+
+ widget._fadeOut_ = animation
+
+ return animation
+
+
+def installFonts(path):
+ """
+ Install all the fonts in the given directory path.
+
+ :type path: str
+ """
+ path = os.path.abspath(path)
+ fontDatabase = QtGui.QFontDatabase()
+
+ for filename in os.listdir(path):
+
+ if filename.endswith(".ttf"):
+
+ filename = os.path.join(path, filename)
+ result = fontDatabase.addApplicationFont(filename)
+
+ if result > 0:
+ logger.debug("Added font %s", filename)
+ else:
+ logger.debug("Cannot add font %s", filename)
diff --git a/2023/scripts/animation_tools/studiolibrary/studiovendor/Qt.py b/2023/scripts/animation_tools/studiolibrary/studiovendor/Qt.py
new file mode 100644
index 0000000..d6ba71a
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiovendor/Qt.py
@@ -0,0 +1,1956 @@
+"""Minimal Python 2 & 3 shim around all Qt bindings
+
+DOCUMENTATION
+ Qt.py was born in the film and visual effects industry to address
+ the growing need for the development of software capable of running
+ with more than one flavour of the Qt bindings for Python.
+
+ Supported Binding: PySide, PySide2, PySide6, PyQt4, PyQt5
+
+ 1. Build for one, run with all
+ 2. Explicit is better than implicit
+ 3. Support co-existence
+
+ Default resolution order:
+ - PySide6
+ - PySide2
+ - PyQt5
+ - PySide
+ - PyQt4
+
+ Usage:
+ >> import sys
+ >> from Qt import QtWidgets
+ >> app = QtWidgets.QApplication(sys.argv)
+ >> button = QtWidgets.QPushButton("Hello World")
+ >> button.show()
+ >> app.exec_()
+
+ All members of PySide2 are mapped from other bindings, should they exist.
+ If no equivalent member exist, it is excluded from Qt.py and inaccessible.
+ The idea is to highlight members that exist across all supported binding,
+ and guarantee that code that runs on one binding runs on all others.
+
+ For more details, visit https://github.com/mottosso/Qt.py
+
+LICENSE
+
+ See end of file for license (MIT, BSD) information.
+
+"""
+
+import os
+import sys
+import types
+import shutil
+import importlib
+import json
+
+
+__version__ = "1.3.10"
+
+# Enable support for `from Qt import *`
+__all__ = []
+
+# Flags from environment variables
+QT_VERBOSE = bool(os.getenv("QT_VERBOSE"))
+QT_PREFERRED_BINDING_JSON = os.getenv("QT_PREFERRED_BINDING_JSON", "")
+QT_PREFERRED_BINDING = os.getenv("QT_PREFERRED_BINDING", "")
+QT_SIP_API_HINT = os.getenv("QT_SIP_API_HINT")
+
+# Reference to Qt.py
+Qt = sys.modules[__name__]
+Qt.QtCompat = types.ModuleType("QtCompat")
+
+try:
+ long
+except NameError:
+ # Python 3 compatibility
+ long = int
+
+
+"""Common members of all bindings
+
+This is where each member of Qt.py is explicitly defined.
+It is based on a "lowest common denominator" of all bindings;
+including members found in each of the 4 bindings.
+
+The "_common_members" dictionary is generated using the
+build_membership.sh script.
+
+"""
+
+_common_members = {
+ "QtCore": [
+ "QAbstractAnimation",
+ "QAbstractEventDispatcher",
+ "QAbstractItemModel",
+ "QAbstractListModel",
+ "QAbstractTableModel",
+ "QAnimationGroup",
+ "QBasicTimer",
+ "QBitArray",
+ "QBuffer",
+ "QByteArray",
+ "QByteArrayMatcher",
+ "QChildEvent",
+ "QCoreApplication",
+ "QCryptographicHash",
+ "QDataStream",
+ "QDate",
+ "QDateTime",
+ "QDir",
+ "QDirIterator",
+ "QDynamicPropertyChangeEvent",
+ "QEasingCurve",
+ "QElapsedTimer",
+ "QEvent",
+ "QEventLoop",
+ "QFile",
+ "QFileInfo",
+ "QFileSystemWatcher",
+ "QGenericArgument",
+ "QGenericReturnArgument",
+ "QIODevice",
+ "QLibraryInfo",
+ "QLine",
+ "QLineF",
+ "QLocale",
+ "QMargins",
+ "QMetaClassInfo",
+ "QMetaEnum",
+ "QMetaMethod",
+ "QMetaObject",
+ "QMetaProperty",
+ "QMimeData",
+ "QModelIndex",
+ "QMutex",
+ "QMutexLocker",
+ "QObject",
+ "QParallelAnimationGroup",
+ "QPauseAnimation",
+ "QPersistentModelIndex",
+ "QPluginLoader",
+ "QPoint",
+ "QPointF",
+ "QProcess",
+ "QProcessEnvironment",
+ "QPropertyAnimation",
+ "QReadLocker",
+ "QReadWriteLock",
+ "QRect",
+ "QRectF",
+ "QResource",
+ "QRunnable",
+ "QSemaphore",
+ "QSequentialAnimationGroup",
+ "QSettings",
+ "QSignalMapper",
+ "QSize",
+ "QSizeF",
+ "QSocketNotifier",
+ "QStringListModel",
+ "QSysInfo",
+ "QSystemSemaphore",
+ "QT_TRANSLATE_NOOP",
+ "QT_TR_NOOP",
+ "QT_TR_NOOP_UTF8",
+ "QTemporaryFile",
+ "QTextBoundaryFinder",
+ "QTextStream",
+ "QTextStreamManipulator",
+ "QThread",
+ "QThreadPool",
+ "QTime",
+ "QTimeLine",
+ "QTimer",
+ "QTimerEvent",
+ "QTranslator",
+ "QUrl",
+ "QUuid",
+ "QVariantAnimation",
+ "QWaitCondition",
+ "QWriteLocker",
+ "QXmlStreamAttribute",
+ "QXmlStreamAttributes",
+ "QXmlStreamEntityDeclaration",
+ "QXmlStreamEntityResolver",
+ "QXmlStreamNamespaceDeclaration",
+ "QXmlStreamNotationDeclaration",
+ "QXmlStreamReader",
+ "QXmlStreamWriter",
+ "Qt",
+ "QtMsgType",
+ "qAbs",
+ "qAddPostRoutine",
+ "qCritical",
+ "qDebug",
+ "qFatal",
+ "qFuzzyCompare",
+ "qIsFinite",
+ "qIsInf",
+ "qIsNaN",
+ "qIsNull",
+ "qRegisterResourceData",
+ "qUnregisterResourceData",
+ "qVersion",
+ "qWarning",
+ "Signal",
+ "Slot"
+ ],
+ "QtGui": [
+ "QAbstractTextDocumentLayout",
+ "QActionEvent",
+ "QBitmap",
+ "QBrush",
+ "QClipboard",
+ "QCloseEvent",
+ "QColor",
+ "QConicalGradient",
+ "QContextMenuEvent",
+ "QCursor",
+ "QDesktopServices",
+ "QDoubleValidator",
+ "QDrag",
+ "QDragEnterEvent",
+ "QDragLeaveEvent",
+ "QDragMoveEvent",
+ "QDropEvent",
+ "QFileOpenEvent",
+ "QFocusEvent",
+ "QFont",
+ "QFontDatabase",
+ "QFontInfo",
+ "QFontMetrics",
+ "QFontMetricsF",
+ "QGradient",
+ "QHelpEvent",
+ "QHideEvent",
+ "QHoverEvent",
+ "QIcon",
+ "QIconDragEvent",
+ "QIconEngine",
+ "QImage",
+ "QImageIOHandler",
+ "QImageReader",
+ "QImageWriter",
+ "QInputEvent",
+ "QInputMethodEvent",
+ "QIntValidator",
+ "QKeyEvent",
+ "QKeySequence",
+ "QLinearGradient",
+ "QMatrix2x2",
+ "QMatrix2x3",
+ "QMatrix2x4",
+ "QMatrix3x2",
+ "QMatrix3x3",
+ "QMatrix3x4",
+ "QMatrix4x2",
+ "QMatrix4x3",
+ "QMatrix4x4",
+ "QMouseEvent",
+ "QMoveEvent",
+ "QMovie",
+ "QPaintDevice",
+ "QPaintEngine",
+ "QPaintEngineState",
+ "QPaintEvent",
+ "QPainter",
+ "QPainterPath",
+ "QPainterPathStroker",
+ "QPalette",
+ "QPen",
+ "QPicture",
+ "QPixmap",
+ "QPixmapCache",
+ "QPolygon",
+ "QPolygonF",
+ "QQuaternion",
+ "QRadialGradient",
+ "QRegion",
+ "QResizeEvent",
+ "QSessionManager",
+ "QShortcutEvent",
+ "QShowEvent",
+ "QStandardItem",
+ "QStandardItemModel",
+ "QStatusTipEvent",
+ "QSyntaxHighlighter",
+ "QTabletEvent",
+ "QTextBlock",
+ "QTextBlockFormat",
+ "QTextBlockGroup",
+ "QTextBlockUserData",
+ "QTextCharFormat",
+ "QTextCursor",
+ "QTextDocument",
+ "QTextDocumentFragment",
+ "QTextFormat",
+ "QTextFragment",
+ "QTextFrame",
+ "QTextFrameFormat",
+ "QTextImageFormat",
+ "QTextInlineObject",
+ "QTextItem",
+ "QTextLayout",
+ "QTextLength",
+ "QTextLine",
+ "QTextList",
+ "QTextListFormat",
+ "QTextObject",
+ "QTextObjectInterface",
+ "QTextOption",
+ "QTextTable",
+ "QTextTableCell",
+ "QTextTableCellFormat",
+ "QTextTableFormat",
+ "QTouchEvent",
+ "QTransform",
+ "QValidator",
+ "QVector2D",
+ "QVector3D",
+ "QVector4D",
+ "QWhatsThisClickedEvent",
+ "QWheelEvent",
+ "QWindowStateChangeEvent",
+ "qAlpha",
+ "qBlue",
+ "qGray",
+ "qGreen",
+ "qIsGray",
+ "qRed",
+ "qRgb",
+ "qRgba"
+ ],
+ "QtHelp": [
+ "QHelpContentItem",
+ "QHelpContentModel",
+ "QHelpContentWidget",
+ "QHelpEngine",
+ "QHelpEngineCore",
+ "QHelpIndexModel",
+ "QHelpIndexWidget",
+ "QHelpSearchEngine",
+ "QHelpSearchQuery",
+ "QHelpSearchQueryWidget",
+ "QHelpSearchResultWidget"
+ ],
+ "QtNetwork": [
+ "QAbstractNetworkCache",
+ "QAbstractSocket",
+ "QAuthenticator",
+ "QHostAddress",
+ "QHostInfo",
+ "QLocalServer",
+ "QLocalSocket",
+ "QNetworkAccessManager",
+ "QNetworkAddressEntry",
+ "QNetworkCacheMetaData",
+ "QNetworkCookie",
+ "QNetworkCookieJar",
+ "QNetworkDiskCache",
+ "QNetworkInterface",
+ "QNetworkProxy",
+ "QNetworkProxyFactory",
+ "QNetworkProxyQuery",
+ "QNetworkReply",
+ "QNetworkRequest",
+ "QSsl",
+ "QSslCertificate",
+ "QSslCipher",
+ "QSslConfiguration",
+ "QSslError",
+ "QSslKey",
+ "QSslSocket",
+ "QTcpServer",
+ "QTcpSocket",
+ "QUdpSocket"
+ ],
+ "QtPrintSupport": [
+ "QAbstractPrintDialog",
+ "QPageSetupDialog",
+ "QPrintDialog",
+ "QPrintEngine",
+ "QPrintPreviewDialog",
+ "QPrintPreviewWidget",
+ "QPrinter",
+ "QPrinterInfo"
+ ],
+ "QtSvg": [
+ "QSvgGenerator",
+ "QSvgRenderer"
+ ],
+ "QtTest": [
+ "QTest"
+ ],
+ "QtWidgets": [
+ "QAbstractButton",
+ "QAbstractGraphicsShapeItem",
+ "QAbstractItemDelegate",
+ "QAbstractItemView",
+ "QAbstractScrollArea",
+ "QAbstractSlider",
+ "QAbstractSpinBox",
+ "QAction",
+ "QActionGroup",
+ "QApplication",
+ "QBoxLayout",
+ "QButtonGroup",
+ "QCalendarWidget",
+ "QCheckBox",
+ "QColorDialog",
+ "QColumnView",
+ "QComboBox",
+ "QCommandLinkButton",
+ "QCommonStyle",
+ "QCompleter",
+ "QDataWidgetMapper",
+ "QDateEdit",
+ "QDateTimeEdit",
+ "QDial",
+ "QDialog",
+ "QDialogButtonBox",
+ "QDockWidget",
+ "QDoubleSpinBox",
+ "QErrorMessage",
+ "QFileDialog",
+ "QFileIconProvider",
+ "QFileSystemModel",
+ "QFocusFrame",
+ "QFontComboBox",
+ "QFontDialog",
+ "QFormLayout",
+ "QFrame",
+ "QGesture",
+ "QGestureEvent",
+ "QGestureRecognizer",
+ "QGraphicsAnchor",
+ "QGraphicsAnchorLayout",
+ "QGraphicsBlurEffect",
+ "QGraphicsColorizeEffect",
+ "QGraphicsDropShadowEffect",
+ "QGraphicsEffect",
+ "QGraphicsEllipseItem",
+ "QGraphicsGridLayout",
+ "QGraphicsItem",
+ "QGraphicsItemGroup",
+ "QGraphicsLayout",
+ "QGraphicsLayoutItem",
+ "QGraphicsLineItem",
+ "QGraphicsLinearLayout",
+ "QGraphicsObject",
+ "QGraphicsOpacityEffect",
+ "QGraphicsPathItem",
+ "QGraphicsPixmapItem",
+ "QGraphicsPolygonItem",
+ "QGraphicsProxyWidget",
+ "QGraphicsRectItem",
+ "QGraphicsRotation",
+ "QGraphicsScale",
+ "QGraphicsScene",
+ "QGraphicsSceneContextMenuEvent",
+ "QGraphicsSceneDragDropEvent",
+ "QGraphicsSceneEvent",
+ "QGraphicsSceneHelpEvent",
+ "QGraphicsSceneHoverEvent",
+ "QGraphicsSceneMouseEvent",
+ "QGraphicsSceneMoveEvent",
+ "QGraphicsSceneResizeEvent",
+ "QGraphicsSceneWheelEvent",
+ "QGraphicsSimpleTextItem",
+ "QGraphicsTextItem",
+ "QGraphicsTransform",
+ "QGraphicsView",
+ "QGraphicsWidget",
+ "QGridLayout",
+ "QGroupBox",
+ "QHBoxLayout",
+ "QHeaderView",
+ "QInputDialog",
+ "QItemDelegate",
+ "QItemEditorCreatorBase",
+ "QItemEditorFactory",
+ "QLCDNumber",
+ "QLabel",
+ "QLayout",
+ "QLayoutItem",
+ "QLineEdit",
+ "QListView",
+ "QListWidget",
+ "QListWidgetItem",
+ "QMainWindow",
+ "QMdiArea",
+ "QMdiSubWindow",
+ "QMenu",
+ "QMenuBar",
+ "QMessageBox",
+ "QPanGesture",
+ "QPinchGesture",
+ "QPlainTextDocumentLayout",
+ "QPlainTextEdit",
+ "QProgressBar",
+ "QProgressDialog",
+ "QPushButton",
+ "QRadioButton",
+ "QRubberBand",
+ "QScrollArea",
+ "QScrollBar",
+ "QSizeGrip",
+ "QSizePolicy",
+ "QSlider",
+ "QSpacerItem",
+ "QSpinBox",
+ "QSplashScreen",
+ "QSplitter",
+ "QSplitterHandle",
+ "QStackedLayout",
+ "QStackedWidget",
+ "QStatusBar",
+ "QStyle",
+ "QStyleFactory",
+ "QStyleHintReturn",
+ "QStyleHintReturnMask",
+ "QStyleHintReturnVariant",
+ "QStyleOption",
+ "QStyleOptionButton",
+ "QStyleOptionComboBox",
+ "QStyleOptionComplex",
+ "QStyleOptionDockWidget",
+ "QStyleOptionFocusRect",
+ "QStyleOptionFrame",
+ "QStyleOptionGraphicsItem",
+ "QStyleOptionGroupBox",
+ "QStyleOptionHeader",
+ "QStyleOptionMenuItem",
+ "QStyleOptionProgressBar",
+ "QStyleOptionRubberBand",
+ "QStyleOptionSizeGrip",
+ "QStyleOptionSlider",
+ "QStyleOptionSpinBox",
+ "QStyleOptionTab",
+ "QStyleOptionTabBarBase",
+ "QStyleOptionTabWidgetFrame",
+ "QStyleOptionTitleBar",
+ "QStyleOptionToolBar",
+ "QStyleOptionToolBox",
+ "QStyleOptionToolButton",
+ "QStyleOptionViewItem",
+ "QStylePainter",
+ "QStyledItemDelegate",
+ "QSwipeGesture",
+ "QSystemTrayIcon",
+ "QTabBar",
+ "QTabWidget",
+ "QTableView",
+ "QTableWidget",
+ "QTableWidgetItem",
+ "QTableWidgetSelectionRange",
+ "QTapAndHoldGesture",
+ "QTapGesture",
+ "QTextBrowser",
+ "QTextEdit",
+ "QTimeEdit",
+ "QToolBar",
+ "QToolBox",
+ "QToolButton",
+ "QToolTip",
+ "QTreeView",
+ "QTreeWidget",
+ "QTreeWidgetItem",
+ "QTreeWidgetItemIterator",
+ "QUndoView",
+ "QVBoxLayout",
+ "QWhatsThis",
+ "QWidget",
+ "QWidgetAction",
+ "QWidgetItem",
+ "QWizard",
+ "QWizardPage"
+ ],
+ "QtXml": [
+ "QDomAttr",
+ "QDomCDATASection",
+ "QDomCharacterData",
+ "QDomComment",
+ "QDomDocument",
+ "QDomDocumentFragment",
+ "QDomDocumentType",
+ "QDomElement",
+ "QDomEntity",
+ "QDomEntityReference",
+ "QDomImplementation",
+ "QDomNamedNodeMap",
+ "QDomNode",
+ "QDomNodeList",
+ "QDomNotation",
+ "QDomProcessingInstruction",
+ "QDomText"
+ ]
+}
+
+""" Missing members
+
+This mapping describes members that have been deprecated
+in one or more bindings and have been left out of the
+_common_members mapping.
+
+The member can provide an extra details string to be
+included in exceptions and warnings.
+"""
+
+_missing_members = {
+ "QtGui": {
+ "QMatrix": "Deprecated in PyQt5",
+ },
+}
+
+
+def _qInstallMessageHandler(handler):
+ """Install a message handler that works in all bindings
+
+ Args:
+ handler: A function that takes 3 arguments, or None
+ """
+ def messageOutputHandler(*args):
+ # In Qt4 bindings, message handlers are passed 2 arguments
+ # In Qt5 bindings, message handlers are passed 3 arguments
+ # The first argument is a QtMsgType
+ # The last argument is the message to be printed
+ # The Middle argument (if passed) is a QMessageLogContext
+ if len(args) == 3:
+ msgType, logContext, msg = args
+ elif len(args) == 2:
+ msgType, msg = args
+ logContext = None
+ else:
+ raise TypeError(
+ "handler expected 2 or 3 arguments, got {0}".format(len(args)))
+
+ if isinstance(msg, bytes):
+ # In python 3, some bindings pass a bytestring, which cannot be
+ # used elsewhere. Decoding a python 2 or 3 bytestring object will
+ # consistently return a unicode object.
+ msg = msg.decode()
+
+ handler(msgType, logContext, msg)
+
+ passObject = messageOutputHandler if handler else handler
+ if Qt.IsPySide or Qt.IsPyQt4:
+ return Qt._QtCore.qInstallMsgHandler(passObject)
+ elif Qt.IsPySide2 or Qt.IsPyQt5 or Qt.IsPySide6:
+ return Qt._QtCore.qInstallMessageHandler(passObject)
+
+
+def _getcpppointer(object):
+ if hasattr(Qt, "_shiboken6"):
+ return getattr(Qt, "_shiboken6").getCppPointer(object)[0]
+ elif hasattr(Qt, "_shiboken2"):
+ return getattr(Qt, "_shiboken2").getCppPointer(object)[0]
+ elif hasattr(Qt, "_shiboken"):
+ return getattr(Qt, "_shiboken").getCppPointer(object)[0]
+ elif hasattr(Qt, "_sip"):
+ return getattr(Qt, "_sip").unwrapinstance(object)
+ raise AttributeError("'module' has no attribute 'getCppPointer'")
+
+
+def _wrapinstance(ptr, base=None):
+ """Enable implicit cast of pointer to most suitable class
+
+ This behaviour is available in sip per default.
+
+ Based on http://nathanhorne.com/pyqtpyside-wrap-instance
+
+ Usage:
+ This mechanism kicks in under these circumstances.
+ 1. Qt.py is using PySide 1 or 2.
+ 2. A `base` argument is not provided.
+
+ See :func:`QtCompat.wrapInstance()`
+
+ Arguments:
+ ptr (int): Pointer to QObject in memory
+ base (QObject, optional): Base class to wrap with. Defaults to QObject,
+ which should handle anything.
+
+ """
+ assert (base is None) or issubclass(base, Qt.QtCore.QObject), (
+ "Argument 'base' must be of type ")
+
+ if Qt.IsPyQt4 or Qt.IsPyQt5:
+ func = getattr(Qt, "_sip").wrapinstance
+ elif Qt.IsPySide2:
+ func = getattr(Qt, "_shiboken2").wrapInstance
+ elif Qt.IsPySide6:
+ func = getattr(Qt, "_shiboken6").wrapInstance
+ elif Qt.IsPySide:
+ func = getattr(Qt, "_shiboken").wrapInstance
+ else:
+ raise AttributeError("'module' has no attribute 'wrapInstance'")
+
+ if base is None:
+ if Qt.IsPyQt4 or Qt.IsPyQt5:
+ base = Qt.QtCore.QObject
+ else:
+ q_object = func(long(ptr), Qt.QtCore.QObject)
+ meta_object = q_object.metaObject()
+
+ while True:
+ class_name = meta_object.className()
+
+ try:
+ base = getattr(Qt.QtWidgets, class_name)
+ except AttributeError:
+ try:
+ base = getattr(Qt.QtCore, class_name)
+ except AttributeError:
+ meta_object = meta_object.superClass()
+ continue
+
+ break
+
+ return func(long(ptr), base)
+
+
+def _isvalid(object):
+ """Check if the object is valid to use in Python runtime.
+
+ Usage:
+ See :func:`QtCompat.isValid()`
+
+ Arguments:
+ object (QObject): QObject to check the validity of.
+
+ """
+ if hasattr(Qt, "_shiboken6"):
+ return getattr(Qt, "_shiboken6").isValid(object)
+
+ elif hasattr(Qt, "_shiboken2"):
+ return getattr(Qt, "_shiboken2").isValid(object)
+
+ elif hasattr(Qt, "_shiboken"):
+ return getattr(Qt, "_shiboken").isValid(object)
+
+ elif hasattr(Qt, "_sip"):
+ return not getattr(Qt, "_sip").isdeleted(object)
+
+ else:
+ raise AttributeError("'module' has no attribute isValid")
+
+
+def _translate(context, sourceText, *args):
+ # In Qt4 bindings, translate can be passed 2 or 3 arguments
+ # In Qt5 bindings, translate can be passed 2 arguments
+ # The first argument is disambiguation[str]
+ # The last argument is n[int]
+ # The middle argument can be encoding[QtCore.QCoreApplication.Encoding]
+ try:
+ app = Qt.QtCore.QCoreApplication
+ except AttributeError:
+ raise NotImplementedError(
+ "Missing QCoreApplication implementation for {}".format(
+ Qt.__binding__
+ )
+ )
+
+ def get_arg(index):
+ try:
+ return args[index]
+ except IndexError:
+ pass
+
+ n = -1
+ encoding = None
+
+ if len(args) == 3:
+ disambiguation, encoding, n = args
+ else:
+ disambiguation = get_arg(0)
+ n_or_encoding = get_arg(1)
+
+ if isinstance(n_or_encoding, int):
+ n = n_or_encoding
+ else:
+ encoding = n_or_encoding
+
+ if Qt.__binding__ in ("PySide2", "PySide6","PyQt5"):
+ sanitized_args = [context, sourceText, disambiguation, n]
+ else:
+ sanitized_args = [
+ context,
+ sourceText,
+ disambiguation,
+ encoding or app.CodecForTr,
+ n,
+ ]
+
+ return app.translate(*sanitized_args)
+
+
+def _loadUi(uifile, baseinstance=None):
+ """Dynamically load a user interface from the given `uifile`
+
+ This function calls `uic.loadUi` if using PyQt bindings,
+ else it implements a comparable binding for PySide.
+
+ Documentation:
+ http://pyqt.sourceforge.net/Docs/PyQt5/designer.html#PyQt5.uic.loadUi
+
+ Arguments:
+ uifile (str): Absolute path to Qt Designer file.
+ baseinstance (QWidget): Instantiated QWidget or subclass thereof
+
+ Return:
+ baseinstance if `baseinstance` is not `None`. Otherwise
+ return the newly created instance of the user interface.
+
+ """
+ if hasattr(Qt, "_uic"):
+ return Qt._uic.loadUi(uifile, baseinstance)
+
+ elif hasattr(Qt, "_QtUiTools"):
+ # Implement `PyQt5.uic.loadUi` for PySide(2)
+
+ path = uifile
+ widget = baseinstance
+
+ loader = Qt._QtUiTools.QUiLoader()
+ d = Qt.QtCore.QDir(os.path.dirname(path))
+ loader.setWorkingDirectory(d)
+
+ f = Qt.QtCore.QFile(path)
+ f.open(Qt.QtCore.QFile.ReadOnly)
+ ui = loader.load(path, widget)
+ f.close()
+
+ layout = Qt.QtWidgets.QVBoxLayout()
+ layout.setObjectName("uiLayout")
+ layout.addWidget(ui)
+ widget.setLayout(layout)
+ layout.setContentsMargins(0, 0, 0, 0)
+
+ baseinstance.setMinimumWidth(ui.minimumWidth())
+ baseinstance.setMinimumHeight(ui.minimumHeight())
+ baseinstance.setMaximumWidth(ui.maximumWidth())
+ baseinstance.setMaximumHeight(ui.maximumHeight())
+
+ Qt.QtCore.QMetaObject.connectSlotsByName(widget)
+
+ return ui
+
+ else:
+ raise NotImplementedError("No implementation available for loadUi")
+
+
+"""Misplaced members
+
+These members from the original submodule are misplaced relative PySide2
+
+"""
+_misplaced_members = {
+ "PySide6": {
+ "QtGui.QShortcut": "QtWidgets.QShortcut",
+ "QtGui.QStringListModel": "QtCore.QStringListModel",
+ "QtGui.QAction": "QtWidgets.QAction",
+ "QtUiTools.QUiLoader": ["QtCompat.loadUi", _loadUi],
+ "shiboken6.wrapInstance": ["QtCompat.wrapInstance", _wrapinstance],
+ "shiboken6.getCppPointer": ["QtCompat.getCppPointer", _getcpppointer],
+ "shiboken6.isValid": ["QtCompat.isValid", _isvalid],
+ "QtWidgets.qApp": "QtWidgets.QApplication.instance()",
+ "QtCore.QCoreApplication.translate": [
+ "QtCompat.translate", _translate
+ ],
+ "QtWidgets.QApplication.translate": [
+ "QtCompat.translate", _translate
+ ],
+ "QtCore.qInstallMessageHandler": [
+ "QtCompat.qInstallMessageHandler", _qInstallMessageHandler
+ ],
+ "QtWidgets.QStyleOptionViewItem": "QtCompat.QStyleOptionViewItemV4",
+ "QtMultimedia.QSound": "QtMultimedia.QSound",
+ },
+ "PySide2": {
+ "QtCore.QStringListModel": "QtCore.QStringListModel",
+ "QtGui.QStringListModel": "QtCore.QStringListModel",
+ "QtUiTools.QUiLoader": ["QtCompat.loadUi", _loadUi],
+ "shiboken2.wrapInstance": ["QtCompat.wrapInstance", _wrapinstance],
+ "shiboken2.getCppPointer": ["QtCompat.getCppPointer", _getcpppointer],
+ "shiboken2.isValid": ["QtCompat.isValid", _isvalid],
+ "QtWidgets.qApp": "QtWidgets.QApplication.instance()",
+ "QtCore.QCoreApplication.translate": [
+ "QtCompat.translate", _translate
+ ],
+ "QtWidgets.QApplication.translate": [
+ "QtCompat.translate", _translate
+ ],
+ "QtCore.qInstallMessageHandler": [
+ "QtCompat.qInstallMessageHandler", _qInstallMessageHandler
+ ],
+ "QtWidgets.QStyleOptionViewItem": "QtCompat.QStyleOptionViewItemV4",
+ "QtMultimedia.QSound": "QtMultimedia.QSound",
+ },
+ "PyQt5": {
+ "QtCore.pyqtProperty": "QtCore.Property",
+ "QtCore.pyqtSignal": "QtCore.Signal",
+ "QtCore.pyqtSlot": "QtCore.Slot",
+ "uic.loadUi": ["QtCompat.loadUi", _loadUi],
+ "sip.wrapinstance": ["QtCompat.wrapInstance", _wrapinstance],
+ "sip.unwrapinstance": ["QtCompat.getCppPointer", _getcpppointer],
+ "sip.isdeleted": ["QtCompat.isValid", _isvalid],
+ "QtWidgets.qApp": "QtWidgets.QApplication.instance()",
+ "QtCore.QCoreApplication.translate": [
+ "QtCompat.translate", _translate
+ ],
+ "QtWidgets.QApplication.translate": [
+ "QtCompat.translate", _translate
+ ],
+ "QtCore.qInstallMessageHandler": [
+ "QtCompat.qInstallMessageHandler", _qInstallMessageHandler
+ ],
+ "QtWidgets.QStyleOptionViewItem": "QtCompat.QStyleOptionViewItemV4",
+ "QtMultimedia.QSound": "QtMultimedia.QSound",
+ },
+ "PySide": {
+ "QtGui.QAbstractProxyModel": "QtCore.QAbstractProxyModel",
+ "QtGui.QSortFilterProxyModel": "QtCore.QSortFilterProxyModel",
+ "QtGui.QStringListModel": "QtCore.QStringListModel",
+ "QtGui.QItemSelection": "QtCore.QItemSelection",
+ "QtGui.QItemSelectionModel": "QtCore.QItemSelectionModel",
+ "QtGui.QItemSelectionRange": "QtCore.QItemSelectionRange",
+ "QtGui.QAbstractPrintDialog": "QtPrintSupport.QAbstractPrintDialog",
+ "QtGui.QPageSetupDialog": "QtPrintSupport.QPageSetupDialog",
+ "QtGui.QPrintDialog": "QtPrintSupport.QPrintDialog",
+ "QtGui.QPrintEngine": "QtPrintSupport.QPrintEngine",
+ "QtGui.QPrintPreviewDialog": "QtPrintSupport.QPrintPreviewDialog",
+ "QtGui.QPrintPreviewWidget": "QtPrintSupport.QPrintPreviewWidget",
+ "QtGui.QPrinter": "QtPrintSupport.QPrinter",
+ "QtGui.QPrinterInfo": "QtPrintSupport.QPrinterInfo",
+ "QtUiTools.QUiLoader": ["QtCompat.loadUi", _loadUi],
+ "shiboken.wrapInstance": ["QtCompat.wrapInstance", _wrapinstance],
+ "shiboken.unwrapInstance": ["QtCompat.getCppPointer", _getcpppointer],
+ "shiboken.isValid": ["QtCompat.isValid", _isvalid],
+ "QtGui.qApp": "QtWidgets.QApplication.instance()",
+ "QtCore.QCoreApplication.translate": [
+ "QtCompat.translate", _translate
+ ],
+ "QtGui.QApplication.translate": [
+ "QtCompat.translate", _translate
+ ],
+ "QtCore.qInstallMsgHandler": [
+ "QtCompat.qInstallMessageHandler", _qInstallMessageHandler
+ ],
+ "QtGui.QStyleOptionViewItemV4": "QtCompat.QStyleOptionViewItemV4",
+ "QtGui.QSound": "QtMultimedia.QSound",
+ },
+ "PyQt4": {
+ "QtGui.QAbstractProxyModel": "QtCore.QAbstractProxyModel",
+ "QtGui.QSortFilterProxyModel": "QtCore.QSortFilterProxyModel",
+ "QtGui.QItemSelection": "QtCore.QItemSelection",
+ "QtGui.QStringListModel": "QtCore.QStringListModel",
+ "QtGui.QItemSelectionModel": "QtCore.QItemSelectionModel",
+ "QtCore.pyqtProperty": "QtCore.Property",
+ "QtCore.pyqtSignal": "QtCore.Signal",
+ "QtCore.pyqtSlot": "QtCore.Slot",
+ "QtGui.QItemSelectionRange": "QtCore.QItemSelectionRange",
+ "QtGui.QAbstractPrintDialog": "QtPrintSupport.QAbstractPrintDialog",
+ "QtGui.QPageSetupDialog": "QtPrintSupport.QPageSetupDialog",
+ "QtGui.QPrintDialog": "QtPrintSupport.QPrintDialog",
+ "QtGui.QPrintEngine": "QtPrintSupport.QPrintEngine",
+ "QtGui.QPrintPreviewDialog": "QtPrintSupport.QPrintPreviewDialog",
+ "QtGui.QPrintPreviewWidget": "QtPrintSupport.QPrintPreviewWidget",
+ "QtGui.QPrinter": "QtPrintSupport.QPrinter",
+ "QtGui.QPrinterInfo": "QtPrintSupport.QPrinterInfo",
+ "uic.loadUi": ["QtCompat.loadUi", _loadUi],
+ "sip.wrapinstance": ["QtCompat.wrapInstance", _wrapinstance],
+ "sip.unwrapinstance": ["QtCompat.getCppPointer", _getcpppointer],
+ "sip.isdeleted": ["QtCompat.isValid", _isvalid],
+ "QtCore.QString": "str",
+ "QtGui.qApp": "QtWidgets.QApplication.instance()",
+ "QtCore.QCoreApplication.translate": [
+ "QtCompat.translate", _translate
+ ],
+ "QtGui.QApplication.translate": [
+ "QtCompat.translate", _translate
+ ],
+ "QtCore.qInstallMsgHandler": [
+ "QtCompat.qInstallMessageHandler", _qInstallMessageHandler
+ ],
+ "QtGui.QStyleOptionViewItemV4": "QtCompat.QStyleOptionViewItemV4",
+ "QtGui.QSound": "QtMultimedia.QSound",
+ }
+}
+
+""" Compatibility Members
+
+This dictionary is used to build Qt.QtCompat objects that provide a consistent
+interface for obsolete members, and differences in binding return values.
+
+{
+ "binding": {
+ "classname": {
+ "targetname": "binding_namespace",
+ }
+ }
+}
+"""
+_compatibility_members = {
+ "PySide6": {
+ "QWidget": {
+ "grab": "QtWidgets.QWidget.grab",
+ },
+ "QHeaderView": {
+ "sectionsClickable": "QtWidgets.QHeaderView.sectionsClickable",
+ "setSectionsClickable":
+ "QtWidgets.QHeaderView.setSectionsClickable",
+ "sectionResizeMode": "QtWidgets.QHeaderView.sectionResizeMode",
+ "setSectionResizeMode":
+ "QtWidgets.QHeaderView.setSectionResizeMode",
+ "sectionsMovable": "QtWidgets.QHeaderView.sectionsMovable",
+ "setSectionsMovable": "QtWidgets.QHeaderView.setSectionsMovable",
+ },
+ "QFileDialog": {
+ "getOpenFileName": "QtWidgets.QFileDialog.getOpenFileName",
+ "getOpenFileNames": "QtWidgets.QFileDialog.getOpenFileNames",
+ "getSaveFileName": "QtWidgets.QFileDialog.getSaveFileName",
+ },
+ },
+ "PySide2": {
+ "QWidget": {
+ "grab": "QtWidgets.QWidget.grab",
+ },
+ "QHeaderView": {
+ "sectionsClickable": "QtWidgets.QHeaderView.sectionsClickable",
+ "setSectionsClickable":
+ "QtWidgets.QHeaderView.setSectionsClickable",
+ "sectionResizeMode": "QtWidgets.QHeaderView.sectionResizeMode",
+ "setSectionResizeMode":
+ "QtWidgets.QHeaderView.setSectionResizeMode",
+ "sectionsMovable": "QtWidgets.QHeaderView.sectionsMovable",
+ "setSectionsMovable": "QtWidgets.QHeaderView.setSectionsMovable",
+ },
+ "QFileDialog": {
+ "getOpenFileName": "QtWidgets.QFileDialog.getOpenFileName",
+ "getOpenFileNames": "QtWidgets.QFileDialog.getOpenFileNames",
+ "getSaveFileName": "QtWidgets.QFileDialog.getSaveFileName",
+ },
+ },
+ "PyQt5": {
+ "QWidget": {
+ "grab": "QtWidgets.QWidget.grab",
+ },
+ "QHeaderView": {
+ "sectionsClickable": "QtWidgets.QHeaderView.sectionsClickable",
+ "setSectionsClickable":
+ "QtWidgets.QHeaderView.setSectionsClickable",
+ "sectionResizeMode": "QtWidgets.QHeaderView.sectionResizeMode",
+ "setSectionResizeMode":
+ "QtWidgets.QHeaderView.setSectionResizeMode",
+ "sectionsMovable": "QtWidgets.QHeaderView.sectionsMovable",
+ "setSectionsMovable": "QtWidgets.QHeaderView.setSectionsMovable",
+ },
+ "QFileDialog": {
+ "getOpenFileName": "QtWidgets.QFileDialog.getOpenFileName",
+ "getOpenFileNames": "QtWidgets.QFileDialog.getOpenFileNames",
+ "getSaveFileName": "QtWidgets.QFileDialog.getSaveFileName",
+ },
+ },
+ "PySide": {
+ "QWidget": {
+ "grab": "QtWidgets.QPixmap.grabWidget",
+ },
+ "QHeaderView": {
+ "sectionsClickable": "QtWidgets.QHeaderView.isClickable",
+ "setSectionsClickable": "QtWidgets.QHeaderView.setClickable",
+ "sectionResizeMode": "QtWidgets.QHeaderView.resizeMode",
+ "setSectionResizeMode": "QtWidgets.QHeaderView.setResizeMode",
+ "sectionsMovable": "QtWidgets.QHeaderView.isMovable",
+ "setSectionsMovable": "QtWidgets.QHeaderView.setMovable",
+ },
+ "QFileDialog": {
+ "getOpenFileName": "QtWidgets.QFileDialog.getOpenFileName",
+ "getOpenFileNames": "QtWidgets.QFileDialog.getOpenFileNames",
+ "getSaveFileName": "QtWidgets.QFileDialog.getSaveFileName",
+ },
+ },
+ "PyQt4": {
+ "QWidget": {
+ "grab": "QtWidgets.QPixmap.grabWidget",
+ },
+ "QHeaderView": {
+ "sectionsClickable": "QtWidgets.QHeaderView.isClickable",
+ "setSectionsClickable": "QtWidgets.QHeaderView.setClickable",
+ "sectionResizeMode": "QtWidgets.QHeaderView.resizeMode",
+ "setSectionResizeMode": "QtWidgets.QHeaderView.setResizeMode",
+ "sectionsMovable": "QtWidgets.QHeaderView.isMovable",
+ "setSectionsMovable": "QtWidgets.QHeaderView.setMovable",
+ },
+ "QFileDialog": {
+ "getOpenFileName": "QtWidgets.QFileDialog.getOpenFileName",
+ "getOpenFileNames": "QtWidgets.QFileDialog.getOpenFileNames",
+ "getSaveFileName": "QtWidgets.QFileDialog.getSaveFileName",
+ },
+ },
+}
+
+
+def _apply_site_config():
+ try:
+ import QtSiteConfig
+ except ImportError:
+ # If no QtSiteConfig module found, no modifications
+ # to _common_members are needed.
+ pass
+ else:
+ # Provide the ability to modify the dicts used to build Qt.py
+ if hasattr(QtSiteConfig, 'update_members'):
+ QtSiteConfig.update_members(_common_members)
+
+ if hasattr(QtSiteConfig, 'update_misplaced_members'):
+ QtSiteConfig.update_misplaced_members(members=_misplaced_members)
+
+ if hasattr(QtSiteConfig, 'update_compatibility_members'):
+ QtSiteConfig.update_compatibility_members(
+ members=_compatibility_members)
+
+
+def _new_module(name):
+ return types.ModuleType(__name__ + "." + name)
+
+
+def _import_sub_module(module, name):
+ """import_sub_module will mimic the function of importlib.import_module"""
+ module = __import__(module.__name__ + "." + name)
+ for level in name.split("."):
+ module = getattr(module, level)
+ return module
+
+
+def _setup(module, extras):
+ """Install common submodules"""
+
+ Qt.__binding__ = module.__name__
+
+ def _warn_import_error(exc, module):
+ msg = str(exc)
+ if "No module named" in msg:
+ return
+ _warn("ImportError(%s): %s" % (module, msg))
+
+ for name in list(_common_members) + extras:
+ try:
+ submodule = _import_sub_module(
+ module, name)
+ except ImportError as e:
+ try:
+ # For extra modules like sip and shiboken that may not be
+ # children of the binding.
+ submodule = __import__(name)
+ except ImportError as e2:
+ _warn_import_error(e, name)
+ _warn_import_error(e2, name)
+ continue
+
+ setattr(Qt, "_" + name, submodule)
+
+ if name not in extras:
+ # Store reference to original binding,
+ # but don't store speciality modules
+ # such as uic or QtUiTools
+ setattr(Qt, name, _new_module(name))
+
+
+def _reassign_misplaced_members(binding):
+ """Apply misplaced members from `binding` to Qt.py
+
+ Arguments:
+ binding (dict): Misplaced members
+
+ """
+
+ for src, dst in _misplaced_members[binding].items():
+ dst_value = None
+
+ src_parts = src.split(".")
+ src_module = src_parts[0]
+ src_member = None
+ if len(src_parts) > 1:
+ src_member = src_parts[1:]
+
+ if isinstance(dst, (list, tuple)):
+ dst, dst_value = dst
+
+ dst_parts = dst.split(".")
+ dst_module = dst_parts[0]
+ dst_member = None
+ if len(dst_parts) > 1:
+ dst_member = dst_parts[1]
+
+ # Get the member we want to store in the namesapce.
+ if not dst_value:
+ try:
+ _part = getattr(Qt, "_" + src_module)
+ while src_member:
+ member = src_member.pop(0)
+ _part = getattr(_part, member)
+ dst_value = _part
+ except AttributeError:
+ # If the member we want to store in the namespace does not
+ # exist, there is no need to continue. This can happen if a
+ # request was made to rename a member that didn't exist, for
+ # example if QtWidgets isn't available on the target platform.
+ _log("Misplaced member has no source: {0}".format(src))
+ continue
+
+ try:
+ src_object = getattr(Qt, dst_module)
+ except AttributeError:
+ if dst_module not in _common_members:
+ # Only create the Qt parent module if its listed in
+ # _common_members. Without this check, if you remove QtCore
+ # from _common_members, the default _misplaced_members will add
+ # Qt.QtCore so it can add Signal, Slot, etc.
+ msg = 'Not creating missing member module "{m}" for "{c}"'
+ _log(msg.format(m=dst_module, c=dst_member))
+ continue
+ # If the dst is valid but the Qt parent module does not exist
+ # then go ahead and create a new module to contain the member.
+ setattr(Qt, dst_module, _new_module(dst_module))
+ src_object = getattr(Qt, dst_module)
+ # Enable direct import of the new module
+ sys.modules[__name__ + "." + dst_module] = src_object
+
+ if not dst_value:
+ dst_value = getattr(Qt, "_" + src_module)
+ if src_member:
+ dst_value = getattr(dst_value, src_member)
+
+ setattr(
+ src_object,
+ dst_member or dst_module,
+ dst_value
+ )
+
+
+def _build_compatibility_members(binding, decorators=None):
+ """Apply `binding` to QtCompat
+
+ Arguments:
+ binding (str): Top level binding in _compatibility_members.
+ decorators (dict, optional): Provides the ability to decorate the
+ original Qt methods when needed by a binding. This can be used
+ to change the returned value to a standard value. The key should
+ be the classname, the value is a dict where the keys are the
+ target method names, and the values are the decorator functions.
+
+ """
+
+ decorators = decorators or dict()
+
+ # Allow optional site-level customization of the compatibility members.
+ # This method does not need to be implemented in QtSiteConfig.
+ try:
+ import QtSiteConfig
+ except ImportError:
+ pass
+ else:
+ if hasattr(QtSiteConfig, 'update_compatibility_decorators'):
+ QtSiteConfig.update_compatibility_decorators(binding, decorators)
+
+ _QtCompat = type("QtCompat", (object,), {})
+
+ for classname, bindings in _compatibility_members[binding].items():
+ attrs = {}
+ for target, binding in bindings.items():
+ namespaces = binding.split('.')
+ try:
+ src_object = getattr(Qt, "_" + namespaces[0])
+ except AttributeError as e:
+ _log("QtCompat: AttributeError: %s" % e)
+ # Skip reassignment of non-existing members.
+ # This can happen if a request was made to
+ # rename a member that didn't exist, for example
+ # if QtWidgets isn't available on the target platform.
+ continue
+
+ # Walk down any remaining namespace getting the object assuming
+ # that if the first namespace exists the rest will exist.
+ for namespace in namespaces[1:]:
+ src_object = getattr(src_object, namespace)
+
+ # decorate the Qt method if a decorator was provided.
+ if target in decorators.get(classname, []):
+ # staticmethod must be called on the decorated method to
+ # prevent a TypeError being raised when the decorated method
+ # is called.
+ src_object = staticmethod(
+ decorators[classname][target](src_object))
+
+ attrs[target] = src_object
+
+ # Create the QtCompat class and install it into the namespace
+ compat_class = type(classname, (_QtCompat,), attrs)
+ setattr(Qt.QtCompat, classname, compat_class)
+
+
+def _pyside6():
+ """Initialise PySide6
+
+ These functions serve to test the existence of a binding
+ along with set it up in such a way that it aligns with
+ the final step; adding members from the original binding
+ to Qt.py
+
+ """
+
+ import PySide6 as module
+ extras = ["QtUiTools"]
+ try:
+ import shiboken6
+ extras.append("shiboken6")
+ except ImportError as e:
+ print("ImportError: %s" % e)
+
+ _setup(module, extras)
+ Qt.__binding_version__ = module.__version__
+
+ if hasattr(Qt, "_shiboken6"):
+ Qt.QtCompat.wrapInstance = _wrapinstance
+ Qt.QtCompat.getCppPointer = _getcpppointer
+ Qt.QtCompat.delete = shiboken6.delete
+
+ if hasattr(Qt, "_QtUiTools"):
+ Qt.QtCompat.loadUi = _loadUi
+
+ if hasattr(Qt, "_QtCore"):
+ Qt.__qt_version__ = Qt._QtCore.qVersion()
+ Qt.QtCompat.dataChanged = (
+ lambda self, topleft, bottomright, roles=None:
+ self.dataChanged.emit(topleft, bottomright, roles or [])
+ )
+
+ if hasattr(Qt, "_QtWidgets"):
+ Qt.QtCompat.setSectionResizeMode = \
+ Qt._QtWidgets.QHeaderView.setSectionResizeMode
+
+ _reassign_misplaced_members("PySide6")
+ _build_compatibility_members("PySide6")
+
+
+def _pyside2():
+ """Initialise PySide2
+
+ These functions serve to test the existence of a binding
+ along with set it up in such a way that it aligns with
+ the final step; adding members from the original binding
+ to Qt.py
+
+ """
+
+ import PySide2 as module
+ extras = ["QtUiTools"]
+ try:
+ try:
+ # Before merge of PySide and shiboken
+ import shiboken2
+ except ImportError:
+ # After merge of PySide and shiboken, May 2017
+ from PySide2 import shiboken2
+ extras.append("shiboken2")
+ except ImportError:
+ pass
+
+ _setup(module, extras)
+ Qt.__binding_version__ = module.__version__
+
+ if hasattr(Qt, "_shiboken2"):
+ Qt.QtCompat.wrapInstance = _wrapinstance
+ Qt.QtCompat.getCppPointer = _getcpppointer
+ Qt.QtCompat.delete = shiboken2.delete
+
+ if hasattr(Qt, "_QtUiTools"):
+ Qt.QtCompat.loadUi = _loadUi
+
+ if hasattr(Qt, "_QtCore"):
+ Qt.__qt_version__ = Qt._QtCore.qVersion()
+ Qt.QtCompat.dataChanged = (
+ lambda self, topleft, bottomright, roles=None:
+ self.dataChanged.emit(topleft, bottomright, roles or [])
+ )
+
+ if hasattr(Qt, "_QtWidgets"):
+ Qt.QtCompat.setSectionResizeMode = \
+ Qt._QtWidgets.QHeaderView.setSectionResizeMode
+
+ _reassign_misplaced_members("PySide2")
+ _build_compatibility_members("PySide2")
+
+
+def _pyside():
+ """Initialise PySide"""
+
+ import PySide as module
+ extras = ["QtUiTools"]
+ try:
+ try:
+ # Before merge of PySide and shiboken
+ import shiboken
+ except ImportError:
+ # After merge of PySide and shiboken, May 2017
+ from PySide import shiboken
+ extras.append("shiboken")
+ except ImportError:
+ pass
+
+ _setup(module, extras)
+ Qt.__binding_version__ = module.__version__
+
+ if hasattr(Qt, "_shiboken"):
+ Qt.QtCompat.wrapInstance = _wrapinstance
+ Qt.QtCompat.getCppPointer = _getcpppointer
+ Qt.QtCompat.delete = shiboken.delete
+
+ if hasattr(Qt, "_QtUiTools"):
+ Qt.QtCompat.loadUi = _loadUi
+
+ if hasattr(Qt, "_QtGui"):
+ setattr(Qt, "QtWidgets", _new_module("QtWidgets"))
+ setattr(Qt, "_QtWidgets", Qt._QtGui)
+ if hasattr(Qt._QtGui, "QX11Info"):
+ setattr(Qt, "QtX11Extras", _new_module("QtX11Extras"))
+ Qt.QtX11Extras.QX11Info = Qt._QtGui.QX11Info
+
+ Qt.QtCompat.setSectionResizeMode = Qt._QtGui.QHeaderView.setResizeMode
+
+ if hasattr(Qt, "_QtCore"):
+ Qt.__qt_version__ = Qt._QtCore.qVersion()
+ Qt.QtCompat.dataChanged = (
+ lambda self, topleft, bottomright, roles=None:
+ self.dataChanged.emit(topleft, bottomright)
+ )
+
+ _reassign_misplaced_members("PySide")
+ _build_compatibility_members("PySide")
+
+
+def _pyqt5():
+ """Initialise PyQt5"""
+
+ import PyQt5 as module
+ extras = ["uic"]
+
+ try:
+ # Relevant to PyQt5 5.11 and above
+ from PyQt5 import sip
+ extras += ["sip"]
+ except ImportError:
+
+ try:
+ import sip
+ extras += ["sip"]
+ except ImportError:
+ sip = None
+
+ _setup(module, extras)
+ if hasattr(Qt, "_sip"):
+ Qt.QtCompat.wrapInstance = _wrapinstance
+ Qt.QtCompat.getCppPointer = _getcpppointer
+ Qt.QtCompat.delete = sip.delete
+
+ if hasattr(Qt, "_uic"):
+ Qt.QtCompat.loadUi = _loadUi
+
+ if hasattr(Qt, "_QtCore"):
+ Qt.__binding_version__ = Qt._QtCore.PYQT_VERSION_STR
+ Qt.__qt_version__ = Qt._QtCore.QT_VERSION_STR
+ Qt.QtCompat.dataChanged = (
+ lambda self, topleft, bottomright, roles=None:
+ self.dataChanged.emit(topleft, bottomright, roles or [])
+ )
+
+ if hasattr(Qt, "_QtWidgets"):
+ Qt.QtCompat.setSectionResizeMode = \
+ Qt._QtWidgets.QHeaderView.setSectionResizeMode
+
+ _reassign_misplaced_members("PyQt5")
+ _build_compatibility_members('PyQt5')
+
+
+def _pyqt4():
+ """Initialise PyQt4"""
+
+ import sip
+
+ # Validation of envivornment variable. Prevents an error if
+ # the variable is invalid since it's just a hint.
+ try:
+ hint = int(QT_SIP_API_HINT)
+ except TypeError:
+ hint = None # Variable was None, i.e. not set.
+ except ValueError:
+ raise ImportError("QT_SIP_API_HINT=%s must be a 1 or 2")
+
+ for api in ("QString",
+ "QVariant",
+ "QDate",
+ "QDateTime",
+ "QTextStream",
+ "QTime",
+ "QUrl"):
+ try:
+ sip.setapi(api, hint or 2)
+ except AttributeError:
+ raise ImportError("PyQt4 < 4.6 isn't supported by Qt.py")
+ except ValueError:
+ actual = sip.getapi(api)
+ if not hint:
+ raise ImportError("API version already set to %d" % actual)
+ else:
+ # Having provided a hint indicates a soft constraint, one
+ # that doesn't throw an exception.
+ sys.stderr.write(
+ "Warning: API '%s' has already been set to %d.\n"
+ % (api, actual)
+ )
+
+ import PyQt4 as module
+ extras = ["uic"]
+ try:
+ import sip
+ extras.append(sip.__name__)
+ except ImportError:
+ sip = None
+
+ _setup(module, extras)
+ if hasattr(Qt, "_sip"):
+ Qt.QtCompat.wrapInstance = _wrapinstance
+ Qt.QtCompat.getCppPointer = _getcpppointer
+ Qt.QtCompat.delete = sip.delete
+
+ if hasattr(Qt, "_uic"):
+ Qt.QtCompat.loadUi = _loadUi
+
+ if hasattr(Qt, "_QtGui"):
+ setattr(Qt, "QtWidgets", _new_module("QtWidgets"))
+ setattr(Qt, "_QtWidgets", Qt._QtGui)
+ if hasattr(Qt._QtGui, "QX11Info"):
+ setattr(Qt, "QtX11Extras", _new_module("QtX11Extras"))
+ Qt.QtX11Extras.QX11Info = Qt._QtGui.QX11Info
+
+ Qt.QtCompat.setSectionResizeMode = \
+ Qt._QtGui.QHeaderView.setResizeMode
+
+ if hasattr(Qt, "_QtCore"):
+ Qt.__binding_version__ = Qt._QtCore.PYQT_VERSION_STR
+ Qt.__qt_version__ = Qt._QtCore.QT_VERSION_STR
+ Qt.QtCompat.dataChanged = (
+ lambda self, topleft, bottomright, roles=None:
+ self.dataChanged.emit(topleft, bottomright)
+ )
+
+ _reassign_misplaced_members("PyQt4")
+
+ # QFileDialog QtCompat decorator
+ def _standardizeQFileDialog(some_function):
+ """Decorator that makes PyQt4 return conform to other bindings"""
+ def wrapper(*args, **kwargs):
+ ret = (some_function(*args, **kwargs))
+
+ # PyQt4 only returns the selected filename, force it to a
+ # standard return of the selected filename, and a empty string
+ # for the selected filter
+ return ret, ''
+
+ wrapper.__doc__ = some_function.__doc__
+ wrapper.__name__ = some_function.__name__
+
+ return wrapper
+
+ decorators = {
+ "QFileDialog": {
+ "getOpenFileName": _standardizeQFileDialog,
+ "getOpenFileNames": _standardizeQFileDialog,
+ "getSaveFileName": _standardizeQFileDialog,
+ }
+ }
+ _build_compatibility_members('PyQt4', decorators)
+
+
+def _none():
+ """Internal option (used in installer)"""
+
+ Mock = type("Mock", (), {"__getattr__": lambda Qt, attr: None})
+
+ Qt.__binding__ = "None"
+ Qt.__qt_version__ = "0.0.0"
+ Qt.__binding_version__ = "0.0.0"
+ Qt.QtCompat.loadUi = lambda uifile, baseinstance=None: None
+ Qt.QtCompat.setSectionResizeMode = lambda *args, **kwargs: None
+
+ for submodule in _common_members.keys():
+ setattr(Qt, submodule, Mock())
+ setattr(Qt, "_" + submodule, Mock())
+
+
+def _log(text):
+ if QT_VERBOSE:
+ sys.stdout.write("Qt.py [info]: %s\n" % text)
+
+
+def _warn(text):
+ try:
+ sys.stderr.write("Qt.py [warning]: %s\n" % text)
+ except UnicodeDecodeError:
+ import locale
+ encoding = locale.getpreferredencoding()
+ sys.stderr.write("Qt.py [warning]: %s\n" % text.decode(encoding))
+
+
+def _convert(lines):
+ """Convert compiled .ui file from PySide2 to Qt.py
+
+ Arguments:
+ lines (list): Each line of of .ui file
+
+ Usage:
+ >> with open("myui.py") as f:
+ .. lines = _convert(f.readlines())
+
+ """
+
+ def parse(line):
+ line = line.replace("from PySide2 import", "from Qt import QtCompat,")
+ line = line.replace("QtWidgets.QApplication.translate",
+ "QtCompat.translate")
+ if "QtCore.SIGNAL" in line:
+ raise NotImplementedError("QtCore.SIGNAL is missing from PyQt5 "
+ "and so Qt.py does not support it: you "
+ "should avoid defining signals inside "
+ "your ui files.")
+ return line
+
+ parsed = list()
+ for line in lines:
+ line = parse(line)
+ parsed.append(line)
+
+ return parsed
+
+
+def _cli(args):
+ """Qt.py command-line interface"""
+ import argparse
+
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--convert",
+ help="Path to compiled Python module, e.g. my_ui.py")
+ parser.add_argument("--compile",
+ help="Accept raw .ui file and compile with native "
+ "PySide2 compiler.")
+ parser.add_argument("--stdout",
+ help="Write to stdout instead of file",
+ action="store_true")
+ parser.add_argument("--stdin",
+ help="Read from stdin instead of file",
+ action="store_true")
+
+ args = parser.parse_args(args)
+
+ if args.stdout:
+ raise NotImplementedError("--stdout")
+
+ if args.stdin:
+ raise NotImplementedError("--stdin")
+
+ if args.compile:
+ raise NotImplementedError("--compile")
+
+ if args.convert:
+ sys.stdout.write("#\n"
+ "# WARNING: --convert is an ALPHA feature.\n#\n"
+ "# See https://github.com/mottosso/Qt.py/pull/132\n"
+ "# for details.\n"
+ "#\n")
+
+ #
+ # ------> Read
+ #
+ with open(args.convert) as f:
+ lines = _convert(f.readlines())
+
+ backup = "%s_backup%s" % os.path.splitext(args.convert)
+ sys.stdout.write("Creating \"%s\"..\n" % backup)
+ shutil.copy(args.convert, backup)
+
+ #
+ # <------ Write
+ #
+ with open(args.convert, "w") as f:
+ f.write("".join(lines))
+
+ sys.stdout.write("Successfully converted \"%s\"\n" % args.convert)
+
+
+class MissingMember(object):
+ """
+ A placeholder type for a missing Qt object not
+ included in Qt.py
+
+ Args:
+ name (str): The name of the missing type
+ details (str): An optional custom error message
+ """
+ ERR_TMPL = ("{} is not a common object across PySide2 "
+ "and the other Qt bindings. It is not included "
+ "as a common member in the Qt.py layer")
+
+ def __init__(self, name, details=''):
+ self.__name = name
+ self.__err = self.ERR_TMPL.format(name)
+
+ if details:
+ self.__err = "{}: {}".format(self.__err, details)
+
+ def __repr__(self):
+ return "<{}: {}>".format(self.__class__.__name__, self.__name)
+
+ def __getattr__(self, name):
+ raise NotImplementedError(self.__err)
+
+ def __call__(self, *a, **kw):
+ raise NotImplementedError(self.__err)
+
+
+def _install():
+ # Default order (customize order and content via QT_PREFERRED_BINDING)
+ default_order = ("PySide6", "PySide2", "PyQt5", "PySide", "PyQt4")
+ preferred_order = None
+ if QT_PREFERRED_BINDING_JSON:
+ # A per-vendor preferred binding customization was defined
+ # This should be a dictionary of the full Qt.py module namespace to
+ # apply binding settings to. The "default" key can be used to apply
+ # custom bindings to all modules not explicitly defined. If the json
+ # data is invalid this will raise a exception.
+ # Example:
+ # {"mylibrary.vendor.Qt": ["PySide2"], "default":["PyQt5","PyQt4"]}
+ try:
+ preferred_bindings = json.loads(QT_PREFERRED_BINDING_JSON)
+ except ValueError:
+ # Python 2 raises ValueError, Python 3 raises json.JSONDecodeError
+ # a subclass of ValueError
+ _warn("Failed to parse QT_PREFERRED_BINDING_JSON='%s'"
+ % QT_PREFERRED_BINDING_JSON)
+ _warn("Falling back to default preferred order")
+ else:
+ preferred_order = preferred_bindings.get(__name__)
+ # If no matching binding was used, optionally apply a default.
+ if preferred_order is None:
+ preferred_order = preferred_bindings.get("default", None)
+ if preferred_order is None:
+ # If a json preferred binding was not used use, respect the
+ # QT_PREFERRED_BINDING environment variable if defined.
+ preferred_order = list(
+ b for b in QT_PREFERRED_BINDING.split(os.pathsep) if b
+ )
+
+ order = preferred_order or default_order
+
+ available = {
+ "PySide6": _pyside6,
+ "PySide2": _pyside2,
+ "PyQt5": _pyqt5,
+ "PySide": _pyside,
+ "PyQt4": _pyqt4,
+ "None": _none
+ }
+
+ _log("Order: '%s'" % "', '".join(order))
+
+ # Allow site-level customization of the available modules.
+ _apply_site_config()
+
+ found_binding = False
+ for name in order:
+ _log("Trying %s" % name)
+
+ try:
+ available[name]()
+ found_binding = True
+ break
+
+ except ImportError as e:
+ _log("ImportError: %s" % e)
+
+ except KeyError:
+ _log("ImportError: Preferred binding '%s' not found." % name)
+
+ if not found_binding:
+ # If not binding were found, throw this error
+ raise ImportError("No Qt binding were found.")
+
+ # Install individual members
+ for name, members in _common_members.items():
+ try:
+ their_submodule = getattr(Qt, "_%s" % name)
+ except AttributeError:
+ continue
+
+ our_submodule = getattr(Qt, name)
+
+ # Enable import *
+ __all__.append(name)
+
+ # Enable direct import of submodule,
+ # e.g. import Qt.QtCore
+ sys.modules[__name__ + "." + name] = our_submodule
+
+ for member in members:
+ # Accept that a submodule may miss certain members.
+ try:
+ their_member = getattr(their_submodule, member)
+ except AttributeError:
+ _log("'%s.%s' was missing." % (name, member))
+ continue
+
+ setattr(our_submodule, member, their_member)
+
+ # Install missing member placeholders
+ for name, members in _missing_members.items():
+ our_submodule = getattr(Qt, name)
+
+ for member in members:
+
+ # If the submodule already has this member installed,
+ # either by the common members, or the site config,
+ # then skip installing this one over it.
+ if hasattr(our_submodule, member):
+ continue
+
+ placeholder = MissingMember("{}.{}".format(name, member),
+ details=members[member])
+ setattr(our_submodule, member, placeholder)
+
+ # Enable direct import of QtCompat
+ sys.modules[__name__ + ".QtCompat"] = Qt.QtCompat
+
+ # Backwards compatibility
+ if hasattr(Qt.QtCompat, 'loadUi'):
+ Qt.QtCompat.load_ui = Qt.QtCompat.loadUi
+
+
+_install()
+
+# Setup Binding Enum states
+Qt.IsPySide6 = Qt.__binding__ == "PySide6"
+Qt.IsPySide2 = Qt.__binding__ == 'PySide2'
+Qt.IsPyQt5 = Qt.__binding__ == 'PyQt5'
+Qt.IsPySide = Qt.__binding__ == 'PySide'
+Qt.IsPyQt4 = Qt.__binding__ == 'PyQt4'
+
+"""Augment QtCompat
+
+QtCompat contains wrappers and added functionality
+to the original bindings, such as the CLI interface
+and otherwise incompatible members between bindings,
+such as `QHeaderView.setSectionResizeMode`.
+
+"""
+
+Qt.QtCompat._cli = _cli
+Qt.QtCompat._convert = _convert
+
+# Enable command-line interface
+if __name__ == "__main__":
+ _cli(sys.argv[1:])
+
+
+# The MIT License (MIT)
+#
+# Copyright (c) 2016-2017 Marcus Ottosson
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+#
+# In PySide(2), loadUi does not exist, so we implement it
+#
+# `_UiLoader` is adapted from the qtpy project, which was further influenced
+# by qt-helpers which was released under a 3-clause BSD license which in turn
+# is based on a solution at:
+#
+# - https://gist.github.com/cpbotha/1b42a20c8f3eb9bb7cb8
+#
+# The License for this code is as follows:
+#
+# qt-helpers - a common front-end to various Qt modules
+#
+# Copyright (c) 2015, Chris Beaumont and Thomas Robitaille
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the Glue project nor the names of its contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Which itself was based on the solution at
+#
+# https://gist.github.com/cpbotha/1b42a20c8f3eb9bb7cb8
+#
+# which was released under the MIT license:
+#
+# Copyright (c) 2011 Sebastian Wiesner
+# Modifications by Charl Botha
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files
+# (the "Software"),to deal in the Software without restriction,
+# including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/2023/scripts/animation_tools/studiolibrary/studiovendor/__init__.py b/2023/scripts/animation_tools/studiolibrary/studiovendor/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/2023/scripts/animation_tools/studiolibrary/studiovendor/six.py b/2023/scripts/animation_tools/studiolibrary/studiovendor/six.py
new file mode 100644
index 0000000..7aed626
--- /dev/null
+++ b/2023/scripts/animation_tools/studiolibrary/studiovendor/six.py
@@ -0,0 +1,973 @@
+# Copyright (c) 2010-2018 Benjamin Peterson
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+"""
+Utilities for writing code that runs on Python 2 and 3
+
+WARNING: THIS VERSION OF SIX HAS BEEN MODIFIED.
+
+Changed line 658:
+
+ def u(s):
+ s = s.replace(r'\\', r'\\\\')
+ if isinstance(s, unicode):
+ return s
+ else:
+ return unicode(s, "unicode_escape")
+"""
+
+from __future__ import absolute_import
+
+import functools
+import itertools
+import operator
+import sys
+import types
+
+__author__ = "Benjamin Peterson "
+__version__ = "1.12.0"
+
+
+# Useful for very coarse version differentiation.
+PY2 = sys.version_info[0] == 2
+PY3 = sys.version_info[0] == 3
+PY34 = sys.version_info[0:2] >= (3, 4)
+
+if PY3:
+ string_types = str,
+ integer_types = int,
+ class_types = type,
+ text_type = str
+ binary_type = bytes
+
+ MAXSIZE = sys.maxsize
+else:
+ string_types = basestring,
+ integer_types = (int, long)
+ class_types = (type, types.ClassType)
+ text_type = unicode
+ binary_type = str
+
+ if sys.platform.startswith("java"):
+ # Jython always uses 32 bits.
+ MAXSIZE = int((1 << 31) - 1)
+ else:
+ # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
+ class X(object):
+
+ def __len__(self):
+ return 1 << 31
+ try:
+ len(X())
+ except OverflowError:
+ # 32-bit
+ MAXSIZE = int((1 << 31) - 1)
+ else:
+ # 64-bit
+ MAXSIZE = int((1 << 63) - 1)
+ del X
+
+
+def _add_doc(func, doc):
+ """Add documentation to a function."""
+ func.__doc__ = doc
+
+
+def _import_module(name):
+ """Import module, returning the module after the last dot."""
+ __import__(name)
+ return sys.modules[name]
+
+
+class _LazyDescr(object):
+
+ def __init__(self, name):
+ self.name = name
+
+ def __get__(self, obj, tp):
+ result = self._resolve()
+ setattr(obj, self.name, result) # Invokes __set__.
+ try:
+ # This is a bit ugly, but it avoids running this again by
+ # removing this descriptor.
+ delattr(obj.__class__, self.name)
+ except AttributeError:
+ pass
+ return result
+
+
+class MovedModule(_LazyDescr):
+
+ def __init__(self, name, old, new=None):
+ super(MovedModule, self).__init__(name)
+ if PY3:
+ if new is None:
+ new = name
+ self.mod = new
+ else:
+ self.mod = old
+
+ def _resolve(self):
+ return _import_module(self.mod)
+
+ def __getattr__(self, attr):
+ _module = self._resolve()
+ value = getattr(_module, attr)
+ setattr(self, attr, value)
+ return value
+
+
+class _LazyModule(types.ModuleType):
+
+ def __init__(self, name):
+ super(_LazyModule, self).__init__(name)
+ self.__doc__ = self.__class__.__doc__
+
+ def __dir__(self):
+ attrs = ["__doc__", "__name__"]
+ attrs += [attr.name for attr in self._moved_attributes]
+ return attrs
+
+ # Subclasses should override this
+ _moved_attributes = []
+
+
+class MovedAttribute(_LazyDescr):
+
+ def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
+ super(MovedAttribute, self).__init__(name)
+ if PY3:
+ if new_mod is None:
+ new_mod = name
+ self.mod = new_mod
+ if new_attr is None:
+ if old_attr is None:
+ new_attr = name
+ else:
+ new_attr = old_attr
+ self.attr = new_attr
+ else:
+ self.mod = old_mod
+ if old_attr is None:
+ old_attr = name
+ self.attr = old_attr
+
+ def _resolve(self):
+ module = _import_module(self.mod)
+ return getattr(module, self.attr)
+
+
+class _SixMetaPathImporter(object):
+
+ """
+ A meta path importer to import six.moves and its submodules.
+
+ This class implements a PEP302 finder and loader. It should be compatible
+ with Python 2.5 and all existing versions of Python3
+ """
+
+ def __init__(self, six_module_name):
+ self.name = six_module_name
+ self.known_modules = {}
+
+ def _add_module(self, mod, *fullnames):
+ for fullname in fullnames:
+ self.known_modules[self.name + "." + fullname] = mod
+
+ def _get_module(self, fullname):
+ return self.known_modules[self.name + "." + fullname]
+
+ def find_module(self, fullname, path=None):
+ if fullname in self.known_modules:
+ return self
+ return None
+
+ def __get_module(self, fullname):
+ try:
+ return self.known_modules[fullname]
+ except KeyError:
+ raise ImportError("This loader does not know module " + fullname)
+
+ def load_module(self, fullname):
+ try:
+ # in case of a reload
+ return sys.modules[fullname]
+ except KeyError:
+ pass
+ mod = self.__get_module(fullname)
+ if isinstance(mod, MovedModule):
+ mod = mod._resolve()
+ else:
+ mod.__loader__ = self
+ sys.modules[fullname] = mod
+ return mod
+
+ def is_package(self, fullname):
+ """
+ Return true, if the named module is a package.
+
+ We need this method to get correct spec objects with
+ Python 3.4 (see PEP451)
+ """
+ return hasattr(self.__get_module(fullname), "__path__")
+
+ def get_code(self, fullname):
+ """Return None
+
+ Required, if is_package is implemented"""
+ self.__get_module(fullname) # eventually raises ImportError
+ return None
+ get_source = get_code # same as get_code
+
+_importer = _SixMetaPathImporter(__name__)
+
+
+class _MovedItems(_LazyModule):
+
+ """Lazy loading of moved objects"""
+ __path__ = [] # mark as package
+
+
+_moved_attributes = [
+ MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
+ MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
+ MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"),
+ MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
+ MovedAttribute("intern", "__builtin__", "sys"),
+ MovedAttribute("map", "itertools", "builtins", "imap", "map"),
+ MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"),
+ MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"),
+ MovedAttribute("getoutput", "commands", "subprocess"),
+ MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
+ MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"),
+ MovedAttribute("reduce", "__builtin__", "functools"),
+ MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
+ MovedAttribute("StringIO", "StringIO", "io"),
+ MovedAttribute("UserDict", "UserDict", "collections"),
+ MovedAttribute("UserList", "UserList", "collections"),
+ MovedAttribute("UserString", "UserString", "collections"),
+ MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
+ MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
+ MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),
+ MovedModule("builtins", "__builtin__"),
+ MovedModule("configparser", "ConfigParser"),
+ MovedModule("copyreg", "copy_reg"),
+ MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
+ MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
+ MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
+ MovedModule("http_cookies", "Cookie", "http.cookies"),
+ MovedModule("html_entities", "htmlentitydefs", "html.entities"),
+ MovedModule("html_parser", "HTMLParser", "html.parser"),
+ MovedModule("http_client", "httplib", "http.client"),
+ MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
+ MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"),
+ MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
+ MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
+ MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
+ MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
+ MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
+ MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
+ MovedModule("cPickle", "cPickle", "pickle"),
+ MovedModule("queue", "Queue"),
+ MovedModule("reprlib", "repr"),
+ MovedModule("socketserver", "SocketServer"),
+ MovedModule("_thread", "thread", "_thread"),
+ MovedModule("tkinter", "Tkinter"),
+ MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
+ MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
+ MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
+ MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
+ MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
+ MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"),
+ MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
+ MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
+ MovedModule("tkinter_colorchooser", "tkColorChooser",
+ "tkinter.colorchooser"),
+ MovedModule("tkinter_commondialog", "tkCommonDialog",
+ "tkinter.commondialog"),
+ MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
+ MovedModule("tkinter_font", "tkFont", "tkinter.font"),
+ MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
+ MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
+ "tkinter.simpledialog"),
+ MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"),
+ MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"),
+ MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"),
+ MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
+ MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
+ MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
+]
+# Add windows specific modules.
+if sys.platform == "win32":
+ _moved_attributes += [
+ MovedModule("winreg", "_winreg"),
+ ]
+
+for attr in _moved_attributes:
+ setattr(_MovedItems, attr.name, attr)
+ if isinstance(attr, MovedModule):
+ _importer._add_module(attr, "moves." + attr.name)
+del attr
+
+_MovedItems._moved_attributes = _moved_attributes
+
+moves = _MovedItems(__name__ + ".moves")
+_importer._add_module(moves, "moves")
+
+
+class Module_six_moves_urllib_parse(_LazyModule):
+
+ """Lazy loading of moved objects in six.moves.urllib_parse"""
+
+
+_urllib_parse_moved_attributes = [
+ MovedAttribute("ParseResult", "urlparse", "urllib.parse"),
+ MovedAttribute("SplitResult", "urlparse", "urllib.parse"),
+ MovedAttribute("parse_qs", "urlparse", "urllib.parse"),
+ MovedAttribute("parse_qsl", "urlparse", "urllib.parse"),
+ MovedAttribute("urldefrag", "urlparse", "urllib.parse"),
+ MovedAttribute("urljoin", "urlparse", "urllib.parse"),
+ MovedAttribute("urlparse", "urlparse", "urllib.parse"),
+ MovedAttribute("urlsplit", "urlparse", "urllib.parse"),
+ MovedAttribute("urlunparse", "urlparse", "urllib.parse"),
+ MovedAttribute("urlunsplit", "urlparse", "urllib.parse"),
+ MovedAttribute("quote", "urllib", "urllib.parse"),
+ MovedAttribute("quote_plus", "urllib", "urllib.parse"),
+ MovedAttribute("unquote", "urllib", "urllib.parse"),
+ MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
+ MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"),
+ MovedAttribute("urlencode", "urllib", "urllib.parse"),
+ MovedAttribute("splitquery", "urllib", "urllib.parse"),
+ MovedAttribute("splittag", "urllib", "urllib.parse"),
+ MovedAttribute("splituser", "urllib", "urllib.parse"),
+ MovedAttribute("splitvalue", "urllib", "urllib.parse"),
+ MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
+ MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
+ MovedAttribute("uses_params", "urlparse", "urllib.parse"),
+ MovedAttribute("uses_query", "urlparse", "urllib.parse"),
+ MovedAttribute("uses_relative", "urlparse", "urllib.parse"),
+]
+for attr in _urllib_parse_moved_attributes:
+ setattr(Module_six_moves_urllib_parse, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"),
+ "moves.urllib_parse", "moves.urllib.parse")
+
+
+class Module_six_moves_urllib_error(_LazyModule):
+
+ """Lazy loading of moved objects in six.moves.urllib_error"""
+
+
+_urllib_error_moved_attributes = [
+ MovedAttribute("URLError", "urllib2", "urllib.error"),
+ MovedAttribute("HTTPError", "urllib2", "urllib.error"),
+ MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
+]
+for attr in _urllib_error_moved_attributes:
+ setattr(Module_six_moves_urllib_error, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"),
+ "moves.urllib_error", "moves.urllib.error")
+
+
+class Module_six_moves_urllib_request(_LazyModule):
+
+ """Lazy loading of moved objects in six.moves.urllib_request"""
+
+
+_urllib_request_moved_attributes = [
+ MovedAttribute("urlopen", "urllib2", "urllib.request"),
+ MovedAttribute("install_opener", "urllib2", "urllib.request"),
+ MovedAttribute("build_opener", "urllib2", "urllib.request"),
+ MovedAttribute("pathname2url", "urllib", "urllib.request"),
+ MovedAttribute("url2pathname", "urllib", "urllib.request"),
+ MovedAttribute("getproxies", "urllib", "urllib.request"),
+ MovedAttribute("Request", "urllib2", "urllib.request"),
+ MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
+ MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
+ MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
+ MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
+ MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
+ MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
+ MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
+ MovedAttribute("FileHandler", "urllib2", "urllib.request"),
+ MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
+ MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
+ MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
+ MovedAttribute("urlretrieve", "urllib", "urllib.request"),
+ MovedAttribute("urlcleanup", "urllib", "urllib.request"),
+ MovedAttribute("URLopener", "urllib", "urllib.request"),
+ MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
+ MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
+ MovedAttribute("parse_http_list", "urllib2", "urllib.request"),
+ MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"),
+]
+for attr in _urllib_request_moved_attributes:
+ setattr(Module_six_moves_urllib_request, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"),
+ "moves.urllib_request", "moves.urllib.request")
+
+
+class Module_six_moves_urllib_response(_LazyModule):
+
+ """Lazy loading of moved objects in six.moves.urllib_response"""
+
+
+_urllib_response_moved_attributes = [
+ MovedAttribute("addbase", "urllib", "urllib.response"),
+ MovedAttribute("addclosehook", "urllib", "urllib.response"),
+ MovedAttribute("addinfo", "urllib", "urllib.response"),
+ MovedAttribute("addinfourl", "urllib", "urllib.response"),
+]
+for attr in _urllib_response_moved_attributes:
+ setattr(Module_six_moves_urllib_response, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"),
+ "moves.urllib_response", "moves.urllib.response")
+
+
+class Module_six_moves_urllib_robotparser(_LazyModule):
+
+ """Lazy loading of moved objects in six.moves.urllib_robotparser"""
+
+
+_urllib_robotparser_moved_attributes = [
+ MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
+]
+for attr in _urllib_robotparser_moved_attributes:
+ setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"),
+ "moves.urllib_robotparser", "moves.urllib.robotparser")
+
+
+class Module_six_moves_urllib(types.ModuleType):
+
+ """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
+ __path__ = [] # mark as package
+ parse = _importer._get_module("moves.urllib_parse")
+ error = _importer._get_module("moves.urllib_error")
+ request = _importer._get_module("moves.urllib_request")
+ response = _importer._get_module("moves.urllib_response")
+ robotparser = _importer._get_module("moves.urllib_robotparser")
+
+ def __dir__(self):
+ return ['parse', 'error', 'request', 'response', 'robotparser']
+
+_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"),
+ "moves.urllib")
+
+
+def add_move(move):
+ """Add an item to six.moves."""
+ setattr(_MovedItems, move.name, move)
+
+
+def remove_move(name):
+ """Remove item from six.moves."""
+ try:
+ delattr(_MovedItems, name)
+ except AttributeError:
+ try:
+ del moves.__dict__[name]
+ except KeyError:
+ raise AttributeError("no such move, %r" % (name,))
+
+
+if PY3:
+ _meth_func = "__func__"
+ _meth_self = "__self__"
+
+ _func_closure = "__closure__"
+ _func_code = "__code__"
+ _func_defaults = "__defaults__"
+ _func_globals = "__globals__"
+else:
+ _meth_func = "im_func"
+ _meth_self = "im_self"
+
+ _func_closure = "func_closure"
+ _func_code = "func_code"
+ _func_defaults = "func_defaults"
+ _func_globals = "func_globals"
+
+
+try:
+ advance_iterator = next
+except NameError:
+ def advance_iterator(it):
+ return it.next()
+next = advance_iterator
+
+
+try:
+ callable = callable
+except NameError:
+ def callable(obj):
+ return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
+
+
+if PY3:
+ def get_unbound_function(unbound):
+ return unbound
+
+ create_bound_method = types.MethodType
+
+ def create_unbound_method(func, cls):
+ return func
+
+ Iterator = object
+else:
+ def get_unbound_function(unbound):
+ return unbound.im_func
+
+ def create_bound_method(func, obj):
+ return types.MethodType(func, obj, obj.__class__)
+
+ def create_unbound_method(func, cls):
+ return types.MethodType(func, None, cls)
+
+ class Iterator(object):
+
+ def next(self):
+ return type(self).__next__(self)
+
+ callable = callable
+_add_doc(get_unbound_function,
+ """Get the function out of a possibly unbound function""")
+
+
+get_method_function = operator.attrgetter(_meth_func)
+get_method_self = operator.attrgetter(_meth_self)
+get_function_closure = operator.attrgetter(_func_closure)
+get_function_code = operator.attrgetter(_func_code)
+get_function_defaults = operator.attrgetter(_func_defaults)
+get_function_globals = operator.attrgetter(_func_globals)
+
+
+if PY3:
+ def iterkeys(d, **kw):
+ return iter(d.keys(**kw))
+
+ def itervalues(d, **kw):
+ return iter(d.values(**kw))
+
+ def iteritems(d, **kw):
+ return iter(d.items(**kw))
+
+ def iterlists(d, **kw):
+ return iter(d.lists(**kw))
+
+ viewkeys = operator.methodcaller("keys")
+
+ viewvalues = operator.methodcaller("values")
+
+ viewitems = operator.methodcaller("items")
+else:
+ def iterkeys(d, **kw):
+ return d.iterkeys(**kw)
+
+ def itervalues(d, **kw):
+ return d.itervalues(**kw)
+
+ def iteritems(d, **kw):
+ return d.iteritems(**kw)
+
+ def iterlists(d, **kw):
+ return d.iterlists(**kw)
+
+ viewkeys = operator.methodcaller("viewkeys")
+
+ viewvalues = operator.methodcaller("viewvalues")
+
+ viewitems = operator.methodcaller("viewitems")
+
+_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
+_add_doc(itervalues, "Return an iterator over the values of a dictionary.")
+_add_doc(iteritems,
+ "Return an iterator over the (key, value) pairs of a dictionary.")
+_add_doc(iterlists,
+ "Return an iterator over the (key, [values]) pairs of a dictionary.")
+
+
+if PY3:
+ def b(s):
+ return s.encode("latin-1")
+
+ def u(s, encoding=None):
+ return str(s)
+ unichr = chr
+ import struct
+ int2byte = struct.Struct(">B").pack
+ del struct
+ byte2int = operator.itemgetter(0)
+ indexbytes = operator.getitem
+ iterbytes = iter
+ import io
+ StringIO = io.StringIO
+ BytesIO = io.BytesIO
+ _assertCountEqual = "assertCountEqual"
+ if sys.version_info[1] <= 1:
+ _assertRaisesRegex = "assertRaisesRegexp"
+ _assertRegex = "assertRegexpMatches"
+ else:
+ _assertRaisesRegex = "assertRaisesRegex"
+ _assertRegex = "assertRegex"
+else:
+ def b(s):
+ return s
+ # Workaround for standalone backslash
+
+ def u(s, encoding="unicode_escape"):
+
+ if not isinstance(s, basestring):
+ s = unicode(s, encoding)
+
+ s = s.replace(r'\\', r'\\\\')
+ if isinstance(s, unicode):
+ return s
+ else:
+ return unicode(s, encoding)
+ unichr = unichr
+ int2byte = chr
+
+ def byte2int(bs):
+ return ord(bs[0])
+
+ def indexbytes(buf, i):
+ return ord(buf[i])
+ iterbytes = functools.partial(itertools.imap, ord)
+ import StringIO
+ StringIO = BytesIO = StringIO.StringIO
+ _assertCountEqual = "assertItemsEqual"
+ _assertRaisesRegex = "assertRaisesRegexp"
+ _assertRegex = "assertRegexpMatches"
+_add_doc(b, """Byte literal""")
+_add_doc(u, """Text literal""")
+
+
+def assertCountEqual(self, *args, **kwargs):
+ return getattr(self, _assertCountEqual)(*args, **kwargs)
+
+
+def assertRaisesRegex(self, *args, **kwargs):
+ return getattr(self, _assertRaisesRegex)(*args, **kwargs)
+
+
+def assertRegex(self, *args, **kwargs):
+ return getattr(self, _assertRegex)(*args, **kwargs)
+
+
+if PY3:
+ exec_ = getattr(moves.builtins, "exec")
+
+ def reraise(tp, value, tb=None):
+ try:
+ if value is None:
+ value = tp()
+ if value.__traceback__ is not tb:
+ raise value.with_traceback(tb)
+ raise value
+ finally:
+ value = None
+ tb = None
+
+else:
+ def exec_(_code_, _globs_=None, _locs_=None):
+ """Execute code in a namespace."""
+ if _globs_ is None:
+ frame = sys._getframe(1)
+ _globs_ = frame.f_globals
+ if _locs_ is None:
+ _locs_ = frame.f_locals
+ del frame
+ elif _locs_ is None:
+ _locs_ = _globs_
+ exec("""exec _code_ in _globs_, _locs_""")
+
+ exec_("""def reraise(tp, value, tb=None):
+ try:
+ raise tp, value, tb
+ finally:
+ tb = None
+""")
+
+
+if sys.version_info[:2] == (3, 2):
+ exec_("""def raise_from(value, from_value):
+ try:
+ if from_value is None:
+ raise value
+ raise value from from_value
+ finally:
+ value = None
+""")
+elif sys.version_info[:2] > (3, 2):
+ exec_("""def raise_from(value, from_value):
+ try:
+ raise value from from_value
+ finally:
+ value = None
+""")
+else:
+ def raise_from(value, from_value):
+ raise value
+
+
+print_ = getattr(moves.builtins, "print", None)
+if print_ is None:
+ def print_(*args, **kwargs):
+ """The new-style print function for Python 2.4 and 2.5."""
+ fp = kwargs.pop("file", sys.stdout)
+ if fp is None:
+ return
+
+ def write(data):
+ if not isinstance(data, basestring):
+ data = str(data)
+ # If the file has an encoding, encode unicode with it.
+ if (isinstance(fp, file) and
+ isinstance(data, unicode) and
+ fp.encoding is not None):
+ errors = getattr(fp, "errors", None)
+ if errors is None:
+ errors = "strict"
+ data = data.encode(fp.encoding, errors)
+ fp.write(data)
+ want_unicode = False
+ sep = kwargs.pop("sep", None)
+ if sep is not None:
+ if isinstance(sep, unicode):
+ want_unicode = True
+ elif not isinstance(sep, str):
+ raise TypeError("sep must be None or a string")
+ end = kwargs.pop("end", None)
+ if end is not None:
+ if isinstance(end, unicode):
+ want_unicode = True
+ elif not isinstance(end, str):
+ raise TypeError("end must be None or a string")
+ if kwargs:
+ raise TypeError("invalid keyword arguments to print()")
+ if not want_unicode:
+ for arg in args:
+ if isinstance(arg, unicode):
+ want_unicode = True
+ break
+ if want_unicode:
+ newline = unicode("\n")
+ space = unicode(" ")
+ else:
+ newline = "\n"
+ space = " "
+ if sep is None:
+ sep = space
+ if end is None:
+ end = newline
+ for i, arg in enumerate(args):
+ if i:
+ write(sep)
+ write(arg)
+ write(end)
+if sys.version_info[:2] < (3, 3):
+ _print = print_
+
+ def print_(*args, **kwargs):
+ fp = kwargs.get("file", sys.stdout)
+ flush = kwargs.pop("flush", False)
+ _print(*args, **kwargs)
+ if flush and fp is not None:
+ fp.flush()
+
+_add_doc(reraise, """Reraise an exception.""")
+
+if sys.version_info[0:2] < (3, 4):
+ def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
+ updated=functools.WRAPPER_UPDATES):
+ def wrapper(f):
+ f = functools.wraps(wrapped, assigned, updated)(f)
+ f.__wrapped__ = wrapped
+ return f
+ return wrapper
+else:
+ wraps = functools.wraps
+
+
+def with_metaclass(meta, *bases):
+ """Create a base class with a metaclass."""
+ # This requires a bit of explanation: the basic idea is to make a dummy
+ # metaclass for one level of class instantiation that replaces itself with
+ # the actual metaclass.
+ class metaclass(type):
+
+ def __new__(cls, name, this_bases, d):
+ return meta(name, bases, d)
+
+ @classmethod
+ def __prepare__(cls, name, this_bases):
+ return meta.__prepare__(name, bases)
+ return type.__new__(metaclass, 'temporary_class', (), {})
+
+
+def add_metaclass(metaclass):
+ """Class decorator for creating a class with a metaclass."""
+ def wrapper(cls):
+ orig_vars = cls.__dict__.copy()
+ slots = orig_vars.get('__slots__')
+ if slots is not None:
+ if isinstance(slots, str):
+ slots = [slots]
+ for slots_var in slots:
+ orig_vars.pop(slots_var)
+ orig_vars.pop('__dict__', None)
+ orig_vars.pop('__weakref__', None)
+ if hasattr(cls, '__qualname__'):
+ orig_vars['__qualname__'] = cls.__qualname__
+ return metaclass(cls.__name__, cls.__bases__, orig_vars)
+ return wrapper
+
+
+def ensure_binary(s, encoding='utf-8', errors='strict'):
+ """Coerce **s** to six.binary_type.
+
+ For Python 2:
+ - `unicode` -> encoded to `str`
+ - `str` -> `str`
+
+ For Python 3:
+ - `str` -> encoded to `bytes`
+ - `bytes` -> `bytes`
+ """
+ if isinstance(s, text_type):
+ return s.encode(encoding, errors)
+ elif isinstance(s, binary_type):
+ return s
+ else:
+ raise TypeError("not expecting type '%s'" % type(s))
+
+
+def ensure_str(s, encoding='utf-8', errors='strict'):
+ """Coerce *s* to `str`.
+
+ For Python 2:
+ - `unicode` -> encoded to `str`
+ - `str` -> `str`
+
+ For Python 3:
+ - `str` -> `str`
+ - `bytes` -> decoded to `str`
+ """
+ if not isinstance(s, (text_type, binary_type)):
+ raise TypeError("not expecting type '%s'" % type(s))
+ if PY2 and isinstance(s, text_type):
+ s = s.encode(encoding, errors)
+ elif PY3 and isinstance(s, binary_type):
+ s = s.decode(encoding, errors)
+ return s
+
+
+def ensure_text(s, encoding='utf-8', errors='strict'):
+ """Coerce *s* to six.text_type.
+
+ For Python 2:
+ - `unicode` -> `unicode`
+ - `str` -> `unicode`
+
+ For Python 3:
+ - `str` -> `str`
+ - `bytes` -> decoded to `str`
+ """
+ if isinstance(s, binary_type):
+ return s.decode(encoding, errors)
+ elif isinstance(s, text_type):
+ return s
+ else:
+ raise TypeError("not expecting type '%s'" % type(s))
+
+
+
+def python_2_unicode_compatible(klass):
+ """
+ A decorator that defines __unicode__ and __str__ methods under Python 2.
+ Under Python 3 it does nothing.
+
+ To support Python 2 and 3 with a single code base, define a __str__ method
+ returning text and apply this decorator to the class.
+ """
+ if PY2:
+ if '__str__' not in klass.__dict__:
+ raise ValueError("@python_2_unicode_compatible cannot be applied "
+ "to %s because it doesn't define __str__()." %
+ klass.__name__)
+ klass.__unicode__ = klass.__str__
+ klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
+ return klass
+
+
+# Complete the moves implementation.
+# This code is at the end of this module to speed up module loading.
+# Turn this module into a package.
+__path__ = [] # required for PEP 302 and PEP 451
+__package__ = __name__ # see PEP 366 @ReservedAssignment
+if globals().get("__spec__") is not None:
+ __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable
+# Remove other six meta path importers, since they cause problems. This can
+# happen if six is removed from sys.modules and then reloaded. (Setuptools does
+# this for some reason.)
+if sys.meta_path:
+ for i, importer in enumerate(sys.meta_path):
+ # Here's some real nastiness: Another "instance" of the six module might
+ # be floating around. Therefore, we can't use isinstance() to check for
+ # the six meta path importer, since the other six instance will have
+ # inserted an importer with different class.
+ if (type(importer).__name__ == "_SixMetaPathImporter" and
+ importer.name == __name__):
+ del sys.meta_path[i]
+ break
+ del i, importer
+# Finally, add the importer to the meta path import hook.
+sys.meta_path.append(_importer)
diff --git a/2023/shelves/shelf_Nexus_Animation.mel b/2023/shelves/shelf_Nexus_Animation.mel
index c4b9d9f..08480b7 100644
--- a/2023/shelves/shelf_Nexus_Animation.mel
+++ b/2023/shelves/shelf_Nexus_Animation.mel
@@ -144,5 +144,40 @@ global proc shelf_Nexus_Animation () {
-commandRepeatable 1
-flat 1
;
+ shelfButton
+ -enableCommandRepeat 1
+ -flexibleWidthType 3
+ -flexibleWidthValue 32
+ -enable 1
+ -width 35
+ -height 34
+ -manage 1
+ -visible 1
+ -preventOverride 0
+ -annotation "Studio Library - Animation library for Maya"
+ -enableBackground 0
+ -backgroundColor 0 0 0
+ -highlightColor 0.321569 0.521569 0.65098
+ -align "center"
+ -label "StudioLib"
+ -labelOffset 0
+ -rotation 0
+ -flipX 0
+ -flipY 0
+ -useAlpha 1
+ -font "plainLabelFont"
+ -imageOverlayLabel "StudioLib"
+ -overlayLabelColor 0.8 0.8 0.8
+ -overlayLabelBackColor 0 0 0 0.5
+ -image "studiolibrary.png"
+ -image1 "studiolibrary.png"
+ -style "iconOnly"
+ -marginWidth 0
+ -marginHeight 1
+ -command "import sys\nimport os\nstudiolibrary_path = r'h:\\Workspace\\Raw\\Tools\\Plugins\\Maya\\2023\\scripts\\animation_tools\\studiolibrary'\nif studiolibrary_path not in sys.path:\n sys.path.insert(0, studiolibrary_path)\nimport studiolibrary\nstudiolibrary.main()"
+ -sourceType "python"
+ -commandRepeatable 1
+ -flat 1
+ ;
}