diff --git a/.gitignore b/.gitignore index 622d55fb883..14fce6ba0b0 100644 --- a/.gitignore +++ b/.gitignore @@ -119,3 +119,4 @@ tools/dev_* ######## /openpype/addons/* !/openpype/addons/README.md +test.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index eec388924ef..97a225db232 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,6 +7,6 @@ repos: - id: trailing-whitespace - id: end-of-file-fixer - id: check-yaml - - id: check-added-large-files + # - id: check-added-large-files - id: no-commit-to-branch args: [ '--pattern', '^(?!((release|enhancement|feature|bugfix|documentation|tests|local|chore)\/[a-zA-Z0-9\-_]+)$).*' ] diff --git a/openpype/hosts/equalizer/__init__.py b/openpype/hosts/equalizer/__init__.py new file mode 100644 index 00000000000..aafe1580be8 --- /dev/null +++ b/openpype/hosts/equalizer/__init__.py @@ -0,0 +1,9 @@ +from .addon import ( + EqualizerAddon, + EQUALIZER_HOST_DIR, +) + +__all__ = [ + "EqualizerAddon", + "EQUALIZER_HOST_DIR", +] diff --git a/openpype/hosts/equalizer/addon.py b/openpype/hosts/equalizer/addon.py new file mode 100644 index 00000000000..571b374a708 --- /dev/null +++ b/openpype/hosts/equalizer/addon.py @@ -0,0 +1,40 @@ +import os +from openpype.modules import OpenPypeModule, IHostAddon + +EQUALIZER_HOST_DIR = os.path.dirname(os.path.abspath(__file__)) + + +class EqualizerAddon(OpenPypeModule, IHostAddon): + name = "equalizer" + host_name = "equalizer" + heartbeat = 500 + + def initialize(self, module_settings): + self.heartbeat = module_settings.get("heartbeat_interval", 500) + self.enabled = True + + def add_implementation_envs(self, env, _app): + # 3dEqualizer utilize TDE4_ROOT for its root directory + # and PYTHON_CUSTOM_SCRIPTS_3DE4 as a colon separated list of + # directories to look for additional python scripts. + # (Windows: list is separated by semicolons). + # Ad + + startup_path = os.path.join(EQUALIZER_HOST_DIR, "startup") + if "PYTHON_CUSTOM_SCRIPTS_3DE4" in env: + startup_path = os.path.join( + env["PYTHON_CUSTOM_SCRIPTS_3DE4"], + startup_path) + + env["PYTHON_CUSTOM_SCRIPTS_3DE4"] = startup_path + env["AYON_TDE4_HEARTBEAT_INTERVAL"] = str(self.heartbeat) + + def get_launch_hook_paths(self, app): + if app.host_name != self.host_name: + return [] + return [ + os.path.join(EQUALIZER_HOST_DIR, "hooks") + ] + + def get_workfile_extensions(self): + return [".3de"] diff --git a/openpype/hosts/equalizer/api/__init__.py b/openpype/hosts/equalizer/api/__init__.py new file mode 100644 index 00000000000..992187d4637 --- /dev/null +++ b/openpype/hosts/equalizer/api/__init__.py @@ -0,0 +1,11 @@ +from .host import EqualizerHost +from .plugin import EqualizerCreator, ExtractScriptBase +from .pipeline import Container, maintained_model_selection + +__all__ = [ + "EqualizerHost", + "EqualizerCreator", + "Container", + "ExtractScriptBase", + "maintained_model_selection", +] diff --git a/openpype/hosts/equalizer/api/host.py b/openpype/hosts/equalizer/api/host.py new file mode 100644 index 00000000000..ee82470dce5 --- /dev/null +++ b/openpype/hosts/equalizer/api/host.py @@ -0,0 +1,225 @@ +""" +3dequalizer host implementation. + +note: + 3dequalizer Release 5 uses Python 2.7 +""" + +import json +import os +import re + +from attr import asdict +from attr.exceptions import NotAnAttrsClassError +import pyblish.api +import tde4 # noqa: F401 +from qtpy import QtCore, QtWidgets + +from openpype.host import HostBase, ILoadHost, IPublishHost, IWorkfileHost +from openpype.hosts.equalizer import EQUALIZER_HOST_DIR +from openpype.pipeline import ( + register_creator_plugin_path, + register_loader_plugin_path, + legacy_io +) + +CONTEXT_REGEX = re.compile( + r"AYON_CONTEXT::(?P.*?)::AYON_CONTEXT_END", + re.DOTALL) +PLUGINS_DIR = os.path.join(EQUALIZER_HOST_DIR, "plugins") +PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") +LOAD_PATH = os.path.join(PLUGINS_DIR, "load") +CREATE_PATH = os.path.join(PLUGINS_DIR, "create") +INVENTORY_PATH = os.path.join(PLUGINS_DIR, "inventory") + + +class EqualizerHost(HostBase, IWorkfileHost, ILoadHost, IPublishHost): + name = "equalizer" + _instance = None + + def __new__(cls): + if not hasattr(cls, "_instance") or not cls._instance: + cls._instance = super(EqualizerHost, cls).__new__(cls) + return cls._instance + + def __init__(self): + self._qapp = None + super(EqualizerHost, self).__init__() + + def workfile_has_unsaved_changes(self): + """Return the state of the current workfile. + + 3DEqualizer returns state as 1 or zero, so we need to invert it. + + Returns: + bool: True if the current workfile has unsaved changes. + """ + return not bool(tde4.isProjectUpToDate()) + + def get_workfile_extensions(self): + return [".3de"] + + def save_workfile(self, filepath=None): + result = tde4.saveProject(filepath) + if not bool(result): + raise RuntimeError("Failed to save workfile %s."%filepath) + + return filepath + + def open_workfile(self, filepath): + result = tde4.loadProject(filepath) + if not bool(result): + raise RuntimeError("Failed to open workfile %s."%filepath) + + return filepath + + def get_current_workfile(self): + current_filepath = tde4.getProjectPath() + if not current_filepath: + return None + + return current_filepath + + + def get_overscan(self): + context = self.get_context_data() + if "overscan" in context: + return context.get("overscan", {}) + return {} + + def set_overscan(self, overscan_width, overscan_height): + context_data = self.get_context_data() + overscan = self.get_overscan() + if not overscan: + overscan = { + "width": overscan_width, + "height": overscan_height + } + else: + overscan["width"] = overscan_width + overscan["height"] = overscan_height + + context_data["overscan"] = overscan + self.update_context_data(context_data, changes={}) + + def get_containers(self): + context = self.get_context_data() + if context: + return context.get("containers", []) + return [] + + def add_container(self, container): + context_data = self.get_context_data() + containers = self.get_containers() + + for _container in containers: + if _container["name"] == container.name and _container["namespace"] == container.namespace: # noqa: E501 + containers.remove(_container) + break + + try: + containers.append(asdict(container)) + except NotAnAttrsClassError: + print("not an attrs class") + containers.append(container) + + context_data["containers"] = containers + self.update_context_data(context_data, changes={}) + + def get_context_data(self): + """Get context data from the current workfile. + + 3Dequalizer doesn't have any custom node or other + place to store metadata, so we store context data in + the project notes encoded as JSON and wrapped in a + special guard string `AYON_CONTEXT::...::AYON_CONTEXT_END`. + + Returns: + dict: Context data. + """ + + # sourcery skip: use-named-expression + m = re.search(CONTEXT_REGEX, tde4.getProjectNotes()) + try: + context = json.loads(m.groupdict()["context"]) if m else {} + except ValueError: + self.log.debug("context data is not valid json") + context = {} + + return context + + def update_context_data(self, data, changes): + """Update context data in the current workfile. + + Serialize context data as json and store it in the + project notes. If the context data is not found, create + a placeholder there. See `get_context_data` for more info. + + Args: + data (dict): Context data. + changes (dict): Changes to the context data. + + Raises: + RuntimeError: If the context data is not found. + """ + m = re.search(CONTEXT_REGEX, tde4.getProjectNotes()) + if not m: + # context data not found, create empty placeholder + tde4.setProjectNotes("AYON_CONTEXT::::AYON_CONTEXT_END") + + original_data = self.get_context_data() + + updated_data = original_data.copy() + updated_data.update(data) + update_str = json.dumps(updated_data or {}, indent=4) + + tde4.setProjectNotes( + re.sub( + CONTEXT_REGEX, + "AYON_CONTEXT::%s::AYON_CONTEXT_END"%update_str, + tde4.getProjectNotes() + ) + ) + tde4.updateGUI() + + def install(self): + if not QtCore.QCoreApplication.instance(): + app = QtWidgets.QApplication([]) + self._qapp = app + self._qapp.setQuitOnLastWindowClosed(False) + + pyblish.api.register_plugin_path(PUBLISH_PATH) + pyblish.api.register_host("equalizer") + + register_loader_plugin_path(LOAD_PATH) + register_creator_plugin_path(CREATE_PATH) + + # heartbeat_interval = os.getenv("AYON_TDE4_HEARTBEAT_INTERVAL") or 500 + # tde4.setTimerCallbackFunction( + # "EqualizerHost._timer", int(heartbeat_interval)) + + + def _set_project(self): + workdir = legacy_io.Session["AVALON_WORKDIR"] + if os.path.exists(workdir): + projects = [] + workdir_files = os.listdir(workdir) + if len(workdir_files) > 0: + for f in os.listdir(workdir): + if legacy_io.Session["AVALON_ASSET"] in f: + projects.append(f) + projects.sort() + tde4.loadProject(os.path.join(workdir, projects[-1])) + + + @staticmethod + def _timer(): + QtWidgets.QApplication.instance().processEvents( + QtCore.QEventLoop.AllEvents) + + @classmethod + def get_host(cls): + return cls._instance + + def get_main_window(self): + return self._qapp.activeWindow() diff --git a/openpype/hosts/equalizer/api/pipeline.py b/openpype/hosts/equalizer/api/pipeline.py new file mode 100644 index 00000000000..29ae5df9682 --- /dev/null +++ b/openpype/hosts/equalizer/api/pipeline.py @@ -0,0 +1,38 @@ + +import attr +from openpype.pipeline import AVALON_CONTAINER_ID +import contextlib +import tde4 + +@attr.s +class Container(object): + name = attr.ib(default=None) + id = attr.ib(init=False, default=AVALON_CONTAINER_ID) + namespace = attr.ib(default="") + loader = attr.ib(default=None) + representation = attr.ib(default=None) + + +@contextlib.contextmanager +def maintained_model_selection(): + """Maintain model selection during context.""" + + point_groups = tde4.getPGroupList() + point_group = next( + ( + pg for pg in point_groups + if tde4.getPGroupType(pg) == "CAMERA" + ), None + ) + selected_models = tde4.get3DModelList(point_group, 1)\ + if point_group else [] + try: + yield + finally: + if point_group: + # 3 restore model selection + for model in tde4.get3DModelList(point_group, 0): + if model in selected_models: + tde4.set3DModelSelectionFlag(point_group, model, 1) + else: + tde4.set3DModelSelectionFlag(point_group, model, 0) diff --git a/openpype/hosts/equalizer/api/plugin.py b/openpype/hosts/equalizer/api/plugin.py new file mode 100644 index 00000000000..b6155fce01f --- /dev/null +++ b/openpype/hosts/equalizer/api/plugin.py @@ -0,0 +1,162 @@ +"""Base plugin class for 3DEqualizer. + +note: + 3dequalizer 7.1v2 uses Python 3.7.9 + +""" +from abc import ABCMeta +import six +# from typing import Dict, List + +from openpype.hosts.equalizer.api import EqualizerHost +from openpype.lib import BoolDef, EnumDef, NumberDef +from openpype.pipeline import ( + CreatedInstance, + Creator, + OptionalPyblishPluginMixin, +) + +@six.add_metaclass(ABCMeta) +class EqualizerCreator(Creator): + + @property + def host(self): + """Return the host application.""" + # We need to cast the host to EqualizerHost, because the Creator + # class is not aware of the host application. + return super(EqualizerCreator, self).host + + def create(self, subset_name, instance_data, pre_create_data): + """Create a subset in the host application. + + Args: + subset_name (str): Name of the subset to create. + instance_data (dict): Data of the instance to create. + pre_create_data (dict): Data from the pre-create step. + + Returns: + openpype.pipeline.CreatedInstance: Created instance. + """ + self.log.debug("EqualizerCreator.create") + instance = CreatedInstance( + self.family, + subset_name, + instance_data, + self) + self._add_instance_to_context(instance) + return instance + + def collect_instances(self): + """Collect instances from the host application. + + Returns: + list[openpype.pipeline.CreatedInstance]: List of instances. + """ + for instance_data in self.host.get_context_data().get( + "publish_instances", []): + created_instance = CreatedInstance.from_existing( + instance_data, self + ) + self._add_instance_to_context(created_instance) + + def update_instances(self, update_list): + + # if not update_list: + # return + context = self.host.get_context_data() + if not context.get("publish_instances"): + context["publish_instances"] = [] + + instances_by_id = {} + for instance in context.get("publish_instances"): + # sourcery skip: use-named-expression + instance_id = instance.get("instance_id") + if instance_id: + instances_by_id[instance_id] = instance + + for instance, changes in update_list: + new_instance_data = changes.new_value + instance_data = instances_by_id.get(instance.id) + # instance doesn't exist, append everything + if instance_data is None: + context["publish_instances"].append(new_instance_data) + continue + + # update only changed values on instance + for key in set(instance_data) - set(new_instance_data): + instance_data.pop(key) + instance_data.update(new_instance_data) + + self.host.update_context_data(context, changes=update_list) + + def remove_instances(self, instances): + # context = self.host.get_context_data() + # if not context.get("publish_instances"): + # context["publish_instances"] = [] + + # ids_to_remove = [ + # instance.get("instance_id") + # for instance in instances + # ] + # for instance in context.get("publish_instances"): + # if instance.get("instance_id") in ids_to_remove: + # context["publish_instances"].remove(instance) + + # self.host.update_context_data(context, changes={}) + for instance in instances: + self._remove_instance_from_context(instance) + + +class ExtractScriptBase(OptionalPyblishPluginMixin): + """Base class for extract script plugins.""" + + hide_reference_frame = False + export_uv_textures = False + overscan_percent_width = 100 + overscan_percent_height = 100 + units = "mm" + + @classmethod + def apply_settings(cls, project_settings, system_settings): + settings = project_settings["equalizer"]["publish"][ + "ExtractMatchmoveScriptMaya"] # noqa + + cls.hide_reference_frame = settings.get( + "hide_reference_frame", cls.hide_reference_frame) + cls.export_uv_textures = settings.get( + "export_uv_textures", cls.export_uv_textures) + cls.overscan_percent_width = settings.get( + "overscan_percent_width", cls.overscan_percent_width) + cls.overscan_percent_height = settings.get( + "overscan_percent_height", cls.overscan_percent_height) + cls.units = settings.get("units", cls.units) + + @classmethod + def get_attribute_defs(cls): + defs = super(ExtractScriptBase, cls).get_attribute_defs() + + defs.extend([ + BoolDef("hide_reference_frame", + label="Hide Reference Frame", + default=cls.hide_reference_frame), + BoolDef("export_uv_textures", + label="Export UV Textures", + default=cls.export_uv_textures), + NumberDef("overscan_percent_width", + label="Overscan Width %", + default=cls.overscan_percent_width, + decimals=0, + minimum=1, + maximum=1000), + NumberDef("overscan_percent_height", + label="Overscan Height %", + default=cls.overscan_percent_height, + decimals=0, + minimum=1, + maximum=1000), + EnumDef("units", + ["mm", "cm", "m", "in", "ft", "yd"], + default=cls.units, + label="Units"), + ]) + return defs diff --git a/openpype/hosts/equalizer/hooks/pre_pyside2_install.py b/openpype/hosts/equalizer/hooks/pre_pyside2_install.py new file mode 100644 index 00000000000..81ef4d1a466 --- /dev/null +++ b/openpype/hosts/equalizer/hooks/pre_pyside2_install.py @@ -0,0 +1,196 @@ +"""Install PySide2 python module to 3dequalizer's python. + +If 3dequalizer doesn't have PySide2 module installed, it will try to install +it. + +Note: + This needs to be changed in the future so the UI is decoupled from the + host application. + +""" + +import contextlib +import os +import subprocess +from pathlib import Path +from platform import system + +from openpype.lib.applications import LaunchTypes, PreLaunchHook + + +class InstallPySide2(PreLaunchHook): + """Install Qt binding to 3dequalizer's python packages.""" + + app_groups = {"3dequalizer", "sdv_3dequalizer"} + launch_types = {LaunchTypes.local} + + def execute(self): + try: + self._execute() + except Exception: + self.log.warning(( + f"Processing of {self.__class__.__name__} " + "crashed."), exc_info=True + ) + + def _execute(self): + platform = system().lower() + executable = Path(self.launch_context.executable.executable_path) + expected_executable = "3de4" + if platform == "windows": + expected_executable += ".exe" + + if not self.launch_context.env.get("TDE4_HOME"): + if executable.name.lower() != expected_executable: + self.log.warning(( + f"Executable {executable.as_posix()} does not lead " + f"to {expected_executable} file. " + "Can't determine 3dequalizer's python to " + f"check/install PySide2. {executable.name}" + )) + return + python_dir = executable.parent.parent / "sys_data" / "py37_inst" + else: + python_dir = Path(self.launch_context.env["TDE4_HOME"]) / "sys_data" / "py37_inst" # noqa: E501 + + if platform == "windows": + python_executable = python_dir / "python.exe" + else: + python_executable = python_dir / "python" + # Check for python with enabled 'pymalloc' + if not python_executable.exists(): + python_executable = python_dir / "pythonm" + + if not python_executable.exists(): + self.log.warning( + "Couldn't find python executable " + f"for 3de4 {python_executable.as_posix()}" + ) + + return + + # Check if PySide2 is installed and skip if yes + if self.is_pyside_installed(python_executable): + self.log.debug("3Dequalizer has already installed PySide2.") + return + + # Install PySide2 in 3de4's python + if platform == "windows": + result = self.install_pyside_windows(python_executable) + else: + result = self.install_pyside(python_executable) + + if result: + self.log.info("Successfully installed PySide2 module to 3de4.") + else: + self.log.warning("Failed to install PySide2 module to 3de4.") + + def install_pyside_windows(self, python_executable: Path): + """Install PySide2 python module to 3de4's python. + + Installation requires administration rights that's why it is required + to use "pywin32" module which can execute command's and ask for + administration rights. + + Note: + This is asking for administrative right always, no matter if + it is actually needed or not. Unfortunately getting + correct permissions for directory on Windows isn't that trivial. + You can either use `win32security` module or run `icacls` command + in subprocess and parse its output. + + """ + try: + import pywintypes + import win32con + import win32event + import win32process + from win32comext.shell import shellcon + from win32comext.shell.shell import ShellExecuteEx + except Exception: + self.log.warning("Couldn't import 'pywin32' modules") + return + + with contextlib.suppress(pywintypes.error): + # Parameters + # - use "-m pip" as module pip to install PySide2 and argument + # "--ignore-installed" is to force install module to 3de4's + # site-packages and make sure it is binary compatible + parameters = "-m pip install --ignore-installed PySide2" + + # Execute command and ask for administrator's rights + process_info = ShellExecuteEx( + nShow=win32con.SW_SHOWNORMAL, + fMask=shellcon.SEE_MASK_NOCLOSEPROCESS, + lpVerb="runas", + lpFile=python_executable.as_posix(), + lpParameters=parameters, + lpDirectory=python_executable.parent.as_posix() + ) + process_handle = process_info["hProcess"] + win32event.WaitForSingleObject( + process_handle, win32event.INFINITE) + return_code = win32process.GetExitCodeProcess(process_handle) + return return_code == 0 + + def install_pyside(self, python_executable: Path): + """Install PySide2 python module to 3de4's python.""" + + args = [ + python_executable.as_posix(), + "-m", + "pip", + "install", + "--ignore-installed", + "PySide2", + ] + + try: + # Parameters + # - use "-m pip" as module pip to install PySide2 and argument + # "--ignore-installed" is to force install module to 3de4 + # site-packages and make sure it is binary compatible + + process = subprocess.Popen( + args, stdout=subprocess.PIPE, universal_newlines=True + ) + process.communicate() + return process.returncode == 0 + except PermissionError: + self.log.warning( + f'Permission denied with command:\"{" ".join(args)}\".') + except OSError as error: + self.log.warning(f"OS error has occurred: \"{error}\".") + except subprocess.SubprocessError: + pass + + @staticmethod + def is_pyside_installed(python_executable: Path) -> bool: + """Check if PySide2 module is in 3de4 python env. + + Args: + python_executable (Path): Path to python executable. + + Returns: + bool: True if PySide2 is installed, False otherwise. + + """ + # Get pip list from 3de4's python executable + args = [python_executable.as_posix(), "-m", "pip", "list"] + process = subprocess.Popen(args, stdout=subprocess.PIPE) + stdout, _ = process.communicate() + lines = stdout.decode().split(os.linesep) + # Second line contain dashes that define maximum length of module name. + # Second column of dashes define maximum length of module version. + package_dashes, *_ = lines[1].split(" ") + package_len = len(package_dashes) + + # Got through printed lines starting at line 3 + for idx in range(2, len(lines)): + line = lines[idx] + if not line: + continue + package_name = line[:package_len].strip() + if package_name.lower() == "pyside2": + return True + return False diff --git a/openpype/hosts/equalizer/plugins/__init__.py b/openpype/hosts/equalizer/plugins/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openpype/hosts/equalizer/plugins/create/__init__.py b/openpype/hosts/equalizer/plugins/create/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openpype/hosts/equalizer/plugins/create/create_lens_distortion_data.py b/openpype/hosts/equalizer/plugins/create/create_lens_distortion_data.py new file mode 100644 index 00000000000..84e999ebff1 --- /dev/null +++ b/openpype/hosts/equalizer/plugins/create/create_lens_distortion_data.py @@ -0,0 +1,11 @@ +from openpype.hosts.equalizer.api import EqualizerCreator + + +class CreateLensDistortionData(EqualizerCreator): + identifier = "io.openpype.creators.equalizer.lens_distortion" + label = "Lens Distortion" + family = "lensDistortion" + icon = "glasses" + + def create(self, subset_name, instance_data, pre_create_data): + super().create(subset_name, instance_data, pre_create_data) diff --git a/openpype/hosts/equalizer/plugins/create/create_matchmove.py b/openpype/hosts/equalizer/plugins/create/create_matchmove.py new file mode 100644 index 00000000000..e0d5497cc71 --- /dev/null +++ b/openpype/hosts/equalizer/plugins/create/create_matchmove.py @@ -0,0 +1,55 @@ +import tde4 + +from openpype.hosts.equalizer.api import EqualizerCreator +from openpype.lib import EnumDef + + +class CreateMatchMove(EqualizerCreator): + identifier = "io.openpype.creators.equalizer.matchmove" + label = "Match Move" + family = "matchmove" + icon = "camera" + + def get_instance_attr_defs(self): + camera_enum = [ + {"value": "__all__", "label": "All Cameras"}, + {"value": "__current__", "label": "Current Camera"}, + {"value": "__ref__", "label": "Reference Cameras"}, + {"value": "__seq__", "label": "Sequence Cameras"}, + ] + camera_list = tde4.getCameraList() + camera_enum.extend( + {"label": tde4.getCameraName(camera), "value": camera} + for camera in camera_list + if tde4.getCameraEnabledFlag(camera) + ) + # try to get list of models + model_enum = [ + {"value": "__none__", "label": "No 3D Models At All"}, + {"value": "__all__", "label": "All 3D Models"}, + ] + point_groups = tde4.getPGroupList() + for point_group in point_groups: + model_list = tde4.get3DModelList(point_group, 0) + model_enum.extend( + { + "label": tde4.get3DModelName(point_group, model), + "value": model + } for model in model_list + ) + return [ + EnumDef("camera_selection", + items=camera_enum, + default="__current__", + label="Camera(s) to publish", + tooltip="Select cameras to publish"), + EnumDef("model_selection", + items=model_enum, + default="__none__", + label="Model(s) to publish", + tooltip="Select models to publish"), + ] + + def create(self, subset_name, instance_data, pre_create_data): + self.log.debug("CreateMatchMove.create") + super().create(subset_name, instance_data, pre_create_data) diff --git a/openpype/hosts/equalizer/plugins/load/__init__.py b/openpype/hosts/equalizer/plugins/load/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openpype/hosts/equalizer/plugins/load/load_plate.py b/openpype/hosts/equalizer/plugins/load/load_plate.py new file mode 100644 index 00000000000..31e1ee70a7d --- /dev/null +++ b/openpype/hosts/equalizer/plugins/load/load_plate.py @@ -0,0 +1,177 @@ +"""Loader for image sequences. + +This loads published sequence to the current camera +because this workflow is the most common in production. + +If current camera is not defined, it will try to use first camera and +if there is no camera at all, it will create new one. + +TODO: + * Support for setting handles, calculation frame ranges, EXR + options, etc. + * Add support for color management - at least put correct gamma + to image corrections. + +""" +import tde4 +import os +import openpype.pipeline.load as load +from openpype.client import get_version_by_id +from openpype.hosts.equalizer.api import Container, EqualizerHost +from openpype.lib.transcoding import IMAGE_EXTENSIONS +from openpype.pipeline import ( + get_current_project_name, + get_representation_context, +) +import xml.etree.ElementTree as et + + +class LoadPlate(load.LoaderPlugin): + families = [ + "imagesequence", + "review", + "render", + "plate", + "image", + "online", + ] + + representations = ["*"] + extensions = {ext.lstrip(".") for ext in IMAGE_EXTENSIONS} + + label = "Load sequence" + order = -10 + icon = "image" + color = "orange" + + def load(self, context, name=None, namespace=None, options=None): + representation = context["representation"] + project_name = get_current_project_name() + version = get_version_by_id(project_name, representation["parent"]) + + file_path = self.filepath_from_context(context) + tde4.setProjectNotes("Loading: %s into %s"%(file_path, name)) + tde4.updateGUI() + + camera_id = tde4.getCurrentCamera() + lens_id = tde4.getCameraLens(camera_id) + + image_dir, image_path = os.path.split(file_path) + image_name, id, image_format = image_path.split(".") + pattern = ".".join([image_name, len(id)*"#", image_format]) + pattern_path = os.path.join(image_dir, pattern) + + + start_frame, end_frame = int(version["data"].get("frameStart")), int(version["data"].get("frameEnd")) + len_frames = end_frame - start_frame + 1 + + # # set the sequence attributes star/end/step + tde4.setCameraSequenceAttr(camera_id, start_frame, end_frame, 1) + tde4.setCameraName(camera_id, name) + tde4.setCameraPath(camera_id, pattern_path) + tde4.setCameraFrameOffset(camera_id, start_frame) + tde4.setCamera8BitColorGamma(camera_id, 2.2 if image_format == 'exr' else 1) + tde4.setCameraPlaybackRange(camera_id,1,len_frames) + # Set lens distortion model + film_aspect = float(tde4.getLensFilmAspect(lens_id)) + if film_aspect > 2: + tde4.setLensLDModel(lens_id, "3DE4 Anamorphic - Standard, Degree 4") + + # Assign the MetaData of the current frame into project + if image_format == "exr": + self._assignMetaData(camera_id, lens_id) + + + container = Container( + name=name, + namespace=name, + loader=self.__class__.__name__, + representation=str(representation["_id"]), + ) + EqualizerHost.get_host().add_container(container) + + + def _assignMetaData(self, camera_id, lens_id): + frame = tde4.getCurrentFrame(camera_id) + frame_path = tde4.getCameraFrameFilepath(camera_id, frame) + try: + xml = tde4.convertOpenEXRMetaDataToXML(frame_path) + except: + print("File '" + frame_path + "' doesn't seem to be an EXR file.") + return + + root = et.fromstring(xml) + metadata_attrs = dict() + for a in root.findall("attribute"): + name = a.find("name").text + value = a.find("value").text + if name and value: metadata_attrs[name] = value + + # Assign the metadata attributes into Camera + if 'camera_fps' in metadata_attrs: + tde4.setCameraFPS(camera_id, float(metadata_attrs['camera_fps'])) + + # Assign the metadata attributes into Lens + if 'camera_focal' in metadata_attrs: + camera_focal = metadata_attrs['camera_focal'].split() + if camera_focal[1] == 'mm': + tde4.setLensFocalLength(lens_id, float(camera_focal[0])/10) + else: + tde4.setLensFocalLength(lens_id, float(camera_focal[0])) + + + def update(self, container, representation): + camera_list = tde4.getCameraList() + try: + camera = [ + c for c in camera_list if + tde4.getCameraName(c) == container["namespace"] + ][0] + except IndexError: + self.log.error('Cannot find camera {}'.format(container["namespace"])) + print('Cannot find camera {}'.format(container["namespace"])) + return + + context = get_representation_context(representation) + file_path = self.file_path(representation, context) + + image_dir, image_path = os.path.split(file_path) + image_name, id, image_format = image_path.split(".") + pattern = ".".join([image_name, len(id)*"#", image_format]) + pattern_path = os.path.join(image_dir, pattern) + + # set the sequence attributes star/end/step + tde4.setCameraSequenceAttr( + camera, int(version["data"].get("frameStart")), + int(version["data"].get("frameEnd")), 1) + + # set the path to sequence on the camera + tde4.setCameraPath(camera, pattern_path) + + version = get_version_by_id( + get_current_project_name(), representation["parent"]) + + print(container) + EqualizerHost.get_host().add_container(container) + + def switch(self, container, representation): + self.update(container, representation) + + # def file_path(self, representation, context): + # is_sequence = len(representation["files"]) > 1 + # print("is sequence %is_sequence"%is_sequence) + # if is_sequence: + # frame = representation["context"]["frame"] + # hashes = "#" * len(str(frame)) + # if ( + # "{originalBasename}" in representation["data"]["template"] + # ): + # origin_basename = context["originalBasename"] + # context["originalBasename"] = origin_basename.replace( + # frame, hashes + # ) + + # # Replace the frame with the hash in the frame + # representation["context"]["frame"] = hashes + + # return self.filepath_from_context(context) diff --git a/openpype/hosts/equalizer/plugins/publish/__init__.py b/openpype/hosts/equalizer/plugins/publish/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openpype/hosts/equalizer/plugins/publish/collect_3de_installation_dir.py b/openpype/hosts/equalizer/plugins/publish/collect_3de_installation_dir.py new file mode 100644 index 00000000000..93486824108 --- /dev/null +++ b/openpype/hosts/equalizer/plugins/publish/collect_3de_installation_dir.py @@ -0,0 +1,16 @@ +"""Collect camera data from the scene.""" +import pyblish.api +import tde4 +from pathlib import Path + + +class Collect3DE4InstallationDir(pyblish.api.InstancePlugin): + """Collect camera data from the scene.""" + + order = pyblish.api.CollectorOrder + hosts = ["equalizer"] + label = "Collect 3Dequalizer directory" + + def process(self, instance): + tde4_path = Path(tde4.get3DEInstallPath()) + instance.data["tde4_path"] = tde4_path diff --git a/openpype/hosts/equalizer/plugins/publish/collect_camera_data.py b/openpype/hosts/equalizer/plugins/publish/collect_camera_data.py new file mode 100644 index 00000000000..66e6c1320ae --- /dev/null +++ b/openpype/hosts/equalizer/plugins/publish/collect_camera_data.py @@ -0,0 +1,71 @@ +"""Collect camera data from the scene.""" +import pyblish.api +import tde4 + + +class CollectCameraData(pyblish.api.InstancePlugin): + """Collect camera data from the scene.""" + + order = pyblish.api.CollectorOrder + families = ["matchmove"] + hosts = ["equalizer"] + label = "Collect camera data" + + def process(self, instance: pyblish.api.Instance): + # handle camera selection. + # possible values are: + # - __current__ - current camera + # - __ref__ - reference cameras + # - __seq__ - sequence cameras + # - __all__ - all cameras + # - camera_id - specific camera + + try: + camera_sel = instance.data["creator_attributes"]["camera_selection"] # noqa: E501 + except KeyError: + self.log.warning("No camera defined") + return + + if camera_sel == "__all__": + cameras = tde4.getCameraList() + elif camera_sel == "__current__": + cameras = [tde4.getCurrentCamera()] + elif camera_sel in ["__ref__", "__seq__"]: + cameras = [ + c for c in tde4.getCameraList() + if tde4.getCameraType(c) == "REF_FRAME" + ] + else: + if camera_sel not in tde4.getCameraList(): + self.log.warning("Invalid camera found") + return + cameras = [camera_sel] + + data = [] + + for camera in cameras: + camera_name = tde4.getCameraName(camera) + enabled = tde4.getCameraEnabledFlag(camera) + # calculation range + c_range_start, c_range_end = tde4.getCameraCalculationRange( + camera) + p_range_start, p_range_end = tde4.getCameraPlaybackRange(camera) + fov = tde4.getCameraFOV(camera) + fps = tde4.getCameraFPS(camera) + # focal length is time based, so lets skip it for now + # focal_length = tde4.getCameraFocalLength(camera, frame) + path = tde4.getCameraPath(camera) + + camera_data = { + "name": camera_name, + "id": camera, + "enabled": enabled, + "calculation_range": (c_range_start, c_range_end), + "playback_range": (p_range_start, p_range_end), + "fov": fov, + "fps": fps, + # "focal_length": focal_length, + "path": path + } + data.append(camera_data) + instance.data["cameras"] = data diff --git a/openpype/hosts/equalizer/plugins/publish/collect_workfile.py b/openpype/hosts/equalizer/plugins/publish/collect_workfile.py new file mode 100644 index 00000000000..0ff45483c0b --- /dev/null +++ b/openpype/hosts/equalizer/plugins/publish/collect_workfile.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +"""Collect current work file.""" +from pathlib import Path + +import pyblish.api +import tde4 + + +class CollectWorkfile(pyblish.api.ContextPlugin): + """Inject the current working file into context""" + + order = pyblish.api.CollectorOrder - 0.01 + label = "Collect 3DE4 Workfile" + hosts = ['equalizer'] + + def process(self, context: pyblish.api.Context): + """Inject the current working file.""" + project_file = Path(tde4.getProjectPath()) + current_file = project_file.as_posix() + + context.data['currentFile'] = current_file + + filename = project_file.stem + ext = project_file.suffix + + task = context.data["task"] + + data = {} + + # create instance + instance = context.create_instance(name=filename) + subset = f'workfile{task.capitalize()}' + + data = { + "subset": subset, + "asset": context.data["asset"], + "label": subset, + "publish": True, + "family": 'workfile', + "families": ['workfile'], + "setMembers": [current_file], + "frameStart": context.data['frameStart'], + "frameEnd": context.data['frameEnd'], + "handleStart": context.data['handleStart'], + "handleEnd": context.data['handleEnd'], + "representations": [ + { + "name": ext.lstrip("."), + "ext": ext.lstrip("."), + "files": project_file.name, + "stagingDir": project_file.parent.as_posix(), + } + ] + } + + instance.data.update(data) + + self.log.info(f'Collected instance: {project_file.name}') + self.log.info(f'Scene path: {current_file}') + self.log.info(f'staging Dir: {project_file.parent.as_posix()}') + self.log.info(f'subset: {subset}') diff --git a/openpype/hosts/equalizer/plugins/publish/extract_lens_distortion_nuke.py b/openpype/hosts/equalizer/plugins/publish/extract_lens_distortion_nuke.py new file mode 100644 index 00000000000..407fd66f904 --- /dev/null +++ b/openpype/hosts/equalizer/plugins/publish/extract_lens_distortion_nuke.py @@ -0,0 +1,55 @@ +from pathlib import Path + +import pyblish.api +import tde4 # noqa: F401 + +from openpype.lib import import_filepath +from openpype.pipeline import OptionalPyblishPluginMixin, publish + + +class ExtractLensDistortionNuke(publish.Extractor, + OptionalPyblishPluginMixin): + """Extract Nuke script for matchmove. + + Unfortunately built-in export script from 3DEqualizer is bound to its UI, + and it is not possible to call it directly from Python. Because of that, + we are executing the script in the same way as artist would do it, but + we are patching the UI to silence it and to avoid any user interaction. + + TODO: Utilize attributes defined in ExtractScriptBase + """ + + label = "Extract Lens Distortion Nuke node" + families = ["lensDistortion"] + hosts = ["equalizer"] + + order = pyblish.api.ExtractorOrder + + def process(self, instance: pyblish.api.Instance): + + if not self.is_active(instance.data): + return + + cam = tde4.getCurrentCamera() + offset = tde4.getCameraFrameOffset(cam) + staging_dir = self.staging_dir(instance) + file_path = Path(staging_dir) / "nuke_ld_export.nk" + + # import export script from 3DEqualizer + exporter_path = instance.data["tde4_path"] / "sys_data" / "py_scripts" / "export_nuke_LD_3DE4_Lens_Distortion_Node.py" # noqa: E501 + self.log.debug(f"Importing {exporter_path.as_posix()}") + exporter = import_filepath(exporter_path.as_posix()) + exporter.exportNukeDewarpNode(cam, offset, file_path.as_posix()) + + # create representation data + if "representations" not in instance.data: + instance.data["representations"] = [] + + representation = { + 'name': "lensDistortion", + 'ext': "nk", + 'files': file_path.name, + "stagingDir": staging_dir, + } + self.log.debug(f"output: {file_path.as_posix()}") + instance.data["representations"].append(representation) diff --git a/openpype/hosts/equalizer/plugins/publish/extract_matchmove_script_maya.py b/openpype/hosts/equalizer/plugins/publish/extract_matchmove_script_maya.py new file mode 100644 index 00000000000..907c935209a --- /dev/null +++ b/openpype/hosts/equalizer/plugins/publish/extract_matchmove_script_maya.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +"""Extract project for Maya""" + +from pathlib import Path + +import pyblish.api +import tde4 + +from openpype.hosts.equalizer.api import ( + ExtractScriptBase, + maintained_model_selection, +) +from openpype.lib import import_filepath +from openpype.pipeline import ( + KnownPublishError, + OptionalPyblishPluginMixin, + publish, +) + + +class ExtractMatchmoveScriptMaya(publish.Extractor, + ExtractScriptBase, + OptionalPyblishPluginMixin): + """Extract Maya MEL script for matchmove. + + This is using built-in export script from 3DEqualizer. + """ + + label = "Extract Maya Script" + families = ["matchmove"] + hosts = ["equalizer"] + + order = pyblish.api.ExtractorOrder + + def process(self, instance: pyblish.api.Instance): + """Extracts Maya script from 3DEqualizer. + + This method is using export script shipped with 3DEqualizer to + maintain as much compatibility as possible. Instead of invoking it + from the UI, it calls directly the function that is doing the export. + For that it needs to pass some data that are collected in 3dequalizer + from the UI, so we need to determine them from the instance itself and + from the state of the project. + + """ + if not self.is_active(instance.data): + return + attr_data = self.get_attr_values_from_data(instance.data) + + # import maya export script from 3DEqualizer + exporter_path = instance.data["tde4_path"] / "sys_data" / "py_scripts" / "export_maya.py" # noqa: E501 + self.log.debug(f"Importing {exporter_path.as_posix()}") + exporter = import_filepath(exporter_path.as_posix()) + + # get camera point group + point_group = None + point_groups = tde4.getPGroupList() + for pg in point_groups: + if tde4.getPGroupType(pg) == "CAMERA": + point_group = pg + break + else: + # this should never happen as it should be handled by validator + raise RuntimeError("No camera point group found.") + + offset = tde4.getCameraFrameOffset(tde4.getCurrentCamera()) + overscan_width = attr_data["overscan_percent_width"] / 100.0 + overscan_height = attr_data["overscan_percent_height"] / 100.0 + + staging_dir = self.staging_dir(instance) + + unit_scales = { + "mm": 10.0, # cm -> mm + "cm": 1.0, # cm -> cm + "m": 0.01, # cm -> m + "in": 0.393701, # cm -> in + "ft": 0.0328084, # cm -> ft + "yd": 0.0109361 # cm -> yd + } + scale_factor = unit_scales[attr_data["units"]] + model_selection_enum = instance.data["creator_attributes"]["model_selection"] # noqa: E501 + + with maintained_model_selection(): + # handle model selection + # We are passing it to existing function that is expecting + # this value to be an index of selection type. + # 1 - No models + # 2 - Selected models + # 3 - All models + if model_selection_enum == "__none__": + model_selection = 1 + elif model_selection_enum == "__all__": + model_selection = 3 + else: + # take model from instance and set its selection flag on + # turn off all others + model_selection = 2 + point_groups = tde4.getPGroupList() + for point_group in point_groups: + model_list = tde4.get3DModelList(point_group, 0) + if model_selection_enum in model_list: + model_selection = 2 + tde4.set3DModelSelectionFlag( + point_group, instance.data["model_selection"], 1) + break + else: + # clear all other model selections + for model in model_list: + tde4.set3DModelSelectionFlag(point_group, model, 0) + + file_path = Path(staging_dir) / "maya_export.mel" + status = exporter._maya_export_mel_file( + file_path.as_posix(), # staging path + point_group, # camera point group + [c["id"] for c in instance.data["cameras"] if c["enabled"]], + model_selection, # model selection mode + overscan_width, + overscan_height, + 1 if attr_data["export_uv_textures"] else 0, + scale_factor, + offset, # start frame + 1 if attr_data["hide_reference_frame"] else 0) + + if status != 1: + raise KnownPublishError("Export failed.") + + # create representation data + if "representations" not in instance.data: + instance.data["representations"] = [] + + representation = { + 'name': "mel", + 'ext': "mel", + 'files': file_path.name, + "stagingDir": staging_dir, + } + self.log.debug(f"output: {file_path.as_posix()}") + instance.data["representations"].append(representation) diff --git a/openpype/hosts/equalizer/plugins/publish/extract_matchmove_script_nuke.py b/openpype/hosts/equalizer/plugins/publish/extract_matchmove_script_nuke.py new file mode 100644 index 00000000000..33638f310b0 --- /dev/null +++ b/openpype/hosts/equalizer/plugins/publish/extract_matchmove_script_nuke.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +"""Extract project for Nuke. + +Because original extractor script is intermingled with UI, we had to resort +to this hacky solution. This is monkey-patching 3DEqualizer UI to silence it +during the export. Advantage is that it is still using "vanilla" built-in +export script, so it should be more compatible with future versions of the +software. + +TODO: This can be refactored even better, split to multiple methods, etc. + +""" +from pathlib import Path +from unittest.mock import patch + +import pyblish.api +import tde4 # noqa: F401 + + +from openpype.pipeline import OptionalPyblishPluginMixin +from openpype.pipeline import publish + + +class ExtractMatchmoveScriptNuke(publish.Extractor, + OptionalPyblishPluginMixin): + """Extract Nuke script for matchmove. + + Unfortunately built-in export script from 3DEqualizer is bound to its UI, + and it is not possible to call it directly from Python. Because of that, + we are executing the script in the same way as artist would do it, but + we are patching the UI to silence it and to avoid any user interaction. + + TODO: Utilize attributes defined in ExtractScriptBase + """ + + label = "Extract Nuke Script" + families = ["matchmove"] + hosts = ["equalizer"] + + order = pyblish.api.ExtractorOrder + + def process(self, instance: pyblish.api.Instance): + + if not self.is_active(instance.data): + return + + cam = tde4.getCurrentCamera() + frame0 = tde4.getCameraFrameOffset(cam) + frame0 -= 1 + + staging_dir = self.staging_dir(instance) + file_path = Path(staging_dir) / "nuke_export.nk" + + # these patched methods are used to silence 3DEqualizer UI: + def patched_getWidgetValue(requester, key: str): # noqa: N802 + """Return value for given key in widget.""" + if key == "file_browser": + return file_path.as_posix() + elif key == "startframe_field": + return tde4.getCameraFrameOffset(cam) + return "" + + # This is simulating artist clicking on "OK" button + # in the export dialog. + def patched_postCustomRequester(*args, **kwargs): # noqa: N802 + return 1 + + # This is silencing success/error message after the script + # is exported. + def patched_postQuestionRequester(*args, **kwargs): # noqa: N802 + return None + + # import maya export script from 3DEqualizer + exporter_path = instance.data["tde4_path"] / "sys_data" / "py_scripts" / "export_nuke.py" # noqa: E501 + self.log.debug("Patching 3dequalizer requester objects ...") + + with patch("tde4.getWidgetValue", patched_getWidgetValue), \ + patch("tde4.postCustomRequester", patched_postCustomRequester), \ + patch("tde4.postQuestionRequester", patched_postQuestionRequester): # noqa: E501 + with exporter_path.open() as f: + script = f.read() + self.log.debug(f"Importing {exporter_path.as_posix()}") + exec(script) + + # create representation data + if "representations" not in instance.data: + instance.data["representations"] = [] + + representation = { + 'name': "nk", + 'ext': "nk", + 'files': file_path.name, + "stagingDir": staging_dir, + } + self.log.debug(f"output: {file_path.as_posix()}") + instance.data["representations"].append(representation) diff --git a/openpype/hosts/equalizer/plugins/publish/validate_camera_pointgroup.py b/openpype/hosts/equalizer/plugins/publish/validate_camera_pointgroup.py new file mode 100644 index 00000000000..8e013c6f28b --- /dev/null +++ b/openpype/hosts/equalizer/plugins/publish/validate_camera_pointgroup.py @@ -0,0 +1,28 @@ +import pyblish.api +import tde4 + +from openpype.pipeline.publish import ( + PublishValidationError, + ValidateContentsOrder, +) + + +class ValidateCameraPoingroup(pyblish.api.InstancePlugin): + """Validate Camera Point Group. + + There must be a camera point group in the scene. + """ + order = ValidateContentsOrder + hosts = ["equalizer"] + families = ["matchmove"] + label = "Validate Camera Point Group" + + def process(self, instance): + valid = False + for point_group in tde4.getPGroupList(): + if tde4.getPGroupType(point_group) == "CAMERA": + valid = True + break + + if not valid: + raise PublishValidationError("Missing Camera Point Group") diff --git a/openpype/hosts/equalizer/plugins/publish/validate_instance_camera_data.py b/openpype/hosts/equalizer/plugins/publish/validate_instance_camera_data.py new file mode 100644 index 00000000000..097bc0157b3 --- /dev/null +++ b/openpype/hosts/equalizer/plugins/publish/validate_instance_camera_data.py @@ -0,0 +1,23 @@ +import pyblish.api + +from openpype.pipeline import PublishValidationError +from openpype.pipeline.publish import ValidateContentsOrder + + +class ValidateInstanceCameraData(pyblish.api.InstancePlugin): + """Check if instance has camera data. + + There might not be any camera associated with the instance + and without it, the instance is not valid. + """ + + order = ValidateContentsOrder + hosts = ["equalizer"] + families = ["matchmove"] + label = "Validate Instance has Camera data" + + def process(self, instance): + try: + _ = instance.data["cameras"] + except KeyError as e: + raise PublishValidationError("No camera data found") from e diff --git a/openpype/hosts/equalizer/startup/clear_proj.py b/openpype/hosts/equalizer/startup/clear_proj.py new file mode 100644 index 00000000000..5f13340da81 --- /dev/null +++ b/openpype/hosts/equalizer/startup/clear_proj.py @@ -0,0 +1,10 @@ +# 3DE4.script.name: ~Clear Project +# +# 3DE4.script.gui: Main Window::AromaOpenPype +# +# 3DE4.script.comment: Clear Project +# 3DE4.script.comment: Author: Eslam Ezzat +# + +import tde4 +tde4.newProject() diff --git a/openpype/hosts/equalizer/startup/import_seq.py b/openpype/hosts/equalizer/startup/import_seq.py new file mode 100644 index 00000000000..ceb699ca0b9 --- /dev/null +++ b/openpype/hosts/equalizer/startup/import_seq.py @@ -0,0 +1,151 @@ +# 3DE4.script.name: ~Import Sequance + +# 3DE4.script.version: v1.1 + +# 3DE4.script.gui: Main Window::AromaOpenPype + +# 3DE4.script.comment: Automated script for importing sequences. +# 3DE4.script.comment: Author: Eslam Ezzat +# 3DE4.script.comment: v1.0 @ 23 Jan 2024 + +# v1.1 updated by Eslam Ezzat 25 Jan 2024 (fetch the metadeta of exr and asssign them) + +import os +import tde4 +import subprocess +import xml.etree.ElementTree as et +import pandas as pd +from openpype.pipeline import install_host, is_installed +from openpype.hosts.equalizer.api import EqualizerHost +from openpype.tools.utils import host_tools + + +def install_3de_host(): + print("Running AYON integration ...") + install_host(EqualizerHost()) + + +if not is_installed(): + install_3de_host() + +def getMetaData(camera_id, lens_id): + + frame = tde4.getCurrentFrame(camera_id) + frame_path = tde4.getCameraFrameFilepath(camera_id, frame) + try: + xml = tde4.convertOpenEXRMetaDataToXML(frame_path) + except: + print("File '" + frame_path + "' doesn't seem to be an EXR file.") + return + + root = et.fromstring(xml) + metadata_attrs = dict() + for a in root.findall("attribute"): + name = a.find("name").text + value = a.find("value").text + if name and value: metadata_attrs[name] = value + + # Assign the metadata attributes into Camera + if 'camera_fps' in metadata_attrs: + tde4.setCameraFPS(camera_id, float(metadata_attrs['camera_fps'])) + + # Assign the metadata attributes into Lens + if 'camera_focal' in metadata_attrs: + camera_focal = metadata_attrs['camera_focal'].split() + if camera_focal[1] == 'mm': + tde4.setLensFocalLength(lens_id, float(camera_focal[0])/10) + else: + tde4.setLensFocalLength(lens_id, float(camera_focal[0])) + + # Set filmback + df = pd.read_csv("D://test_dir//camera_dataset.csv") + def cantain(x, y): + return y.upper() in x.upper() + def get_col(name, check): + return df[name].apply(lambda x: cantain(x, check)) + + cam_name = 'None' + cam_format = "prores" + cam_resolution = "hd" + if 'cameraModel' in metadata_attrs: + cam_name = metadata_attrs['cameraModel'] + + filmback_h = df[(get_col('name', cam_name)) & (get_col('format', cam_format)) & (get_col('resolution', cam_resolution))].filmback_height + filmback_h = list(filmback_h) + if filmback_h: + tde4.setLensFBackHeight(lens_id, float(filmback_h[0])/10) + + +def createNewSequence(file_path): + + tde4.newProject() + camera_id = tde4.getCurrentCamera() + lens_id = tde4.getCameraLens(camera_id) + + image_dir, image_path = os.path.split(file_path) + image_name, id, image_format = image_path.split(".") + pattern = ".".join([image_name, len(id)*"#", image_format]) + path = os.path.join(image_dir, pattern) + + images = os.listdir(image_dir) # [ActionVFX_v01.1002.exr, ActionVFX_v01.1003.exr] + images.sort() + + total_frames_list = [] + pattern_split = pattern.split(".") # [ActionVFX_v01, ####, exr] + for image in images: + image_split = image.split(".") # [ActionVFX_v01, 1002, exr] + if pattern_split[0] == image_split[0] and len(pattern_split) == len(image_split): + # name == name and lenth == lenth + total_frames_list.append(image_split[1]) + + # Auto assign camera attributes + start_frame = int(min(total_frames_list)) + end_frame = int(max(total_frames_list)) + len_frames = len(total_frames_list) + + tde4.setCameraSequenceAttr(camera_id, start_frame, end_frame, 1) + tde4.setCameraName(camera_id, image_name) + tde4.setCameraPath(camera_id, path) + tde4.setCameraFrameOffset(camera_id, start_frame) + tde4.setCamera8BitColorGamma(camera_id, 2.2 if image_format == 'exr' else 1) + tde4.setCameraPlaybackRange(camera_id,1,len_frames) + + # Set lens distortion model + film_aspect = float(tde4.getLensFilmAspect(lens_id)) + if film_aspect > 2: + tde4.setLensLDModel(lens_id, "3DE4 Anamorphic - Standard, Degree 4") + + # Get the MetaData of the current frame + getMetaData(camera_id, lens_id) + + # Import Buffer Compression if exists or Exprot it + # Performace -> Image Cache -> Store Comperssion File -> in Sequence Directory. + Buffer_path = os.path.join(image_dir, '.'.join([image_name, 'x', image_format, '3de_bcompress'])) + if os.path.exists(Buffer_path): + tde4.importBufferCompressionFile(camera_id) + + else: + gamma = tde4.getCamera8BitColorGamma(camera_id) + softclip = tde4.getCamera8BitColorSoftclip(camera_id) + black, white = tde4.getCamera8BitColorBlackWhite(camera_id) + + command = 'makeBCFile.exe -source %s -start %s -end %s -out %s -black %f -white %f -gamma %f -softclip %f'%(tde4.getCameraPath(camera_id),start_frame,end_frame,image_dir,black,white,gamma,softclip) + tde4.postProgressRequesterAndContinue("Export Fast Buffer Compression File...", "Please wait...",100,"Ok") + try: + for i in range(33): + tde4.updateProgressRequester(i,'Exporting: %s'%tde4.getCameraName(camera_id)) + process = subprocess.Popen(command, shell=True) + process.wait() + except: + raise Exception('there is an error in the command') + for i in range(33, 101): + tde4.updateProgressRequester(i,'Exporting: %s'%tde4.getCameraName(camera_id)) + tde4.importBufferCompressionFile(camera_id) + tde4.unpostProgressRequester() + +if __name__ == "__main__": + + path = tde4.postFileRequester(" Please Select First Frame Of Sequence...", "*") + # path = "D:\\test_dir\\v001\\alf01_ep03_sc0002_sh0030_pl01_v001.1001.exr" + if path: + createNewSequence(path) diff --git a/openpype/hosts/equalizer/startup/openpype_create.py b/openpype/hosts/equalizer/startup/openpype_create.py new file mode 100644 index 00000000000..3d130eca237 --- /dev/null +++ b/openpype/hosts/equalizer/startup/openpype_create.py @@ -0,0 +1,23 @@ +# +# 3DE4.script.name: Create ... +# 3DE4.script.gui: Main Window::AromaOpenPype +# 3DE4.script.comment: Open OpenPype Publisher tool +# + +from openpype.pipeline import install_host, is_installed +from openpype.hosts.equalizer.api import EqualizerHost +from openpype.tools.utils import host_tools + + +def install_3de_host(): + print("Running OpenPype integration ...") + install_host(EqualizerHost()) + + +if not is_installed(): + install_3de_host() + +# show the UI +print("Opening publisher window ...") +host_tools.show_publisher( + tab="create", parent=EqualizerHost.get_host().get_main_window()) diff --git a/openpype/hosts/equalizer/startup/openpype_load.py b/openpype/hosts/equalizer/startup/openpype_load.py new file mode 100644 index 00000000000..5ef2f27f291 --- /dev/null +++ b/openpype/hosts/equalizer/startup/openpype_load.py @@ -0,0 +1,26 @@ +# +# 3DE4.script.name: Load ... +# 3DE4.script.gui: Main Window::AromaOpenPype +# 3DE4.script.comment: Open OpenPype Loader tool +# 3DE4.script.comment: Author: Eslam Ezzat +# + +from openpype.pipeline import install_host, is_installed +from openpype.hosts.equalizer.api import EqualizerHost +from openpype.tools.utils import host_tools + + +def install_3de_host(): + print("Running OpenPype integration ...") + install_host(EqualizerHost()) + + +if not is_installed(): + install_3de_host() + + +# show the UI +print("Opening loader window ...") +host_tools.show_loader( + parent=EqualizerHost.get_host().get_main_window(), + use_context=True) diff --git a/openpype/hosts/equalizer/startup/openpype_manage.py b/openpype/hosts/equalizer/startup/openpype_manage.py new file mode 100644 index 00000000000..d46b2205ff8 --- /dev/null +++ b/openpype/hosts/equalizer/startup/openpype_manage.py @@ -0,0 +1,24 @@ +# +# 3DE4.script.name: Manage ... +# 3DE4.script.gui: Main Window::AromaOpenPype +# 3DE4.script.comment: Open OpenPype Publisher tool +# 3DE4.script.comment: Author: Eslam Ezzat +# + +from openpype.pipeline import install_host, is_installed +from openpype.hosts.equalizer.api import EqualizerHost +from openpype.tools.utils import host_tools + + +def install_3de_host(): + print("Running OpenPype integration ...") + install_host(EqualizerHost()) + + +if not is_installed(): + install_3de_host() + +# show the UI +print("Opening Scene Manager window ...") +host_tools.show_scene_inventory( + parent=EqualizerHost.get_host().get_main_window()) diff --git a/openpype/hosts/equalizer/startup/openpype_publish.py b/openpype/hosts/equalizer/startup/openpype_publish.py new file mode 100644 index 00000000000..b9bb2ef3d87 --- /dev/null +++ b/openpype/hosts/equalizer/startup/openpype_publish.py @@ -0,0 +1,23 @@ +# +# 3DE4.script.name: Publish ... +# 3DE4.script.gui: Main Window::AromaOpenPype +# 3DE4.script.comment: Open OpenPype Publisher tool +# + +from openpype.pipeline import install_host, is_installed +from openpype.hosts.equalizer.api import EqualizerHost +from openpype.tools.utils import host_tools + + +def install_3de_host(): + print("Running OpenPype integration ...") + install_host(EqualizerHost()) + + +if not is_installed(): + install_3de_host() + +# show the UI +print("Opening publisher window ...") +host_tools.show_publisher( + tab="publish", parent=EqualizerHost.get_host().get_main_window()) diff --git a/openpype/hosts/equalizer/startup/openpype_workfile.py b/openpype/hosts/equalizer/startup/openpype_workfile.py new file mode 100644 index 00000000000..5792d5294c6 --- /dev/null +++ b/openpype/hosts/equalizer/startup/openpype_workfile.py @@ -0,0 +1,23 @@ +# +# 3DE4.script.name: Work files ... +# 3DE4.script.gui: Main Window::AromaOpenPype +# 3DE4.script.comment: Open OpenPype Publisher tool +# + +from openpype.pipeline import install_host, is_installed +from openpype.hosts.equalizer.api import EqualizerHost +from openpype.tools.utils import host_tools + + +def install_3de_host(): + print("Running OpenPype integration ...") + install_host(EqualizerHost()) + + +if not is_installed(): + install_3de_host() + +# show the UI +print("Opening Workfile tool window ...") +host_tools.show_workfiles( + parent=EqualizerHost.get_host().get_main_window()) diff --git a/openpype/hosts/equalizer/tests/test_plugin.py b/openpype/hosts/equalizer/tests/test_plugin.py new file mode 100644 index 00000000000..13aa340f8ef --- /dev/null +++ b/openpype/hosts/equalizer/tests/test_plugin.py @@ -0,0 +1,144 @@ +""" +3DEqualizer plugin tests + +These test need to be run in 3DEqualizer. + +""" +import json +import re +import unittest + +from attr import asdict +import attr +from attr.exceptions import NotAnAttrsClassError + +AVALON_CONTAINER_ID = "test.container" + +CONTEXT_REGEX = re.compile( + r"AYON_CONTEXT::(?P.*?)::AYON_CONTEXT_END", + re.DOTALL) + + +@attr.s +class Container(object): + name = attr.ib(default=None) + id = attr.ib(init=False, default=AVALON_CONTAINER_ID) + namespace = attr.ib(default="") + loader = attr.ib(default=None) + representation = attr.ib(default=None) + + +class Tde4Mock: + """Simple class to mock few 3dequalizer functions. + + Just to run the test outside the host itself. + """ + + _notes = "" + + def isProjectUpToDate(self): + return True + + def setProjectNotes(self, notes): + self._notes = notes + + def getProjectNotes(self): + return self._notes + + +tde4 = Tde4Mock() + + +def get_context_data(): + m = re.search(CONTEXT_REGEX, tde4.getProjectNotes()) + return json.loads(m.groupdict()["context"]) if m else {} + + +def update_context_data(data, changes): + m = re.search(CONTEXT_REGEX, tde4.getProjectNotes()) + if not m: + tde4.setProjectNotes("AYON_CONTEXT::::AYON_CONTEXT_END") + update = json.dumps(data, indent=4) + tde4.setProjectNotes( + re.sub( + CONTEXT_REGEX, + "AYON_CONTEXT::%s::AYON_CONTEXT_END"%update, + tde4.getProjectNotes() + ) + ) + + +def get_containers(): + return get_context_data().get("containers", []) + + +def add_container(container): + context_data = get_context_data() + containers = get_containers() + + for _container in containers: + if _container["name"] == container.name and _container["namespace"] == container.namespace: # noqa: E501 + containers.remove(_container) + break + + try: + containers.append(asdict(container)) + except NotAnAttrsClassError: + print("not an attrs class") + containers.append(container) + + context_data["containers"] = containers + update_context_data(context_data, changes={}) + + +class TestEqualizer(unittest.TestCase): + def test_context_data(self): + # ensure empty project notest + + data = get_context_data() + print("data here", data) + self.assertEqual({}, data, "context data are not empty") + + # add container + add_container( + Container(name="test", representation="test_A") + ) + + + self.assertEqual( + 1, len(get_containers()), "container not added") + self.assertEqual( + get_containers()[0]["name"], + "test", "container name is not correct") + + # add another container + add_container( + Container(name="test2", representation="test_B") + ) + + self.assertEqual( + 2, len(get_containers()), "container not added") + self.assertEqual( + get_containers()[1]["name"], + "test2", "container name is not correct") + + # update container + add_container( + Container(name="test2", representation="test_C") + ) + self.assertEqual( + 2, len(get_containers()), "container not updated") + self.assertEqual( + get_containers()[1]["representation"], + "test_C", "container name is not correct") + + Containers = get_containers() + print("Containers here", Containers) + notes = tde4.getProjectNotes().split("\n") + print("\n \n \nproject notes:-") + for note in notes: + print(note) + + +if __name__ == "__main__": + unittest.main() diff --git a/openpype/hosts/maya/api/plugin.py b/openpype/hosts/maya/api/plugin.py index e684a91fe23..38df607665b 100644 --- a/openpype/hosts/maya/api/plugin.py +++ b/openpype/hosts/maya/api/plugin.py @@ -613,7 +613,13 @@ def get_custom_namespace_and_group(self, context, options, loader_key): """ options["attach_to_root"] = True - custom_naming = self.load_settings[loader_key] + try: + custom_naming = self.load_settings[loader_key] + except KeyError: + self.log.warning( + "No settings found for {} in settings, falling back to " + "ReferenceLoader defaults.".format(loader_key)) + custom_naming = self.load_settings["reference_loader"] if not custom_naming['namespace']: raise LoadError("No namespace specified in " diff --git a/openpype/hosts/maya/plugins/load/load_matchmove.py b/openpype/hosts/maya/plugins/load/load_matchmove.py index 46d1be8300e..132fff241dd 100644 --- a/openpype/hosts/maya/plugins/load/load_matchmove.py +++ b/openpype/hosts/maya/plugins/load/load_matchmove.py @@ -1,11 +1,24 @@ -from maya import mel -from openpype.pipeline import load +# -*- coding: utf-8 -*- +from maya import cmds, mel # noqa: F401 -class MatchmoveLoader(load.LoaderPlugin): - """ - This will run matchmove script to create track in scene. +from openpype.hosts.maya.api.pipeline import containerise +from openpype.hosts.maya.api import lib, Loader +from openpype.pipeline.load import get_representation_path, LoadError + + +class MatchmoveLoader(Loader): + """Run matchmove script to create track in scene. Supported script types are .py and .mel + + TODO: there might be error in the scripts exported from + 3DEqualizer that it is trying to set frame attribute + on camera image plane and then add expression for + image sequence. Maya will throw RuntimeError at that + point that will stop processing rest of the script and + the container will not be created. We should somehow handle + this - maybe even by patching the mel script on-the-fly. + """ families = ["matchmove"] @@ -16,15 +29,80 @@ class MatchmoveLoader(load.LoaderPlugin): icon = "empire" color = "orange" - def load(self, context, name, namespace, data): + def load(self, context, name, namespace, options): + path = self.filepath_from_context(context) + custom_group_name, custom_namespace, options = \ + self.get_custom_namespace_and_group( + context, options, "matchmove_loader") + + namespace = lib.get_custom_namespace(custom_namespace) + + nodes = self._load_nodes_from_script(path) + + return containerise( + name=name, + namespace=namespace, + nodes=nodes, + context=context, + loader=self.__class__.__name__ + ) + + def update(self, container, representation): + # type: (dict, dict) -> None + """Update container with specified representation.""" + self.remove(container) + + path = get_representation_path(representation) + namespace = container["namespace"] + print(f">>> loading from {path}") + try: + nodes = self._load_nodes_from_script(path) + except RuntimeError as e: + raise LoadError("Failed to load matchmove script.") from e + + return containerise( + name=container["name"], + namespace=namespace, + nodes=nodes, + context=representation["context"], + loader=self.__class__.__name__ + ) + + def switch(self, container, representation): + self.update(container, representation) + + def remove(self, container): + """Delete container and its contents.""" + + if cmds.objExists(container['objectName']): + members = cmds.sets(container['objectName'], query=True) or [] + cmds.delete([container['objectName']] + members) + + def _load_nodes_from_script(self, path): + # type: (str) -> list + """Load nodes from script. + + This will execute py or mel script and resulting + nodes will be returned. + + Args: + path (str): path to script + + Returns: + list: list of created nodes + + """ + previous_nodes = set(cmds.ls(long=True)) + if path.lower().endswith(".py"): exec(open(path).read()) elif path.lower().endswith(".mel"): - mel.eval('source "{}"'.format(path)) + mel.eval(open(path).read()) else: self.log.error("Unsupported script type") - return True + current_nodes = set(cmds.ls(long=True)) + return list(current_nodes - previous_nodes) diff --git a/openpype/hosts/nuke/plugins/load/load_backdrop.py b/openpype/hosts/nuke/plugins/load/load_backdrop.py index 54d37da2036..ae562765d83 100644 --- a/openpype/hosts/nuke/plugins/load/load_backdrop.py +++ b/openpype/hosts/nuke/plugins/load/load_backdrop.py @@ -25,7 +25,7 @@ class LoadBackdropNodes(load.LoaderPlugin): """Loading Published Backdrop nodes (workfile, nukenodes)""" - families = ["workfile", "nukenodes"] + families = ["workfile", "nukenodes", "matchmove"] representations = ["*"] extensions = {"nk"} diff --git a/openpype/hosts/nuke/plugins/load/load_gizmo.py b/openpype/hosts/nuke/plugins/load/load_gizmo.py index 19b5cca74ef..4a9909a31be 100644 --- a/openpype/hosts/nuke/plugins/load/load_gizmo.py +++ b/openpype/hosts/nuke/plugins/load/load_gizmo.py @@ -25,7 +25,7 @@ class LoadGizmo(load.LoaderPlugin): """Loading nuke Gizmo""" - families = ["gizmo"] + families = ["gizmo", "lensDistortion"] representations = ["*"] extensions = {"nk"} diff --git a/openpype/lib/log.py b/openpype/lib/log.py index 72071063ec6..3458f097417 100644 --- a/openpype/lib/log.py +++ b/openpype/lib/log.py @@ -102,6 +102,12 @@ def emit(self, record): except OSError: self.handleError(record) + except ValueError: + # this is raised when logging during interpreter shutdown + # or it real edge cases where logging stream is already closed. + # In particular, it happens a lot in 3DEqualizer. + # TODO: remove this condition when the cause is found. + pass except Exception: print(repr(record)) diff --git a/openpype/plugins/publish/collect_scene_loaded_versions.py b/openpype/plugins/publish/collect_scene_loaded_versions.py index 627d451f582..f329932c9a7 100644 --- a/openpype/plugins/publish/collect_scene_loaded_versions.py +++ b/openpype/plugins/publish/collect_scene_loaded_versions.py @@ -20,7 +20,8 @@ class CollectSceneLoadedVersions(pyblish.api.ContextPlugin): "nuke", "photoshop", "resolve", - "tvpaint" + "tvpaint", + "equalizer", ] def process(self, context): diff --git a/openpype/plugins/publish/integrate.py b/openpype/plugins/publish/integrate.py index 581c0c012fa..61efc34a5f4 100644 --- a/openpype/plugins/publish/integrate.py +++ b/openpype/plugins/publish/integrate.py @@ -141,7 +141,8 @@ class IntegrateAsset(pyblish.api.InstancePlugin): "uasset", "blendScene", "yeticacheUE", - "tycache" + "tycache", + "lensDistortion", ] default_template_name = "publish" diff --git a/openpype/resources/app_icons/3de4.ico b/openpype/resources/app_icons/3de4.ico new file mode 100644 index 00000000000..ff665d14028 Binary files /dev/null and b/openpype/resources/app_icons/3de4.ico differ diff --git a/openpype/settings/defaults/project_settings/equalizer.json b/openpype/settings/defaults/project_settings/equalizer.json new file mode 100644 index 00000000000..3f8feafa002 --- /dev/null +++ b/openpype/settings/defaults/project_settings/equalizer.json @@ -0,0 +1,15 @@ +{ + "create": { + "CreateMatchMove": { + "enabled": true, + "default_variants": [ + "CameraTrack", + "ObjectTrack", + "PointTrack", + "Stabilize", + "SurveyTrack", + "UserTrack" + ] + } + } +} diff --git a/openpype/settings/defaults/system_settings/applications.json b/openpype/settings/defaults/system_settings/applications.json index a5283751e97..815be3aca67 100644 --- a/openpype/settings/defaults/system_settings/applications.json +++ b/openpype/settings/defaults/system_settings/applications.json @@ -1584,8 +1584,8 @@ "environment": {} }, "__dynamic_keys_labels__": { - "5-1": "Unreal 5.1", - "5-0": "Unreal 5.0" + "5-0": "Unreal 5.0", + "5-1": "Unreal 5.1" } } }, @@ -1615,5 +1615,34 @@ } } }, + "3dequalizer": { + "enabled": true, + "label": "3DEqualizer", + "icon": "{}/app_icons/3de4.ico", + "host_name": "equalizer", + "heartbeat_interval": 500, + "environment": {}, + "variants": { + "R5": { + "use_python_2": true, + "executables": { + "windows": [ + "C:\\Program Files\\3DEqualizer_4_R5\\3DE4_win64_r5\\bin\\3de4.exe" + ], + "darwin": [], + "linux": [] + }, + "arguments": { + "windows": [], + "darwin": [], + "linux": [] + }, + "environment": {} + }, + "__dynamic_keys_labels__": { + "R5": "R5" + } + } + }, "additional_apps": {} } diff --git a/openpype/settings/entities/enum_entity.py b/openpype/settings/entities/enum_entity.py index 26ecd33551a..dcbcb9cb35a 100644 --- a/openpype/settings/entities/enum_entity.py +++ b/openpype/settings/entities/enum_entity.py @@ -172,7 +172,8 @@ class HostsEnumEntity(BaseEnumEntity): "standalonepublisher", "substancepainter", "traypublisher", - "webpublisher" + "webpublisher", + "equalizer", ] def _item_initialization(self): diff --git a/openpype/settings/entities/schemas/projects_schema/schema_main.json b/openpype/settings/entities/schemas/projects_schema/schema_main.json index 4315987a33e..c0d8d393645 100644 --- a/openpype/settings/entities/schemas/projects_schema/schema_main.json +++ b/openpype/settings/entities/schemas/projects_schema/schema_main.json @@ -162,6 +162,10 @@ "type": "schema", "name": "schema_project_unreal" }, + { + "type": "schema", + "name": "schema_project_equalizer" + }, { "type": "dynamic_schema", "name": "project_settings/global" diff --git a/openpype/settings/entities/schemas/projects_schema/schema_project_equalizer.json b/openpype/settings/entities/schemas/projects_schema/schema_project_equalizer.json new file mode 100644 index 00000000000..81fbddcb327 --- /dev/null +++ b/openpype/settings/entities/schemas/projects_schema/schema_project_equalizer.json @@ -0,0 +1,13 @@ +{ + "type": "dict", + "collapsible": true, + "key": "equalizer", + "label": "3DEqualizer", + "is_file": true, + "children": [ + { + "type": "schema", + "name": "schema_equalizer_create" + } + ] +} diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_equalizer_create.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_equalizer_create.json new file mode 100644 index 00000000000..c9b3f2fe7d3 --- /dev/null +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_equalizer_create.json @@ -0,0 +1,28 @@ +{ + "type": "dict", + "collapsible": true, + "key": "create", + "label": "Creator plugins", + "children": [ + { + "type": "dict", + "collapsible": true, + "key": "CreateMatchMove", + "label": "Create Match Move", + "checkbox_key": "enabled", + "children": [ + { + "type": "boolean", + "key": "enabled", + "label": "Enabled" + }, + { + "type": "list", + "key": "default_variants", + "label": "Default Variants", + "object_type": "text" + } + ] + } + ] +} diff --git a/openpype/settings/entities/schemas/system_schema/host_settings/schema_3dequalizer.json b/openpype/settings/entities/schemas/system_schema/host_settings/schema_3dequalizer.json new file mode 100644 index 00000000000..618c57bd7b3 --- /dev/null +++ b/openpype/settings/entities/schemas/system_schema/host_settings/schema_3dequalizer.json @@ -0,0 +1,43 @@ +{ + "type": "dict", + "key": "3dequalizer", + "label": "3DEqualizer", + "collapsible": true, + "checkbox_key": "enabled", + "children": [ + { + "type": "boolean", + "key": "enabled", + "label": "Enabled" + }, + { + "type": "schema_template", + "name": "template_host_unchangables" + }, { + "type": "number", + "key": "heartbeat_interval", + "label": "Qt Heartbeat Interval (ms)" + }, + { + "key": "environment", + "label": "Environment", + "type": "raw-json" + }, + { + "type": "dict-modifiable", + "key": "variants", + "collapsible_key": true, + "use_label_wrap": false, + "object_type": { + "type": "dict", + "collapsible": true, + "children": [ + { + "type": "schema_template", + "name": "template_host_variant_items" + } + ] + } + } + ] +} diff --git a/openpype/settings/entities/schemas/system_schema/schema_applications.json b/openpype/settings/entities/schemas/system_schema/schema_applications.json index 7965c344aee..d12fe0a1535 100644 --- a/openpype/settings/entities/schemas/system_schema/schema_applications.json +++ b/openpype/settings/entities/schemas/system_schema/schema_applications.json @@ -109,6 +109,10 @@ "type": "schema", "name": "schema_djv" }, + { + "type": "schema", + "name": "schema_3dequalizer" + }, { "type": "dict-modifiable", "key": "additional_apps", diff --git a/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/DESCRIPTION.rst b/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/DESCRIPTION.rst new file mode 100644 index 00000000000..6c43cad3c0c --- /dev/null +++ b/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/DESCRIPTION.rst @@ -0,0 +1,557 @@ +====== +PySide +====== + +.. image:: https://img.shields.io/pypi/wheel/pyside.svg + :target: https://pypi.python.org/pypi/PySide/ + :alt: Wheel Status + +.. image:: https://img.shields.io/pypi/dm/pyside.svg + :target: https://pypi.python.org/pypi/PySide/ + :alt: Downloads + +.. image:: https://img.shields.io/pypi/v/pyside.svg + :target: https://pypi.python.org/pypi/PySide/ + :alt: Latest Version + +.. image:: https://binstar.org/asmeurer/pyside/badges/license.svg + :target: https://pypi.python.org/pypi/PySide/ + :alt: License + +.. image:: https://readthedocs.org/projects/pip/badge/ + :target: https://pyside.readthedocs.org + +.. contents:: **Table of Contents** + :depth: 2 + +Introduction +============ + +PySide is the Python Qt bindings project, providing access the complete Qt 4.8 framework +as well as to generator tools for rapidly generating bindings for any C++ libraries. + +The PySide project is developed in the open, with all facilities you'd expect +from any modern OSS project such as all code in a git repository, an open +Bugzilla for reporting bugs, and an open design process. We welcome +any contribution without requiring a transfer of copyright. + +The PySide documentation is hosted at `http://pyside.github.io/docs/pyside/ +`_. + +Compatibility +============= + +PySide requires Python 2.6 or later and Qt 4.6 or better. + +.. note:: + + Qt 5.x is currently not supported. + +Installation +============ + +Installing prerequisites +------------------------ + +Install latest ``pip`` distribution: download `get-pip.py +`_ and run it using +the ``python`` interpreter. + +Installing PySide on a Windows System +------------------------------------- + +To install PySide on Windows you can choose from the following options: + +#. Use pip to install the ``wheel`` binary packages: + + :: + + pip install -U PySide + +#. Use setuptools to install the ``egg`` binary packages (deprecated): + + :: + + easy_install -U PySide + +.. note:: + + Provided binaries are without any other external dependencies. + All required Qt libraries, development tools and examples are included. + + +Installing PySide on a Mac OS X System +-------------------------------------- + +You need to install or build Qt 4.8 first, see the `Qt Project Documentation +`_. + +Alternatively you can use `Homebrew `_ and install Qt with + +:: + + $ brew install qt + +To install PySide on Mac OS X you can choose from the following options: + +#. Use pip to install the ``wheel`` binary packages: + + :: + + $ pip install -U PySide + + +Installing PySide on a Linux System +----------------------------------- + +We do not provide binaries for Linux. Please read the build instructions in section +`Building PySide on a Linux System +`_. + + +Building PySide +=============== + +- `Building PySide on a Windows System `_. + +- `Building PySide on a Mac OS X System `_. + +- `Building PySide on a Linux System `_. + + +Feedback and getting involved +============================= + +- Mailing list: http://lists.qt-project.org/mailman/listinfo/pyside +- Issue tracker: https://bugreports.qt-project.org/browse/PYSIDE +- Code Repository: http://qt.gitorious.org/pyside + + +Changes +======= + +1.2.4 (2015-10-14) +------------------ + +Complete list of changes and bug fixes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +PySide-setup +************ + +- Make sure that setup.py is run with an allowed python version + +1.2.3 (2015-10-12) +------------------ + +Complete list of changes and bug fixes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +PySide +****** + +- Fix PYSIDE-164: Fix possible deadlock on signal connect/emit + +Shiboken +******** + +- Don't ignore classes in topology +- Process global enums in declaration order +- Return enums in declaration order (order added) + +PySide-setup +************ + +- On Linux and MacOS systems there is no more need to call the post-install script + +1.2.2 (2014-04-24) +------------------ + +Complete list of changes and bug fixes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +PySide +****** + +- Fix PYSIDE-190: QCoreApplication would deadlock on exit if the global + QThreadPool.globalInstance() is running a QRunnable with python code +- Change GlobalReceiver to explicitly 'use' [dis]connectNotify of the base + class in order to avoid hiding these with its own overloads. +- Add explicit casts when initializing an int[] using {}'s, as required + by C++11 to be "well formed" +- Fix PYSIDE-172: multiple rules for file +- Use file system encoding instead of assumed 'ascii' when registering + qt.conf in Qt resource system + +Shiboken +******** + +- Remove rejection lines that cause the sample_list test to fail +- Remove protected from samblebinding test +- Add parsing of 'noexcept' keyword +- Fix function rejections (i.e. support overloads) +- Fix building with python 3.3 and 3.4 +- Doc: Stop requiring sphinx.ext.refcounting with Sphinx 1.2+ +- Fix for containers with 'const' values +- Fix compilation issue on OS X 10.9 +- Only use fields in PyTypeObject when defining types +- Fix buffer overrun processing macro definitions +- Fix 'special' include handling +- Fix finding container base classes +- Refactor and improve added function resolving +- Work around MSVC's deficient in libsample/transform.cpp +- Fix description of sample/transform unit test +- Change wrapping and indent of some code in Handler::startElement to + improve consistency +- Fix '%#' substitution for # > 9 +- Improve dependencies for tests + +1.2.1 (2013-08-16) +------------------ + +Major changes +~~~~~~~~~~~~~ + +PySide +****** + +- In memory qt.conf generation and registration + +Shiboken +******** + +- Better support for more than 9 arguments to methods +- Avoiding a segfault when getting the .name attribute on an enum value with no name + +PySide-setup +************ + +- Switched to the new setuptools (v0.9.8) which has been merged with Distribute again and works for Python 2 and 3 with one codebase +- Support for building windows binaries with only Windows SDK installed (Visual Studio is no more required) +- Removed --msvc-version option. Required msvc compiler version is now resolved from python interpreter version + +1.2.0 (2013-07-02) +------------------ + +Major changes +~~~~~~~~~~~~~ + +PySide +****** + +- Fix multiple segfaults and better track the life time of Qt objects +- Fix multiple memory leaks + +Shiboken +******** + +- Install the shiboken module to site-packages +- Fix multiple segfaults + +PySide-setup +************ + +- On Windows system, when installing PySide binary distribution via easy_install, + there is no more need to call the post-install script +- Support for building windows binaries outside of Visual Studio command prompt +- Build and package the shiboken docs when sphinx is installed + +Complete list of changes and bug fixes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +PySide +****** + +- Set up PYTHONPATH for tests correctly +- Fix potential segfault at shutdown +- Fix PYSIDE-61 +- Tell Qt to look for qml imports in the PySide package +- fix build in C++11 mode +- Fix QByteArray memory leak +- Ignore QtCore import errors when initializing plugins folder +- Preload OpenSSL DLLs on Windows. +- Look first in the PySide package for Qt's plugins folder, instead of just in Qt's install or build folder +- Add explicit type conversion to fix mingw compile error +- Use QObject property to invalidate wrapper before deletion +- Invalidate metaObject wrapper before deletion +- Fix reference leak on convertion from a C++ map type to Python dict +- Change the order of pysitetest and signals directories because signals/disconnect_test.py depends on pysidetest module + +Shiboken +******** + +- Removed old logos from html docs +- Add missing return on module init error +- Don't break -Werror=non-virtual-dtor +- Fixing shiboken test for minimal binding test +- Decref reference to type object +- Fix segfault when using shiboken.delete +- Use non-static method def for instance methods +- Fix bug introduced when recursive_invalidate was added +- fix build in C++11 mode +- Prevent infinite recursion in invalidate +- Fix possible conflict with garbage collector +- Fix possible crash at exit +- Fix handling of unsigned long long and provide unittests +- Add test to illustrate issue on typedef enum +- Use getWrapperForQObject to convert if generating for PySide +- Allow compilation without a python shared library +- Use parent class's metaObject if wrapper is NULL +- Optionally assert on free'd pointer with a valid wrapper +- Find python3 libraries when built with pydebug enabled +- Fix PYSIDE-108 bug and add example +- PYSIDE-83 Fix segfault calling shiboken.dump +- Fix and test case for bug PYSIDE-72 +- Override all functions with the same name, not just one +- Update vector conversion +- Add typedef examples to minimal +- Add test files back to cmake +- Don't use it->second after erasing it +- Find function modifications defined in the 2nd+ base class. Fixes bug PYSIDE-54. +- Set a default hash function for all ObjectTypes. Fix bug PYSIDE-42. +- Fix compilation when there is no libxslt installed on the system. +- Fixed resolving of SOABI. SOABI is implemented on Linux, but not on Windows +- Don't use inline methods in dllexported classes to keep VC++ happy +- Use SpooledTemporaryFile in 2.6+ os.tmpfile() fails on win32 if process doesn't have admin permissions + +PySide-setup +************ + +- Support for building windows binaries outside of Visual Studio command prompt +- Build and package the shiboken docs when sphinx is installed +- Support Ubuntu 13.04 and Fedora 18 +- Fixed "develop" setuptools command +- Documentation updates +- Add --build-tests option to enable building the tests +- Add --jom and --jobs options +- Add --no-examples option to exclude the examples +- Add --relwithdebinfo option to enable a release-with-debug-info build mode +- Add --ignore-git option +- Add --make-spec option to specify make generator + +1.1.2 (2012-08-28) +------------------ + +Bug fixes +~~~~~~~~~ + +- During signal emission don't get return type after callback +- Invalidate QStandardModel::invisibleRootItem in clear() method +- QAbstractItemModel has wrong ownership policy for selectionModel() +- Improved QVector to python conversion +- Disable docstring generation if tools aren't found. +- Fixed some issues compiling PySide using VC++ +- Install the shiboken module to site-packages +- Fix compilation when there is no libxslt installed on the system. +- Set a default hash function for all ObjectTypes. +- Fix segfault calling shiboken.dump + +1.1.1 (2012-04-19) +------------------ + +Major changes +~~~~~~~~~~~~~ + +- Unified toolchain! No more GeneratorRunner and ApiExtractor, now you just need Shiboken to compile PySide. + +Bug fixes +~~~~~~~~~ + +- 1105 Spyder fails with HEAD +- 1126 Segfault when exception is raised in signalInstanceDisconnect +- 1135 SIGSEGV when loading custom widget using QUiLoader when overriding createWidget() +- 1041 QAbstractItemModel has wrong ownership policy for selectionModel() +- 1086 generatorrunner segfault processing #include +- 1110 Concurrency error causes GC heap corruption +- 1113 Instantiating QObject in user-defined QML element's constructor crashes if instantiated from QML +- 1129 Segmentation fault on close by QStandardItem/QStandardItemModel +- 1104 QSettings has problems with long integers +- 1108 tests/QtGui/pyside_reload_test.py fails when bytecode writing is disabled +- 1138 Subclassing of QUiLoader leads to "Internal C++ object already deleted" exception (again) +- 1124 QPainter.drawPixmapFragments should take a list as first argument +- 1065 Invalid example in QFileDialog documentation +- 1092 shiboken names itself a 'generator' +- 1094 shiboken doesn't complain about invalid options +- 1044 Incorrect call to parent constructor in example +- 1139 Crash at exit due to thread state (tstate) being NULL +- PYSIDE-41 QModelIndex unhashable + +1.1.0 (2012-01-02) +------------------ + +Major changes +~~~~~~~~~~~~~ + +- New type converter scheme + +Bug fixes +~~~~~~~~~ + +- 1010 Shiboken Cygwin patch +- 1034 Error compiling PySide with Python 3.2.2 32bit on Windows +- 1040 pyside-uic overwriting attributes before they are being used +- 1053 pyside-lupdate used with .pro files can't handle Windows paths that contain spaces +- 1060 Subclassing of QUiLoader leads to "Internal C++ object already deleted" exception +- 1063 Bug writing to files using "QTextStream + QFile + QTextEdit" on Linux +- 1069 QtCore.QDataStream silently fails on writing Python string +- 1077 Application exit crash when call QSyntaxHighlighter.document() +- 1082 OSX binary links are broken +- 1083 winId returns a PyCObject making it impossible to compare two winIds +- 1084 Crash (segfault) when writing unicode string on socket +- 1091 PixmapFragment and drawPixmapFragments are not bound +- 1095 No examples for shiboken tutorial +- 1097 QtGui.QShortcut.setKey requires QKeySequence +- 1101 Report invalid function signatures in typesystem +- 902 Expose Shiboken functionality through a Python module +- 969 viewOptions of QAbstractItemView error + +1.0.9 (2011-11-29) +------------------ + +Bug fixes +~~~~~~~~~ + +- 1058 Strange code in PySide/QtUiTools/glue/plugins.h +- 1057 valgrind detected "Conditional jump or move depends on uninitialised value" +- 1052 PySideConfig.cmake contains an infinite loop due to missing default for SHIBOKEN_PYTHON_SUFFIX +- 1048 QGridLayout.itemAtPosition() crashes when it should return None +- 1037 shiboken fails to build against python 3.2 (both normal and -dbg) on i386 (and others) +- 1036 Qt.KeyboardModifiers always evaluates to zero +- 1033 QDialog.DialogCode instances and return value from \QDialog.exec_ hash to different values +- 1031 QState.parentState() or QState.machine() causes python crash at exit +- 1029 qmlRegisterType Fails to Increase the Ref Count +- 1028 QWidget winId missing +- 1016 Calling of Q_INVOKABLE method returning not QVariant is impossible... +- 1013 connect to QSqlTableModel.primeInsert() causes crash +- 1012 FTBFS with hardening flags enabled +- 1011 PySide Cygwin patch +- 1010 Shiboken Cygwin patch +- 1009 GeneratorRunner Cygwin patch +- 1008 ApiExtractor Cygwin patch +- 891 ApiExtractor doesn't support doxygen as backend to doc generation. + +1.0.8 (2011-10-21) +------------------ + +Major changes +~~~~~~~~~~~~~ + +- Experimental Python3.2 support +- Qt4.8 beta support + +Bug fixes +~~~~~~~~~ + +- 1022 RuntimeError: maximum recursion depth exceeded while getting the str of an object +- 1019 Overriding QWidget.show or QWidget.hide do not work +- 944 Segfault on QIcon(None).pixmap() + +1.0.7 (2011-09-21) +------------------ + +Bug fixes +~~~~~~~~~ + +- 996 Missing dependencies for QtWebKit in buildscripts for Fedora +- 986 Documentation links +- 985 Provide versioned pyside-docs zip file to help packagers +- 981 QSettings docs should empathize the behavior changes of value() on different platforms +- 902 Expose Shiboken functionality through a Python module +- 997 QDeclarativePropertyMap doesn't work. +- 994 QIODevice.readData must use qmemcpy instead of qstrncpy +- 989 Pickling QColor fails +- 987 Disconnecting a signal that has not been connected +- 973 shouldInterruptJavaScript slot override is never called +- 966 QX11Info.display() missing +- 959 can't pass QVariant to the QtWebkit bridge +- 1006 Segfault in QLabel init +- 1002 Segmentation fault on PySide/Spyder exit +- 998 Segfault with Spyder after switching to another app +- 995 QDeclarativeView.itemAt returns faulty reference. (leading to SEGFAULT) +- 990 Segfault when trying to disconnect a signal that is not connected +- 975 Possible memory leak +- 991 The __repr__ of various types is broken +- 988 The type supplied with currentChanged signal in QTabWidget has changed in 1.0.6 + +1.0.6 (2011-08-22) +------------------ + +Major changes +~~~~~~~~~~~~~ + +- New documentation layout; +- Fixed some regressions from the last release (1.0.5); +- Optimizations during anonymous connection; + +Bug fixes +~~~~~~~~~ + +- 972 anchorlayout.py of graphicsview example raised a unwriteable memory exception when exits +- 953 Segfault when QObject is garbage collected after QTimer.singeShot +- 951 ComponentComplete not called on QDeclarativeItem subclass +- 965 Segfault in QtUiTools.QUiLoader.load +- 958 Segmentation fault with resource files +- 944 Segfault on QIcon(None).pixmap() +- 941 Signals with QtCore.Qt types as arguments has invalid signatures +- 964 QAbstractItemView.moveCursor() method is missing +- 963 What's This not displaying QTableWidget column header information as in Qt Designer +- 961 QColor.__repr__/__str__ should be more pythonic +- 960 QColor.__reduce__ is incorrect for HSL colors +- 950 implement Q_INVOKABLE +- 940 setAttributeArray/setUniformValueArray do not take arrays +- 931 isinstance() fails with Signal instances +- 928 100's of QGraphicItems with signal connections causes slowdown +- 930 Documentation mixes signals and functions. +- 923 Make QScriptValue (or QScriptValueIterator) implement the Python iterator protocol +- 922 QScriptValue's repr() should give some information about its data +- 900 QtCore.Property as decorator +- 895 jQuery version is outdated, distribution code de-duplication breaks documentation search +- 731 Can't specify more than a single 'since' argument +- 983 copy.deepcopy raises SystemError with QColor +- 947 NETWORK_ERR during interaction QtWebKit window with server +- 873 Deprecated methods could emit DeprecationWarning +- 831 PySide docs would have a "Inherited by" list for each class + +1.0.5 (2011-07-22) +------------------ + +Major changes +~~~~~~~~~~~~~ + +- Widgets present on "ui" files are exported in the root widget, check PySide ML thread for more information[1]; +- pyside-uic generate menubars without parent on MacOS plataform; +- Signal connection optimizations; + +Bug fixes +~~~~~~~~~ + +- 892 Segfault when destructing QWidget and QApplication has event filter installed +- 407 Crash while multiple inheriting with QObject and native python class +- 939 Shiboken::importModule must verify if PyImport_ImportModule succeeds +- 937 missing pid method in QProcess +- 927 Segfault on QThread code. +- 925 Segfault when passing a QScriptValue as QObject or when using .toVariant() on a QScriptValue +- 905 QtGui.QHBoxLayout.setMargin function call is created by pyside-uic, but this is not available in the pyside bindings +- 904 Repeatedly opening a QDialog with Qt.WA_DeleteOnClose set crashes PySide +- 899 Segfault with 'QVariantList' Property. +- 893 Shiboken leak reference in the parent control +- 878 Shiboken may generate incompatible modules if a new class is added. +- 938 QTemporaryFile JPEG problem +- 934 A __getitem__ of QByteArray behaves strange +- 929 pkg-config files do not know about Python version tags +- 926 qmlRegisterType does not work with QObject +- 924 Allow QScriptValue to be accessed via [] +- 921 Signals not automatically disconnected on object destruction +- 920 Cannot use same slot for two signals +- 919 Default arguments on QStyle methods not working +- 915 QDeclarativeView.scene().addItem(x) make the x object invalid +- 913 Widgets inside QTabWidget are not exported as members of the containing widget +- 910 installEventFilter() increments reference count on target object +- 907 pyside-uic adds MainWindow.setMenuBar(self.menubar) to the generated code under OS X +- 903 eventFilter in ItemDelegate +- 897 QObject.property() and QObject.setProperty() methods fails for user-defined properties +- 896 QObject.staticMetaObject() is missing +- 916 Missing info about when is possible to use keyword arguments in docs [was: QListWidgetItem's constructor ignores text parameter] +- 890 Add signal connection example for valueChanged(int) on QSpinBox to the docs +- 821 Mapping interface for QPixmapCache +- 909 Deletion of QMainWindow/QApplication leads to segmentation fault diff --git a/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/INSTALLER b/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/INSTALLER new file mode 100644 index 00000000000..a1b589e38a3 --- /dev/null +++ b/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/METADATA b/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/METADATA new file mode 100644 index 00000000000..d212f9895c0 --- /dev/null +++ b/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/METADATA @@ -0,0 +1,596 @@ +Metadata-Version: 2.0 +Name: PySide +Version: 1.2.4 +Summary: Python bindings for the Qt cross-platform application and UI framework +Home-page: http://www.pyside.org +Author: PySide Team +Author-email: contact@pyside.org +License: LGPL +Download-URL: https://download.qt-project.org/official_releases/pyside/ +Keywords: Qt +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Environment :: MacOS X +Classifier: Environment :: X11 Applications :: Qt +Classifier: Environment :: Win32 (MS Windows) +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL) +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: POSIX +Classifier: Operating System :: POSIX :: Linux +Classifier: Operating System :: Microsoft +Classifier: Operating System :: Microsoft :: Windows +Classifier: Programming Language :: C++ +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Topic :: Database +Classifier: Topic :: Software Development +Classifier: Topic :: Software Development :: Code Generators +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Classifier: Topic :: Software Development :: User Interfaces +Classifier: Topic :: Software Development :: Widget Sets + +====== +PySide +====== + +.. image:: https://img.shields.io/pypi/wheel/pyside.svg + :target: https://pypi.python.org/pypi/PySide/ + :alt: Wheel Status + +.. image:: https://img.shields.io/pypi/dm/pyside.svg + :target: https://pypi.python.org/pypi/PySide/ + :alt: Downloads + +.. image:: https://img.shields.io/pypi/v/pyside.svg + :target: https://pypi.python.org/pypi/PySide/ + :alt: Latest Version + +.. image:: https://binstar.org/asmeurer/pyside/badges/license.svg + :target: https://pypi.python.org/pypi/PySide/ + :alt: License + +.. image:: https://readthedocs.org/projects/pip/badge/ + :target: https://pyside.readthedocs.org + +.. contents:: **Table of Contents** + :depth: 2 + +Introduction +============ + +PySide is the Python Qt bindings project, providing access the complete Qt 4.8 framework +as well as to generator tools for rapidly generating bindings for any C++ libraries. + +The PySide project is developed in the open, with all facilities you'd expect +from any modern OSS project such as all code in a git repository, an open +Bugzilla for reporting bugs, and an open design process. We welcome +any contribution without requiring a transfer of copyright. + +The PySide documentation is hosted at `http://pyside.github.io/docs/pyside/ +`_. + +Compatibility +============= + +PySide requires Python 2.6 or later and Qt 4.6 or better. + +.. note:: + + Qt 5.x is currently not supported. + +Installation +============ + +Installing prerequisites +------------------------ + +Install latest ``pip`` distribution: download `get-pip.py +`_ and run it using +the ``python`` interpreter. + +Installing PySide on a Windows System +------------------------------------- + +To install PySide on Windows you can choose from the following options: + +#. Use pip to install the ``wheel`` binary packages: + + :: + + pip install -U PySide + +#. Use setuptools to install the ``egg`` binary packages (deprecated): + + :: + + easy_install -U PySide + +.. note:: + + Provided binaries are without any other external dependencies. + All required Qt libraries, development tools and examples are included. + + +Installing PySide on a Mac OS X System +-------------------------------------- + +You need to install or build Qt 4.8 first, see the `Qt Project Documentation +`_. + +Alternatively you can use `Homebrew `_ and install Qt with + +:: + + $ brew install qt + +To install PySide on Mac OS X you can choose from the following options: + +#. Use pip to install the ``wheel`` binary packages: + + :: + + $ pip install -U PySide + + +Installing PySide on a Linux System +----------------------------------- + +We do not provide binaries for Linux. Please read the build instructions in section +`Building PySide on a Linux System +`_. + + +Building PySide +=============== + +- `Building PySide on a Windows System `_. + +- `Building PySide on a Mac OS X System `_. + +- `Building PySide on a Linux System `_. + + +Feedback and getting involved +============================= + +- Mailing list: http://lists.qt-project.org/mailman/listinfo/pyside +- Issue tracker: https://bugreports.qt-project.org/browse/PYSIDE +- Code Repository: http://qt.gitorious.org/pyside + + +Changes +======= + +1.2.4 (2015-10-14) +------------------ + +Complete list of changes and bug fixes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +PySide-setup +************ + +- Make sure that setup.py is run with an allowed python version + +1.2.3 (2015-10-12) +------------------ + +Complete list of changes and bug fixes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +PySide +****** + +- Fix PYSIDE-164: Fix possible deadlock on signal connect/emit + +Shiboken +******** + +- Don't ignore classes in topology +- Process global enums in declaration order +- Return enums in declaration order (order added) + +PySide-setup +************ + +- On Linux and MacOS systems there is no more need to call the post-install script + +1.2.2 (2014-04-24) +------------------ + +Complete list of changes and bug fixes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +PySide +****** + +- Fix PYSIDE-190: QCoreApplication would deadlock on exit if the global + QThreadPool.globalInstance() is running a QRunnable with python code +- Change GlobalReceiver to explicitly 'use' [dis]connectNotify of the base + class in order to avoid hiding these with its own overloads. +- Add explicit casts when initializing an int[] using {}'s, as required + by C++11 to be "well formed" +- Fix PYSIDE-172: multiple rules for file +- Use file system encoding instead of assumed 'ascii' when registering + qt.conf in Qt resource system + +Shiboken +******** + +- Remove rejection lines that cause the sample_list test to fail +- Remove protected from samblebinding test +- Add parsing of 'noexcept' keyword +- Fix function rejections (i.e. support overloads) +- Fix building with python 3.3 and 3.4 +- Doc: Stop requiring sphinx.ext.refcounting with Sphinx 1.2+ +- Fix for containers with 'const' values +- Fix compilation issue on OS X 10.9 +- Only use fields in PyTypeObject when defining types +- Fix buffer overrun processing macro definitions +- Fix 'special' include handling +- Fix finding container base classes +- Refactor and improve added function resolving +- Work around MSVC's deficient in libsample/transform.cpp +- Fix description of sample/transform unit test +- Change wrapping and indent of some code in Handler::startElement to + improve consistency +- Fix '%#' substitution for # > 9 +- Improve dependencies for tests + +1.2.1 (2013-08-16) +------------------ + +Major changes +~~~~~~~~~~~~~ + +PySide +****** + +- In memory qt.conf generation and registration + +Shiboken +******** + +- Better support for more than 9 arguments to methods +- Avoiding a segfault when getting the .name attribute on an enum value with no name + +PySide-setup +************ + +- Switched to the new setuptools (v0.9.8) which has been merged with Distribute again and works for Python 2 and 3 with one codebase +- Support for building windows binaries with only Windows SDK installed (Visual Studio is no more required) +- Removed --msvc-version option. Required msvc compiler version is now resolved from python interpreter version + +1.2.0 (2013-07-02) +------------------ + +Major changes +~~~~~~~~~~~~~ + +PySide +****** + +- Fix multiple segfaults and better track the life time of Qt objects +- Fix multiple memory leaks + +Shiboken +******** + +- Install the shiboken module to site-packages +- Fix multiple segfaults + +PySide-setup +************ + +- On Windows system, when installing PySide binary distribution via easy_install, + there is no more need to call the post-install script +- Support for building windows binaries outside of Visual Studio command prompt +- Build and package the shiboken docs when sphinx is installed + +Complete list of changes and bug fixes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +PySide +****** + +- Set up PYTHONPATH for tests correctly +- Fix potential segfault at shutdown +- Fix PYSIDE-61 +- Tell Qt to look for qml imports in the PySide package +- fix build in C++11 mode +- Fix QByteArray memory leak +- Ignore QtCore import errors when initializing plugins folder +- Preload OpenSSL DLLs on Windows. +- Look first in the PySide package for Qt's plugins folder, instead of just in Qt's install or build folder +- Add explicit type conversion to fix mingw compile error +- Use QObject property to invalidate wrapper before deletion +- Invalidate metaObject wrapper before deletion +- Fix reference leak on convertion from a C++ map type to Python dict +- Change the order of pysitetest and signals directories because signals/disconnect_test.py depends on pysidetest module + +Shiboken +******** + +- Removed old logos from html docs +- Add missing return on module init error +- Don't break -Werror=non-virtual-dtor +- Fixing shiboken test for minimal binding test +- Decref reference to type object +- Fix segfault when using shiboken.delete +- Use non-static method def for instance methods +- Fix bug introduced when recursive_invalidate was added +- fix build in C++11 mode +- Prevent infinite recursion in invalidate +- Fix possible conflict with garbage collector +- Fix possible crash at exit +- Fix handling of unsigned long long and provide unittests +- Add test to illustrate issue on typedef enum +- Use getWrapperForQObject to convert if generating for PySide +- Allow compilation without a python shared library +- Use parent class's metaObject if wrapper is NULL +- Optionally assert on free'd pointer with a valid wrapper +- Find python3 libraries when built with pydebug enabled +- Fix PYSIDE-108 bug and add example +- PYSIDE-83 Fix segfault calling shiboken.dump +- Fix and test case for bug PYSIDE-72 +- Override all functions with the same name, not just one +- Update vector conversion +- Add typedef examples to minimal +- Add test files back to cmake +- Don't use it->second after erasing it +- Find function modifications defined in the 2nd+ base class. Fixes bug PYSIDE-54. +- Set a default hash function for all ObjectTypes. Fix bug PYSIDE-42. +- Fix compilation when there is no libxslt installed on the system. +- Fixed resolving of SOABI. SOABI is implemented on Linux, but not on Windows +- Don't use inline methods in dllexported classes to keep VC++ happy +- Use SpooledTemporaryFile in 2.6+ os.tmpfile() fails on win32 if process doesn't have admin permissions + +PySide-setup +************ + +- Support for building windows binaries outside of Visual Studio command prompt +- Build and package the shiboken docs when sphinx is installed +- Support Ubuntu 13.04 and Fedora 18 +- Fixed "develop" setuptools command +- Documentation updates +- Add --build-tests option to enable building the tests +- Add --jom and --jobs options +- Add --no-examples option to exclude the examples +- Add --relwithdebinfo option to enable a release-with-debug-info build mode +- Add --ignore-git option +- Add --make-spec option to specify make generator + +1.1.2 (2012-08-28) +------------------ + +Bug fixes +~~~~~~~~~ + +- During signal emission don't get return type after callback +- Invalidate QStandardModel::invisibleRootItem in clear() method +- QAbstractItemModel has wrong ownership policy for selectionModel() +- Improved QVector to python conversion +- Disable docstring generation if tools aren't found. +- Fixed some issues compiling PySide using VC++ +- Install the shiboken module to site-packages +- Fix compilation when there is no libxslt installed on the system. +- Set a default hash function for all ObjectTypes. +- Fix segfault calling shiboken.dump + +1.1.1 (2012-04-19) +------------------ + +Major changes +~~~~~~~~~~~~~ + +- Unified toolchain! No more GeneratorRunner and ApiExtractor, now you just need Shiboken to compile PySide. + +Bug fixes +~~~~~~~~~ + +- 1105 Spyder fails with HEAD +- 1126 Segfault when exception is raised in signalInstanceDisconnect +- 1135 SIGSEGV when loading custom widget using QUiLoader when overriding createWidget() +- 1041 QAbstractItemModel has wrong ownership policy for selectionModel() +- 1086 generatorrunner segfault processing #include +- 1110 Concurrency error causes GC heap corruption +- 1113 Instantiating QObject in user-defined QML element's constructor crashes if instantiated from QML +- 1129 Segmentation fault on close by QStandardItem/QStandardItemModel +- 1104 QSettings has problems with long integers +- 1108 tests/QtGui/pyside_reload_test.py fails when bytecode writing is disabled +- 1138 Subclassing of QUiLoader leads to "Internal C++ object already deleted" exception (again) +- 1124 QPainter.drawPixmapFragments should take a list as first argument +- 1065 Invalid example in QFileDialog documentation +- 1092 shiboken names itself a 'generator' +- 1094 shiboken doesn't complain about invalid options +- 1044 Incorrect call to parent constructor in example +- 1139 Crash at exit due to thread state (tstate) being NULL +- PYSIDE-41 QModelIndex unhashable + +1.1.0 (2012-01-02) +------------------ + +Major changes +~~~~~~~~~~~~~ + +- New type converter scheme + +Bug fixes +~~~~~~~~~ + +- 1010 Shiboken Cygwin patch +- 1034 Error compiling PySide with Python 3.2.2 32bit on Windows +- 1040 pyside-uic overwriting attributes before they are being used +- 1053 pyside-lupdate used with .pro files can't handle Windows paths that contain spaces +- 1060 Subclassing of QUiLoader leads to "Internal C++ object already deleted" exception +- 1063 Bug writing to files using "QTextStream + QFile + QTextEdit" on Linux +- 1069 QtCore.QDataStream silently fails on writing Python string +- 1077 Application exit crash when call QSyntaxHighlighter.document() +- 1082 OSX binary links are broken +- 1083 winId returns a PyCObject making it impossible to compare two winIds +- 1084 Crash (segfault) when writing unicode string on socket +- 1091 PixmapFragment and drawPixmapFragments are not bound +- 1095 No examples for shiboken tutorial +- 1097 QtGui.QShortcut.setKey requires QKeySequence +- 1101 Report invalid function signatures in typesystem +- 902 Expose Shiboken functionality through a Python module +- 969 viewOptions of QAbstractItemView error + +1.0.9 (2011-11-29) +------------------ + +Bug fixes +~~~~~~~~~ + +- 1058 Strange code in PySide/QtUiTools/glue/plugins.h +- 1057 valgrind detected "Conditional jump or move depends on uninitialised value" +- 1052 PySideConfig.cmake contains an infinite loop due to missing default for SHIBOKEN_PYTHON_SUFFIX +- 1048 QGridLayout.itemAtPosition() crashes when it should return None +- 1037 shiboken fails to build against python 3.2 (both normal and -dbg) on i386 (and others) +- 1036 Qt.KeyboardModifiers always evaluates to zero +- 1033 QDialog.DialogCode instances and return value from \QDialog.exec_ hash to different values +- 1031 QState.parentState() or QState.machine() causes python crash at exit +- 1029 qmlRegisterType Fails to Increase the Ref Count +- 1028 QWidget winId missing +- 1016 Calling of Q_INVOKABLE method returning not QVariant is impossible... +- 1013 connect to QSqlTableModel.primeInsert() causes crash +- 1012 FTBFS with hardening flags enabled +- 1011 PySide Cygwin patch +- 1010 Shiboken Cygwin patch +- 1009 GeneratorRunner Cygwin patch +- 1008 ApiExtractor Cygwin patch +- 891 ApiExtractor doesn't support doxygen as backend to doc generation. + +1.0.8 (2011-10-21) +------------------ + +Major changes +~~~~~~~~~~~~~ + +- Experimental Python3.2 support +- Qt4.8 beta support + +Bug fixes +~~~~~~~~~ + +- 1022 RuntimeError: maximum recursion depth exceeded while getting the str of an object +- 1019 Overriding QWidget.show or QWidget.hide do not work +- 944 Segfault on QIcon(None).pixmap() + +1.0.7 (2011-09-21) +------------------ + +Bug fixes +~~~~~~~~~ + +- 996 Missing dependencies for QtWebKit in buildscripts for Fedora +- 986 Documentation links +- 985 Provide versioned pyside-docs zip file to help packagers +- 981 QSettings docs should empathize the behavior changes of value() on different platforms +- 902 Expose Shiboken functionality through a Python module +- 997 QDeclarativePropertyMap doesn't work. +- 994 QIODevice.readData must use qmemcpy instead of qstrncpy +- 989 Pickling QColor fails +- 987 Disconnecting a signal that has not been connected +- 973 shouldInterruptJavaScript slot override is never called +- 966 QX11Info.display() missing +- 959 can't pass QVariant to the QtWebkit bridge +- 1006 Segfault in QLabel init +- 1002 Segmentation fault on PySide/Spyder exit +- 998 Segfault with Spyder after switching to another app +- 995 QDeclarativeView.itemAt returns faulty reference. (leading to SEGFAULT) +- 990 Segfault when trying to disconnect a signal that is not connected +- 975 Possible memory leak +- 991 The __repr__ of various types is broken +- 988 The type supplied with currentChanged signal in QTabWidget has changed in 1.0.6 + +1.0.6 (2011-08-22) +------------------ + +Major changes +~~~~~~~~~~~~~ + +- New documentation layout; +- Fixed some regressions from the last release (1.0.5); +- Optimizations during anonymous connection; + +Bug fixes +~~~~~~~~~ + +- 972 anchorlayout.py of graphicsview example raised a unwriteable memory exception when exits +- 953 Segfault when QObject is garbage collected after QTimer.singeShot +- 951 ComponentComplete not called on QDeclarativeItem subclass +- 965 Segfault in QtUiTools.QUiLoader.load +- 958 Segmentation fault with resource files +- 944 Segfault on QIcon(None).pixmap() +- 941 Signals with QtCore.Qt types as arguments has invalid signatures +- 964 QAbstractItemView.moveCursor() method is missing +- 963 What's This not displaying QTableWidget column header information as in Qt Designer +- 961 QColor.__repr__/__str__ should be more pythonic +- 960 QColor.__reduce__ is incorrect for HSL colors +- 950 implement Q_INVOKABLE +- 940 setAttributeArray/setUniformValueArray do not take arrays +- 931 isinstance() fails with Signal instances +- 928 100's of QGraphicItems with signal connections causes slowdown +- 930 Documentation mixes signals and functions. +- 923 Make QScriptValue (or QScriptValueIterator) implement the Python iterator protocol +- 922 QScriptValue's repr() should give some information about its data +- 900 QtCore.Property as decorator +- 895 jQuery version is outdated, distribution code de-duplication breaks documentation search +- 731 Can't specify more than a single 'since' argument +- 983 copy.deepcopy raises SystemError with QColor +- 947 NETWORK_ERR during interaction QtWebKit window with server +- 873 Deprecated methods could emit DeprecationWarning +- 831 PySide docs would have a "Inherited by" list for each class + +1.0.5 (2011-07-22) +------------------ + +Major changes +~~~~~~~~~~~~~ + +- Widgets present on "ui" files are exported in the root widget, check PySide ML thread for more information[1]; +- pyside-uic generate menubars without parent on MacOS plataform; +- Signal connection optimizations; + +Bug fixes +~~~~~~~~~ + +- 892 Segfault when destructing QWidget and QApplication has event filter installed +- 407 Crash while multiple inheriting with QObject and native python class +- 939 Shiboken::importModule must verify if PyImport_ImportModule succeeds +- 937 missing pid method in QProcess +- 927 Segfault on QThread code. +- 925 Segfault when passing a QScriptValue as QObject or when using .toVariant() on a QScriptValue +- 905 QtGui.QHBoxLayout.setMargin function call is created by pyside-uic, but this is not available in the pyside bindings +- 904 Repeatedly opening a QDialog with Qt.WA_DeleteOnClose set crashes PySide +- 899 Segfault with 'QVariantList' Property. +- 893 Shiboken leak reference in the parent control +- 878 Shiboken may generate incompatible modules if a new class is added. +- 938 QTemporaryFile JPEG problem +- 934 A __getitem__ of QByteArray behaves strange +- 929 pkg-config files do not know about Python version tags +- 926 qmlRegisterType does not work with QObject +- 924 Allow QScriptValue to be accessed via [] +- 921 Signals not automatically disconnected on object destruction +- 920 Cannot use same slot for two signals +- 919 Default arguments on QStyle methods not working +- 915 QDeclarativeView.scene().addItem(x) make the x object invalid +- 913 Widgets inside QTabWidget are not exported as members of the containing widget +- 910 installEventFilter() increments reference count on target object +- 907 pyside-uic adds MainWindow.setMenuBar(self.menubar) to the generated code under OS X +- 903 eventFilter in ItemDelegate +- 897 QObject.property() and QObject.setProperty() methods fails for user-defined properties +- 896 QObject.staticMetaObject() is missing +- 916 Missing info about when is possible to use keyword arguments in docs [was: QListWidgetItem's constructor ignores text parameter] +- 890 Add signal connection example for valueChanged(int) on QSpinBox to the docs +- 821 Mapping interface for QPixmapCache +- 909 Deletion of QMainWindow/QApplication leads to segmentation fault diff --git a/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/RECORD b/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/RECORD new file mode 100644 index 00000000000..9ce715f73ed --- /dev/null +++ b/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/RECORD @@ -0,0 +1,1292 @@ +../../Scripts/pyside-uic.exe,sha256=Bw291KuRi9yQRGcF5mOIe48NTu0WhmiAOj1VX7flbhk,103260 +PySide-1.2.4.dist-info/DESCRIPTION.rst,sha256=fTdnver_GJviAybz0YM74a-cSmz8swbzS7-ihdtfTzg,19867 +PySide-1.2.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +PySide-1.2.4.dist-info/METADATA,sha256=OUwoti8DhIXcmIWbp5qgFFbBDJQPSaUee06qFgopmDk,22146 +PySide-1.2.4.dist-info/RECORD,, +PySide-1.2.4.dist-info/WHEEL,sha256=_facTcPqhbpP_1DzoP9XARwqpr0IjwwKGxYF35-lwDs,105 +PySide-1.2.4.dist-info/entry_points.txt,sha256=JjGDSMNmkWDMCF3PWE5WePDZCd4U68CvnhmE-uuSg0w,56 +PySide-1.2.4.dist-info/metadata.json,sha256=u3eu8oLu5fWbKnJy_j0Eup2nT4QzQdtmX_bTOtsKJ0U,1815 +PySide-1.2.4.dist-info/top_level.txt,sha256=jqC-chpjCHb124c4dkuJDx6Y0u3nBACLC6kni5CxZb4,24 +PySide/Qt3Support4.dll,sha256=OqDjI4engULvpwWGcstBpqJSDGZ5MtT3230O1sVmiFk,2992128 +PySide/QtCLucene4.dll,sha256=6XeDQCIkdEu721iQ-Oo_I3I5ht1ug55YVpj_J2qTCR8,1263616 +PySide/QtCore.pyd,sha256=FgEmYt3KETwfUBQPng070pClEQFXZ0dc82LlJndg8GI,2293248 +PySide/QtCore4.dll,sha256=eq6oWIVZJp_rhJXt4Ts6bJXp2YF-X5INgFAyVT4u5Es,3251200 +PySide/QtDeclarative.pyd,sha256=G2Tqx3v35hK8wXUJbMcMIy5ZgV1oJclSH8FULH84ap8,334336 +PySide/QtDeclarative4.dll,sha256=E9LWPdP2yv8gHFMuggMQh5k_saHr17HZDqbl6BNoXk4,3328512 +PySide/QtDesigner4.dll,sha256=DKTdXpWLCWTs9Y6hdMoa3QeFXYH01fN0qgu5OCG0EAQ,5481472 +PySide/QtDesignerComponents4.dll,sha256=4b_fBPi2fzk3njCGdIOtAlAjtDCAP-RADZqXVeSmKK8,2445824 +PySide/QtGui.pyd,sha256=jNxHXUaaExIrxLxsOsHCFdk9XxIPXMHvM6jzCI7lTY4,8678912 +PySide/QtGui4.dll,sha256=7g6ZZycvReYpSw-rJKBvPhY7XFKK_PxgwzPZvYfjzX0,10889216 +PySide/QtHelp.pyd,sha256=GUicotZV5cEfUULNcdumFH17fqX8-mg1eKeici9PBMY,180736 +PySide/QtHelp4.dll,sha256=gCriBFcEf6CCbYxTwba9bqukGXyb8wtq8DoNCvh8hwE,569856 +PySide/QtMultimedia.pyd,sha256=EqfyqJzdZk7yan4mlEwf0JIxZoTBehqEplaImfizbCs,278528 +PySide/QtMultimedia4.dll,sha256=IPkf4eYNvraJ7717XW1qxcWlwTcVLwW3rUpqUYGhjvE,141312 +PySide/QtNetwork.pyd,sha256=g__64BSVbbafrcyNwVbFKdJlpgw7GV3AA3VFMeW16v0,807936 +PySide/QtNetwork4.dll,sha256=nroxbsr8tpnvJldwBEkRVDQRcqK8LuysPywE2aGmkPE,1363968 +PySide/QtOpenGL.pyd,sha256=wWtme7HxACrvQ1--yD3_fextDPbmiAibBdSp5JFTymU,334848 +PySide/QtOpenGL4.dll,sha256=zpSTUULt4v86h3XYmVCVpf2Sodm9JcMXw65Kn2M49tE,920576 +PySide/QtScript.pyd,sha256=uN94uYoXe4TsSvfES-Ko4uDXIEujw0iHBWSCTqacNbM,261120 +PySide/QtScript4.dll,sha256=Z2FKzqf2txUg-amjfTkeAel9pvoifp_1pkoe3qq1s_E,1526784 +PySide/QtScriptTools.pyd,sha256=61RQet3uAavWuGPQjd5vjFDktUIEvhll6Xyp-QoAzIY,51712 +PySide/QtScriptTools4.dll,sha256=egNTmUyXARcXTQlxLjcowt5Eku-csV5p7e-e6ppXMhQ,726528 +PySide/QtSql.pyd,sha256=sYfREy5-s8JGBoWAu5xtuZWBlFRZwuoItJJjQE_RuR8,453632 +PySide/QtSql4.dll,sha256=53XlKtCvxwffkRb0RqDw50tIcrCgedUjskuXaKKTfuo,254976 +PySide/QtSvg.pyd,sha256=zMROzcxprxNsfktARYuyv1WEfTamOH7K-v0mYiGjQG0,151552 +PySide/QtSvg4.dll,sha256=gdo67WEyURoZF6v0ERqUx-5lIB4jG-mb0FP-R7wSCfM,352768 +PySide/QtTest.pyd,sha256=Yg1fy58tFjE3G8hThRVwK-jWBhZsESfyvLs2RSqk9mQ,88576 +PySide/QtTest4.dll,sha256=-JAzmb_8Kn1w0GPMtHymPUzwD-JPOdBTRjimPwG8gZg,131072 +PySide/QtUiTools.pyd,sha256=vrlKRijefxpa56IXndLNKTRuJ1_krtMb5IIAUNLONro,758272 +PySide/QtWebKit.pyd,sha256=YnWU9qh3nljPEt6pYbOma2g0hwigxmdtmuxtj1GkPms,512512 +PySide/QtWebKit4.dll,sha256=zVc87q_Kba8n1eWLt9U-As04ef_x5f6x0OIHn7ealAo,17458688 +PySide/QtXml.pyd,sha256=0az9rsvEPfy6DBKHug4pwO8OLTdpUmmyUF127FMbi3Y,427520 +PySide/QtXml4.dll,sha256=KLSimJfYxFr3K8e-ChhrPWLa-8obDsauUxbqZCnymHY,468480 +PySide/QtXmlPatterns.pyd,sha256=iU7mk6M40aG6B_qB7_ctkJFE41zgM9NoVXn05iDGJ6g,228864 +PySide/QtXmlPatterns4.dll,sha256=mvM5hvszW2UNMOzmq396uD3IZeiTQuFMCPlpvb1amX8,3722752 +PySide/__init__.py,sha256=9i1Uw9uGh-M1l36BilWFLMTN3WvDd1esRcW53fQYPJY,1538 +PySide/__init__.pyc,, +PySide/_utils.py,sha256=Mxrj7EQNIgD1KWbtjQvhEgmTnm9a8q8S26GnVnqrlW4,9443 +PySide/_utils.pyc,, +PySide/designer.exe,sha256=mEXz7CtvyAhXLQzrq_qiH_lPAAZhMHz6z65E7YvnE3o,875008 +PySide/docs/shiboken/.buildinfo,sha256=Yvg9DcD_6sLYDL8Eg6GmAPu0-VFezDjSuph174fSWOA,234 +PySide/docs/shiboken/.doctrees/codeinjectionsemantics.doctree,sha256=GhwXMva4upyQU4JU8dKvXWbVzK1tERXQCkAmVt2_bl0,65031 +PySide/docs/shiboken/.doctrees/commandlineoptions.doctree,sha256=viPhkUuysqV7nrXp8_BetDn3mLSRjfj-MHDw6OwiFAI,26955 +PySide/docs/shiboken/.doctrees/contents.doctree,sha256=QaeG0FX4OrvCbgR1aLJMEmwVtgl_zM24pI6depXmEq8,3291 +PySide/docs/shiboken/.doctrees/environment.pickle,sha256=h9iJErwqsJ91d9x84OGhvxoz3QmFVR1VmDRHwQY-_go,38158 +PySide/docs/shiboken/.doctrees/faq.doctree,sha256=4UIp2sJXn6nPG0EkRHUaDxOrLdLRiSrnGQwOmP_aLLY,12507 +PySide/docs/shiboken/.doctrees/overview.doctree,sha256=pJSltzF3WngAa_BHysxYpALvfEkawZsZMR6TT0Vi8ZU,9805 +PySide/docs/shiboken/.doctrees/ownership.doctree,sha256=TUQwFS2zW1fYlrW4v8WWoq7iOOAg6dWiVETWIap0BOQ,28038 +PySide/docs/shiboken/.doctrees/projectfile.doctree,sha256=5w49hRnRiWMAr5t7_3I7jKvdhOa5MCQ1FyQs0ofNRxk,10150 +PySide/docs/shiboken/.doctrees/sequenceprotocol.doctree,sha256=QUi940lolZv_vNiMAl_8JpYy7Mo8X1FwbD0UBZ9DoG0,12552 +PySide/docs/shiboken/.doctrees/shibokenmodule.doctree,sha256=TrxD66kG9HmUbLfcvHYA05t_neHqiO2Ojojiq9vvNzc,23337 +PySide/docs/shiboken/.doctrees/typeconverters.doctree,sha256=erHVMgGrHGQ4w9Jh8IB1tH1S_6EBevDtAfk_Tm8Xi4A,39189 +PySide/docs/shiboken/.doctrees/typesystemvariables.doctree,sha256=2YFl4MeWHfkoQuVxf-QEavXh7UY_6rdONoWjaXYoNtY,53101 +PySide/docs/shiboken/.doctrees/wordsofadvice.doctree,sha256=x1hHw0bDzZ8nxCZaxOCz8V1WGkDs43JBPiY2OlADZEY,14839 +PySide/docs/shiboken/_images/bindinggen-development.png,sha256=QXKmKQ4FhQ9RXXLbjdNbRRiZEqi8WyR-hH5La5fdaKk,34333 +PySide/docs/shiboken/_images/boostqtarch.png,sha256=EpNM3PAUUC59KJDfmmrxqGEYmk-HrxXlTmuWa2xGPhY,34257 +PySide/docs/shiboken/_images/converter.png,sha256=BrFGZ24nJCrEtUJcTdSpikBZs_wHrnqCLczokjvFfsM,37485 +PySide/docs/shiboken/_sources/codeinjectionsemantics.txt,sha256=D8Cn_YKuCea5-AeBS9XLSqqM4nb-AyVXEa0KPe6WuIs,18126 +PySide/docs/shiboken/_sources/commandlineoptions.txt,sha256=dRTB4Jnwf5VKU1oyVZ_h_bhM8qu_gKzv2H-cSMfIEgE,2365 +PySide/docs/shiboken/_sources/contents.txt,sha256=Ub9P-dVYOfXV_VXUucWuC6Vb3YC1uwI1u9-rNT3Yl7A,345 +PySide/docs/shiboken/_sources/faq.txt,sha256=LK5cQQveybDXJLo9eBCEBgQvwBPxVX54LQ8b1VT52HY,2371 +PySide/docs/shiboken/_sources/overview.txt,sha256=EXfNX7rIdHeVeXh8M8KftVVDw1ag10KVSSsGK2eHSuk,1560 +PySide/docs/shiboken/_sources/ownership.txt,sha256=UP9sbDhjiKwBvuwXUKWOOGirIEWNzX6m32BLGfO6mYY,6169 +PySide/docs/shiboken/_sources/projectfile.txt,sha256=D2JYrpIJ5J3_nbelBo-unxClyuktTJ3T5YEglsQZQM4,1877 +PySide/docs/shiboken/_sources/sequenceprotocol.txt,sha256=zGvYJMvwVeCQTZX6W61hKXmssLzchRVtQw3akqdUYpE,1774 +PySide/docs/shiboken/_sources/shibokenmodule.txt,sha256=KrEhzd0nbAyBLNUoJP1KZ-nvwvnSWE--fP37kvCiQ3w,2759 +PySide/docs/shiboken/_sources/typeconverters.txt,sha256=_1JBLeuCgNU8-tTB02bzXVbL3u0jBTqmSa5g2eIPi7o,10363 +PySide/docs/shiboken/_sources/typesystemvariables.txt,sha256=EvsUkKw6VZUG7tyDFvSHbqeN15kxTTFZtL6hbQku7-U,9579 +PySide/docs/shiboken/_sources/wordsofadvice.txt,sha256=je20ZjCXbGYSSHg4_HP2Ddd3aDDhUvyIHWq_Jgm68Yw,3582 +PySide/docs/shiboken/_static/ajax-loader.gif,sha256=XQRf2ZHd8rII3ZvzmlkfUObseTQW4oZ_VOjGx-ibaMI,673 +PySide/docs/shiboken/_static/basic.css,sha256=InUzVhHSSFOlXqkcrMdVgnQe3KF5PdrwFtLnFbZwKYk,9490 +PySide/docs/shiboken/_static/bg_header.png,sha256=uu5k2IVjwu9KyfvggVjkhSyyoFzoBFuNPliFU28o1WA,36012 +PySide/docs/shiboken/_static/bg_topo.jpg,sha256=rIyp1N6oIOXCqAzQiojrHXLw65A4ao_eMw3jXgRehu8,14237 +PySide/docs/shiboken/_static/classic.css,sha256=Rst0bLKJXDZn9pyXqPK07R_Cq3poTqllKKxUe_0VU5k,4125 +PySide/docs/shiboken/_static/comment-bright.png,sha256=-_BQwqKObO5X0MyWETcZUVGZRt1Jl_4W8i5WRQNLqas,3500 +PySide/docs/shiboken/_static/comment-close.png,sha256=PqMgBD42fWZRbLZvF1oBXGQZm0SvQJuD2RIJAZ7pxTA,3578 +PySide/docs/shiboken/_static/comment.png,sha256=0-sku1CcvGvJh9nuLfmNq5FQkxqv4CBG8EDdBCdk5gU,3445 +PySide/docs/shiboken/_static/default.css,sha256=yWFu_kMxiYiRZUSL8cBqukBz9CHPdfVxvZDQtFR4mi4,4040 +PySide/docs/shiboken/_static/doctools.js,sha256=sj95VrO8TPxGbunfHZ9bs-_zG_U18FItZnsLJQLGQrU,7377 +PySide/docs/shiboken/_static/down-pressed.png,sha256=BSMo2SI60qUROu6r20e-pxHYk8b6IwRP15lJChodGPo,347 +PySide/docs/shiboken/_static/down.png,sha256=AEIexs3rZ4kjpc8r9K28UUa6xr-9iqrPe6tAKZmDaGo,347 +PySide/docs/shiboken/_static/fakebar.png,sha256=cxTA1VTC59WgfHfmbq56Y_-LBrqip5FW_c7MBwlkVGg,101 +PySide/docs/shiboken/_static/file.png,sha256=CAZU3F-uNby5iZmzIF72mY1HS_v3tMnC2A7vyHtuCxY,358 +PySide/docs/shiboken/_static/jquery-1.11.1.js,sha256=MCmDSoIMecFUw3f1LicZ_D_yonYAoHrgiep_3pCH9rw,282766 +PySide/docs/shiboken/_static/jquery.js,sha256=VAvG3sHdS5LqTT-5A_aeq_bZGa_Uj04xKxY8KM_w9EE,95786 +PySide/docs/shiboken/_static/logo_python.jpg,sha256=HAYHa6SM2FnLr107sZwZh-lOOOT8M-XDlfUCQhlrEAA,2660 +PySide/docs/shiboken/_static/logo_qt.png,sha256=ryWDll9WQROrDyMKuGBSBO3HOi68ma5KiO3QxDVJ9No,4618 +PySide/docs/shiboken/_static/minus.png,sha256=8CtZIFPmZzNCzwsMt32bAifH8RAT99ipRFzXafHndc4,173 +PySide/docs/shiboken/_static/plus.png,sha256=PEbCTkIIwV1DUYo6SzNMda1eElNOnR0rgUudBezTG1Y,173 +PySide/docs/shiboken/_static/pygments.css,sha256=ztWgHUAeX6gi0Mk2OYvoebQqK72JnYvbmPVRiHEdYes,4053 +PySide/docs/shiboken/_static/pysidedocs.css,sha256=YM9YAKHteCv79bMDvQ7toiS9M3riMhWvH_QknDeyQps,8205 +PySide/docs/shiboken/_static/pysidelogo.png,sha256=VVmX-n7Y5fijM7WivXB1AS1jRS4ScgGgsT72Or6m5ps,12969 +PySide/docs/shiboken/_static/relbar_bg.png,sha256=dubfPns0yS0V8bFPsknEIwA9YjTE9dwIlDWigyoFx-I,130 +PySide/docs/shiboken/_static/searchtools.js,sha256=xq1PFmiJHNx_e5nA9_RP0k3-TPnB-ARs-U8BF268V44,17880 +PySide/docs/shiboken/_static/sidebar.js,sha256=zoL4PWrt3Jou2Rfw5aNReauu7U1nI9toeLNWttr1KYQ,4803 +PySide/docs/shiboken/_static/underscore-1.3.1.js,sha256=-AjwqjL76Q-5ychGkX-v8_3U4jbChLdsAt0zdT3JAXc,35168 +PySide/docs/shiboken/_static/underscore.js,sha256=Qtj60TvCj8cmd1GW7Jq5U_6_m94XXFhFEoNhyVP6F_Q,12140 +PySide/docs/shiboken/_static/up-pressed.png,sha256=MUdXddNknzf1atF1t9XUcHQF-dCSnO4vNFh6-mKLuf0,345 +PySide/docs/shiboken/_static/up.png,sha256=-KKUzbfunK3-A2ynCqhSuDtNTOgg0VO01j9dAlIEX70,345 +PySide/docs/shiboken/_static/websupport.js,sha256=G3XRzuXKkpm0cNAA84TkGfHtJNEQ02OBxRWqn9Zakrc,25350 +PySide/docs/shiboken/codeinjectionsemantics.html,sha256=xPBemCAd5DmAT0qMqspDmP6rnt7yjCZYk-EPKNGopUg,34881 +PySide/docs/shiboken/commandlineoptions.html,sha256=rJbetFgcmVYJ2Y9lyCODANqAd4TdFp4aqb5ReRaizgs,8316 +PySide/docs/shiboken/contents.html,sha256=_Ovghg2-ItvfEEhZXuSM_B8Gii6KnC4bzDu07iBHusY,11488 +PySide/docs/shiboken/faq.html,sha256=QedAVeIgD4rg7mm0LMG7u0oInhMM5nQ1W2kVUG2qtr4,8883 +PySide/docs/shiboken/index.html,sha256=klyEapMRflhuXpSogmmTZWKGm9Or1pUZxCIoNQbx1Ls,4667 +PySide/docs/shiboken/objects.inv,sha256=-_VNREjapQx9lTbL1i5fYkgbvO7ELRLmKxmjs3jXqm0,1171 +PySide/docs/shiboken/overview.html,sha256=bdGWWZzs_LgAFOt3UZprFPxBEOmWGLjx5D6_dpiF60w,6474 +PySide/docs/shiboken/ownership.html,sha256=lcUoTExmBkQHewH3Fzdsssau0pnQGJZLyiYb1avoQGE,13481 +PySide/docs/shiboken/projectfile.html,sha256=VhT3VOZL-ho4ZBsJHhQR_gZfrib3OoboIZSgqrR2q8g,6678 +PySide/docs/shiboken/search.html,sha256=ejZtevd_Sf3o4I-RXFreyKs39sxj5pGaBXe3IT6UkfU,3214 +PySide/docs/shiboken/searchindex.js,sha256=JNQKstR-D8dRc3voCTCs4sLoAuZRqbNU9xgXvolhak4,11319 +PySide/docs/shiboken/sequenceprotocol.html,sha256=2xAn1Pwh1pnh0jweDJEnRnm72bl28Yr__hCuq4_Dh-o,5604 +PySide/docs/shiboken/shibokenmodule.html,sha256=IXdaRjbUSFNJD315ChrWSk6MfqMKjzg2eQAa8kQOz0g,9594 +PySide/docs/shiboken/typeconverters.html,sha256=3bn5-mnJWTx3mqgrjDlCcb60lqh-vVvlFYLATx-OEEI,23126 +PySide/docs/shiboken/typesystemvariables.html,sha256=slunWwmRsQMDh8seJ3cfMDE-ajs26vmVtsx4eLtIpMY,21928 +PySide/docs/shiboken/wordsofadvice.html,sha256=tDDqw0yRmUQXzIb9NoqHXOOHGVhN59kTnH4B9XI1Q8o,10533 +PySide/examples/README,sha256=sVrJCRuw986N5dWnJ2RQthaV_UY3gtN5eVpsPuTIYaM,931 +PySide/examples/animation/animatedtiles/animatedtiles.py,sha256=LMC7aFUPN6HIkDs4mKsRsa6sofBI5BgMbeLbRdtkE3I,7008 +PySide/examples/animation/animatedtiles/animatedtiles.pyc,, +PySide/examples/animation/animatedtiles/animatedtiles.qrc,sha256=KjxYmlJ4-Uwg7CrKArprjp4qdlXTmiY9G9rr78LO5TY,335 +PySide/examples/animation/animatedtiles/animatedtiles_rc.py,sha256=vDdvtDdkbzj71URC8oj95x88pOH3oBQXBYwnLFk3h7w,405385 +PySide/examples/animation/animatedtiles/animatedtiles_rc.pyc,, +PySide/examples/animation/animatedtiles/images/Time-For-Lunch-2.jpg,sha256=xYOixwLywejYW-2NAa2Df6wY7k5D87hSIBfifcmx1OE,32471 +PySide/examples/animation/animatedtiles/images/centered.png,sha256=0uxf1ekaJyM-SJ_vC2YfHB_0Td57DkrLPGkFNdRw0hI,892 +PySide/examples/animation/animatedtiles/images/ellipse.png,sha256=ymqUm8e85pW47HsUARjBUfU_jgh5A6zpE9DRGqUk6NM,10767 +PySide/examples/animation/animatedtiles/images/figure8.png,sha256=ky3rq7NyZtm8712lFwPo9eTX1hXWYw6uBqVvIONghJU,14050 +PySide/examples/animation/animatedtiles/images/kinetic.png,sha256=BB5chhd-pRTdthWCfV4lYu7vONektJoIBM7ojalBA8s,6776 +PySide/examples/animation/animatedtiles/images/random.png,sha256=uNrcXiOrsH0_BYgTWXbcW6jdmfWGWyQiLacnx4bycc8,14969 +PySide/examples/animation/animatedtiles/images/tile.png,sha256=9X8Z_An5JYy906f3r17QHvXbxuliUIHnt87UrZqVUDM,16337 +PySide/examples/animation/appchooser/accessories-dictionary.png,sha256=pk9NLY6pJSmFIpp3b90PVvCHCeUFNZy10WPdszE03pw,5396 +PySide/examples/animation/appchooser/akregator.png,sha256=NPpPvM5Fv6nHzZkh1YfHPs_Chh7iK5nKGuJbdZeyjao,4873 +PySide/examples/animation/appchooser/appchooser.py,sha256=iK4eQsElUrFUvbpYI6tER2SH03ULC22Z3gh_pBYCsB4,4914 +PySide/examples/animation/appchooser/appchooser.pyc,, +PySide/examples/animation/appchooser/appchooser.qrc,sha256=DvGnod3ZubUSoajvG5awSLHgW1F7G4C2PyZ38squacE,203 +PySide/examples/animation/appchooser/appchooser_rc.py,sha256=44Soh7cOPgLZKcTWsXclbElGd-U2gntnbvOQLtxAePQ,92970 +PySide/examples/animation/appchooser/appchooser_rc.pyc,, +PySide/examples/animation/appchooser/digikam.png,sha256=klT3PjkSuDruAsX91W_uQxH-E85TM9c1sXrYQGJZwpI,3334 +PySide/examples/animation/appchooser/k3b.png,sha256=TmScruMf5utplw68PgSpOl57NNEAkDK-A7s89vLXO2I,8220 +PySide/examples/animation/easing/easing.py,sha256=WXrDfU8zcS_rlPnAv3XpFXkkUDwhpgYm3y4ZqvIRKd8,8196 +PySide/examples/animation/easing/easing.pyc,, +PySide/examples/animation/easing/easing.qrc,sha256=uEX_PxU6ZVSzMv_uK4_-7T39k2DYYQJWO5RkqQ4ic5g,109 +PySide/examples/animation/easing/easing_rc.py,sha256=b3iPBUZzVNDsnDZGEqGdsPOk5xUCUGuMAbBDk9rG0AE,22558 +PySide/examples/animation/easing/easing_rc.pyc,, +PySide/examples/animation/easing/form.ui,sha256=U82A9atjc5perVcJu86kPpTXt4xbTg_pGk6-Nt_uhS8,6210 +PySide/examples/animation/easing/images/qt-logo.png,sha256=JknoBV6eiAordgXZN5UXOL5tNcVo1BcjpF4JzzvlYF8,5149 +PySide/examples/animation/easing/ui_form.py,sha256=avmzUadW_g7iuEwK0b8bXgWNxDlAJEEtx40fVrXIkWU,6752 +PySide/examples/animation/easing/ui_form.pyc,, +PySide/examples/animation/states/accessories-dictionary.png,sha256=pk9NLY6pJSmFIpp3b90PVvCHCeUFNZy10WPdszE03pw,5396 +PySide/examples/animation/states/akregator.png,sha256=NPpPvM5Fv6nHzZkh1YfHPs_Chh7iK5nKGuJbdZeyjao,4873 +PySide/examples/animation/states/digikam.png,sha256=klT3PjkSuDruAsX91W_uQxH-E85TM9c1sXrYQGJZwpI,3334 +PySide/examples/animation/states/help-browser.png,sha256=rS84NV6ZquJYjrAR1kpoju544MssYkQxKN9eWIHhoEQ,6984 +PySide/examples/animation/states/k3b.png,sha256=TmScruMf5utplw68PgSpOl57NNEAkDK-A7s89vLXO2I,8220 +PySide/examples/animation/states/kchart.png,sha256=EMx2yvhEZXZCHzZVjsLtEGi9LQxhPevJPE_aELZHeIc,4887 +PySide/examples/animation/states/states.py,sha256=Cenjg28yU1g8jVMqiaMVvayeQmDOnCtNZKGWuK9o73k,12854 +PySide/examples/animation/states/states.pyc,, +PySide/examples/animation/states/states.qrc,sha256=bmvevTY3xE2RgBpZ2QSwAXRiHe90X6nof3pgzmJUeEo,267 +PySide/examples/animation/states/states_rc.py,sha256=iPzD1Xxpget028u6Yq89lTMXZU6nJUoIXP5y2ag6MnA,143125 +PySide/examples/animation/states/states_rc.pyc,, +PySide/examples/declarative/extending/chapter1-basics/app.qml,sha256=jVxZ8So4XgHVCWv1WlCPWFKZAwnp90ZXBAolruuKE-M,2464 +PySide/examples/declarative/extending/chapter1-basics/basics.py,sha256=D9nwiCidLMAW_nZyge10c503uWH7M8ANU5jT01FFaYs,3082 +PySide/examples/declarative/extending/chapter1-basics/basics.pyc,, +PySide/examples/declarative/extending/chapter2-methods/app.qml,sha256=vkLLh0Hrw-M6Z9x64bRgCwFbAVuScEFx_eAP0kyfkW0,2617 +PySide/examples/declarative/extending/chapter2-methods/methods.py,sha256=OnDyv1YhdDDPE8xJ1sqK1jdzxFPBPgtcGepz53G6WYY,3294 +PySide/examples/declarative/extending/chapter2-methods/methods.pyc,, +PySide/examples/declarative/extending/chapter3-bindings/app.qml,sha256=3IOR3CB2KetHrbXuCPnz5aFigL6pmbnXRKvS1GqmChw,2791 +PySide/examples/declarative/extending/chapter3-bindings/bindings.py,sha256=hl6gZXwxcWfRpfE3TDZYAyXn-w15fMONf0H_AiVKdKo,3480 +PySide/examples/declarative/extending/chapter3-bindings/bindings.pyc,, +PySide/examples/declarative/extending/chapter4-customPropertyTypes/app.qml,sha256=WAunt5fQl4YEIeCtwBCo6vk2R1swfIe6C4-VKMOstdw,2488 +PySide/examples/declarative/extending/chapter4-customPropertyTypes/customPropertyTypes.py,sha256=mgth9ud9DHSD5h60nGHb6eyckf_WDRVoqoZuyDZF6EY,3574 +PySide/examples/declarative/extending/chapter4-customPropertyTypes/customPropertyTypes.pyc,, +PySide/examples/declarative/extending/chapter5-listproperties/app.qml,sha256=16WSodisocv9Yp0D8qfj3jy-sPQ2DA6scKUnBuRZybw,2768 +PySide/examples/declarative/extending/chapter5-listproperties/listproperties.py,sha256=r8l4R01UFDes7MSxURMy9gkZ7giQkzXNCuGeTMUuFtM,3961 +PySide/examples/declarative/extending/chapter5-listproperties/listproperties.pyc,, +PySide/examples/declarative/photoviewer/PhotoViewerCore/AlbumDelegate.qml,sha256=Q0gohiSU0D2J_fya1mBoOVYqOeqSFmJJ7UPYFzM0BXg,6400 +PySide/examples/declarative/photoviewer/PhotoViewerCore/BusyIndicator.qml,sha256=b72XO_6JboFM65i7RfqSpPde0ZTrDcVSb2LrrAmfCck,2245 +PySide/examples/declarative/photoviewer/PhotoViewerCore/Button.qml,sha256=fjNBZuiG0WK8gWQiBdtG5U4L4HFUNkrCBgdgaZjSHkE,2968 +PySide/examples/declarative/photoviewer/PhotoViewerCore/EditableButton.qml,sha256=ImbUsuHQAd1VcED7aUxsoYUeKe2B86osflnGKCuP4r0,3446 +PySide/examples/declarative/photoviewer/PhotoViewerCore/PhotoDelegate.qml,sha256=pnvcLO3jYFIEu8ACZJ0XMHBaHr51usUPeMnbfLHnKQI,8624 +PySide/examples/declarative/photoviewer/PhotoViewerCore/ProgressBar.qml,sha256=3BixJShq5rSvyAIZjdgH2RcbciDhzj-wHBUTaIannbw,2348 +PySide/examples/declarative/photoviewer/PhotoViewerCore/RssModel.qml,sha256=KmCALWNZOXFNxOOqQ4Ekj-Z14YuJJQcVDv_MmhFy-V0,2478 +PySide/examples/declarative/photoviewer/PhotoViewerCore/Tag.qml,sha256=pDsfnm5_eNeu5efeZcUfvqgYa--z-zsMympgFY8yzhs,3519 +PySide/examples/declarative/photoviewer/PhotoViewerCore/images/box-shadow.png,sha256=4UnhDI5gThbOzYqShBGniMH4XGOyQeFCpLZnYSGRg7E,588 +PySide/examples/declarative/photoviewer/PhotoViewerCore/images/busy.png,sha256=9p1agvC3PXXe45wq2_syUv61x0pvCnO4gjlQPocGvjE,2629 +PySide/examples/declarative/photoviewer/PhotoViewerCore/images/cardboard.png,sha256=2SZ6PhhJQ2zs6XyJQa8zx_XSMr2M2XAOok1xp1XmZk0,8844 +PySide/examples/declarative/photoviewer/PhotoViewerCore/qmldir,sha256=ovkV4uAp9yKB9AwHmB-0BATJhwBVifTGpLdO_2vhhNo,218 +PySide/examples/declarative/photoviewer/PhotoViewerCore/script/script.js,sha256=yLLcdNHoMFvkKuVvgsNOALAbdMRIEI4e0CM3SnOwjhs,653 +PySide/examples/declarative/photoviewer/i18n/base.ts,sha256=5WTU4N9Wdpa0JkyP9BNZynK70qpV-pFUY8t3Agr5pNw,921 +PySide/examples/declarative/photoviewer/i18n/qml_fr.qm,sha256=SG0uWL6hvkS054hbWz-ZvoncnzI7N4o1rzOiCRxHWiI,268 +PySide/examples/declarative/photoviewer/i18n/qml_fr.ts,sha256=Bq2AM9o0CKPyeia-O_OzCnpLVE7a4hKH3B3-UFDVxPo,895 +PySide/examples/declarative/photoviewer/main.py,sha256=IgK8XC6BTMRXc6y-nIS7UzF2mh9vcTDRVKgqapg3m0g,8511 +PySide/examples/declarative/photoviewer/main.pyc,, +PySide/examples/declarative/photoviewer/photoviewer.qml,sha256=e3iDCtAOaao33dB-wt-rFgYA016EZiFORyZEeU_r3hQ,4359 +PySide/examples/declarative/photoviewer/photoviewer.qmlproject,sha256=9ugZTw1VM25YzFJwOhTP4TqGPZDBPXLOJrPltPECL8E,383 +PySide/examples/declarative/scrolling.py,sha256=RmOMJhqHtXn_LAVjhoMLb1CMg0yDosSYmzL1HzXhcoA,2368 +PySide/examples/declarative/scrolling.pyc,, +PySide/examples/declarative/signals/pytoqml1/README,sha256=7cRtS7E4VEav_CdeKf-H5G9-7jt3gVoKGUmevgp-eys,228 +PySide/examples/declarative/signals/pytoqml1/main.py,sha256=8FCkY4nBZYga_v6ws99rr4DPukLICoGmH_-sVmOD5qg,2322 +PySide/examples/declarative/signals/pytoqml1/main.pyc,, +PySide/examples/declarative/signals/pytoqml1/view.qml,sha256=DQnMo_1iBqxnPbAAzhK9ZgaCexfw6yWVNJVT0xJePEQ,2730 +PySide/examples/declarative/signals/qmltopy1/README,sha256=v7NIj85w_RlhrmQarGQ3-hoju40nIA7AuTL31yKlnko,196 +PySide/examples/declarative/signals/qmltopy1/main.py,sha256=FxMIciCIn08XI9qPpwcJ8utHySaJsGGIygXKwSG_PpU,3082 +PySide/examples/declarative/signals/qmltopy1/main.pyc,, +PySide/examples/declarative/signals/qmltopy1/view.qml,sha256=hGYc8Xmx53NY-JNBWrRZy5Rxnqq2spmPyJYhumDlwEA,3264 +PySide/examples/declarative/signals/qmltopy2/README,sha256=dwJmArLeWSQZa_6wyPNIGDYSGUnolDX8mnIuIMP3lbk,130 +PySide/examples/declarative/signals/qmltopy2/main.py,sha256=LV0x6rwHZyxqJzgmOaLNfqcXjhiFhHOR9QrDpEDThvE,2708 +PySide/examples/declarative/signals/qmltopy2/main.pyc,, +PySide/examples/declarative/signals/qmltopy2/view.qml,sha256=bJsTxRsdNVlmOkLRLWaURwqiAGtmngY9zxj5NlrwDdU,3039 +PySide/examples/declarative/signals/qmltopy3/README,sha256=JqsZXZoJp7s0EYlVdHkP1ybWZBGVySlIhxT_EQlQnSQ,310 +PySide/examples/declarative/signals/qmltopy3/main.py,sha256=Tpzn5FVKS9D-_Ujy4BJhfF1FVICN3hNnoot1oPXVedw,2605 +PySide/examples/declarative/signals/qmltopy3/main.pyc,, +PySide/examples/declarative/signals/qmltopy3/view.qml,sha256=e421Jh5SfsjK9nzJLcfWY-J1gu4FMhQNLjRq_Uu_wP8,3697 +PySide/examples/declarative/signals/qmltopy4/README,sha256=zsDKbUJrhvIrA61WMmpiTE--AymX21ZzfmiZXDLnZKY,166 +PySide/examples/declarative/signals/qmltopy4/main.py,sha256=UDmzIL09lN4H08vCFHoVl9gBfGv2sc0MCX0BusAgFT8,2420 +PySide/examples/declarative/signals/qmltopy4/main.pyc,, +PySide/examples/declarative/signals/qmltopy4/view.qml,sha256=bB8sjRLxaPE8TlRrnBG-slsWidw5NbW7pAfglYnhJXM,2786 +PySide/examples/declarative/usingmodel.py,sha256=i-1FUpfltdw2ye2v4owD16OMfAPdHRVaI_GYYmY3iEw,3152 +PySide/examples/declarative/usingmodel.pyc,, +PySide/examples/declarative/view.qml,sha256=yGe8-kzRmafY4PihXnnOqBz0MXIEwiLUDFo0Ts1FQwA,2357 +PySide/examples/demos/README,sha256=JaFPPnJpI7ymHWp0Dfqlpxb17Aci2jpd-5oIABMejd8,932 +PySide/examples/demos/embeddeddialogs/No-Ones-Laughing-3.jpg,sha256=hezXy12tgZqptfJ3JDk1oJ12_FbdZfMzB1QqkkQEx0k,30730 +PySide/examples/demos/embeddeddialogs/embeddeddialog.py,sha256=-0w1jKGqOcOeQ41OJ-hoA24coNWxYl2m9We4IPoaW1E,3425 +PySide/examples/demos/embeddeddialogs/embeddeddialog.pyc,, +PySide/examples/demos/embeddeddialogs/embeddeddialog.ui,sha256=sBPYhj1dxvR6VRp832tBa01FNUBanVNBMkJYjRjNsb4,2277 +PySide/examples/demos/embeddeddialogs/embeddeddialogs.py,sha256=NaoKCX_vp57JepUJOKOrmPzZVL6aWN_PDoyrNSA5rbY,7468 +PySide/examples/demos/embeddeddialogs/embeddeddialogs.pyc,, +PySide/examples/demos/embeddeddialogs/embeddeddialogs.qrc,sha256=8F6_ZFxLsV_Z7V8z_jdfrB0FrPzIXMVU9DQ7VJydYOs,95 +PySide/examples/demos/embeddeddialogs/embeddeddialogs_rc.py,sha256=BOBr7Gx2hGuXtVXSPt2tKidExNEkh7owHmkl1zgkNEE,129627 +PySide/examples/demos/embeddeddialogs/embeddeddialogs_rc.pyc,, +PySide/examples/demos/qtdemo/colors.py,sha256=i3jhMhlIdc_hWyixRA31eCF_kWlPD1ArZ4i3-MpMDbo,11412 +PySide/examples/demos/qtdemo/colors.pyc,, +PySide/examples/demos/qtdemo/demoitem.py,sha256=rLoIzEqfpHuYn1txU22pTs1PcALSJiUHoYMKKhnTr8M,7597 +PySide/examples/demos/qtdemo/demoitem.pyc,, +PySide/examples/demos/qtdemo/demoitemanimation.py,sha256=84P1JGBFIM26mh_ZX1kXltoXs5oLLnRiEllAVjYgiPM,4448 +PySide/examples/demos/qtdemo/demoitemanimation.pyc,, +PySide/examples/demos/qtdemo/demoscene.py,sha256=IBGpzNm4TAZi_-fVV-1rdPzSiEDuUIkz7zotDkOnHBQ,344 +PySide/examples/demos/qtdemo/demoscene.pyc,, +PySide/examples/demos/qtdemo/demotextitem.py,sha256=gLyUQOd-w9CR2140eBoPMGOnC47k3n9sMgDdWTMWknU,2227 +PySide/examples/demos/qtdemo/demotextitem.pyc,, +PySide/examples/demos/qtdemo/dockitem.py,sha256=ltjBz_oXpFTDY9085FydBmqQsmQ6dfFgmwoPbLnmirY,1827 +PySide/examples/demos/qtdemo/dockitem.pyc,, +PySide/examples/demos/qtdemo/examplecontent.py,sha256=7_RMchm3tCHR8wvAugtVmsBed-QrTdsY8RyupQvkUBM,3955 +PySide/examples/demos/qtdemo/examplecontent.pyc,, +PySide/examples/demos/qtdemo/guide.py,sha256=d4X48GHk-gNzTBzIw6cnLiV024QCH417ZPuhM9f_zkU,2917 +PySide/examples/demos/qtdemo/guide.pyc,, +PySide/examples/demos/qtdemo/guidecircle.py,sha256=l4HwxjR-L5zlsQbg5BAQgnGtZUSK9vO9fRiuS10Mn7Q,1924 +PySide/examples/demos/qtdemo/guidecircle.pyc,, +PySide/examples/demos/qtdemo/guideline.py,sha256=ZrKhka4K1_asVMhXhBiWXbCmBjpJkmUuXgVRZV66awM,1195 +PySide/examples/demos/qtdemo/guideline.pyc,, +PySide/examples/demos/qtdemo/headingitem.py,sha256=kF-g0M1Ku_XfoYEvVWd9noTOnHxQPFrAT34opSs8WJk,2193 +PySide/examples/demos/qtdemo/headingitem.pyc,, +PySide/examples/demos/qtdemo/imageitem.py,sha256=NuuQvPWyuDasIBM52fvMCAl6GVPs6SufSJl6Vox8J_I,2923 +PySide/examples/demos/qtdemo/imageitem.pyc,, +PySide/examples/demos/qtdemo/images/demobg.png,sha256=-Ca3rZv0L0pyrlkHVxYsS0zh0-Fg0bDaft9N1amEuX8,20675 +PySide/examples/demos/qtdemo/images/qtlogo_small.png,sha256=VmDEj6SrgSNGGlSX_FrwiWSzjM-T59StKAnUu2pGM74,3546 +PySide/examples/demos/qtdemo/images/trolltech-logo.png,sha256=BL9pHQwa8sNnoHGgDU5bJboJlSgmZeRFLR60nk8w5DA,23547 +PySide/examples/demos/qtdemo/itemcircleanimation.py,sha256=01fk6vSE8qHLbMAOvK5tERSBPh65XEbNgQN9A-JoagE,12236 +PySide/examples/demos/qtdemo/itemcircleanimation.pyc,, +PySide/examples/demos/qtdemo/letteritem.py,sha256=DVrFWgqas_aPsvJ53h_QVLUGkvxgrTPpKeIOr7eKwJ8,1690 +PySide/examples/demos/qtdemo/letteritem.pyc,, +PySide/examples/demos/qtdemo/mainwindow.py,sha256=eq9pX5sTjTrR3QqOZAZRjbLW9HhBUIkCyerNBNBoG5M,13189 +PySide/examples/demos/qtdemo/mainwindow.pyc,, +PySide/examples/demos/qtdemo/menucontent.py,sha256=oc8XyYPS3UK_laBrZ60xBrRs5mlWbC2ZmRxI-oOhHA0,3306 +PySide/examples/demos/qtdemo/menucontent.pyc,, +PySide/examples/demos/qtdemo/menumanager.py,sha256=D2Piyg47n_H7553HWs0tp9MSxggkm2NhtFpgV2L1wNI,37564 +PySide/examples/demos/qtdemo/menumanager.pyc,, +PySide/examples/demos/qtdemo/qtdemo.py,sha256=mzymBIXakvGuxTmPXSCYjf_gqUwMQ-HHJLUPg5gE29o,3441 +PySide/examples/demos/qtdemo/qtdemo.pyc,, +PySide/examples/demos/qtdemo/qtdemo.qrc,sha256=QnVQs3y8oIsAT6m5I3YAtliZ8ktmEoKVoGna7Fj4QZQ,234 +PySide/examples/demos/qtdemo/qtdemo_rc.py,sha256=7nCgeV7mJIaV9BajGwkDqBs0y5q21pQu1kt1Ab5YTHg,238522 +PySide/examples/demos/qtdemo/qtdemo_rc.pyc,, +PySide/examples/demos/qtdemo/scanitem.py,sha256=TzdapLRKukarEt64SM4v7jXZwYg8XTjfRX17eYaIC0E,1294 +PySide/examples/demos/qtdemo/scanitem.pyc,, +PySide/examples/demos/qtdemo/score.py,sha256=QLiApIoD__c-YENQD1i9OcIFqE5VthHP677waSdA5MU,2679 +PySide/examples/demos/qtdemo/score.pyc,, +PySide/examples/demos/qtdemo/textbutton.py,sha256=nAzrpyGy9UjeZlnaJxLyosCPXyM9F1-_61dxAdMU2IQ,11864 +PySide/examples/demos/qtdemo/textbutton.pyc,, +PySide/examples/demos/qtdemo/xml/examples.xml,sha256=f-0KS1goB46jAF0ssy95s4em9mE-NH4eQDIODgBAlB4,8917 +PySide/examples/designer/README,sha256=8f4oqof55iKU6Zq7Qau-EWics3sK_82UVhyj1jtiTqc,606 +PySide/examples/designer/calculatorform/calculatorform.py,sha256=zcyHTE1QiKXEB3P1Ps8NL9RJ9ogeXgImy4srIbuitQw,1880 +PySide/examples/designer/calculatorform/calculatorform.pyc,, +PySide/examples/designer/calculatorform/calculatorform.ui,sha256=zb7dqU7NwBmnz6oNaXid9x094aGCFJ8OtELaocakOdc,7434 +PySide/examples/designer/calculatorform/ui_calculatorform.py,sha256=nHcLArFy0MGUR-gBzPvDBQ1T-b1tMVo8FyzCO4OzwU8,5577 +PySide/examples/designer/calculatorform/ui_calculatorform.pyc,, +PySide/examples/desktop/README,sha256=cb2txuVAcUwGiIYHdHXEwLlkTYiXDkcU5gHE4J4AC78,937 +PySide/examples/desktop/screenshot.py,sha256=nN2oZto2hMeThudkI3ixlG9K7JBWdHc5Kp9aNH2scts,5596 +PySide/examples/desktop/screenshot.pyc,, +PySide/examples/desktop/systray/images/bad.svg,sha256=_XibwFUf-noUc9bNpFVoJh7GUWyedV4j3DTRw_OEbSI,3439 +PySide/examples/desktop/systray/images/heart.svg,sha256=VlVLjUfhLI2Y1qQAWC_vgIeJYuinU2eUZLgev9QFH5g,3928 +PySide/examples/desktop/systray/images/trash.svg,sha256=WR_d52deiWdrkZIuCR18YsTVLuU5RFjzukw9JTKSP5w,3194 +PySide/examples/desktop/systray/systray.py,sha256=z9ES6RSRWge2CeMHivNVQY9y6mjJ0RXsnsUh55UkorI,9444 +PySide/examples/desktop/systray/systray.pyc,, +PySide/examples/desktop/systray/systray.qrc,sha256=ttlHmFOHUUKCRcXGW88tCsCjA--IZjGzuciuEc5y70g,181 +PySide/examples/desktop/systray/systray_rc.py,sha256=0198v8qACZ5nuCYh4lJdIjeKJ6twzQlgLFd9qGWf4xY,44828 +PySide/examples/desktop/systray/systray_rc.pyc,, +PySide/examples/dialogs/README,sha256=0bqxHKrTdRBFSAH7W7HNdTngy9xtuwR9h1zOYG2kXlw,832 +PySide/examples/dialogs/classwizard/classwizard.py,sha256=A44JrU3ecvRXUWd_SCmS7Qup9KAj7y28hp6u-eSooRQ,14092 +PySide/examples/dialogs/classwizard/classwizard.pyc,, +PySide/examples/dialogs/classwizard/classwizard.qrc,sha256=EJwaecYIzLvQ7_asc3w6NmCFVhXYSDdWmTC5NzM_OiQ,331 +PySide/examples/dialogs/classwizard/classwizard_rc.py,sha256=e08sq9BmkbyazIvON1KL4vKRngv1BqpDp1ft2se1vTA,256897 +PySide/examples/dialogs/classwizard/classwizard_rc.pyc,, +PySide/examples/dialogs/classwizard/images/background.png,sha256=X9T5zZ5bXzSj5oU6mrDccj3U7ucFIW4_1KRuiIGQ3KA,22578 +PySide/examples/dialogs/classwizard/images/banner.png,sha256=L50iksEX1Awqfzl6X1Kar-a5Z8CZ7ztB3sIBm0zESF4,3947 +PySide/examples/dialogs/classwizard/images/logo1.png,sha256=dsOjZuPDlsq00Hny5U2t-uETfffVvR91B9RFiXz173Y,1619 +PySide/examples/dialogs/classwizard/images/logo2.png,sha256=thyF3PSLK_kpFjSZeh5lCnpIaIC-azG0vm2xnPDWE78,1619 +PySide/examples/dialogs/classwizard/images/logo3.png,sha256=MZIIG4ejQrS_ikBY-hpQTOVrB03u-fd5i15or0ZiMGE,1619 +PySide/examples/dialogs/classwizard/images/watermark1.png,sha256=-ngEHTPxT5MntxRdbS5lH-gbzTh2s-ZKoEFYDmdbJx0,14516 +PySide/examples/dialogs/classwizard/images/watermark2.png,sha256=oI11N_yTyM4DLSVt3uJY1RJUpt5WuDGU502dWxsDKl4,14912 +PySide/examples/dialogs/configdialog/configdialog.py,sha256=qcdONW_sK6_Gc_bazPkZIPyUhQfHDKep71YtV6u5Qaw,8115 +PySide/examples/dialogs/configdialog/configdialog.pyc,, +PySide/examples/dialogs/configdialog/configdialog.qrc,sha256=PiJ3Oo8r1MHHEVJ2EFr6YgTCwhHK9dpAwJCk_7fawEs,174 +PySide/examples/dialogs/configdialog/configdialog_rc.py,sha256=bfjWH4xNyaiRFTHFk5p4rrS8BhvEjdSlymvxeyfWsFg,75179 +PySide/examples/dialogs/configdialog/configdialog_rc.pyc,, +PySide/examples/dialogs/configdialog/images/config.png,sha256=8zTFFQeMryK2jgDkEiMzQRVPdc59DF2hkAwQOd8f1jk,7059 +PySide/examples/dialogs/configdialog/images/query.png,sha256=tzDwxWGW9Xchp0Pxr35bOyT1crxRSjGlIH24AwgNt0E,2269 +PySide/examples/dialogs/configdialog/images/update.png,sha256=lvopVuUw091Quv4RdpTgQyk8jfVOdlDWg_Ua3cpah3g,8296 +PySide/examples/dialogs/extension.py,sha256=LHcR7WFPsDwmw8g7cevvViGGONZDKkZXgT8G4Bt8JbI,2453 +PySide/examples/dialogs/extension.pyc,, +PySide/examples/dialogs/findfiles.py,sha256=J7_ko9ffGxl6gbRYLslBQ8q1H7srGnAOHvHYBSQeiyU,6193 +PySide/examples/dialogs/findfiles.pyc,, +PySide/examples/dialogs/findfiles_test.py,sha256=KP4MsJMHVUxclsUm2wo2NEbRG_snyxdru529e0pwemM,1120 +PySide/examples/dialogs/findfiles_test.pyc,, +PySide/examples/dialogs/standarddialogs.py,sha256=kqQjtdReWk6S5Ejzxq2wIhrw5sH-8RDeItYKmRy5MwI,12477 +PySide/examples/dialogs/standarddialogs.pyc,, +PySide/examples/dialogs/tabdialog.py,sha256=OaC7ABa1X6SAcY8146iILbLv00aZ9skfK1SwcojwHzQ,6624 +PySide/examples/dialogs/tabdialog.pyc,, +PySide/examples/dialogs/trivialwizard.py,sha256=q5OogphCXgIfrW7rNot8PjL_XrZw5oTAIwHQCZlzjqo,1714 +PySide/examples/dialogs/trivialwizard.pyc,, +PySide/examples/draganddrop/README,sha256=8N7XmhcLneUxcClNR-lop_obbVqfw3hAN1nqTenC3NM,870 +PySide/examples/draganddrop/draggableicons/draggableicons.py,sha256=JGXV0O19hHUyXIC1J_S8U5FZLXvYkDGnn1glI7gDPOE,4901 +PySide/examples/draganddrop/draggableicons/draggableicons.pyc,, +PySide/examples/draganddrop/draggableicons/draggableicons.qrc,sha256=BmhqlUz74TaUgHI7nqMh82QsKJYrN4VzVO--ZByuyW8,179 +PySide/examples/draganddrop/draggableicons/draggableicons_rc.py,sha256=hEa0e9Vy2RkY4l4EWoauUpGKd94EsJG4GZWPbWHb7yw,40254 +PySide/examples/draganddrop/draggableicons/draggableicons_rc.pyc,, +PySide/examples/draganddrop/draggableicons/images/boat.png,sha256=FSt1bFMiurhA4yMKtfVAX5JvtvP6aBTKx6Fi_sVyLOw,2772 +PySide/examples/draganddrop/draggableicons/images/car.png,sha256=zVE0skfjRDzGA0FaoNeFcyqdUbZt4tqSmLJAUs4QTME,3159 +PySide/examples/draganddrop/draggableicons/images/house.png,sha256=h5_wo_QAOq0_QMKbZdqt7TolRUzembt0E1Y0NOjNc7Y,3369 +PySide/examples/draganddrop/draggabletext/draggabletext.py,sha256=Zzoe9vLXHL5D2jGWkeEdeS-BWROGFgbn58hOPuLM5O4,4538 +PySide/examples/draganddrop/draggabletext/draggabletext.pyc,, +PySide/examples/draganddrop/draggabletext/draggabletext.qrc,sha256=5AH1E8y8nTafZgdGb23TqZWy5ttGoo8ZSm2qXeh-Who,118 +PySide/examples/draganddrop/draggabletext/draggabletext_rc.py,sha256=JUSxubSz-kIiLzSf1e0bOxd701h2FueXSQKbNQ6GVEg,2048 +PySide/examples/draganddrop/draggabletext/draggabletext_rc.pyc,, +PySide/examples/draganddrop/draggabletext/words.txt,sha256=sTVbVOj9_IbEeiI37jwehbDJcDGD5cX9fRtD6c6r6m4,288 +PySide/examples/draganddrop/fridgemagnets/fridgemagnets.py,sha256=SwFGo0hGnWfGGJr2x3bvV01j-Kh6Bp-BzNDWclsNOl0,6104 +PySide/examples/draganddrop/fridgemagnets/fridgemagnets.pyc,, +PySide/examples/draganddrop/fridgemagnets/fridgemagnets.qrc,sha256=5AH1E8y8nTafZgdGb23TqZWy5ttGoo8ZSm2qXeh-Who,118 +PySide/examples/draganddrop/fridgemagnets/fridgemagnets_rc.py,sha256=xLkKnSjpDu1w6JE1i_1Fcl1M0uCz_DhErMWg8LBaSB8,2178 +PySide/examples/draganddrop/fridgemagnets/fridgemagnets_rc.pyc,, +PySide/examples/draganddrop/fridgemagnets/words.txt,sha256=b6fVVNHpay9xTRRlrJmL0XWpeeQhaFAZlwOl-szaKsM,326 +PySide/examples/draganddrop/puzzle/example.jpg,sha256=EMyltbkakwyUgaJzCFj1STDpCefP155ucti3xyT4bX4,42654 +PySide/examples/draganddrop/puzzle/puzzle.py,sha256=WkhI7Tgs6Mo_ppFdsanWUfvXNABvkilh7YtlQxck9lM,11916 +PySide/examples/draganddrop/puzzle/puzzle.pyc,, +PySide/examples/draganddrop/puzzle/puzzle.qrc,sha256=_4Wg0jTeKgp4ydSWvkGISfFpHxq-XQskn9FZBEPsyHg,116 +PySide/examples/draganddrop/puzzle/puzzle_rc.py,sha256=1ShZ0hJ80Ij_gi0VXHTfbafCb8fa8f2VjQRYfB8DKwE,179610 +PySide/examples/draganddrop/puzzle/puzzle_rc.pyc,, +PySide/examples/effects/README,sha256=Mc6ys5bpk-NzcAbQINzJJhCVioCjNTTKz1z4ZhFj_nE,776 +PySide/examples/effects/lighting.py,sha256=EDDt2dVL48ujyYe79IvwkoNrWeTtZhmo_4ex0zhR_gY,3242 +PySide/examples/effects/lighting.pyc,, +PySide/examples/graphicsview/README,sha256=QzN1lDpyDpfJWB-VS9e__UWxvFtmy7wvueUBpavuE1Q,787 +PySide/examples/graphicsview/anchorlayout.py,sha256=8eVjjiNrQOgyEXuru-mkdTRTkRki7d40Me2IDjSG03Q,3058 +PySide/examples/graphicsview/anchorlayout.pyc,, +PySide/examples/graphicsview/collidingmice/collidingmice.py,sha256=lP6uUikAKcvTs2o-LCbymTBlyluxft-TR_Hbn9V_JEA,7219 +PySide/examples/graphicsview/collidingmice/collidingmice.pyc,, +PySide/examples/graphicsview/collidingmice/images/cheese.jpg,sha256=G_AXeElUfCceZl3XukgLjmhwSykaXJKW0Aiu7LiekHw,3029 +PySide/examples/graphicsview/collidingmice/mice.qrc,sha256=kmPVHMSW3m646Oq8tOae6r86b-WvfNcVmkSP6GHj678,102 +PySide/examples/graphicsview/collidingmice/mice_rc.py,sha256=AztXxTGZnQjZ91WDt_lmaBqoubwi97lpYZezJWwrJSc,13674 +PySide/examples/graphicsview/collidingmice/mice_rc.pyc,, +PySide/examples/graphicsview/diagramscene/diagramscene.py,sha256=_VasAyT0H0V8Drozsqv-LaTQKNo7faVarK5oZJrVseo,30761 +PySide/examples/graphicsview/diagramscene/diagramscene.pyc,, +PySide/examples/graphicsview/diagramscene/diagramscene.qrc,sha256=dIm5XVJaCo7clAdE6YlMn7DO5xv5wxeTdfEfqlGBSQ4,660 +PySide/examples/graphicsview/diagramscene/diagramscene_rc.py,sha256=XM-6TAs8d50Y7tCJEcTA3k-ZbYbew57CUjHu3CXNIao,21508 +PySide/examples/graphicsview/diagramscene/diagramscene_rc.pyc,, +PySide/examples/graphicsview/diagramscene/images/background1.png,sha256=AzADEtR1XyS460eQcDhLwkTEu8H1rD42pgDgG99K2Lc,112 +PySide/examples/graphicsview/diagramscene/images/background2.png,sha256=2jB91YPIf0h_0gAIoxy9b6MUMlDkQad5HflkPM5qVQI,114 +PySide/examples/graphicsview/diagramscene/images/background3.png,sha256=nQkykGc-UjLcA2FXB5UcqfHEdFT9ygXfZQX59ne7-5I,116 +PySide/examples/graphicsview/diagramscene/images/background4.png,sha256=LBSnUK-5SDMK-9m5e4hMGCtiX2tSF6hXqz_1I6CkeHc,96 +PySide/examples/graphicsview/diagramscene/images/bold.png,sha256=NsCyKcwR4bx2YMq-5mVzVHOnBi7ozQVl1lHiC0nBqeA,274 +PySide/examples/graphicsview/diagramscene/images/bringtofront.png,sha256=T3GU4njOMEKrWX2RVM70QQeFZyqHY7ppLBaSAO2pt1Y,293 +PySide/examples/graphicsview/diagramscene/images/delete.png,sha256=ou-3ycnGFgboKEFYg0xC7o395ER4C062J27AlIJi5X4,831 +PySide/examples/graphicsview/diagramscene/images/floodfill.png,sha256=UO70ibpA95t2lfQT_ahIhLIEw__EHk36imZcp9k8uEA,282 +PySide/examples/graphicsview/diagramscene/images/italic.png,sha256=hAnWi5XDZ1I0X5qQ9tHcr-XIQZ9ygIbbcyJrnMW2_b0,247 +PySide/examples/graphicsview/diagramscene/images/linecolor.png,sha256=2Lx44hVAuBjJSdNnIyLdr70wn_UBmeFjPHFHRmF1erw,145 +PySide/examples/graphicsview/diagramscene/images/linepointer.png,sha256=dyLIQhE3HtykiF3kyjsgY-Fm1GoNrlPhLwlXYblS7S4,141 +PySide/examples/graphicsview/diagramscene/images/pointer.png,sha256=lGYDZ0SMwFdZoYUT9-TbSqY0iE4UxieGgcimvvj4Mbo,173 +PySide/examples/graphicsview/diagramscene/images/sendtoback.png,sha256=WL_-BMrr13Ry522i6i42iY6ilS4OJ211AHCz7IhQEsc,318 +PySide/examples/graphicsview/diagramscene/images/textpointer.png,sha256=AFKffvb7XlkhmHa9ttR1VuKEaCFa_GM7bGLqxUAnltg,753 +PySide/examples/graphicsview/diagramscene/images/underline.png,sha256=z_I4c98oLVnBSQ9aQVEEAkvP6m57r3JPgEqny5YMuu0,250 +PySide/examples/graphicsview/dragdroprobot/dragdroprobot.py,sha256=P5wpNXwJkDGPvuo5-9R1uAn-ZcCX6IXgEWK02VbIw64,9904 +PySide/examples/graphicsview/dragdroprobot/dragdroprobot.pyc,, +PySide/examples/graphicsview/dragdroprobot/dragdroprobot.qrc,sha256=YZnfZf9d-h4v9Z2qaiJWyNkNNkUZ46QDBKdh6Y_QlYg,100 +PySide/examples/graphicsview/dragdroprobot/dragdroprobot_rc.py,sha256=IXiljmY-GX_m81ayk2yE6Av1vC9S1oG0SpWzDhC7jRo,63668 +PySide/examples/graphicsview/dragdroprobot/dragdroprobot_rc.pyc,, +PySide/examples/graphicsview/dragdroprobot/images/head.png,sha256=XaZqEoFqQ_afFBVpA5K0zfN9WC0r5uESUkkVwnIfqOQ,14972 +PySide/examples/graphicsview/elasticnodes.py,sha256=PQpoHZNStpdipSzjMCti27daPqVXlIXdvZqbhZOT4Es,14337 +PySide/examples/graphicsview/elasticnodes.pyc,, +PySide/examples/graphicsview/padnavigator/backside.ui,sha256=IF2DQ3OHoZUlxoV3SsecKknF6lF400BlqXHZONOlbk4,5600 +PySide/examples/graphicsview/padnavigator/images/artsfftscope.png,sha256=C1CCqx3a4b9n8787kqh0SYf-rA9ZhWQ3Etgv0LT5B6w,1294 +PySide/examples/graphicsview/padnavigator/images/blue_angle_swirl.jpg,sha256=SySAvM4i-9NPUhXn_Zz9R9bsiF-4gCyLwJ03tWAjGcc,11826 +PySide/examples/graphicsview/padnavigator/images/kontact_contacts.png,sha256=J2BUvGp4IUGBfMlZqlHV-FLVzjrXC6RQyEXHovtFE-M,4382 +PySide/examples/graphicsview/padnavigator/images/kontact_journal.png,sha256=awtm05MZ4xVJi3-OWu0od90imiOz6fBMBHxfuB1nS9s,3261 +PySide/examples/graphicsview/padnavigator/images/kontact_mail.png,sha256=2DP0-hy_1nmDjbTrGZnnwxvT9TSMKfsMtAMygb3E6q4,3202 +PySide/examples/graphicsview/padnavigator/images/kontact_notes.png,sha256=M2tX4Ytt2dsnrVyL17E704YtmIM1Rh7olmhna02MpSI,3893 +PySide/examples/graphicsview/padnavigator/images/kopeteavailable.png,sha256=JiZCcyeaoKgO_8twRn_nAMRK4IP_vRi8AExuek7hm6M,2380 +PySide/examples/graphicsview/padnavigator/images/metacontact_online.png,sha256=1MuTTAyRpaDsiK6dBocNUGlKsOScaWMaIwRgSv1hdKI,2545 +PySide/examples/graphicsview/padnavigator/images/minitools.png,sha256=_boB2lAXuzsZkTUfczyjHdo9myPgrXUVtH65uN9cr3k,2087 +PySide/examples/graphicsview/padnavigator/padnavigator.py,sha256=xoAkcw9evcH3deFwkIyyW6iIB0XLhZ6CTwvwpRm2AuM,13548 +PySide/examples/graphicsview/padnavigator/padnavigator.pyc,, +PySide/examples/graphicsview/padnavigator/padnavigator.qrc,sha256=JDvm0aqHtF0MEkqaYaEL8ZWImi9VtYv6rkdkofEMFNA,466 +PySide/examples/graphicsview/padnavigator/padnavigator_rc.py,sha256=vRmjQvsMS1F6uvHkg-S3H67V5Oy63MFGD_kAd00JAMY,198795 +PySide/examples/graphicsview/padnavigator/padnavigator_rc.pyc,, +PySide/examples/graphicsview/padnavigator/ui_backside.py,sha256=xhH9Z53zVyv5z9-PYxjS4S148z6vcZHemvQ12hhw2Io,7307 +PySide/examples/graphicsview/padnavigator/ui_backside.pyc,, +PySide/examples/hyperui/hyperui,sha256=2qF1O3-FiDikh4LZkl1qGxhXXMc0nwCiqP2iHmyVgUA,73 +PySide/examples/hyperui/hyperuilib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +PySide/examples/hyperui/hyperuilib/__init__.pyc,, +PySide/examples/hyperui/hyperuilib/clockwidget.py,sha256=vX5Ljm5lB1T_4eSVyID6PlSlP4k1Kgh4ihIugr2K-SM,9324 +PySide/examples/hyperui/hyperuilib/clockwidget.pyc,, +PySide/examples/hyperui/hyperuilib/contactlist.py,sha256=VbmSEtpK2xqEQebmIvcl8WPukdsZW9JskEI77cJCl2k,9821 +PySide/examples/hyperui/hyperuilib/contactlist.pyc,, +PySide/examples/hyperui/hyperuilib/contactresource.py,sha256=ioM03ktQJbl44jahMmoJw1-cwj03vOIIUDJ2jb4aheQ,3009 +PySide/examples/hyperui/hyperuilib/contactresource.pyc,, +PySide/examples/hyperui/hyperuilib/draggablepreview.py,sha256=uLBfC37E0Amrcc6T4TUp6MtJVO8MEI21LlTZHvXju2Q,7615 +PySide/examples/hyperui/hyperuilib/draggablepreview.pyc,, +PySide/examples/hyperui/hyperuilib/kineticscroll.py,sha256=iFLh4kKQMkc-cmivCPwwMi4yw6uvVHUErqFCmiqq7-0,3861 +PySide/examples/hyperui/hyperuilib/kineticscroll.pyc,, +PySide/examples/hyperui/hyperuilib/main.py,sha256=JIXV1Hv3spBW8ufRR8aUs68L_oJ2BbwmvNLobI4ZkV4,2305 +PySide/examples/hyperui/hyperuilib/main.pyc,, +PySide/examples/hyperui/hyperuilib/mainwindow.py,sha256=-j9TdqXAyazEcuQTZlhH4zEPXmg8sp3oG8b3p1iz2mU,6115 +PySide/examples/hyperui/hyperuilib/mainwindow.pyc,, +PySide/examples/hyperui/hyperuilib/menuview.py,sha256=NgEZxXsk1_zYqpL7A4kKrzwYEZt4KvtDnMavOs-uq4M,8922 +PySide/examples/hyperui/hyperuilib/menuview.pyc,, +PySide/examples/hyperui/hyperuilib/pagemenu.py,sha256=MsmJodfvaatHT3gD8spvxNPXwPWoGU1vKxQqY5pXqZQ,2237 +PySide/examples/hyperui/hyperuilib/pagemenu.pyc,, +PySide/examples/hyperui/hyperuilib/pageview.py,sha256=uz_10twLSWCeor4ByRq363qNZHbViqnbc79n2aWt6Gk,6198 +PySide/examples/hyperui/hyperuilib/pageview.pyc,, +PySide/examples/hyperui/hyperuilib/phoneview.py,sha256=Ao-V9n9BsO1xLWnzWGZu1-yg1liSIS0FDHUmPnN-l9k,22093 +PySide/examples/hyperui/hyperuilib/phoneview.pyc,, +PySide/examples/hyperui/hyperuilib/qt_global.py,sha256=p2PrqL7i3x2UsM3AD09a7Sjxe1IjTnXWERpc5oNDR7k,1370 +PySide/examples/hyperui/hyperuilib/qt_global.pyc,, +PySide/examples/hyperui/hyperuilib/resource/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +PySide/examples/hyperui/hyperuilib/resource/__init__.pyc,, +PySide/examples/hyperui/hyperuilib/resource/contactlist.txt,sha256=yyfZu80SSRU9Gr-LEW7AIW2458eI_DY-N4VHzmMABU8,3506 +PySide/examples/hyperui/hyperuilib/resource/hyperui.ini,sha256=eMyhQnLN35-1H6aE-FuOAhZAWoIkjEWuMNqfppNRT20,2175 +PySide/examples/hyperui/hyperuilib/resource/hyperui.qrc,sha256=cer_tyK2sglwLZhBeSyXJFiHyGKVhkE3FQnm7R6zIxk,3257 +PySide/examples/hyperui/hyperuilib/resource/hyperui_rc.py,sha256=H0MCYf5KUuVnFuvPz0Ebx86JsqSThJa7WhtrRDQl8Xw,8148287 +PySide/examples/hyperui/hyperuilib/resource/hyperui_rc.pyc,, +PySide/examples/hyperui/hyperuilib/resource/images/background.png,sha256=TstiDmWzK299bY8Na8DV0lxaqt2BHHHFGen3etnpx50,280244 +PySide/examples/hyperui/hyperuilib/resource/images/call_photo_athila.png,sha256=mJwjdn4DhDOttkC9_K2mVAbdgJM6NhxUrh4MEqftYg8,193188 +PySide/examples/hyperui/hyperuilib/resource/images/call_photo_dani.png,sha256=VLdH_5n1YxgODbztpy6OB38cSbKGLh-ydBCweYrQICU,260495 +PySide/examples/hyperui/hyperuilib/resource/images/call_photo_marcia.png,sha256=0RFd2_VZnxNxHJM-nB0slK2goZ8JYbfa2zjYNdemEKA,124579 +PySide/examples/hyperui/hyperuilib/resource/images/call_photo_nobody.png,sha256=ArYVzHFx_A88Eu_Zz8oysC3GWd6TWNVVK3-OAdU_t9k,5771 +PySide/examples/hyperui/hyperuilib/resource/images/dialer/background.png,sha256=Iktbb5XgTrsuvz4UOzNbynUaL6zmPKTEOXWIZLCcosk,2640 +PySide/examples/hyperui/hyperuilib/resource/images/dialer/bottom_left_key.png,sha256=NNoPaJQFiZQoO0kHD4CbvNzm0_5ZrI_8hMmo4Mxl4kA,1543 +PySide/examples/hyperui/hyperuilib/resource/images/dialer/bottom_left_key_pressed.png,sha256=WZv1mQqvUo1_RUsxleQZjUqzEwlgT1xxrYhgsCpgahI,1659 +PySide/examples/hyperui/hyperuilib/resource/images/dialer/bottom_right_key.png,sha256=J6xsn1Pfb4fGR9TgPEV-DifNXvIize4f7wVPWkZifSc,1499 +PySide/examples/hyperui/hyperuilib/resource/images/dialer/bottom_right_key_pressed.png,sha256=uiw6O6pGRswA_BPllZmX64MsR2TA5jA5mhUieMbLSrc,1554 +PySide/examples/hyperui/hyperuilib/resource/images/dialer/middle_key.png,sha256=hUCICrUM5flWs5lnzKS9BrPIy1CQzzLi9kY3oon_aGY,1383 +PySide/examples/hyperui/hyperuilib/resource/images/dialer/middle_key_pressed.png,sha256=5HJufzCs32E2apdjoWdzfOgnFOsv7FtQ6nF_XA2AVfk,1338 +PySide/examples/hyperui/hyperuilib/resource/images/dialer/top_left_key.png,sha256=McWYJF_HsPnDSEn6H8j7z3AZEkmIAzy6uABS5aHnlJU,1501 +PySide/examples/hyperui/hyperuilib/resource/images/dialer/top_left_key_pressed.png,sha256=yxss4fe-xm7tqkLC_fMQh2r1h-fxHDCr33-eERtsTE4,1590 +PySide/examples/hyperui/hyperuilib/resource/images/dialer/top_right_key.png,sha256=zEq8AukZ_O25qDtDwvd9KMSGZS4dewIWdQYZn2fWfOw,1515 +PySide/examples/hyperui/hyperuilib/resource/images/dialer/top_right_key_pressed.png,sha256=nElZDOlN05M7cvdxTwN0TwspKcd78sBAEDIxfdLqUgI,1561 +PySide/examples/hyperui/hyperuilib/resource/images/dialer_bk_bottom.png,sha256=_GJetumjPAIBvX1-xn7g8o8VyBDfcgF0DXk4Y_8h_A8,1352 +PySide/examples/hyperui/hyperuilib/resource/images/dialer_bk_lineexpand.png,sha256=DjUf5SwivNW2vDGTPqpmA_MJEeozTZJSk6TtlIQN1js,128 +PySide/examples/hyperui/hyperuilib/resource/images/dialer_bk_top.png,sha256=vapthpPJUxGdt98R5H-8yuFSK_DLqLbZVmRMrhzN5PQ,1445 +PySide/examples/hyperui/hyperuilib/resource/images/dialer_bt_call.png,sha256=zRKY20og9MHvzGDOaQd91LTHcUjFdu401a1Vq1iblMA,4240 +PySide/examples/hyperui/hyperuilib/resource/images/dialer_bt_call_over.png,sha256=cmVo8MVLU9fV5FNpCMkcY-pjFTMIzSpQKr0GPubOamI,4015 +PySide/examples/hyperui/hyperuilib/resource/images/dialer_bt_contacts.png,sha256=rEIXfySxYd66YRb69OnDOi9HbbtHo_S7DHBpNLMmJs4,5186 +PySide/examples/hyperui/hyperuilib/resource/images/dialer_bt_contacts_over.png,sha256=lDG6-ql_RYwwi1s0VtLocE0NCUEtJX8iFGLOku-PpLg,5218 +PySide/examples/hyperui/hyperuilib/resource/images/dialer_bt_dialer.png,sha256=bXWtwq9ynlwCtZ1YHjvP_Udw9ITkPrxkcWw-6gcKhwg,8073 +PySide/examples/hyperui/hyperuilib/resource/images/dialer_bt_endcall.png,sha256=-bQScM-X2TeTSQmAEJDN9kWGI-0ztK_E2OzEh0hJPXQ,3843 +PySide/examples/hyperui/hyperuilib/resource/images/dialer_bt_endcall_over.png,sha256=BHm3O1uSnCDbaB5i8PWSnFIfxXZtjhANxENXeoOix0I,3747 +PySide/examples/hyperui/hyperuilib/resource/images/dialer_bt_mute.png,sha256=djEkkqp51f0iJwtxyDavXbJTEITisj51iUKeX9edyoM,8473 +PySide/examples/hyperui/hyperuilib/resource/images/dialer_bt_speaker.png,sha256=ckg2gsxWMf5apUZKZUDwzwkj1Ae_uV7BRSRaa0CCj_Y,7480 +PySide/examples/hyperui/hyperuilib/resource/images/dialer_bullet_phone.png,sha256=8rut3Fe6FfMBjAXq057s1h0NlY-R5Rr-1bWvSurq8Ec,2869 +PySide/examples/hyperui/hyperuilib/resource/images/dialer_display_background.png,sha256=JIxQTGUU01dBWQLAikxw8vC5mdcsaTAw7AUrMIQrQCo,2078 +PySide/examples/hyperui/hyperuilib/resource/images/dialer_display_bt_cancel.png,sha256=RapcqBJuRnFtOHmnlxtB8RV7CtvzP6r5GoURevVdBOM,1992 +PySide/examples/hyperui/hyperuilib/resource/images/dialer_photo.png,sha256=QfhGusKnhxRcMOR41hDgQ0cbYlU3IWoJHniDlg4VzZ8,205239 +PySide/examples/hyperui/hyperuilib/resource/images/idle_clock_pointer_hour.png,sha256=bF-YNsUNdrDWj7gDCMTPk4Bj84r4Ln-d0eg-BHZ7-Fs,661 +PySide/examples/hyperui/hyperuilib/resource/images/idle_clock_pointer_minutes.png,sha256=7Lcr_PlqL3uxk7Dgot6LvcsasFbZwBZio9kbBXvDOJI,761 +PySide/examples/hyperui/hyperuilib/resource/images/idle_clock_pointers_middle.png,sha256=cURzMWioen2aygkqXa2K14FmOpxtS4qDR1xXBeS1k2I,1268 +PySide/examples/hyperui/hyperuilib/resource/images/idle_clock_structure.png,sha256=Bqz5sDt-ZxPGo8VjE-uRc_Pc4oun5m8fReIBwyQ2rTA,102537 +PySide/examples/hyperui/hyperuilib/resource/images/idle_line.png,sha256=EZlDGo6ZIWa6mI22sBRDXjjJO7NOWdkbNzTfQeIq50s,173 +PySide/examples/hyperui/hyperuilib/resource/images/list_abc.png,sha256=WT57gzGZp1pw8vjGoLyi-6d6MgslSdwZ6vzq3TxHLbc,6442 +PySide/examples/hyperui/hyperuilib/resource/images/list_abcmarker.png,sha256=ibYnFD6GnQL9iewcEdvl9wfvNGX2rtM8A8qMRwy9StY,3113 +PySide/examples/hyperui/hyperuilib/resource/images/list_divisor.png,sha256=rn6RocPEGFvSTL0j7Q0HDuZHNQZeQtcqot_v-4ysg8M,118 +PySide/examples/hyperui/hyperuilib/resource/images/list_icon_chat.png,sha256=lxm5tfH22SYfdjUzvze-5JE91JPpT4X7omK8A1lrlcM,3149 +PySide/examples/hyperui/hyperuilib/resource/images/list_icon_world.png,sha256=wCG1DyMINsJ2QXm5s5uZuxWJcKyN5Ulwz4Z8m82MikU,3722 +PySide/examples/hyperui/hyperuilib/resource/images/list_photo_athila.png,sha256=hPE1dO8NuW0Sk44XPfJPmTeMkeTd90wlfeKE7cMH9S0,27460 +PySide/examples/hyperui/hyperuilib/resource/images/list_photo_dani.png,sha256=x3h1rx-94xiosJvLQqCj4lnoKy3qhWmxZbUAzJcr3Lo,30322 +PySide/examples/hyperui/hyperuilib/resource/images/list_photo_marcia.png,sha256=dZ5bazgsxPSMbqVWEkFUqBHUkMm5VNdAjDt1rgQFMgc,18010 +PySide/examples/hyperui/hyperuilib/resource/images/menu_bt_calendar.png,sha256=f4gw3J2-Y4axAI2eh7HZ9OUjZD6ssMnESGSEitdj58o,19676 +PySide/examples/hyperui/hyperuilib/resource/images/menu_bt_camera.png,sha256=F24g4hwJIC5PLNcZBdjH1HYmRoqRJLrTuwgWcVlSXCY,19261 +PySide/examples/hyperui/hyperuilib/resource/images/menu_bt_chat.png,sha256=tdQQRbCM6mK1K6pca0K61JRbHzzBmOepJ1kwgkIa-TU,18559 +PySide/examples/hyperui/hyperuilib/resource/images/menu_bt_email.png,sha256=iDF6mYRqEIYTPiomEczRYaiJ-fPWIage-m0YiFnMMeM,18945 +PySide/examples/hyperui/hyperuilib/resource/images/menu_bt_folder.png,sha256=vYMu9FUTfXalc24RYFbFENY4xxZHrXZoetSU3SIU-7I,19630 +PySide/examples/hyperui/hyperuilib/resource/images/menu_bt_games.png,sha256=dsXhopuEc5EE5xbcV-kFSS9HrzcvUETQc6EvmQuf2Ro,19339 +PySide/examples/hyperui/hyperuilib/resource/images/menu_bt_music.png,sha256=eBA-6t02S1LjoVtH5pIWm4KKh_Nyc0drejaVTKOqreQ,19973 +PySide/examples/hyperui/hyperuilib/resource/images/menu_bt_navigation.png,sha256=CxoihlNKW09SqzKHCDktuNd9LTM881H8aeInZmlWU5Y,23827 +PySide/examples/hyperui/hyperuilib/resource/images/menu_bt_phone.png,sha256=fchTr1PwCZiCtYmc1NfyC3yJnnE0-hBOMgiLb-_O8mQ,35313 +PySide/examples/hyperui/hyperuilib/resource/images/menu_bt_settings.png,sha256=RtO45djmKzxfHSUCLq0d9_IapkQdRCXE09kGzRWVR_o,20436 +PySide/examples/hyperui/hyperuilib/resource/images/menu_bt_twitter.png,sha256=-7BMs90chP5I3ZH6EoA4KjGW3RxTcivWdDJAkJaMJjA,19693 +PySide/examples/hyperui/hyperuilib/resource/images/menu_bt_web.png,sha256=fsMHo4YwhbmntVd8EpxjVP67XKm6fh8TZVeMu6uFv0A,20398 +PySide/examples/hyperui/hyperuilib/resource/images/screen_unlock.png,sha256=eDDrf0VfmClvlsbqrNbUeslnC29xqXanWH4TOnZe9YA,325542 +PySide/examples/hyperui/hyperuilib/resource/images/top_bar_active.png,sha256=ZTyZFBoIhbb_udifNESa7Sz98bIwzEa44w2R0kYKmko,1899 +PySide/examples/hyperui/hyperuilib/resource/images/top_bt_back.png,sha256=xDUhY-AzJ6kkGxklyEWKn7MUBngg80rB35ZDSilTm-M,1425 +PySide/examples/hyperui/hyperuilib/resource/images/top_bt_back_disabled.png,sha256=N5uAfOzJya3vTgw6Zy99b1kngbXZmKGRpvzD4IcR-2I,1112 +PySide/examples/hyperui/hyperuilib/resource/images/top_bt_options.png,sha256=8y4GJGqyato8ZHT5WaAu1c9JZMH1GHWRL7yEQm-fgPg,1450 +PySide/examples/hyperui/hyperuilib/resource/images/top_bt_options_disabled.png,sha256=CPkDK8bUDSE9Au5Z7542rgQva1-nysGb11lGNi1di3g,1145 +PySide/examples/hyperui/hyperuilib/resource/images/topbar_3g.png,sha256=fbB6Wdw_xvY_SbMr9L9lpx2qt82gAMpLE3vyHLCwGmE,1249 +PySide/examples/hyperui/hyperuilib/resource/images/topbar_battery.png,sha256=ww0TnzFivPrLm8S_Uag8MkIQf34XbLa9hpoEdJItESM,815 +PySide/examples/hyperui/hyperuilib/resource/images/topbar_network.png,sha256=ZnfgctlYNAts6bHuv0eIDql7XSR-h8BfK4o67LqGZjU,791 +PySide/examples/hyperui/hyperuilib/scrollarea.py,sha256=uwY1Fs64LpwmuMEwObI1xKnLFvmPie4Xw8Va7JM36Z8,6685 +PySide/examples/hyperui/hyperuilib/scrollarea.pyc,, +PySide/examples/hyperui/hyperuilib/shared/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +PySide/examples/hyperui/hyperuilib/shared/__init__.pyc,, +PySide/examples/hyperui/hyperuilib/shared/button.py,sha256=ljRGGaWiJ4Pb5GHgV4soLv9C6LFiMa82ceIR5wz6LoM,4179 +PySide/examples/hyperui/hyperuilib/shared/button.pyc,, +PySide/examples/hyperui/hyperuilib/shared/dataresource.py,sha256=6B8f9MNMZkYjl_1_L5X8cUrBcn_O4iDDSdYQ7J9kl4g,2560 +PySide/examples/hyperui/hyperuilib/shared/dataresource.pyc,, +PySide/examples/hyperui/hyperuilib/shared/label.py,sha256=s6NcYNKsvZJqxe_4VcmaQfE_7MO7hmnp9cVxDB6tozU,2452 +PySide/examples/hyperui/hyperuilib/shared/label.pyc,, +PySide/examples/hyperui/hyperuilib/shared/pixmapwidget.py,sha256=rSkSsZO9a_cx1XeakbvuOdaVgqa-YsQJbVJFgyqmB9c,2372 +PySide/examples/hyperui/hyperuilib/shared/pixmapwidget.pyc,, +PySide/examples/hyperui/hyperuilib/shared/qt_system.py,sha256=q0hLdrKTse5UGO3xK8Tp7wuRJUe5MmTJ0sonip2y4lc,1639 +PySide/examples/hyperui/hyperuilib/shared/qt_system.pyc,, +PySide/examples/hyperui/hyperuilib/shared/utils.py,sha256=CxS05soIz_aczSl_50Nr5VoW3827uUrlh4XJU23uock,2892 +PySide/examples/hyperui/hyperuilib/shared/utils.pyc,, +PySide/examples/hyperui/hyperuilib/view.py,sha256=8je3FbAW1AKWDFKyUbMeZmllW21oIwvtVziwuQMFrYk,1617 +PySide/examples/hyperui/hyperuilib/view.pyc,, +PySide/examples/hyperui/setup.py,sha256=EibDsCsnUnWetk1cS1QwPptHyp_aD4JJWvvdXzyVzug,317 +PySide/examples/hyperui/setup.pyc,, +PySide/examples/itemviews/README,sha256=QNl_wmyAiWaS43p3NEbqG-r-0cqkSvan2Q0ruF5hsj0,894 +PySide/examples/itemviews/addressbook/adddialogwidget.py,sha256=J34I08C0oxLtqDtsejtBMjquxwP60b7E9pCdgR2K2Jg,4146 +PySide/examples/itemviews/addressbook/adddialogwidget.pyc,, +PySide/examples/itemviews/addressbook/addressbook.py,sha256=Q5JtxJm5e9n0EsjMZ0R6H0kAe7p1lJ6ZSb5uzl3BiOA,5446 +PySide/examples/itemviews/addressbook/addressbook.pyc,, +PySide/examples/itemviews/addressbook/addresswidget.py,sha256=_JVBQVoDl3tFg2cEdFLj4pooEGc5QD3PFBOyrL_bJEA,10731 +PySide/examples/itemviews/addressbook/addresswidget.pyc,, +PySide/examples/itemviews/addressbook/newaddresstab.py,sha256=-b8JSLwEi13K1LutUSD88t9VmJxo-pJs8FqyX9GhzmQ,3733 +PySide/examples/itemviews/addressbook/newaddresstab.pyc,, +PySide/examples/itemviews/addressbook/tablemodel.py,sha256=ZnblTJkcOVLBoqc0LPV43mjB_9nuiYO6WPetRnSBRB4,5703 +PySide/examples/itemviews/addressbook/tablemodel.pyc,, +PySide/examples/itemviews/basicsortfiltermodel.py,sha256=tFCpp_q7lDh_sLFwiiBtEW40UeA-dfis5vsSH1vtw14,8064 +PySide/examples/itemviews/basicsortfiltermodel.pyc,, +PySide/examples/itemviews/chart/chart.py,sha256=pOEbkdQMKtXwzv8zh57A8KK2CGKh0mhbbdBkGHoGLFM,21199 +PySide/examples/itemviews/chart/chart.pyc,, +PySide/examples/itemviews/chart/chart.qrc,sha256=FXWCE8M6Wgw2Kc-awAwfUGcbG-9imL0clIYIHx1405A,116 +PySide/examples/itemviews/chart/chart_rc.py,sha256=Xwkdz90iANSuBz5mg7BiVpXFBsAg6-Xp2RZk34DvA70,2634 +PySide/examples/itemviews/chart/chart_rc.pyc,, +PySide/examples/itemviews/chart/mydata.cht,sha256=HhrDjciFg1Dygx6OeqVFbQ0Dn4mUDQm8HJ7mJ4oVlWs,137 +PySide/examples/itemviews/chart/qtdata.cht,sha256=VvKJxak9-6EEPUx5MvD0T-pB9-pxbYsRzkKOHqSzCIg,414 +PySide/examples/itemviews/dirview.py,sha256=HoIfeVR_tK1Uun0gXEYW32wJtlvvBixbDdVhAd6ZOOE,1533 +PySide/examples/itemviews/dirview.pyc,, +PySide/examples/itemviews/editabletreemodel/default.txt,sha256=68KHW-ZdVPYEbZQ2zDxWD9SPGOLXpzYYxY_x-ZXRRfA,2017 +PySide/examples/itemviews/editabletreemodel/editabletreemodel.py,sha256=uLYiQWpf7Tb6X5f-Hqj3uJTklaDr1G8kL_1XZOfIyok,13694 +PySide/examples/itemviews/editabletreemodel/editabletreemodel.pyc,, +PySide/examples/itemviews/editabletreemodel/editabletreemodel.qrc,sha256=1V0H2LFf-c1UYBvTZ25rkZAwNC79rStkR5r64pbqlbo,96 +PySide/examples/itemviews/editabletreemodel/editabletreemodel_rc.py,sha256=oojJex9yGepw1mJg8MCR_FuvBC3dto7E6_ePe9oK1OI,9131 +PySide/examples/itemviews/editabletreemodel/editabletreemodel_rc.pyc,, +PySide/examples/itemviews/editabletreemodel/mainwindow.ui,sha256=47xL1udEyt1AKO8f_kY693m5gs9kccIpaw8s9MzA7cM,3476 +PySide/examples/itemviews/editabletreemodel/ui_mainwindow.py,sha256=K8XWH1J8oHKEPPNxoCPbgEkEv5B9Sd_xnj2lYTOPef8,5318 +PySide/examples/itemviews/editabletreemodel/ui_mainwindow.pyc,, +PySide/examples/itemviews/fetchmore.py,sha256=J8IEhunw2eofzWjByVJANz9qq-57fRcwvZTYFAEzLmg,2998 +PySide/examples/itemviews/fetchmore.pyc,, +PySide/examples/itemviews/pixelator/images.qrc,sha256=Tz2Zm_183k1BoVCkdfpLyru5jieUX9syIVZMWtGtAv8,101 +PySide/examples/itemviews/pixelator/images/qt.png,sha256=HI5SyWapzD8QYfdvlyf0z9wuLeyyQ-FcB_HH3DNXw9k,656 +PySide/examples/itemviews/pixelator/pixelator.py,sha256=MWY4_Sf8FdHVHWBnsdj_Xhp8PxBelctjE4t4C6xMQzA,9473 +PySide/examples/itemviews/pixelator/pixelator.pyc,, +PySide/examples/itemviews/pixelator/pixelator.qrc,sha256=Tz2Zm_183k1BoVCkdfpLyru5jieUX9syIVZMWtGtAv8,101 +PySide/examples/itemviews/pixelator/pixelator_rc.py,sha256=fnKRmBy-M_d4-QRCRWAwCLYXnHzF1XkYMldNrWaO1QY,3673 +PySide/examples/itemviews/pixelator/pixelator_rc.pyc,, +PySide/examples/itemviews/puzzle/example.jpg,sha256=iQMA08fvbToCLxm-XP-BtQNRgniuCyr0FHP_bssy1lA,31770 +PySide/examples/itemviews/puzzle/puzzle.py,sha256=Yhj3gv5KSQCWeI0O_G51sYucXc_XACgqQ_KJaSKOwNw,13563 +PySide/examples/itemviews/puzzle/puzzle.pyc,, +PySide/examples/itemviews/puzzle/puzzle.qrc,sha256=_4Wg0jTeKgp4ydSWvkGISfFpHxq-XQskn9FZBEPsyHg,116 +PySide/examples/itemviews/puzzle/puzzle_rc.py,sha256=IhXcQ64daMBOTt-lHMNq15JgIHr_BR1YkZIOU5Z7u6s,134004 +PySide/examples/itemviews/puzzle/puzzle_rc.pyc,, +PySide/examples/itemviews/simpledommodel.py,sha256=eXrY7ihfI20PYa6ruuSqKwwXNTqm3FLlr18uo-i8nlE,6235 +PySide/examples/itemviews/simpledommodel.pyc,, +PySide/examples/itemviews/simpletreemodel/default.txt,sha256=68KHW-ZdVPYEbZQ2zDxWD9SPGOLXpzYYxY_x-ZXRRfA,2017 +PySide/examples/itemviews/simpletreemodel/simpletreemodel.py,sha256=3o5S5wJxtPksMN_B-IVuh7I0B4hAmvp37kIEvnvdeZU,5824 +PySide/examples/itemviews/simpletreemodel/simpletreemodel.pyc,, +PySide/examples/itemviews/simpletreemodel/simpletreemodel.qrc,sha256=ZAShbjKun2Nq-DgH_tckDpuFTnxkxo_OTPrMipxVBQM,99 +PySide/examples/itemviews/simpletreemodel/simpletreemodel_rc.py,sha256=bgYrCw5ASWgvNfSMF_0OfTKsjp3-r9YbU299MHqU058,9104 +PySide/examples/itemviews/simpletreemodel/simpletreemodel_rc.pyc,, +PySide/examples/itemviews/spinboxdelegate.py,sha256=73KTG0JQUW2z_nIyYgXTcOZSpOe2Q5mdJDqgpULHDmg,2370 +PySide/examples/itemviews/spinboxdelegate.pyc,, +PySide/examples/itemviews/stardelegate/stardelegate.py,sha256=VSWsORJ0xsBMkoKGDdkwEjQWNxYZEJyFPH_lKNjvKhk,7802 +PySide/examples/itemviews/stardelegate/stardelegate.pyc,, +PySide/examples/itemviews/stardelegate/stareditor.py,sha256=l_CtL2dl_gF1yWR4VAexUGZ73nWjpUGW8JB18W5JfS4,4184 +PySide/examples/itemviews/stardelegate/stareditor.pyc,, +PySide/examples/itemviews/stardelegate/starrating.py,sha256=nCRuB2XrjNrwwE5sCFcIwaZ5jQPPnO_7fTdHrn93q4Q,4395 +PySide/examples/itemviews/stardelegate/starrating.pyc,, +PySide/examples/layouts/README,sha256=YCyTRzelX33v1Ja0SHsW-MN84GcKnOEKir7hofVeh-o,905 +PySide/examples/layouts/basiclayouts.py,sha256=c7M8xAmyNtmQKEK2Cwqvt3LqVooVbO1R-14OrgMB6v0,3094 +PySide/examples/layouts/basiclayouts.pyc,, +PySide/examples/layouts/borderlayout.py,sha256=8fQKq3d1VMkejRTnq1nxb-T22vDIgiWUZx3zoNronM8,7342 +PySide/examples/layouts/borderlayout.pyc,, +PySide/examples/layouts/dynamiclayouts.py,sha256=WnN9XgwoJ19yQ7JMbd5Vh17Fy7i6QDCBK1FgrJgfTfw,4985 +PySide/examples/layouts/dynamiclayouts.pyc,, +PySide/examples/layouts/flowlayout.py,sha256=X4Nm6Fmea-0EX00ao3BbfO7GcPOToryna59OgJ82DV8,3433 +PySide/examples/layouts/flowlayout.pyc,, +PySide/examples/mainwindows/README,sha256=VqD42qPC-aS4ukmCO_DZ6dpVGj9wKVFFONh4hr-gGqU,920 +PySide/examples/mainwindows/application/application.py,sha256=ergDBgqc6LRa8qelB028WJsqWJ1md3CdaQF68sUvdhQ,8585 +PySide/examples/mainwindows/application/application.pyc,, +PySide/examples/mainwindows/application/application.qrc,sha256=b4po_w6x-Hjy2KLf_lb_wCjgo2gaJk9pnozbEmV-cgk,273 +PySide/examples/mainwindows/application/application_rc.py,sha256=x0rIG1a7hM-MY1Ht4D9Rpo-D25mL6q9kmO2nBToLC-w,37127 +PySide/examples/mainwindows/application/application_rc.pyc,, +PySide/examples/mainwindows/application/images/copy.png,sha256=LxEVucHXBlC4RZcUp8QQomKdGZKiXkr57Kr6nPoSVNc,1338 +PySide/examples/mainwindows/application/images/cut.png,sha256=Q1YuctUp80qyG5KWm8N3EpuVb3gH9cLdBHthAr3fd64,1323 +PySide/examples/mainwindows/application/images/new.png,sha256=aHumk6yrY0C0mychzQMNq1pIICi2ScGBfqggs2vP1bw,852 +PySide/examples/mainwindows/application/images/open.png,sha256=H8mZR8pYwK-d-N7KYHV8YQ4dFyc8U07CLav2YQGISEM,2073 +PySide/examples/mainwindows/application/images/paste.png,sha256=2vm8BVT29T8IEiqgkRd81hmxNA2gMJZUU7zleyQ_Fis,1645 +PySide/examples/mainwindows/application/images/save.png,sha256=VFCatbeaXzBcuHcqm7W_T-osT064l63a3CDhFlaeBYA,1187 +PySide/examples/mainwindows/dockwidgets/dockwidgets.py,sha256=0uOpRvXUyPrfHcqczt5W-wGMM0rZJD5SY_91onZaFAk,11419 +PySide/examples/mainwindows/dockwidgets/dockwidgets.pyc,, +PySide/examples/mainwindows/dockwidgets/dockwidgets.qrc,sha256=t60Qk9P5QUmJOJiC4EeeE-oaIrB2VfH1Yeu0vxAxANM,206 +PySide/examples/mainwindows/dockwidgets/dockwidgets_rc.py,sha256=AGpmFLeusX3eDHSB4mj_1T4VnmVe5VDRJLqogPkOcLU,28201 +PySide/examples/mainwindows/dockwidgets/dockwidgets_rc.pyc,, +PySide/examples/mainwindows/dockwidgets/images/new.png,sha256=zeBj5yUA2GGBTyrO_b3Hbpmgo02uso7yHpn232RHc6A,977 +PySide/examples/mainwindows/dockwidgets/images/print.png,sha256=MOot-j9Qk8m_VhLYcuX13J_fkrIul4eQlX8_7rtCcCI,1732 +PySide/examples/mainwindows/dockwidgets/images/save.png,sha256=SW1Cg2QXsc45zyU6afjb1q8I3B59lny_GEBX1RlCrZU,1894 +PySide/examples/mainwindows/dockwidgets/images/undo.png,sha256=AwQVAD8uslsv7Q_QJNrfQlOsnuSs8tb4BoLiV2tbCdg,1768 +PySide/examples/mainwindows/mdi/images/copy.png,sha256=LxEVucHXBlC4RZcUp8QQomKdGZKiXkr57Kr6nPoSVNc,1338 +PySide/examples/mainwindows/mdi/images/cut.png,sha256=Q1YuctUp80qyG5KWm8N3EpuVb3gH9cLdBHthAr3fd64,1323 +PySide/examples/mainwindows/mdi/images/new.png,sha256=aHumk6yrY0C0mychzQMNq1pIICi2ScGBfqggs2vP1bw,852 +PySide/examples/mainwindows/mdi/images/open.png,sha256=H8mZR8pYwK-d-N7KYHV8YQ4dFyc8U07CLav2YQGISEM,2073 +PySide/examples/mainwindows/mdi/images/paste.png,sha256=2vm8BVT29T8IEiqgkRd81hmxNA2gMJZUU7zleyQ_Fis,1645 +PySide/examples/mainwindows/mdi/images/save.png,sha256=VFCatbeaXzBcuHcqm7W_T-osT064l63a3CDhFlaeBYA,1187 +PySide/examples/mainwindows/mdi/mdi.py,sha256=bmLbvCWwpq6ElF_moK-BKcj_szA1A62Uc8ijdy0Cz0Y,15927 +PySide/examples/mainwindows/mdi/mdi.pyc,, +PySide/examples/mainwindows/mdi/mdi.qrc,sha256=b4po_w6x-Hjy2KLf_lb_wCjgo2gaJk9pnozbEmV-cgk,273 +PySide/examples/mainwindows/mdi/mdi_rc.py,sha256=aCvD9HyLu6mI5OrySnYD6SeFXVYe_opu34R5xDlCsH4,37127 +PySide/examples/mainwindows/mdi/mdi_rc.pyc,, +PySide/examples/mainwindows/menus.py,sha256=z-MFokQ4JDfGV5suCwcjJYsUfwtBQEDLpWFgs62qJfs,10697 +PySide/examples/mainwindows/menus.pyc,, +PySide/examples/mainwindows/recentfiles.py,sha256=9BoEH6reaB0hhTbDTsnmpGtehRbhxwdk6i7ImvxteVI,8054 +PySide/examples/mainwindows/recentfiles.pyc,, +PySide/examples/mainwindows/sdi/images/copy.png,sha256=LxEVucHXBlC4RZcUp8QQomKdGZKiXkr57Kr6nPoSVNc,1338 +PySide/examples/mainwindows/sdi/images/cut.png,sha256=Q1YuctUp80qyG5KWm8N3EpuVb3gH9cLdBHthAr3fd64,1323 +PySide/examples/mainwindows/sdi/images/new.png,sha256=aHumk6yrY0C0mychzQMNq1pIICi2ScGBfqggs2vP1bw,852 +PySide/examples/mainwindows/sdi/images/open.png,sha256=H8mZR8pYwK-d-N7KYHV8YQ4dFyc8U07CLav2YQGISEM,2073 +PySide/examples/mainwindows/sdi/images/paste.png,sha256=2vm8BVT29T8IEiqgkRd81hmxNA2gMJZUU7zleyQ_Fis,1645 +PySide/examples/mainwindows/sdi/images/save.png,sha256=VFCatbeaXzBcuHcqm7W_T-osT064l63a3CDhFlaeBYA,1187 +PySide/examples/mainwindows/sdi/sdi.py,sha256=xF4gpimiwIlkaYckDeFINbnGaoILvjFgt0RpScAk9wM,11026 +PySide/examples/mainwindows/sdi/sdi.pyc,, +PySide/examples/mainwindows/sdi/sdi.qrc,sha256=b4po_w6x-Hjy2KLf_lb_wCjgo2gaJk9pnozbEmV-cgk,273 +PySide/examples/mainwindows/sdi/sdi_rc.py,sha256=VZkD515pdIh1qBID6qcQKfdbDPUn7jkJhVkbSlDFegE,37127 +PySide/examples/mainwindows/sdi/sdi_rc.pyc,, +PySide/examples/network/README,sha256=8eE8TK3eT-ovAJjoHgo3_3pj2Aw6u7BFMlafdn8xsvk,848 +PySide/examples/network/blockingfortuneclient.py,sha256=xG0oA94zbNTJk7JUBV6YRyX7IvoFJWgQgLE21ATv34A,7231 +PySide/examples/network/blockingfortuneclient.pyc,, +PySide/examples/network/broadcastreceiver.py,sha256=qlrAK0Dd5tZbngUJNM1TgIWAI3ohxSyowJDodkcFbxU,2643 +PySide/examples/network/broadcastreceiver.pyc,, +PySide/examples/network/broadcastsender.py,sha256=1NCn7SwBh-3mGB0GkmYYyQgGIhP8SCH12LWI46SMdBw,2789 +PySide/examples/network/broadcastsender.pyc,, +PySide/examples/network/fortuneclient.py,sha256=G9QCJQcs_ven-rPA4DDAFSNg5YVlJEPLLrZD8_oRWk8,4660 +PySide/examples/network/fortuneclient.pyc,, +PySide/examples/network/fortuneserver.py,sha256=2R-s4rkttVA3w5DUPXVgwWcakvn8q7lSDy9PPAhKUJI,2779 +PySide/examples/network/fortuneserver.pyc,, +PySide/examples/network/ftp/ftp.py,sha256=wWmqCaTyW-SDngvr-BjJDkcv_uvx36-27KdxWlCy72k,9487 +PySide/examples/network/ftp/ftp.pyc,, +PySide/examples/network/ftp/ftp.qrc,sha256=fE_DGyzuDq671Cbndd68m7qAD58a1noMgo_NIzx5B8k,177 +PySide/examples/network/ftp/ftp_rc.py,sha256=c2N2PSElu2YUyqjctJwMOBFwSOI6Jc0yOXr6-cgyK-8,3121 +PySide/examples/network/ftp/ftp_rc.pyc,, +PySide/examples/network/ftp/images/cdtoparent.png,sha256=h80f6aAq34Hf5kp3O02mrhkV5U6ShBu6Qtt3ZIRcMvY,139 +PySide/examples/network/ftp/images/dir.png,sha256=5ARmkQ-AT7iNS0aXJMSmcMSGcxFvxaBRL4c61aFfzbM,155 +PySide/examples/network/ftp/images/file.png,sha256=bhkiosrEok78G8_XzsMtBC-EFibyYyzVDTq-ns7gtU8,129 +PySide/examples/network/http.py,sha256=I46_LuBPSIO2EqGOe5HIIfj9ixzH4CPONwZn1-hWKmY,6129 +PySide/examples/network/http.pyc,, +PySide/examples/network/http/authenticationdialog.ui,sha256=k5vhoAV48SAFQcrFTeZF0yN9Ekd9009FHqWldguQPNM,3234 +PySide/examples/network/http/http.py,sha256=MXiYzzkC1iFqF5kA5CB5B9Ie3uafPq1MBZreLEuBkBA,7429 +PySide/examples/network/http/http.pyc,, +PySide/examples/network/loopback.py,sha256=GyX8kq09dVBYSRZ_yhFT_JlvR_dfFY9Ni8ABHrVPtBU,6155 +PySide/examples/network/loopback.pyc,, +PySide/examples/network/threadedfortuneserver.py,sha256=wUfAYhMEoUJMo4W4SY3seKHGX1BJyms-VzPa6nAQeBc,4429 +PySide/examples/network/threadedfortuneserver.pyc,, +PySide/examples/opengl/2dpainting.py,sha256=dtmiM01KhZSOLLKSGj_gc7DXnaQQNSdpw_QmPv3ywXk,5061 +PySide/examples/opengl/2dpainting.pyc,, +PySide/examples/opengl/README,sha256=4SzOd4zvW437aFh9aegcvSZxv9-hYABx4YAnEUKbEVs,935 +PySide/examples/opengl/grabber.py,sha256=1uOT2Nm0u1g9d_Bb37HvuqmHqKeaCW9dkth8V5qTWsE,14142 +PySide/examples/opengl/grabber.pyc,, +PySide/examples/opengl/hellogl.py,sha256=bJqvzS2rfg3qgfArtVBPygaBeOIIqKffvd1jR_Wfx7s,7534 +PySide/examples/opengl/hellogl.pyc,, +PySide/examples/opengl/overpainting.py,sha256=5wKF3JhmsmnmuGLDDtdYFEA9u9TxtKCMYVS_nfsfadY,12634 +PySide/examples/opengl/overpainting.pyc,, +PySide/examples/opengl/samplebuffers.py,sha256=i9KOSwTC4fEHKzdWNds03opXE91y3K_OZviI8eapT7g,4469 +PySide/examples/opengl/samplebuffers.pyc,, +PySide/examples/opengl/textures/images/side1.png,sha256=8X6HJy8wBzMsIo7htHmEhrwDmh1tAhmdFuoWxTvloHM,1044 +PySide/examples/opengl/textures/images/side2.png,sha256=RkzsgIEArO7Cq7-jB2nxxFUeck-LGhTOCNiFlDW-1vI,1768 +PySide/examples/opengl/textures/images/side3.png,sha256=4JTF_rnFvqzAc9BtJIkkIktxgynsH_d2LUoE-CiSTwM,2323 +PySide/examples/opengl/textures/images/side4.png,sha256=_NwUUQgRfGt_ougpu2YhRanweEjL8ka-xXZf67hJv8c,1342 +PySide/examples/opengl/textures/images/side5.png,sha256=V4ccxX1Pgmj7nOoMuhHBlH2vYWVrLwEOKzHc_22FHpA,1959 +PySide/examples/opengl/textures/images/side6.png,sha256=fohRWmI778Fhs70Q-JbFoM-VllT874WHqW2z0dBeOsQ,2446 +PySide/examples/opengl/textures/textures.py,sha256=wq0EKBNQeRP3bqM7jkr3yWo5tP4ehU6EwBEesAAcFYQ,7274 +PySide/examples/opengl/textures/textures.pyc,, +PySide/examples/opengl/textures/textures.qrc,sha256=DCbDCYTr9gUKi7uZroEr9pC_8WKzYgiKxMJaKiyOJuo,280 +PySide/examples/opengl/textures/textures_rc.py,sha256=lDE3oYkmEgNlSnZX-v4PQr_vNAmygzYko2fTYSVkN-0,47473 +PySide/examples/opengl/textures/textures_rc.pyc,, +PySide/examples/painting/README,sha256=chRlfy0sapl3dGUjRbxKbCX-9Nf49irr4qaU62t27uk,975 +PySide/examples/painting/basicdrawing/basicdrawing.py,sha256=fypr1_1HFxETutH47hM7LckXw78U2wlbMcu-cl9qB90,14784 +PySide/examples/painting/basicdrawing/basicdrawing.pyc,, +PySide/examples/painting/basicdrawing/basicdrawing.qrc,sha256=aPUgSArdMsNSYqP2uef-M3ojh6_24FQ41VAkVxUgJtU,142 +PySide/examples/painting/basicdrawing/basicdrawing_rc.py,sha256=Noa9MyU8hT9ugvxgB6tgh0dmsOqxUyxn1NQ7OM9F4tY,6976 +PySide/examples/painting/basicdrawing/basicdrawing_rc.pyc,, +PySide/examples/painting/basicdrawing/images/brick.png,sha256=SxdPlnzxbOiTwvuUUCYjKYtzLimtMBdtYlv_lSj3k1A,856 +PySide/examples/painting/basicdrawing/images/qt-logo.png,sha256=qC21wm7cOk4_Hm1yCuxzkfOdtk0KSduQo4PyoXegBqM,533 +PySide/examples/painting/concentriccircles.py,sha256=vtkTDLMQMKTK65esyFl2Iabi63BuAvgzIO5SCJGN7WI,4636 +PySide/examples/painting/concentriccircles.pyc,, +PySide/examples/painting/painterpaths.py,sha256=gXJezFkVqqMHAFOfjtRyTkNq-gehfw1AE_7UrFkniLE,10573 +PySide/examples/painting/painterpaths.pyc,, +PySide/examples/painting/svgviewer/files/bubbles.svg,sha256=qaK0Ck2s7Y-viUumowUiqhc3BxrX3Qi4F1NlAYzk0IA,10119 +PySide/examples/painting/svgviewer/files/cubic.svg,sha256=NLl5Kiey7601R1WMiIFqKa2p7sWj70x3D4euqKdIDtE,5357 +PySide/examples/painting/svgviewer/files/spheres.svg,sha256=BpkuO1pKXn6hRAfOJBniQ13YYdYsNFv8gO-Zcs-bRdQ,3637 +PySide/examples/painting/svgviewer/svgviewer.py,sha256=RWq8RhJHsP_M4SmUq5GXjGEuBGy4O6fDAwV2tL5lAGA,8699 +PySide/examples/painting/svgviewer/svgviewer.pyc,, +PySide/examples/painting/svgviewer/svgviewer.qrc,sha256=qlUZRoWdEM5eYSqzYas_sf8jfjZimG-u4Ib48k5gUfU,147 +PySide/examples/painting/svgviewer/svgviewer_rc.py,sha256=O2jyu2C1dxh_KjUFeOFX9Ibd0i0aG2vjopDj7_6LsEM,38159 +PySide/examples/painting/svgviewer/svgviewer_rc.pyc,, +PySide/examples/painting/transformations.py,sha256=fKy9ghVYkz9ULewrAXs3V_GebrydHbEnPtm7t9ws8Bc,8190 +PySide/examples/painting/transformations.pyc,, +PySide/examples/phonon/FolgersCoffe_512kb_mp4_026vbr260.ogv,sha256=Lg7JvqEtev-dMdB6fkAo8g0xrJkWDZ9ZiwqkwYw0kmQ,2397943 +PySide/examples/phonon/README,sha256=o6paq5UEu_ckgK4ht_xBx-u7_OySxSPFRFovN2f3Pdc,860 +PySide/examples/phonon/capabilities.py,sha256=hdi3xxCJCyeIBZLP2zkr3rctspHFN1Bn9P4ld6mVm4U,5184 +PySide/examples/phonon/capabilities.pyc,, +PySide/examples/phonon/musicplayer.py,sha256=nJjnr38HLrbgJhMVNOGa555xvJdJiVU_f3kVPASekJA,12876 +PySide/examples/phonon/musicplayer.pyc,, +PySide/examples/phonon/pyqplayer/images/folder-music.png,sha256=65PF3SPN4rDXcoTnkY1SJjIa-W1EfJiqqrIETgm3h1I,5310 +PySide/examples/phonon/pyqplayer/images/pause.png,sha256=9B5wUFzz4n1XzQbEWtRMCJKcG0r8Ftc-74nA4yJWZp4,913 +PySide/examples/phonon/pyqplayer/images/play.png,sha256=6tj_BIisAHgeO4MnFo24JKJj9FLQhJRn8nuN6gcDLcs,1097 +PySide/examples/phonon/pyqplayer/images/qplayer.png,sha256=0YMxh_FNunGV4aEUxfm2IUbd1QVGqa5MEkNhzXbylqs,4278 +PySide/examples/phonon/pyqplayer/images/stop.png,sha256=83vl-CtdopH7PATovo3gCqMVaJRVtkmsUjZZcZNWNSQ,720 +PySide/examples/phonon/pyqplayer/pysideqplayer.py,sha256=l2jZJ4kxyRIirBGhOSPUYTZ_E_axDdr6zH-8DpXZvPY,5360 +PySide/examples/phonon/pyqplayer/pysideqplayer.pyc,, +PySide/examples/phonon/pyqplayer/qplayer.qrc,sha256=Q7jCPiB7TQ27AbXY2osMULCYqkHIw_YBD6eQARgterg,207 +PySide/examples/phonon/pyqplayer/qrc_resources.py,sha256=qyoJPgaOGFLVH04NIMezTlRb7VZv9D44EyRKXbLgGhY,53377 +PySide/examples/phonon/pyqplayer/qrc_resources.pyc,, +PySide/examples/phonon/videoplayer.py,sha256=lVW6o0A0eGCTfXbzBMgEOkf1ew-Jix1Z0N-OKjOao_E,1767 +PySide/examples/phonon/videoplayer.pyc,, +PySide/examples/richtext/README,sha256=LhM2kWE03M1H4gU3zadZqMV9LLVlJ0FTnBnAtczm8jg,983 +PySide/examples/richtext/calendar.py,sha256=vQdql45s8RDnEPMMZsyE2opwODOP-4HeIVipL7mN7NU,6324 +PySide/examples/richtext/calendar.pyc,, +PySide/examples/richtext/orderform.py,sha256=lPb1ndLPWuGCnNLhsPOR2VWgqoKNyxQVjV5EZ-PBPjI,9216 +PySide/examples/richtext/orderform.pyc,, +PySide/examples/richtext/syntaxhighlighter.py,sha256=47wYj4C21qrDcKzHdg1sxPzIc1bWNeeZrUB8O2ftBvA,6024 +PySide/examples/richtext/syntaxhighlighter.pyc,, +PySide/examples/richtext/syntaxhighlighter/examples/example,sha256=tSUBN9Li3qEMPy84S4QgLVBfMmODuNO3XaiYLSmNAX8,1736 +PySide/examples/richtext/syntaxhighlighter/syntaxhighlighter.py,sha256=Dbg16yU4GM6u5-o53yGtTliV6NKZXIsGnptuRouQEJY,4898 +PySide/examples/richtext/syntaxhighlighter/syntaxhighlighter.pyc,, +PySide/examples/richtext/syntaxhighlighter/syntaxhighlighter.qrc,sha256=lZUo-0tV-TsEJs3HUQyySy86CJ8obrUQ7lts9KdDId0,116 +PySide/examples/richtext/syntaxhighlighter/syntaxhighlighter_rc.py,sha256=g7sVyMAixBC1c2ZqQYs4vEHung5Yg0GVwTaXrBncqHE,7891 +PySide/examples/richtext/syntaxhighlighter/syntaxhighlighter_rc.pyc,, +PySide/examples/richtext/textobject/files/heart.svg,sha256=I7WvkxBdFIntdNvhfqHLyz_yXW4l-XMRTo9ZpdLJtL4,3928 +PySide/examples/richtext/textobject/textobject.py,sha256=4RKuWoc112uisGPjKIgPfVM1hZNKVzYkrXp9Tmk6W_k,2823 +PySide/examples/richtext/textobject/textobject.pyc,, +PySide/examples/script/README,sha256=gy5ebRUirMQahyg3VM0dQsKK9j9zQDUnCvxFLmobuwg,751 +PySide/examples/script/calculator/calculator.js,sha256=AUXf7fQK-sLZbHwWp8xOSfxTu6lSeY9irDv6aKdt_Ps,8848 +PySide/examples/script/calculator/calculator.py,sha256=CsoBNvu9xYhZyUFibvAiNMoaL0xLvjuKLES8eSs2HL4,2534 +PySide/examples/script/calculator/calculator.pyc,, +PySide/examples/script/calculator/calculator.qrc,sha256=p678OFFNU8_QP2YFWWFf43tQOI4BnmLZSoA2E-VXeeo,134 +PySide/examples/script/calculator/calculator.ui,sha256=1Wy05PUrWb8gQbN7glNNltwtQa4Ib6-8CI_m8I1AMVQ,9162 +PySide/examples/script/calculator/calculator_rc.py,sha256=pVl2Gr8NZ-V9LU1YP7bu0Fa7AwY9ZjuqA70bi0-gYE8,73634 +PySide/examples/script/calculator/calculator_rc.pyc,, +PySide/examples/script/helloscript.py,sha256=VBnEINTqAXqNk1u2KbgUCbJ_1RGreNnAOMkRUzc7Yqc,522 +PySide/examples/script/helloscript.pyc,, +PySide/examples/sql/README,sha256=JetOg1orNQYu9Rp8Q7-ghDGbyxSPUCJJBmFKogcv934,888 +PySide/examples/sql/cachedtable.py,sha256=yYiVo-46sw9amw0Y1TKXMiTA7-wsImoKOl0HftBz60s,3249 +PySide/examples/sql/cachedtable.pyc,, +PySide/examples/sql/connection.py,sha256=dFZTtTenm4YM9vmcXQyuIq1MzNWX3SG3bmvFltnSFy8,2308 +PySide/examples/sql/connection.pyc,, +PySide/examples/sql/querymodel.py,sha256=D4GlVLukKZD1NoATwDTd0qxU52aYrCgWKtZY21K-uM8,4312 +PySide/examples/sql/querymodel.pyc,, +PySide/examples/sql/relationaltablemodel.py,sha256=bEMql2J22fIdL8X6jSE5zNjo5ot9eevxh26NM3kxZus,3134 +PySide/examples/sql/relationaltablemodel.pyc,, +PySide/examples/sql/tablemodel.py,sha256=Z2jOvB0_mWorG2Jfv2DXr6uYhLO8p4q9v0a-m9iEli0,2103 +PySide/examples/sql/tablemodel.pyc,, +PySide/examples/state-machine/eventtrans.py,sha256=mFqkOGG4sh-tppC5NBDCvTGo46CK_URzSTonp8lf1b0,1609 +PySide/examples/state-machine/eventtrans.pyc,, +PySide/examples/state-machine/factstates.py,sha256=zYkf-PLqVCWKSpS7Ez4RJNgiyFywAfTzQ6IrhjO4j5M,2234 +PySide/examples/state-machine/factstates.pyc,, +PySide/examples/state-machine/pingpong.py,sha256=8M0zUa6PEj1Xe-CFqIngE9KrTCphqrwKO5FmDXSoHT0,1631 +PySide/examples/state-machine/pingpong.pyc,, +PySide/examples/state-machine/rogue.py,sha256=tGK5gNrBy-0uFmxKtpKwC_11qCWpdAH6lMOaO2YDyEQ,5589 +PySide/examples/state-machine/rogue.pyc,, +PySide/examples/state-machine/trafficlight.py,sha256=XhUh2PXV2s-vA2C3e9GTVynA10oNRRJZqla6XGm4nGg,3582 +PySide/examples/state-machine/trafficlight.pyc,, +PySide/examples/state-machine/twowaybutton.py,sha256=TxMIMthtX7ZClTWMVe-hQw7kMQU22K-TcuzKf6oCNvY,811 +PySide/examples/state-machine/twowaybutton.pyc,, +PySide/examples/threads/README,sha256=xNEvXnEb_Lt5tRCX8Op-N42w4unADWPHZEqDIaQ8mdE,900 +PySide/examples/threads/mandelbrot.py,sha256=QeGLWvme8O5AZc4WkhzF4nOLk_tBKVF3tN6f4_7vvPE,11539 +PySide/examples/threads/mandelbrot.pyc,, +PySide/examples/threads/semaphores.py,sha256=eRTsL97PLEQjgeJp8BO6kskklks881leQlUAM5kgq8w,1994 +PySide/examples/threads/semaphores.pyc,, +PySide/examples/threads/waitconditions.py,sha256=YuQchwKfIOXmMg3SUiztGD2Vm_wWjDpY41o1rzWsP0o,2537 +PySide/examples/threads/waitconditions.pyc,, +PySide/examples/tools/README,sha256=JRwvSCohjaJHhb7OR8fbwr6vUbKeXfOU2cugBs65Hzw,873 +PySide/examples/tools/codecs/codecs.py,sha256=Piz9LW6JlBKQOpAo2o75qsCGty1CO_7voYOjdEuAkhg,6912 +PySide/examples/tools/codecs/codecs.pyc,, +PySide/examples/tools/codecs/encodedfiles/iso-8859-1.txt,sha256=sWvYBkYywIt76Q2O3djw2S4VOsBnZ96P4vkXmvwEtLg,252 +PySide/examples/tools/codecs/encodedfiles/iso-8859-15.txt,sha256=hLuxk-fs370hACw9AvXl0u2H-Y1OacEvQ4Rp4eANXCY,337 +PySide/examples/tools/codecs/encodedfiles/utf-16.txt,sha256=6zvpdI8NRdTVZlHUMZK3f5754bOtmoSyvnYpvll0wSw,163 +PySide/examples/tools/codecs/encodedfiles/utf-16be.txt,sha256=v6S9lNT3natG8cuMvKnUZra7r9Au_BUm7Im9RyTpEXg,160 +PySide/examples/tools/codecs/encodedfiles/utf-16le.txt,sha256=wsXrAYMeIlZVgF81cHsbmJRfDuFzhgqBTFNy2J17rso,160 +PySide/examples/tools/codecs/encodedfiles/utf-8.txt,sha256=00isZeGmKSHsHT24MODbJWXp_MEq8UazKWkO6LrebAg,133 +PySide/examples/tools/i18n/i18n.py,sha256=JrUPLU25AHYL0NdvWM5jRUSxxxBnb5LW5WC7sPEc9KY,7519 +PySide/examples/tools/i18n/i18n.pyc,, +PySide/examples/tools/i18n/i18n.qrc,sha256=bIWzmAOkA-xsbSMYRWmbkW_CVoTXLmeemrvMuiKzmAw,658 +PySide/examples/tools/i18n/i18n_rc.py,sha256=k_J7tddEXR2yUP8OVBjJyTLTqk7Q9nuijG7Q0iXji_A,49598 +PySide/examples/tools/i18n/i18n_rc.pyc,, +PySide/examples/tools/i18n/translations/i18n_ar.qm,sha256=b-QjIprfDqIu95sOhqdkpi2Cuj4mfBHWOJ2Bmun3VeY,736 +PySide/examples/tools/i18n/translations/i18n_ar.ts,sha256=bfaAIEsYfHz1xsVOgWlumUaH_BUpFlV56CoZFJJKOMM,1560 +PySide/examples/tools/i18n/translations/i18n_cs.qm,sha256=6mWy8TVjZ-odkRpNBXs6n584gEKrXFdQmpKIII-ZbLA,796 +PySide/examples/tools/i18n/translations/i18n_cs.ts,sha256=HpeyVVdbzH27ExpjmFXNU50ECo66zN_kgsqF4dzakkE,1547 +PySide/examples/tools/i18n/translations/i18n_de.qm,sha256=qDR_9dmeivZI3k1eTb0PaQd7ne06xPt6Hk0ZStZH13k,848 +PySide/examples/tools/i18n/translations/i18n_de.ts,sha256=ZSJT0QDtoxlueaNxcH1DF7yJowEZHZLx9Ban6Lnamcw,1562 +PySide/examples/tools/i18n/translations/i18n_el.qm,sha256=5fdnHoavrpECaB5kIBJPUvzd8Z2jobpNPFcPvtGHVpU,804 +PySide/examples/tools/i18n/translations/i18n_el.ts,sha256=B4ccYab10uwxCLZ0pyNHUio0HlVQAr80VcGEUkxtDko,1634 +PySide/examples/tools/i18n/translations/i18n_en.qm,sha256=ME9ARKOpTu4TokmoMrlOSYe02wVmJIfSCJWvmx4nIgc,810 +PySide/examples/tools/i18n/translations/i18n_en.ts,sha256=H9WHkpgQsjynV8koG32vUOut-pL7CfzkE5xpYHkeboE,1543 +PySide/examples/tools/i18n/translations/i18n_eo.qm,sha256=au4I7-lCWhXmTlTC0PvV3Z2epZsGK8lLhOH7gXdct5g,806 +PySide/examples/tools/i18n/translations/i18n_eo.ts,sha256=Q9ZXqjJ91-U-gTnN0ZqxN9koLT8TjPabSlYB58psjnU,1541 +PySide/examples/tools/i18n/translations/i18n_fr.qm,sha256=97IWHCOQb3t1AaWOWgJsFR_uHiD0awIeRDd2RkwGKKc,844 +PySide/examples/tools/i18n/translations/i18n_fr.ts,sha256=mGTZtY-qn6b8VYUJ4ptvmXwaBSQx5CE3VwZJ9WVQwyY,1569 +PySide/examples/tools/i18n/translations/i18n_it.qm,sha256=VSykpIPZIXMDiO_UK9vEI4PU0NtUofI17qMCPUKGXak,808 +PySide/examples/tools/i18n/translations/i18n_it.ts,sha256=jCvu1rBF21HRDBzi0IKVI_WiJe10usI2WTufAzsfD24,1542 +PySide/examples/tools/i18n/translations/i18n_jp.qm,sha256=5jMnz-F8dzzYvDNtw7Iu_rlObBWLR0FIov0mPwyB90g,722 +PySide/examples/tools/i18n/translations/i18n_jp.ts,sha256=RKlcQBlAcjkYxwztY7YfGth7Uc34OIAJk1vnAe6FJaU,1583 +PySide/examples/tools/i18n/translations/i18n_ko.qm,sha256=b8hFnbv5YaQNE_1k0VVNdRWM25TbNkQAvrFLBfVz9W0,690 +PySide/examples/tools/i18n/translations/i18n_ko.ts,sha256=eiyuIqkXx9BDs-lVyr585fKDeBlxcnmjwBgs00VqV5M,1551 +PySide/examples/tools/i18n/translations/i18n_no.qm,sha256=VQg_1j-QvpwwqD2Z6LPR8ezD_6ufE0MoZAymy5cTcfo,804 +PySide/examples/tools/i18n/translations/i18n_no.ts,sha256=JIOFzVWaP6FSv-6X7ZohewyGNIBK-2CYm_4hQUKqMcQ,1542 +PySide/examples/tools/i18n/translations/i18n_pt.qm,sha256=Q7IxUBgZ-Q4icMJIrq4nXfStAuT-kxchECdj4KmXDGA,838 +PySide/examples/tools/i18n/translations/i18n_pt.ts,sha256=DeVHxyj6Vii-ELx-G0VpC6Ld6c74EqweiNOhzIxVGTc,1563 +PySide/examples/tools/i18n/translations/i18n_ru.qm,sha256=GkxZdbpmKF_VBmtwhFdAfCwcTS9aYA3K31DG6e2Q2Oo,806 +PySide/examples/tools/i18n/translations/i18n_ru.ts,sha256=2Cy70jRCgPI574bCGDC7zLv7cU-BEfcIcs5VwFNB76g,1630 +PySide/examples/tools/i18n/translations/i18n_sv.qm,sha256=9h_vY6AGtjsZ-85Fifbayvy4DxCUR2HpY7vhOWdxfwg,814 +PySide/examples/tools/i18n/translations/i18n_sv.ts,sha256=iuowRsmoFiSXDkZFO-Eg0xNMkAun48WzsjuGeNwIskE,1547 +PySide/examples/tools/i18n/translations/i18n_zh.qm,sha256=Lx7iseZzAydAAr-EfcpZ6vk6gfFT9R9OQPqnX48aSiA,700 +PySide/examples/tools/i18n/translations/i18n_zh.ts,sha256=ZOvTCQxD3ne5IdSa4rz6-UoBFeJIDo89xRBEh00_OEI,1562 +PySide/examples/tools/qtdemo/demos.xml,sha256=Q8TU8wlNz0sa1W2uBRE8kAickGDbNHO1G0ZK5D2d6Bo,865 +PySide/examples/tools/qtdemo/displayshape.py,sha256=kZudtXkofVJ5cI79PG6qfqQgJct9RYFpGg-nzhwtFy0,13867 +PySide/examples/tools/qtdemo/displayshape.pyc,, +PySide/examples/tools/qtdemo/displaywidget.py,sha256=tJdI0Jkeg_4IavsqudyTb2gcP3c_siearY_Ox98T7Ls,5864 +PySide/examples/tools/qtdemo/displaywidget.pyc,, +PySide/examples/tools/qtdemo/examples.xml,sha256=XoEnwNaduSTFcSqUF9z4Te0uxaUwb53GtM2mOAsvCAg,7913 +PySide/examples/tools/qtdemo/images/qt4-logo.png,sha256=fpc9scrB6Sezax-X-tXZoAWaRL7rMtljnZ6cqWw38Fw,10772 +PySide/examples/tools/qtdemo/images/rb-logo.png,sha256=kxoFK3bzN61VqYRAi8Ddar24QFkKQJFMMsUfxHcrfM0,10743 +PySide/examples/tools/qtdemo/launcher.py,sha256=4f3rKrbrEHbEnTDBeA8jUknpZ21yavg4zW1NvMPTqqg,45744 +PySide/examples/tools/qtdemo/launcher.pyc,, +PySide/examples/tools/qtdemo/qtdemo.py,sha256=X2RQ7DT6kbZd_L4j4atR4ReISvuXxVwnlptlB4oFgrk,1657 +PySide/examples/tools/qtdemo/qtdemo.pyc,, +PySide/examples/tools/qtdemo/qtdemo.qrc,sha256=DGv93w7lq4ng-ulNwMIeoHToqunAv97nC5q_nFcRSv8,211 +PySide/examples/tools/qtdemo/qtdemo.rc,sha256=_PRKXmKmlUkb0PCIqcRFGXiVOEXASkmfi3XnjyO058Y,64 +PySide/examples/tools/qtdemo/qtdemo_rc.py,sha256=wgT-CEi-pMlC9VzZbIZjxnG_DWbT9nuRzvymLx5r6dg,127776 +PySide/examples/tools/qtdemo/qtdemo_rc.pyc,, +PySide/examples/tools/regexp.py,sha256=7qChpIGPqYPBfmtPk8CYz-wH2FYRUOzrQkNcsNWmzg8,6155 +PySide/examples/tools/regexp.pyc,, +PySide/examples/tools/settingseditor/inifiles/licensepage.ini,sha256=R10XbG9J3iqXEJvFPsYlknzMIuADkDg5xLmqKMq6W44,829 +PySide/examples/tools/settingseditor/inifiles/qsa.ini,sha256=NkUDvLgQq31xa1cLNL3K1usGeugiygAaBnHYwu2zfWo,357 +PySide/examples/tools/settingseditor/inifiles/troll.ini,sha256=OXXLsNVLq8zS9tcdgvIqaQEjvvjJLzL-9XB54JFRMMc,95 +PySide/examples/tools/settingseditor/settingseditor.py,sha256=QzOBP-d8UUVpmRCffyn_z3joGLJdJm8MEfcV7yI5nIs,26175 +PySide/examples/tools/settingseditor/settingseditor.pyc,, +PySide/examples/tutorial/README,sha256=UpuBqzdyNK32bcNqDeoQJDjobCv_5X_HdycSAKLvOyw,130 +PySide/examples/tutorial/t1.py,sha256=sGjTP_Lr588Eqx_QfvohJfPM-k47YzfPFnL_-HZuZhM,235 +PySide/examples/tutorial/t1.pyc,, +PySide/examples/tutorial/t10.py,sha256=Q34Xl7RKpglE8A3bl0lJ8AeFjZwvv1BL7Y-9uJXMYec,4424 +PySide/examples/tutorial/t10.pyc,, +PySide/examples/tutorial/t11.py,sha256=SMpnEP-KzWaEf8YT6flQvg0R49tBoLBGl1Kgtgp2Lpw,6718 +PySide/examples/tutorial/t11.pyc,, +PySide/examples/tutorial/t12.py,sha256=KqsTEwEJP_Tb5zIsytnPG_imTfYvIFma99k2Tcgwz88,8257 +PySide/examples/tutorial/t12.pyc,, +PySide/examples/tutorial/t13.py,sha256=J5XX5fLtg_Jhb78C0zoZ7V9WcurFFaFdFu29OcGRT5M,10991 +PySide/examples/tutorial/t13.pyc,, +PySide/examples/tutorial/t14.py,sha256=zeEBd7vOAn4tQb7gszNW1jb3CEzm3sgI4cKbCb4axZM,13014 +PySide/examples/tutorial/t14.pyc,, +PySide/examples/tutorial/t2.py,sha256=ykArJUle6mVTKzWqrJ-VDY7_tODvjKFoelzYNjLER8s,399 +PySide/examples/tutorial/t2.pyc,, +PySide/examples/tutorial/t3.py,sha256=_N_JbiCeyb4_O5s3EZrOu74rdumd2h4M1Yj61eTL48I,474 +PySide/examples/tutorial/t3.pyc,, +PySide/examples/tutorial/t4.py,sha256=2PrMJTWcYb9EFDvBRafmXCchAORtGl7PzjvQevBvpXg,645 +PySide/examples/tutorial/t4.pyc,, +PySide/examples/tutorial/t5.py,sha256=76QqYek39NKUwkCk-tyEN_7GWnm2pwtL8iFD2-hY8tw,986 +PySide/examples/tutorial/t5.pyc,, +PySide/examples/tutorial/t6.py,sha256=DH7UOASEsJYYPXE8B84G2C34WWJNnbbFDF2_qKwVvec,1366 +PySide/examples/tutorial/t6.pyc,, +PySide/examples/tutorial/t7.py,sha256=hH32BVRAMPBDz4-EVguFV49Fxr2CTfkWIYzCSDK7jjw,1953 +PySide/examples/tutorial/t7.pyc,, +PySide/examples/tutorial/t8.py,sha256=RVJjv7i0ZfIVAeOzT4_5sM8nMIS8eroJOV9_kmMqEhA,3265 +PySide/examples/tutorial/t8.pyc,, +PySide/examples/tutorial/t9.py,sha256=T_KGOCXtT2xQg2j2lWeAaLU4vNJ1fsayr2YTzLkjfMM,3503 +PySide/examples/tutorial/t9.pyc,, +PySide/examples/tutorials/addressbook/README,sha256=HbQiIcNqgTJeBgEXLVjKstgFKPmvpaUl78-KJw8rhYg,701 +PySide/examples/tutorials/addressbook/part1.py,sha256=CcOJox81aA20xXpbBISHeeK8cmmCCsf6N93NDx7wymk,1269 +PySide/examples/tutorials/addressbook/part1.pyc,, +PySide/examples/tutorials/addressbook/part2.py,sha256=ZI9YTsgUieyXQDV9YcZgpXWSN6DeB6X5MFEO42Yssuc,4689 +PySide/examples/tutorials/addressbook/part2.pyc,, +PySide/examples/tutorials/addressbook/part3.py,sha256=zHwsXmzxxOb3kD2KOuxXVEygmrKeGgkJsuBRn8k9sj8,6788 +PySide/examples/tutorials/addressbook/part3.pyc,, +PySide/examples/tutorials/addressbook/part4.py,sha256=n1771G0pbYuqwICVYFs9SqjPt40DssH5B_aHLLIcCj8,9330 +PySide/examples/tutorials/addressbook/part4.pyc,, +PySide/examples/tutorials/addressbook/part5.py,sha256=ye2v9LPT8YG9ASxS6E18N1jRT3q6KZ3OZnboyuOAE3E,11290 +PySide/examples/tutorials/addressbook/part5.pyc,, +PySide/examples/tutorials/addressbook/part6.py,sha256=rT3mcyVI5GnxcFNK-aSEtGiZ851xcDwwxKTdxfObOQU,13540 +PySide/examples/tutorials/addressbook/part6.pyc,, +PySide/examples/tutorials/addressbook/part7.py,sha256=c5GCW842EollKp02pCjkf4Zjcu88DuU63XvhnnbATG8,15273 +PySide/examples/tutorials/addressbook/part7.pyc,, +PySide/examples/webkit/hellowebkit.py,sha256=hz_sH0Bs5wo7V6eYL731TCO4ZBDUJSb4eQZ5tTfh_yI,1182 +PySide/examples/webkit/hellowebkit.pyc,, +PySide/examples/webkit/qml-webkit-plugin/HelloWorld.qml,sha256=oU9Wk8uT9q7uQEJyvAt6vYW-0-A9WjlYNGHmfg5w2Uk,377 +PySide/examples/webkit/qml-webkit-plugin/index.html,sha256=dIvINUCIbpPY_LPWZhLa6LAZ0chix0OmGaR3Uu4fCnw,158 +PySide/examples/webkit/qml-webkit-plugin/main.py,sha256=QFNQWwWoNmpRjCbn5NSiJ6JoKpAXfgkM1O3_hoOUcG0,1610 +PySide/examples/webkit/qml-webkit-plugin/main.pyc,, +PySide/examples/widgets/README,sha256=AsMi678BdCGNuZvd7fnJ-GJkbHxsaRoNgDnv32Ip_nA,1005 +PySide/examples/widgets/analogclock.py,sha256=U_UYVInj54TJGiAG-jYWj-zdnNRmNHRUkfksJwsadEs,3232 +PySide/examples/widgets/analogclock.pyc,, +PySide/examples/widgets/calculator.py,sha256=wLAKxladXgRWaokz5zb3KZoFu9exdSVkLfkp3DZ2L8o,11352 +PySide/examples/widgets/calculator.pyc,, +PySide/examples/widgets/charactermap.py,sha256=ke-bS4Dxsgv2NLpjJfjqj6rEeWWqA7j7VQXgYOhyjz0,10044 +PySide/examples/widgets/charactermap.pyc,, +PySide/examples/widgets/digitalclock.py,sha256=cmhfP4UUmuxwvheXSEJGW14d3I3dElcPPFbOJ4_bRL4,1935 +PySide/examples/widgets/digitalclock.pyc,, +PySide/examples/widgets/groupbox.py,sha256=hnigXbZkgDjDu4ojkLd3o-wYrs-cb4MlVcOUP28AGUg,5026 +PySide/examples/widgets/groupbox.pyc,, +PySide/examples/widgets/icons/icons.py,sha256=iUpNsCvmeqFA7h9vCe2g706DYFrG0eFgUeZp5hZ7N_A,17039 +PySide/examples/widgets/icons/icons.pyc,, +PySide/examples/widgets/icons/images/designer.png,sha256=eQh6Oah7dN8kQj6XQiz4URZ7oZO6jK3wSCNryDtExk0,4205 +PySide/examples/widgets/icons/images/find_disabled.png,sha256=jwVfccXUVPQOrYc34BEvWJMNmg4tGb_GOJJylgLjy30,501 +PySide/examples/widgets/icons/images/find_normal.png,sha256=b8IB-z9UyRgok5cMSPMYzD5YgVxTaPCmnEeM-ATTF5g,838 +PySide/examples/widgets/icons/images/monkey_off_128x128.png,sha256=rTyub4KNNC2jYjItY_5leRq0riWKs0GfSTWZs5BDd_U,7045 +PySide/examples/widgets/icons/images/monkey_off_16x16.png,sha256=Dr_9atvF2z_66rL9NxsUVP5l7cKekg3Mw53TzLlARL0,683 +PySide/examples/widgets/icons/images/monkey_off_32x32.png,sha256=IbJ30OeJxOjXwvXKypUb1wJja_zQRsvBuracVPkaULw,1609 +PySide/examples/widgets/icons/images/monkey_off_64x64.png,sha256=QezBafX5zIPSHZEWU0-_2RVkJac-ACrCSYV8N9ScC_0,3533 +PySide/examples/widgets/icons/images/monkey_on_128x128.png,sha256=euc4CfDsutWzzW94nI4BnUP4yEwxE2jt223uYkdZeB4,6909 +PySide/examples/widgets/icons/images/monkey_on_16x16.png,sha256=1QhaPGvIU-HewRJtjIwYRftdY2FPG4FNyu1io7t8SD0,681 +PySide/examples/widgets/icons/images/monkey_on_32x32.png,sha256=Tse-MDwSgCVDXvYHSc1fkFypXahOg9R5JWg9HRMZjqw,1577 +PySide/examples/widgets/icons/images/monkey_on_64x64.png,sha256=5u3iUlO2p-GFy0y23n7k7lPujXO6UZb90pz5M0iRf7Y,3479 +PySide/examples/widgets/icons/images/qt_extended_16x16.png,sha256=102OPx8Y__56c-UuhNiTvkdknBmnrJWKDeFfLynBKaM,834 +PySide/examples/widgets/icons/images/qt_extended_32x32.png,sha256=cddFGCz_hP-GEWBLRLs6g3Rs3SqieVscXsdQhK7M010,1892 +PySide/examples/widgets/icons/images/qt_extended_48x48.png,sha256=VjDWd0y_cblhQ2uKd6T3uwJCf-7_QtNG_zJxcyooTmU,3672 +PySide/examples/widgets/imageviewer.py,sha256=1kGl2WKF29--aAq_EmjS8hYQK6iJ6_iUVTWl3rfYVuk,7757 +PySide/examples/widgets/imageviewer.pyc,, +PySide/examples/widgets/lineedits.py,sha256=3PwX2Zhil_96cRKwgqH-R15HVbFpjq8xcHjd00ae8TY,7149 +PySide/examples/widgets/lineedits.pyc,, +PySide/examples/widgets/movie/animation.mng,sha256=FpQEEdBDsMi1ZNJIXbYU3cwHugqWJ-PbbxIbhELWI5k,5464 +PySide/examples/widgets/movie/movie.py,sha256=fJ0NS-Crd9hYJwXSb5-Cbv9h5ee9SvKPUON4LidOcdg,7325 +PySide/examples/widgets/movie/movie.pyc,, +PySide/examples/widgets/scribble.py,sha256=ecvVh_qAm52VzEKG20OWOp0XUWP7X7Duo45onQBt-Z0,10798 +PySide/examples/widgets/scribble.pyc,, +PySide/examples/widgets/shapedclock.py,sha256=xMsnnIUyb-2dZ9aqLGI9d65cb1-2rs2rmfEIPg8gv_8,4366 +PySide/examples/widgets/shapedclock.pyc,, +PySide/examples/widgets/sliders.py,sha256=cy7TjICEQActUJhi0rJIXoT91vchbeKlBTWfeD7nc-M,6968 +PySide/examples/widgets/sliders.pyc,, +PySide/examples/widgets/spinboxes.py,sha256=gOjOrRaTWUjpSm5i6hgohh6K4bB1D1fvcoJdcydl8bg,8097 +PySide/examples/widgets/spinboxes.pyc,, +PySide/examples/widgets/styles.py,sha256=Pnk4nMSI0Nq9mLxQ9wM0eLzVs3SzMXfxwKgXoSAYEgc,8483 +PySide/examples/widgets/styles.pyc,, +PySide/examples/widgets/tetrix.py,sha256=6IfeyXM7iEkhhFYvJrLIcqUyc8Zaki0N4iStUy43QIY,15113 +PySide/examples/widgets/tetrix.pyc,, +PySide/examples/widgets/tooltips/images/circle.png,sha256=Yn0jVrSWPH0ZMhC80mVzTXc4_kLhHWCI5__i6zshnhQ,165 +PySide/examples/widgets/tooltips/images/square.png,sha256=5RV-_WllFdttf1bwq7TYNnIYIfTNXzh9MTjgg30lNWU,94 +PySide/examples/widgets/tooltips/images/triangle.png,sha256=lZtuKrySr_qXolvRDgDV3LQfoSO2AnSJ5MNuIl5zImI,170 +PySide/examples/widgets/tooltips/tooltips.py,sha256=4ZLLtsZl4DX8jog_JR-8Au2exGK8-TmalzmeGEuuBTM,8990 +PySide/examples/widgets/tooltips/tooltips.pyc,, +PySide/examples/widgets/tooltips/tooltips.qrc,sha256=K7M-cx2434ZJPcYxLCDwn90QsWw3ZiLBBlvJISehZhg,177 +PySide/examples/widgets/tooltips/tooltips_rc.py,sha256=mU3fRuKIajwKlbtVOuNhnIZwxAgTXccOj2h9LtL4CFQ,3200 +PySide/examples/widgets/tooltips/tooltips_rc.pyc,, +PySide/examples/widgets/wiggly.py,sha256=2k0vh7DPdS5cUXKq5kaV_pAXoQjtYDfzg-mKzLgQdPQ,3283 +PySide/examples/widgets/wiggly.pyc,, +PySide/examples/widgets/windowflags.py,sha256=H4Kx5-IDZCg-LjApDdhn-mzwkxuwU6UWRza1WzUA4Fg,11310 +PySide/examples/widgets/windowflags.pyc,, +PySide/examples/xml/README,sha256=R7PX--ELEu1dzwrZqJefiMkjmkXSu6VwcfgUia7SlxQ,858 +PySide/examples/xml/dombookmarks/dombookmarks.py,sha256=AXLYCcqwkhWK409DOuJoOEnXrfJWUanyJcUtaUbKtto,7926 +PySide/examples/xml/dombookmarks/dombookmarks.pyc,, +PySide/examples/xml/dombookmarks/frank.xbel,sha256=xT-dSBwrKcWcaRgcObKohj0pqjDzWurwEipIFQxrR2A,10975 +PySide/examples/xml/dombookmarks/jennifer.xbel,sha256=GKSkBwURz1vEYqJGB6D7usYoDOpHya6521uJClRv0eU,4031 +PySide/examples/xml/saxbookmarks/frank.xbel,sha256=xT-dSBwrKcWcaRgcObKohj0pqjDzWurwEipIFQxrR2A,10975 +PySide/examples/xml/saxbookmarks/jennifer.xbel,sha256=GKSkBwURz1vEYqJGB6D7usYoDOpHya6521uJClRv0eU,4031 +PySide/examples/xml/saxbookmarks/saxbookmarks.py,sha256=KZF-ZcUEhnat_Zndb8OpvEEeIW8vAmSrbMHN31Mwmes,10371 +PySide/examples/xml/saxbookmarks/saxbookmarks.pyc,, +PySide/examples/xmlpatterns/schema/files/contact.xsd,sha256=2MNBnK7bajFGVMVeO1WK1fqsML7xJ_locuxaLqcQLdE,980 +PySide/examples/xmlpatterns/schema/files/invalid_contact.xml,sha256=tvCAFXwgxBaDobCb-5032C6D7_Sx8_tQWOiPbKH2hQ4,296 +PySide/examples/xmlpatterns/schema/files/invalid_order.xml,sha256=kiRnhrRdiPp_wJCwrIGg2qulP2HNmVkfHJBXXbZuXTQ,315 +PySide/examples/xmlpatterns/schema/files/invalid_recipe.xml,sha256=TBYTdlmUks_bLAwBnnL9EmJY4dpCoEe1_fNjgVq63PE,611 +PySide/examples/xmlpatterns/schema/files/order.xsd,sha256=xgOmtA7UR9Au2ljYgC3c8HzrnShe8lU1urFk-72pgjc,894 +PySide/examples/xmlpatterns/schema/files/recipe.xsd,sha256=_iwpBV0b0DY5Ae4RkOa9yq-ZQE1g-q1pLWyMuQI2IOM,1581 +PySide/examples/xmlpatterns/schema/files/valid_contact.xml,sha256=i58ciQPS9IoYs9wOVMeOzLI_Lsxu_TLzIYflkdf7HGc,309 +PySide/examples/xmlpatterns/schema/files/valid_order.xml,sha256=a3xBa7txkyUK9FHvOUgLSZ1OREo1zc19ZtOCok5qX-Q,456 +PySide/examples/xmlpatterns/schema/files/valid_recipe.xml,sha256=9Kt3zwpeZqMJtefAjdbRCzpSAa0XAqMLyXC9IHWjMrU,562 +PySide/examples/xmlpatterns/schema/schema.py,sha256=UD15tUkCpTpvZjgzATnf69TNIqa19yyXNfCT3L2BfZk,8075 +PySide/examples/xmlpatterns/schema/schema.pyc,, +PySide/examples/xmlpatterns/schema/schema.qrc,sha256=ronfCzQxJ5_BKvzBwIyyZpn3mgBiBtbLZTVb1lnRutc,628 +PySide/examples/xmlpatterns/schema/schema.ui,sha256=o73IAAu7ZNBXulKtCUBMoE7eeuVyUSVWXZ_5lzhhjco,2097 +PySide/examples/xmlpatterns/schema/schema_rc.py,sha256=IJpTF45deKvsgeip4SKK72Scnpj67qjF1EDE7FJ3zvs,27112 +PySide/examples/xmlpatterns/schema/schema_rc.pyc,, +PySide/examples/xmlpatterns/schema/ui_schema.py,sha256=zY0GXoJmJvTZyCVIJkQL2lF8okJxKyIWizwfKUUTSVU,3672 +PySide/examples/xmlpatterns/schema/ui_schema.pyc,, +PySide/imports/Qt/labs/folderlistmodel/qmldir,sha256=azH6BUE8lF6dLMXfzyvYMmMiL4gEUbVxmIP499jGtOw,33 +PySide/imports/Qt/labs/folderlistmodel/qmlfolderlistmodelplugin.dll,sha256=XuXfS5ARrterlFFpxhDRTDOmPtCfy51T-Y0KdzyGPhY,40448 +PySide/imports/Qt/labs/gestures/qmldir,sha256=958KreF4t0mJnySO_QLPhozMcp5cDKCD0a5P0aFRJ_A,26 +PySide/imports/Qt/labs/gestures/qmlgesturesplugin.dll,sha256=K1Ho2l3ziUvGZoI9TxiqsJfAJNqlcjY6SPRmVfvWH3s,43008 +PySide/imports/Qt/labs/particles/qmldir,sha256=BvRVpepa7lKVmT8EtqxtpDNCh_ESukJmU8TM-zg9GvQ,27 +PySide/imports/Qt/labs/particles/qmlparticlesplugin.dll,sha256=frf-vxWgNautVJLz5eyRjNbQNbbNZ0UgXG6pk3nCCDA,60416 +PySide/imports/Qt/labs/shaders/qmldir,sha256=SslUzB7ab7b8gh5Ju4s641sMInkJLEF0dH87__jumC8,27 +PySide/imports/Qt/labs/shaders/qmlshadersplugin.dll,sha256=xEKmqNnJRHs9nIkIBm4WEQbaUF6rUiZr2hRlu56646s,74752 +PySide/imports/QtWebKit/qmldir,sha256=5h93Q72Lp3QnhhMBEt1ZCbXagZaslNADHoErEY-A81Y,24 +PySide/imports/QtWebKit/qmlwebkitplugin.dll,sha256=8r1ekOaM0fNeLAKwneufTvvM__iNJWJw33tf66ApTKM,72192 +PySide/include/PySide/QtCore/pyside_qtcore_python.h,sha256=Zgq9GXJKbyJxDfdReuP5k6ug7r1rk5z0i7xFiQOhWfs,72974 +PySide/include/PySide/QtDeclarative/pyside_qtdeclarative_python.h,sha256=-jxTWdbPYMZ78u-UBHs2dWM0qVKxJ26LRiB_2iiIDhc,10066 +PySide/include/PySide/QtGui/pyside_qtgui_python.h,sha256=RGeES00v3vNA8ep3MjCnZx6vn8CxvrEJ-yINvSYkCJ0,176650 +PySide/include/PySide/QtGui/qpytextobject.h,sha256=swhbhxB7gjeGMjhnsu6CqoyZ6cKHshAwRXKSoyWykm8,1473 +PySide/include/PySide/QtHelp/pyside_qthelp_python.h,sha256=A3IARG6b2M46leCxNfptkP4QLuP1vk8Iknl_dOLBARE,6636 +PySide/include/PySide/QtMultimedia/pyside_qtmultimedia_python.h,sha256=20AmVanHeoAN3pzJP_noIVyhv1LmGsDGUFFQGA6-S1U,9300 +PySide/include/PySide/QtNetwork/pyside_qtnetwork_python.h,sha256=BS7OD5h-it-xkkJZ9u6xbQzKniwvbVXq3aXdJTavPXE,25611 +PySide/include/PySide/QtOpenGL/pyside_qtopengl_python.h,sha256=wL9PRhlbp1dlVNFI7dupG_hQAwJQC1j3CVvBkk_4TwM,8178 +PySide/include/PySide/QtScript/pyside_qtscript_python.h,sha256=Csi4hP2ZKNIklfah2YwvbLmhqUo_RjQJShU1l0BtyYY,9305 +PySide/include/PySide/QtScriptTools/pyside_qtscripttools_python.h,sha256=Tcpk0VcfNulViZnREj5DwWwMZI32EEStGAh23SqkhZk,3775 +PySide/include/PySide/QtSql/pyside_qtsql_python.h,sha256=6tEwXMgMjj_KEjnzYzgwcULqyLVeElfV3Nv8IeaH6V4,9646 +PySide/include/PySide/QtSvg/pyside_qtsvg_python.h,sha256=yHhaVwNLThDMDphP4nUXafvrUJulNT1xNUo6rlKW3Wk,3982 +PySide/include/PySide/QtTest/pyside_qttest_python.h,sha256=-rdKxL8xFYGEICMDgUPXTz5qNbYT8A-Jmv7NC02H3tw,4406 +PySide/include/PySide/QtUiTools/pyside_qtuitools_python.h,sha256=9cXtRFtuvNtf9o4hQMAsMp_bPaUK2HZgeLISiNWSHDY,2985 +PySide/include/PySide/QtWebKit/pyside_qtwebkit_python.h,sha256=jPLsISMA8kAmljxjiMyzms1MAszOwpnXfY_koYlqRaU,13140 +PySide/include/PySide/QtXml/pyside_qtxml_python.h,sha256=Ra43zbbf1q4s7sEUe5ayZ-IA3MV_vc-H9TROmIwTXfM,10133 +PySide/include/PySide/QtXmlPatterns/pyside_qtxmlpatterns_python.h,sha256=3YXRgZDkysumvayp0TQXG7vG5FfJht4FOY-u1X7IGk0,7939 +PySide/include/PySide/destroylistener.h,sha256=EqS9zhsIwaVwrT6bALLiC1N32moOEprvoRCmJXWPVA0,734 +PySide/include/PySide/dynamicqmetaobject.h,sha256=z22rza9iuFIEMBdooih1hF49Y8DPncw52Ince9299Cw,2096 +PySide/include/PySide/globalreceiver.h,sha256=bhbIhULbkhN04xj1vPm4VD6HIPT-oGA2HNfB7FegIcI,1831 +PySide/include/PySide/phonon/pyside_phonon_python.h,sha256=ZgoiCWAxOch5qJTafhKrfNxijuYYEhIE6J2QdA0fwBE,19403 +PySide/include/PySide/pyside.h,sha256=_phPgI3S7t_lQ6_yc-XCkyMMKpMLwo1HsXohUJzZqMg,4625 +PySide/include/PySide/pyside_global.h,sha256=4ukBq4PQv_UKUoQTxo13AQU9qPD6rfSRJPiygYXlct4,16604 +PySide/include/PySide/pysideclassinfo.h,sha256=tWhs8OiO31fjUtFtfmY_IOyJX5vHK_fq2PjGKo2inc0,1529 +PySide/include/PySide/pysideconversions.h,sha256=-VFPrpVVurjja6isV3HgTwvxiaOwONNSlaG8_KUYgjo,9249 +PySide/include/PySide/pysidemacros.h,sha256=oTtlNBKhN6QLjexQMntO2q6MGr1V19ihEZJo7-a_oe8,1580 +PySide/include/PySide/pysidemetafunction.h,sha256=XysQ12MX0CCBa0ACCjMLQdtUqZU836uTdnbBcKXIFWo,1793 +PySide/include/PySide/pysideproperty.h,sha256=8GHMSu-51pJYL5IytXfC-Hlro54hqzqhJV11Bd9_a_8,3207 +PySide/include/PySide/pysideqflags.h,sha256=tRw5KNuPpwagLSep8sVgs8ce-7xdGHsw13_fXc8DmA8,1837 +PySide/include/PySide/pysidesignal.h,sha256=g-N5MJTzDDCMZf73X298fkXHurLtaza3Xt5K_1Ib_aE,5603 +PySide/include/PySide/pysideweakref.h,sha256=frlD_uZal2ASo_OMVeS6DW10Ae9GT1Sc0IBRhl3ep7Y,336 +PySide/include/PySide/signalmanager.h,sha256=5BAn07WeBstrVB3nUitY5T0HM86Q9M2Q11GyDAC15ek,3902 +PySide/include/shiboken/autodecref.h,sha256=d4foFkc102XkV7pdFgRW18rM0vVGA3EjhQhMyoynSjs,2950 +PySide/include/shiboken/basewrapper.h,sha256=exkpIwgtz08eJIe1Th_aaxBeBRrHS2Ui_auviWeftoU,17819 +PySide/include/shiboken/bindingmanager.h,sha256=E5b2ewL0RPiP8NK-GDNZWeVtVGRMQZyXve74VYWN6jE,3305 +PySide/include/shiboken/conversions.h,sha256=NnlaELPjXkL5B2CHKO9qJnjAnMEEC_gAIq1h_G85g6w,27628 +PySide/include/shiboken/gilstate.h,sha256=FlPLQ9GBgoAz5pALmJf2CkZ3C2gHVP-w3NSRyWCxdo8,1299 +PySide/include/shiboken/helper.h,sha256=WhuwqFYO9dRNhGgkQcfKTPaqxdD7ftfKd0izoDteMU0,4401 +PySide/include/shiboken/python25compat.h,sha256=mqjonYZNJu2rhgXzLg_rSMWaI48KKkcmqfRMphEej9k,2888 +PySide/include/shiboken/sbkconverter.h,sha256=dgkHi3_oU8RfpYtsWSHwaqRZ0PAJSDPdW5XndXIBU_s,16836 +PySide/include/shiboken/sbkdbg.h,sha256=b_GZydEJifiFb3RLd_6j1Ja7giRIpu4QWaQUy6LJRG4,3002 +PySide/include/shiboken/sbkenum.h,sha256=L6YidvTymTy4e0oojela48Cc7yhcUwEV2_35Vz7dWRI,4519 +PySide/include/shiboken/sbkmodule.h,sha256=oeE_fsUO2PIiZKUV5VS8tAMXBleueh2TL0KAOXKS5SM,3579 +PySide/include/shiboken/sbkpython.h,sha256=YklUCt4dvzmxSB-7SqPhMcN7vICo9D0qBuOISLKRXjQ,2065 +PySide/include/shiboken/sbkstring.h,sha256=KzN3zykPu3LmnM5M07rDa0GKmvMPTWES2dtQQPwwMSQ,2045 +PySide/include/shiboken/sbkversion.h,sha256=Mp5JYdW4LnakH8XvHEDHWvfHER7OlDUzc8outaAy6u8,1217 +PySide/include/shiboken/shiboken.h,sha256=MsfQjYyu8dzfAem6oqe57T-Qlk8EXHdvcTtdwt1tWtk,1413 +PySide/include/shiboken/shibokenbuffer.h,sha256=Fd2BWWztmOf1uSLe0TdwVY5OqV6MR6AWYR_SxZEELPU,2169 +PySide/include/shiboken/shibokenmacros.h,sha256=0PTqajq0Iy8uY6IZytwAfIQI1oW39JE54bOMZ6f_P-U,1622 +PySide/include/shiboken/threadstatesaver.h,sha256=2RfN7lZUhwJ__TDBFXz0yjMrCCEQxtcqrQHRd2KiLOg,1457 +PySide/include/shiboken/typeresolver.h,sha256=b_FGcrdEPQvrEIPLKT76Y8vcEBG5B5QrWS-TrsQezz4,3767 +PySide/lconvert.exe,sha256=EaBzo1xUtC7GrxL3rxnhjPhlUG9BB41pBhQaVN3Z1g0,311296 +PySide/linguist.exe,sha256=rtl2JJ9iZ_VAFTLziIxTtuRFBlmUoENHWGc1nCaf3no,1981952 +PySide/lrelease.exe,sha256=rRSru2XH0hEQni14YIiP3D_w_o3e_iyALQobOo77ihU,1560064 +PySide/lupdate.exe,sha256=IOL735WopKhL7Eo8YmbQvWeAVZ1oghTUo87O5aUWrmo,992768 +PySide/openssl/libeay32.dll,sha256=O-ljB6rRG2fNCJotneBrUd7llqMLMFqqLOeHhMmqb3s,2077184 +PySide/openssl/ssleay32.dll,sha256=kmZy9NCcpL7193h4m04R7aYuCErBR2ivratjhSaw6RI,379392 +PySide/phonon.pyd,sha256=ssaGDg1XllA0wcvHo1FGOy1YcA0SXpu110VGtAImQGw,630272 +PySide/phonon4.dll,sha256=aK_VrgvzAJhVeQvSgK-krUa9xA4fsxpvq0nLXtsvYUA,341504 +PySide/plugins/accessible/qtaccessiblecompatwidgets4.dll,sha256=DJKk4KbHvRUfQJtadP81Z5plCdrHnwl5ncGLWEKCP1U,44544 +PySide/plugins/accessible/qtaccessiblewidgets4.dll,sha256=EDLGGleDe-6G2d4J3P5F3FsmukUEaEPYzdrTjZJ9W7Q,244736 +PySide/plugins/bearer/qgenericbearer4.dll,sha256=GIQFkoBucQ_iifbnYKah0Jwm6rR3-5vE5OxLFDAo8Sw,56320 +PySide/plugins/bearer/qnativewifibearer4.dll,sha256=NYsNTik2686CIC6xQvCSUDzHmKfqsLtY-jQobaK-QRQ,59904 +PySide/plugins/codecs/qcncodecs4.dll,sha256=5DPMs4DhqJHsE7w9QnXxApuBERxcmdKdkPYjxkPz6uA,145408 +PySide/plugins/codecs/qjpcodecs4.dll,sha256=TH0sclqPXA0ID0o8QBxMoYf4XhHmeevXEK2OZc3xnMc,175616 +PySide/plugins/codecs/qkrcodecs4.dll,sha256=SvItjqRuU8EYlBy6Fb9evnPkiqR-KvL5Y6mfPSxGcAE,80896 +PySide/plugins/codecs/qtwcodecs4.dll,sha256=U8uJaMZT0n1IYpiGU_7hiuTwB2e29ZVd0-7TLcRIXgY,159232 +PySide/plugins/designer/phononwidgets.dll,sha256=dux3R0IQM-QTh2TtLDuoVIlVzIFCmoVKMtodi8PpDP0,59392 +PySide/plugins/designer/qaxwidget.dll,sha256=0jVTWmGZhtoUv04RV_qeJM4EHHP9Dwni2GOw78aVb5Y,327680 +PySide/plugins/designer/qdeclarativeview.dll,sha256=fw2t5y64GOHhfe2Lql-ja40V-zxfwr0Kq2p71sJ5TMc,19456 +PySide/plugins/designer/qt3supportwidgets.dll,sha256=mmLim91Jd2wjyVqGOPLkoUhhhKHDaiJppZVjMZDNhN4,223232 +PySide/plugins/designer/qwebview.dll,sha256=DiVOkPFtP3TOnAIe5XkWkZQfS-pb1QAkAaja2lq3SJ8,20992 +PySide/plugins/graphicssystems/qglgraphicssystem4.dll,sha256=4Q9zv_V476fL_V7uNTnAEeP9D3qlUdlQsGfo5qKw0Ng,16384 +PySide/plugins/graphicssystems/qtracegraphicssystem4.dll,sha256=P7WdleJmgzjaZusOELH_khgjZotEM5iZbCTM--O4aM4,26112 +PySide/plugins/iconengines/qsvgicon4.dll,sha256=_AhaNU0YHoDW1cj1ScFi3YGHzU92HaNSb1JmUzfTpI0,43008 +PySide/plugins/imageformats/qgif4.dll,sha256=5rMZCP62P2IPtKxeeIfOJ4snOdtgJBb4eB6eZ8adQeM,32768 +PySide/plugins/imageformats/qico4.dll,sha256=WoCUTCsrRFvTRC1mpPN6IG8mS8c7-FimeTKkysbJPXg,34304 +PySide/plugins/imageformats/qjpeg4.dll,sha256=evMF7jRnjRKU8ArfuXnIs963HEFB816XAJKhfrQzXeo,239104 +PySide/plugins/imageformats/qmng4.dll,sha256=w8wsQ6XfCsL9s_cF_YrwgFXZqT-bB-71AOp5Zz9jvsA,278528 +PySide/plugins/imageformats/qsvg4.dll,sha256=SgVicx2kgUqS9DbuJk3cXmKKfq4q2H-NT1h_jKhzTaI,25600 +PySide/plugins/imageformats/qtga4.dll,sha256=kPwLGKl7AqDeKX8uuLiAo6py_fLycHRX_xH08K_k0ys,24576 +PySide/plugins/imageformats/qtiff4.dll,sha256=ItTfTW8-s6Z8OrYHLS7r8L5wyrIvbnUO3VOcgaDXxlw,358400 +PySide/plugins/phonon_backend/phonon_ds94.dll,sha256=x99YzXWXVzegjp27dwbU-DCmoipXvmEfTB0IkzlmbBk,263168 +PySide/plugins/qmltooling/qmldbg_inspector4.dll,sha256=oJcT1P6ZDHVjdsi_lIqaHgaNknh-8B9Jw-VN_jTfZLo,117760 +PySide/plugins/qmltooling/qmldbg_tcp4.dll,sha256=IqyDBP5q8a5kk-JU2GZiPC-QWLTrwADMagz72pnW9OI,17408 +PySide/plugins/sqldrivers/qsqlite4.dll,sha256=1w-BiXmXFxKOWUPVoXk1hNhmCNKAT7ZWR9beyE_gASY,627200 +PySide/pyside-lupdate.exe,sha256=6bo6FRDYZfs-qfwmgigsHWkNTILbT43SY35oT5AfSgY,168448 +PySide/pyside-python2.7.dll,sha256=WG2DZeJ-guM6kGdn0m3BCgyc9miYTF4A_PRHN52w_Zc,141312 +PySide/pyside-python2.7.lib,sha256=0xMbldO3asTMwsyCNBUfz1ErW9n5PnQeDObOaufQgQ0,43634 +PySide/pyside-rcc.exe,sha256=xzfbukoRtJgVb9WHAWaqlG1jmX0x9hmcCQzjM_7bPLo,60416 +PySide/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +PySide/scripts/__init__.pyc,, +PySide/scripts/uic.py,sha256=r3bREfiQ4GabiChnV8Th0nAdQMZ2Q9fF625qIY_9pd0,2871 +PySide/scripts/uic.pyc,, +PySide/shiboken-python2.7.dll,sha256=7jSW2howZNeUSonEL-jqDiw2FkoH5RCH1G7rUMi8RHw,152064 +PySide/shiboken-python2.7.lib,sha256=PAzRTQS4m_44r71UNsma2XXkMImUkGqVFkHObXlhcl8,90100 +PySide/shiboken.exe,sha256=tueT4ya-QVwHNiKt4yfLXaX81TdKIwQ-fZHDwd9eJOk,1750016 +PySide/shiboken.pyd,sha256=F8cT39mhfYQvuuEJfxa08ES4aIp_M7cDLj4_V5vfNSM,12800 +PySide/translations/assistant_cs.qm,sha256=hSk5CyPWxJZltJPwr99SBsO4AaMkPd_tUlaMQC-KT68,42590 +PySide/translations/assistant_da.qm,sha256=-MVPQCoNCFzSsxDFDPrZix70P84coQhGX0anwJ5r_ww,17612 +PySide/translations/assistant_de.qm,sha256=zEgwRkBUpbSYldUdqzRV1PnGWBG88dVmSKF1_UVdrTI,39679 +PySide/translations/assistant_eu.qm,sha256=PE-tl7BJOeY44nZNgTW2cbH5lzI94XpVyhoUU8D2f9o,42817 +PySide/translations/assistant_fr.qm,sha256=8wO84iPWy-8rYgTeYsISNT8_jWZRyBj-_aos81FQjEU,22631 +PySide/translations/assistant_hu.qm,sha256=TG83kODTWGM0mpt3Uygi1uW_b4hPV0VOJ866HSLhh_k,17851 +PySide/translations/assistant_ja.qm,sha256=dkq9_M4Ow3XaOETfWz9xTykiraEhod7T37ux9gx0u7Q,34767 +PySide/translations/assistant_ko.qm,sha256=oGV5Rx0ZJUoLPCS-V1XdTh3ZcfY9hp5DdVaUIWxgPFA,34319 +PySide/translations/assistant_pl.qm,sha256=5woL74aUBAM80R_lOMmOfUlp_apNoudQEX_nAj_-L5s,41669 +PySide/translations/assistant_ru.qm,sha256=UK79FabiKX5QWgZwMdtZ0JcDKzXf0OAo8gUrEwgJjQA,41995 +PySide/translations/assistant_sl.qm,sha256=TCBL9eBQ3cDkLXPqeh3WUpYMMONlqa9tYodfpvUiEM8,41862 +PySide/translations/assistant_uk.qm,sha256=_4ph2gv9YN7YrAznSDhRo8rCgMnKogvBJ_YLPmPC6zs,42182 +PySide/translations/assistant_zh_CN.qm,sha256=em5EB24vKCAbMIlad167jSfODlkoI9hy5CAyCHl4igo,13578 +PySide/translations/assistant_zh_TW.qm,sha256=mnQxq7vh8fyqjvU5Cp6TuJKKm_PjyYP5bGEAfEnPf5E,13462 +PySide/translations/designer_cs.qm,sha256=qD8o2lA9-yrZrE2NYEP0eqdaQlxe35G7tXdIi4s-b1U,155960 +PySide/translations/designer_de.qm,sha256=33HrFjqxRBPBrQgOwNszy4P0gMLDozP4mM2TYtjx4QU,156877 +PySide/translations/designer_fr.qm,sha256=6wvKwC6Mqyd2PNSGugf93nwdFSVZ1my2fGzx75rxQlc,157369 +PySide/translations/designer_hu.qm,sha256=Vuj9wZ8Wgkztk5huxScYj1FXqLcw2FJI2kjrjTtzTcY,17395 +PySide/translations/designer_ja.qm,sha256=OVr0-LPIBNEIplQJ5iOtIdQbJq7gExQD-vgN_muGn1o,127395 +PySide/translations/designer_ko.qm,sha256=LrleO3IUz8P6XRo2jaaPKDDGg1ShMzCilXRwrU85ZT8,124901 +PySide/translations/designer_pl.qm,sha256=o_XEeAdlTvfu5Cljr4yqWJZDg6QarbB12ufEA2DPaps,154693 +PySide/translations/designer_ru.qm,sha256=jrvzzL4mCdzww--lD0RSKUI0WXMVaQxN001-gpRzM3M,154869 +PySide/translations/designer_sl.qm,sha256=Df_vTAyKTIf5oxEIr_U6x_cLmeDs0Qww_akFCH33MvI,152169 +PySide/translations/designer_uk.qm,sha256=NrqF2sb2-K8n1qRt-R8kW_QMzDtxi9p-BwDrw2sF_Rc,154657 +PySide/translations/designer_zh_CN.qm,sha256=0vwlOsuLfpW3E3hcvYheqAFMM9bn0A9-5huELdJrTCo,112340 +PySide/translations/designer_zh_TW.qm,sha256=s3qqfQ-kGPinlqG6kiVOvMyOfpVcODT59AYCopE7RNs,116135 +PySide/translations/linguist_cs.qm,sha256=BCoF41mKltIkJhqEjSnSJfZ1GxOL_iP5yx2NltGRr5U,84661 +PySide/translations/linguist_de.qm,sha256=vTV16McAt380GJNoNQTeZzal6Qwr51FVzSwmHSeByv8,49580 +PySide/translations/linguist_eu.qm,sha256=-oU6_0wSvmIzcfhkAwtBZPFIyZG_nIsuAfNGo_36NCA,84858 +PySide/translations/linguist_fr.qm,sha256=dwSWcUk1VfSU_Bvkj1PJQKR2pu2iW_Bml-GIVl37gC8,261 +PySide/translations/linguist_he.qm,sha256=kdWisiVoAzEVJ1L9ZyhbB8d2PWhdUZ8L2M-jkQbGy8w,54468 +PySide/translations/linguist_hu.qm,sha256=GSKLYDvk62oui0t9ojqYGi4tkt2w-_VwCCu4mj48OWs,44080 +PySide/translations/linguist_ja.qm,sha256=wQdOX2EQrKb4jMkvQ_-k7l8NyYGSTUEbGBsgnDNknL0,65847 +PySide/translations/linguist_ko.qm,sha256=OZK-tLxXhxUR1-QXvg4LTMAOxLy7rkfO1dn530-S26o,64772 +PySide/translations/linguist_pl.qm,sha256=2AW3Tn3YSDA55S8pJ8L-KNNdeCLrz6qLbIJtcJfBgXc,66410 +PySide/translations/linguist_ru.qm,sha256=YxG9AN7FfrbRx-EY--oJ1UORd-K46ggKig_9iWskV6A,84622 +PySide/translations/linguist_sl.qm,sha256=yxBNS-MxlLPSelfV8AcWpB8wGGAqOpJ8Hbd5fYhQQbM,46503 +PySide/translations/linguist_uk.qm,sha256=s5C6NvOigtJscx001YWOoqHojGqpbvr_3BcrgUf10f4,84831 +PySide/translations/linguist_zh_CN.qm,sha256=FuksXBTlqtr7fdyXXbRxZn869JQysVfvWdZ6kyuIKCM,31589 +PySide/translations/linguist_zh_TW.qm,sha256=sZk8rxSW-JtB8t9qA7Zu9o3C8RL75ssvuFfGE2PrHXw,31704 +PySide/translations/qt_ar.qm,sha256=z7rp-MYhkEqgm_v06N4CHpUbc0lfKdsuV_OtNdh43ak,55319 +PySide/translations/qt_cs.qm,sha256=QPSM49dRUi21zHpumNU6w5LygCNkFVc0wj1UBl47N9I,319786 +PySide/translations/qt_da.qm,sha256=_E-ZvqHY_mswF2TrEVbsnKbTh6Ne29MjEHDzN_K86dg,119698 +PySide/translations/qt_de.qm,sha256=EPqN3p9Ml2Lm7CD3H4Y9tErKQ1qh1GIV-Y8s-eiNhPc,325046 +PySide/translations/qt_es.qm,sha256=ghx_YJwBQ184zI6ZtOvNnyxPUpUenhBRrXkn50W2K6U,82411 +PySide/translations/qt_eu.qm,sha256=Rog_-dcUTAp6tRn6ty4Pqj_sbIegFtVYhUVetomeW6g,235932 +PySide/translations/qt_fa.qm,sha256=-X2n0YTL7XnVZo0MQqIJcW_I47ZBXMBwKDS1wk1Bctg,292973 +PySide/translations/qt_fr.qm,sha256=AvKjws3iiUXK_jScJ2PXw0ygIVrBLWviuJBgGOm146o,254997 +PySide/translations/qt_gl.qm,sha256=F5eQH_AAIa_dsFEQZKDE7q0UDafRfH4ifmgAW6_I3aI,323441 +PySide/translations/qt_he.qm,sha256=y12-i6WxSNlSR10XEGEcX0O-wDDDuSGZ1CqCt5RufWs,215132 +PySide/translations/qt_help_cs.qm,sha256=EaQJ9d5hAZMX-_CmfE5xu0hyEggasjVEM1EvWRenooE,10100 +PySide/translations/qt_help_da.qm,sha256=nDKacRXFfib1JrwT4sJDo0FhrEJ5aTYKf2pPW-GdiKU,8785 +PySide/translations/qt_help_de.qm,sha256=J3WGREPYZwxhcY-a8ZMeZzb2Hb2mOE3QEAsqk_Mvuhs,11183 +PySide/translations/qt_help_eu.qm,sha256=k_mixLN7WU4TjxNp11zOEhbVC2KzihbTnWus4rB4x6g,10185 +PySide/translations/qt_help_fr.qm,sha256=EHoIai6JWCM4iLv1J2b5Bqio4UrVXdBqmB-85_a7JhA,11171 +PySide/translations/qt_help_gl.qm,sha256=6_6yPCTHIS2g0d0m-cLecvl6iW7GQqxjIwt5kCKQes8,10881 +PySide/translations/qt_help_hu.qm,sha256=fz5ehB0-VC_232OlCOuaMjXIP27ZAKAVa_nvLuPgk9w,9930 +PySide/translations/qt_help_ja.qm,sha256=1jwcJtGmQNxiqKpkhx-kRn2EfFFniCd_rduYu8K_QCg,8065 +PySide/translations/qt_help_ko.qm,sha256=nWh7BuRxIRxiN_VGgISm53jaoSmzc_NgQZvPA-Bi9h4,8299 +PySide/translations/qt_help_pl.qm,sha256=Xmb-GCR644u_EKBck-uR67_XIi5hJhTHcGh33SAAGuQ,10492 +PySide/translations/qt_help_ru.qm,sha256=z_M9RQr2_ErKJL7gqi3aLQzYFbBIe7ooNOh2b-4_oRQ,10649 +PySide/translations/qt_help_sl.qm,sha256=BkH0ijvldFv0B64rIpXrxrxdtT6F9A_u2NqNlVQJ-Yk,10356 +PySide/translations/qt_help_uk.qm,sha256=Pqonirh_yJt5wVF5HDljZYOOKCN5ydo6zHEHn1B_EhQ,10063 +PySide/translations/qt_help_zh_CN.qm,sha256=sxpudBrypGiSpjyK0mjWcScS09vjw-RrH9TkTBhWsQk,6434 +PySide/translations/qt_help_zh_TW.qm,sha256=FZlAOPikCG7q1putjnND5FyBxjWN1AhixEnEkSk3Stg,7177 +PySide/translations/qt_hu.qm,sha256=W5qPXEPfTuY0WjNwbFMPblCLAKcOh9eEQjDFlOYUrl0,272162 +PySide/translations/qt_ja.qm,sha256=sxP-2L8WleFI6qqcSoS0hRgYRK8-yoCP_UPd_jT-XhI,247687 +PySide/translations/qt_ko.qm,sha256=8PX602A7Ono-wwlmPPlyY433sVzulVJNNABvNlAjWME,241758 +PySide/translations/qt_lt.qm,sha256=EnGIEJ4VvcP-DC1zt64b4_CSssjuCMka_aw2dudhf_c,165181 +PySide/translations/qt_pl.qm,sha256=_Se8j5YAzj9esE-CXepaw2ExMz9fosVNSxB2nGUFVxo,316027 +PySide/translations/qt_pt.qm,sha256=R0FRkVWMTuT2EBDRXt579G-VFdtoXx6IWMEv0G6QAIM,70321 +PySide/translations/qt_ru.qm,sha256=_fYTAiUD04WOYPdGJ9ep6ubNjK-YHuu4XrT8pmPQdPQ,288266 +PySide/translations/qt_sk.qm,sha256=CBMyaN2W5dc8uY8PPJzmdltOD3PuyQM4KhaYpwDSLMs,238628 +PySide/translations/qt_sl.qm,sha256=QyvHBpSCVatB81ztGz5GOTmABQZ41Ml_mlJLtyqSefQ,228282 +PySide/translations/qt_sv.qm,sha256=PdFTtzbFyyaXIIxfibXVdF-1lQZJHg6Bqa3KSNjCSs0,65848 +PySide/translations/qt_uk.qm,sha256=xeUT4lm8cgYY8Lay94EfNn2KZdfZnNc66vtVop3g6gE,215879 +PySide/translations/qt_zh_CN.qm,sha256=HlJLerocvNTfZRk0dwG893HPDKfLseBT8LPWU4QoGHI,117335 +PySide/translations/qt_zh_TW.qm,sha256=fkrb9wrKME8DNrqrHpnSqvzIwnMJ496-1Fdfj_TchR8,117253 +PySide/translations/qtconfig_eu.qm,sha256=zSQJ_1Gg1bDlLzvJST5Bocyo4c1YewDQpntOXgXymIw,31682 +PySide/translations/qtconfig_he.qm,sha256=cT_nDrR6R60kBZPJjUIPBM51l8wUyvOThXZvSEnoLYA,27806 +PySide/translations/qtconfig_hu.qm,sha256=t9nBN9djU8Oswu7_sOMerPRxpuk8QnSyYkDDiz_LC7w,15800 +PySide/translations/qtconfig_ja.qm,sha256=9snsv8HVzbNx3lVFmDjQMGKopeG8Yhyky0_rOMXQm64,24465 +PySide/translations/qtconfig_ko.qm,sha256=FBzExHCQs5Gn88ImtGYAZSfgd2v4dqSNscLgvGXz_Jk,24019 +PySide/translations/qtconfig_pl.qm,sha256=lxB0YSaA9V_FvFlj9asDS9l1U3K9fVcBRAv8Rcdg_pg,21411 +PySide/translations/qtconfig_ru.qm,sha256=tGtH0U0_GKVq-ef6ayIyDxusVgTnMerHqy60IFvH7-I,31389 +PySide/translations/qtconfig_sl.qm,sha256=V2WrNJpjWDZUqCZGALrPLCizyu-Ntiecr-LpSVoTtQQ,26138 +PySide/translations/qtconfig_uk.qm,sha256=VkBhoHNODYtCTq1z7J94D2fCLbiycTvk2igm3Wxky98,20913 +PySide/translations/qtconfig_zh_CN.qm,sha256=8O7z8KqEn-VF4Nz8BrVtJV_Ans1TnraTGg72U5xNfRY,21527 +PySide/translations/qtconfig_zh_TW.qm,sha256=frX7TxF9JAwgGKDak5jPZwsF-3foWp1SRZEuEsDkg7E,20101 +PySide/translations/qtscript_eu.qm,sha256=O7xYDcieZl6N4WsPasb-M9FPojBUtGEkq-Y4VivPN3Y,5167 +PySide/translations/qvfb_eu.qm,sha256=ltiJEQyk-WHod-OS__QULP8tb0iZdtH3bYXfST0Xg-E,11157 +PySide/translations/qvfb_hu.qm,sha256=fe5OsFaQB904aJre2SBEp-nLUA3WdnRjg8isX-izcuM,6745 +PySide/translations/qvfb_ja.qm,sha256=1UZAeC3BuV_dsK--0Z6ZqNLKMW5AZCemv56p7ECSx3w,9222 +PySide/translations/qvfb_ko.qm,sha256=O62XOekJYGsJc_OYse4YB-2uFtpvrQbDZZGMeDHfdqE,9002 +PySide/translations/qvfb_pl.qm,sha256=2-6x1acCj9Snwztvo652J8y4iqKhRZKPytNIryZhqr0,8777 +PySide/translations/qvfb_ru.qm,sha256=vBTTOoxEVunjmjcIa54ndt044IcYJVZUB5Xcy4qOiEA,11148 +PySide/translations/qvfb_sl.qm,sha256=jCMLWb3b_hZsF_C-DCZq1WoSPpUItT0vAYlzS4eSioM,11164 +PySide/translations/qvfb_uk.qm,sha256=vs6Htpnx-jFxFrVp80MewcK_vCe7xVlVSY7AYPyeuuI,11640 +PySide/translations/qvfb_zh_CN.qm,sha256=PjsVfaYtHRG9C7RSTU_lGE-6pNML0SsbRT77wekYMOQ,4853 +PySide/translations/qvfb_zh_TW.qm,sha256=p-5fKrDS2tEORiB3nkwlLJspHTmdDeAlp-_3ztEYNoQ,4853 +PySide/typesystems/typesystem_core.xml,sha256=reCx7AQFV2smw6FsG9FSiXDDfQXwXJf7zkitw7LJ-4M,1145 +PySide/typesystems/typesystem_core_common.xml,sha256=FOIrc-1WQSzpCKueXJwwVz6jMTjFrE810AGwhvgMQjI,185569 +PySide/typesystems/typesystem_core_mac.xml,sha256=0N8qsQ8fSqP2a4zoYkQ0iK7E-jM2tFkLZN7RONBuGVo,1074 +PySide/typesystems/typesystem_core_maemo.xml,sha256=os6aMH6JjluCHkoEcklVxqR_lMtAzeEm9pidePZbexE,1247 +PySide/typesystems/typesystem_core_win.xml,sha256=HRc6L2RvO9kQwNVkl9kixHbt3dMvorsG2KIeb70RD3U,2331 +PySide/typesystems/typesystem_core_x11.xml,sha256=os6aMH6JjluCHkoEcklVxqR_lMtAzeEm9pidePZbexE,1247 +PySide/typesystems/typesystem_declarative.xml,sha256=eIzG9ml6uOVUGJWM1Yt1VYep1k2NwtpkvgqmPfyIJ0A,7601 +PySide/typesystems/typesystem_gui.xml,sha256=uMW7x4aDYQ_3jvtlSZH3ETD0MRPDnFTDUeosm0hD-X4,1207 +PySide/typesystems/typesystem_gui_common.xml,sha256=RVUi6929ahLJxsiGJ1PieUyy0PPP52psEQygIBO1y-Y,311278 +PySide/typesystems/typesystem_gui_mac.xml,sha256=TTgSYX-wjm2j2E3DyfhNduR_WOq9xQMB1iaVRN1Ox1w,1668 +PySide/typesystems/typesystem_gui_maemo.xml,sha256=tFsFAbA5NR8KLPJxptbOABnHs_jBZMoKfJ9LIStvicA,1247 +PySide/typesystems/typesystem_gui_simulator.xml,sha256=0r59JFpj5JNX12BDCQCOL8kx0sw4kuKZCgtjWxEccRM,2198 +PySide/typesystems/typesystem_gui_win.xml,sha256=tzKDymQlnAUEYQ9MnVx5fclYsViPdjQanFUalaj9fco,1967 +PySide/typesystems/typesystem_gui_x11.xml,sha256=2BKOlmsjS-ORVMdSx2tVpK7DVZAXqRNNJTiccEgYQ9s,2002 +PySide/typesystems/typesystem_help.xml,sha256=y9K4YWEaQbeG2n1semP7XC00Bv9mdhImfAaTNZubLbk,1905 +PySide/typesystems/typesystem_multimedia.xml,sha256=8D8IlGTzPMSKSgum77PtTcLacqfeBRn91yIX9DlVPq4,5922 +PySide/typesystems/typesystem_network.xml,sha256=vFvMFe8hkyMdUBFf86DotAY585xephMgbN5z-OxmeyI,15642 +PySide/typesystems/typesystem_opengl.xml,sha256=AoH0ySWcM3lVV158W0Qr9l9q6Y67EIBb666B0oiTvm8,31030 +PySide/typesystems/typesystem_phonon.xml,sha256=FQuKbcc-skfNfZiOPDfvrSTzupTkvUL8oW0MPFG47pQ,15464 +PySide/typesystems/typesystem_script.xml,sha256=WQlKP8NpcONcCXXD42ogvSU_Wi_Tm9qpZWVuYkph_wA,5205 +PySide/typesystems/typesystem_scripttools.xml,sha256=YsdWp7yCplZVmQEqPCtBD-RNHLsSurFD5qp9Mb5v7Fs,1476 +PySide/typesystems/typesystem_sql.xml,sha256=VIHwgJcVPK153eMG6awRE9GpiZWR7en8U-0rClDJhaQ,7840 +PySide/typesystems/typesystem_svg.xml,sha256=gLRqsy_qEon0K6HrahgoxQNKAaegDGZNP4dZ0gBWWbo,2081 +PySide/typesystems/typesystem_templates.xml,sha256=EcJgBAli0S1YCDGfcKn3BUfAcsQ3gaUIv471LRBsSSg,17220 +PySide/typesystems/typesystem_test.xml,sha256=tpklGp1iiWMtgAUnJqjtrqFyHVTyzST8vWgKR0xWsI8,5023 +PySide/typesystems/typesystem_uitools.xml,sha256=lzbpWRFVaGoeGkCGbIOF25wUTTOexmluV19E4gx4JhM,5564 +PySide/typesystems/typesystem_webkit.xml,sha256=WtMQZKv3pPiZN5jbz25qjTsX7h08elGPm_zgHBq2hxw,10180 +PySide/typesystems/typesystem_webkit_simulator.xml,sha256=mg_jPnwv4tDWjMpEkgED2A9HyM054HoOooLJFt3GlcE,1317 +PySide/typesystems/typesystem_xml.xml,sha256=L7tlv3lCD8xOSiTDT9BMDCaI2f0ICM64P3S3n_eaSvc,18813 +PySide/typesystems/typesystem_xmlpatterns.xml,sha256=HvNHnPGv3EfQOQUXfwqTv8vVQV742HfFAvdqCiAcGtk,5408 +pysideuic/Compiler/__init__.py,sha256=afFqClOTG2dwq_EI9IM7gZMps2I4mXwk9lmDe45vPfQ,908 +pysideuic/Compiler/__init__.pyc,, +pysideuic/Compiler/compiler.py,sha256=Q-tJQ8i3DsddDAUJmR7vS5YfNT5Cv64qh-6C3733-B0,3537 +pysideuic/Compiler/compiler.pyc,, +pysideuic/Compiler/indenter.py,sha256=D8wC5Yv3Evi4R9pOeuiWzUTWcVS13S-PAFiKIZn_jCM,1733 +pysideuic/Compiler/indenter.pyc,, +pysideuic/Compiler/misc.py,sha256=fGfkatskJKQi3PBr3wcQf_9L5-9JugCeTFKy8GRsYL4,1594 +pysideuic/Compiler/misc.pyc,, +pysideuic/Compiler/proxy_type.py,sha256=6c4vDb1l-OBNEd65nFnJ29ubOjjPo5s-PdeqQcwrZB8,2195 +pysideuic/Compiler/proxy_type.pyc,, +pysideuic/Compiler/qobjectcreator.py,sha256=6ddSD7lCyK5FMmjcautb6LVkkD_bAgimhl5NP3wOa-U,4638 +pysideuic/Compiler/qobjectcreator.pyc,, +pysideuic/Compiler/qtproxies.py,sha256=tMCEzR7hTbyHeDkriyzjVPzA5cCEp3LGoGTZHaN7OJ0,14326 +pysideuic/Compiler/qtproxies.pyc,, +pysideuic/__init__.py,sha256=ueV23whLIZz75btnKJOieDDR6MeYyoMonPIfCft29vI,5141 +pysideuic/__init__.pyc,, +pysideuic/driver.py,sha256=Q7c07UwzA-CscfBFBv-q7izWhgC-ZCFo4wJA532QG30,4117 +pysideuic/driver.pyc,, +pysideuic/exceptions.py,sha256=BwqGiLRr3AwKwgqtzaEcqP4X-hVL5mvg4hrZRW7dyaw,1132 +pysideuic/exceptions.pyc,, +pysideuic/icon_cache.py,sha256=DaKdWCXX09G1NN87-PnEjmkDuMARgyg7-QnMCojJBxk,4683 +pysideuic/icon_cache.pyc,, +pysideuic/objcreator.py,sha256=R3EKvyZFySkHGUdAkaClchIgr-PqNfiW9bMvdq4OwVE,4030 +pysideuic/objcreator.pyc,, +pysideuic/port_v2/__init__.py,sha256=Trt5TWWK-T-qSr7WEOOCtBcuq3cRZEs-r4R9XkoUmYA,870 +pysideuic/port_v2/__init__.pyc,, +pysideuic/port_v2/as_string.py,sha256=7UikzMTSPqhFwyCTlrerQr9Js2iKYG-Xuqbt-IL8W8A,1347 +pysideuic/port_v2/as_string.pyc,, +pysideuic/port_v2/ascii_upper.py,sha256=XLNlgkOR5yKjbn7OnaF6V-H3M-zpohGUQlgd4uwNah0,1202 +pysideuic/port_v2/ascii_upper.pyc,, +pysideuic/port_v2/invoke.py,sha256=3bt_fwcmk_0AXecrjWtzUgJjAQLHzIUCPJ8h-f5C0lU,1472 +pysideuic/port_v2/invoke.pyc,, +pysideuic/port_v2/load_plugin.py,sha256=Ikv8ProgaPPaLxzgMwhZkyrBkh-MrqSIDrSBalrU9ac,1451 +pysideuic/port_v2/load_plugin.pyc,, +pysideuic/port_v2/proxy_base.py,sha256=7ZdItWCfIYoUq8eekbrFyIwcEvmBPucceIYaLWxJsbI,1027 +pysideuic/port_v2/proxy_base.pyc,, +pysideuic/port_v2/string_io.py,sha256=9IOnB_BGkCwEaOVPY-8lsQXYX2HzMkgO-T2s8MH79Gk,1003 +pysideuic/port_v2/string_io.pyc,, +pysideuic/properties.py,sha256=NuvI5hwqcw683KHc9O6E9Fc62b-YjI7iMx8jsSk1UUk,16697 +pysideuic/properties.pyc,, +pysideuic/pyside-uic.1,sha256=thtmaBlflxV7lcCaMmQnNI048K92lgrAOl2jGihiDI4,829 +pysideuic/uiparser.py,sha256=nLAXjj5apvYZwFLfVUollmb7UmV_VOvT6mYanpkb2xw,32858 +pysideuic/uiparser.pyc,, +pysideuic/widget-plugins/phonon.py,sha256=Uv9WDJeskXQWEj-GJ7MsmKDrkJzJRikqU_2kqIWTLrY,1485 +pysideuic/widget-plugins/phonon.pyc,, +pysideuic/widget-plugins/qtdeclarative.py,sha256=EDmZCI8Ht6fnMpXDOsClRxDUQvPy6XuH1EqYEzZL_aQ,1448 +pysideuic/widget-plugins/qtdeclarative.pyc,, +pysideuic/widget-plugins/qtwebkit.py,sha256=6gMQ3Ck2ERhPL-GrtJE6buCCsysZBx1fyvin57CdSmk,1473 +pysideuic/widget-plugins/qtwebkit.pyc,, diff --git a/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/WHEEL b/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/WHEEL new file mode 100644 index 00000000000..760811ecad0 --- /dev/null +++ b/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.26.0) +Root-Is-Purelib: false +Tag: cp27-none-win_amd64 diff --git a/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/entry_points.txt b/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/entry_points.txt new file mode 100644 index 00000000000..7cfc6878414 --- /dev/null +++ b/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +pyside-uic = PySide.scripts.uic:main diff --git a/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/metadata.json b/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/metadata.json new file mode 100644 index 00000000000..8f2fe01645f --- /dev/null +++ b/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/metadata.json @@ -0,0 +1 @@ +{"generator": "bdist_wheel (0.26.0)", "summary": "Python bindings for the Qt cross-platform application and UI framework", "classifiers": ["Development Status :: 5 - Production/Stable", "Environment :: Console", "Environment :: MacOS X", "Environment :: X11 Applications :: Qt", "Environment :: Win32 (MS Windows)", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)", "Operating System :: MacOS :: MacOS X", "Operating System :: POSIX", "Operating System :: POSIX :: Linux", "Operating System :: Microsoft", "Operating System :: Microsoft :: Windows", "Programming Language :: C++", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Topic :: Database", "Topic :: Software Development", "Topic :: Software Development :: Code Generators", "Topic :: Software Development :: Libraries :: Application Frameworks", "Topic :: Software Development :: User Interfaces", "Topic :: Software Development :: Widget Sets"], "download_url": "https://download.qt-project.org/official_releases/pyside/", "extensions": {"python.details": {"project_urls": {"Home": "http://www.pyside.org"}, "contacts": [{"email": "contact@pyside.org", "name": "PySide Team", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}}, "python.exports": {"console_scripts": {"pyside-uic": "PySide.scripts.uic:main"}}, "python.commands": {"wrap_console": {"pyside-uic": "PySide.scripts.uic:main"}}}, "keywords": ["Qt"], "license": "LGPL", "metadata_version": "2.0", "name": "PySide", "version": "1.2.4"} diff --git a/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/top_level.txt b/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/top_level.txt new file mode 100644 index 00000000000..3a9a2eeae19 --- /dev/null +++ b/openpype/vendor/python/python_2/PySide-1.2.4.dist-info/top_level.txt @@ -0,0 +1,3 @@ +PySide +QtCore +pysideuic diff --git a/openpype/vendor/python/python_2/PySide/Qt3Support4.dll b/openpype/vendor/python/python_2/PySide/Qt3Support4.dll new file mode 100644 index 00000000000..8cd35bc7ba8 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/Qt3Support4.dll differ diff --git a/openpype/vendor/python/python_2/PySide/QtCLucene4.dll b/openpype/vendor/python/python_2/PySide/QtCLucene4.dll new file mode 100644 index 00000000000..e2d21f9ada3 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/QtCLucene4.dll differ diff --git a/openpype/vendor/python/python_2/PySide/QtCore4.dll b/openpype/vendor/python/python_2/PySide/QtCore4.dll new file mode 100644 index 00000000000..12a14370b2c Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/QtCore4.dll differ diff --git a/openpype/vendor/python/python_2/PySide/QtDeclarative4.dll b/openpype/vendor/python/python_2/PySide/QtDeclarative4.dll new file mode 100644 index 00000000000..98044782cca Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/QtDeclarative4.dll differ diff --git a/openpype/vendor/python/python_2/PySide/QtDesigner4.dll b/openpype/vendor/python/python_2/PySide/QtDesigner4.dll new file mode 100644 index 00000000000..09bca41c5b4 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/QtDesigner4.dll differ diff --git a/openpype/vendor/python/python_2/PySide/QtDesignerComponents4.dll b/openpype/vendor/python/python_2/PySide/QtDesignerComponents4.dll new file mode 100644 index 00000000000..a77156685bf Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/QtDesignerComponents4.dll differ diff --git a/openpype/vendor/python/python_2/PySide/QtGui4.dll b/openpype/vendor/python/python_2/PySide/QtGui4.dll new file mode 100644 index 00000000000..a682c2ac9d0 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/QtGui4.dll differ diff --git a/openpype/vendor/python/python_2/PySide/QtHelp4.dll b/openpype/vendor/python/python_2/PySide/QtHelp4.dll new file mode 100644 index 00000000000..6ebe01837c6 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/QtHelp4.dll differ diff --git a/openpype/vendor/python/python_2/PySide/QtMultimedia4.dll b/openpype/vendor/python/python_2/PySide/QtMultimedia4.dll new file mode 100644 index 00000000000..2ada6bad1f8 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/QtMultimedia4.dll differ diff --git a/openpype/vendor/python/python_2/PySide/QtNetwork4.dll b/openpype/vendor/python/python_2/PySide/QtNetwork4.dll new file mode 100644 index 00000000000..c088689ba21 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/QtNetwork4.dll differ diff --git a/openpype/vendor/python/python_2/PySide/QtOpenGL4.dll b/openpype/vendor/python/python_2/PySide/QtOpenGL4.dll new file mode 100644 index 00000000000..95ad557171d Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/QtOpenGL4.dll differ diff --git a/openpype/vendor/python/python_2/PySide/QtScript4.dll b/openpype/vendor/python/python_2/PySide/QtScript4.dll new file mode 100644 index 00000000000..dd094d23952 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/QtScript4.dll differ diff --git a/openpype/vendor/python/python_2/PySide/QtScriptTools4.dll b/openpype/vendor/python/python_2/PySide/QtScriptTools4.dll new file mode 100644 index 00000000000..3addec635cd Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/QtScriptTools4.dll differ diff --git a/openpype/vendor/python/python_2/PySide/QtSql4.dll b/openpype/vendor/python/python_2/PySide/QtSql4.dll new file mode 100644 index 00000000000..ab84aee5ffc Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/QtSql4.dll differ diff --git a/openpype/vendor/python/python_2/PySide/QtSvg4.dll b/openpype/vendor/python/python_2/PySide/QtSvg4.dll new file mode 100644 index 00000000000..3c6874a5a65 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/QtSvg4.dll differ diff --git a/openpype/vendor/python/python_2/PySide/QtTest4.dll b/openpype/vendor/python/python_2/PySide/QtTest4.dll new file mode 100644 index 00000000000..b9cf46accfb Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/QtTest4.dll differ diff --git a/openpype/vendor/python/python_2/PySide/QtWebKit4.dll b/openpype/vendor/python/python_2/PySide/QtWebKit4.dll new file mode 100644 index 00000000000..7fdb3058975 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/QtWebKit4.dll differ diff --git a/openpype/vendor/python/python_2/PySide/QtXml4.dll b/openpype/vendor/python/python_2/PySide/QtXml4.dll new file mode 100644 index 00000000000..5348ef1d9bd Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/QtXml4.dll differ diff --git a/openpype/vendor/python/python_2/PySide/QtXmlPatterns4.dll b/openpype/vendor/python/python_2/PySide/QtXmlPatterns4.dll new file mode 100644 index 00000000000..f62af32510a Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/QtXmlPatterns4.dll differ diff --git a/openpype/vendor/python/python_2/PySide/__init__.py b/openpype/vendor/python/python_2/PySide/__init__.py new file mode 100644 index 00000000000..d5cd4fc746a --- /dev/null +++ b/openpype/vendor/python/python_2/PySide/__init__.py @@ -0,0 +1,41 @@ +__all__ = ['QtCore', 'QtGui', 'QtNetwork', 'QtOpenGL', 'QtSql', 'QtSvg', 'QtTest', 'QtWebKit', 'QtScript'] +__version__ = "1.2.4" +__version_info__ = (1, 2, 4, "final", 0) + + +def _setupQtDirectories(): + import sys + import os + from . import _utils + + pysideDir = _utils.get_pyside_dir() + + # Register PySide qt.conf to override the built-in + # configuration variables, if there is no default qt.conf in + # executable folder + prefix = pysideDir.replace('\\', '/') + _utils.register_qt_conf(prefix=prefix, + binaries=prefix, + plugins=prefix+"/plugins", + imports=prefix+"/imports", + translations=prefix+"/translations") + + # On Windows add the PySide\openssl folder (if it exists) to the + # PATH so the SSL DLLs can be found when Qt tries to dynamically + # load them. Tell Qt to load them and then reset the PATH. + if sys.platform == 'win32': + opensslDir = os.path.join(pysideDir, 'openssl') + if os.path.exists(opensslDir): + path = os.environ['PATH'] + try: + os.environ['PATH'] = opensslDir + os.pathsep + path + try: + from . import QtNetwork + except ImportError: + pass + else: + QtNetwork.QSslSocket.supportsSsl() + finally: + os.environ['PATH'] = path + +_setupQtDirectories() diff --git a/openpype/vendor/python/python_2/PySide/_utils.py b/openpype/vendor/python/python_2/PySide/_utils.py new file mode 100644 index 00000000000..2c77ab4e9b8 --- /dev/null +++ b/openpype/vendor/python/python_2/PySide/_utils.py @@ -0,0 +1,268 @@ +# This file is part of PySide: Python for Qt +# +# Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +# +# Contact: PySide team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# version 2 as published by the Free Software Foundation. +# +# This program 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 program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA + +import sys +import os +import fnmatch + + +if sys.platform == 'win32': + # On Windows get the PySide package path in case sensitive format. + # Even if the file system on Windows is case insensitive, + # some parts in Qt environment such as qml imports path, + # requires to be in case sensitive format. + import ctypes + from ctypes import POINTER, WinError, sizeof, byref, create_unicode_buffer + from ctypes.wintypes import MAX_PATH, LPCWSTR, LPWSTR, DWORD + + GetShortPathNameW = ctypes.windll.kernel32.GetShortPathNameW + GetShortPathNameW.argtypes = [LPCWSTR, LPWSTR, DWORD] + GetShortPathNameW.restype = DWORD + + GetLongPathNameW = ctypes.windll.kernel32.GetLongPathNameW + GetLongPathNameW.argtypes = [LPCWSTR, LPWSTR, DWORD] + GetLongPathNameW.restype = DWORD + + PY_2 = sys.version_info[0] < 3 + + if PY_2: + def u(x): + return unicode(x) + def u_fs(x): + return unicode(x, sys.getfilesystemencoding()) + else: + def u(x): + return x + def u_fs(x): + return x + + def _get_win32_short_name(s): + """ Returns short name """ + buf_size = MAX_PATH + for i in range(2): + buf = create_unicode_buffer(u('\0') * (buf_size + 1)) + r = GetShortPathNameW(u_fs(s), buf, buf_size) + if r == 0: + raise WinError() + if r < buf_size: + if PY_2: + return buf.value.encode(sys.getfilesystemencoding()) + return buf.value + buf_size = r + raise WinError() + + def _get_win32_long_name(s): + """ Returns long name """ + buf_size = MAX_PATH + for i in range(2): + buf = create_unicode_buffer(u('\0') * (buf_size + 1)) + r = GetLongPathNameW(u_fs(s), buf, buf_size) + if r == 0: + raise WinError() + if r < buf_size: + if PY_2: + return buf.value.encode(sys.getfilesystemencoding()) + return buf.value + buf_size = r + raise WinError() + + def _get_win32_case_sensitive_name(s): + """ Returns long name in case sensitive format """ + path = _get_win32_long_name(_get_win32_short_name(s)) + return path + + def get_pyside_dir(): + try: + from . import QtCore + except ImportError: + return _get_win32_case_sensitive_name(os.path.abspath(os.path.dirname(__file__))) + else: + return _get_win32_case_sensitive_name(os.path.abspath(os.path.dirname(QtCore.__file__))) + +else: + def get_pyside_dir(): + try: + from . import QtCore + except ImportError: + return os.path.abspath(os.path.dirname(__file__)) + else: + return os.path.abspath(os.path.dirname(QtCore.__file__)) + + +def _filter_match(name, patterns): + for pattern in patterns: + if pattern is None: + continue + if fnmatch.fnmatch(name, pattern): + return True + return False + + +def _dir_contains(dir, filter): + names = os.listdir(dir) + for name in names: + srcname = os.path.join(dir, name) + if not os.path.isdir(srcname) and _filter_match(name, filter): + return True + return False + + +def _rcc_write_number(out, number, width): + dividend = 1 + if width == 2: + dividend = 256 + elif width == 3: + dividend = 65536 + elif width == 4: + dividend = 16777216 + while dividend >= 1: + tmp = int(number / dividend) + out.append("%02x" % tmp) + number -= tmp * dividend + dividend = int(dividend / 256) + + +def _rcc_write_data(out, data): + _rcc_write_number(out, len(data), 4) + for d in data: + _rcc_write_number(out, ord(d), 1) + + +def _get_qt_conf_resource(prefix, binaries, plugins, imports, translations): + """ + Generate Qt resource with embedded qt.conf + """ + qt_conf_template = "\ +[Paths]\x0d\x0a\ +Prefix = %(prefix)s\x0d\x0a\ +Binaries = %(binaries)s\x0d\x0a\ +Imports = %(imports)s\x0d\x0a\ +Plugins = %(plugins)s\x0d\x0a\ +Translations = %(translations)s" + + rc_data_input = qt_conf_template % {"prefix": prefix, + "binaries": binaries, + "plugins": plugins, + "imports": imports, + "translations": translations} + rc_data_ouput = [] + _rcc_write_data(rc_data_ouput, rc_data_input) + + # The rc_struct and rc_name was pre-generated by pyside-rcc from file: + # + # + # qt/etc/qt.conf + # + # + PY_2 = sys.version_info[0] < 3 + if PY_2: + rc_struct = "\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x0a\x00\x02\x00\x00\ +\x00\x01\x00\x00\x00\x03\x00\x00\x00\x16\x00\x00\x00\x00\x00\x01\x00\x00\ +\x00\x00" + rc_name = "\ +\x00\x02\x00\x00\x07\x84\x00q\x00t\x00\x03\x00\x00l\xa3\x00e\x00t\x00c\x00\ +\x07\x08t\xa6\xa6\x00q\x00t\x00.\x00c\x00o\x00n\x00f" + rc_data = "".join(rc_data_ouput).decode('hex') + else: + rc_struct = b"\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x0a\x00\x02\x00\x00\ +\x00\x01\x00\x00\x00\x03\x00\x00\x00\x16\x00\x00\x00\x00\x00\x01\x00\x00\ +\x00\x00" + rc_name = b"\ +\x00\x02\x00\x00\x07\x84\x00q\x00t\x00\x03\x00\x00l\xa3\x00e\x00t\x00c\x00\ +\x07\x08t\xa6\xa6\x00q\x00t\x00.\x00c\x00o\x00n\x00f" + rc_data = bytes.fromhex("".join(rc_data_ouput)) + + return rc_struct, rc_name, rc_data + + +def register_qt_conf(prefix, binaries, plugins, imports, translations, + force=False): + """ + Register qt.conf in Qt resource system to override the built-in + configuration variables, if there is no default qt.conf in + executable folder and another qt.conf is not already registered in + Qt resource system. + """ + try: + from . import QtCore + except ImportError: + return + + # Check folder structure + if not prefix or not os.path.exists(prefix): + if force: + raise RuntimeError("Invalid prefix path specified: %s" % prefix) + else: + return + if not binaries or not os.path.exists(binaries): + if force: + raise RuntimeError("Invalid binaries path specified: %s" % binaries) + else: + return + else: + # Check if required Qt libs exists in binaries folder + if sys.platform == 'win32': + pattern = ["QtCore*.dll"] + else: + pattern = ["libQtCore.so.*"] + if not _dir_contains(binaries, pattern): + if force: + raise RuntimeError("QtCore lib not found in folder: %s" % \ + binaries) + else: + return + if not plugins or not os.path.exists(plugins): + if force: + raise RuntimeError("Invalid plugins path specified: %s" % plugins) + else: + return + if not imports or not os.path.exists(imports): + if force: + raise RuntimeError("Invalid imports path specified: %s" % imports) + else: + return + if not translations or not os.path.exists(translations): + if force: + raise RuntimeError("Invalid translations path specified: %s" \ + % translations) + else: + return + + # Check if there is no default qt.conf in executable folder + exec_prefix = os.path.dirname(sys.executable) + qtconf_path = os.path.join(exec_prefix, 'qt.conf') + if os.path.exists(qtconf_path) and not force: + return + + # Check if another qt.conf is not already registered in Qt resource system + if QtCore.QFile.exists(":/qt/etc/qt.conf") and not force: + return + + rc_struct, rc_name, rc_data = _get_qt_conf_resource(prefix, binaries, + plugins, imports, + translations) + QtCore.qRegisterResourceData(0x01, rc_struct, rc_name, rc_data) + + # Initialize the Qt library by querying the QLibraryInfo + prefixPath = QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.PrefixPath) diff --git a/openpype/vendor/python/python_2/PySide/designer.exe b/openpype/vendor/python/python_2/PySide/designer.exe new file mode 100644 index 00000000000..3f95ac96994 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/designer.exe differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/.buildinfo b/openpype/vendor/python/python_2/PySide/docs/shiboken/.buildinfo new file mode 100644 index 00000000000..29fac3ae810 --- /dev/null +++ b/openpype/vendor/python/python_2/PySide/docs/shiboken/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: dd33e005853bde9d9cb1a84a43c88c25 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/codeinjectionsemantics.doctree b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/codeinjectionsemantics.doctree new file mode 100644 index 00000000000..41a5eadcfd6 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/codeinjectionsemantics.doctree differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/commandlineoptions.doctree b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/commandlineoptions.doctree new file mode 100644 index 00000000000..b090f8b9795 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/commandlineoptions.doctree differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/contents.doctree b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/contents.doctree new file mode 100644 index 00000000000..360ab7ea740 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/contents.doctree differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/environment.pickle b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/environment.pickle new file mode 100644 index 00000000000..858e62f6577 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/environment.pickle differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/faq.doctree b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/faq.doctree new file mode 100644 index 00000000000..12b16310483 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/faq.doctree differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/overview.doctree b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/overview.doctree new file mode 100644 index 00000000000..e5209140201 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/overview.doctree differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/ownership.doctree b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/ownership.doctree new file mode 100644 index 00000000000..3950440b481 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/ownership.doctree differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/projectfile.doctree b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/projectfile.doctree new file mode 100644 index 00000000000..ec067bdfeb8 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/projectfile.doctree differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/sequenceprotocol.doctree b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/sequenceprotocol.doctree new file mode 100644 index 00000000000..c0202876930 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/sequenceprotocol.doctree differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/shibokenmodule.doctree b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/shibokenmodule.doctree new file mode 100644 index 00000000000..325e9e4e4f3 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/shibokenmodule.doctree differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/typeconverters.doctree b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/typeconverters.doctree new file mode 100644 index 00000000000..d3c041c6722 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/typeconverters.doctree differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/typesystemvariables.doctree b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/typesystemvariables.doctree new file mode 100644 index 00000000000..b38fd17874f Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/typesystemvariables.doctree differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/wordsofadvice.doctree b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/wordsofadvice.doctree new file mode 100644 index 00000000000..018a080e000 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/.doctrees/wordsofadvice.doctree differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_images/bindinggen-development.png b/openpype/vendor/python/python_2/PySide/docs/shiboken/_images/bindinggen-development.png new file mode 100644 index 00000000000..2dd64ba1d97 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/_images/bindinggen-development.png differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_images/boostqtarch.png b/openpype/vendor/python/python_2/PySide/docs/shiboken/_images/boostqtarch.png new file mode 100644 index 00000000000..f1b145e9cf1 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/_images/boostqtarch.png differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_images/converter.png b/openpype/vendor/python/python_2/PySide/docs/shiboken/_images/converter.png new file mode 100644 index 00000000000..51cd2af7109 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/_images/converter.png differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/codeinjectionsemantics.txt b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/codeinjectionsemantics.txt new file mode 100644 index 00000000000..c9fb7c622ed --- /dev/null +++ b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/codeinjectionsemantics.txt @@ -0,0 +1,396 @@ +************************ +Code Injection Semantics +************************ + +API Extractor provides the `inject-code +`_ tag +allowing the user to put custom written code to on specific locations of the generated code. +Yet this is only part of what is needed to generate proper binding code, where the custom code +should be written to depends upon the technology used on the generated binding code. + +This is the ``inject-code`` tag options that matters to |project|. + + .. code-block:: xml + + + // custom code + + +Conventions +=========== + +**C++ Wrapper** + This term refers to a generated C++ class that extends a class from the + wrapped library. It is used only when a wrapped C++ class is polymorphic, + i.e. it has or inherits any virtual methods. + +**Python Wrapper** + The code that exports the C++ wrapped class to Python. **Python wrapper** + refers to all the code needed to export a C++ class to Python, and + **Python method/function wrapper** means the specific function that calls + the C++ method/function on behalf of Python. + +**Native** + This is a possible value for the ``class`` attribute of the ``inject-code`` + tag, it means things more akin to the C++ side. + +**Target** + Another ``class`` attribute value, it indicates things more close to the + Python side. + +inject-code tag +=============== + +The following table describes the semantics of ``inject-code`` tag as used on +|project|. + + +---------------+------+---------+--------------------------------------------------------------+ + |Parent Tag |Class |Position |Meaning | + +===============+======+=========+==============================================================+ + |value-type, |native|beginning|Write to the beginning of a class wrapper ``.cpp`` file, right| + |object-type | | |after the ``#include`` clauses. A common use would be to write| + | | | |prototypes for custom functions whose definitions are put on a| + | | | |``native/end`` code injection. | + | | +---------+--------------------------------------------------------------+ + | | |end |Write to the end of a class wrapper ``.cpp`` file. Could be | + | | | |used to write custom/helper functions definitions for | + | | | |prototypes declared on ``native/beginning``. | + | +------+---------+--------------------------------------------------------------+ + | |target|beginning|Put custom code on the beginning of the wrapper initializer | + | | | |function (``init_CLASS(PyObject *module)``). This could be | + | | | |used to manipulate the ``PyCLASS_Type`` structure before | + | | | |registering it on Python. | + | | +---------+--------------------------------------------------------------+ + | | |end |Write the given custom code at the end of the class wrapper | + | | | |initializer function (``init_CLASS(PyObject *module)``). The | + | | | |code here will be executed after all the wrapped class | + | | | |components have been initialized. | + +---------------+------+---------+--------------------------------------------------------------+ + |modify-function|native|beginning|Code here is put on the virtual method override of a C++ | + | | | |wrapper class (the one responsible for passing C++ calls to a | + | | | |Python override, if there is any), right after the C++ | + | | | |arguments have been converted but before the Python call. | + | | +---------+--------------------------------------------------------------+ + | | |end |This code injection is put in a virtual method override on the| + | | | |C++ wrapper class, after the call to Python and before | + | | | |dereferencing the Python method and tuple of arguments. | + | +------+---------+--------------------------------------------------------------+ + | |target|beginning|This code is injected on the Python method wrapper | + | | | |(``PyCLASS_METHOD(...)``), right after the decisor have found | + | | | |which signature to call and also after the conversion of the | + | | | |arguments to be used, but before the actual call. | + | | +---------+--------------------------------------------------------------+ + | | |end |This code is injected on the Python method wrapper | + | | | |(``PyCLASS_METHOD(...)``), right after the C++ method call, | + | | | |but still inside the scope created by the overload for each | + | | | |signature. | + | +------+---------+--------------------------------------------------------------+ + | |shell |beginning|Used only for virtual functions. The code is injected when the| + | | | |function does not has a pyhton implementation, then the code | + | | | |is inserted before c++ call | + | | +---------+--------------------------------------------------------------+ + | | |end |Same as above, but the code is inserted after c++ call | + +---------------+------+---------+--------------------------------------------------------------+ + |typesystem |native|beginning|Write code to the beginning of the module ``.cpp`` file, right| + | | | |after the ``#include`` clauses. This position has a similar | + | | | |purpose as the ``native/beginning`` position on a wrapper | + | | | |class ``.cpp`` file, namely write function prototypes, but not| + | | | |restricted to this use. | + | | +---------+--------------------------------------------------------------+ + | | |end |Write code to the end of the module ``.cpp`` file. Usually | + | | | |implementations for function prototypes inserted at the | + | | | |beginning of the file with a ``native/beginning`` code | + | | | |injection. | + | +------+---------+--------------------------------------------------------------+ + | |target|beginning|Insert code at the start of the module initialization function| + | | | |(``initMODULENAME()``), before the calling ``Py_InitModule``. | + | | +---------+--------------------------------------------------------------+ + | | |end |Insert code at the end of the module initialization function | + | | | |(``initMODULENAME()``), but before the checking that emits a | + | | | |fatal error in case of problems importing the module. | + +---------------+------+---------+--------------------------------------------------------------+ + + +Anatomy of Code Injection +========================= + +To make things clear let's use a simplified example of generated wrapper code +and the places where each kind of code injection goes. + +Below is the example C++ class for whom wrapper code will be generated. + + .. code-block:: c++ + + class InjectCode { + public: + InjectCode(); + double overloadedMethod(int arg); + double overloadedMethod(double arg); + virtual int virtualMethod(int arg); + }; + +From the C++ class, |project| will generate a ``injectcode_wrapper.cpp`` file +with the binding code. The next section will use a simplified version of the +generated wrapper code with the injection spots marked with comments. + +Noteworthy Cases +---------------- + +The type system description system gives the binding developer a lot of +flexibility, which is power, which comes with responsibility. Some modifications +to the wrapped API will not be complete without some code injection. + + +Removing arguments and setting a default values for them +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A simple case is when a function have one argument removed, as when the C++ +method ``METHOD(ARG)`` is modified to be used from Python as ``METHOD()``; +of course the binding developer must provide some guidelines to the generator +on what to do to call it. The most common solution is to remove the argument and +set a default value for it at the same time, so the original C++ method could be +called without problems. + +Removing arguments and calling the method with your own hands +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If the argument is removed and no default value is provided, the generator will +not write any call to the method and expect the ``modify-function - target/beginning`` +code injection to call the original C++ method on its own terms. If even this +custom code is not provided the generator will put an ``#error`` clause to +prevent compilation of erroneus binding code. + +Calling the method with your own hands always! +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If your custom code to be injected contains a call to the wrapped C++ method, +it surely means that you don't want the generator to write another call to the +same method. As expected |project| will detect the user written call on the code +injection and will not write its own call, but for this to work properly the +binding developer must use the template variable ``%FUNCTION_NAME`` instead +of writing the actual name of the wrapped method/function. + +In other words, use + + .. code-block:: xml + + + %CPPSELF.originalMethodName(); + + + +instead of + + + .. code-block:: xml + + + %CPPSELF.%FUNCTION_NAME(); + + + +Code Injection for Functions/Methods +==================================== + + +.. _codeinjecting_method_native: + +On The Native Side +------------------ + +Notice that this is only used when there is a C++ wrapper, i.e. the wrapped +class is polymorphic. + + .. code-block:: c++ + + int InjectCodeWrapper::virtualMethod(int arg) + { + PyObject* method = BindingManager::instance().getOverride(this, "virtualMethod"); + if (!py_override) + return this->InjectCode::virtualMethod(arg); + + (... here C++ arguments are converted to Python ...) + + // INJECT-CODE: + // Uses: pre method call custom code, modify the argument before the + // Python call. + + (... Python method call goes in here ...) + + // INJECT-CODE: + // Uses: post method call custom code, modify the result before delivering + // it to C++ caller. + + (... Python method and argument tuple are dereferenced here ...) + + return Shiboken::Converter::toCpp(method_result); + } + + +On The Target Side +------------------ + +All the overloads of a method from C++ are gathered together on a single Python +method that uses an overload decisor to call the correct C++ method based on the +arguments passed by the Python call. Each overloaded method signature has its +own ``beginning`` and ``end`` code injections. + + .. code-block:: c++ + + static PyObject* + PyInjectCode_overloadedMethod(PyObject* self, PyObject* arg) + { + PyObject* py_result = 0; + if (PyFloat_Check(arg)) { + double cpp_arg0 = Shiboken::Converter::toCpp(arg); + + // INJECT-CODE: + // Uses: pre method call custom code. + + py_result = Shiboken::Converter::toPython( + PyInjectCode_cptr(self)->InjectCode::overloadedMethod(cpp_arg0) + ); + + // INJECT-CODE: + // Uses: post method call custom code. + + } else if (PyNumber_Check(arg)) { + (... other overload calling code ...) + } else goto PyInjectCode_overloadedMethod_TypeError; + + if (PyErr_Occurred() || !py_result) + return 0; + + return py_result; + + PyInjectCode_overloadedMethod_TypeError: + PyErr_SetString(PyExc_TypeError, "'overloadedMethod()' called with wrong parameters."); + return 0; + } + + +.. _codeinjecting_classes: + +Code Injection for Wrapped Classes +================================== + +.. _codeinjecting_classes_native: + +On The Native Side +------------------ + +Those injections go in the body of the ``CLASSNAME_wrapper.cpp`` file for the +wrapped class. + + .. code-block:: c++ + + // Start of ``CLASSNAME_wrapper.cpp`` + #define protected public + // default includes + #include + (...) + #include "injectcode_wrapper.h" + using namespace Shiboken; + + // INJECT-CODE: + // Uses: prototype declarations + + (... C++ wrapper virtual methods, if any ...) + + (... Python wrapper code ...) + + PyAPI_FUNC(void) + init_injectcode(PyObject *module) + { + (...) + } + + (...) + + // INJECT-CODE: + // Uses: definition of functions prototyped at ``native/beginning``. + + // End of ``CLASSNAME_wrapper.cpp`` + + +.. _codeinjecting_classes_target: + +On The Target Side +------------------ + +Code injections to the class Python initialization function. + + .. code-block:: c++ + + // Start of ``CLASSNAME_wrapper.cpp`` + + (...) + + PyAPI_FUNC(void) + init_injectcode(PyObject *module) + { + // INJECT-CODE: + // Uses: Alter something in the PyInjectCode_Type (tp_flags value for example) + // before registering it. + + if (PyType_Ready(&PyInjectCode_Type) < 0) + return; + + Py_INCREF(&PyInjectCode_Type); + PyModule_AddObject(module, "InjectCode", + ((PyObject*)&PyInjectCode_Type)); + + // INJECT-CODE: + // Uses: do something right after the class is registered, like set some static + // variable injected on this same file elsewhere. + } + + (...) + + // End of ``CLASSNAME_wrapper.cpp`` + +Code Injection for Modules +========================== + +The C++ libraries are wapped as Python modules, a collection of classes, +functions, enums and namespaces. |project| creates wrapper files for all of +them and also one extra ``MODULENAME_module_wrapper.cpp`` to register the whole +module. Code injection xml tags who have the ``typesystem`` tag as parent will +be put on this file. + +On The Native Side +------------------ + +This works exactly as the class wrapper code injections :ref:`codeinjecting_classes_native`. + +On The Target Side +------------------ + +This is very similar to class wrapper code injections :ref:`codeinjecting_classes_target`. +Notice that the inject code at ``target/end`` is inserted before the check for errors +to prevent bad custom code to pass unnoticed. + + .. code-block:: c++ + + // Start of ``MODULENAME_module_wrapper.cpp`` + + (...) + initMODULENAME() + { + // INJECT-CODE: + // Uses: do something before the module is created. + + PyObject* module = Py_InitModule("MODULENAME", MODULENAME_methods); + + (... initialization of wrapped classes, namespaces, functions and enums ...) + + // INJECT-CODE: + // Uses: do something after the module is registered and initialized. + + if (PyErr_Occurred()) + Py_FatalError("can't initialize module sample"); + } + + (...) + + // Start of ``MODULENAME_module_wrapper.cpp`` diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/commandlineoptions.txt b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/commandlineoptions.txt new file mode 100644 index 00000000000..f553532283a --- /dev/null +++ b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/commandlineoptions.txt @@ -0,0 +1,104 @@ +.. _command-line: + +Command line options +******************** + +Usage +----- + +:: + + shiboken [options] header-file typesystem-file + + +Options +------- + +``--disable-verbose-error-messages`` + Disable verbose error messages. Turn the CPython code hard to debug but saves a few kilobytes + in the generated binding. + +.. _parent-heuristic: + +``--enable-parent-ctor-heuristic`` + This flag enable an useful heuristic which can save a lot of work related to object ownership when + writing the typesystem. + For more info, check :ref:`ownership-parent-heuristics`. + +.. _pyside-extensions: + +``--enable-pyside-extensions`` + Enable pyside extensions like support for signal/slots. Use this if you are creating a binding based + on PySide. + +.. _return-heuristic: + +``--enable-return-value-heuristic`` + Enable heuristics to detect parent relationship on return values. + For more info, check :ref:`return-value-heuristics`. + +.. _api-version: + +``--api-version=`` + Specify the supported api version used to generate the bindings. + +.. _debug-level: + +``--debug-level=[sparse|medium|full]`` + Set the debug level. + +.. _documentation-only: + +``--documentation-only`` + Do not generate any code, just the documentation. + +.. _drop-type-entries: + +``--drop-type-entries="[;TypeEntry1;...]"`` + Semicolon separated list of type system entries (classes, namespaces, + global functions and enums) to be dropped from generation. + +.. _generation-set: + +``--generation-set`` + Generator set to be used (e.g. qtdoc). + +.. _help: + +``--help`` + Display this help and exit. + +.. _include-paths: + +``--include-paths=[::...]`` + Include paths used by the C++ parser. + +.. _license-file=[license-file]: + +``--license-file=[license-file]`` + File used for copyright headers of generated files. + +.. _no-suppress-warnings: + +``--no-suppress-warnings`` + Show all warnings. + +.. _output-directory: + +``--output-directory=[dir]`` + The directory where the generated files will be written. + +.. _silent: + +``--silent`` + Avoid printing any message. + +.. _typesystem-paths: + +``--typesystem-paths=[::...]`` + Paths used when searching for type system files. + +.. _version: + +``--version`` + Output version information and exit. diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/contents.txt b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/contents.txt new file mode 100644 index 00000000000..24adb1c6871 --- /dev/null +++ b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/contents.txt @@ -0,0 +1,17 @@ +Table of contents +***************** +.. toctree:: + :numbered: + :maxdepth: 3 + + faq.rst + overview.rst + commandlineoptions.rst + projectfile.rst + typesystemvariables.rst + typeconverters.rst + codeinjectionsemantics.rst + sequenceprotocol.rst + ownership.rst + wordsofadvice.rst + shibokenmodule.rst diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/faq.txt b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/faq.txt new file mode 100644 index 00000000000..1d8f0d6b53b --- /dev/null +++ b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/faq.txt @@ -0,0 +1,66 @@ +************************** +Frequently Asked Questions +************************** + +This is a list of Frequently Asked Questions about |project|. Feel free to +suggest new entries! + +General +======= + +What is Shiboken? +----------------- + +Shiboken is a `GeneratorRunner `_ +plugin that outputs C++ code for CPython extensions. The first version of PySide +had source code based on Boost templates. It was easier to produce code but a +paradigm change was needed, as the next question explains. + +Why did you switch from Boost.Python to Shiboken? +------------------------------------------------- + +The main reason was the size reduction. Boost.Python makes excessive use of templates +resulting in a significant increase of the binaries size. On the other hand, as Shiboken +generates CPython code, the resulting binaries are smaller. + +Creating bindings +================= + +Can I wrap non-Qt libraries? +---------------------------- + +Yes. Check Shiboken source code for an example (libsample). + + +Is there any runtime dependency on the generated binding? +--------------------------------------------------------- + +Yes. Only libshiboken, and the obvious Python interpreter +and the C++ library that is being wrapped. + +What do I have to do to create my bindings? +------------------------------------------- + +.. todo: put link to typesystem documentation + +Most of the work is already done by the API Extractor. The developer creates +a `typesystem `_ file +with any customization wanted in the generated code, like removing classes or +changing method signatures. The generator will output the .h and .cpp files +with the CPython code that will wrap the target library for python. + +Is there any recommended build system? +-------------------------------------- + +Both API Extractor and generator uses and recommends the CMake build system. + +Can I write closed-source bindings with the generator? +------------------------------------------------------ + +Yes, as long as you use a LGPL version of Qt, due to runtime requirements. + +What is 'inject code'? +---------------------- + +That's how we call customized code that will be *injected* into the +generated at specific locations. They are specified inside the typesytem. diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/overview.txt b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/overview.txt new file mode 100644 index 00000000000..5f50610ffc7 --- /dev/null +++ b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/overview.txt @@ -0,0 +1,46 @@ +.. _gen-overview: + +****************** +Generator Overview +****************** + +In a few words, the Generator is a utility that parses a collection of header and +typesystem files, generating other files (code, documentation, etc.) as result. + +Creating new bindings +===================== + +.. figure:: images/bindinggen-development.png + :scale: 80 + :align: center + + Creating new bindings + +Each module of the generator system has an specific role. + +1. Provide enough data about the classes and functions. +2. Generate valid code, with modifications from typesystems and injected codes. +3. Modify the API to expose the objects in a way that fits you target language best. +4. Insert customizations where handwritten code is needed. + +.. figure:: images/boostqtarch.png + :scale: 80 + :align: center + + Runtime architecture + +The newly created binding will run on top of Boost.Python library which takes +care of interfacing Python and the underlying C++ library. + +Handwritten inputs +================== + +Creating new bindings involves creating two pieces of "code": the typesystem and +the inject code. + +:typesystem: XML files that provides the developer with a tool to customize the + way that the generators will see the classes and functions. For + example, functions can be renamed, have its signature changed and + many other actions. +:inject code: allows the developer to insert handwritten code where the generated + code is not suitable or needs some customization. diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/ownership.txt b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/ownership.txt new file mode 100644 index 00000000000..8dbd04d47cb --- /dev/null +++ b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/ownership.txt @@ -0,0 +1,151 @@ +**************** +Object ownership +**************** + +One of the main things a binding developer should have in mind is +how the C++ instances lives will cope with Python's reference count. +The last thing you want is to crash a program due to a segfault +when your C++ instance was deleted and the +wrapper object tries to access the invalid memory there. + +In this section we'll show how |project| deals with object ownership +and parentship, taking advantage of the information provided by the +APIExtractor. + +Ownership basics +================ + +As any python binding, |project|-based bindings uses reference counting +to handle the life of the wrapper object (the Python object that contains the +C++ object, do not confuse with the *wrapped* C++ object). +When a reference count reaches zero, the wrapper is deleted by Python garbage +collector and tries to delete the wrapped instance, but sometimes the wrapped +C++ object is already deleted, or maybe the C++ object should not be freed after +the Python wrapper go out of scope and die, because C++ is already taking care of +the wrapped instance. + +In order to handle this, you should tell the +generator whether the instance's ownership belongs to the binding or +to the C++ Library. When belonging to the binding, we are sure that the C++ object +won't be deleted by C++ code and we can call the C++ destructor when the refcount +reaches 0. Otherwise, instances owned by C++ code can be destroyed arbitrarily, +without notifying the Python wrapper of its destruction. + +Invalidating objects +==================== + +To prevent segfaults and double frees, the wrapper objects are invalidated. +An invalidated can't be passed as argument or have an attributte or method accessed. +Trying to do this will raise RuntimeError. + +The following situations can invalidate an object: + +C++ taking ownership +-------------------- + + When an object is passed to a function or method that takes ownership of it, the wrapper + is invalidated as we can't be sure of when the object is destroyed, unless it has a + :ref:`virtual destructor ` or the transfer is due to the special case + of :ref:`parent ownership `. + + Besides being passed as argument, the callee object can have its ownership changed, like + the `setParent` method in Qt's `QObject`. + +Invalidate after use +-------------------- + + Objects marked with *invalidate-after-use* in the type system description always are + virtual method arguments provided by a C++ originated call. They should be + invalidated right after the Python function returns. + +.. _ownership-virt-method: + +Objects with virtual methods +---------------------------- + + A little bit of implementation details: + virtual methods are supported by creating a C++ class, the **shell**, that inherits + from the class with virtual methods, the native one, and override those methods to check if + any derived class in Python also override it. + + If the class has a virtual destructor (and C++ classes with virtual methods should have), this + C++ instance invalidates the wrapper only when the overriden destructor is called. + + One exception to this rule is when the object is created in C++, like in a + factory method. This way the wrapped object is a C++ instance of the native + class, not the shell one, and we cannot know when it is destroyed. + +.. _ownership-parent: + +Parent-child relationship +========================= + +One special type of ownership is the parent-child relationship. +Being a child of an object means that when the object's parent dies, +the C++ instance also dies, so the Python references will be invalidated. +Qt's QObject system, for example, implements this behavior, but this is valid +for any C++ library with similar behavior. + +.. _ownership-parent-heuristics: + +Parentship heuristics +--------------------- + + As the parent-child relationship is very common, |project| tries to automatically + infer what methods falls into the parent-child scheme, adding the extra + directives related to ownership. + + This heuristic will be triggered when generating code for a method and: + + * The function is a constructor. + * The argument name is `parent`. + * The argument type is a pointer to an object. + + When triggered, the heuristic will set the argument named "parent" + as the parent of the object being created by the constructor. + + The main focus of this process was to remove a lot of hand written code from + type system when binding Qt libraries. For Qt, this heuristic works in all cases, + but be aware that it might not when binding your own libraries. + + To activate this heuristic, use the :ref:`--enable-parent-ctor-heuristic ` + command line switch. + +.. _return-value-heuristics: + +Return value heuristics +----------------------- + + When enabled, object returned as pointer in C++ will become child of the object on which the method + was called. + + To activate this heuristic, use the :ref:`--enable-return-value-heuristic ` + +Common pitfalls +=============== + +Not saving unowned objects references +------------------------------------- + + Sometimes when you pass an instance as argument to a method and the receiving + instance will need that object to live indifinitely, but will not take ownership + of the argument instance. In this case, you should hold a reference to the argument + instance. + + For example, let's say that you have a renderer class that will use a source class + in a setSource method but will not take ownership of it. The following code is wrong, + because when `render` is called the `Source` object created during the call to `setSource` + is already destroyed. + + .. code-block:: python + + renderer.setModel(Source()) + renderer.render() + + To solve this, you should hold a reference to the source object, like in + + .. code-block:: python + + source = Source() + renderer.setSource(source) + renderer.render() diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/projectfile.txt b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/projectfile.txt new file mode 100644 index 00000000000..b67e0d0280b --- /dev/null +++ b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/projectfile.txt @@ -0,0 +1,63 @@ +.. _project-file: + +******************** +Binding Project File +******************** + +Instead of directing the Generator behaviour via command line, the binding developer +can write a text project file describing the same information, and avoid the hassle +of a long stream of command line arguments. + +.. _project-file-structure: + +The project file structure +========================== + +Here follows a comprehensive example of a generator project file. + + .. code-block:: ini + + [generator-project] + generator-set = path/to/generator/CHOICE_GENERATOR + header-file = DIR/global.h" /> + typesystem-file = DIR/typesystem_for_your_binding.xml + output-directory location="OUTPUTDIR" /> + include-path = path/to/library/being/wrapped/headers/1 + include-path = path/to/library/being/wrapped/headers/2 + typesystem-path = path/to/directory/containing/type/system/files/1 + typesystem-path = path/to/directory/containing/type/system/files/2 + enable-parent-ctor-heuristic + + +Project file tags +================= + +The generator project file tags are in direct relation to the +:ref:`command line arguments `. All of the current command line +options provided by |project| were already seen on the :ref:`project-file-structure`, +for new command line options provided by additional generator modules (e.g.: qtdoc, +Shiboken) could also be used in the generator project file following simple conversion rules. + +For tags without options, just write as an empty tag without any attributes. Example: + + .. code-block:: bash + + --BOOLEAN-ARGUMENT + +becomes + + .. code-block:: ini + + BOOLEAN-ARGUMENT + +and + + .. code-block:: bash + + --VALUE-ARGUMENT=VALUE + +becomes + + .. code-block:: ini + + VALUE-ARGUMENT = VALUE diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/sequenceprotocol.txt b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/sequenceprotocol.txt new file mode 100644 index 00000000000..a993f67bde2 --- /dev/null +++ b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/sequenceprotocol.txt @@ -0,0 +1,22 @@ +Sequence Protocol +----------------- + +Support for the sequence protocol is achieved adding functions with special names, this is done using the add-function tag. + +The special function names are: + + ============= =============================================== ==================== =================== + Function name Parameters Return type CPython equivalent + ============= =============================================== ==================== =================== + __len__ PyObject* self Py_ssize_t PySequence_Size + __getitem__ PyObject* self, Py_ssize_t _i PyObject* PySequence_GetItem + __setitem__ PyObject* self, Py_ssize_t _i, PyObject* _value int PySequence_SetItem + __contains__ PyObject* self, PyObject* _value int PySequence_Contains + __concat__ PyObject* self, PyObject* _other PyObject* PySequence_Concat + ============= =============================================== ==================== =================== + +You just need to inform the function name to the add-function tag, without any parameter or return type information, when you do it, |project| will create a C function with parameters and return type definied by the table above. + +The function needs to follow the same semantics of the *CPython equivalent* function, the only way to do it is using the :doc:`inject-code ` tag. + +A concrete exemple how to add sequence protocol support to a class can be found on shiboken tests, more precisely in the definition of the Str class in ``tests/samplebinding/typesystem_sample.xml``. diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/shibokenmodule.txt b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/shibokenmodule.txt new file mode 100644 index 00000000000..150998ccd46 --- /dev/null +++ b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/shibokenmodule.txt @@ -0,0 +1,79 @@ +.. module:: shiboken + +.. |maya| unicode:: Maya U+2122 + +Shiboken module +*************** + +Functions +^^^^^^^^^ + +.. container:: function_list + + * def :meth:`isValid` (obj) + * def :meth:`wrapInstance` (address, type) + * def :meth:`getCppPointer` (obj) + * def :meth:`delete` (obj) + * def :meth:`isOwnedByPython` (obj) + * def :meth:`wasCreatedByPython` (obj) + * def :meth:`dump` (obj) + +Detailed description +^^^^^^^^^^^^^^^^^^^^ + +This Python module can be used to access internal information related to our +binding technology. Access to this internal information is required to e.g.: +integrate PySide with Qt based programs that offer Python scripting like |maya| +or just for debug purposes. + +Some function description refer to "Shiboken based objects", wich means +Python objects instances of any Python Type created using Shiboken. + + +.. function:: isValid(obj) + + Given a Python object, returns True if the object methods can be called + without an exception being thrown. A Python wrapper becomes invalid when + the underlying C++ object is destroyed or unreachable. + +.. function:: wrapInstance(address, type) + + Creates a Python wrapper for a C++ object instantiated at a given memory + address - the returned object type will be the same given by the user. + + The type must be a Shiboken type, the C++ object will not be + destroyed when the returned Python object reach zero references. + + If the address is invalid or doesn't point to a C++ object of given type + the behavior is undefined. + +.. function:: getCppPointer(obj) + + Returns a tuple of longs that contain the memory addresses of the + C++ instances wrapped by the given object. + +.. function:: delete(obj) + + Deletes the C++ object wrapped by the given Python object. + +.. function:: isOwnedByPython(obj) + + Given a Python object, returns True if Python is responsible for deleting + the underlying C++ object, False otherwise. + + If the object was not a Shiboken based object, a TypeError is + thrown. + +.. function:: wasCreatedByPython(obj) + + Returns true if the given Python object was created by Python. + +.. function:: dump(obj) + + Returns a string with implementation-defined information about the + object. + This method should be used **only** for debug purposes by developers + creating their own bindings as no guarantee is provided that + the string format will be the same across different versions. + + If the object is not a Shiboken based object, a TypeError is thrown. diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/typeconverters.txt b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/typeconverters.txt new file mode 100644 index 00000000000..3779b26d737 --- /dev/null +++ b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/typeconverters.txt @@ -0,0 +1,288 @@ +**************************** +User Defined Type Conversion +**************************** + +In the process of creating Python bindings of a C++ library, most of the C++ classes will have wrappers representing them in Python land. But there may be other classes that are very simple and/or have a Python type as a direct counter part. (Example: a "Complex" class, that represents complex numbers, has a Python equivalent in the "complex" type.) Such classes, instead of getting a Python wrapper, normally have conversions rules, from Python to C++ and vice-versa. + + .. code-block:: c++ + + // C++ class + struct Complex { + Complex(double real, double imag); + double real() const; + double imag() const; + }; + + // Converting from C++ to Python using the CPython API: + PyObject* pyCpxObj = PyComplex_FromDoubles(complex.real(), complex.imag()); + + // Converting from Python to C++: + double real = PyComplex_RealAsDouble(pyCpxObj); + double imag = PyComplex_ImagAsDouble(pyCpxObj); + Complex cpx(real, imag); + + +For the user defined conversion code to be inserted in the proper places, the "" tag must be used. + + .. code-block:: xml + + + + + + + + return PyComplex_FromDoubles(%in.real(), %in.imag()); + + + + + + double real = PyComplex_RealAsDouble(%in); + double imag = PyComplex_ImagAsDouble(%in); + %out = %OUTTYPE(real, imag); + + + + + + + + +The details will be given later, but the gist of it are the tags +` `_, +which has only one conversion from C++ to Python, and +` `_, +that may define the conversion of multiple Python types to C++'s "Complex" type. + +.. image:: images/converter.png + :height: 240px + :align: center + +|project| expects the code for ` `_, +to directly return the Python result of the conversion, and the added conversions inside the +` `_ +must attribute the Python to C++ conversion result to the :ref:`%out ` variable. + + +Expanding on the last example, if the binding developer want a Python 2-tuple of numbers to be accepted +by wrapped C++ functions with "Complex" arguments, an +` `_ +tag and a custom check must be added. Here's how to do it: + + .. code-block:: xml + + + + static bool Check2TupleOfNumbers(PyObject* pyIn) { + if (!PySequence_Check(pyIn) || !(PySequence_Size(pyIn) == 2)) + return false; + Shiboken::AutoDecRef pyReal(PySequence_GetItem(pyIn, 0)); + if (!SbkNumber_Check(pyReal)) + return false; + Shiboken::AutoDecRef pyImag(PySequence_GetItem(pyIn, 1)); + if (!SbkNumber_Check(pyImag)) + return false; + return true; + } + + + + + + + + + return PyComplex_FromDoubles(%in.real(), %in.imag()); + + + + + + double real = PyComplex_RealAsDouble(%in); + double imag = PyComplex_ImagAsDouble(%in); + %out = %OUTTYPE(real, imag); + + + + Shiboken::AutoDecRef pyReal(PySequence_GetItem(%in, 0)); + Shiboken::AutoDecRef pyImag(PySequence_GetItem(%in, 1)); + double real = %CONVERTTOCPP[double](pyReal); + double imag = %CONVERTTOCPP[double](pyImag); + %out = %OUTTYPE(real, imag); + + + + + + + + + + +.. _container_conversions: + +Container Conversions +===================== + +Converters for +` `_ +are pretty much the same as for other type, except that they make use of the type system variables +:ref:`%INTYPE_# ` and :ref:`%OUTTYPE_# `. |project| combines the conversion code for +containers with the conversion defined (or automatically generated) for the containees. + + + .. code-block:: xml + + + + + + + + PyObject* %out = PyDict_New(); + %INTYPE::const_iterator it = %in.begin(); + for (; it != %in.end(); ++it) { + %INTYPE_0 key = it->first; + %INTYPE_1 value = it->second; + PyDict_SetItem(%out, + %CONVERTTOPYTHON[%INTYPE_0](key), + %CONVERTTOPYTHON[%INTYPE_1](value)); + } + return %out; + + + + + + PyObject* key; + PyObject* value; + Py_ssize_t pos = 0; + while (PyDict_Next(%in, &pos, &key, &value)) { + %OUTTYPE_0 cppKey = %CONVERTTOCPP[%OUTTYPE_0](key); + %OUTTYPE_1 cppValue = %CONVERTTOCPP[%OUTTYPE_1](value); + %out.insert(%OUTTYPE::value_type(cppKey, cppValue)); + } + + + + + + + +.. _variables_and_functions: + +Variables & Functions +===================== + + +.. _in: + +**%in** + + Variable replaced by the C++ input variable. + + +.. _out: + +**%out** + + Variable replaced by the C++ output variable. Needed to convey the + result of a Python to C++ conversion. + + +.. _intype: + +**%INTYPE** + + Used in Python to C++ conversions. It is replaced by the name of type for + which the conversion is being defined. Don't use the type's name directly. + + +.. _intype_n: + +**%INTYPE_#** + + Replaced by the name of the #th type used in a container. + + +.. _outtype: + +**%OUTTYPE** + + Used in Python to C++ conversions. It is replaced by the name of type for + which the conversion is being defined. Don't use the type's name directly. + + +.. _outtype_n: + +**%OUTTYPE_#** + + Replaced by the name of the #th type used in a container. + + +.. _checktype: + +**%CHECKTYPE[CPPTYPE]** + + Replaced by a |project| type checking function for a Python variable. + The C++ type is indicated by ``CPPTYPE``. + + +.. _oldconverters: + +Converting The Old Converters +============================= + +If you use |project| for your bindings, and has defined some type conversions +using the ``Shiboken::Converter`` template, then you must update your converters +to the new scheme. + +Previously your conversion rules were declared in one line, like this: + + + .. code-block:: xml + + + + + + + +And implemented in a separate C++ file, like this: + + + .. code-block:: c++ + + namespace Shiboken { + template<> struct Converter + { + static inline bool checkType(PyObject* pyObj) { + return PyComplex_Check(pyObj); + } + static inline bool isConvertible(PyObject* pyObj) { + return PyComplex_Check(pyObj); + } + static inline PyObject* toPython(void* cppobj) { + return toPython(*reinterpret_cast(cppobj)); + } + static inline PyObject* toPython(const Complex& cpx) { + return PyComplex_FromDoubles(cpx.real(), cpx.imag()); + } + static inline Complex toCpp(PyObject* pyobj) { + double real = PyComplex_RealAsDouble(pyobj); + double imag = PyComplex_ImagAsDouble(pyobj); + return Complex(real, imag); + } + }; + } + + +In this case, the parts of the implementation that will be used in the new conversion-rule +are the ones in the two last method ``static inline PyObject* toPython(const Complex& cpx)`` +and ``static inline Complex toCpp(PyObject* pyobj)``. The ``isConvertible`` method is gone, +and the ``checkType`` is now an attribute of the +` `_ +tag. Refer back to the first example in this page and you will be able to correlate the above template +with the new scheme of conversion rule definition. diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/typesystemvariables.txt b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/typesystemvariables.txt new file mode 100644 index 00000000000..4243f1597a9 --- /dev/null +++ b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/typesystemvariables.txt @@ -0,0 +1,335 @@ +********************* +Type System Variables +********************* + +User written code can be placed in arbitrary places using the +:doc:`inject-code ` tag. To ease the binding developer +work, the injected code can make use of special variables that will be replaced +by the correct values. This also shields the developer from some |project| +implementation specifics. + + +.. _variables: + +Variables +========= + + +.. _cpp_return_argument: + +**%0** + + Replaced by the C++ return variable of the Python method/function wrapper. + + +.. _arg_number: + +**%#** + + Replaced by the name of a C++ argument in the position indicated by ``#``. + The argument counting starts with ``%1``, since ``%0`` represents the return + variable name. If the number indicates a variable that was removed in the + type system description, but there is a default value for it, this value will + be used. Consider this example: + + .. code-block:: c++ + + void argRemoval(int a0, int a1 = 123); + + + .. code-block:: xml + + + + + + + + The ``%1`` will be replaced by the C++ argument name, and ``%2`` will get the + value ``123``. + + +.. _argument_names: + +**%ARGUMENT_NAMES** + + Replaced by a comma separated list with the names of all C++ arguments that + were not removed on the type system description for the method/function. When + the removed argument has a default value (original or provided in the type + system), this value will be inserted in the argument list. If you want to remove + the argument so completely that it doesn't appear in any form on the + ``%ARGUMENT_NAMES`` replacement, don't forget to remove also its default value + with the ` + `_ + type system tag. + + Take the following method and related type system description as an example: + + .. code-block:: c++ + + void argRemoval(int a0, Point a1 = Point(1, 2), bool a2 = true, Point a3 = Point(3, 4), int a4 = 56); + + + .. code-block:: xml + + + + + + + + + + + + As seen on the XML description, the function's ``a1`` and ``a3`` arguments + were removed. If any ``inject-code`` for this function uses ``%ARGUMENT_NAMES`` + the resulting list will be the equivalent of using individual argument type + system variables this way: + + .. code-block:: c++ + + %1, Point(6, 9), %3, Point(3, 4), %5 + + +.. _arg_type: + +**%ARG#_TYPE** + + Replaced by the type of a C++ argument in the position indicated by ``#``. + The argument counting starts with ``%1``, since ``%0`` represents the return + variable in other contexts, but ``%ARG0_TYPE`` will not translate to the + return type, as this is already done by the + :ref:`%RETURN_TYPE ` variable. + Example: + + .. code-block:: c++ + + void argRemoval(int a0, int a1 = 123); + + + .. code-block:: xml + + + + + + + + The ``%1`` will be replaced by the C++ argument name, and ``%2`` will get the + value ``123``. + + +.. _converttocpp: + +**%CONVERTTOCPP[CPPTYPE]** + + Replaced by a |project| conversion call that converts a Python variable + to a C++ variable of the type indicated by ``CPPTYPE``. + + +.. _converttopython: + +**%CONVERTTOPYTHON[CPPTYPE]** + + Replaced by a |project| conversion call that converts a C++ variable of the + type indicated by ``CPPTYPE`` to the proper Python object. + + +.. _isconvertible: + +**%ISCONVERTIBLE[CPPTYPE]** + + Replaced by a |project| "isConvertible" call that checks if a Python + variable is convertible (via an implicit conversion or cast operator call) + to a C++ variable of the type indicated by ``CPPTYPE``. + + +.. _checktype: + +**%CHECKTYPE[CPPTYPE]** + + Replaced by a |project| "checkType" call that verifies if a Python + if of the type indicated by ``CPPTYPE``. + + +.. _cppself: + +**%CPPSELF** + + Replaced by the wrapped C++ object instance that owns the method in which the + code with this variable was inserted. + +.. _cpptype: + +**%CPPTYPE** + + Replaced by the original name of the C++ class, without any namespace prefix, + that owns the method in which the code with this variable was inserted. It will + work on class level code injections also. Notice that ``CPPTYPE`` differs from + the :ref:`%TYPE ` variable, for this latter may be translated to the original + C++ class name or to the C++ wrapper class name. + + Namespaces will are treated as classes, so ``CPPTYPE`` will work for them and their + enclosed functions as well. + +.. _function_name: + +**%FUNCTION_NAME** + + Replaced by the name of a function or method. + + + +.. _py_return_argument: + +**%PYARG_0** + + Replaced by the name of the Python return variable of the Python method/function wrapper. + + +.. _pyarg: + +**%PYARG_#** + + Similar to ``%#``, but is replaced by the Python arguments (PyObjects) + received by the Python wrapper method. + + If used in the context of a native code injection, i.e. in a virtual method + override, ``%PYARG_#`` will be translated to one item of the Python tuple + holding the arguments that should be passed to the Python override for this + virtual method. + + The example + + .. code-block:: c++ + + long a = PyInt_AS_LONG(%PYARG_1); + + + is equivalent of + + .. code-block:: c++ + + long a = PyInt_AS_LONG(PyTuple_GET_ITEM(%PYTHON_ARGUMENTS, 0)); + + + The generator tries to be smart with attributions, but it will work for the + only simplest cases. + + This example + + .. code-block:: c++ + + Py_DECREF(%PYARG_1); + %PYARG_1 = PyInt_FromLong(10); + + + is equivalent of + + .. code-block:: c++ + + Py_DECREF(PyTuple_GET_ITEM(%PYTHON_ARGUMENTS, 0)); + PyTuple_SET_ITEM(%PYTHON_ARGUMENTS, 0, PyInt_FromLong(10)); + + +.. _pyself: + +**%PYSELF** + + Replaced by the Python wrapper variable (a PyObject) representing the instance + bounded to the Python wrapper method which receives the custom code. + + +.. _python_arguments: + +**%PYTHON_ARGUMENTS** + + Replaced by the pointer to the Python tuple with Python objects converted from + the C++ arguments received on the binding override of a virtual method. + This tuple is the same passed as arguments to the Python method overriding the + C++ parent's one. + + +.. _python_method_override: + +**%PYTHON_METHOD_OVERRIDE** + + This variable is used only on :ref:`native method code injections + `, i.e. on the binding overrides for C++ virtual + methods. It is replaced by a pointer to the Python method override. + + +.. _pythontypeobject: + +**%PYTHONTYPEOBJECT** + + Replaced by the Python type object for the context in which it is inserted: + method or class modification. + + +.. _beginallowthreads: + +**%BEGIN_ALLOW_THREADS** + + Replaced by a thread state saving procedure. + Must match with a :ref:`%END_ALLOW_THREADS ` variable. + + +.. _endallowthreads: + +**%END_ALLOW_THREADS** + + Replaced by a thread state restoring procedure. + Must match with a :ref:`%BEGIN_ALLOW_THREADS ` variable. + + +.. _return_type: + +**%RETURN_TYPE** + + Replaced by the type returned by a function or method. + + +.. _type: + +**%TYPE** + + Replaced by the name of the class to which a function belongs. May be used + in code injected at method or class level. + + +.. _example: + +Example +======= + +Just to illustrate the usage of the variables described in the previous +sections, below is an excerpt from the type system description of a |project| +test. It changes a method that received ``argc/argv`` arguments into something +that expects a Python sequence instead. + + .. code-block:: xml + + + + + + + + + + int argc; + char** argv; + if (!PySequence_to_argc_argv(%PYARG_1, &argc, &argv)) { + PyErr_SetString(PyExc_TypeError, "error"); + return 0; + } + %RETURN_TYPE foo = %CPPSELF.%FUNCTION_NAME(argc, argv); + %0 = %CONVERTTOPYTHON[%RETURN_TYPE](foo); + + for (int i = 0; i < argc; ++i) + delete[] argv[i]; + delete[] argv; + + diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/wordsofadvice.txt b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/wordsofadvice.txt new file mode 100644 index 00000000000..e3ff501593d --- /dev/null +++ b/openpype/vendor/python/python_2/PySide/docs/shiboken/_sources/wordsofadvice.txt @@ -0,0 +1,109 @@ +.. _words-of-advice: + +*************** +Words of Advice +*************** + +When writing or using Python bindings there is some things you must keep in mind. + + +.. _duck-punching-and-virtual-methods: + +Duck punching and virtual methods +================================= + +The combination of duck punching, the practice of altering class characteristics +of already instantiated objects, and virtual methods of wrapped C++ classes, can +be tricky. That was an optimistic statement. + +Let's see duck punching in action for educational purposes. + + .. code-block:: python + + import types + import Binding + + obj = Binding.CppClass() + + # CppClass has a virtual method called 'virtualMethod', + # but we don't like it anymore. + def myVirtualMethod(self_obj, arg): + pass + + obj.virtualMethod = types.MethodType(myVirtualMethod, obj, Binding.CppClass) + + +If some C++ code happens to call `CppClass::virtualMethod(...)` on the C++ object +held by "obj" Python object, the new duck punched "virtualMethod" method will be +properly called. That happens because the underlying C++ object is in fact an instance +of a generated C++ class that inherits from `CppClass`, let's call it `CppClassWrapper`, +responsible for receiving the C++ virtual method calls and finding out the proper Python +override to which handle such a call. + +Now that you know this, consider the case when C++ has a factory method that gives you +new C++ objects originated somewhere in C++-land, in opposition to the ones generated in +Python-land by the usage of class constructors, like in the example above. + +Brief interruption to show what I was saying: + + .. code-block:: python + + import types + import Binding + + obj = Binding.createCppClass() + def myVirtualMethod(self_obj, arg): + pass + + # Punching a dead duck... + obj.virtualMethod = types.MethodType(myVirtualMethod, obj, Binding.CppClass) + + +The `Binding.createCppClass()` factory method is just an example, C++ created objects +can pop out for a number of other reasons. Objects created this way have a Python wrapper +holding them as usual, but the object held is not a `CppClassWrapper`, but a regular +`CppClass`. All virtual method calls originated in C++ will stay in C++ and never reach +a Python virtual method overridden via duck punching. + +Although duck punching is an interesting Python feature, it don't mix well with wrapped +C++ virtual methods, specially when you can't tell the origin of every single wrapped +C++ object. In summary: don't do it! + + +.. _pyside-old-style-class: + +Python old style classes and PySide +=================================== + +Because of some architectural decisions and deprecated Python types. Since PySide 1.1 old style classes are not supported with multiple inheritance. + +Below you can check the examples: + +Example with old style class: + + .. code-block:: python + + from PySide import QtCore + + class MyOldStyleObject: + pass + + class MyObject(QtCore, MyOldStyleObject): + pass + + +this example will raise a 'TypeError' due to the limitation on PySide, to fix this you will need use the new style class: + + + .. code-block:: python + + from PySide import QtCore + + class MyOldStyleObject(object): + pass + + class MyObject(QtCore, MyOldStyleObject): + pass + + +All classes used for multiple inheritance with other PySide types need to have 'object' as base class. diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/ajax-loader.gif b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/ajax-loader.gif new file mode 100644 index 00000000000..61faf8cab23 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/ajax-loader.gif differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/basic.css b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/basic.css new file mode 100644 index 00000000000..8399be0a814 --- /dev/null +++ b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/basic.css @@ -0,0 +1,599 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox input[type="text"] { + width: 170px; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + width: 30px; +} + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable dl, table.indextable dd { + margin-top: 0; + margin-bottom: 0; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- general body styles --------------------------------------------------- */ + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.field-list ul { + padding-left: 1em; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px 7px 0 7px; + background-color: #ffe; + width: 40%; + float: right; +} + +p.sidebar-title { + font-weight: bold; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + border: 0; + border-collapse: collapse; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.field-list td, table.field-list th { + border: 0 !important; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text { +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +dl { + margin-bottom: 15px; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dt:target, .highlighted { + background-color: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +div.code-block-caption { + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +div.code-block-caption + div > div.highlight > pre { + margin-top: 0; +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + padding: 1em 1em 0; +} + +div.literal-block-wrapper div.highlight { + margin: 0; +} + +code.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +code.descclassname { + background-color: transparent; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/bg_header.png b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/bg_header.png new file mode 100644 index 00000000000..843e7e2c5a8 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/bg_header.png differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/bg_topo.jpg b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/bg_topo.jpg new file mode 100644 index 00000000000..4229ae8db52 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/bg_topo.jpg differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/classic.css b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/classic.css new file mode 100644 index 00000000000..29800222ed4 --- /dev/null +++ b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/classic.css @@ -0,0 +1,261 @@ +/* + * default.css_t + * ~~~~~~~~~~~~~ + * + * Sphinx stylesheet -- default theme. + * + * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: sans-serif; + font-size: 100%; + background-color: #11303d; + color: #000; + margin: 0; + padding: 0; +} + +div.document { + background-color: #1c4e63; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +div.body { + background-color: #ffffff; + color: #000000; + padding: 0 20px 30px 20px; +} + +div.footer { + color: #ffffff; + width: 100%; + padding: 9px 0 9px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #ffffff; + text-decoration: underline; +} + +div.related { + background-color: #133f52; + line-height: 30px; + color: #ffffff; +} + +div.related a { + color: #ffffff; +} + +div.sphinxsidebar { +} + +div.sphinxsidebar h3 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.4em; + font-weight: normal; + margin: 0; + padding: 0; +} + +div.sphinxsidebar h3 a { + color: #ffffff; +} + +div.sphinxsidebar h4 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.3em; + font-weight: normal; + margin: 5px 0 0 0; + padding: 0; +} + +div.sphinxsidebar p { + color: #ffffff; +} + +div.sphinxsidebar p.topless { + margin: 5px 10px 10px 10px; +} + +div.sphinxsidebar ul { + margin: 10px; + padding: 0; + color: #ffffff; +} + +div.sphinxsidebar a { + color: #98dbcc; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + + + +/* -- hyperlink styles ------------------------------------------------------ */ + +a { + color: #355f7c; + text-decoration: none; +} + +a:visited { + color: #355f7c; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + + + +/* -- body styles ----------------------------------------------------------- */ + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Trebuchet MS', sans-serif; + background-color: #f2f2f2; + font-weight: normal; + color: #20435c; + border-bottom: 1px solid #ccc; + margin: 20px -20px 10px -20px; + padding: 3px 0 3px 10px; +} + +div.body h1 { margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 160%; } +div.body h3 { font-size: 140%; } +div.body h4 { font-size: 120%; } +div.body h5 { font-size: 110%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li { + text-align: justify; + line-height: 130%; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.admonition p { + margin-bottom: 5px; +} + +div.admonition pre { + margin-bottom: 5px; +} + +div.admonition ul, div.admonition ol { + margin-bottom: 5px; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre { + padding: 5px; + background-color: #eeffcc; + color: #333333; + line-height: 120%; + border: 1px solid #ac9; + border-left: none; + border-right: none; +} + +code { + background-color: #ecf0f3; + padding: 0 1px 0 1px; + font-size: 0.95em; +} + +th { + background-color: #ede; +} + +.warning code { + background: #efc2c2; +} + +.note code { + background: #d6d6d6; +} + +.viewcode-back { + font-family: sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} + +div.code-block-caption { + color: #efefef; + background-color: #1c4e63; +} diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/comment-bright.png b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/comment-bright.png new file mode 100644 index 00000000000..551517b8c83 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/comment-bright.png differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/comment-close.png b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/comment-close.png new file mode 100644 index 00000000000..09b54be46da Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/comment-close.png differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/comment.png b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/comment.png new file mode 100644 index 00000000000..92feb52b882 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/comment.png differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/default.css b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/default.css new file mode 100644 index 00000000000..b33baf4efd1 --- /dev/null +++ b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/default.css @@ -0,0 +1,256 @@ +/* + * default.css_t + * ~~~~~~~~~~~~~ + * + * Sphinx stylesheet -- default theme. + * + * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: sans-serif; + font-size: 100%; + background-color: #11303d; + color: #000; + margin: 0; + padding: 0; +} + +div.document { + background-color: #1c4e63; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +div.body { + background-color: #ffffff; + color: #000000; + padding: 0 20px 30px 20px; +} + +div.footer { + color: #ffffff; + width: 100%; + padding: 9px 0 9px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #ffffff; + text-decoration: underline; +} + +div.related { + background-color: #133f52; + line-height: 30px; + color: #ffffff; +} + +div.related a { + color: #ffffff; +} + +div.sphinxsidebar { +} + +div.sphinxsidebar h3 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.4em; + font-weight: normal; + margin: 0; + padding: 0; +} + +div.sphinxsidebar h3 a { + color: #ffffff; +} + +div.sphinxsidebar h4 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.3em; + font-weight: normal; + margin: 5px 0 0 0; + padding: 0; +} + +div.sphinxsidebar p { + color: #ffffff; +} + +div.sphinxsidebar p.topless { + margin: 5px 10px 10px 10px; +} + +div.sphinxsidebar ul { + margin: 10px; + padding: 0; + color: #ffffff; +} + +div.sphinxsidebar a { + color: #98dbcc; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + + + +/* -- hyperlink styles ------------------------------------------------------ */ + +a { + color: #355f7c; + text-decoration: none; +} + +a:visited { + color: #355f7c; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + + + +/* -- body styles ----------------------------------------------------------- */ + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Trebuchet MS', sans-serif; + background-color: #f2f2f2; + font-weight: normal; + color: #20435c; + border-bottom: 1px solid #ccc; + margin: 20px -20px 10px -20px; + padding: 3px 0 3px 10px; +} + +div.body h1 { margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 160%; } +div.body h3 { font-size: 140%; } +div.body h4 { font-size: 120%; } +div.body h5 { font-size: 110%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li { + text-align: justify; + line-height: 130%; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.admonition p { + margin-bottom: 5px; +} + +div.admonition pre { + margin-bottom: 5px; +} + +div.admonition ul, div.admonition ol { + margin-bottom: 5px; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre { + padding: 5px; + background-color: #eeffcc; + color: #333333; + line-height: 120%; + border: 1px solid #ac9; + border-left: none; + border-right: none; +} + +tt { + background-color: #ecf0f3; + padding: 0 1px 0 1px; + font-size: 0.95em; +} + +th { + background-color: #ede; +} + +.warning tt { + background: #efc2c2; +} + +.note tt { + background: #d6d6d6; +} + +.viewcode-back { + font-family: sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/doctools.js b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/doctools.js new file mode 100644 index 00000000000..c7bfe760aa8 --- /dev/null +++ b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/doctools.js @@ -0,0 +1,263 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + */ +jQuery.urldecode = function(x) { + return decodeURIComponent(x).replace(/\+/g, ' '); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s == 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node) { + if (node.nodeType == 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { + var span = document.createElement("span"); + span.className = className; + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this); + }); + } + } + return this.each(function() { + highlight(this); + }); +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated == 'undefined') + return string; + return (typeof translated == 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated == 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) == 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this == '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/down-pressed.png b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/down-pressed.png new file mode 100644 index 00000000000..7c30d004b71 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/down-pressed.png differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/down.png b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/down.png new file mode 100644 index 00000000000..f48098a43b0 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/down.png differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/fakebar.png b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/fakebar.png new file mode 100644 index 00000000000..b45830e000e Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/fakebar.png differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/file.png b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/file.png new file mode 100644 index 00000000000..254c60bfbe2 Binary files /dev/null and b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/file.png differ diff --git a/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/jquery-1.11.1.js b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/jquery-1.11.1.js new file mode 100644 index 00000000000..d4b67f7e6c1 --- /dev/null +++ b/openpype/vendor/python/python_2/PySide/docs/shiboken/_static/jquery-1.11.1.js @@ -0,0 +1,10308 @@ +/*! + * jQuery JavaScript Library v1.11.1 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-05-01T17:42Z + */ + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper window is present, + // execute the factory and get jQuery + // For environments that do not inherently posses a window with a document + // (such as Node.js), expose a jQuery-making factory as module.exports + // This accentuates the need for the creation of a real window + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Can't do this because several apps including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +// Support: Firefox 18+ +// + +var deletedIds = []; + +var slice = deletedIds.slice; + +var concat = deletedIds.concat; + +var push = deletedIds.push; + +var indexOf = deletedIds.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + version = "1.11.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1, IE<9 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: deletedIds.sort, + splice: deletedIds.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var src, copyIsArray, copy, name, options, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + isWindow: function( obj ) { + /* jshint eqeqeq: false */ + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + isPlainObject: function( obj ) { + var key; + + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Support: IE<9 + // Handle iteration over inherited properties before own properties. + if ( support.ownLast ) { + for ( key in obj ) { + return hasOwn.call( obj, key ); + } + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call(obj) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && jQuery.trim( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var value, + i = 0, + length = obj.length, + isArray = isArraylike( obj ); + + if ( args ) { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } + } + + return obj; + }, + + // Support: Android<4.1, IE<9 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArraylike( Object(arr) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( indexOf ) { + return indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + while ( j < len ) { + first[ i++ ] = second[ j++ ]; + } + + // Support: IE<9 + // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) + if ( len !== len ) { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, + i = 0, + length = elems.length, + isArray = isArraylike( elems ), + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: function() { + return +( new Date() ); + }, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +function isArraylike( obj ) { + var length = obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.nodeType === 1 && length ) { + return true; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v1.10.19 + * http://sizzlejs.com/ + * + * Copyright 2013 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-04-18 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + -(new Date()), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + strundefined = typeof undefined, + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf if we can't use a native one + indexOf = arr.indexOf || function( elem ) { + var i = 0, + len = this.length; + for ( ; i < len; i++ ) { + if ( this[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + characterEncoding + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { + return []; + } + + if ( documentIsHTML && !seed ) { + + // Shortcuts + if ( (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document (jQuery #6963) + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // QSA path + if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + nid = old = expando; + newContext = context; + newSelector = nodeType === 9 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = attrs.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== strundefined && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, + doc = node ? node.ownerDocument || node : preferredDoc, + parent = doc.defaultView; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + + // Support tests + documentIsHTML = !isXML( doc ); + + // Support: IE>8 + // If iframe document is assigned to "document" variable and if iframe has been reloaded, + // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 + // IE6-8 do not support the defaultView property so parent will be undefined + if ( parent && parent !== parent.top ) { + // IE11 does not have attachEvent, so all must suffer + if ( parent.addEventListener ) { + parent.addEventListener( "unload", function() { + setDocument(); + }, false ); + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", function() { + setDocument(); + }); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Check if getElementsByClassName can be trusted + support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) { + div.innerHTML = "
"; + + // Support: Safari<4 + // Catch class over-caching + div.firstChild.className = "i"; + // Support: Opera<10 + // Catch gEBCN failure to find non-leading classes + return div.getElementsByClassName("i").length === 2; + }); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !doc.getElementsByName || !doc.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== strundefined && documentIsHTML ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== strundefined ) { + return context.getElementsByTagName( tag ); + } + } : + function( tag, context ) { + var elem, + tmp = [], + i = 0, + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + div.innerHTML = ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowclip^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = doc.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully does not implement inclusive descendent + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === doc ? -1 : + b === doc ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return doc; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch(e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { + // Cache the index of each encountered element + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf.call( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (oldCache = outerCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + outerCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context !== document && context; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is no seed and only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome<14 +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.pseudos; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + }); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + }); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; + }); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + })); +}; + +jQuery.fn.extend({ + find: function( selector ) { + var i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow(this, selector || [], false) ); + }, + not: function( selector ) { + return this.pushStack( winnow(this, selector || [], true) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +}); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + + // scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[1], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof rootjQuery.ready !== "undefined" ? + rootjQuery.ready( selector ) : + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.extend({ + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +jQuery.fn.extend({ + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { + // Always skip document fragments + if ( cur.nodeType < 11 && (pos ? + pos.index(cur) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector(cur, selectors)) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.unique( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } +}); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.unique( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +}); +var rnotwhite = (/\S+/g); + + + +// String to Object options format cache +var optionsCache = {}; + +// Convert String-formatted options into Object-formatted ones and store in cache +function createOptions( options ) { + var object = optionsCache[ options ] = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + }); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + ( optionsCache[ options ] || createOptions( options ) ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // First callback to fire (used internally by add and fireWith) + firingStart, + // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = !options.once && [], + // Fire callbacks + fire = function( data ) { + memory = options.memory && data; + fired = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + firing = true; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { + memory = false; // To prevent further calls using add + break; + } + } + firing = false; + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); + } + } else if ( memory ) { + list = []; + } else { + self.disable(); + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + // First, we save the current length + var start = list.length; + (function add( args ) { + jQuery.each( args, function( _, arg ) { + var type = jQuery.type( arg ); + if ( type === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && type !== "string" ) { + // Inspect recursively + add( arg ); + } + }); + })( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away + } else if ( memory ) { + firingStart = start; + fire( memory ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + // Handle firing indexes + if ( firing ) { + if ( index <= firingLength ) { + firingLength--; + } + if ( index <= firingIndex ) { + firingIndex--; + } + } + } + }); + } + return this; + }, + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); + }, + // Remove all callbacks from the list + empty: function() { + list = []; + firingLength = 0; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( list && ( !fired || stack ) ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + if ( firing ) { + stack.push( args ); + } else { + fire( args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend({ + + Deferred: function( func ) { + var tuples = [ + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred(function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[1] ](function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); + } + }); + }); + fns = null; + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[1] ] = list.add; + + // Handle state + if ( stateString ) { + list.add(function() { + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[0] ] = function() { + deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[0] + "With" ] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + + } else if ( !(--remaining) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +}); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend({ + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +}); + +/** + * Clean-up method for dom ready events + */ +function detach() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed, false ); + window.removeEventListener( "load", completed, false ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } +} + +/** + * The ready event handler and self cleanup method + */ +function completed() { + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { + detach(); + jQuery.ready(); + } +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called after the browser event has already occurred. + // we once tried to use readyState "interactive" here, but it caused issues like the one + // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed, false ); + + // If IE event model is used + } else { + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch(e) {} + + if ( top && top.doScroll ) { + (function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll("left"); + } catch(e) { + return setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + })(); + } + } + } + return readyList.promise( obj ); +}; + + +var strundefined = typeof undefined; + + + +// Support: IE<9 +// Iteration over object's inherited properties before its own +var i; +for ( i in jQuery( support ) ) { + break; +} +support.ownLast = i !== "0"; + +// Note: most support tests are defined in their respective modules. +// false until the test is run +support.inlineBlockNeedsLayout = false; + +// Execute ASAP in case we need to set body.style.zoom +jQuery(function() { + // Minified: var a,b,c,d + var val, div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + // Return for frameset docs that don't have a body + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + if ( typeof div.style.zoom !== strundefined ) { + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; + + support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; + if ( val ) { + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); +}); + + + + +(function() { + var div = document.createElement( "div" ); + + // Execute the test only if not already executed in another module. + if (support.deleteExpando == null) { + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +})(); + + +/** + * Determines whether an object can have data + */ +jQuery.acceptData = function( elem ) { + var noData = jQuery.noData[ (elem.nodeName + " ").toLowerCase() ], + nodeType = +elem.nodeType || 1; + + // Do not set data on non-element DOM nodes because it will not be cleared (#8335). + return nodeType !== 1 && nodeType !== 9 ? + false : + + // Nodes accept data unless otherwise specified; rejection can be conditional + !noData || noData !== true && elem.getAttribute("classid") === noData; +}; + + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + +function internalData( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split(" "); + } + } + } else { + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, null + } else { + cache[ id ] = null; + } +} + +jQuery.extend({ + cache: {}, + + // The following elements (space-suffixed to avoid Object.prototype collisions) + // throw uncatchable exceptions if you attempt to set expando properties + noData: { + "applet ": true, + "embed ": true, + // ...but Flash objects (which have this classid) *can* handle expandos + "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var i, name, data, + elem = this[0], + attrs = elem && elem.attributes; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice(5) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + return arguments.length > 1 ? + + // Sets one value + this.each(function() { + jQuery.data( this, key, value ); + }) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + + +jQuery.extend({ + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray(data) ) { + queue = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + }) + }); + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +}); +var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); + }; + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[0], key ) : emptyGet; +}; +var rcheckableType = (/^(?:checkbox|radio)$/i); + + + +(function() { + // Minified: var a,b,c + var input = document.createElement( "input" ), + div = document.createElement( "div" ), + fragment = document.createDocumentFragment(); + + // Setup + div.innerHTML = "
a"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName( "tbody" ).length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = + document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + input.type = "checkbox"; + input.checked = true; + fragment.appendChild( input ); + support.appendChecked = input.checked; + + // Make sure textarea (and checkbox) defaultValue is properly cloned + // Support: IE6-IE11+ + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // #11217 - WebKit loses check when the name is after the checked attribute + fragment.appendChild( div ); + div.innerHTML = ""; + + // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 + // old WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Opera does not clone events (and typeof div.attachEvent === undefined). + // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() + support.noCloneEvent = true; + if ( div.attachEvent ) { + div.attachEvent( "onclick", function() { + support.noCloneEvent = false; + }); + + div.cloneNode( true ).click(); + } + + // Execute the test only if not already executed in another module. + if (support.deleteExpando == null) { + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + } +})(); + + +(function() { + var i, eventName, + div = document.createElement( "div" ); + + // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event) + for ( i in { submit: true, change: true, focusin: true }) { + eventName = "on" + i; + + if ( !(support[ i + "Bubbles" ] = eventName in window) ) { + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + div.setAttribute( eventName, "t" ); + support[ i + "Bubbles" ] = div.attributes[ eventName ].expando === false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +})(); + + +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !(events = elemData.events) ) { + events = elemData.events = {}; + } + if ( !(eventHandle = elemData.handle) ) { + eventHandle = elemData.handle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !(handlers = events[ type ]) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf(":") < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join("."); + event.namespace_re = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === (elem.ownerDocument || document) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && jQuery.acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && + jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, ret, handleObj, matched, j, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( (event.result = ret) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var sel, handleObj, matches, i, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, handlers: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Chrome 23+, Safari? + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, to properly expose it to GC + if ( typeof elem[ name ] === strundefined ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + // Support: IE < 9, Android < 4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + if ( !e ) { + return; + } + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !jQuery._data( form, "submitBubbles" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submit_bubble = true; + }); + jQuery._data( form, "submitBubbles", true ); + } + }); + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( event._submit_bubble ) { + delete event._submit_bubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + } + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + } + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event, true ); + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + jQuery._data( elem, "changeBubbles", true ); + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + jQuery._removeData( doc, fix ); + } else { + jQuery._data( doc, fix, attaches ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var type, origFn; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + var elem = this[0]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +}); + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rtbody = /\s*$/g, + + // We have to close these tags to support XHTML (#13200) + wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
", "
" ], + area: [ 1, "", "" ], + param: [ 1, "", "" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + col: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] + }, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement("div") ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + +// Used in buildFragment, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( rcheckableType.test( elem.type ) ) { + elem.defaultChecked = elem.checked; + } +} + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName("tbody")[0] || + elem.appendChild( elem.ownerDocument.createElement("tbody") ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[1]; + } else { + elem.removeAttribute("type"); + } + return elem; +} + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; (elem = elems[i]) != null; i++ ) { + jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); + } +} + +function cloneCopyEvent( src, dest ) { + + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( (!support.noCloneEvent || !support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; (node = srcElements[i]) != null; ++i ) { + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[i] ) { + fixCloneNodeIssues( node, destElements[i] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; (node = srcElements[i]) != null; i++ ) { + cloneCopyEvent( node, destElements[i] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + buildFragment: function( elems, context, scripts, selection ) { + var j, elem, contains, + tmp, tag, tbody, wrap, + l = elems.length, + + // Ensure a safe fragment + safe = createSafeFragment( context ), + + nodes = [], + i = 0; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || safe.appendChild( context.createElement("div") ); + + // Deserialize a standard representation + tag = (rtagName.exec( elem ) || [ "", "" ])[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + + tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; + + // Descend through wrappers to the right content + j = wrap[0]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Manually add leading whitespace removed by IE + if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); + } + + // Remove IE's autoinserted from table fragments + if ( !support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[1] === "
" && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( (elem = nodes[ i++ ]) ) { + + // #4087 - If origin and destination elements are the same, and this is + // that element, do not do anything + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( (elem = tmp[ j++ ]) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; + }, + + cleanData: function( elems, /* internal */ acceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + deleteExpando = support.deleteExpando, + special = jQuery.event.special; + + for ( ; (elem = elems[i]) != null; i++ ) { + if ( acceptData || jQuery.acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( deleteExpando ) { + delete elem[ internalKey ]; + + } else if ( typeof elem.removeAttribute !== strundefined ) { + elem.removeAttribute( internalKey ); + + } else { + elem[ internalKey ] = null; + } + + deletedIds.push( id ); + } + } + } + } + } +}); + +jQuery.fn.extend({ + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); + }, null, value, arguments.length ); + }, + + append: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + }); + }, + + before: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + }); + }, + + after: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + }); + }, + + remove: function( selector, keepData /* Internal Use Only */ ) { + var elem, + elems = selector ? jQuery.filter( selector, this ) : this, + i = 0; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); + } + elem.parentNode.removeChild( elem ); + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map(function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ (rtagName.exec( value ) || [ "", "" ])[ 1 ].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1>" ); + + try { + for (; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + elem = this[i] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch(e) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var arg = arguments[ 0 ]; + + // Make the changes, replacing each context element with the new content + this.domManip( arguments, function( elem ) { + arg = this.parentNode; + + jQuery.cleanData( getAll( this ) ); + + if ( arg ) { + arg.replaceChild( elem, this ); + } + }); + + // Force removal if there was no new content (e.g., from empty arguments) + return arg && (arg.length || arg.nodeType) ? this : this.remove(); + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, callback ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = this.length, + set = this, + iNoClone = l - 1, + value = args[0], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return this.each(function( index ) { + var self = set.eq( index ); + if ( isFunction ) { + args[0] = value.call( this, index, self.html() ); + } + self.domManip( args, callback ); + }); + } + + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( this[i], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + + if ( node.src ) { + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return this; + } +}); + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone(true); + jQuery( insert[i] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +}); + + +var iframe, + elemdisplay = {}; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var style, + elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + // getDefaultComputedStyle might be reliably used only on attached element + display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? + + // Use of this method is a temporary fix (more like optmization) until something better comes along, + // since it was removed from specification and supported only in FF + style.display : jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = (iframe || jQuery( "